I2luY2x1ZGUgPENvcHlyaWdodC5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXNBcGlEZWZzLmgKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIEFQSSBkZWZpbml0aW9ucyBmb3IgUXVhcnRlckRlY2sgRGV2aWNlCioKKiBERVBFTkRFTkNJRVM6CioKKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX21zQXBpRGVmc19oCiNkZWZpbmUgX19tc0FwaURlZnNfaAoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKI2luY2x1ZGUgPG1zQXBpVHlwZXMuaD4KLyogRGVidWcgZnVuY3Rpb24gICAqLwojaWZkZWYgREVCVUdfUUQKI2RlZmluZSBEQkdfSU5GTyh4KSBndERiZ1ByaW50IHgKI2Vsc2UKI2RlZmluZSBEQkdfSU5GTyh4KTsKI2VuZGlmIC8qIERFQlVHX1FEICovCgp0eXBlZGVmIEdUX1UzMiBHVF9TRU07CgojZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFCUdUX0VUSEVSTkVUX0hFQURFUl9TSVpFCiNkZWZpbmUgSVNfTVVMVElDQVNUX01BQwkJR1RfSVNfTVVMVElDQVNUX01BQwojZGVmaW5lIElTX0JST0FEQ0FTVF9NQUMJCUdUX0lTX0JST0FEQ0FTVF9NQUMKCiNkZWZpbmUgR1RfSU5WQUxJRF9QSFkJCQkweEZGCiNkZWZpbmUgR1RfSU5WQUxJRF9QT1JUCQkJMHhGRgojZGVmaW5lIEdUX0lOVkFMSURfUE9SVF9WRUMJCTB4RkZGRkZGRkYKCiNkZWZpbmUgR1RfVU5VU0VEX1BBUkFNKF9hKQkJKF9hKT0oX2EpCgovKgogKiAgIExvZ2ljYWwgUG9ydCB2YWx1ZSBiYXNlZCBvbiBhIFBvcnQKICogICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxCiAqICAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgfDB8ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBwb3J0ICAgICAgIHwKICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqCiAqCiAqICAgVGhlIGZvbGxvd2luZyBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQgdG8gZXh0cmFjdCBzcGVjaWZpYyBpbmZvCiAqICAgZnJvbSBhIExvZ2ljYWwgUG9ydCBpbmRleAogKi8KdHlwZWRlZiBHVF9VMzIgR1RfTFBPUlQ7CnR5cGVkZWYgR1RfVTMyIEdUX0VUWVBFOwoKCi8qIERlZmluZSB0aGUgZGlmZmVyZW50IGRldmljZSB0eXBlIHRoYXQgbWF5IGV4aXN0IGluIHN5c3RlbSAgICAgICAgKi8KdHlwZWRlZiBlbnVtCnsKCUdUXzg4RTYwMjEgID0gMHgwMjEsCglHVF84OEU2MDUxICA9IDB4MDUxLAoJR1RfODhFNjA1MiAgPSAweDA1MiwKCUdUXzg4RTYwNjAgID0gMHgwNjAsCglHVF84OEU2MDYzCT0gMHgxNTMsCglHVF9GSF9WUE4JPSAweEY1MywKCUdUX0ZGX0VHCT0gMHhGOTEsCglHVF9GRl9IRwk9IDB4RjkzLAoJCglHVF84OEU2MDgzCT0gMHgwODMsCgoJR1RfODhFNjE4MQk9IDB4MUEwLAoKCUdUXzg4RTYxNTMJPSAweDFBMSwKCUdUXzg4RTYxODMJPSAweDFBMywKCglHVF84OEU2MDkzCT0gMHgwOTMsCglHVF84OEU2MDkyCT0gMHgwOTcsCglHVF84OEU2MDQ1CT0gMHgwOTQsCglHVF84OEU2MDk1CT0gMHgwOTUsCgoJR1RfODhFNjE1Mgk9IDB4MUE0LAoJR1RfODhFNjE1NQk9IDB4MUE1LAoJR1RfODhFNjE4Mgk9IDB4MUE2LAoJR1RfODhFNjE4NQk9IDB4MUE3LAoKCUdUXzg4RTYxMjEJPSAweDEwNCwKCUdUXzg4RTYxMjIJPSAweDEwNSwKCUdUXzg4RTYxMzEJPSAweDEwNiwKCUdUXzg4RTYxMDgJPSAweDEwNywKCglHVF84OEU2MDMxCT0gMHgwMzEsCglHVF84OEU2MDM1CT0gMHgwMzUsCglHVF84OEU2MDU1CT0gMHgwNTUsCglHVF84OEU2MDYxCT0gMHgwNjEsCglHVF84OEU2MDY1CT0gMHgwNjUsCgoJR1RfODhFNjA0Ngk9IDB4MDQ4LAoJR1RfODhFNjA0Nwk9IDB4MDQ5LAoJR1RfODhFNjA4NQk9IDB4MDRBLAoJR1RfODhFNjA5Ngk9IDB4MDk4LAoJR1RfODhFNjA5Nwk9IDB4MDk5LAoKCUdUXzg4RTYxMjMJPSAweDEyMSwKCUdUXzg4RTYxNDAJPSAweDE0MSwKCUdUXzg4RTYxNjEJPSAweDE2MSwKCUdUXzg4RTYxNjUJPSAweDE2NSwKCglHVF84OEU2MzUxCT0gMHgzNzUsCglHVF84OEU2MTc1CT0gMHgxNzUsCglHVF84OEU2MTI1CT0gMHgxMjQsCS8qIHdhcyA4OEU2MTI0ICovCglHVF84OEU2MTcxCT0gMHgxNzEsCglHVF84OEU2MzIxCT0gMHgzMjQsCS8qIHdhcyA4OEU2MzI1ICovCglHVF84OEU2MzUwCT0gMHgzNzEsCS8qIHdhcyA4OEU2MzcxICovCglHVF9LVzJfSU5UCT0gMHgwNDQJCS8qIEludGVybmFsIFN3aXljaCBpbiBLVzIgKi8KCn1HVF9ERVZJQ0U7CgoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZGV2aWNlICAgICAgICAqLwp0eXBlZGVmIGVudW0KewoJR1RfUkVWXzAgPSAwLAoJR1RfUkVWXzEsCglHVF9SRVZfMiwKCUdUX1JFVl8zCn1HVF9ERVZJQ0VfUkVWOwoKCi8qIFRvRG86IE5vIFVzZWQgKi8KdHlwZWRlZiBlbnVtCnsKCUlOVFJfTU9ERV9ESVNBQkxFID0wLAoJSU5UUl9NT0RFX0VOQUJMRQp9SU5URVJSVVBUX01PREU7CgovKiBEZWZpbml0aW9uIGZvciB0aGUgUG9ydCBTcGVlZCAqLwp0eXBlZGVmIGVudW0KewoJUE9SVF9TUEVFRF8xMF9NQlBTID0gMCwKCVBPUlRfU1BFRURfMTAwX01CUFMgPSAxLAoJUE9SVF9TUEVFRF8yMDBfTUJQUyA9IDIsCS8qIHZhbGlkIG9ubHkgaWYgZGV2aWNlIHN1cHBvcnQgKi8KCVBPUlRfU1BFRURfMTAwMF9NQlBTID0gMiAsCS8qIHZhbGlkIG9ubHkgaWYgZGV2aWNlIHN1cHBvcnQgKi8KCVBPUlRfU1BFRURfVU5LTk9XTiA9IDMKfSBHVF9QT1JUX1NQRUVEX01PREU7CgovKiBEZWZpbml0aW9uIGZvciB0aGUgZm9yY2VkIFBvcnQgU3BlZWQgKi8KdHlwZWRlZiBlbnVtCnsKCVBPUlRfRk9SQ0VfU1BFRURfMTBfTUJQUyA9IDAsCglQT1JUX0ZPUkNFX1NQRUVEXzEwMF9NQlBTID0gMSwKCVBPUlRfRk9SQ0VfU1BFRURfMjAwX01CUFMgPSAyLAkvKiB2YWxpZCBvbmx5IGlmIGRldmljZSBzdXBwb3J0ICovCglQT1JUX0ZPUkNFX1NQRUVEXzEwMDBfTUJQUyA9IDIsCS8qIHZhbGlkIG9ubHkgaWYgZGV2aWNlIHN1cHBvcnQgKi8KCVBPUlRfRE9fTk9UX0ZPUkNFX1NQRUVEID0zCn0gR1RfUE9SVF9GT1JDRURfU1BFRURfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgUG9ydCBEdXBsZXggbW9kZSAqLwp0eXBlZGVmIGVudW0KewoJUE9SVF9ET19OT1RfRk9SQ0VfRFVQTEVYLAoJUE9SVF9GT1JDRV9GVUxMX0RVUExFWCwKCVBPUlRfRk9SQ0VfSEFMRl9EVVBMRVgKfSBHVF9QT1JUX0ZPUkNFRF9EVVBMRVhfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgUG9ydCBMaW5rICovCnR5cGVkZWYgZW51bQp7CglQT1JUX0RPX05PVF9GT1JDRV9MSU5LLAoJUE9SVF9GT1JDRV9MSU5LX1VQLAoJUE9SVF9GT1JDRV9MSU5LX0RPV04KfSBHVF9QT1JUX0ZPUkNFRF9MSU5LX01PREU7CgovKiBEZWZpbml0aW9uIGZvciB0aGUgZm9yY2VkIGZsb3cgY29udHJvbCBtb2RlICovCnR5cGVkZWYgZW51bQp7CglQT1JUX0RPX05PVF9GT1JDRV9GQywKCVBPUlRfRk9SQ0VfRkNfRU5BQkxFRCwKCVBPUlRfRk9SQ0VfRkNfRElTQUJMRUQKfSBHVF9QT1JUX0ZPUkNFRF9GQ19NT0RFOwoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIFBQVSBzdGF0ZSAqLwp0eXBlZGVmIGVudW0KewoJUFBVX1NUQVRFX0RJU0FCTEVEX0FUX1JFU0VULAoJUFBVX1NUQVRFX0FDVElWRSwKCVBQVV9TVEFURV9ESVNBQkxFRF9BRlRFUl9SRVNFVCwKCVBQVV9TVEFURV9QT0xMSU5HCn0gR1RfUFBVX1NUQVRFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUE9SVF9DT05GSUdfTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyBwb3J0J3MgaW50ZXJmYWNlIHR5cGUgY29uZmlndXJhdGlvbiBtb2RlIGRldGVybWluZWQgYXQgCiAqCQkJCXJlc2V0LiBUaGlzIGRlZmluaXRpb24gbWF5IG5vdCByZXByZXNlbnQgdGhlIGRldmljZSB1bmRlciB1c2UuCiAqCQkJCVBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCiAqCiAqLwp0eXBlZGVmIGVudW0KewoJUE9SVENGR19HTUlJXzEyNU1IWiA9IDAsCQkvKiBQeF9HVFhDTEsgPSAxMjVNSHosIDEwMDBCQVNFICovCglQT1JUQ0ZHX0ZEX01JSV8wTUhaID0gMSwJCS8qIFB4X0dUWENMSyA9IDAgTUh6LCBQb3dlciBTYXZlICovCglQT1JUQ0ZHX0ZESERfTUlJXzI1TUhaID0gMiwJCS8qIFB4X0dUWENMSyA9IDI1TUh6LCAxMDBCQVNFICovIAoJUE9SVENGR19GREhEX01JSV8yXzVNSFogPSAzLAkvKiBQeF9HVFhDTEsgPSAyLjVNSHosIDEwQkFTRSAqLwoJUE9SVENGR19GRF9TRVJERVMgPSA0LAkJCS8qIERlZmF1bHQgdmFsdWUgKi8KCVBPUlRDRkdfRkRfMTAwMEJBU0VfWCA9IDUsCQkKCVBPUlRDRkdfTUdNSUkgPSA2LAkJCQkvKiBkdXBsZXgsIHNwZWVkIGRldGVybWluZWQgYnkgdGhlIFBQVSAqLwoJUE9SVENGR19ESVNBQkxFRCA9IDcJCQkKfSBHVF9QT1JUX0NPTkZJR19NT0RFOwoKCnR5cGVkZWYgZW51bQp7CglHVF9TQV9GSUxURVJJTkdfRElTQUJMRSA9IDAsCglHVF9TQV9EUk9QX09OX0xPQ0ssCglHVF9TQV9EUk9QX09OX1VOTE9DSywKCUdUX1NBX0RST1BfVE9fQ1BVCn0gR1RfU0FfRklMVEVSSU5HOwoKCi8qIERlZmluaXRpb24gZm9yIHRoZSBJbmdyZWUvRWdyZXNzIEZyYW1lIE1vZGUgKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0ZSQU1FX01PREVfTk9STUFMID0gMCwJLyogTm9ybWFsIE5ldHdvcmsgKi8KCUdUX0ZSQU1FX01PREVfRFNBLAkJCS8qIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgKi8KCUdUX0ZSQU1FX01PREVfUFJPVklERVIsCQkvKiBQcm92aWRlciAqLwoJR1RfRlJBTUVfTU9ERV9FVEhFUl9UWVBFX0RTQQkvKiBFdGhlciBUeXBlIERTQSAqLwp9IEdUX0ZSQU1FX01PREU7CgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0pVTUJPX01PREUKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgSnVtYm8gRnJhbWUgU2l6ZSBhbGxvd2VkIHRvIGJlIHR4IGFuZCByeAogKgogKiBGaWVsZHM6CiAqICAgICAgR1RfSlVNQk9fTU9ERV8xNTIyIC0gUnggYW5kIFR4IGZyYW1lcyB3aXRoIG1heCBieXRlIG9mIDE1MjIuCiAqICAgICAgR1RfSlVNQk9fTU9ERV8yMDQ4IC0gUnggYW5kIFR4IGZyYW1lcyB3aXRoIG1heCBieXRlIG9mIDIwNDguCiAqICAgICAgR1RfSlVNQk9fTU9ERV8xMDI0MCAtIFJ4IGFuZCBUeCBmcmFtZXMgd2l0aCBtYXggYnl0ZSBvZiAxMDI0MC4KICoJCQkJIAogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0pVTUJPX01PREVfMTUyMiA9IDAsCglHVF9KVU1CT19NT0RFXzIwNDgsCglHVF9KVU1CT19NT0RFXzEwMjQwCn0gR1RfSlVNQk9fTU9ERTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BSSV9PVkVSUklERQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgcHJpb3JpdHkgb3ZlcnJpZGUKICoKICogRmllbGRzOgogKiAgICAgIFBSSV9PVkVSUklERV9OT05FIC0gTm9ybWFsIGZyYW1lIHByaW9yaXR5IHByb2Nlc3Npbmcgb2NjdXJzLgogKgkJUFJJX09WRVJSSURFX0ZSQU1FX1FVRVVFIC0KICoJCQlCb3RoIGZyYW1lIGFuZCBxdWV1ZSBvdmVycmlkZXMgdGFrZSBwbGFjZSBvbiB0aGUgZnJhbWUuCiAqICAgICAgUFJJX09WRVJSSURFX0ZSQU1FIC0gCiAqCQkJT3ZlcndpdGUgdGhlIGZyYW1lJ3MgRlByaSAoZnJhbWUgcHJpb3JpdHkpLgogKgkJCUlmIHRoZSBmcmFtZSBlZ3Jlc3NlcyB0YWdnZWQsIHRoZSBwcmlvcml0eSBpbiB0aGUgZnJhbWUgd2lsbCBiZQogKgkJCXRoZSBvdmVyd3JpdHRlbiBwcmlvcml0eSB2YWx1ZS4KICoJCVBSSV9PVkVSUklERV9RVUVVRSAtCiAqCQkJT3ZlcndpdGUgdGhlIGZyYW1lJ3MgUVByaSAocXVldWUgcHJpb3JpdHkpLgogKgkJCVFQcmkgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIG1hcCB0aGUgZnJhbWUgdG8gb25lIG9mIHRoZSBlZ3Jlc3MKICoJCQlxdWV1ZXMgaW5zaWRlIHRoZSBzd2l0Y2guCiAqCiAqLwp0eXBlZGVmIGVudW0KewoJUFJJX09WRVJSSURFX05PTkUgPSAwLAoJUFJJX09WRVJSSURFX0ZSQU1FX1FVRVVFLAoJUFJJX09WRVJSSURFX0ZSQU1FLAoJUFJJX09WRVJSSURFX1FVRVVFCn0gR1RfUFJJX09WRVJSSURFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfRlJBTUVfUE9MSUNZCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBwb2xpY3kgb2YgdGhlIGZyYW1lCiAqCiAqIEZpZWxkczoKICogICAgICBGUkFNRV9QT0xJQ1lfTk9ORSAtIE5vcm1hbCBmcmFtZSBzd2l0Y2hpbmcKICogICAgICBGUkFNRV9QT0xJQ1lfTUlSUk9SIC0gTWlycm9yKGNvcHkpIGZyYW1lIHRvIHRoZSBNaXJyb3JEZXN0IHBvcnQKICogICAgICBGUkFNRV9QT0xJQ1lfVFJBUCAtIFRyYXAocmUtZGlyZWN0KSBmcmFtZSB0byB0aGUgQ1BVRGVzdCBwb3J0CiAqICAgICAgRlJBTUVfUE9MSUNZX0RJU0NBUkQgLSBEaXNjYXJkKGZpbHRlcikgdGhlIGZyYW1lCiAqCiAqLwp0eXBlZGVmIGVudW0KewoJRlJBTUVfUE9MSUNZX05PTkUgPSAwLAoJRlJBTUVfUE9MSUNZX01JUlJPUiwKCUZSQU1FX1BPTElDWV9UUkFQLAoJRlJBTUVfUE9MSUNZX0RJU0NBUkQKfSBHVF9GUkFNRV9QT0xJQ1k7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QT0xJQ1lfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgcG9saWN5IHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBPTElDWV9UWVBFX0RBIAktIFBvbGljeSBiYXNlZCBvbiBEZXN0aW5hdGlvbiBBZGRyZXNzCiAqICAgICAgUE9MSUNZX1RZUEVfU0EgCS0gUG9saWN5IGJhc2VkIG9uIFNvdXJjZSBBZGRyZXNzCiAqICAgICAgUE9MSUNZX1RZUEVfVlRVIAktIFBvbGljeSBiYXNlZCBvbiBWSUQKICoJCVBPTElDWV9UWVBFX0VUWVBFCS0gYmFzZWQgb24gRXRoZXIgVHlwZSBvZiBhIGZyYW1lCiAqCQlQT0xJQ1lfVFlQRV9QUFBvRQktIFBvbGljeSBmb3IgdGhlIGZyYW1lIHdpdGggRXRoZXIgVHlwZSBvZiAweDg4NjMKICoJCVBPTElDWV9UWVBFX1ZCQVMJLSBQb2xpY3kgZm9yIHRoZSBmcmFtZSB3aXRoIEV0aGVyIFR5cGUgb2YgMHg4MjAwCiAqCQlQT0xJQ1lfVFlQRV9PUFQ4MgktIFBvbGljeSBmb3IgdGhlIGZyYW1lIHdpdGggREhDUCBPcHRpb24gODIKICoJCVBPTElDWV9UWVBFX1VEUAktIFBvbGljeSBmb3IgdGhlIGZyYW1lIHdpdGggQnJvYWRjYXN0IElQdjQgVURQIG9yCiAqCQkJCQkJTXVsdGljYXN0IElQdjYgVURQCiAqLwp0eXBlZGVmIGVudW0KewoJUE9MSUNZX1RZUEVfREEsCglQT0xJQ1lfVFlQRV9TQSwKCVBPTElDWV9UWVBFX1ZUVSwKCVBPTElDWV9UWVBFX0VUWVBFLAoJUE9MSUNZX1RZUEVfUFBQb0UsCglQT0xJQ1lfVFlQRV9WQkFTLAoJUE9MSUNZX1RZUEVfT1BUODIsCglQT0xJQ1lfVFlQRV9VRFAKfSBHVF9QT0xJQ1lfVFlQRTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BSSV9PVkVSUklERV9GVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiB0aGUgZnJhbWUgdHlwZSBmb3IgcHJpb3JpdHkgb3ZlcnJpZGUKICoKICogRmllbGRzOgogKgkJRlRZUEVfRFNBX1RPX0NQVV9CUERVIC0KICoJCQlVc2VkIG9uIG11bHRpY2FzdCBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDAgKEJQRFUvTUdNVCkuCiAqCQkJTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICoJCUZUWVBFX0RTQV9UT19DUFVfRjJSIC0KICoJCQlVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4MSAoRnJhbWUgdG8gUmVnaXN0ZXIKICoJCQlSZXBseSkuIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqCQlGVFlQRV9EU0FfVE9fQ1BVX0lHTVAgLQogKgkJCVVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHgyIChJR01QL01MRCBUcmFwKQogKgkJCWFuZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgYXJlIElHTVAgb3IgTUxEIHRyYXBwZWQKICoJCUZUWVBFX0RTQV9UT19DUFVfVFJBUCAtCiAqCQkJVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDMgKFBvbGljeSBUcmFwKSBhbmQKICoJCQlvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgYXJlIFBvbGljeSBUcmFwcGVkCiAqCQlGVFlQRV9EU0FfVE9fQ1BVX0FSUCAtCiAqCQkJVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDQgKEFSUCBNaXJyb3IpIGFuZAogKgkJCW9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBhcmUgQVJQIE1pcnJvcmVkIChzZWUgZ3BydFNldEFSUHRvQ1BVIEFQSSkuCiAqCQlGVFlQRV9EU0FfVE9fQ1BVX01JUlJPUiAtCiAqCQkJVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDUgKFBvbGljeSBNaXJyb3IpIGFuZAogKgkJCW9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBhcmUgUG9saWN5IE1pcnJvcmVkIChzZWUgZ3BydFNldFBvbGljeSBBUEkpLgogKgkJRlRZUEVfRFNBX1RPX0NQVV9SRVNFUlZFRCAtCiAqCQkJVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDYgKFJlc2VydmVkKS4gTm90CiAqCQkJdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKgkJRlRZUEVfRFNBX1RPX0NQVV9VQ0FTVF9NR01UIC0KICoJCQlVc2VkIG9uIHVuaWNhc3QgRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHgwICh1bmljYXN0CiAqCQkJTUdNVCkuIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqCQlGVFlQRV9EU0FfRlJPTV9DUFUgLQogKgkJCVVzZWQgb24gRFNBIEZyb21fQ1BVIGZyYW1lcy4gTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lCiAqCQlGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9GQyAtCiAqCQkJVXNlZCBvbiBEU0EgQ3Jvc3MgQ2hpcCBGbG93IENvbnRyb2wgZnJhbWVzIChUb19TbmlmZmVyIEZsb3cKICoJCQlDb250cm9sKS4gTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICoJCUZUWVBFX0RTQV9DUk9TU19DSElQX0VHUkVTU19NT04gLQogKgkJCVVzZWQgb24gRFNBIENyb3NzIENoaXAgRWdyZXNzIE1vbml0b3IgZnJhbWVzIChUb19TbmlmZmVyIFR4KS4KICoJCQlOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKgkJRlRZUEVfRFNBX0NST1NTX0NISVBfSU5HUkVTU19NT04gLQogKgkJCVVzZWQgb24gRFNBIENyb3NzIENoaXAgSW5ncmVzcyBNb25pdG9yIGZyYW1lcyAoVG9fU25pZmZlciBSeCkuCiAqCQkJTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICoJCUZUWVBFX1BPUlRfRVRZUEVfTUFUQ0ggLQogKgkJCVVzZWQgb24gbm9ybWFsIG5ldHdvcmsgcG9ydHMgKHNlZSBncHJ0U2V0RnJhbWVNb2RlIEFQSSkKICoJCQlvbiBmcmFtZXMgd2hvc2UgRXRoZXJ0eXBlIG1hdGNoZXMgdGhlIHBvcnQncyBQb3J0RVR5cGUgcmVnaXN0ZXIuCiAqCQkJTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICoJCUZUWVBFX0JDQVNUX05PTl9EU0FfQ09OVFJPTCAtCiAqCQkJVXNlZCBvbiBOb24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgY29udGFpbiBhIEJyb2FkY2FzdAogKgkJCWRlc3RpbmF0aW9uIGFkZHJlc3MuIE5vdCB1c2VkIG9uIERTQSBDb250cm9sIGZyYW1lcy4KICoJCUZUWVBFX1BQUG9FX05PTl9EU0FfQ09OVFJPTCAtCiAqCQkJVXNlZCBvbiBOb24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgY29udGFpbiBhbiBFdGhlciBUeXBlIDB4ODg2MwogKgkJCShpLmUuLCBQUFBvRSBmcmFtZXMpLiBOb3QgdXNlZCBvbiBEU0EgQ29udHJvbCBmcmFtZXMuCiAqCQlGVFlQRV9JUF9OT05fRFNBX0NPTlRST0wgLQogKgkJCVVzZWQgb24gTm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGNvbnRhaW4gYW4gSVB2NCBvciBJUHY2IEV0aGVyCiAqCQkJVHlwZS4gTm90IHVzZWQgb24gRFNBIENvbnRyb2wgZnJhbWVzLgogKi8KdHlwZWRlZiBlbnVtCnsKCUZUWVBFX0RTQV9UT19DUFVfQlBEVSA9IDAsCglGVFlQRV9EU0FfVE9fQ1BVX0YyUiwKCUZUWVBFX0RTQV9UT19DUFVfSUdNUCwKCUZUWVBFX0RTQV9UT19DUFVfVFJBUCwKCUZUWVBFX0RTQV9UT19DUFVfQVJQLAoJRlRZUEVfRFNBX1RPX0NQVV9NSVJST1IsCglGVFlQRV9EU0FfVE9fQ1BVX1JFU0VSVkVELAoJRlRZUEVfRFNBX1RPX0NQVV9VQ0FTVF9NR01ULAoJRlRZUEVfRFNBX0ZST01fQ1BVLAoJRlRZUEVfRFNBX0NST1NTX0NISVBfRkMsCglGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9FR1JFU1NfTU9OLAoJRlRZUEVfRFNBX0NST1NTX0NISVBfSU5HUkVTU19NT04sCglGVFlQRV9QT1JUX0VUWVBFX01BVENILAoJRlRZUEVfQkNBU1RfTk9OX0RTQV9DT05UUk9MLAoJRlRZUEVfUFBQb0VfTk9OX0RTQV9DT05UUk9MLAoJRlRZUEVfSVBfTk9OX0RTQV9DT05UUk9MCn0gR1RfUFJJX09WRVJSSURFX0ZUWVBFOwoKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9RUFJJX1RCTF9FTlRSWQogKgogKiBEZXNjcmlwdGlvbjogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIGVudHJ5IG9mIFF1ZXVlIFByaW9yaXR5IE92ZXJyaWRlCiAqCQkJCVRhYmxlLgogKgogKiBGaWVsZHM6CiAqCQlxUHJpRW4gICAgLSBHVF9UUlVFIHRvIGVuYWJsZSBRdWV1ZSBQcmlvcml0eSwgR1RfRkFMU0Ugb3RoZXJ3aXNlCiAqCQlxUHJpb3JpdHkgLSBwcmlvcml0eSB0byBiZSBvdmVycmlkZGVuICggMCB+IDMgKSBvbmx5IGlmIHFQcmlFbiBpcyBHVF9UUlVFCiAqCQkJCQlXaGVuIHFQcmlFbiBpcyBHVF9GQUxTRSwgcVByaW9yaXR5IHNob3VsZCBiZSBpZ25vcmVkLgogKgogKiBOb3RlczogSWYgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgcVByaUF2YkVuLCBxUHJpQXZiRW4gYW5kIHFBdmJQcmlvcml0eSBmaWVsZHMKICoJCXdpbGwgYmUgaWdub3JlZC4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJCXFQcmlFbjsKCUdUX1UzMgkJcVByaW9yaXR5Owp9R1RfUVBSSV9UQkxfRU5UUlk7CgoKLyoKICogVHlwZWRlZjogc3RydWN0IEdUX0ZQUklfVEJMX0VOVFJZCiAqCiAqIERlc2NyaXB0aW9uOiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgZW50cnkgb2YgRnJhbWUgUHJpb3JpdHkgT3ZlcnJpZGUKICoJCQkJVGFibGUuCiAqCiAqIEZpZWxkczoKICoJCWZQcmlFbiAgICAtIEdUX1RSVUUgdG8gZW5hYmxlIEZyYW1lIFByaW9yaXR5LCBHVF9GQUxTRSBvdGhlcndpc2UKICoJCWZQcmlvcml0eSAtIHByaW9yaXR5IHRvIGJlIG92ZXJyaWRkZW4gKCAwIH4gNyApIG9ubHkgaWYgZlByaUVuIGlzIEdUX1RSVUUKICoJCQkJCVdoZW4gZlByaUVuIGlzIEdUX0ZBTFNFLCBmUHJpb3JpdHkgc2hvdWxkIGJlIGlnbm9yZWQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQlmUHJpRW47CglHVF9VMzIJCWZQcmlvcml0eTsKfUdUX0ZQUklfVEJMX0VOVFJZOwoKCi8qIE1heGltYW0gbnVtYmVyIG9mIHBvcnRzIGEgc3dpdGNoIG1heSBoYXZlLiAqLwojZGVmaW5lIE1BWF9TV0lUQ0hfUE9SVFMgICAgMTEKI2RlZmluZSBWRVJTSU9OX01BWF9MRU4gCTMwCiNkZWZpbmUgTUFYX1FPU19XRUlHSFRTCQkxMjgKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9Rb1NfV0VJR0hUCiAqCiAqIERlc2NyaXB0aW9uOiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBQcm9ncmFtbWFibGUgUm91bmQgUm9iaW4gV2VpZ2h0cy4KICoKICogRmllbGRzOgogKiAgICAgIGxlbiAgICAtIGxlbmd0aCBvZiB0aGUgdmFsaWQgcXVldWUgZGF0YQogKgkJcXVldWUgIC0gdXB0byAxMjggcXVldWUgZGF0YQogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCQlsZW47CglHVF9VOAkJcXVldWVbTUFYX1FPU19XRUlHSFRTXTsKfUdUX1FvU19XRUlHSFQ7CgoKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9WRVJTSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBUaGlzIHN0cnVjdCBob2xkcyB0aGUgcGFja2FnZSB2ZXJzaW9uLgogKgogKiBGaWVsZHM6CiAqICAgICAgdmVyc2lvbiAtIHN0cmluZyBhcnJheSBob2xkaW5nIHRoZSB2ZXJzaW9uLgogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICB2ZXJzaW9uW1ZFUlNJT05fTUFYX0xFTl07Cn1HVF9WRVJTSU9OOwoKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBHVF9STVUKICoKICogRGVzY3JpcHRpb246IFRoaXMgc3RydWN0IGhvbGRzIHRoZSBSZW1vdGUgTWFuYWdlbWVudCBVbml0IG1vZGUuCiAqCiAqIEZpZWxkczoKICoJCXJtdUVuCS0gZW5hYmxlIG9yIGRpc2FibGUgUk1VCiAqCQlwb3J0CS0gbG9naWNhbCBwb3J0IHdoZXJlIFJNVSBpcyBlbmFibGVkCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQlybXVFbjsKCUdUX0xQT1JUCXBvcnQ7Cn0gR1RfUk1VOwoKCgovKgogKiBUeXBlZGVmOgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgZGlmZmVyZW50IHNpemVzIG9mIHRoZSBNYWMgYWRkcmVzcyB0YWJsZS4KICoKICogRmllbGRzOgogKiAgICAgIEFUVV9TSVpFXzI1NiAgICAtICAgMjU2IGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqICAgICAgQVRVX1NJWkVfNTEyICAgIC0gICA1MTIgZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICogICAgICBBVFVfU0laRV8xMDI0ICAgLSAgIDEwMjQgZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICogICAgICBBVFVfU0laRV8yMDQ4ICAgLSAgIDIwNDggZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICogICAgICBBVFVfU0laRV80MDk2ICAgLSAgIDQwOTYgZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICogICAgICBBVFVfU0laRV84MTkyICAgLSAgIDgxOTIgZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICoKICovCnR5cGVkZWYgZW51bQp7CglBVFVfU0laRV8yNTYsCglBVFVfU0laRV81MTIsCglBVFVfU0laRV8xMDI0LAoJQVRVX1NJWkVfMjA0OCwKCUFUVV9TSVpFXzQwOTYsCglBVFVfU0laRV84MTkyCn1BVFVfU0laRTsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX1BPUlRfU1RQX1NUQVRFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBzcGFubmluZyB0cmVlIHN0YXRlLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfUE9SVF9ESVNBQkxFICAgIC0gcG9ydCBpcyBkaXNhYmxlZC4KICogICBHVF9QT1JUX0JMT0NLSU5HICAgLSBwb3J0IGlzIGluIGJsb2NraW5nL2xpc3RlbmluZyBzdGF0ZS4KICogICBHVF9QT1JUX0xFQVJOSU5HICAgLSBwb3J0IGlzIGluIGxlYXJuaW5nIHN0YXRlLgogKiAgIEdUX1BPUlRfRk9SV0FSRElORyAtIHBvcnQgaXMgaW4gZm9yd2FyZGluZyBzdGF0ZS4KICovCnR5cGVkZWYgZW51bQp7CglHVF9QT1JUX0RJU0FCTEUgPSAwLAoJR1RfUE9SVF9CTE9DS0lORywKCUdUX1BPUlRfTEVBUk5JTkcsCglHVF9QT1JUX0ZPUldBUkRJTkcKfSBHVF9QT1JUX1NUUF9TVEFURTsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0VHUkVTU19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBlZ3Jlc3MgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX1VOTU9ESUZZX0VHUkVTUyAtIGZyYW1lcyBhcmUgdHJhbnNtaXRlZCB1bm1vZGlmaWVkLgogKiAgIEdUX1RBR0dFRF9FR1JFU1MgICAtIGFsbCBmcmFtZXMgYXJlIHRyYW5zbWl0ZWQgdGFnZ2VkLgogKiAgIEdUX1VOVEFHR0VEX0VHUkVTUyAtIGFsbCBmcmFtZXMgYXJlIHRyYW5zbWl0ZWQgdW50YWdnZWQuCiAqICAgR1RfQUREX1RBRyAgICAgICAgIC0gYWx3YXlzIGFkZCBhIHRhZy4gKG9yIGRvdWJsZSB0YWcpCiAqLwp0eXBlZGVmIGVudW0KewoJR1RfVU5NT0RJRllfRUdSRVNTID0gMCwKCUdUX1VOVEFHR0VEX0VHUkVTUywKCUdUX1RBR0dFRF9FR1JFU1MsCglHVF9BRERfVEFHCn0gR1RfRUdSRVNTX01PREU7CgovKiAgdHlwZWRlZjogZW51bSBHVF9ET1QxUV9NT0RFICovCgp0eXBlZGVmIGVudW0KewoJR1RfRElTQUJMRSA9IDAsCglHVF9GQUxMQkFDSywKCUdUX0NIRUNLLAoJR1RfU0VDVVJFCn0gR1RfRE9UMVFfTU9ERTsKCgovKiB0eXBlZGVmOiBlbnVtIEdUX1NXX01PREUgKi8KCnR5cGVkZWYgZW51bQp7CglHVF9DUFVfQVRUQVRDSEVEID0gMCwgLyogcG9ydHMgY29tZSB1cCBkaXNhYmxlZCAqLwoJR1RfQkFDS09GRiwgICAgICAgICAgIC8qIEVFUFJPTSBhdHRhYyBtb2RlIHdpdGggb2xkIGhhbGYgZHVwbGV4IGJhY2tvZmYgbW9kZSAqLwoJR1RfU1RBTkRfQUxPTkUsICAgICAgIC8qIHBvcnRzIGNvbWUgdXAgZW5hYmxlZCwgaWdub3JlIEVFUFJPTSAqLwoJR1RfRUVQUk9NX0FUVEFUQ0hFRCAgIC8qIEVFUFJPTSBkZWZpbmVkIHByb3Qgc3RhdGVzICovCn0gR1RfU1dfTU9ERTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0FUVV9PUEVSQVJJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIGRpZmZlcmVudCBBVFUgYW5kIFZUVSBvcGVyYXRpb25zCiAqCiAqIEZpZWxkczoKICogICAgICBGTFVTSF9BTEwgICAgICAgICAgIC0gRmx1c2ggYWxsIGVudHJpZXMuCiAqICAgICAgRkxVU0hfVU5MT0NLRUQgICAgICAtIEZsdXNoIGFsbCB1bmxvY2tlZCBlbnRyaWVzIGluIEFUVS4KICogICAgICBMT0FEX1BVUkdFX0VOVFJZICAgIC0gTG9hZCAvIFB1cmdlIGVudHJ5LgogKiAgICAgIEdFVF9ORVhUX0VOVFJZICAgICAgLSBHZXQgbmV4dCBBVFUgb3IgVlRVICBlbnRyeS4KICogICAgICBGTFVTSF9BTExfSU5fREIgICAgIC0gRmx1c2ggYWxsIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIERCTnVtLgogKiAgICAgIEZMVVNIX1VOTE9DS0VEX0lOX0RCIC0gRmx1c2ggYWxsIHVubG9ja2VkIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIERCTnVtLgogKiAgICAgIFNFUlZJQ0VfVklPTEFUT05TICAgLSBzZXZpY2UgdmlvbGF0aW9ucyBvZiBWVFUKICoKICovCnR5cGVkZWYgZW51bQp7CglGTFVTSF9BTEwgPSAxLAkJLyogZm9yIGJvdGggYXR1IGFuZCB2dHUgKi8KCUZMVVNIX1VOTE9DS0VELAkJLyogZm9yIGF0dSBvbmx5ICovCglMT0FEX1BVUkdFX0VOVFJZLAkvKiBmb3IgYm90aCBhdHUgYW5kIHZ0dSAqLwoJR0VUX05FWFRfRU5UUlksCQkvKiBmb3IgYm90aCBhdHUgYW5kIHZ0dSAqLwoJRkxVU0hfQUxMX0lOX0RCLAkvKiBmb3IgYXR1IG9ubHkgKi8KCUZMVVNIX1VOTE9DS0VEX0lOX0RCLAkvKiBmb3IgYXR1IG9ubHkgKi8KCVNFUlZJQ0VfVklPTEFUSU9OUyAJLyogZm9yIHZ0dSBvbmx5ICovCn0gR1RfQVRVX09QRVJBVElPTiwgR1RfVlRVX09QRVJBVElPTjsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0ZMVVNIX0NNRAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gdW5pdCBmbHVzaCBvcGVyYXRpb24uCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9GTFVTSF9BTEwgICAgICAgLSBmbHVzaCBhbGwgZW50cmllcy4KICogICBHVF9GTFVTSF9BTExfVU5CTEsgLSBmbHVzaCBhbGwgdW5ibG9ja2VkIChvciB1bmxvY2tlZCkuCiAqICAgR1RfRkxVU0hfQUxMX1VOTE9DS0VEIC0gZmx1c2ggYWxsIHVuYmxvY2tlZCAob3IgdW5sb2NrZWQpLgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0ZMVVNIX0FMTCAgICAgICA9IDEsCiAgICBHVF9GTFVTSF9BTExfVU5CTEsgPSAyLAogICAgR1RfRkxVU0hfQUxMX1VOTE9DS0VEID0gMgp9R1RfRkxVU0hfQ01EOwoKLyoKICogdHlwZWRlZjogZW51bSBHVF9NT1ZFX0NNRAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gdW5pdCBtb3ZlIG9yIHJlbW92ZSBvcGVyYXRpb24uCiAqCSBXaGVuIGRlc3RpbmF0aW9uIHBvcnQgaXMgc2V0IHRvIDB4RiwgUmVtb3ZlIG9wZXJhdGlvbiBvY2N1cnMuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9NT1ZFX0FMTCAgICAgICAtIG1vdmUgYWxsIGVudHJpZXMuCiAqICAgR1RfTU9WRV9BTExfVU5CTEsgLSBtb3ZlIGFsbCB1bmJsb2NrZWQgKG9yIHVubG9ja2VkKS4KICogICBHVF9NT1ZFX0FMTF9VTkxPQ0tFRCAtIG1vdmUgYWxsIHVuYmxvY2tlZCAob3IgdW5sb2NrZWQpLgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX01PVkVfQUxMICAgICAgID0gMSwKCUdUX01PVkVfQUxMX1VOQkxLID0gMiwKCUdUX01PVkVfQUxMX1VOTE9DS0VEID0gMgp9R1RfTU9WRV9DTUQ7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9BVFVfVUNfU1RBVEUKICoKICogRGVzY3JpcHRpb246CiAqICAgICAgRW51bWVyYXRpb24gb2YgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gdW5pdCBlbnRyeSBzdGF0ZSBvZiB1bmljYXN0CiAqICAgICAgZW50cmlzLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqCQlHVF9VQ19JTlZBTElEICAgLSBpbnZhbGlkIGVudHJ5LgogKgkJR1RfVUNfRFlOQU1JQyAgIC0gdW5pY2FzdCBkeW5hbWljIGVudHJ5LgogKgkJR1RfVUNfTk9fUFJJX1RPX0NQVV9TVEFUSUNfTlJMIAogKgkJCQktIHN0YXRpYyB1bmljYXN0IGVudHJ5IHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gQ1BVIHdpdGhvdXQgCiAqCQkJCQlmb3JjaW5nIHByaW9yaXR5IGFuZCB3aXRob3V0IHJhdGUgbGltaXRpbmcuCiAqCQlHVF9VQ19UT19DUFVfU1RBVElDX05STCAKICoJCQkJLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIHRvIENQVSB3aXRob3V0CiAqCQkJCQlyYXRlIGxpbWl0aW5nLgogKgkJR1RfVUNfTk9fUFJJX1NUQVRJQ19OUkwgCiAqCQkJCS0gc3RhdGljIHVuaWNhc3QgZW50cnkgd2l0aG91dCBmb3JjaW5nIHByaW9yaXR5IGFuZCB3aXRob3V0LgogKgkJCQkJcmF0ZSBsaW1pdGluZy4KICoJCUdUX1VDX05PX1BSSV9TVEFUSUNfQVZCX0VOVFJZIAogKgkJCQktIHN0YXRpYyB1bmljYXN0IEFWQiBlbnRyeSB3aXRob3V0IGZvcmNpbmcgcHJpb3JpdHkgaWYgTWFjQXZiIGlzIGVuYWJsZWQuCiAqCQlHVF9VQ19TVEFUSUNfTlJMICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgd2l0aG91dCByYXRlIGxpbWl0aW5nLgogKgkJR1RfVUNfU1RBVElDX0FWQl9FTlRSWSAtIHN0YXRpYyB1bmljYXN0IEFWQiBlbnRyeSBpZiBNYWNBdmIgaXMgZW5hYmxlZCAuCiAqCQlHVF9VQ19OT19QUklfVE9fQ1BVX1NUQVRJQwogKgkJCQktIHN0YXRpYyB1bmljYXN0IGVudHJ5IHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gQ1BVIHdpdGhvdXQgCiAqCQkJCQlmb3JjaW5nIHByaW9yaXR5LgogKgkJR1RfVUNfVE9fQ1BVX1NUQVRJQyAtIHN0YXRpYyB1bmljYXN0IGVudHJ5IHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gQ1BVLgogKgkJR1RfVUNfTk9fUFJJX1NUQVRJQyAtIHN0YXRpYyB1bmljYXN0IGVudHJ5IHdpdGhvdXQgZm9yY2luZyBwcmlvcml0eS4KICoJCUdUX1VDX1NUQVRJQyAgICAtIHN0YXRpYyB1bmljYXN0IGVudHJ5LgogKgogKiBOb3RlOiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIGRldGFpbGVkIHVuaWNhc3QgZW50cnkgc3RhdGVzCiAqCQl0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KICovCnR5cGVkZWYgZW51bQp7CglHVF9VQ19JTlZBTElEICAgICAgPSAwLAoJR1RfVUNfRFlOQU1JQyAgICAgID0gMHgxLAoKCUdUX1VDX05PX1BSSV9UT19DUFVfU1RBVElDX05STAk9IDB4OCwKCUdUX1VDX1RPX0NQVV9TVEFUSUNfTlJMCQkJPSAweDksCglHVF9VQ19OT19QUklfU1RBVElDX05STAkJCT0gMHhBLAoJR1RfVUNfTk9fUFJJX1NUQVRJQ19BVkJfRU5UUlkJPSAweEEsCglHVF9VQ19TVEFUSUNfTlJMIAkJCQk9IDB4QiwKCUdUX1VDX1NUQVRJQ19BVkJfRU5UUlkJCQk9IDB4QiwKCglHVF9VQ19OT19QUklfVE9fQ1BVX1NUQVRJQwk9IDB4QywKCUdUX1VDX1RPX0NQVV9TVEFUSUMgCQk9IDB4RCwKCUdUX1VDX05PX1BSSV9TVEFUSUMgCQk9IDB4RSwKCUdUX1VDX1NUQVRJQyAgCQkJCT0gMHhGCn0gR1RfQVRVX1VDX1NUQVRFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQVRVX01DX1NUQVRFCiAqCiAqIERlc2NyaXB0aW9uOgogKiAgICAgIEVudW1lcmF0aW9uIG9mIHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIHVuaXQgZW50cnkgc3RhdGUgb2YgbXVsdGljYXN0CiAqICAgICAgZW50cmlzLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfTUNfSU5WQUxJRCAgICAgICAgIC0gaW52YWxpZCBlbnRyeS4KICogICAgICBHVF9NQ19NR01fU1RBVElDICAgICAgLSBzdGF0aWMgbXVsdGljYXN0IG1hbmFnZW1lbnQgZW50cmllcy4KICogICAgICBHVF9NQ19TVEFUSUMgICAgICAgICAgLSBzdGF0aWMgbXVsdGljYXN0IHJlZ3VsYXIgZW50cmlzLgogKiAgICAgIEdUX01DX1NUQVRJQ19BVkJfRU5UUlktIHN0YXRpYyBBVkIgZW50cnkgaWYgTWFjQXZiIGlzIGVuYWxiZWQuCiAqICAgICAgR1RfTUNfUFJJT19NR01fU1RBVElDIC0gc3RhdGljIG11bHRpY2FzdCBtYW5hZ2VtZW50IGVudHJpZXMgd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LgogKiAgICAgIEdUX01DX1BSSU9fU1RBVElDICAgICAtIHN0YXRpYyBtdWx0aWNhc3QgcmVndWxhciBlbnRyaXMgd2l0aCBwcmlvcml0eS4KICogICAgICBHVF9NQ19QUklPX1NUQVRJQ19BVkJfRU5UUlkgICAgICAtIHN0YXRpYyBtdWx0aWNhc3QgQVZCIEVudHJ5IHdpdGggcHJpb3JpdHkgaWYgTWFjQXZiIGlzIGVuYWJsZWQKICogICAgICBHVF9NQ19QUklPX1NUQVRJQ19VTkxJTUlURURfUkFURSAtIHN0YXRpYyBtdWx0aWNhc3QgcmVndWxhciBlbnRyaXMgd2l0aCBwcmlvcml0eQogKgkJCQkJCQkJCQkJYW5kIHdpdGhvdXQgcmF0ZSBsaW1pdGluZy4KICogICAgICBHVF9NQ19NR01fU1RBVElDX1VOTElNSVRFRF9SQVRFCSAtIHN0YXRpYyBtdWx0aWNhc3QgbWFuYWdlbWVudCBlbnRyaWVzIHdpdGhvdXQKICoJCQkJCQkJCQkJCXJhdGUgbGltaXRpbmcuCiAqICAgICAgR1RfTUNfU1RBVElDX1VOTElNSVRFRF9SQVRFICAgICAgLSBzdGF0aWMgbXVsdGljYXN0IHJlZ3VsYXIgZW50cmlzIHdpdGhvdXQKICoJCQkJCQkJCQkJCXJhdGUgbGltaXRpbmcuCiAqICAgICAgR1RfTUNfUFJJT19NR01fU1RBVElDX1VOTElNSVRFRF9SQVRFIC0gc3RhdGljIG11bHRpY2FzdCBtYW5hZ2VtZW50IGVudHJpZXMgd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGFuZCB3aXRob3V0IHJhdGUgbGltaXRpbmcuCiAqCiAqIE5vdGU6IFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgbXVsdGljYXN0IGVudHJ5IHN0YXRlcwogKgkJdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuCiAqLwp0eXBlZGVmIGVudW0KewoJR1RfTUNfSU5WQUxJRCAgICAgICAgID0gMCwKCUdUX01DX01HTV9TVEFUSUNfVU5MSU1JVEVEX1JBVEUgPSAweDQsCglHVF9NQ19TVEFUSUNfVU5MSU1JVEVEX1JBVEUJPSAweDUsCglHVF9NQ19TVEFUSUNfQVZCX0VOVFJZCT0gMHg1LAoJR1RfTUNfTUdNX1NUQVRJQyAgICAgID0gMHg2LAoJR1RfTUNfU1RBVElDICAgICAgICAgID0gMHg3LAoJR1RfTUNfUFJJT19NR01fU1RBVElDX1VOTElNSVRFRF9SQVRFID0gMHhDLAoJR1RfTUNfUFJJT19TVEFUSUNfVU5MSU1JVEVEX1JBVEUJPSAweEQsCglHVF9NQ19QUklPX1NUQVRJQ19BVkJfRU5UUlkJPSAweEQsCglHVF9NQ19QUklPX01HTV9TVEFUSUMgPSAweEUsCglHVF9NQ19QUklPX1NUQVRJQyAgICAgPSAweEYKfSBHVF9BVFVfTUNfU1RBVEU7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9BVFVfRVhUX1BSSQogKgogKiAgRGVzY3JpcHRpb246IAogKgkJRXh0YW5kZWQgcHJpb3JpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBhZGRyZXNzIHRhcm5zbGF0b24gdW5pdCBlbnRyeS4KICoKICoJCW1hY0ZQcmkgZGF0YSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBmcmFtZSBwcmlvcml0eSBvbiBhbnkgZnJhbWUgYXNzb2NpYXRlZAogKgkJd2l0aCB0aGlzIE1BQywgaWYgdGhlIHVzZU1hY0ZQcmkgaXMgR1RfVFJVRSBhbmQgdGhlIHBvcnQncyBTQSBhbmQvb3IgCiAqCQlEQSBGUHJpT3ZlcnJpZGUgYXJlIGVuYWJsZWQuIFNBIEZyYW1lIFByaW9yaXR5IE92ZXJyaWRlcyBjYW4gb25seSBvY2N1ciBvbiAKICoJCU1BQyBhZGRyZXNzZXMgdGhhdCBhcmUgU3RhdGljIG9yIHdoZXJlIHRoZSBQb3J0IGlzIExvY2tlZCwgYW5kIHdoZXJlIHRoZSBwb3J0IAogKgkJaXMgbWFwcGVkIHNvdXJjZSBwb3J0IGZvciB0aGUgTUFDIGFkZHJlc3MuCiAqCiAqCQltYWNRUHJpIGRhdGEgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgcXVldWUgcHJpb3JpdHkgb24gYW55IGZyYW1lIGFzc29jaWF0ZWQKICoJCXdpdGggdGhpcyBNQUMsIGlmIHRoZSBFbnRyeVN0YXRlIGluZGljYXRlcyBRdWV1ZSBQcmlvcml0eSBPdmVycmlkZSBhbmQgdGhlIAogKgkJcG9ydCdzIFNBIGFuZC9vciBEQSBRUHJpT3ZlcnJpZGUgYXJlIGVuYWJsZWQuIAogKgogKiAgRmllbGRzOgogKiAgICAgIHVzZU1hY0ZQcmkgLSBVc2UgTUFDIGZyYW1lIHByaW9yaXR5IG92ZXJyaWRlLiBXaGVuIHRoaXMgaXMgR1RfVFJVRSwKICoJCQkJCSBNYWNGUHJpIGRhdGEgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGZyYW1lIHByaW9yaXR5IG9uCiAqCQkJCQkgYW55IGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1BQy4KICogICAgICBtYWNGUHJpICAgIC0gTUFDIGZyYW1lIHByaW9yaXR5IGRhdGEgKDAgfiA3KS4KICogICAgICBtYWNRUHJpICAgIC0gTUFDIHF1ZXVlIHByaW9yaXR5IGRhdGEgKDAgfiAzKS4KICoKICogIENvbW1lbnQ6CiAqICAgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IHRvIGZpbmQgb3V0IGlmIHRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQuCiAqCQlXaGVuIHRoaXMgc3RydWN0dXJlIGlzIGltcGxlbWVudGVkLCB0aGUgZm9sbG93aW5ncyBhcmUgdGhlIGRldmljZXMgc3VwcG9ydGluZyAKICoJCXRoaXMgZmVhdHVyZToKICoJCQk4OEU2MDY1LCA4OEU2MDM1LCBhbmQgODhFNjA1NSBzdXBwb3J0IGFsbCBleHRhbmRlZCBwcmlvcml0eSBkYXRhLgogKgkJCTg4RTYwNjEgYW5kIDg4RTYwMzEgc3VwcG9ydCBvbmx5IG1hY1FQcmkgZGF0YQogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfQk9PTAkJCXVzZU1hY0ZQcmk7CglHVF9VOCAJCQltYWNGUHJpOwoJR1RfVTggCQkJbWFjUVByaTsKfSBHVF9BVFVfRVhUX1BSSTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0FUVV9FTlRSWQogKgogKiAgRGVzY3JpcHRpb246IGFkZHJlc3MgdGFybnNsYXRvbiB1bml0IEVudHJ5CiAqCiAqICBGaWVsZHM6CiAqICAgICAgbWFjQWRkciAgICAtIG1hYyBhZGRyZXNzCiAqICAgICAgdHJ1bmtNZW1iZXItIEdUX1RSVUUgaWYgZW50cnkgYmVsb25ncyB0byBhIFRydW5rLiBUaGlzIGZpZWxkIHdpbGwgYmUKICoJCQkJCSBpZ25vcmVkIGlmIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFRydW5rLgogKiAgICAgIHBvcnRWZWMgICAgLSBwb3J0IFZlY3Rvci4gCiAqCQkJCQkgSWYgdHJ1bmtNZW1iZXIgZmllbGQgaXMgR1RfVFJVRSwgdGhpcyB2YWx1ZSByZXByZXNlbnRzIHRydW5rIElELgogKiAgICAgIHByaW8gICAgICAgLSBlbnRyeSBwcmlvcml0eS4KICogICAgICBlbnRyeVN0YXRlIC0gdGhlIGVudHJ5IHN0YXRlLgogKgkJREJOdW0JICAgLSBBVFUgTUFDIEFkZHJlc3MgRGF0YWJhc2UgbnVtYmVyLiBJZiBtdWx0aXBsZSBhZGRyZXNzIAogKgkJCQkJIGRhdGFiYXNlcyBhcmUgbm90IGJlaW5nIHVzZWQsIERCTnVtIHNob3VsZCBiZSB6ZXJvLgogKgkJCQkJIElmIG11bHRpcGxlIGFkZHJlc3MgZGF0YWJhc2VzIGFyZSBiZWluZyB1c2VkLCB0aGlzIHZhbHVlCiAqCQkJCQkgc2hvdWxkIGJlIHNldCB0byB0aGUgZGVzaXJlZCBhZGRyZXNzIGRhdGFiYXNlIG51bWJlci4KICoJCWV4UHJpbyAgICAgLSBleHRhbmRlZCBwcmlvcml0eSBpbmZvcm1hdGlvbi4gSWYgZGV2aWNlIHN1cHBvcnQgZXh0YW5kZWQgCiAqCQkJCQkgcHJpb3JpdHksIHByaW8gZmllbGQgc2hvdWxkIGJlIGlnbm9yZWQuCiAqCiAqICBDb21tZW50OgogKiAgICAgIFRoZSBlbnRyeVN0YXRlIHVuaW9uIFR5cGUgaXMgZGV0ZXJtaW5lIGFjY29yZGluZyB0byB0aGUgTWFjIFR5cGUuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9FVEhFUkFERFIgCW1hY0FkZHI7CglHVF9CT09MCQkJdHJ1bmtNZW1iZXI7CglHVF9VMzIJCQlwb3J0VmVjOwoJR1RfVTgJCQlwcmlvOwoJR1RfVTgJCQlyZXNlcnZlZDsKCUdUX1UxNgkJCURCTnVtOwoJdW5pb24KCXsKCQlHVF9BVFVfVUNfU1RBVEUgdWNFbnRyeVN0YXRlOwoJCUdUX0FUVV9NQ19TVEFURSBtY0VudHJ5U3RhdGU7Cgl9IGVudHJ5U3RhdGU7CglHVF9BVFVfRVhUX1BSSQlleFByaW87Cn0gR1RfQVRVX0VOVFJZOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVlRVX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBWTEFOICB0YXJuc2xhdG9uIHVuaXQgRGF0YSBSZWdpc3RlcgogKgogKiAgRmllbGRzOgogKiAgICAgIG1lbWJlclRhZ1AgLSBNZW1iZXJzaGlwIGFuZCBFZ3Jlc3MgVGFnZ2luZwogKiAgICAgICAgICAgICAgICAgICBtZW1iZXJUYWdQWzBdIGlzIGZvciBQb3J0IDAsIE1lbWJlclRhZ1BbMV0gaXMgZm9yIHBvcnQgMSwgYW5kIHNvIG9uIAogKgogKiAgQ29tbWVudDoKICogCU1BWF9TV0lUQ0hfUE9SVFMgaXMgMTAgZm9yIE9jdGFuZS4KICogCUluIHRoZSBjYXNlIG9mIEZ1bGxTYWlsLCB0aGVyZSBhcmUgMyBwb3J0cy4gU28sIHRoZSByZXN0IDcgaXMgaWdub3JlZCBpbiBtZW1lYmVyVGFnUAogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICAgIG1lbWJlclRhZ1BbTUFYX1NXSVRDSF9QT1JUU107CglHVF9VOCAgICAgcG9ydFN0YXRlUFtNQVhfU1dJVENIX1BPUlRTXTsKfSBHVF9WVFVfREFUQTsKCi8qCiAqICBkZWZpbml0aW9uIGZvciBNRU1CRVJfVEFHCiAqLwojZGVmaW5lIE1FTUJFUl9FR1JFU1NfVU5NT0RJRklFRAkwCiNkZWZpbmUgTk9UX0FfTUVNQkVSCQkJCTEKI2RlZmluZSBNRU1CRVJfRUdSRVNTX1VOVEFHR0VECQkyCiNkZWZpbmUgTUVNQkVSX0VHUkVTU19UQUdHRUQJCTMKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVlRVX0VYVF9JTkZPCiAqCiAqICBEZXNjcmlwdGlvbjogCiAqCQlFeHRhbmRlZCBWVFUgRW50cnkgaW5mb3JtYXRpb24gZm9yIFByaW9yaXR5IE92ZXJyaWRlIGFuZCBOb24gUmF0ZSBMaW1pdC4KICoJCUZyYW1lIFByaW9yaXR5IGlzIHVzZWQgdG8gYXMgdGhlIHRhZydzIFBSSSBiaXRzIGlmIHRoZSBmcmFtZSBlZ3Jlc3NlcwogKgkJdGhlIHN3aXRjaCB0YWdnZWQuIFRoZSBlZ3Jlc3NzIHF1ZXVlIHRoZSBmcmFtZSBpcyBzd2l0Y2ggaW50byBpcyBub3QKICoJCW1vZGlmaWVkIGJ5IHRoZSBGcmFtZSBQcmlvcml0eSBPdmVycmlkZS4KICoJCVF1ZXVlIFByaW9yaXR5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBlZ3Jlc3MgcXVldWUgdGhlIGZyYW1lIGlzCiAqCQlzd2l0Y2hlZCBpbnRvLiBJZiB0aGUgZnJhbWUgZWdyZXNzZXMgdGFnZ2VkLCB0aGUgcHJpb3JpdHkgaW4gdGhlIGZyYW1lIAogKgkJd2lsbCBub3QgYmUgbW9kaWZpZWQgYnkgYSBRdWV1ZSBQcmlvcml0eSBPdmVycmlkZS4KICoJCU5vblJhdGVMaW1pdCBmb3IgVklEIGlzIHVzZWQgdG8gaW5kaWNhdGUgYW55IGZyYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhpcyAKICoJCVZJRCBhcmUgdG8gYnlwYXNzIGluZ3Jlc3MgYW5kIGVncmVzcyByYXRlIGxpbWl0aW5nLCBpZiB0aGUgaW5ncmVzcyAKICoJCXBvcnQncyBWSUQgTlJhdGVMaW1pdCBpcyBhbHNvIGVuYWJsZWQuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgdXNlVklERlByaSAtIFVzZSBWSUQgZnJhbWUgcHJpb3JpdHkgb3ZlcnJpZGUuIFdoZW4gdGhpcyBpcyBHVF9UUlVFIGFuZCAKICoJCQkJCSBWSURGUHJpT3ZlcnJpZGUgb2YgdGhlIGluZ3Jlc3MgcG9ydCBvZiB0aGUgZnJhbWUgaXMgZW5hYmxlZCwKICoJCQkJCSB2aWRGUHJpIGRhdGEgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgZnJhbWUgcHJpb3JpdHkgb24KICoJCQkJCSBhbnkgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVklELgogKiAgICAgIHZpZEZQcmkgICAgLSBWSUQgZnJhbWUgcHJpb3JpdHkgZGF0YSAoMCB+IDcpLgogKiAgICAgIHVzZVZJRFFQcmkgLSBVc2UgVklEIHF1ZXVlIHByaW9yaXR5IG92ZXJyaWRlLiBXaGVuIHRoaXMgaXMgR1RfVFJVRSBhbmQKICoJCQkJCSBWSURRUHJpT3ZlcnJpZGUgb2YgdGhlIGluZ3Jlc3MgcG9ydCBvZiB0aGUgZnJhbWUgaXMgZW5hYmxlZCwKICoJCQkJCSB2aWRRUHJpIGRhdGEgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHF1ZXVlIHByaW9yaXR5IG9uCiAqCQkJCQkgYW55IGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZJRC4KICogICAgICB2aWRRUHJpICAgIC0gVklEIHF1ZXVlIHByaW9yaXR5IGRhdGEgKDAgfiAzKS4KICogICAgICB2aWROUmF0ZUxpbWl0IC0gYnlwYXNzIHJhdGUgaW5ncmVzcyBhbmQgZWdyZXNzIGxpbWl0aW5nCiAqCiAqICBDb21tZW50OgogKiAgICAgIFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCB0byBmaW5kIG91dCBpZiB0aGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgogKgkJV2hlbiB0aGlzIHN0cnVjdHVyZSBpcyBpbXBsZW1lbnRlZCwgdGhlIGZvbGxvd2luZ3MgYXJlIHRoZSBkZXZpY2VzIHN1cHBvcnRpbmcgCiAqCQl0aGlzIGZlYXR1cmU6CiAqCQkJODhFNjA2NSwgODhFNjAzNSwgYW5kIDg4RTYwNTUgc3VwcG9ydCBhbGwgZGF0YS4KICoJCQk4OEU2MDYxIGFuZCA4OEU2MDMxIHN1cHBvcnQgb25seSB2aWROUmF0ZUxpbWl0LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfQk9PTAkJCXVzZVZJREZQcmk7CglHVF9VOCAJCQl2aWRGUHJpOwoJR1RfQk9PTAkJCXVzZVZJRFFQcmk7CglHVF9VOCAJCQl2aWRRUHJpOwoJR1RfQk9PTAkJCXZpZE5SYXRlTGltaXQ7Cn0gR1RfVlRVX0VYVF9JTkZPOwoKIAovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1ZUVV9FTlRSWQogKgogKiAgRGVzY3JpcHRpb246IFZMQU4gdGFybnNsYXRvbiB1bml0IEVudHJ5CiAqCQlFYWNoIGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZGV2aWNlIHNwZWNpZmljLCBpLmUuLCBzb21lIGZpZWxkcyBtYXkgbm90CiAqCQliZSBzdXBwb3J0ZWQgYnkgdGhlIHVzZWQgc3dpdGNoIGRldmljZS4gSW4gc3VjaCBjYXNlLCB0aG9zZSBmaWVsZHMgYXJlCiAqCQlpZ25vcmVkIGJ5IHRoZSBEU0RUIGRyaXZlci4gUGxlYXNlIHJlZmVyIHRvIHRoZSBkYXRhc2hlZXQgZm9yIHRoZSBsaXN0IG9mCiAqCQlzdXBwb3J0ZWQgZmllbGRzLgogKgogKiAgRmllbGRzOgogKiAgICAgIERCTnVtICAgICAgLSBkYXRhYmFzZSBudW1iZXIgb3IgRklEIChmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGRhdGFiYXNlKQogKiAgICAgIHZpZCAgICAgICAgLSBWTEFOIElEIAogKiAgICAgIHZ0dURhdGEgICAgLSBWVFUgZGF0YQogKgkJdmlkUHJpT3ZlcnJpZGUgLSBvdmVycmlkZSB0aGUgcHJpb3JpdHkgb24gYW55IGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZJRAogKgkJdmlkUHJpb3JpdHkgLSBWSUQgUHJpb3JpdHkgYml0cyAoMCB+IDcpCiAqCQlzaWQJICAgICAgIC0gODAyLjFzIFBvcnQgU3RhdGUgRGF0YWJhc2UgSUQKICoJCXZpZFBvbGljeSAgLSBpbmRpY2F0ZSB0aGF0IHRoZSBmcmFtZSB3aXRoIHRoaXMgVklEIHVzZXMgVklEIFBvbGljeQogKgkJICAgICAgICAgICAgIChzZWUgZ3BydFNldFBvbGljeSBBUEkpLgogKgkJdmlkRXhJbmZvICAtIGV4dGFuZGVkIGluZm9ybWF0aW9uIGZvciBWVFUgZW50cnkuIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZXh0YW5kZWQgCiAqCQkJCQkgaW5mb3JtYXRpb24sIHZpZFByaW9yaXR5T3ZlcnJpZGUgYW5kIHZpZFByaW9yaXR5IHZhbHVlcyBhcmUgCiAqCQkJCQkgaWdub3JlZC4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1UxNiAgICAgICAgREJOdW07CglHVF9VMTYgICAgICAgIHZpZDsKCUdUX1ZUVV9EQVRBICAgdnR1RGF0YTsKCUdUX0JPT0wJCSAgdmlkUHJpT3ZlcnJpZGU7CglHVF9VOAkJICB2aWRQcmlvcml0eTsKCUdUX1U4CQkgIHNpZDsKCUdUX0JPT0wJCSAgdmlkUG9saWN5OwoJR1RfVlRVX0VYVF9JTkZPCXZpZEV4SW5mbzsKfSBHVF9WVFVfRU5UUlk7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9TVFVfT1BFUkFSSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBTVFUgb3BlcmF0aW9ucwogKgogKiBGaWVsZHM6CiAqICAgICAgTE9BRF9QVVJHRV9TVFVfRU5UUlkgICAgLSBMb2FkIC8gUHVyZ2UgZW50cnkuCiAqICAgICAgR0VUX05FWFRfU1RVX0VOVFJZICAgICAgLSBHZXQgbmV4dCBTVFUgIGVudHJ5LgogKgogKi8KdHlwZWRlZiBlbnVtCnsKCUxPQURfUFVSR0VfU1RVX0VOVFJZID0gNSwKCUdFVF9ORVhUX1NUVV9FTlRSWSA9NiAKfSBHVF9TVFVfT1BFUkFUSU9OOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfU1RVX0VOVFJZCiAqCiAqICBEZXNjcmlwdGlvbjogODAyLjFzIFBvcnQgU3RhdGUgSW5mb3JtYXRpb24gRGF0YWJhc2UgKFNUVSkgRW50cnkKICoKICogIEZpZWxkczoKICogICAgICBzaWQgICAgICAgLSBTVFUgSUQgCiAqCQlwb3J0U3RhdGUgLSBQZXIgVkxBTiBQb3J0IFN0YXRlcyBmb3IgZWFjaCBwb3J0LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTE2CQkJCXNpZDsKCUdUX1BPUlRfU1RQX1NUQVRFCXBvcnRTdGF0ZVtNQVhfU1dJVENIX1BPUlRTXTsKfSBHVF9TVFVfRU5UUlk7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9WVFVfSU5UX1NUQVRVUwogKgogKiAgRGVzY3JpcHRpb246IFZMQU4gdGFybnNsYXRvbiB1bml0IGludGVycnVwdCBzdGF0dXMKICoKICogIEZpZWxkczoKICogICAgICBpbnRDYXVzZSAgLSBWVFUgSW50ZXJydXB0IENhdXNlCiAqCQkJCQlHVF9WVFVfRlVMTF9WSU9MQVRJT04sR1RfTUVNRUJFUl9WSU9MQVRJT04sb3IKICoJCQkJCUdUX01JU1NfVklPTEFUSU9OCiAqICAgICAgU1BJRCAgICAgIC0gc291cmNlIHBvcnQgbnVtYmVyCiAqIAkJCQkJaWYgaW50Q2F1c2UgaXMgR1RfVlRVX0ZVTExfVklPTEFUSU9OLCBpdCBtZWFucyBub3RoaW5nCiAqICAgICAgdmlkICAgICAgIC0gVkxBTiBJRCAKICogCQkJCQlpZiBpbnRDYXVzZSBpcyBHVF9WVFVfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1UxNiAgIHZ0dUludENhdXNlOwoJR1RfVTggICAgc3BpZDsKCUdUX1UxNiAgIHZpZDsKfSBHVF9WVFVfSU5UX1NUQVRVUzsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfQVRVX0lOVF9TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBWTEFOIHRhcm5zbGF0b24gdW5pdCBpbnRlcnJ1cHQgc3RhdHVzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaW50Q2F1c2UgIC0gQVRVIEludGVycnVwdCBDYXVzZQogKgkJCQkJR1RfRlVMTF9WSU9MQVRJT04sR1RfTUVNRUJFUl9WSU9MQVRJT04sCiAqCQkJCQlHVF9NSVNTX1ZJT0xBVElPTiwgR1RfQUdFX1ZJT0xBVElPTiwgb3IgCiAqCQkJCQlHVF9BR0VfT1VUX1ZJT0xBVElPTgogKiAgICAgIFNQSUQgICAgICAtIHNvdXJjZSBwb3J0IG51bWJlcgogKiAJCQkJCWlmIGludENhdXNlIGlzIEdUX0ZVTExfVklPTEFUSU9OLCBpdCBtZWFucyBub3RoaW5nCiAqICAgICAgREJOdW0gICAgIC0gREIgTnVtIChvciBGSUQpCiAqIAkJCQkJaWYgaW50Q2F1c2UgaXMgR1RfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICoJCW1hY0FkZHIJICAtIE1BQyBBZGRyZXNzCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMTYgICBhdHVJbnRDYXVzZTsKCUdUX1U4ICAgIHNwaWQ7CglHVF9VOCAgICBkYk51bTsKCUdUX0VUSEVSQUREUiAgbWFjQWRkcjsKfSBHVF9BVFVfSU5UX1NUQVRVUzsKCi8qCiogRGVmaW5pdGlvbiBmb3IgVlRVIGludGVycnVwdAoqLwojZGVmaW5lIEdUX01FTUJFUl9WSU9MQVRJT04JCTB4NAojZGVmaW5lIEdUX01JU1NfVklPTEFUSU9OCQkweDIKI2RlZmluZSBHVF9WVFVfRlVMTF9WSU9MQVRJT04JMHgxCi8qCiogRGVmaW5pdGlvbnMgZm9yIEFUVSBpbnRlcnJ1cHQgaW4gR2lnYWJpdCBzd2l0Y2ggYXJlIHRoZSBzYW1lIGFzIAoqIHRoZSBvbmVzIGZvciBWVFUgaW50ZXJydXB0LiBIZXJlIHdlIGp1c3QgcmVkZWZpbmUgdGhlIEZVTExfVklPTEFUSU9OIGZvcgoqIGJvdGggVlRVIGFuZCBBVFUuCiovCiNkZWZpbmUgR1RfRlVMTF9WSU9MQVRJT04JCTB4MQoKI2RlZmluZSBHVF9BR0VfVklPTEFUSU9OCQkweDgKI2RlZmluZSBHVF9BR0VfT1VUX1ZJT0xBVElPTgkweDEwCgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QVlRfT1BFUkFUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVlQgKENyb3NzIENoaXAgUG9ydCBWTEFOIFRhYmxlKSBPcGVyYXRpb24gdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFZUX0lOSVRJQUxJWkUgLSBJbml0aWFsaXplIGFsbCByZXNvdXJjZXMgdG8gdGhlIGluaXRhbCBzdGF0ZQogKiAgICAgIFBWVF9XUklURSAgICAgIC0gV3JpdGUgdG8gdGhlIHNlbGVjdGVkIFBWVCBlbnRyeQogKiAgICAgIFBWVF9SRUFEICAgICAgIC0gUmVhZCBmcm9tIHRoZSBzZWxlY3RlZCBQVlQgZW50cnkKICovCnR5cGVkZWYgZW51bQp7CglQVlRfSU5JVElBTElaRSAJPSAweDEsCglQVlRfV1JJVEUJCT0gMHgzLAoJUFZUX1JFQUQJCT0gMHg0Cn0gR1RfUFZUX09QRVJBVElPTjsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BWVF9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBQVlQgKENyb3NzIENoaXAgUG9ydCBWTEFOIFRhYmxlKSBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICBwdnRBZGRyIC0gcG9pbnRlciB0byB0aGUgZGVzaXJlZCBlbnRyeSBvZiBQVlQKICogICAgICBwdnREYXRhIC0gQ3Jvc3MgQ2hpcCBQb3J0IFZMQU4gZGF0YSBmb3IgdGhlIGVudHJ5IHBvaW50ZWQgYnkgcHZ0QWRkcgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCXB2dEFkZHI7CglHVF9VMzIJcHZ0RGF0YTsKfSBHVF9QVlRfT1BfREFUQTsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9QSVJMX0ZDX0RFQVNTRVJUCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgZmxvdyBjb250cm9sIGRlLWFzc2VydGlvbiBtb2RlIG9uIFBJUkwuCiAqCiAqICBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfUElSTF9GQ19ERUFTU0VSVF9FTVBUWSAtCiAqCQkJCURlLWFzc2VydCB3aGVuIHRoZSBpbmdyZXNzIHJhdGUgcmVzb3VyY2UgaGFzIGJlY29tZSBlbXB0eQogKgkJR1RfUElSTF9GQ19ERUFTU0VSVF9DQlNfTElNSVQgLQogKgkJCQlEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyBlbm91Z2ggcm9vbSBhcwogKgkJCQlzcGVjaWZpZWQgYnkgdGhlIENCU0xpbWl0LgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1BJUkxfRkNfREVBU1NFUlRfRU1QVFkgPSAwLAoJR1RfUElSTF9GQ19ERUFTU0VSVF9DQlNfTElNSVQKfSBHVF9QSVJMX0ZDX0RFQVNTRVJUOwoKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX1BJUkxfRUxJTUlUX01PREUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBlZ3Jlc3MgcmF0ZSBsaW1pdCBjb3VudGluZyBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1BJUkxfRUxJTUlUX0ZSQU1FIC0KICoJCQkJQ291bnQgdGhlIG51bWJlciBvZiBmcmFtZXMKICogICAgICBHVF9QSVJMX0VMSU1JVF9MQVlFUjEgLQogKgkJCQlDb3VudCBhbGwgTGF5ZXIgMSBieXRlczogCiAqCQkJCVByZWFtYmxlICg4Ynl0ZXMpICsgRnJhbWUncyBEQSB0byBDUkMgKyBJRkcgKDEyYnl0ZXMpCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIyIC0KICoJCQkJQ291bnQgYWxsIExheWVyIDIgYnl0ZXM6IEZyYW1lJ3MgREEgdG8gQ1JDCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIzIC0KICoJCQkJQ291bnQgYWxsIExheWVyIDMgYnl0ZXM6IAogKgkJCQlGcmFtZSdzIERBIHRvIENSQyAtIDE4IC0gNCAoaWYgZnJhbWUgaXMgdGFnZ2VkKQogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1BJUkxfRUxJTUlUX0ZSQU1FID0gMCwKCUdUX1BJUkxfRUxJTUlUX0xBWUVSMSwKCUdUX1BJUkxfRUxJTUlUX0xBWUVSMiwKCUdUX1BJUkxfRUxJTUlUX0xBWUVSMwp9IEdUX1BJUkxfRUxJTUlUX01PREU7CgoKLyogdHlwZWRlZjogZW51bSBHVF9SQVRFX0xJTUlUX01PREUKICogVGhlIGluZ3Jlc3MgbGltaXQgbW9kZSBpbiB0aGUgcmF0ZSBjb250cm9sIHJlZ2lzdGVyICgweEEpCiAqLwoKdHlwZWRlZiBlbnVtCnsKCUdUX0xJTVRfQUxMID0gMCwgCQkvKiBsaW1pdCBhbmQgY291bnQgYWxsIGZyYW1lcyAqLwoJR1RfTElNSVRfRkxPT0QsICAgICAgCS8qIGxpbWl0IGFuZCBjb3VudCBCcm9hZGNhc3QsIE11bHRpY2FzdCBhbmQgZmxvb2RlZCB1bmljYXN0IGZyYW1lcyAqLwoJR1RfTElNSVRfQlJEQ1NUX01MVENTVCwJLyogbGltaXQgYW5kIGNvdW50IEJyb2FkY2FzdCBhbmQgTXVsdGljYXN0IGZyYW1lcyAqLwoJR1RfTElNSVRfQlJEQ1NUICAgCQkvKiBsaW1pdCBhbmQgY291bnQgQnJvYWRjYXN0IGZyYW1lcyAqLwp9IEdUX1JBVEVfTElNSVRfTU9ERTsKCi8qIHR5cGVkZWY6IGVudW0gR1RfUFJJMF9SQVRFCiAqIFRoZSBpbmdyZXNzIGRhdGEgcmF0ZSBsaW1pdCBmb3IgcHJpb3JpdHkgMCBmcmFtZXMgCiAqLwoKdHlwZWRlZiBlbnVtCnsKCUdUX05PX0xJTUlUID0gMCwgCS8qIE5vdCBsaW1pdGVkICAgKi8KCUdUXzEyOEssICAgICAgCQkvKiAxMjhLIGJpdHMvc2VjICovCglHVF8yNTZLLCAgICAgIAkJLyogMjU2SyBiaXRzL3NlYyAqLwoJR1RfNTEySywgICAgICAJCS8qIDUxMiBiaXRzL3NlYyAqLwoJR1RfMU0sICAgICAgCQkvKiAxTSAgYml0cy9zZWMgKi8KCUdUXzJNLCAgICAgIAkJLyogMk0gIGJpdHMvc2VjICovCglHVF80TSwgICAgICAJCS8qIDRNICBiaXRzL3NlYyAqLwoJR1RfOE0sICAgICAgCQkvKiA4TSAgYml0cy9zZWMgKi8KCUdUXzE2TSwgICAgICAJCS8qIDE2TSAgYml0cy9zZWMsIE5vdGU6IHN1cHBvcnRlZCBvbmx5IGJ5IEdpZ2FiaXQgRXRoZXJuZXQgU3dpdGNoICovCglHVF8zMk0sICAgICAgCQkvKiAzMk0gIGJpdHMvc2VjLCBOb3RlOiBzdXBwb3J0ZWQgb25seSBieSBHaWdhYml0IEV0aGVybmV0IFN3aXRjaCAqLwoJR1RfNjRNLCAgICAgIAkJLyogNjRNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KCUdUXzEyOE0sICAgICAgCQkvKiAxMjhNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KCUdUXzI1Nk0gICAgICAJCS8qIDI1Nk0gIGJpdHMvc2VjLCBOb3RlOiBzdXBwb3J0ZWQgb25seSBieSBHaWdhYml0IEV0aGVybmV0IFN3aXRjaCAqLwp9IEdUX1BSSTBfUkFURSxHVF9FR1JFU1NfUkFURTsKCgovKgogKiBUeXBlZGVmOiB1bmlvbiBHVF9FUkFURV9UWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBFZ3Jlc3MgUmF0ZQogKgogKiBGaWVsZHM6CiAqICAgICAgZGVmaW5lZFJhdGUgLSBHVF9FR1JFU1NfUkFURSBlbnVtIHR5cGUgc2hvdWxkIGJlIHVzZWQgb24gdGhlIGZvbGxvd2luZyBkZXZpY2VzOgogKgkJCQkJCTg4RTYyMTgsIDg4RTYzMTgsIDg4RTYwNjMsIDg4RTYwODMsIDg4RTYxODEsIDg4RTYxODMsIDg4RTYwOTMKICoJCQkJCQk4OEU2MDk1LCA4OEU2MTg1LCA4OEU2MTA4LCA4OEU2MDY1LCA4OEU2MDYxLCBhbmQgdGhlaXIgdmFyaWF0aW9ucy4KICogICAgICBrYlJhdGUgICAgICAtIHJhdGUgaW4ga2JwcyB0aGF0IHNob3VsZCBiZSB1c2VkIG9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKICoJCQkJCQk4OEU2MDk3LCA4OEU2MDk2IHdpdGggY291bnQgbW9kZSBvZiBub24gZnJhbWUsIHN1Y2ggYXMKICoJCQkJCQkJCQlBTExfTEFZRVIxLCBBTExfTEFZRVIyLCBhbmQgQUxMX0xBWUVSMwogKgkJCQkJCTY0a2JwcyB+IDFNYnBzICAgIDogaW5jcmVtZW50cyBvZiA2NGticHMsCiAqCQkJCQkJMU1icHMgfiAxMDBNYnBzICAgOiBpbmNyZW1lbnRzIG9mIDFNYnBzLCBhbmQKICoJCQkJCQkxMDBNYnBzIH4gMTAwME1icHM6IGluY3JlbWVudHMgb2YgMTBNYnBzCiAqCQkJCQkJVGhlcmVmb3JlLCB0aGUgdmFsaWQgdmFsdWVzIGFyZToKICoJCQkJCQkJNjQsIDEyOCwgMTkyLCAyNTYsIDMyMCwgMzg0LC4uLiwgOTYwLAogKgkJCQkJCQkxMDAwLCAyMDAwLCAzMDAwLCA0MDAwLCAuLi4sIDEwMDAwMCwKICoJCQkJCQkJMTEwMDAwLCAxMjAwMDAsIDEzMDAwMCwgLi4uLCAxMDAwMDAwLgogKiAgICAgIGZSYXRlIAkJLSBmcmFtZSBwZXIgc2Vjb25kIHRoYXQgc2hvdWxkIGJlIHVzZWQgb24gdGhlIGZvbGxvd2luZyBkZXZpY2VzOgogKgkJCQkJCTg4RTYwOTcsIDg4RTYwOTYgd2l0aCBjb3VudCBtb2RlIG9mIGZyYW1lIChHVF9QSVJMX0NPVU5UX0ZSQU1FKQogKi8KdHlwZWRlZiB1bmlvbgp7CglHVF9FR1JFU1NfUkFURQlkZWZpbmVkUmF0ZTsKCUdUX1UzMgkJCWtiUmF0ZTsKCUdUX1UzMgkJCWZSYXRlOwp9IEdUX0VSQVRFX1RZUEU7CgovKgogKiBGb3JtdWxhIGZvciBSYXRlIExpbWl0IG9mIEdpZ2FiaXQgU3dpdGNoIGZhbWlseSBhbmQgRW5oYW5jZWQgRmFzdEV0aGVybmV0IFN3aXRjaAogKi8KI2RlZmluZSBHVF9HRVRfUkFURV9MSU1JVChfa2JwcykJXAoJCSgoX2ticHMpPyg4MDAwMDAwIC8gKDI4ICogKF9rYnBzKSkpOjApCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVQyKF9rYnBzKQlcCgkJKChfa2Jwcyk/KDgwMDAwMDAgLyAoMzIgKiAoX2ticHMpKSArICg4MDAwMDAwICUgKDMyICogKF9rYnBzKSk/MTowKSk6MCkKI2RlZmluZSBHVF9HRVRfUkFURV9MSU1JVDMoX2ticHMpCVwKCQkoKF9rYnBzKT8oODAwMDAwMCAvICg0MCAqIChfa2JwcykpICsgKDgwMDAwMDAgJSAoNDAgKiAoX2ticHMpKT8xOjApKTowKQoKI2RlZmluZSBNQVhfUkFURV9MSU1JVAkJMjU2MDAwCS8qIHVuaXQgb2YgS2JwcyAqLwojZGVmaW5lIE1JTl9SQVRFX0xJTUlUCQk2NQkJLyogdW5pdCBvZiBLYnBzICovCgoKI2RlZmluZSBHVF9HRVRfUkFURV9MSU1JVF9QRVJfRlJBTUUoX2ZyYW1lcywgX2RlYykJXAoJCSgoX2ZyYW1lcyk/KDEwMDAwMDAwMDAgLyAoMzIgKiAoX2ZyYW1lcykpICsgKDEwMDAwMDAwMDAgJSAoMzIgKiAoX2ZyYW1lcykpPzE6MCkpOjApCgojZGVmaW5lIEdUX0dFVF9SQVRFX0xJTUlUX1BFUl9CWVRFKF9rYnBzLCBfZGVjKQlcCgkJKChfa2Jwcyk/KCg4MDAwMDAwKihfZGVjKSkgLyAoMzIgKiAoX2ticHMpKSArICgoODAwMDAwMCooX2RlYykpICUgKDMyICogKF9rYnBzKSk/MTowKSk6MCkKCi8qIAogKiB0eXBlZGVmOiBlbnVtIEdUX0JVUlNUX1NJWkUKICogVGhlIGluZ3Jlc3MgZGF0YSByYXRlIGxpbWl0IGJ1cnN0IHNpemUgd2luZG93cyBzZWxlY3Rpb24KICovCgp0eXBlZGVmIGVudW0KewoJR1RfQlVSU1RfU0laRV8xMksgPSAwLCAJLyogMTJLIGJ5dGUgYnVyc3Qgc2l6ZSAqLwoJR1RfQlVSU1RfU0laRV8yNEssCQkvKiAyNEsgYnl0ZSBidXJzdCBzaXplICovCglHVF9CVVJTVF9TSVpFXzQ4SywJCS8qIDQ4SyBieXRlIGJ1cnN0IHNpemUgKi8KCUdUX0JVUlNUX1NJWkVfOTZLIAkgCS8qIDk2SyBieXRlIGJ1cnN0IHNpemUgKi8KfSBHVF9CVVJTVF9TSVpFOwoKLyogCiAqIHR5cGVkZWY6IGVudW0gR1RfQlVSU1RfUkFURQogKiBUaGUgaW5ncmVzcyBkYXRhIHJhdGUgbGltaXQgYmFzZWQgb24gYnVyc3Qgc2l6ZQogKi8KCnR5cGVkZWYgZW51bQp7CglHVF9CVVJTVF9OT19MSU1JVCA9IDAsIAkvKiBOb3QgbGltaXRlZCAgICovCglHVF9CVVJTVF82NEssICAJCS8qIDY0SyBiaXRzL3NlYyAqLwoJR1RfQlVSU1RfMTI4SywgIAkvKiAxMjhLIGJpdHMvc2VjICovCglHVF9CVVJTVF8yNTZLLCAgCS8qIDI1NksgYml0cy9zZWMgKi8KCUdUX0JVUlNUXzM4NEssICAJLyogMzg0SyBiaXRzL3NlYyAqLwoJR1RfQlVSU1RfNTEySywgIAkvKiA1MTIgYml0cy9zZWMgKi8KCUdUX0JVUlNUXzY0MEssICAJLyogNjQwSyBiaXRzL3NlYyAqLwoJR1RfQlVSU1RfNzY4SywgIAkvKiA3NjhLIGJpdHMvc2VjICovCglHVF9CVVJTVF84OTZLLCAgCS8qIDg5NksgYml0cy9zZWMgKi8KCUdUX0JVUlNUXzFNLCAgICAJLyogMU0gIGJpdHMvc2VjICovCglHVF9CVVJTVF8xNTAwSywgIAkvKiAxLjVNIGJpdHMvc2VjICovCglHVF9CVVJTVF8yTSwgICAgCS8qIDJNICBiaXRzL3NlYyAqLwoJR1RfQlVSU1RfNE0sICAgIAkvKiA0TSAgYml0cy9zZWMgKi8KCUdUX0JVUlNUXzhNLCAgIAkJLyogOE0gIGJpdHMvc2VjICovCglHVF9CVVJTVF8xNk0sICAJCS8qIDE2TSAgYml0cy9zZWMgKi8KCUdUX0JVUlNUXzMyTSwgIAkJLyogMzJNICBiaXRzL3NlYyAqLwoJR1RfQlVSU1RfNjRNLCAgCQkvKiA2NE0gIGJpdHMvc2VjICovCglHVF9CVVJTVF8xMjhNLCAJCS8qIDEyOE0gIGJpdHMvc2VjICovCglHVF9CVVJTVF8yNTZNICAJCS8qIDI1Nk0gIGJpdHMvc2VjICovCn0gR1RfQlVSU1RfUkFURTsKCi8qCiAqIEZvcm11bGEgZm9yIGJ1cnN0IGJhc2VkIFJhdGUgTGltaXQKICovCiNkZWZpbmUgR1RfR0VUX0JVUlNUX1JBVEVfTElNSVQoX2JzaXplLF9rYnBzKQlcCgkJKChfa2Jwcyk/KCgoX2JzaXplKSsxKSo4MDAwMDAwIC8gKDMyICogKF9rYnBzKSkgKyAJCVwKCQkJCSgoKF9ic2l6ZSkrMSkqODAwMDAwMCAlICgzMiAqIChfa2JwcykpPzE6MCkpCVwKCQkJCTowKQoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QSVJMX09QRVJBVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUElSTCAoUG9ydCBJbmdyZXNzIFJhdGUgTGltaXQpIE9wZXJhdGlvbiB0eXBlCiAqCiAqIEZpZWxkczoKICogICAgICBQSVJMX0lOSVRfQUxMX1JFU09VUkNFIC0gSW5pdGlhbGl6ZSBhbGwgcmVzb3VyY2VzIHRvIHRoZSBpbml0YWwgc3RhdGUKICogICAgICBQSVJMX0lOSVRfUkVTT1VSQ0UgICAgIC0gSW5pdGlhbGl6ZSBzZWxlY3RlZCByZXNvdXJjZXMgdG8gdGhlIGluaXRhbCBzdGF0ZQogKiAgICAgIFBJUkxfV1JJVEVfUkVTT1VSQ0UgICAgLSBXcml0ZSB0byB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UvcmVnaXN0ZXIKICogICAgICBQSVJMX1JFQURfUkVTT1VSQ0UgICAgIC0gUmVhZCBmcm9tIHRoZSBzZWxlY3RlZCByZXNvdXJjZS9yZWdpc3RlcgogKi8KdHlwZWRlZiBlbnVtCnsKCVBJUkxfSU5JVF9BTExfUkVTT1VSQ0UgCT0gMHgxLAoJUElSTF9JTklUX1JFU09VUkNFCQk9IDB4MiwKCVBJUkxfV1JJVEVfUkVTT1VSQ0UJCT0gMHgzLAoJUElSTF9SRUFEX1JFU09VUkNFCQk9IDB4NAp9IEdUX1BJUkxfT1BFUkFUSU9OLCBHVF9QSVJMMl9PUEVSQVRJT047CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMX09QX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHJlcXVpcmVkIGJ5IFBJUkwgT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaXJsVW5pdCAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IFVuaXQgdGhhdCBkZWZpbmVzIG9uZSBvZiBJUkwgcmVzb3VyY2VzLgogKiAgICAgIGlybFJlZyAgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBSZWdpc3Rlci4KICogICAgICBpcmxEYXRhICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgRGF0YS4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1UzMglpcmxVbml0OwoJR1RfVTMyCWlybFJlZzsKCUdUX1UzMglpcmxEYXRhOwp9IEdUX1BJUkxfT1BfREFUQTsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgUElSTCBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICBpcmxQb3J0ICAgLSBJbmdyZXNzIFJhdGUgTGltaXRpbmcgcG9ydCAocGh5c2ljYWwgcG9ydCBudW1iZXIpLgogKiAgICAgIGlybFJlcyAgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBSZXNvdXJjZS4KICogICAgICBpcmxSZWcgICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgUmVnaXN0ZXIuCiAqICAgICAgaXJsRGF0YSAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IERhdGEuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMzIJaXJsUG9ydDsKCUdUX1UzMglpcmxSZXM7CglHVF9VMzIJaXJsUmVnOwoJR1RfVTMyCWlybERhdGE7Cn0gR1RfUElSTDJfT1BfREFUQTsKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUElSTF9BQ1RJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIEFjdGlvbiB0aGF0IHNob3VsZCBiZSB0YWtlbiB3aGVuCiAqCQl0aGVyZSB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMgdG8gYWNjZXB0IHRoZSBlbnRpcmUgaW5jb21pbmcgZnJhbWUKICoKICogRmllbGRzOgogKgkJUElSTF9BQ1RJT05fQUNDRVBUIC0gYWNjZXB0IHRoZSBmcmFtZQogKgkJUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiAtIHVzZSBFU0IgTGltaXQgQWN0aW9uCiAqLwp0eXBlZGVmIGVudW0KewoJUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiA9IDB4MCwKCVBJUkxfQUNUSU9OX0FDQ0VQVCAJPSAweDEKfSBHVF9QSVJMX0FDVElPTjsKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfRVNCX0xJTUlUX0FDVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgRVNCIExpbWl0IEFjdGlvbiB0aGF0IHNob3VsZCBiZSB0YWtlbiB3aGVuCiAqCQl0aGUgaW5jb21pbmcgcG9ydCBpbmZvcm1hdGlvbiByYXRlIGV4Y2VlZHMgdGhlIEVCU19MaW1pdC4KICoKICogRmllbGRzOgogKgkJRVNCX0xJTUlUX0FDVElPTl9EUk9QIC0gZHJvcCBwYWNrZXRzCiAqCQlFU0JfTElNSVRfQUNUSU9OX0ZDICAgLSBzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQKICovCnR5cGVkZWYgZW51bQp7CglFU0JfTElNSVRfQUNUSU9OX0RST1AgCT0gMHgwLAoJRVNCX0xJTUlUX0FDVElPTl9GQwkJPSAweDEKfSBHVF9FU0JfTElNSVRfQUNUSU9OOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfQlVDS0VUX1JBVEVfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgQnVja2V0IFJhdGUgVHlwZQogKgogKiBGaWVsZHM6CiAqCQlCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECS0gYnVja2V0IGlzIHRyYWZmaWMgdHlwZSBiYXNlZAogKgkJQlVDS0VUX1RZUEVfUkFURV9CQVNFRAkJLSBidWNrZXQgaXMgcmF0ZSBiYXNlZAogKi8KdHlwZWRlZiBlbnVtCnsKCUJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQJPSAweDAsCglCVUNLRVRfVFlQRV9SQVRFX0JBU0VECQk9IDB4MQp9IEdUX0JVQ0tFVF9SQVRFX1RZUEU7CgovKgogKiBEZWZpbml0aW9uIGZvciBHVF9CVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBUcmFmZmljIFR5cGUgdGhhdCBpcyB1c2VkIHdoZW4gQnVja2V0IFJhdGUgVHlwZQogKgkJaXMgdHJhZmZpYyB0eXBlIGJhc2VkIChCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VEKS4KICoJCVBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBpbiBvcmRlciB0byBjaGVjayB3aGljaCB0cmFmZmljCiAqCQl0eXBlcyBhcmUgc3VwcG9ydGVkLgogKgogKiBEZWZpbml0aW9uOgogKgkJQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNUCS0gdW5rbm93biB1bmljYXN0IGZyYW1lCiAqCQlCVUNLRVRfVFJBRkZJQ19VTktOT1dOX01VTFRJQ0FTVC0gdW5rbm93biBtdWx0aWNhc3QgZnJhbWUKICoJCUJVQ0tFVF9UUkFGRklDX0JST0FEQ0FTVAkJLSBicm9hZGNhc3QgZnJhbWUKICoJCUJVQ0tFVF9UUkFGRklDX01VTFRJQ0FTVAkJLSBtdWx0aWNhc3QgZnJhbWUKICoJCUJVQ0tFVF9UUkFGRklDX1VOSUNBU1QJCQktIHVuaWNhc3QgZnJhbWUKICoJCUJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUJCS0gbWFuYWdlbWVudCBmcmFtZQogKgkJQlVDS0VUX1RSQUZGSUNfQVJQCQkJCS0gYXJwIGZyYW1lCiAqCQlCVUNLRVRfVFJBRkZJQ19UQ1BfREFUQQkJCS0gVENQIERhdGEKICoJCUJVQ0tFVF9UUkFGRklDX1RDUF9DVFJMCQkJLSBUQ1AgQ3RybCAoaWYgYW55IG9mIHRoZSBUQ1AgRmxhZ3NbNTowXSBhcmUgc2V0KQogKgkJQlVDS0VUX1RSQUZGSUNfVURQCQkJCS0gVURQCiAqCQlCVUNLRVRfVFJBRkZJQ19OT05fVENQVURQCQktIGNvdmVycyBJR01QLElDTVAsR1JFLElHUlAsTDJUUAogKgkJQlVDS0VUX1RSQUZGSUNfSU1TCQkJCS0gSW5ncmVzcyBNb25pdG9yIFNvdXJjZQogKgkJQlVDS0VUX1RSQUZGSUNfUE9MSUNZX01JUlJPUgktIFBvbGljeSBNaXJyb3IKICoJCUJVQ0tFVF9UUkFGRklDX1BMSUNZX1RSQVAJCS0gUG9saWN5IFRyYXAKICovCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNUICAJMHgwMQojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNUCTB4MDIKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QJCQkweDA0CiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNUCQkJMHgwOAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1VOSUNBU1QJCQkJMHgxMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUJCQkweDIwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfQVJQCQkJCQkweDQwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVENQX0RBVEEJCQkJMHgxMDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19UQ1BfQ1RSTAkJCQkweDIwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1VEUAkJCQkJMHg0MDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19OT05fVENQVURQCQkJMHg4MDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19JTVMJCQkJCTB4MTAwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1BPTElDWV9NSVJST1IJCTB4MjAwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1BMSUNZX1RSQVAJCQkweDQwMDAKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX1BJUkxfQ09VTlRfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGVncmVzcyByYXRlIGxpbWl0IGNvdW50aW5nIG1vZGUuCiAqCiAqICBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIxIC0KICoJCQkJQ291bnQgYWxsIExheWVyIDEgYnl0ZXM6IAogKgkJCQlQcmVhbWJsZSAoOGJ5dGVzKSArIEZyYW1lJ3MgREEgdG8gQ1JDICsgSUZHICgxMmJ5dGVzKQogKiAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMiAtCiAqCQkJCUNvdW50IGFsbCBMYXllciAyIGJ5dGVzOiBGcmFtZSdzIERBIHRvIENSQwogKiAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMyAtCiAqCQkJCUNvdW50IGFsbCBMYXllciAzIGJ5dGVzOiAKICoJCQkJRnJhbWUncyBEQSB0byBDUkMgLSAxOCAtIDQgKGlmIGZyYW1lIGlzIHRhZ2dlZCkKICovCnR5cGVkZWYgZW51bQp7CglHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjEgPSAwLAoJR1RfUElSTF9DT1VOVF9BTExfTEFZRVIyLAoJR1RfUElSTF9DT1VOVF9BTExfTEFZRVIzCn0gR1RfUElSTF9DT1VOVF9NT0RFOwoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUElSTDJfQ09VTlRfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGVncmVzcyByYXRlIGxpbWl0IGNvdW50aW5nIG1vZGUuCiAqCiAqICBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfUElSTDJfQ09VTlRfRlJBTUUgLQogKgkJCQlDb3VudCB0aGUgbnVtYmVyIG9mIGZyYW1lcwogKiAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEgLQogKgkJCQlDb3VudCBhbGwgTGF5ZXIgMSBieXRlczogCiAqCQkJCVByZWFtYmxlICg4Ynl0ZXMpICsgRnJhbWUncyBEQSB0byBDUkMgKyBJRkcgKDEyYnl0ZXMpCiAqICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMiAtCiAqCQkJCUNvdW50IGFsbCBMYXllciAyIGJ5dGVzOiBGcmFtZSdzIERBIHRvIENSQwogKiAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjMgLQogKgkJCQlDb3VudCBhbGwgTGF5ZXIgMyBieXRlczogCiAqCQkJCUZyYW1lJ3MgREEgdG8gQ1JDIC0gMTggLSA0IChpZiBmcmFtZSBpcyB0YWdnZWQpCiAqLwp0eXBlZGVmIGVudW0KewoJR1RfUElSTDJfQ09VTlRfRlJBTUUgPSAwLAoJR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMSwKCUdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjIsCglHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIzCn0gR1RfUElSTDJfQ09VTlRfTU9ERTsKCgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMX1JFU09VUkNFCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgUElSTCBSZXNvdXJjZQogKgogKiAgRmllbGRzOgogKiAgICAgIGFjY291bnRRQ29uZiAgICAtIGFjY291bnQgZGlzY2FyZGVkIGZyYW1lcyBkdWUgdG8gcXVldWUgY29uZ2VzdGlvbgogKiAgICAgIGFjY291bnRGaWx0ZXJlZCAtIGFjY291bnQgZmlsdGVyZWQgZnJhbWVzCiAqCQllYnNMaW1pdEFjdGlvbiAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlIGluY29taW5nIHJhdGUgZXhjZWVkcwogKgkJCQkJCSAgdGhlIGVic0xpbWl0LgogKgkJCQkJCQkJRVNCX0xJTUlUX0FDVElPTl9EUk9QIC0gZHJvcCBwYWNrZXRzCiAqCQkJCQkJCQlFU0JfTElNSVRfQUNUSU9OX0ZDICAgLSBzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQKICoJCWVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICggMCB+IDB4RkZGRkZGKQogKgkJY2JzTGltaXQJCS0gQ29tbWl0dGVkIEJVcnN0IFNpemUgbGltaXQgKGV4cGVjdGVkIHRvIGJlIDJrQnl0ZXMpCiAqCQlia3RSYXRlRmFjdG9yICAgLSBidWNrZXQgcmF0ZSBmYWN0b3IgPSBidWNrZXREZWNyZW1lbnQvdXBkYXRlSW50ZXJ2YWwsCiAqCQkJCQkJICB3aGVyZSB1cGRhdGVJbnRlcnZhbCBpbmRpY2F0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIAogKgkJCQkJCSAgYnVja2V0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCB0b2tlbnMsIG9yIDEvQ0lSLCAKICoJCQkJCQkgIHdoZXJlIENJUiBpcyB0aGUgY29tbWl0dGVkIGluZm9ybWF0aW9uIHJhdGUgaW4ga2Jwcy4KICoJCQkJCQkgIGJ1Y2tldERlY3JlbWVudCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCAKICoJCQkJCQkgIG5lZWQgdG8gYmUgcmVtb3ZlZCBwZXIgZWFjaCBidWNrZXQgZGVjcmVtZW50LgogKgkJYmt0SW5jcmVtZW50ICAgIC0gdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlYWNoIAogKgkJCQkJCSAgYnl0ZSBvZiBwYWNrZXQgaW5mb3JtYXRpb24uCiAqCQlia3RSYXRlVHlwZQkJLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKgkJCQkJCQkJQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICoJCQkJCQkJCUJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICoJCWJrdFR5cGVNYXNrCQktIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4gCiAqCQkJCQkJICBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUsIGFuZAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfQVJQCiAqCQlieXRlVG9iZUNvdW50ZWQJLSBieXRlcyB0byBiZSBjb3VudGVkIGZvciBhY2NvdW50aW5nCiAqCQkJCQkJCQlHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjEsCiAqCQkJCQkJCQlHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjIsIG9yCiAqCQkJCQkJCQlHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjMKICoKICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJCWFjY291bnRRQ29uZjsKCUdUX0JPT0wJCWFjY291bnRGaWx0ZXJlZDsKCUdUX0VTQl9MSU1JVF9BQ1RJT04gZWJzTGltaXRBY3Rpb247CglHVF9VMzIJCWVic0xpbWl0OwoJR1RfVTMyCQljYnNMaW1pdDsKCUdUX1UzMgkJYmt0UmF0ZUZhY3RvcjsKCUdUX1UzMgkJYmt0SW5jcmVtZW50OwoJR1RfQlVDS0VUX1JBVEVfVFlQRQlia3RSYXRlVHlwZTsKCUdUX1UzMgkJYmt0VHlwZU1hc2s7CglHVF9QSVJMX0NPVU5UX01PREUJYnl0ZVRvYmVDb3VudGVkOwp9IEdUX1BJUkxfUkVTT1VSQ0U7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQKICoKICogIERlc2NyaXB0aW9uOiBUaGUgcGFyYW1ldGVycyB0aGF0IGRlY2lkZXMgSW5ncmVzcyBSYXRlIExpbWl0IHZhcnkgZGVwZW5kaW5nIG9uCiAqCQkJCXRoZSBhcHBsaWNhdGlvbi4gU2luY2UgRFNEVCBkcml2ZXIgY2Fubm90IGNvdmVyIGFsbCB0aGUgY2FzZXMsCiAqCQkJCXRoaXMgc3RydWN0dXJlIGlzIHByb3ZpZGVkIGZvciB0aGUgY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKgkJCQlIb3dldmVyLCBpbiBtb3N0IGNhc2VzLCB1c2VyIG1heSBpbmdvcmUgdGhpcyBzdHJ1Y3R1cmUgYnkgc2V0dGluZwogKgkJCQlpc1ZhbGlkIHRvIEdUX0ZBTFNFLiBJZiBJbmdyZXNzIFJhdGUgTGltaXQgaXMgdG9vIG11Y2ggb2ZmIGZyb20KICoJCQkJdGhlIGV4cGVjdGVkIHJhdGUsIHBsZWFzZSBjb250YWN0IEZBRSBhbmQgZ2V0cyB0aGUgY29ycmVjdCBlYnNMaW1pdCwKICoJCQkJY2JzTGltaXQsYmt0SW5jcmVtZW50LCBhbmQgYmt0UmF0ZUZhY3RvciB2YWx1ZSBhbmQgdXNlIHRoaXMgc3RydWN0dXJlIAogKgkJCQl0byBkbyBjdXN0b20gcGFyYW1ldGVyIHNldHRpbmcuCiAqCiAqCQlpc1ZhbGlkICAgICAgICAgLSBJZiBHVF9UUlVFLCB0aGUgcGFyYW1lcnMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIHVzZWQgCiAqCQkJCQkJICB0byBwcm9ncmFtIFBJUkwgUmVzb3VyY2UncyBSYXRlIExpbWl0LiBBbmQgaW5ncmVzc1JhdGUKICoJCQkJCQkgIGluIEdUX1BJUkxfQlVDS0VUX0RBVEEgc3RydWN0dXJlIGFyZSBpZ25vcmVkLgogKgkJCQkJCSAgSWYgR1RfRkFMU0UsIGluZ3Jlc3NSYXRlIGluIEdUX1BJUkxfQlVDS0VUX0RBVEEgc3RydWN0dXJlIAogKgkJCQkJCSAgaXMgdXNlZCBmb3IgUmVzb3VyY2UncyBSYXRlIExpbWl0LgogKgkJZWJzTGltaXQgICAgICAgIC0gRXhjZXNzIEJ1cnN0IFNpemUgbGltaXQgKCAwIH4gMHhGRkZGRkYpCiAqCQljYnNMaW1pdAkJLSBDb21taXR0ZWQgQnVyc3QgU2l6ZSBsaW1pdCAoZXhwZWN0ZWQgdG8gYmUgMmtCeXRlcykKICoJCWJrdEluY3JlbWVudCAgICAtIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBmb3IgZWFjaCAKICoJCQkJCQkgIGJ5dGUgb2YgcGFja2V0IGluZm9ybWF0aW9uLgogKgkJYmt0UmF0ZUZhY3RvciAgIC0gYnVja2V0IHJhdGUgZmFjdG9yID0gYnVja2V0RGVjcmVtZW50L3VwZGF0ZUludGVydmFsLAogKgkJCQkJCSAgd2hlcmUgdXBkYXRlSW50ZXJ2YWwgaW5kaWNhdGVzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSAKICoJCQkJCQkgIGJ1Y2tldCBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdG9rZW5zLCBvciAxL0NJUiwgCiAqCQkJCQkJICB3aGVyZSBDSVIgaXMgdGhlIGNvbW1pdHRlZCBpbmZvcm1hdGlvbiByYXRlIGluIGticHMuCiAqCQkJCQkJICBidWNrZXREZWNyZW1lbnQgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgCiAqCQkJCQkJICBuZWVkIHRvIGJlIHJlbW92ZWQgcGVyIGVhY2ggYnVja2V0IGRlY3JlbWVudC4KKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfQk9PTAkJaXNWYWxpZDsKCUdUX1UzMgkJZWJzTGltaXQ7CglHVF9VMzIJCWNic0xpbWl0OwoJR1RfVTMyCQlia3RJbmNyZW1lbnQ7CglHVF9VMzIJCWJrdFJhdGVGYWN0b3I7Cn0gR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVDsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9CVUNLRVRfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIGZvciBQSVJMIEJ1Y2tldCBwcm9ncmFtaW5nIHRoYXQgaXMgcmVzb3VyY2UgYmFzZWQKICoKICogIEZpZWxkczoKICoJCWluZ3Jlc3NSYXRlICAgCS0gY29tbWl0ZWQgaW5ncmVzcyByYXRlIGluIGticHMuCiAqCQkJCQkJICA2NGticHMgfiAxTWJwcyAgICA6IGluY3JlbWVudHMgb2YgNjRrYnBzLAogKgkJCQkJCSAgMU1icHMgfiAxMDBNYnBzICAgOiBpbmNyZW1lbnRzIG9mIDFNYnBzLCBhbmQKICoJCQkJCQkgIDEwME1icHMgfiAyMDBNYnBzIDogaW5jcmVtZW50cyBvZiAxME1icHMKICoJCQkJCQkgIFRoZXJlZm9yZSwgdGhlIHZhbGlkIHZhbHVlcyBhcmU6CiAqCQkJCQkJCQk2NCwgMTI4LCAxOTIsIDI1NiwgMzIwLCAzODQsLi4uLCA5NjAsCiAqCQkJCQkJCQkxMDAwLCAyMDAwLCAzMDAwLCA0MDAwLCAuLi4sIDEwMDAwMCwKICoJCQkJCQkJCTExMDAwMCwgMTIwMDAwLCAxMzAwMDAsIC4uLiwgMjAwMDAwLgogKgkJY3VzdG9tU2V0dXAgICAJLSBjdXN0b20gaW5ncmVzcyByYXRlIHBhcmFtZXRlciBzZXR1cC4gcGxlYXNlIHJlZmVyIHRvCiAqCQkJCQkJICBHVF9QSVJMX0NVU1RPTV9SQVRFX0xJTUlUIHN0cnVjdHVyZS4KICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKgkJZXNiTGltaXRBY3Rpb24gCS0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBpbmNvbWluZyByYXRlIGV4Y2VlZHMKICoJCQkJCQkgIHRoZSBsaW1pdC4KICoJCQkJCQkJCUVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKgkJCQkJCQkJRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqCQlmY0RlYXNzZXJ0TW9kZQktIHBvcnQgZmxvdyBjb250cm9sIGRlLWFzc2VydGlvbiBtb2RlIHdoZW4gbGltaXRBY3Rpb24gaXMKICoJCQkJCQkgIHNldCB0byBFU0JfTElNSVRfQUNUSU9OX0ZDLgogKgkJCQkJCSAgZmNEZWFzc2VydE1vZGVbMF0gZm9yIHBvcnQgMCwgZmNEZWFzc2VydE1vZGVbMV0gZm9yIAogKgkJCQkJCSAgcG9ydCAxLCBldGMuIElmIHBvcnQgeCBkb2VzIG5vdCBzaGFyZSB0aGUgYnVja2V0LAogKgkJCQkJCSAgZmNEZWFzc2VydE1vZGVbeF0gZGF0YSB3aWxsIGJlIGlnbm9yZWQuCiAqCQkJCQkJCQlHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZIC0KICoJCQkJCQkJCQlEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyAKICoJCQkJCQkJCQliZWNvbWUgZW1wdHkuCiAqCQkJCQkJCQlHVF9QSVJMX0ZDX0RFQVNTRVJUX0NCU19MSU1JVCAtCiAqCQkJCQkJCQkJRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgCiAqCQkJCQkJCQkJZW5vdWdoIHJvb20gYXMgc3BlY2lmaWVkIGJ5IHRoZSBDQlNMaW1pdC4KICoJCWJrdFJhdGVUeXBlCQktIGJ1Y2tldCBpcyBlaXRoZXIgcmF0ZSBiYXNlZCBvciB0cmFmZmljIHR5cGUgYmFzZWQuCiAqCQkJCQkJCQlCVUNLRVRfVFlQRV9SQVRFX0JBU0VELCBvcgogKgkJCQkJCQkJQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRAogKgkJYmt0VHlwZU1hc2sJCS0gdXNlZCBpZiBia3RSYXRlVHlwZSBpcyBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VELiAKICoJCQkJCQkgIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19VTklDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSwgYW5kCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19BUlAKICoJCWJ5dGVUb2JlQ291bnRlZAktIGJ5dGVzIHRvIGJlIGNvdW50ZWQgZm9yIGFjY291bnRpbmcKICoJCQkJCQkJCUdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMSwKICoJCQkJCQkJCUdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMiwgb3IKICoJCQkJCQkJCUdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMwogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCQlpbmdyZXNzUmF0ZTsKCUdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQgY3VzdG9tU2V0dXA7CglHVF9CT09MCQlhY2NvdW50UUNvbmY7CglHVF9CT09MCQlhY2NvdW50RmlsdGVyZWQ7CglHVF9FU0JfTElNSVRfQUNUSU9OIGVic0xpbWl0QWN0aW9uOwoJR1RfUElSTF9GQ19ERUFTU0VSVCBmY0RlYXNzZXJ0TW9kZVtNQVhfU1dJVENIX1BPUlRTXTsKCUdUX0JVQ0tFVF9SQVRFX1RZUEUJYmt0UmF0ZVR5cGU7CglHVF9VMzIJCWJrdFR5cGVNYXNrOwoJR1RfUElSTF9DT1VOVF9NT0RFCWJ5dGVUb2JlQ291bnRlZDsKfSBHVF9QSVJMX0RBVEE7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMMl9SRVNPVVJDRQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIFBJUkwgUmVzb3VyY2UKICoKICogIEZpZWxkczoKICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKiAgICAgIG1nbXROcmxFbiAJCS0gZXhjbHVkZSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gaW5ncmVzcyByYXRlIGxpbWl0aW5nIGNhbGN1bGF0aW9uCiAqICAgICAgc2FOcmxFbiAJCS0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgU0Egb2YgdGhlCiAqCQkJCQkJICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqICAgICAgZGFOcmxFbiAJCS0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgREEgb2YgdGhlCiAqCQkJCQkJICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqCQlzYW1wbGluZ01vZGUJLSBzYW1wbGUgb25lIG91dCBvZiBzbyBtYW55IGZyYW1lcy9ieXRlcyBmb3IgYSBzdHJlYW0gb2YgZnJhbWVzCiAqCQlhY3Rpb25Nb2RlCQktIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICoJCQkJCQkgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiAqCQllYnNMaW1pdEFjdGlvbiAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlIGluY29taW5nIHJhdGUgZXhjZWVkcwogKgkJCQkJCSAgdGhlIGVic0xpbWl0LgogKgkJCQkJCQkJRVNCX0xJTUlUX0FDVElPTl9EUk9QIC0gZHJvcCBwYWNrZXRzCiAqCQkJCQkJCQlFU0JfTElNSVRfQUNUSU9OX0ZDICAgLSBzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQKICoJCWVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICggMCB+IDB4RkZGRkZGKQogKgkJY2JzTGltaXQJCS0gQ29tbWl0dGVkIEJVcnN0IFNpemUgbGltaXQgKGV4cGVjdGVkIHRvIGJlIDJrQnl0ZXMpCiAqCQlia3RSYXRlRmFjdG9yICAgLSBidWNrZXQgcmF0ZSBmYWN0b3IgPSBidWNrZXREZWNyZW1lbnQvdXBkYXRlSW50ZXJ2YWwsCiAqCQkJCQkJICB3aGVyZSB1cGRhdGVJbnRlcnZhbCBpbmRpY2F0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIAogKgkJCQkJCSAgYnVja2V0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCB0b2tlbnMsIG9yIDEvQ0lSLCAKICoJCQkJCQkgIHdoZXJlIENJUiBpcyB0aGUgY29tbWl0dGVkIGluZm9ybWF0aW9uIHJhdGUgaW4ga2Jwcy4KICoJCQkJCQkgIGJ1Y2tldERlY3JlbWVudCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCAKICoJCQkJCQkgIG5lZWQgdG8gYmUgcmVtb3ZlZCBwZXIgZWFjaCBidWNrZXQgZGVjcmVtZW50LgogKgkJYmt0SW5jcmVtZW50ICAgIC0gdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlYWNoIAogKgkJCQkJCSAgYnl0ZSBvZiBwYWNrZXQgaW5mb3JtYXRpb24uCiAqCQlmY0RlYXNzZXJ0TW9kZQktIGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSB3aGVuIGxpbWl0QWN0aW9uIGlzCiAqCQkJCQkJICBzZXQgdG8gRVNCX0xJTUlUX0FDVElPTl9GQy4KICoJCQkJCQkJCUdUX1BJUkxfRkNfREVBU1NFUlRfRU1QVFkgLQogKgkJCQkJCQkJCURlLWFzc2VydCB3aGVuIHRoZSBpbmdyZXNzIHJhdGUgcmVzb3VyY2UgaGFzIAogKgkJCQkJCQkJCWJlY29tZSBlbXB0eS4KICoJCQkJCQkJCUdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICoJCQkJCQkJCQlEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyAKICoJCQkJCQkJCQllbm91Z2ggcm9vbSBhcyBzcGVjaWZpZWQgYnkgdGhlIENCU0xpbWl0LgogKgkJYmt0UmF0ZVR5cGUJCS0gYnVja2V0IGlzIGVpdGhlciByYXRlIGJhc2VkIG9yIHRyYWZmaWMgdHlwZSBiYXNlZC4KICoJCQkJCQkJCUJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQsIG9yCiAqCQkJCQkJCQlCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECiAqICAgICAgcHJpT1JwdCAgICAgICAgIC0gZGV0ZXJtaW5lIHRoZSBpbmNvbWluZyBmcmFtZXMgdGhhdCBnZXQgcmF0ZSBsaW1pdGVkIHVzaW5nCiAqCQkJCQkJICB0aGlzIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZS4KICoJCQkJCQkgIAkJR1RfVFJVRSAtIHR5cGVNYXNrIE9SIHByaU1hc2sKICoJCQkJCQkgIAkJR1RfRkFMU0UgLSB0eXBlTWFzayBBTkQgcHJpTWFzawogKgkJcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqCQkJCQkJICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqCQkJCQkJICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKgkJCQkJCSAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqCQlia3RUeXBlTWFzawkJLSB1c2VkIGlmIGJrdFJhdGVUeXBlIGlzIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQuIAogKgkJCQkJCSAgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19VTktOT1dOX1VOSUNBU1QsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19VTktOT1dOX01VTFRJQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX0JST0FEQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX01VTFRJQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VOSUNBU1QsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19NR01UX0ZSQU1FLAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfQVJQLAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVENQX0RBVEEsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19UQ1BfQ1RSTCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VEUCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX05PTl9UQ1BVRFAsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19JTVMsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19QT0xJQ1lfTUlSUk9SLCBhbmQKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1BMSUNZX1RSQVAKICoJCWJ5dGVUb2JlQ291bnRlZAktIGJ5dGVzIHRvIGJlIGNvdW50ZWQgZm9yIGFjY291bnRpbmcKICoJCQkJCQkJCUdUX1BJUkwyX0NPVU5UX0ZSQU1FLAogKgkJCQkJCQkJR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMSwKICoJCQkJCQkJCUdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjIsIG9yCiAqCQkJCQkJCQlHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIzCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQlhY2NvdW50UUNvbmY7CglHVF9CT09MCQlhY2NvdW50RmlsdGVyZWQ7CglHVF9CT09MCQltZ210TnJsRW47CglHVF9CT09MCQlzYU5ybEVuOwoJR1RfQk9PTAkJZGFOcmxFbjsKCUdUX0JPT0wJCXNhbXBsaW5nTW9kZTsKCUdUX1BJUkxfQUNUSU9OCWFjdGlvbk1vZGU7CglHVF9FU0JfTElNSVRfQUNUSU9OIGVic0xpbWl0QWN0aW9uOwoJR1RfVTMyCQllYnNMaW1pdDsKCUdUX1UzMgkJY2JzTGltaXQ7CglHVF9VMzIJCWJrdFJhdGVGYWN0b3I7CglHVF9VMzIJCWJrdEluY3JlbWVudDsKCUdUX1BJUkxfRkNfREVBU1NFUlQgZmNEZWFzc2VydE1vZGU7CglHVF9CVUNLRVRfUkFURV9UWVBFCWJrdFJhdGVUeXBlOwoJR1RfQk9PTAkJcHJpT1JwdDsKCUdUX1UzMgkJcHJpTWFzazsKCUdUX1UzMgkJYmt0VHlwZU1hc2s7CglHVF9QSVJMMl9DT1VOVF9NT0RFCWJ5dGVUb2JlQ291bnRlZDsKfSBHVF9QSVJMMl9SRVNPVVJDRTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkwyX0JVQ0tFVF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSBzdHJ1Y3R1cmUgZm9yIFBJUkwyIEJ1Y2tldCBwcm9ncmFtaW5nIHRoYXQgaXMgcG9ydCBiYXNlZC4KICoKICogIEZpZWxkczoKICoJCWluZ3Jlc3NSYXRlICAgCS0gY29tbWl0ZWQgaW5ncmVzcyByYXRlIGluIGticHMuCiAqCQkJCQkJICA2NGticHMgfiAxTWJwcyAgICA6IGluY3JlbWVudHMgb2YgNjRrYnBzLAogKgkJCQkJCSAgMU1icHMgfiAxMDBNYnBzICAgOiBpbmNyZW1lbnRzIG9mIDFNYnBzLCBhbmQKICoJCQkJCQkgIDEwME1icHMgfiAyMDBNYnBzIDogaW5jcmVtZW50cyBvZiAxME1icHMKICoJCQkJCQkgIFRoZXJlZm9yZSwgdGhlIHZhbGlkIHZhbHVlcyBhcmU6CiAqCQkJCQkJCQk2NCwgMTI4LCAxOTIsIDI1NiwgMzIwLCAzODQsLi4uLCA5NjAsCiAqCQkJCQkJCQkxMDAwLCAyMDAwLCAzMDAwLCA0MDAwLCAuLi4sIDEwMDAwMCwKICoJCQkJCQkJCTExMDAwMCwgMTIwMDAwLCAxMzAwMDAsIC4uLiwgMjAwMDAwLgogKgkJY3VzdG9tU2V0dXAgICAJLSBjdXN0b20gaW5ncmVzcyByYXRlIHBhcmFtZXRlciBzZXR1cC4gcGxlYXNlIHJlZmVyIHRvCiAqCQkJCQkJICBHVF9QSVJMX0NVU1RPTV9SQVRFX0xJTUlUIHN0cnVjdHVyZS4KICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKiAgICAgIG1nbXROcmxFbiAJCS0gZXhjbHVkZSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gaW5ncmVzcyByYXRlIGxpbWl0aW5nIGNhbGN1bGF0aW9uCiAqICAgICAgc2FOcmxFbiAJCS0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgU0Egb2YgdGhlCiAqCQkJCQkJICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqICAgICAgZGFOcmxFbiAJCS0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgREEgb2YgdGhlCiAqCQkJCQkJICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqCQlzYW1wbGluZ01vZGUJLSBzYW1wbGUgb25lIG91dCBvZiBzbyBtYW55IGZyYW1lcy9ieXRlcyBmb3IgYSBzdHJlYW0gb2YgZnJhbWVzCiAqCQlhY3Rpb25Nb2RlCQktIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICoJCQkJCQkgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiAqCQllYnNMaW1pdEFjdGlvbiAJLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlIGluY29taW5nIHJhdGUgZXhjZWVkcwogKgkJCQkJCSAgdGhlIGxpbWl0LgogKgkJCQkJCQkJRVNCX0xJTUlUX0FDVElPTl9EUk9QIC0gZHJvcCBwYWNrZXRzCiAqCQkJCQkJCQlFU0JfTElNSVRfQUNUSU9OX0ZDICAgLSBzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQKICoJCWZjRGVhc3NlcnRNb2RlCS0gZmxvdyBjb250cm9sIGRlLWFzc2VydGlvbiBtb2RlIHdoZW4gbGltaXRBY3Rpb24gaXMKICoJCQkJCQkgIHNldCB0byBFU0JfTElNSVRfQUNUSU9OX0ZDLgogKgkJCQkJCQkJR1RfUElSTF9GQ19ERUFTU0VSVF9FTVBUWSAtCiAqCQkJCQkJCQkJRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgCiAqCQkJCQkJCQkJYmVjb21lIGVtcHR5LgogKgkJCQkJCQkJR1RfUElSTF9GQ19ERUFTU0VSVF9DQlNfTElNSVQgLQogKgkJCQkJCQkJCURlLWFzc2VydCB3aGVuIHRoZSBpbmdyZXNzIHJhdGUgcmVzb3VyY2UgaGFzIAogKgkJCQkJCQkJCWVub3VnaCByb29tIGFzIHNwZWNpZmllZCBieSB0aGUgQ0JTTGltaXQuCiAqCQlia3RSYXRlVHlwZQkJLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKgkJCQkJCQkJQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICoJCQkJCQkJCUJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICogICAgICBwcmlPUnB0ICAgICAgICAgLSBkZXRlcm1pbmUgdGhlIGluY29taW5nIGZyYW1lcyB0aGF0IGdldCByYXRlIGxpbWl0ZWQgdXNpbmcKICoJCQkJCQkgIHRoaXMgaW5ncmVzcyByYXRlIHJlc291cmNlLgogKgkJCQkJCSAgCQlHVF9UUlVFIC0gdHlwZU1hc2sgT1IgcHJpTWFzawogKgkJCQkJCSAgCQlHVF9GQUxTRSAtIHR5cGVNYXNrIEFORCBwcmlNYXNrCiAqCQlwcmlNYXNrICAgICAgICAgLSBwcmlvcml0eSBiaXQgbWFzayB0aGF0IGVhY2ggYml0IGluZGljYXRlcyBvbmUgb2YgdGhlIGZvdXIKICoJCQkJCQkgIHF1ZXVlIHByaW9yaXRpZXMuIFNldHRpbmcgZWFjaCBvbmUgb2YgdGhlc2UgYml0cyBpbmRpY2F0ZXMKICoJCQkJCQkgIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHJhdGUgcmVzb3VyY2UgaXMgc2xhdGVkIHRvIGFjY291bnQgZm9yCiAqCQkJCQkJICBpbmNvbWluZyBmcmFtZXMgd2l0aCB0aGUgZW5hYmxlZCBiaXRzJyBwcmlvcml0eS4KICoJCWJrdFR5cGVNYXNrCQktIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4gCiAqCQkJCQkJICBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNULAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19BUlAsCiAqCQkJCQkJCQlCVUNLRVRfVFJBRkZJQ19UQ1BfREFUQSwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1RDUF9DVFJMLAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfVURQLAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfTk9OX1RDUFVEUCwKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX0lNUywKICoJCQkJCQkJCUJVQ0tFVF9UUkFGRklDX1BPTElDWV9NSVJST1IsIGFuZAogKgkJCQkJCQkJQlVDS0VUX1RSQUZGSUNfUExJQ1lfVFJBUAogKgkJYnl0ZVRvYmVDb3VudGVkCS0gYnl0ZXMgdG8gYmUgY291bnRlZCBmb3IgYWNjb3VudGluZwogKgkJCQkJCQkJR1RfUElSTDJfQ09VTlRfRlJBTUUsCiAqCQkJCQkJCQlHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIxLAogKgkJCQkJCQkJR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMiwgb3IKICoJCQkJCQkJCUdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjMKICoKICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1UzMgkJaW5ncmVzc1JhdGU7CglHVF9QSVJMX0NVU1RPTV9SQVRFX0xJTUlUIGN1c3RvbVNldHVwOwoJR1RfQk9PTAkJYWNjb3VudFFDb25mOwoJR1RfQk9PTAkJYWNjb3VudEZpbHRlcmVkOwoJR1RfQk9PTAkJbWdtdE5ybEVuOwoJR1RfQk9PTAkJc2FOcmxFbjsKCUdUX0JPT0wJCWRhTnJsRW47CglHVF9CT09MCQlzYW1wbGluZ01vZGU7CglHVF9QSVJMX0FDVElPTglhY3Rpb25Nb2RlOwoJR1RfRVNCX0xJTUlUX0FDVElPTiBlYnNMaW1pdEFjdGlvbjsKCUdUX1BJUkxfRkNfREVBU1NFUlQgZmNEZWFzc2VydE1vZGU7CglHVF9CVUNLRVRfUkFURV9UWVBFCWJrdFJhdGVUeXBlOwoJR1RfQk9PTAkJcHJpT1JwdDsKCUdUX1UzMgkJcHJpTWFzazsKCUdUX1UzMgkJYmt0VHlwZU1hc2s7CglHVF9QSVJMMl9DT1VOVF9NT0RFCWJ5dGVUb2JlQ291bnRlZDsKfSBHVF9QSVJMMl9EQVRBOwoKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkxfQ1VTVE9NX1RTTV9DRkcKICoKICogIERlc2NyaXB0aW9uOiBUaGUgcGFyYW1ldGVycyB0aGF0IGRlY2lkZXMgSW5ncmVzcyBSYXRlIExpbWl0IGZvciBBVkIgZnJhbWVzIHZhcnkgCiAqIAkJCQlkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uLiBTaW5jZSBEU0RUIGRyaXZlciBjYW5ub3QgY292ZXIgYWxsIHRoZSBjYXNlcywKICoJCQkJdGhpcyBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQgZm9yIHRoZSBjdXN0b20gcGFyYW1ldGVyIHNldHRpbmcuCiAqCQkJCUhvd2V2ZXIsIGluIG1vc3QgY2FzZXMsIHVzZXIgbWF5IGluZ29yZSB0aGlzIHN0cnVjdHVyZSBieSBzZXR0aW5nCiAqCQkJCWlzVmFsaWQgdG8gR1RfRkFMU0UuIElmIEluZ3Jlc3MgUmF0ZSBMaW1pdCBpcyB0b28gbXVjaCBvZmYgZnJvbQogKgkJCQl0aGUgZXhwZWN0ZWQgcmF0ZSwgcGxlYXNlIGNvbnRhY3QgRkFFIGFuZCBnZXRzIHRoZSBjb3JyZWN0IGVic0xpbWl0LAogKgkJCQljYnNMaW1pdCwgQ1RTIGludGVydmFsLCBhbmQgYWN0aW9uIG1vZGUgdmFsdWUgYW5kIHVzZSB0aGlzIHN0cnVjdHVyZSAKICoJCQkJdG8gZG8gY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKgogKgkJaXNWYWxpZCAgICAgICAgIC0gSWYgR1RfVFJVRSwgdGhlIHBhcmFtZXJzIGluIHRoaXMgc3RydWN0dXJlIGFyZSB1c2VkIAogKgkJCQkJCSAgdG8gcHJvZ3JhbSBQSVJMIFJlc291cmNlJ3MgUmF0ZSBMaW1pdC4gQW5kIGluZ3Jlc3NSYXRlCiAqCQkJCQkJICBpbiBHVF9QSVJMX1RTTV9EQVRBIHN0cnVjdHVyZSBhcmUgaWdub3JlZC4KICoJCQkJCQkgIElmIEdUX0ZBTFNFLCBpbmdyZXNzUmF0ZSBpbiBHVF9QSVJMX1RTTV9EQVRBIHN0cnVjdHVyZSAKICoJCQkJCQkgIGlzIHVzZWQgZm9yIFJlc291cmNlJ3MgUmF0ZSBMaW1pdC4KICoJCWVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICgwIH4gMHhGRkZGKQogKgkJY2JzTGltaXQJCS0gQ29tbWl0dGVkIEJ1cnN0IFNpemUgbGltaXQgKDAgfiAweEZGRkYpCiAqCQljdHNJbnR2ICAgICAgICAgLSBDbGFzcyBUaW1lIFNsb3QgSW50ZXJ2YWwKICoJCQkJCQkgIDAgLSBpbnRlcnZhbCBpcyA2Mi41dXMKICoJCQkJCQkgIDEgLSBpbnRlcnZhbCBpcyAxMjV1cwogKgkJCQkJCSAgMiAtIGludGVydmFsIGlzIDI1MHVzCiAqCQkJCQkJICAzIC0gaW50ZXJ2YWwgaXMgMTAwMHVzCiAqCQlhY3Rpb25Nb2RlCQktIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICoJCQkJCQkgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqCQkJCQkJCQlQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJCWlzVmFsaWQ7CglHVF9VMzIJCWVic0xpbWl0OwoJR1RfVTMyCQljYnNMaW1pdDsKCUdUX1UzMgkJY3RzSW50djsKCUdUX1BJUkxfQUNUSU9OCQlhY3Rpb25Nb2RlOwp9IEdUX1BJUkxfQ1VTVE9NX1RTTV9DRkc7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMMl9UU01fREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIGZvciBQSVJMMiBUU00gSW5ncmVzcyBSYXRlIExpbWl0LgogKgogKiAgRmllbGRzOgogKgkJZWJzTGltaXQgICAgICAgIC0gRXhjZXNzIEJ1cnN0IFNpemUgbGltaXQgKDAgfiAweEZGRkYpCiAqCQljYnNMaW1pdAkJLSBDb21taXR0ZWQgQnVyc3QgU2l6ZSBsaW1pdCAoMCB+IDB4RkZGRikKICoJCWN0c0ludHYgICAgICAgICAtIENsYXNzIFRpbWUgU2xvdCBJbnRlcnZhbAogKgkJCQkJCSAgMCAtIGludGVydmFsIGlzIDYyLjV1cwogKgkJCQkJCSAgMSAtIGludGVydmFsIGlzIDEyNXVzCiAqCQkJCQkJICAyIC0gaW50ZXJ2YWwgaXMgMjUwdXMKICoJCQkJCQkgIDMgLSBpbnRlcnZhbCBpcyAxMDAwdXMKICoJCWFjdGlvbk1vZGUJCS0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZXJlIGFyZSBub3QgZW5vdWdoIHRva2VucwogKgkJCQkJCSAgdG8gYWNjZXB0IHRoZSBlbnRpcmUgaW5jb21pbmcgZnJhbWUKICoJCQkJCQkJCVBJUkxfQUNUSU9OX0FDQ0VQVCAtIGFjY2VwdCB0aGUgZnJhbWUKICoJCQkJCQkJCVBJUkxfQUNUSU9OX1VTRV9MSU1JVF9BQ1RJT04gLSB1c2UgbGltaXRBY3Rpb24KICogCQltZ210TnJsRW4gCQktIGV4Y2x1ZGUgbWFuYWdlbWVudCBmcmFtZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbgogKgkJcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqCQkJCQkJICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqCQkJCQkJICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKgkJCQkJCSAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQl0c21Nb2RlOwoJR1RfVTMyCQllYnNMaW1pdDsKCUdUX1UzMgkJY2JzTGltaXQ7CglHVF9VMzIJCWN0c0ludHY7CglHVF9QSVJMX0FDVElPTgkJYWN0aW9uTW9kZTsKCUdUX0JPT0wJCW1nbXROcmxFbjsKCUdUX1UzMgkJcHJpTWFzazsKfSBHVF9QSVJMMl9UU01fUkVTT1VSQ0U7CgoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfVFNNX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTDIgVFNNIEluZ3Jlc3MgUmF0ZSBMaW1pdC4KICoKICogIEZpZWxkczoKICoJCXRzbU1vZGUJCQktIGVuYWJsZS9kaXNhYmxlIFRTTSBtb2RlLiAKICoJCQkJCQkgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpZ25vcmVkIGlmIGRpYWJsZQogKgkJaW5ncmVzc1JhdGUgICAJLSBjb21taXRlZCBpbmdyZXNzIHJhdGUgaW4ga2Jwcy4obWluIDY0IGZvciA2NGticHMpCiAqCQljdXN0b21TZXR1cCAgIAktIGN1c3RvbSBpbmdyZXNzIHJhdGUgcGFyYW1ldGVyIHNldHVwLiBwbGVhc2UgcmVmZXIgdG8KICoJCQkJCQkgIEdUX1BJUkxfQ1VTVE9NX1RTTV9DRkcgc3RydWN0dXJlLgogKgkJbWdtdE5ybEVuCQktIGV4Y2x1ZGUgbWFuYWdlbWVudCBmcmFtZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbgogKgkJcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqCQkJCQkJICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqCQkJCQkJICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKgkJCQkJCSAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQl0c21Nb2RlOwoJR1RfVTMyCQlpbmdyZXNzUmF0ZTsKCUdUX1BJUkxfQ1VTVE9NX1RTTV9DRkcgY3VzdG9tU2V0dXA7CglHVF9CT09MCQltZ210TnJsRW47CglHVF9VMzIJCXByaU1hc2s7Cn0gR1RfUElSTDJfVFNNX0RBVEE7CgoKCiNkZWZpbmUgTUFYX1BUUF9DT05TRUNVVElWRV9SRUFECTQKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFRQX09QRVJBVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFRQIChQcmVjaXNlIFRpbWUgUHJvdG9jb2wpIE9wZXJhdGlvbiB0eXBlCiAqCiAqIEZpZWxkczoKICogICAgICBQVFBfV1JJVEVfREFUQSAJCQktIFdyaXRlIGRhdGEgdG8gdGhlIFBUUCByZWdpc3RlcgogKiAgICAgIFBUUF9SRUFEX0RBVEEJCQktIFJlYWQgZGF0YSBmcm9tIFBUUCByZWdpc3RlcgogKiAgICAgIFBUUF9SRUFEX01VTFRJUExFX0RBVEEJLSBSZWFkIG11bHRpcGxlIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9USU1FU1RBTVBfREFUQQktIFJlYWQgdGltZXN0YW1wIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICoJCQkJCXZhbGlkIGJpdCB3aWxsIGJlIHJlc2V0IGFmdGVyIHJlYWQKICovCnR5cGVkZWYgZW51bQp7CglQVFBfV1JJVEVfREFUQSAJCQk9IDB4MywKCVBUUF9SRUFEX0RBVEEgIAkJCT0gMHg0LAoJUFRQX1JFQURfTVVMVElQTEVfREFUQQk9IDB4NiwKCVBUUF9SRUFEX1RJTUVTVEFNUF9EQVRBCT0gMHg4LAp9IEdUX1BUUF9PUEVSQVRJT047CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QVFBfU1BFQwogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFRQIChQcmVjaXNlIFRpbWUgUHJvdG9jb2wpIFNQRUMgdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX0lFRUVfMTU4OCAJCS0gSUVFRSAxNTg4CiAqICAgICAgUFRQX0lFRUVfODAyXzFBUwktIElFRUUgODAyLjFhcwogKi8KdHlwZWRlZiBlbnVtCnsKCVBUUF9JRUVFXzE1ODgJCT0gMHgwLAoJUFRQX0lFRUVfODAyXzFBUwk9IDB4MQp9IEdUX1BUUF9TUEVDOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX09QX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHJlcXVpcmVkIGJ5IFBUUCBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICBwdHBQb3J0CQktIHBoeXNpY2FsIHBvcnQgb2YgdGhlIGRldmljZQogKiAgICAgIHB0cEFkZHIgCS0gcmVnaXN0ZXIgYWRkcmVzcwogKiAgICAgIHB0cERhdGEgCS0gZGF0YSBmb3IgcHRwIHJlZ2lzdGVyLgogKiAgICAgIHB0cE11bHRpRGF0YS0gdXNlZCBmb3IgbXVsdGlwbGUgcmVhZCBvcGVyYXRpb24uCiAqICAgICAgbkRhdGEgCQktIG51bWJlciBvZiBkYXRhIHRvIGJlIHJlYWQgb24gbXVsdGlwbGUgcmVhZCBvcGVyYXRpb24uCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMzIJcHRwUG9ydDsKCUdUX1UzMglwdHBCbG9jazsKCUdUX1UzMglwdHBBZGRyOwoJR1RfVTMyCXB0cERhdGE7CglHVF9VMzIJcHRwTXVsdGlEYXRhW01BWF9QVFBfQ09OU0VDVVRJVkVfUkVBRF07CglHVF9VMzIJbkRhdGE7Cn0gR1RfUFRQX09QX0RBVEE7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfQ09ORklHCiAqCiAqICBEZXNjcmlwdGlvbjogUFRQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogKgogKiAgRmllbGRzOgogKiAgICAgIHB0cEVUeXBlCS0gUFRQIEV0aGVyIFR5cGUKICogICAgICBtc2dJZFRTRW4gCS0gTWVzc2FnZSBJRHMgdGhhdCBuZWVkcyB0aW1lIHN0YW1wCiAqICAgICAgdHNBcnJQdHIgCS0gVGltZSBzdGFtcCBhcnJpdmFsIHRpbWUgY291bnRlciBwb2ludGVyIChlaXRoZXIgQXJyMFRpbWUgb3IgQXJyMVRpbWUpCiAqICAgICAgcHRwQXJySW50RW4JLSBQVFAgcG9ydCBhcnJpdmFsIGludGVycnVwdCBlbmFibGUKICogICAgICBwdHBEZXBJbnRFbgktIFBUUCBwb3J0IGRlcGFydHVyZSBpbnRlcnJ1cHQgZW5hYmxlCiAqICAgICAgdHJhbnNTcGVjCS0gVGhpcyBpcyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdmFyaW91cyB0aW1pbmcgcHJvdG9jb2xzLgogKiAgICAgIG1zZ0lkU3RhcnRCaXQgCS0gTWVzc2FnZSBJRCBzdGFydGluZyBiaXQgaW4gdGhlIFBUUCBjb21tb24gaGVhZGVyCiAqICAgICAgZGlzVFNPdmVyd3JpdGUgCS0gZGlzYWJsZSB0aW1lIHN0YW1wIGNvdW50ZXIgb3ZlcndyaXRpbmcgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcKICoJCQkJCQkgIHRpbWVyIHZhbGlkIGJpdCBpcyBjbGVhcmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCXB0cEVUeXBlOwoJR1RfVTMyCW1zZ0lkVFNFbjsKCUdUX1UzMgl0c0FyclB0cjsKCUdUX1UzMglwdHBBcnJJbnRFbjsKCUdUX1UzMglwdHBEZXBJbnRFbjsKCUdUX1BUUF9TUEVDCXRyYW5zU3BlYzsKCUdUX1UzMgltc2dJZFN0YXJ0Qml0OwoJR1RfQk9PTAlkaXNUU092ZXJ3cml0ZTsKfSBHVF9QVFBfQ09ORklHOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX0dMT0JBTF9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBQVFAgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogKgogKiAgRmllbGRzOgogKiAgICAgIHB0cEVUeXBlCS0gUFRQIEV0aGVyIFR5cGUKICogICAgICBtc2dJZFRTRW4gCS0gTWVzc2FnZSBJRHMgdGhhdCBuZWVkcyB0aW1lIHN0YW1wCiAqICAgICAgdHNBcnJQdHIgCS0gVGltZSBzdGFtcCBhcnJpdmFsIHRpbWUgY291bnRlciBwb2ludGVyIChlaXRoZXIgQXJyMFRpbWUgb3IgQXJyMVRpbWUpCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMzIJcHRwRVR5cGU7CglHVF9VMzIJbXNnSWRUU0VuOwoJR1RfVTMyCXRzQXJyUHRyOwp9IEdUX1BUUF9HTE9CQUxfQ09ORklHOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX1BPUlRfQ09ORklHCiAqCiAqICBEZXNjcmlwdGlvbjogUFRQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgZWFjaCBwb3J0CiAqCiAqICBGaWVsZHM6CiAqICAgICAgdHJhbnNTcGVjCS0gVGhpcyBpcyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdmFyaW91cyB0aW1pbmcgcHJvdG9jb2xzLgogKiAgICAgIGRpc1RTcGVjIAktIERpc2FibGUgVHJhbnNwb3J0IHNwZWNpZmljIGNoZWNrCiAqICAgICAgZXRKdW1wIAkJLSBvZmZzZXQgdG8gRXRoZXIgdHlwZSBzdGFydCBhZGRyZXNzIGluIGJ5dGVzCiAqICAgICAgaXBKdW1wIAkJLSBvZmZzZXQgdG8gSVAgaGVhZGVyIHN0YXJ0IGFkZHJlc3MgY291bnRpbmcgZnJvbSBFdGhlciB0eXBlIG9mZnNldAogKiAgICAgIHB0cEFyckludEVuCS0gUFRQIHBvcnQgYXJyaXZhbCBpbnRlcnJ1cHQgZW5hYmxlCiAqICAgICAgcHRwRGVwSW50RW4JLSBQVFAgcG9ydCBkZXBhcnR1cmUgaW50ZXJydXB0IGVuYWJsZQogKiAgICAgIGRpc1RTT3ZlcndyaXRlIAktIGRpc2FibGUgdGltZSBzdGFtcCBjb3VudGVyIG92ZXJ3cml0aW5nIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nCiAqCQkJCQkJICB0aW1lciB2YWxpZCBiaXQgaXMgY2xlYXJlZC4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1BUUF9TUEVDCXRyYW5zU3BlYzsKCUdUX0JPT0wJZGlzVFNwZWM7CglHVF9VMzIJZXRKdW1wOwoJR1RfVTMyCWlwSnVtcDsKCUdUX0JPT0wJcHRwQXJySW50RW47CglHVF9CT09MCXB0cERlcEludEVuOwoJR1RfQk9PTAlkaXNUU092ZXJ3cml0ZTsKfSBHVF9QVFBfUE9SVF9DT05GSUc7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QVFBfVElNRQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFRQIFRpbWUgdG8gYmUgcmVhZAogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX1dSSVRFX0RBVEEgCQkJLSBXcml0ZSBkYXRhIHRvIHRoZSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9EQVRBCQkJLSBSZWFkIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9NVUxUSVBMRV9EQVRBCS0gUmVhZCBtdWx0aXBsZSBkYXRhIGZyb20gUFRQIHJlZ2lzdGVyCiAqLwp0eXBlZGVmIGVudW0KewoJUFRQX0FSUjBfVElNRSA9IDB4MCwKCVBUUF9BUlIxX1RJTUUgPSAweDEsCglQVFBfREVQX1RJTUUgPSAweDIKfSBHVF9QVFBfVElNRTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9JTlRfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgUG9ydCBpbnRlcnJ1cHQgc3RhdHVzIGZvciB0aW1lIHN0YW1wCiAqCiAqIEZpZWxkczoKICogICAgICBQVFBfSU5UX05PUk1BTAkJLSBObyBlcnJvciBjb25kaXRpb24gb2NjdXJyZWQKICogICAgICBQVFBfSU5UX09WRVJXUklURSAJLSBQVFAgbG9naWMgaGFzIHRvIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBQVFAgZnJhbWUKICoJCQkJCQkgIAkJdGhhdCBuZWVkcyB0aW1lIHN0YW1waW5nIGJlZm9yZSB0aGUgY3VycmVudCByZWFkLgogKgkJCQkJCQkJT25seSB0aGUgbGF0ZXN0IG9uZSBpcyBzYXZlZC4KICogICAgICBQVFBfSU5UX0RST1AJICAJLSBQVFAgbG9naWMgaGFzIHRvIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBQVFAgZnJhbWUKICoJCQkJCQkgIAkJdGhhdCBuZWVkcyB0aW1lIHN0YW1waW5nIGJlZm9yZSB0aGUgY3VycmVudCByZWFkLgogKgkJCQkJCQkJT25seSB0aGUgb2xkZXN0IG9uZSBpcyBzYXZlZC4KICoKICovCnR5cGVkZWYgZW51bQp7CglQVFBfSU5UX05PUk1BTCAJCT0gMHgwLAoJUFRQX0lOVF9PVkVSV1JJVEUgCT0gMHgxLAoJUFRQX0lOVF9EUk9QIAkJPSAweDIKfSBHVF9QVFBfSU5UX1NUQVRVUzsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BUUF9UU19TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBQVFAgcG9ydCBzdGF0dXMgb2YgdGltZSBzdGFtcAogKgogKiAgRmllbGRzOgogKiAgICAgIGlzVmFsaWQJCS0gdGltZSBzdGFtcCBpcyB2YWxpZAogKiAgICAgIHN0YXR1cwkJLSB0aW1lIHN0YW1wIGVycm9yIHN0YXR1cwogKiAgICAgIHRpbWVTdGFtcGVkCS0gdGltZSBzdGFtcCB2YWx1ZSBvZiBhIFBUUCBmcmFtZSB0aGF0IG5lZWRzIHRvIGJlIHRpbWUgc3RhbXBlZAogKiAgICAgIHB0cFNlcUlkCS0gc2VxdWVuY2UgSUQgb2YgdGhlIGZyYW1lIHdob3NlIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gaGFzIGJlZW4gY2FwdHVyZWQKICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJaXNWYWxpZDsKCUdUX1UzMgl0aW1lU3RhbXBlZDsKCUdUX1UzMglwdHBTZXFJZDsKCUdUX1BUUF9JTlRfU1RBVFVTCXN0YXR1czsKfSBHVF9QVFBfVFNfU1RBVFVTOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX1BPUlRfRElTQ0FSRF9TVEFUUwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBwb3J0IGRpc2NhcmQgc3RhdGlzdGljcy4gVGhlIGNvdW50ZXIgKDQgYml0IHdpZGUpIHdyYXBzIGFyb3VuZCBhZnRlciAxNS4gCiAqCiAqICBGaWVsZHM6CiAqICAgICAgdHNEZXBEaXNDdHIJLSBQVFAgZGVwYXJ0dXJlIGZyYW1lIGRpc2NhcmQgY291bnRlciBmb3IgUFRQIGZyYW1lcyB0aGF0IG5lZWQgdGltZSBzdGFtcGluZy4KICogICAgICBudHNEZXBEaXNDdHIJLSBQVFAgZGVwYXJ0dXJlIGZyYW1lIGRpc2NhcmQgY291bnRlciBmb3IgUFRQIGZyYW1lcyB0aGF0IGRvIG5vdCBuZWVkIHRpbWUgc3RhbXBpbmcuCiAqICAgICAgdHNBcnJEaXNDdHIJLSBQVFAgYXJyaXZhbCBmcmFtZSBkaXNjYXJkIGNvdW50ZXIgZm9yIFBUUCBmcmFtZXMgdGhhdCBuZWVkIHRpbWUgc3RhbXBpbmcuCiAqICAgICAgbnRzQXJyRGlzQ3RyCS0gUFRQIGFycml2YWwgZnJhbWUgZGlzY2FyZCBjb3VudGVyIGZvciBQVFAgZnJhbWVzIHRoYXQgZG8gbm90IG5lZWQgdGltZSBzdGFtcGluZy4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1UzMgl0c0RlcERpc0N0cjsKCUdUX1UzMgludHNEZXBEaXNDdHI7CglHVF9VMzIJdHNBcnJEaXNDdHI7CglHVF9VMzIJbnRzQXJyRGlzQ3RyOwp9IEdUX1BUUF9QT1JUX0RJU0NBUkRfU1RBVFM7CgoKI2lmZGVmIENPTkZJR19BVkJfRlBHQQoKdHlwZWRlZiBlbnVtCnsKCVBUUF9DTE9DS19TUkNfQURfREVWSUNFID0gMCwJLyogUFRQIENsb2NrIHNvdXJjZSBpcyBmcm9tIEEvRCBkZXZpY2UgKi8KCVBUUF9DTE9DS19TUkNfRlBHQQkJCQkvKiBQVFAgQ2xvY2sgc291cmNlIGlzIGZyb20gQ2VzaXVtIEZQR0EgKi8KfSBHVF9QVFBfQ0xPQ0tfU1JDOwoKdHlwZWRlZiBlbnVtCnsKCVBUUF9QOV9NT0RFX0dNSUkgPSAwLCAJLyogUG9ydCA5IHVzZXMgR01JSSBjb25uZWN0IHRvIDg4RTExMTEgKi8KCVBUUF9QOV9NT0RFX01JSSwJCS8qIFBvcnQgOSB1c2VzIE1JSSBjb25uZWN0IHRvIDg4RTExMTEgKi8KCVBUUF9QOV9NT0RFX01JSV9DT05ORUNUT1IsCQkvKiBQb3J0IDkgY29ubmVjdCB0byBNSUkgY29ubmVjdG9yICovCglQVFBfUDlfTU9ERV9KVU1QRVIJCS8qIFVzZSBKdW1wZXIgc2V0dXAgKi8KfSBHVF9QVFBfUDlfTU9ERTsKCnR5cGVkZWYgZW51bQp7CglHVF9QVFBfU0lHTl9ORUdBVElWRSA9IDAsCS8qIGFwcGx5IE1pbnVzIHNpZ24gdG8gdGhlIER1dHkgQ3ljbGUgKi8KCUdUX1BUUF9TSUdOX1BMVVMJCQkvKiBhcHBseSBQbHVzIHNpZ24gdG8gdGhlIER1dHkgQ3ljbGUgKi8KfSBHVF9QVFBfU0lHTjsKCnR5cGVkZWYgc3RydWN0CnsKCUdUX1BUUF9TSUdOCWFkalNpZ247CS8qIGRldGVybWluZSB0aGUgcGx1cy9taW51cyBzaWduIG9mIHRoZSBkdXR5IGN5Y2xlIGFkaiAqLwoJR1RfVTMyCWN5Y2xlU3RlcDsJCS8qIG51bWJlciBvZiBzdGVwcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgaW4gYWRqdXN0aW5nIHRoZSBkdXR5IGN5Y2xlIGhpZ2ggdGltZSAKCQkJCQkJCQlvZiB0aGUgOEtIeiBjbG9jayBjeWNsZS4gCgkJCQkJCQkJdmFsaWQgdmFsdWVzIGFyZSAwIH4gNyAqLwoJR1RfVTMyCWN5Y2xlSW50ZXJ2YWw7CS8qIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgY2xvY2sgY3ljbGVzIGZvciB3aGljaCBhIGR1dHkgY3ljbGUgYWRqIHdpbGwgb2NjdXIgKi8KCUdUX1UzMgljeWNsZUFkanVzdDsJLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgOEtIeiBjbG9jayBjeWNsZXMgZm9yIHdoaWNoIGR1dHkgY3ljbGUgYWRqIHdpbGwgb2NjdXIKCQkJCQkJCQl3aXRoaW4gZWFjaCBQVFAgY2xvY2sgY2x5Y2xlIGludGVydmFsLgoJCQkJCQkJCU5vdGUgdGhhdCAoY3ljbGVBZGp1c3QgPD0gY3ljbGVJbnRlcnZhbCkgZm9yIHByb3BlciBvcGVyYXRpb24gKi8KfSBHVF9QVFBfQ0xPQ0tfQURKVVNUTUVOVDsKCiNlbmRpZgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9UQUlfRVZFTlRfQ09ORklHCiAqCiAqICBEZXNjcmlwdGlvbjogVEFJIGV2ZW50IGNhcHR1cmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgZXZlbnRPdmVyd3JpdGUJLSBldmVudCBjYXB0dXJlIG92ZXJ3cml0ZQogKiAgICAgIGV2ZW50Q3RyU3RhcnQJIAktIGV2ZW50IGNvdW50ZXIgc3RhcnQKICogICAgICBpbnRFbiAJCQktIGV2ZW50IGNhcHR1cmUgaW50ZXJydXB0IGVuYWJsZQogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfQk9PTAlldmVudE92ZXJ3cml0ZTsKCUdUX0JPT0wJZXZlbnRDdHJTdGFydDsKCUdUX0JPT0wJaW50RW47Cn0gR1RfVEFJX0VWRU5UX0NPTkZJRzsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1RBSV9FVkVOVF9TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBUQUkgZXZlbnQgY2FwdHVyZSBzdGF0dXMKICoKICogIEZpZWxkczoKICogICAgICBpc1ZhbGlkCQktIGV2ZW50VGltZSBpcyB2YWxpZAogKiAgICAgIGV2ZW50VGltZSAJLSBQVFAgZ2xvYmFsIHRpbWUgd2hlbiBldmVudCBpcyByZWdpc3RlcmVkLgogKiAgICAgIGV2ZW50Q3RyCS0gZXZlbnQgY2FwdHVyZSBjb3VudGVyLiBpbmNyZWFtZW50ZWQgb25seSBpZiBldmVudEN0clN0YXJ0IGlzIHNldC4KICogICAgICBldmVudEVycgktIGlzVmFsaWQgaXMgYWxyZWFkeSBzZXQgd2hlbiBhIG5ldyBldmVudCBpcyBvYnNlcnZlZC4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJaXNWYWxpZDsKCUdUX1UzMglldmVudFRpbWU7CglHVF9VMzIJZXZlbnRDdHI7CglHVF9CT09MCWV2ZW50RXJyOwp9IEdUX1RBSV9FVkVOVF9TVEFUVVM7CgoKdHlwZWRlZiBlbnVtCnsKCUdUX1RBSV9UUklHX1BFUklPRElDX1BVUlNFID0gMCwJLyogZ2VuZXJhdGUgcGVyaW9kaWMgcHVyc2UgKi8KCUdUX1RBSV9UUklHX09OX0dJVkVOX1RJTUUJCS8qIGdlbmVyYXRlIHB1cnNlIHdoZW4gCgkJCQkJCQkJCVBUUCBnbG9iYWwgdGltZSBtYXRjaGVzIHdpdGggZ2l2ZW4gdGltZSAqLwp9IEdUX1RBSV9UUklHX01PREU7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9UQUlfVFJJR0dFUl9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBUQUkgdHJpZ2dlciBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaW50RW4gCQktIHRyaWdnZXIgZ2VuZXJhdG9yIGludGVycnVwdCBlbmFibGUKICogICAgICBtb2RlCQktIHRyaWdnZXIgbW9kZSwgZWl0aGVyIEdUX1RBSV9UUklHX1BFUklPRElDX1BVUlNFIG9yIAogKgkJCQkJICBHVF9UQUlfVFJJR19PTl9HSVZFTl9USU1FCiAqICAgICAgdHJpZ0dlbkFtdCAJLSBpZiBtb2RlIGlzIEdUX1RBSV9UUklHX1BFUklPRElDX1BVUlNFLAogKgkJCQkJICB0aGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBjbG9jayBwZXJpb2QgaW4gVFNDbGtQZXIgaW5jcmVtZW50cwogKgkJCQkJICBJZiBtb2RlIGlzIEdUX1RBSV9UUklHX09OX0dJVkVOX1RJTUUsCiAqCQkJCQkgIHRoaXMgdmFsdWUgaXMgdXNlZCB0byBjb21wYXJlIHdpdGggUFRQIGdsb2JhbCB0aW1lLgogKiAgICAgIHB1bHNlV2lkdGgJCS0gcHVsc2Ugd2lkdGggaW4gdW5pdHMgb2YgVFNDbGtQZXIuCiAqCQkJCQkgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDEgfiAweEYuIElmIGl0J3MgMCwgbm8gY2hhbmdlcyBtYWRlLgogKgkJCQkJICB0aGlzIHZhbHVlIGlzIHZhbGlkIG9ubHkgaW4gR1RfVEFJX1RSSUdfT05fR0lWRU5fVElNRSBtb2RlLgogKiAgICAgIHRyaWdDbGtDb21wCS0gdHJpZ2dlciBtb2RlIGNsb2NrIGNvbXBlbnNhdGlvbiBhbW91bnQgaW4gcGljbyBzZWMuCiAqCQkJCQkgIHRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSBpbiBHVF9UQUlfVFJJR19QRVJJT0RJQ19QVVJTRSBtb2RlLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfQk9PTAlpbnRFbjsKCUdUX1RBSV9UUklHX01PREUgCW1vZGU7CglHVF9VMzIJdHJpZ0dlbkFtdDsKCUdUX1UzMglwdWxzZVdpZHRoOwoJR1RfVTMyCXRyaWdDbGtDb21wOwp9IEdUX1RBSV9UUklHR0VSX0NPTkZJRzsKCgp0eXBlZGVmIGVudW0KewoJR1RfQVZCX0hJX0ZQUkksCQkvKiBBVkIgSGkgRnJhbWUgUHJpb3JpdHkgKi8KCUdUX0FWQl9ISV9RUFJJLAkJLyogQVZCIEhpIFF1ZXVlIFByaW9yaXR5ICovCglHVF9BVkJfTE9fRlBSSSwJCS8qIEFWQiBMbyBGcmFtZSBQcmlvcml0eSAqLwoJR1RfQVZCX0xPX1FQUkksCQkvKiBBVkIgTG8gUXVldWUgUHJpb3JpdHkgKi8KCUdUX0xFR0FDWV9ISV9GUFJJLAkvKiBMZWdhY3kgSGkgRnJhbWUgUHJpb3JpdHkgKi8KCUdUX0xFR0FDWV9ISV9RUFJJLAkvKiBMZWdhY3kgSGkgUXVldWUgUHJpb3JpdHkgKi8KCUdUX0xFR0FDWV9MT19GUFJJLAkvKiBMZWdhY3kgTG8gRnJhbWUgUHJpb3JpdHkgKi8KCUdUX0xFR0FDWV9MT19RUFJJCS8qIExlZ2FjeSBMbyBRdWV1ZSBQcmlvcml0eSAqLwp9IEdUX0FWQl9QUklfVFlQRTsKCgp0eXBlZGVmIGVudW0KewoJR1RfQVZCX0xFR0FDWV9NT0RFLAkJCS8qIGFsbCBmcmFtZXMgZW50ZXJpbmcgdGhlIHBvcnQgYXJlIGNvbnNpZGVyZWQgCgkJCQkJCQkJCWxlZ2FjeSAqLwoJR1RfQVZCX1NUQU5EQVJEX0FWQl9NT0RFLAkvKiBhbnkgdGFnZ2VkIGZyYW1lIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEFWQiBmcmFtZSAKCQkJCQkJCQkJcHJpb3JpdHkgaXMgY29uc2lkZXJlZCBBVkIgKi8KCUdUX0FWQl9FTkhBTkNFRF9BVkJfTU9ERSwJLyogYW55IGZyYW1lIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEFWQiBmcmFtZSBwcmlvcml0eSAKCQkJCQkJCQkJd2hvc2UgREEgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbiBBVkIgRW50cnkgCgkJCQkJCQkJCXN0YXRlIGlzIGNvbnNpZGVyZWQgQVZCICovCglHVF9BVkJfU0VDVVJFX0FWQl9NT0RFCQkvKiBhbnkgZnJhbWUgdGhhdCBlbmRzIHVwIHdpdGggYW4gQVZCIGZyYW1lIHByaW9yaXR5IAoJCQkJCQkJCQl3aG9zZSBEQSBpcyBjb250YWluZWQgaW4gdGhlIEFUVSB3aXRoIGFuIEFWQiAKCQkJCQkJCQkJZW50cnkgc3RhdGUgYW5kIHdob3NlIERQViBoYXMgdGhpcyBzb3VyY2UgcG9ydCdzIAoJCQkJCQkJCQliaXQgc2V0IHRvIGEgb25lIGlzIGNvbnNpZGVyZWQgQVZCLiAqLwp9IEdUX0FWQl9NT0RFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfQVZCX0ZSQU1FX1BPTElDWQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgcG9saWN5IG9mIHRoZSBmcmFtZQogKgogKiBGaWVsZHM6CiAqICAgICAgQVZCX0ZSQU1FX1BPTElDWV9OT05FIC0gTm9ybWFsIGZyYW1lIHN3aXRjaGluZwogKiAgICAgIEFWQl9GUkFNRV9QT0xJQ1lfTUlSUk9SIC0gTWlycm9yKGNvcHkpIGZyYW1lIHRvIHRoZSBNaXJyb3JEZXN0IHBvcnQKICogICAgICBBVkJfRlJBTUVfUE9MSUNZX1RSQVAgLSBUcmFwKHJlLWRpcmVjdCkgZnJhbWUgdG8gdGhlIENQVURlc3QgcG9ydAogKgogKi8KdHlwZWRlZiBlbnVtCnsKCUFWQl9GUkFNRV9QT0xJQ1lfTk9ORSA9IDAsCglBVkJfRlJBTUVfUE9MSUNZX01JUlJPUiwKCUFWQl9GUkFNRV9QT0xJQ1lfVFJBUAp9IEdUX0FWQl9GUkFNRV9QT0xJQ1k7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9BVkJfRlJBTUVfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogCiAqCQlEZWZpbmVzIHRoZSBBVkIgZnJhbWUgdHlwZS4KICoJCUFWQiBIaSBGcmFtZSBpcyBvbmUgdGhhdCBEQSBvZiB0aGUgZnJhbWUgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbiAKICoJCUVudHJ5IFN0YXRlIHRoYXQgaW5kaWNhdGVzIEFWQiB3aXRoIHByaW9yaXR5IG92ZXJyaWRlIHdoZXJlIHRoZSBvdmVycmlkZGVuIAogKgkJcHJpb3JpdHkgZXF1YWxzIHRoZSBIaSBBVkIgZnJhbWUgcHJpb3JpdHkocmVmZXIgdG8gZ2F2YkdldFByaW9yaXR5IEFQSSkgYW5kIAogKgkJd2hlbiB0aGUgcG9ydCdzIERBIEF2Yk92ZXJyaWRlIGlzIGVuYWJsZWQuCiAqCQlBVkIgTG8gRnJhbWUgaXMgb25lIHRoYXQgREEgb2YgdGhlIGZyYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgQVRVIHdpdGggYW4gCiAqCQlFbnRyeSBTdGF0ZSB0aGF0IGluZGljYXRlcyBBVkIgd2l0aCBwcmlvcml0eSBvdmVycmlkZSB3aGVyZSB0aGUgb3ZlcnJpZGRlbiAKICoJCXByaW9yaXR5IGVxdWFscyB0aGUgTG8gQVZCIGZyYW1lIHByaW9yaXR5KHJlZmVyIHRvIGdhdmJHZXRQcmlvcml0eSBBUEkpIGFuZCAKICoJCXdoZW4gdGhlIHBvcnQncyBEQSBBdmJPdmVycmlkZSBpcyBlbmFibGVkLgogKgogKiBGaWVsZHM6CiAqICAgICAgQVZCX0hJX0ZSQU1FCS0gQVZCIEhpIEZyYW1lCiAqICAgICAgQVZCX0xPX0ZSQU1FCS0gQVZCIExvIEZyYW1lCiAqLwp0eXBlZGVmIGVudW0KewoJQVZCX0hJX0ZSQU1FLAoJQVZCX0xPX0ZSQU1FCn0gR1RfQVZCX0ZSQU1FX1RZUEU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9FVkVOVF9UWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIGhhcmR3YXJlIGRyaXZlbiBldmVudHMuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9BVkJfSU5UICAgIC0gQVZCIEludGVycnVwdCBFbmFibGUKICogICBHVF9ERVZJQ0VfSU5UIC0gRGV2aWNlIEludGVycnVwdCAoR1RfREVWSUNFX0lOVF9UWVBFKSBFbmFibGUKICogICBHVF9TVEFUU19ET05FIC0gU3RhdGlzdGljcyBPcGVyYXRpb24gRG9uZSBpbnRlcnJydXB0IEVuYWJsZSAKICogICBHVF9WVFVfUFJPQiAtIFZMQU4gUHJvYmxlbS9WaW9sYXRpb24gSW50ZXJydXB0IEVuYWJsZQogKiAgIEdUX1ZUVV9ET05FIC0gVkFMTiBUYWJsZSBPcGVyYXRpb24gRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCiAqICAgR1RfQVRVX1BST0IgLSBBVFUgUHJvYmxlbS9WaW9sYXRpb24gSW50ZXJydXB0IEVuYWJsZSwgZm9yIEdpZ2FiaXQgU3dpdGNoCiAqICAgR1RfQVRVX0ZVTEwgLSBBVFUgZnVsbCBpbnRlcnJ1cHQgZW5hYmxlLCBmb3IgRmFzdCBFdGhlcm5ldCBTd2l0Y2gKICogICBHVF9BVFVfRE9ORSAtIEFUVSBEb25lIGludGVycnVwdCBlbmFibGUuCiAqICAgR1RfUEhZX0lOVCAgLSBQSFkgaW50ZXJydXB0IGVuYWJsZSwgZm9yIEZhc3QgRXRoZXJuZXQgU3dpdGNoCiAqICAgR1RfRUVfSU5UICAgLSBFRVBST00gRG9uZSBpbnRlcnJ1cHQgZW5hYmxlLgogKi8KI2RlZmluZSBHVF9BVkJfSU5UICAgICAgICAgICAJMHgxMDAKI2RlZmluZSBHVF9ERVZJQ0VfSU5UICAgICAgICAgICAweDgwCiNkZWZpbmUgR1RfU1RBVFNfRE9ORSAgICAgICAgICAgMHg0MAojZGVmaW5lIEdUX1ZUVV9QUk9CICAgICAgICAgICAgIDB4MjAKI2RlZmluZSBHVF9WVFVfRE9ORSAgICAgICAgICAgICAweDEwCiNkZWZpbmUgR1RfQVRVX1BST0IgCQkweDgKI2RlZmluZSBHVF9BVFVfRlVMTCAJCTB4OAojZGVmaW5lIEdUX0FUVV9ET05FCQkweDQKI2RlZmluZSBHVF9QSFlfSU5URVJSVVBUCTB4MgkJLyogRGV2aWNlIG1heSBub3Qgc3VwcG9ydCBQSFkgSW50LiBQbGVhc2UgcmVmZXIgdG8gZGF0YXNoZWV0LiAqLwojZGVmaW5lIEdUX0VFX0lOVEVSUlVQVAkJMHgxCgojZGVmaW5lIEdUX0lOVF9NQVNLCQkJXAoJCShHVF9BVkJfSU5UIHwgR1RfREVWSUNFX0lOVCB8IEdUX1NUQVRTX0RPTkUgfCBHVF9WVFVfUFJPQiB8IEdUX1ZUVV9ET05FIHwgR1RfQVRVX0ZVTEwgfCAJXAoJCUdUX0FUVV9ET05FIHwgR1RfUEhZX0lOVEVSUlVQVCB8IEdUX0VFX0lOVEVSUlVQVCkKI2RlZmluZSBHVF9OT19JTlRFUk5BTF9QSFlfSU5UX01BU0sJCVwKCQkoR1RfQVZCX0lOVCB8IEdUX0RFVklDRV9JTlQgfCBHVF9TVEFUU19ET05FIHwgR1RfVlRVX1BST0IgfCBHVF9WVFVfRE9ORSB8IEdUX0FUVV9QUk9CIHwgCVwKCQlHVF9BVFVfRE9ORSB8IEdUX0VFX0lOVEVSUlVQVCkKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0RFVl9FVkVOVAogKgogKiAgRGVzY3JpcHRpb246IERldmljZSBpbnRlcnJ1cHQgc3RhdHVzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgZXZlbnQgICAgIC0gRGV2aWNlIEludGVycnVwdHMgdG8gYmUgZW5hYmxlZAogKgkJCQkJR1RfREVWX0lOVF9XQVRDSERPRywgR1RfREVWX0lOVF9KQU1MSU1JVCwKICoJCQkJCUdUX0RFVl9JTlRfRFVQTEVYX01JU01BVENILCBhbmQvb3IgR1RfREVWX0lOVF9TRVJERVNfTElOSwogKiAgICAgIHBvcnRMaXN0ICAtIFNFUkRFUyBwb3J0IGxpc3Qgd2hlcmUgR1RfREVWX0lOVF9TRVJERVNfTElOSyBpbnRlcnJ1cHQgbmVlZHMKICoJCQkJCXRvIGJlIGFzc2VydGVkLiBJdCdzIGluIHZlY3RvciBmb3JtYXQsIEJpdCAxMCBpcyBmb3IgcG9ydCAxMCwgCiAqCQkJCQlCaXQgOSBpcyBmb3IgcG9ydCA5LCBldGMuCiAqCQkJCQl2YWxpZCBvbmx5IGlmIEdUX0RFVl9JTlRfU0VSREVTX0xJTksgYml0IGlzIHNldC4KICogICAgICBwaHlMaXN0ICAgLSBQaHkgbGlzdCB3aGVyZSBHVF9ERVZfSU5UX1BIWSBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgYXNzZXJ0ZWQuCiAqCQkJCQlJdCdzIGluIHZlY3RvciBmb3JtYXQsIEJpdCAwIGlzIGZvciBwb3J0IDAsIAogKgkJCQkJQml0IDEgaXMgZm9yIHBvcnQgMSwgZXRjLgogKgkJCQkJdmFsaWQgb25seSBpZiBHVF9ERVZfSU5UX1BIWSBiaXQgaXMgc2V0LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCQlldmVudDsKCUdUX1UzMgkJcG9ydExpc3Q7CglHVF9VMzIJCXBoeUxpc3Q7Cn0gR1RfREVWX0VWRU5UOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfREVWX0lOVF9TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBEZXZpY2UgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGludENhdXNlICAtIERldmljZSBJbnRlcnJ1cHQgQ2F1c2UKICoJCQkJCUdUX0RFVl9JTlRfV0FUQ0hET0csIEdUX0RFVl9JTlRfSkFNTElNSVQsCiAqCQkJCQlHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCwgYW5kL29yIEdUX0RFVl9JTlRfU0VSREVTX0xJTksKICoJCXBvcnQJICAtIGxvZ2ljYWwgcG9ydCB3aGVyZSBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCBvY2N1cnJlZC4KICoJCQkJCXZhbGlkIG9ubHkgaWYgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0ggaXMgc2V0LgogKiAgICAgIGxpbmtJbnQgICAtIFNFUkRFUyBwb3J0IGxpc3Qgd2hlcmUgR1RfREVWX0lOVF9TRVJERVNfTElOSyBpbnRlcnJ1cHQgaXMKICoJCQkJCWFzc2VydGVkLiBJdCdzIGluIHZlY3RvciBmb3JtYXQsIEJpdCAxMCBpcyBmb3IgcG9ydCAxMCwgCiAqCQkJCQlCaXQgOSBpcyBmb3IgcG9ydCA5LCBldGMuCiAqCQkJCQl2YWxpZCBvbmx5IGlmIEdUX0RFVl9JTlRfU0VSREVTX0xJTksgYml0IGlzIHNldC4KICoJCQkJCVRoZXNlIGJpdHMgYXJlIG9ubHkgdmFsaWQgb2YgdGhlIHBvcnQgdGhhdCBpcyBpbiAxMDAwQmFzZS1YIG1vZGUuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMzIJCWRldkludENhdXNlOwoJR1RfTFBPUlQJcG9ydDsKCUdUX1UzMgkJbGlua0ludDsKCUdUX1UzMgkJcGh5SW50Owp9IEdUX0RFVl9JTlRfU1RBVFVTOwoKCi8qCiogR1RfREVWSUNFX0lOVAoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIERldmljZSBpbnRlcnJ1cHQKKglHVF9ERVZfSU5UX1dBVENIRE9HCQktIFdhdGNoRG9nIGV2ZW50IGludGVycnVwdCAoV2F0Y2hEb2cgZXZlbnQgY2FuIGJlCioJCQkJCQkJICBjb25maWd1cmVkIHdpdGggZ3dkU2V0RXZlbnQgQVBJKQoqCUdUX0RFVl9JTlRfSkFNTElNSVQJCS0gYW55IG9mIHRoZSBwb3J0cyBkZXRlY3QgYW4gSW5ncmVzcyBKYW0gTGltaXQgdmlvbGF0aW9uCioJCQkJCQkJICAoZ3BydFNldFBhdXNlTGltaXRJbiBBUEkpCioJR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0gJLSBhbnkgb2YgdGhlIHBvcnRzIGRldGVjdCBhIGR1cGxleCBtaXNtYXRjaCAKKgkJCQkJCQkgIChpLmUuLCB0aGUgbG9jYWwgcG9ydCBpcyBpbiBoYWxmIGR1cGxleCBtb2RlIHdoaWxlIAoqCQkJCQkJCSAgdGhlIGxpbmsgcGFydG5lciBpcyBpbiBmdWxsIGR1cGxleCBtb2RlKQoqCUdUX0RFVl9JTlRfU0VSREVTX0xJTksJLSBTRVJERVMgbGluayBjaGFnZSBpbnRlcnJ1cHQuCioJCQkJCQkJICBBbiBpbnRlcnJ1cHQgb2NjdXJzIHdoZW4gYSBTRVJERVMgcG9ydCBjaGFuZ2VzIGxpbmsgCioJCQkJCQkJICBzdGF0dXMgKGxpbmsgdXAgb3IgbGluayBkb3duKQoqLwoKI2RlZmluZSBHVF9ERVZfSU5UX1dBVENIRE9HCQkJMHg4CiNkZWZpbmUgR1RfREVWX0lOVF9KQU1MSU1JVAkJCTB4NAojZGVmaW5lIEdUX0RFVl9JTlRfRFVQTEVYX01JU01BVENICTB4MgojZGVmaW5lIEdUX0RFVl9JTlRfU0VSREVTX0xJTksJCTB4MQojZGVmaW5lIEdUX0RFVl9JTlRfUEhZCQkJCTB4MTAKCi8qCiogR1RfV0FUQ0hET0dfRVZFTlQKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBXYXRjaERvZyBldmVudAoqCQlHVF9XRF9RQyAgLSBRdWV1ZSBDb250cm9sbGVyIFdhdGNoIERvZyBlbmFibGUuCioJCQkJCVdoZW4gZW5hYmxlZCwgdGhlIFFDJ3Mgd2F0Y2ggZG9nIGNpcmN1aXQgY2hlY2tzIGZvciBsaW5rCioJCQkJCWxpc3QgZXJyb3JzIGFuZCBhbnkgZXJyb3JzIGZvdW5kIGluIHRoZSBRQy4KKgkJR1RfV0RfRUdSRVNTIC0gRWdyZXNzIFdhdGNoIERvZyBlbmFibGUuCioJCQkJCVdoZW4gZW5hYmxlZCwgZWFjaCBwb3J0J3MgZWdyZXNzIGNpcmN1aXQgY2hlY2tzIGZvciBwcm9ibGVtcwoqCQkJCQliZXR3ZWVuIHRoZSBwb3J0IGFuZCB0aGUgUXVldWUgQ29udHJvbGxlci4KKgkJR1RfV0RfRk9SQ0UgLSBGb3JjZSBhIFdhdGNoIERvZyBldmVudC4KKi8KCiNkZWZpbmUgR1RfV0RfUUMJCTB4MQojZGVmaW5lIEdUX1dEX0VHUkVTUwkweDIKI2RlZmluZSBHVF9XRF9GT1JDRQkJMHg0CgoKLyoKKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfV0RfRVZFTlRfSElTVE9SWQoqCiogRGVzY3JpcHRpb246IFdhdGNoRG9nIEV2ZW50IEhpc3RvcnkgKGNsZWFyZWQgb25seSBieSBhIGhhcmR3YXJlIHJlc2V0KQoqCQl3ZEV2ZW50ICAgLSBXaGVuIGl0J3Mgc2V0IHRvIEdUX1RSVUUsIHNvbWUgZW5hYmxlZCBXYXRjaCBEb2cgZXZlbnQgb2NjdXJyZWQuCioJCQkJCVRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBwb3NzaWJsZToKKgkJCQkJCVFDIFdhdGNoRG9nIEV2ZW50IChHVF9XRF9RQykKKgkJCQkJCUVncmVzcyBXYXRjaERvZyBFdmVudCAoR1RfV0RfRUdSRVNTKQoqCQkJCQkJRm9yY2VkIFdhdGNoRG9nIEV2ZW50IChHVF9XRF9GT1JDRSkKKgkJZWdyZXNzRXZlbnQtSWYgYW55IHBvcnQncyBlZ3Jlc3MgbG9naWMgZGV0ZWN0cyBhbiBlZ3Jlc3Mgd2F0Y2ggZG9nIGlzc3VlLAoqCQkJCQl0aGlzIGZpZWxkIGlzIHNldCB0byBHVF9UUlVFLCByZWdhcmRsZXNzIG9mIHRoZSBlbmFibGluZyBHVF9XRF9FR1JFU1MKKgkJCQkJZXZlbnQuCiovCnR5cGVkZWYgc3RydWN0CnsKCUdUX0JPT0wJd2RFdmVudDsKCUdUX0JPT0wgZWdyZXNzRXZlbnQ7Cn0gR1RfV0RfRVZFTlRfSElTVE9SWTsKCgovKgoqIHR5cGVkZWY6IGVudW0gR1RfUEhZX0lOVAoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIFBIWSBpbnRlcnJ1cHQKKi8KCiNkZWZpbmUgR1RfU1BFRURfQ0hBTkdFRCAJCTB4NDAwMAojZGVmaW5lIEdUX0RVUExFWF9DSEFOR0VECQkweDIwMDAKI2RlZmluZSBHVF9QQUdFX1JFQ0VJVkVECQkweDEwMDAKI2RlZmluZSBHVF9BVVRPX05FR19DT01QTEVURUQJMHg4MDAKI2RlZmluZSBHVF9MSU5LX1NUQVRVU19DSEFOR0VECTB4NDAwCiNkZWZpbmUgR1RfU1lNQk9MX0VSUk9SCQkJMHgyMDAKI2RlZmluZSBHVF9GQUxTRV9DQVJSSUVSCQkweDEwMAojZGVmaW5lIEdUX0ZJRk9fRkxPVwkJCTB4ODAKI2RlZmluZSBHVF9DUk9TU09WRVJfQ0hBTkdFRAkweDQwCiNkZWZpbmUgR1RfUE9MQVJJVFlfQ0hBTkdFRAkJMHgyCiNkZWZpbmUgR1RfSkFCQkVSCQkJCTB4MQoKI2RlZmluZSBHVF9BVVRPX05FR19FUlJPUgkJMHg4MDAwCiNkZWZpbmUgR1RfRE9XTlNISUZUX0RFVEVDVAkJMHgyMAojZGVmaW5lIEdUX0VORVJHWV9ERVRFQ1QJCTB4MTAKCi8qCiogdHlwZWRlZjogZW51bSBHVF9QSFlfQVVUT19NT0RFCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQXV0b25lZ290aWF0aW9uIG1vZGUuCioJQXV0byBmb3IgYm90aCBzcGVlZCBhbmQgZHVwbGV4LgoqCUF1dG8gZm9yIHNwZWVkIG9ubHkgYW5kIEZ1bGwgZHVwbGV4LgoqCUF1dG8gZm9yIHNwZWVkIG9ubHkgYW5kIEhhbGYgZHVwbGV4LiAoMTAwME1icHMgaXMgbm90IHN1cHBvcnRlZCkKKglBdXRvIGZvciBkdXBsZXggb25seSBhbmQgc3BlZWQgMTAwME1icHMuCioJQXV0byBmb3IgZHVwbGV4IG9ubHkgYW5kIHNwZWVkIDEwME1icHMuCioJQXV0byBmb3IgZHVwbGV4IG9ubHkgYW5kIHNwZWVkIDEwTWJwcy4KKgkxMDAwTWJwcyBGdWxsIGR1cGxleC4KKgkxMDBNYnBzIEZ1bGwgZHVwbGV4LgoqCTEwME1icHMgSGFsZiBkdXBsZXguCioJMTBNYnBzIEZ1bGwgZHVwbGV4LgoqCTEwTWJwcyBIYWxmIGR1cGxleC4KKi8KCnR5cGVkZWYgZW51bQp7CglTUEVFRF9BVVRPX0RVUExFWF9BVVRPLAoJU1BFRURfMTAwMF9EVVBMRVhfQVVUTywKCVNQRUVEXzEwMF9EVVBMRVhfQVVUTywKCVNQRUVEXzEwX0RVUExFWF9BVVRPLAoJU1BFRURfQVVUT19EVVBMRVhfRlVMTCwKCVNQRUVEX0FVVE9fRFVQTEVYX0hBTEYsCglTUEVFRF8xMDAwX0RVUExFWF9GVUxMLAoJU1BFRURfMTAwMF9EVVBMRVhfSEFMRiwKCVNQRUVEXzEwMF9EVVBMRVhfRlVMTCwKCVNQRUVEXzEwMF9EVVBMRVhfSEFMRiwKCVNQRUVEXzEwX0RVUExFWF9GVUxMLAoJU1BFRURfMTBfRFVQTEVYX0hBTEYKfUdUX1BIWV9BVVRPX01PREU7CgoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX1BIWV9QQVVTRV9NT0RFCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgUGF1c2UgTW9kZSBpbiB0aGUgUGh5LgoqCiogRW51bWVyYXRpb25zOgoqCUdUX1BIWV9OT19QQVVTRQkJLSBkaXNhYmxlIHBhdXNlCioJR1RfUEhZX1BBVVNFCQktIHN1cHBvcnQgcGF1c2UKKglHVF9QSFlfQVNZTU1FVFJJQ19QQVVTRQktIHN1cHBvcnQgYXN5bW1ldHJpYyBwYXVzZQoqCUdUX1BIWV9CT1RIX1BBVVNFCS0gc3VwcG9ydCBib3RoIHBhdXNlIGFuZCBhc3ltbWV0cmljIHBhdXNlCiovCnR5cGVkZWYgZW51bQp7CglHVF9QSFlfTk9fUEFVU0UgPSAwLAoJR1RfUEhZX1BBVVNFLAoJR1RfUEhZX0FTWU1NRVRSSUNfUEFVU0UsCglHVF9QSFlfQk9USF9QQVVTRQp9IEdUX1BIWV9QQVVTRV9NT0RFOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9QSFlfU1BFRUQKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBQaHkgU3BlZWQKKgoqIEVudW1lcmF0aW9uczoKKglQSFlfU1BFRURfMTBfTUJQUyAgIC0gMTBNYnBzCioJUEhZX1NQRUVEXzEwMF9NQlBTCS0gMTAwTWJwcwoqCVBIWV9TUEVFRF8xMDAwX01CUFMgLSAxMDAwTWJwcwoqLwp0eXBlZGVmIGVudW0KewoJUEhZX1NQRUVEXzEwX01CUFMsCglQSFlfU1BFRURfMTAwX01CUFMsCglQSFlfU1BFRURfMTAwMF9NQlBTCn0gR1RfUEhZX1NQRUVEOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9TRVJERVNfTU9ERQoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIFNlcmRlcyBtb2RlCioKKiBFbnVtZXJhdGlvbnM6CioJUEhZX1NFUkRFU18xMDBGWAkgLSAxMDAgRlgKKglQSFlfU0VSREVTXzEwMDBYCSAtIDEwMDAgWAoqCVBIWV9TRVJERVNfU0dNSUlfUEhZIC0gU0dNSUkgUEhZCioJUEhZX1NFUkRFU19TR01JSV9NQUMgLSBTR01JSSBNQUMKKi8KdHlwZWRlZiBlbnVtCnsKCVBIWV9TRVJERVNfMTAwRlggPSAwLAoJUEhZX1NFUkRFU18xMDAwWCwJCglQSFlfU0VSREVTX1NHTUlJX1BIWSwKCVBIWV9TRVJERVNfU0dNSUlfTUFDCn0gR1RfU0VSREVTX01PREU7CgoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX0VERVRFQ1RfTU9ERQoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIEVuZXJneSBEZXRlY3QgbW9kZQoqCiogRW51bWVyYXRpb25zOgoqCUdUX0VERVRFQ1RfT0ZGCQktIEVuZXJneSBEZXRlY3QgZGlzYWJsZWQKKglHVF9FREVURUNUX1NFTlNFX1BVTFNFCS0gRW5lcmd5IERldGVjdCBlbmFibGVkIHdpdGggc2Vuc2UgYW5kIHB1bHNlCioJR1RfRURFVEVDVF9TRU5TRQktIEVuZXJneSBEZXRlY3QgZW5hYmxlZCBvbmx5IHdpdGggc2Vuc2UKKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0VERVRFQ1RfT0ZGID0gMCwKCUdUX0VERVRFQ1RfU0VOU0VfUFVMU0UsCglHVF9FREVURUNUX1NFTlNFCn0gR1RfRURFVEVDVF9NT0RFOwoKLyoKICogdHlwZWRlZjogZW51bSBHVF9JTkdSRVNTX01PREUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGluZ3Jlc3MgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX1VOTU9ESUZZX0lOR1JFU1MgLSBmcmFtZXMgYXJlIHJlY2VpdmUgdW5tb2RpZmllZC4KICogICBHVF9UUkFJTEVSX0lOR1JFU1MgIC0gYWxsIGZyYW1lcyBhcmUgcmVjZWl2ZWQgd2l0aCB0cmFpbGVyLgogKiAgIEdUX1VOVEFHR0VEX0lOR1JFU1MgIC0gcmVtb3ZlIHRhZyBvbiByZWNlaXZlIChmb3IgZG91YmxlIHRhZ2dpbmcpLgogKiAgIEdUX0NQVVBPUlRfSU5HUkVTUyAtIG5vIHRyYWlsZXIuIHVzZWQgdG8gaWRlbnRpZnkgdGhlIENQVSBwb3J0IGZvciBJR01QL01MRCBTbm9vcGluZwogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1VOTU9ESUZZX0lOR1JFU1MgPSAwLCAgLyogMHgwMCAqLwoJR1RfVFJBSUxFUl9JTkdSRVNTLCAgICAgICAvKiAweDAxICovCglHVF9VTlRBR0dFRF9JTkdSRVNTLCAgICAgIC8qIDB4MTAgKi8KCUdUX0NQVVBPUlRfSU5HUkVTUyAgICAgICAgLyogMHgxMSAqLwp9IEdUX0lOR1JFU1NfTU9ERTsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0VHUkVTU19GTE9PRAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgaW5ncmVzcyBtb2RlLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfQkxPQ0tfRUdSRVNTX1VOS05PV04gLSBkbyBub3QgZWdyZXNzIGZyYW1lIHdpdGggdW5rbm93biBEQQogKiAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX01VTFRJQ0FTVCAtIGRvIG5vdCBlZ3Jlc3MgZnJhbWUgd2l0aCB1bmtub3duIG11bHRpY2FzdCBEQQogKiAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX1VOSUlDQVNUIC0gZG8gbm90IGVncmVzcyBmcmFtZSB3aXRoIHVua25vd24gdW5pY2FzdCBEQQogKiAgIEdUX0JMT0NLX0VHUkVTU19OT05FIC0gZWdyZXNzIGFsbCBmcmFtZXMgd2l0aCB1bmtub3duIERBCiAqLwp0eXBlZGVmIGVudW0KewoJR1RfQkxPQ0tfRUdSRVNTX1VOS05PV04gPSAwLAoJR1RfQkxPQ0tfRUdSRVNTX1VOS05PV05fTVVMVElDQVNULAoJR1RfQkxPQ0tfRUdSRVNTX1VOS05PV05fVU5JQ0FTVCwKCUdUX0JMT0NLX0VHUkVTU19OT05FCn0gR1RfRUdSRVNTX0ZMT09EOwoKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX01DX1JBVEUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBpbmdyZXNzIG1vZGUuCiAqCiAqICBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfTUNfM19QRVJDRU5UX1JMICAgLSBtdWx0aWNhc3QgcmF0ZSBpcyBsaW1pdGVkIHRvIDMgcGVyY2VudC4KICogICAgICBHVF9NQ182X1BFUkNFTlRfUkwgICAtIG11bHRpY2FzdCByYXRlIGlzIGxpbWl0ZWQgdG8gNiBwZXJjZW50LgogKiAgICAgIEdUX01DXzEyX1BFUkNFTlRfUkwgIC0gbXVsdGljYXN0IHJhdGUgaXMgbGltaXRlZCB0byAxMiBwZXJjZW50LgogKiAgICAgIEdUX01DXzEwMF9QRVJDRU5UX1JMIC0gdW5saW1pdGVkIG11bHRpY2FzdCByYXRlLgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX01DXzNfUEVSQ0VOVF9STCA9IDAsCglHVF9NQ182X1BFUkNFTlRfUkwsCglHVF9NQ18xMl9QRVJDRU5UX1JMLAoJR1RfTUNfMTAwX1BFUkNFTlRfUkwsCn0gR1RfTUNfUkFURTsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9JTkdSRVNTX1JBVEVfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGluZ3Jlc3MgcmF0ZSBsaW1pdCBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1JBVEVfUFJJX0JBU0UgICAtIFByaW9yaXR5IGJhc2VkIHJhdGUgbGltaXRpbmcKICoJCUdUX1JBVEVfQlVSU1RfQkFTRSAtIEJ1cnN0IFNpemUgYmFzZWQgcmF0ZSBsaW1pdGluZwogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1JBVEVfUFJJX0JBU0UgPSAwLAoJR1RfUkFURV9CVVJTVF9CQVNFCn0gR1RfSU5HUkVTU19SQVRFX01PREU7CgoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUE9SVF9TQ0hFRF9NT0RFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgcG9ydCBzY2hlZHVsaW5nIG1vZGUKICoKICogIEZpZWxkczoKICoJIAlHVF9QT1JUX1NDSEVEX1dFSUdIVEVEX1JSQiAtIHVzZSA4LDQsMiwxIHdlaWdodGVkIGZhaXIgc2NoZWR1bGluZwogKgkgCUdUX1BPUlRfU0NIRURfU1RSSUNUX1BSSSAtIHVzZSBhIHN0cmljdCBwcmlvcml0eSBzY2hlbWUKICoJIAlHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkzIC0gdXNlIGEgc3RyaWN0IGZvciBwcmlvcml0eSAzIGFuZCB3ZWlnaHRlZCAKICoJCQkJCQkJCQlyb3VuZCByb2JpbiBmb3IgdGhlIHByaW9yaXR5IDIsMSxhbmQgMAogKgkgCUdUX1BPUlRfU0NIRURfU1RSSUNUX1BSSTJfMyAtIHVzZSBhIHN0cmljdCBmb3IgcHJpb3JpdHkgMiwzIGFuZCB3ZWlnaHRlZCAKICoJCQkJCQkJCQlyb3VuZCByb2JpbiBmb3IgdGhlIHByaW9yaXR5IDEsYW5kIDAKICoKICogIENvbW1lbnQ6CiAqLwp0eXBlZGVmIGVudW0KewoJR1RfUE9SVF9TQ0hFRF9XRUlHSFRFRF9SUkIgPSAwLAoJR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJLAoJR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJMywKCUdUX1BPUlRfU0NIRURfU1RSSUNUX1BSSTJfMwp9IEdUX1BPUlRfU0NIRURfTU9ERTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BPUlRfU1RBVAogKgogKiAgRGVzY3JpcHRpb246IHBvcnQgc3RhdGlzdGljIHN0cnVjdC4KICoKICogIEZpZWxkczoKICogICAgICByeEN0ciAgIC0gcG9ydCByZWNlaXZlIGNvdW50ZXIuCiAqICAgICAgdHhDdHIgICAtIHBvcnQgdHJhbnNtaXQgY291bnRlci4KICogICAgICBkcm9wcGVkIC0gZHJvcHBlZCBmcmFtZSBjb3VudGVyLgogKgogKiAgQ29tbWVudDoKICoJCWRyb3BwZWQgZnJhbWUgY291bnRlciBpcyBzdXBwb3J0ZWQgYnkgb25seSBsaW1pdGVkIGRldmljZXMuCiAqCQlBdCB0aGlzIG1vbWVudCwgODhFNjA2MS84OEU2MDY1IGFyZSB0aGUgZGV2aWNlcyBzdXBwb3J0aW5nCiAqCQlkcm9wcGVkIGZyYW1lIGNvdW50ZXIuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMTYgIHJ4Q3RyOwoJR1RfVTE2ICB0eEN0cjsKCUdUX1UxNiAgZHJvcHBlZDsKfSBHVF9QT1JUX1NUQVQ7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BPUlRfU1RBVDIKICoKICogIERlc2NyaXB0aW9uOiBwb3J0IHN0YXRpc3RpYyBzdHJ1Y3QuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaW5EaXNjYXJkTG8gLSBJbkRpc2NhcmRzIExvdyBGcmFtZSBDb3VudGVyCiAqICAgICAgaW5EaXNjYXJkSGkgLSBJbkRpc2NhcmRzIEhpZ2ggRnJhbWUgQ291bnRlcgogKiAgICAgIGluRmlsdGVyZWQgIC0gSW5GaWx0ZXJlZCBGcmFtZSBDb3VudGVyCiAqICAgICAgb3V0RmlsdGVyZWQgLSBPdXRGaWx0ZXJlZCBGcmFtZSBDb3VudGVyCiAqCiAqICBDb21tZW50OgogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTE2ICBpbkRpc2NhcmRMbzsKCUdUX1UxNiAgaW5EaXNjYXJkSGk7CglHVF9VMTYgIGluRmlsdGVyZWQ7CglHVF9VMTYgIG91dEZpbHRlcmVkOwp9IEdUX1BPUlRfU1RBVDI7CgoKLyoKICoqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUE9SVF9RX0NPVU5URVJTCiAqKgogKiogIERlc2NyaXB0aW9uOiBwb3J0IHF1ZXVlIHN0YXRpc3RpYyBzdHJ1Y3QuCiAqKgogKiogIEZpZWxkczoKICoqICAgICAgT3V0UV9TaXplIC0gcG9ydCBlZ3Jlc3MgcXVldWUgc2l6ZSBjb2kKICoqICAgICAgUnN2X1NpemUgIC0gaW5ncmVzcyByZXNlcnZlZCBlIGNvdW50ZXIKICoqCiAqKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTE2ICBPdXRRX1NpemU7CglHVF9VMTYgIFJzdl9TaXplOwp9IEdUX1BPUlRfUV9TVEFUOwoKLyoKICogdHlwZWRlZjogZW51bSBHVF9DVFJfTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgY291bnRlcnMgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0NUUl9BTEwgICAgLSBJbiB0aGlzIG1vZGUgdGhlIGNvdW50ZXJzIGNvdW50cyBSeCByZWNlaXZlIGFuZCB0cmFuc21pdAogKiAgICAgICAgICAgICAgICAgICBmcmFtZXMuCiAqICAgR1RfQ1RSX0VSUk9SUyAtIEluIHRoaXMgbW9kZSB0aGUgY291bnRlcnMgY291bnRzIFJ4IEVycm9ycyBhbmQgY29sbGlzaW9ucy4KICovCnR5cGVkZWYgZW51bQp7CglHVF9DVFJfQUxMID0gMCwKCUdUX0NUUl9FUlJPUlMsCn0gR1RfQ1RSX01PREU7Cgp0eXBlZGVmIHN0cnVjdCBfR1RfUURfREVWIEdUX1FEX0RFVjsKCi8qCiAqIHNlbWFwaG9yZSByZWxhdGVkIGRlZmluaXRpb25zLgogKiBVc2VyIEFwcGxpY2F0aW9ucyBtYXkgcmVnaXN0ZXIgU2VtYXBob3JlIGZ1bmN0aW9ucyB1c2luZyBmb2xsb3dpbmcgZGVmaW5pdGlvbnMKICovCnR5cGVkZWYgZW51bQp7CglHVF9TRU1fRU1QVFksCglHVF9TRU1fRlVMTAp9IEdUX1NFTV9CRUdJTl9TVEFURTsKCnR5cGVkZWYgR1RfU0VNICgqRkdUX1NFTV9DUkVBVEUpKAoJCQkJCQlHVF9TRU1fQkVHSU5fU1RBVEUgc3RhdGUpOwp0eXBlZGVmIEdUX1NUQVRVUyAoKkZHVF9TRU1fREVMRVRFKSgKCQkJCQkJR1RfU0VNIHNlbUlkKTsKdHlwZWRlZiBHVF9TVEFUVVMgKCpGR1RfU0VNX1RBS0UpKAoJCQkJCQlHVF9TRU0gc2VtSWQsIEdUX1UzMiB0aW1PdXQpOwp0eXBlZGVmIEdUX1NUQVRVUyAoKkZHVF9TRU1fR0lWRSkoCgkJCQkJCUdUX1NFTSBzZW1JZCk7Cgp0eXBlZGVmIHN0cnVjdAp7CglGR1RfU0VNX0NSRUFURQlzZW1DcmVhdGU7IAkvKiBjcmVhdGUgc2VtYXBvcmUgKi8KCUZHVF9TRU1fREVMRVRFCXNlbURlbGV0ZTsgCS8qIGRlbGV0ZSB0aGUgc2VtYXBvcmUgKi8KCUZHVF9TRU1fVEFLRQlzZW1UYWtlOwkvKiB0cnkgdG8gZ2V0IGEgc2VtYXBvcmUgKi8KCUZHVF9TRU1fR0lWRQlzZW1HaXZlOwkvKiByZXR1cm4gc2VtYXBob3JlICovCn1HVF9TRU1fUk9VVElORVM7CgovKgogKiBkZWZpbml0aW9ucyBmb3IgcmVnaXN0ZXJpbmcgTUlJIGFjY2VzcyBmdW5jdGlvbnMuCiAqCiovCnR5cGVkZWYgR1RfQk9PTCAoKkZHVF9SRUFEX01JSSkoCgkJCQkJCUdUX1FEX0RFViogICBkZXYsCgkJCQkJCXVuc2lnbmVkIGludCBwaHlBZGRyLCAKCQkJCQkJdW5zaWduZWQgaW50IG1paVJlZywgCgkJCQkJCXVuc2lnbmVkIGludCogdmFsdWUpOwp0eXBlZGVmIEdUX0JPT0wgKCpGR1RfV1JJVEVfTUlJKSgKCQkJCQkJR1RfUURfREVWKiAgIGRldiwKCQkJCQkJdW5zaWduZWQgaW50IHBoeUFkZHIsIAoJCQkJCQl1bnNpZ25lZCBpbnQgbWlpUmVnLCAKCQkJCQkJdW5zaWduZWQgaW50IHZhbHVlKTsKdHlwZWRlZiBHVF9CT09MICgqRkdUX0lOVF9IQU5ETEVSKSgKCQkJCQkJR1RfUURfREVWKiAgIGRldiwKCQkJCQkJR1RfVTE2Kik7Cgp0eXBlZGVmIHN0cnVjdCBfQlNQX0ZVTkNUSU9OUwp7CglGR1RfUkVBRF9NSUkgCXJlYWRNaWk7CS8qIHJlYWQgTUlJIFJlZ2lzdGVycyAqLwoJRkdUX1dSSVRFX01JSSAJd3JpdGVNaWk7CS8qIHdyaXRlIE1JSSBSZWdpc3RlcnMgKi8KCUZHVF9TRU1fQ1JFQVRFCXNlbUNyZWF0ZTsgCS8qIGNyZWF0ZSBzZW1hcG9yZSAqLwoJRkdUX1NFTV9ERUxFVEUJc2VtRGVsZXRlOyAJLyogZGVsZXRlIHRoZSBzZW1hcG9yZSAqLwoJRkdUX1NFTV9UQUtFCXNlbVRha2U7CS8qIHRyeSB0byBnZXQgYSBzZW1hcG9yZSAqLwoJRkdUX1NFTV9HSVZFCXNlbUdpdmU7CS8qIHJldHVybiBzZW1hcGhvcmUgKi8KfUJTUF9GVU5DVElPTlM7CgoKLyoKICoJVHlwZSBkZWZpbml0aW9uIGZvciBNSUIgY291bnRlciBvcGVyYXRpb24KKi8KdHlwZWRlZiBlbnVtIAp7CglTVEFUU19GTFVTSF9BTEwsCQkvKiBGbHVzaCBhbGwgY291bnRlcnMgZm9yIGFsbCBwb3J0cyAqLwoJU1RBVFNfRkxVU0hfUE9SVCwJCS8qIEZsdXNoIGFsbCBjb3VudGVycyBmb3IgYSBwb3J0ICovCglTVEFUU19SRUFEX0NPVU5URVIsCQkvKiBSZWFkIGEgc3BlY2lmaWMgY291bnRlciBmcm9tIGEgcG9ydCAqLwoJU1RBVFNfUkVBRF9SRUFMVElNRV9DT1VOVEVSLAkvKiBSZWFkIGEgcmVhbHRpbWUgY291bnRlciBmcm9tIGEgcG9ydCAqLwoJU1RBVFNfUkVBRF9BTEwJCQkvKiBSZWFkIGFsbCBjb3VudGVycyBmcm9tIGEgcG9ydCAqLwoKfSBHVF9TVEFUU19PUEVSQVRJT047Cgp0eXBlZGVmIHN0cnVjdCBfR1RfU1RBVFNfQ09VTlRFUl9TRVQKewoJR1RfVTMyCUluVW5pY2FzdHM7CglHVF9VMzIJSW5Ccm9hZGNhc3RzOwoJR1RfVTMyCUluUGF1c2U7CglHVF9VMzIJSW5NdWx0aWNhc3RzOwoJR1RfVTMyCUluRkNTRXJyOwoJR1RfVTMyCUFsaWduRXJyOwoJR1RfVTMyCUluR29vZE9jdGV0czsKCUdUX1UzMglJbkJhZE9jdGV0czsKCUdUX1UzMglVbmRlcnNpemU7CglHVF9VMzIJRnJhZ21lbnRzOwoJR1RfVTMyCUluNjRPY3RldHM7CQkvKiA2NCBPY3RldHMgKi8KCUdUX1UzMglJbjEyN09jdGV0czsJLyogNjUgdG8gMTI3IE9jdGV0cyAqLwoJR1RfVTMyCUluMjU1T2N0ZXRzOwkvKiAxMjggdG8gMjU1IE9jdGV0cyAqLwoJR1RfVTMyCUluNTExT2N0ZXRzOwkvKiAyNTYgdG8gNTExIE9jdGV0cyAqLwoJR1RfVTMyCUluMTAyM09jdGV0czsJLyogNTEyIHRvIDEwMjMgT2N0ZXRzICovCglHVF9VMzIJSW5NYXhPY3RldHM7CS8qIDEwMjQgdG8gTWF4IE9jdGV0cyAqLwoJR1RfVTMyCUphYmJlcjsKCUdUX1UzMglPdmVyc2l6ZTsKCUdUX1UzMglJbkRpc2NhcmRzOwoJR1RfVTMyCUZpbHRlcmVkOwoJR1RfVTMyCU91dFVuaWNhc3RzOwoJR1RfVTMyCU91dEJyb2FkY2FzdHM7CglHVF9VMzIJT3V0UGF1c2U7CglHVF9VMzIJT3V0TXVsdGljYXN0czsKCUdUX1UzMglPdXRGQ1NFcnI7CglHVF9VMzIJT3V0R29vZE9jdGV0czsKCUdUX1UzMglPdXQ2NE9jdGV0czsJLyogNjQgT2N0ZXRzICovCglHVF9VMzIJT3V0MTI3T2N0ZXRzOwkvKiA2NSB0byAxMjcgT2N0ZXRzICovCglHVF9VMzIJT3V0MjU1T2N0ZXRzOwkvKiAxMjggdG8gMjU1IE9jdGV0cyAqLwoJR1RfVTMyCU91dDUxMU9jdGV0czsJLyogMjU2IHRvIDUxMSBPY3RldHMgKi8KCUdUX1UzMglPdXQxMDIzT2N0ZXRzOwkvKiA1MTIgdG8gMTAyMyBPY3RldHMgKi8KCUdUX1UzMglPdXRNYXhPY3RldHM7CS8qIDEwMjQgdG8gTWF4IE9jdGV0cyAqLwoJR1RfVTMyCUNvbGxpc2lvbnM7CglHVF9VMzIJTGF0ZTsKCUdUX1UzMglFeGNlc3NpdmU7CglHVF9VMzIJTXVsdGlwbGU7CglHVF9VMzIJU2luZ2xlOwoJR1RfVTMyCURlZmVycmVkOwoJR1RfVTMyCU91dERpc2NhcmRzOwoKfSBHVF9TVEFUU19DT1VOVEVSX1NFVDsKCgp0eXBlZGVmIGVudW0KewoJU1RBVFNfSW5VbmljYXN0cyA9IDAsCglTVEFUU19JbkJyb2FkY2FzdHMsCglTVEFUU19JblBhdXNlLAoJU1RBVFNfSW5NdWx0aWNhc3RzLAoJU1RBVFNfSW5GQ1NFcnIsCglTVEFUU19BbGlnbkVyciwKCVNUQVRTX0luR29vZE9jdGV0cywKCVNUQVRTX0luQmFkT2N0ZXRzLAoJU1RBVFNfVW5kZXJzaXplLAoJU1RBVFNfRnJhZ21lbnRzLAoJU1RBVFNfSW42NE9jdGV0cywKCVNUQVRTX0luMTI3T2N0ZXRzLAoJU1RBVFNfSW4yNTVPY3RldHMsCglTVEFUU19JbjUxMU9jdGV0cywKCVNUQVRTX0luMTAyM09jdGV0cywKCVNUQVRTX0luTWF4T2N0ZXRzLAoJU1RBVFNfSmFiYmVyLAoJU1RBVFNfT3ZlcnNpemUsCglTVEFUU19JbkRpc2NhcmRzLAoJU1RBVFNfRmlsdGVyZWQsCglTVEFUU19PdXRVbmljYXN0cywKCVNUQVRTX091dEJyb2FkY2FzdHMsCglTVEFUU19PdXRQYXVzZSwKCVNUQVRTX091dE11bHRpY2FzdHMsCglTVEFUU19PdXRGQ1NFcnIsCglTVEFUU19PdXRHb29kT2N0ZXRzLAoJU1RBVFNfT3V0NjRPY3RldHMsCglTVEFUU19PdXQxMjdPY3RldHMsCglTVEFUU19PdXQyNTVPY3RldHMsCglTVEFUU19PdXQ1MTFPY3RldHMsCglTVEFUU19PdXQxMDIzT2N0ZXRzLAoJU1RBVFNfT3V0TWF4T2N0ZXRzLAoJU1RBVFNfQ29sbGlzaW9ucywKCVNUQVRTX0xhdGUsCglTVEFUU19FeGNlc3NpdmUsCglTVEFUU19NdWx0aXBsZSwKCVNUQVRTX1NpbmdsZSwKCVNUQVRTX0RlZmVycmVkLAoJU1RBVFNfT3V0RGlzY2FyZHMKCn0gR1RfU1RBVFNfQ09VTlRFUlM7Ci8qCiAqIHR5cGVkZWY6IGVudW0gR1RfSElTVE9HUkFNX01PREUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBoaXN0b2dyYW0gY291bnRlcnMgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0NPVU5UX1JYX09OTFkgLSBJbiB0aGlzIG1vZGUsIFJ4IEhpc3RvZ3JhbSBDb3VudGVycyBhcmUgY291bnRlZC4KICogICBHVF9DT1VOVF9UWF9PTkxZIC0gSW4gdGhpcyBtb2RlLCBUeCBIaXN0b2dyYW0gQ291bnRlcnMgYXJlIGNvdW50ZWQuCiAqICAgR1RfQ09VTlRfUlhfVFggICAtIEluIHRoaXMgbW9kZSwgUnggYW5kIFR4IEhpc3RvZ3JhbSBDb3VudGVycyBhcmUgY291bnRlZC4KICovCnR5cGVkZWYgZW51bQp7CglHVF9DT1VOVF9SWF9PTkxZID0gMCwKCUdUX0NPVU5UX1RYX09OTFksCglHVF9DT1VOVF9SWF9UWAp9IEdUX0hJU1RPR1JBTV9NT0RFOwoKLyoKCUNvdW50ZXIgc2V0IDIgaXMgdXNlZCBieSA4OEU2MTgzCiovCnR5cGVkZWYgc3RydWN0IF9HVF9TVEFUU19DT1VOVEVSX1NFVDIKewoJR1RfVTMyCUluR29vZE9jdGV0c0hpOwoJR1RfVTMyCUluR29vZE9jdGV0c0xvOwoJR1RfVTMyCUluQmFkT2N0ZXRzOwoJR1RfVTMyCU91dERpc2NhcmRzOwoJR1RfVTMyCUluR29vZEZyYW1lczsKCUdUX1UzMglJbkJhZEZyYW1lczsKCUdUX1UzMglJbkJyb2FkY2FzdHM7CglHVF9VMzIJSW5NdWx0aWNhc3RzOwoJLyogCgkJSGlzdG9ncmFtIENvdW50ZXJzIDogUnggT25seSwgVHggT25seSwgb3IgYm90aCBSeCBhbmQgVHggCgkJKHJlZmVyIHRvIEhpc3RvZ3JhbSBNb2RlKSAKCSovCglHVF9VMzIJT2N0ZXRzNjQ7CQkvKiA2NCBPY3RldHMgKi8KCUdUX1UzMglPY3RldHMxMjc7CQkvKiA2NSB0byAxMjcgT2N0ZXRzICovCglHVF9VMzIJT2N0ZXRzMjU1OwkJLyogMTI4IHRvIDI1NSBPY3RldHMgKi8KCUdUX1UzMglPY3RldHM1MTE7CQkvKiAyNTYgdG8gNTExIE9jdGV0cyAqLwoJR1RfVTMyCU9jdGV0czEwMjM7CQkvKiA1MTIgdG8gMTAyMyBPY3RldHMgKi8KCUdUX1UzMglPY3RldHNNYXg7CQkvKiAxMDI0IHRvIE1heCBPY3RldHMgKi8KCUdUX1UzMglPdXRPY3RldHNIaTsKCUdUX1UzMglPdXRPY3RldHNMbzsKCUdUX1UzMglPdXRGcmFtZXM7CglHVF9VMzIJRXhjZXNzaXZlOwoJR1RfVTMyCU91dE11bHRpY2FzdHM7CglHVF9VMzIJT3V0QnJvYWRjYXN0czsKCUdUX1UzMglJbkJhZE1BQ0N0cmw7CgoJR1RfVTMyCU91dFBhdXNlOwoJR1RfVTMyCUluUGF1c2U7CglHVF9VMzIJSW5EaXNjYXJkczsKCUdUX1UzMglVbmRlcnNpemU7CglHVF9VMzIJRnJhZ21lbnRzOwoJR1RfVTMyCU92ZXJzaXplOwoJR1RfVTMyCUphYmJlcjsKCUdUX1UzMglNQUNSY3ZFcnI7CglHVF9VMzIJSW5GQ1NFcnI7CglHVF9VMzIJQ29sbGlzaW9uczsKCUdUX1UzMglMYXRlOwoKfSBHVF9TVEFUU19DT1VOVEVSX1NFVDI7CgoKdHlwZWRlZiBlbnVtCnsKCVNUQVRTMl9Jbkdvb2RPY3RldHNIaSA9IDAsCglTVEFUUzJfSW5Hb29kT2N0ZXRzTG8sCglTVEFUUzJfSW5CYWRPY3RldHMsCgkKCVNUQVRTMl9PdXREaXNjYXJkcywKCVNUQVRTMl9Jbkdvb2RGcmFtZXMsCglTVEFUUzJfSW5CYWRGcmFtZXMsCglTVEFUUzJfSW5Ccm9hZGNhc3RzLAoJU1RBVFMyX0luTXVsdGljYXN0cywKCVNUQVRTMl82NE9jdGV0cywKCVNUQVRTMl8xMjdPY3RldHMsCglTVEFUUzJfMjU1T2N0ZXRzLAoJU1RBVFMyXzUxMU9jdGV0cywKCVNUQVRTMl8xMDIzT2N0ZXRzLAoJU1RBVFMyX01heE9jdGV0cywKCVNUQVRTMl9PdXRPY3RldHNIaSwKCVNUQVRTMl9PdXRPY3RldHNMbywKCVNUQVRTMl9PdXRGcmFtZXMsCglTVEFUUzJfRXhjZXNzaXZlLAoJU1RBVFMyX091dE11bHRpY2FzdHMsCglTVEFUUzJfT3V0QnJvYWRjYXN0cywKCVNUQVRTMl9JbkJhZE1BQ0N0cmwsCglTVEFUUzJfT3V0UGF1c2UsCglTVEFUUzJfSW5QYXVzZSwKCVNUQVRTMl9JbkRpc2NhcmRzLAoJU1RBVFMyX1VuZGVyc2l6ZSwKCVNUQVRTMl9GcmFnbWVudHMsCglTVEFUUzJfT3ZlcnNpemUsCglTVEFUUzJfSmFiYmVyLAoJU1RBVFMyX01BQ1JjdkVyciwKCVNUQVRTMl9JbkZDU0VyciwKCVNUQVRTMl9Db2xsaXNpb25zLAoJU1RBVFMyX0xhdGUKCn0gR1RfU1RBVFNfQ09VTlRFUlMyOwoKLyoKCUNvdW50ZXIgc2V0IDMgaXMgdXNlZCBieSA4OEU2MDkzIGFuZCA4OEU2MDY1CiovCnR5cGVkZWYgc3RydWN0IF9HVF9TVEFUU19DT1VOVEVSX1NFVDMKewoJR1RfVTMyCUluR29vZE9jdGV0c0xvOwkvKiBvZmZzZXQgMCAqLwoJR1RfVTMyCUluR29vZE9jdGV0c0hpOwkvKiBvZmZzZXQgMSwgbm90IHN1cHBvcnRlZCBieSA4OEU2MDY1ICovCglHVF9VMzIJSW5CYWRPY3RldHM7CQkvKiBvZmZzZXQgMiAqLwoJR1RfVTMyCU91dEZDU0VycjsJCQkvKiBvZmZzZXQgMyAqLwoJR1RfVTMyCUluVW5pY2FzdHM7CQkJLyogb2Zmc2V0IDQgKi8KCUdUX1UzMglEZWZlcnJlZDsJCQkvKiBvZmZzZXQgNSAqLwoJR1RfVTMyCUluQnJvYWRjYXN0czsJCS8qIG9mZnNldCA2ICovCglHVF9VMzIJSW5NdWx0aWNhc3RzOwkJLyogb2Zmc2V0IDcgKi8KCS8qIAoJCUhpc3RvZ3JhbSBDb3VudGVycyA6IFJ4IE9ubHksIFR4IE9ubHksIG9yIGJvdGggUnggYW5kIFR4IAoJCShyZWZlciB0byBIaXN0b2dyYW0gTW9kZSkgCgkqLwoJR1RfVTMyCU9jdGV0czY0OwkJLyogNjQgT2N0ZXRzLCBvZmZzZXQgOCAqLwoJR1RfVTMyCU9jdGV0czEyNzsJCS8qIDY1IHRvIDEyNyBPY3RldHMsIG9mZnNldCA5ICovCglHVF9VMzIJT2N0ZXRzMjU1OwkJLyogMTI4IHRvIDI1NSBPY3RldHMsIG9mZnNldCAxMCAqLwoJR1RfVTMyCU9jdGV0czUxMTsJCS8qIDI1NiB0byA1MTEgT2N0ZXRzLCBvZmZzZXQgMTEgKi8KCUdUX1UzMglPY3RldHMxMDIzOwkJLyogNTEyIHRvIDEwMjMgT2N0ZXRzLCBvZmZzZXQgMTIgKi8KCUdUX1UzMglPY3RldHNNYXg7CQkvKiAxMDI0IHRvIE1heCBPY3RldHMsIG9mZnNldCAxMyAqLwoJR1RfVTMyCU91dE9jdGV0c0xvOwkvKiBvZmZzZXQgMTQgKi8KCUdUX1UzMglPdXRPY3RldHNIaTsJLyogb2Zmc2V0IDE1LCBub3Qgc3VwcG9ydGVkIGJ5IDg4RTYwNjUgKi8KCUdUX1UzMglPdXRVbmljYXN0czsJLyogb2Zmc2V0IDE2ICovCglHVF9VMzIJRXhjZXNzaXZlOwkJLyogb2Zmc2V0IDE3ICovCglHVF9VMzIJT3V0TXVsdGljYXN0czsJLyogb2Zmc2V0IDE4ICovCglHVF9VMzIJT3V0QnJvYWRjYXN0czsJLyogb2Zmc2V0IDE5ICovCglHVF9VMzIJU2luZ2xlOwkJCS8qIG9mZnNldCAyMCAqLwoKCUdUX1UzMglPdXRQYXVzZTsJCS8qIG9mZnNldCAyMSAqLwoJR1RfVTMyCUluUGF1c2U7CQkJLyogb2Zmc2V0IDIyICovCglHVF9VMzIJTXVsdGlwbGU7CQkvKiBvZmZzZXQgMjMgKi8KCUdUX1UzMglVbmRlcnNpemU7CQkvKiBvZmZzZXQgMjQgKi8KCUdUX1UzMglGcmFnbWVudHM7CQkvKiBvZmZzZXQgMjUgKi8KCUdUX1UzMglPdmVyc2l6ZTsJCS8qIG9mZnNldCAyNiAqLwoJR1RfVTMyCUphYmJlcjsJCQkvKiBvZmZzZXQgMjcgKi8KCUdUX1UzMglJbk1BQ1JjdkVycjsJLyogb2Zmc2V0IDI4ICovCglHVF9VMzIJSW5GQ1NFcnI7CQkvKiBvZmZzZXQgMjkgKi8KCUdUX1UzMglDb2xsaXNpb25zOwkJLyogb2Zmc2V0IDMwICovCglHVF9VMzIJTGF0ZTsJCQkJLyogb2Zmc2V0IDMxICovCgp9IEdUX1NUQVRTX0NPVU5URVJfU0VUMzsKCgp0eXBlZGVmIGVudW0KewoJU1RBVFMzX0luR29vZE9jdGV0c0xvID0gMCwKCVNUQVRTM19Jbkdvb2RPY3RldHNIaSwKCVNUQVRTM19JbkJhZE9jdGV0cywKCQoJU1RBVFMzX091dEZDU0VyciwKCVNUQVRTM19JblVuaWNhc3RzLAoJU1RBVFMzX0RlZmVycmVkLAkJCS8qIG9mZnNldCA1ICovCglTVEFUUzNfSW5Ccm9hZGNhc3RzLAoJU1RBVFMzX0luTXVsdGljYXN0cywKCVNUQVRTM182NE9jdGV0cywKCVNUQVRTM18xMjdPY3RldHMsCglTVEFUUzNfMjU1T2N0ZXRzLAkJCS8qIG9mZnNldCAxMCAqLwoJU1RBVFMzXzUxMU9jdGV0cywKCVNUQVRTM18xMDIzT2N0ZXRzLAoJU1RBVFMzX01heE9jdGV0cywKCVNUQVRTM19PdXRPY3RldHNMbywKCVNUQVRTM19PdXRPY3RldHNIaSwKCVNUQVRTM19PdXRVbmljYXN0cywJCS8qIG9mZnNldCAxNiAqLwoJU1RBVFMzX0V4Y2Vzc2l2ZSwKCVNUQVRTM19PdXRNdWx0aWNhc3RzLAoJU1RBVFMzX091dEJyb2FkY2FzdHMsCglTVEFUUzNfU2luZ2xlLAoJU1RBVFMzX091dFBhdXNlLAoJU1RBVFMzX0luUGF1c2UsCglTVEFUUzNfTXVsdGlwbGUsCglTVEFUUzNfVW5kZXJzaXplLAkJCS8qIG9mZnNldCAyNCAqLwoJU1RBVFMzX0ZyYWdtZW50cywKCVNUQVRTM19PdmVyc2l6ZSwKCVNUQVRTM19KYWJiZXIsCglTVEFUUzNfSW5NQUNSY3ZFcnIsCglTVEFUUzNfSW5GQ1NFcnIsCglTVEFUUzNfQ29sbGlzaW9ucywKCVNUQVRTM19MYXRlCQkJCQkvKiBvZmZzZXQgMzEgKi8KCn0gR1RfU1RBVFNfQ09VTlRFUlMzOwoKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfMTAwMFRfTUFTVEVSX1NMQVZFCiAqCiAqIERlc2NyaXB0aW9uOiAxMDAwQmFzZS1UIE1hc3Rlci9TbGF2ZSBDb25maWd1cmF0aW9uCiAqCiAqIEZpZWxkczoKICogICAgICBhdXRvQ29uZmlnICAgLSBHVF9UUlVFIGZvciBhdXRvLWNvbmZpZywgR1RfRkFMU0UgZm9yIG1hbnVhbCBzZXR1cC4KICogICAgICBtYXN0ZXJQcmVmZXIgLSBHVF9UUlVFIGlmIE1hc3RlciBjb25maWd1cmF0aW9uIGlzIHByZWZlcnJlZC4KICoKICovCnR5cGVkZWYgc3RydWN0IF9HVF8xMDAwVF9NQVNURVJfU0xBVkUKewoJR1RfQk9PTAlhdXRvQ29uZmlnOwoJR1RfQk9PTCBtYXN0ZXJQcmVmZXI7Cn0gR1RfMTAwMFRfTUFTVEVSX1NMQVZFOwoKCiNkZWZpbmUgR1RfTURJX1BBSVJfTlVNICAgICAJNAkvKiAoMSwyKSwoMyw2KSwoNCw1KSwoNyw4KSAqLwojZGVmaW5lIEdUX0NIQU5ORUxfUEFJUl9OVU0gICAgIDIJLyogKGNoYW5uZWwgQSxCKSwoY2hhbm5lbCBDLEQpICovCgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9QSFlfTElOS19TVEFUVVMKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIExpbmsgU3RhdHVzCiAqCiAqIEVudW1lcmF0aW9uczoKICoJCUdUX1BIWV9MSU5LX09GRgkJLSBObyBMaW5rCiAqCQlHVF9QSFlfTElOS19DT1BQRVIJLSBMaW5rIG9uIENvcHBlcgogKgkJR1RfUEhZX0xJTktfRklCRVIJLSBMaW5rIG9uIEZpYmVyCiAqLwp0eXBlZGVmIGVudW0KewoJR1RfUEhZX0xJTktfT0ZGID0gMCwKCUdUX1BIWV9MSU5LX0NPUFBFUiA9IDEsCglHVF9QSFlfTElOS19GSUJFUiA9IDIKfSBHVF9QSFlfTElOS19TVEFUVVM7CgoKLyogRGVmaW5pdGlvbiBmb3IgcGFja2V0IGdlbmVyYXRvciAqLwoKLyogUGF5bG9hZCAqLwp0eXBlZGVmIGVudW0KewoJR1RfUEdfUEFZTE9BRF9SQU5ET00gPSAwLAkvKiBQc2V1ZG8tcmFuZG9tICovCglHVF9QR19QQVlMT0FEXzVBQTUJCS8qIDVBLEE1LDVBLEE1LC4uLiAqLwp9IEdUX1BHX1BBWUxPQUQ7CgovKiBMZW5ndGggKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1BHX0xFTkdUSF82NCA9IDAsCQkvKiA2NCBieXRlcyAqLwoJR1RfUEdfTEVOR1RIXzE1MTQKfSBHVF9QR19MRU5HVEg7CgovKiBFcnJvciAqLwp0eXBlZGVmIGVudW0KewoJR1RfUEdfVFhfTk9STUFMID0gMCwJCS8qIE5vIEVycm9yICovCglHVF9QR19UWF9FUlJPUgkJCS8qIFR4IHBhY2tldHMgd2l0aCBDUkMgZXJyb3IgYW5kIFN5bWJvbCBlcnJvciAqLwp9IEdUX1BHX1RYOwoKLyogU3RydWN0dXJlIGZvciBwYWNrZXQgZ2VuZXJhdG9yICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1BHX1BBWUxPQUQgIHBheWxvYWQ7CglHVF9QR19MRU5HVEggICBsZW5ndGg7CglHVF9QR19UWCAgICAgICB0eDsKfSBHVF9QRzsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX1RFU1RfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBWQ1QgdGVzdCBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1RFU1RfRkFJTCAgICAtIHZpcnR1YWwgY2FibGUgdGVzdCBmYWlsZWQuCiAqICAgICAgR1RfTk9STUFMX0NBQkxFIC0gbm9ybWFsIGNhYmxlLgogKiAgICAgIEdUX0lNUEVEQU5DRV9NSVNNQVRDSCAtIGltcGVkYW5jZSBtaXNtYXRjaC4KICogICAgICBHVF9PUEVOX0NBQkxFICAgLSBvcGVuIGluIGNhYmxlLgogKiAgICAgIEdUX1NIT1JUX0NBQkxFICAtIHNob3J0IGluIGNhYmxlLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1RFU1RfRkFJTCwKCUdUX05PUk1BTF9DQUJMRSwKCUdUX0lNUEVEQU5DRV9NSVNNQVRDSCwKCUdUX09QRU5fQ0FCTEUsCglHVF9TSE9SVF9DQUJMRSwKfSBHVF9URVNUX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX05PUk1BTF9DQUJMRV9MRU4KICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIGZvciBub3JtYWwgY2FibGUgbGVuZ3RoCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9MRVNTX1RIQU5fNTBNIC0gY2FibGUgbGVuZ3RoIGxlc3MgdGhhbiA1MCBtZXRlci4KICogICAgICBHVF81ME1fODBNICAgICAgIC0gY2FibGUgbGVuZ3RoIGJldHdlZW4gNTAgLSA4MCBtZXRlci4KICogICAgICBHVF84ME1fMTEwTSAgICAgIC0gY2FibGUgbGVuZ3RoIGJldHdlZW4gODAgLSAxMTAgbWV0ZXIuCiAqICAgICAgR1RfMTEwTV8xNDBNICAgICAtIGNhYmxlIGxlbmd0aCBiZXR3ZWVuIDExMCAtIDE0MCBtZXRlci4KICogICAgICBHVF9NT1JFX1RIQU5fMTQwIC0gY2FibGUgbGVuZ3RoIG1vcmUgdGhhbiAxNDAgbWV0ZXIuCiAqICAgICAgR1RfVU5LTk9XTl9MRU4gICAtIHVua25vd24gbGVuZ3RoLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0xFU1NfVEhBTl81ME0sCglHVF81ME1fODBNLAoJR1RfODBNXzExME0sCglHVF8xMTBNXzE0ME0sCglHVF9NT1JFX1RIQU5fMTQwLAoJR1RfVU5LTk9XTl9MRU4sCgp9IEdUX05PUk1BTF9DQUJMRV9MRU47CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9DQUJMRV9MRU4KICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIGNhYmxlIGxlbmd0aAogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgbm9ybUNhYmxlTGVuIC0gY2FibGUgbGVuZ2h0IGZvciBub3JtYWwgY2FibGUuCiAqICAgICAgZXJyQ2FibGVMZW4gIC0gZm9yIGNhYmxlIGZhaWx1cmUgdGhlIGVzdGltYXRlIGZhdWx0IGRpc3RhbmNlIGluIG1ldGVycy4KICoKICovCnR5cGVkZWYgdW5pb24KewoJR1RfTk9STUFMX0NBQkxFX0xFTiBub3JtQ2FibGVMZW47CglHVF9VOCAgICAgICAgICAgICAgIGVyckNhYmxlTGVuOwoKfSBHVF9DQUJMRV9MRU47CgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfQ0FCTEVfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiB2aXJ0dWFsIGNhYmxlIGRpYWdub3N0aWMgc3RhdHVzIHBlciBNREkgcGFpci4KICoKICogRmllbGRzOgogKiAgICAgIGNhYmxlU3RhdHVzIC0gVkNUIGNhYmxlIHN0YXR1cy4KICogICAgICBjYWJsZUxlbiAgICAtIFZDVCBjYWJsZSBsZW5ndGguCiAqCXBoeVR5cGUJICAgIC0gdHlwZSBvZiBwaHkgKDEwME0gcGh5IG9yIEdpZ2FiaXQgcGh5KQogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVEVTVF9TVEFUVVMgIGNhYmxlU3RhdHVzW0dUX01ESV9QQUlSX05VTV07CglHVF9DQUJMRV9MRU4gICAgY2FibGVMZW5bR1RfTURJX1BBSVJfTlVNXTsKCUdUX1UxNgkgICAgcGh5VHlwZTsKCn0gR1RfQ0FCTEVfU1RBVFVTOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQ0FCTEVfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQ2FibGUgVHlwZQogKgogKiBFbnVtZXJhdGlvbnM6CiAqCQlHVF9TVFJBSUdIVF9DQUJMRQlfIHN0cmFpZ2h0IGNhYmxlCiAqICAgICAgR1RfQ1JPU1NPVkVSX0NBQkxFIAktIGNyb3Nzb3ZlciBjYWJsZQogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1NUUkFJR0hUX0NBQkxFLAoJR1RfQ1JPU1NPVkVSX0NBQkxFCgp9IEdUX0NBQkxFX1RZUEU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9SWF9DSEFOTkVMCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBSZWNlaXZlciBDaGFubmVsIEFzc2lnbm1lbnQKICoKICogRW51bWVyYXRpb25zOgogKgkJR1RfQ0hBTk5FTF9BICAgLSBDaGFubmVsIEEKICoJCUdUX0NIQU5ORUxfQiAgIC0gQ2hhbm5lbCBCCiAqCQlHVF9DSEFOTkVMX0MgICAtIENoYW5uZWwgQwogKgkJR1RfQ0hBTk5FTF9EICAgLSBDaGFubmVsIEQKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9DSEFOTkVMX0EsCiAgICBHVF9DSEFOTkVMX0IsCiAgICBHVF9DSEFOTkVMX0MsCiAgICBHVF9DSEFOTkVMX0QKfSBHVF9SWF9DSEFOTkVMOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUE9MQVJJVFlfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBwb2xhcml0eSBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKgkJR1RfUE9TSVRJVkUJLSBwb3NpdGl2ZSBwb2xhcml0eQogKiAgICAgIEdUX05FR0FUSVZFCS0gbmVnYXRpdmUgcG9sYXJpdHkKICovCnR5cGVkZWYgZW51bQp7CglHVF9QT1NJVElWRSwKCUdUX05FR0FUSVZFCgp9IEdUX1BPTEFSSVRZX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfMTAwMEJUX0VYVEVOREVEX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogQ3VycmVudGx5IHRoZSAxMDAwQmFzZS1UIFBDUyBjYW4gZGV0ZXJtaW5lIHRoZSBjYWJsZSBwb2xhcml0eQogKiAJCW9uIHBhaXJzIEEsQixDLEQ7IGNyb3Nzb3ZlciBvbiBwYWlycyBBLEIgYW5kIEMsRDsgYW5kIHNrZXcgYW1vbmcgCiAqCQl0aGUgcGFyZXMuIFRoZXNlIHN0YXR1cyBlbmhhbmNlIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSB2aXJ0dWFsIGNhYmxlIHRlc3RlcgogKgogKiBGaWVsZHM6CiAqICAgICAgaXNWYWxpZAkJLSBHVF9UUlVFIGlmIHRoaXMgc3RydWN0dXJlIGhhdmUgdmFsaWQgaW5mb3JtYXRpb24sIAogKiAJCQkJCSAgR1RfRkFMU0Ugb3RoZXJ3aXNlLgogKgkJCQkJICBJdCBpcyB2YWxpZCBvbmx5IGlmIDEwMDBCQVNFLVQgTGluayBpcyB1cC4KICogICAgICBwYWlyU3dhcCAgICAtIEdUX0NST1NTT1ZFUl9DQUJMRSwgaWYgdGhlIGNhYmxlIGlzIGNyb3Nzb3ZlciwKICoJCQkJCSAgR1RfU1RSQUlHSFRfQ0FCTEUsIG90aGVyd2lzZQogKgkJcGFpclBvbGFyaXR5LSBHVF9QT1NJVElWRSwgaWYgcG9sYXJpdHkgaXMgcG9zaXRpdmUsCiAqCQkJCQkgIEdUX05FR0FUSVZFLCBvdGhlcndpc2UKICoJCXBhaXJTa2V3CS0gcGFpciBza2V3IGluIHVuaXRzIG9mIG5zCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9CT09MCQkJCWlzVmFsaWQ7CglHVF9DQUJMRV9UWVBFCQlwYWlyU3dhcFtHVF9DSEFOTkVMX1BBSVJfTlVNXTsKCUdUX1BPTEFSSVRZX1NUQVRVUwlwYWlyUG9sYXJpdHlbR1RfTURJX1BBSVJfTlVNXTsKCUdUX1UzMgkJCSAgICBwYWlyU2tld1tHVF9NRElfUEFJUl9OVU1dOwoKfSBHVF8xMDAwQlRfRVhURU5ERURfU1RBVFVTOwoKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBHVF9BRFZfRVhURU5ERURfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBDdXJyZW50bHkgdGhlIDEwMDBCYXNlLVQgUENTIGNhbiBkZXRlcm1pbmUgdGhlIGNhYmxlIHBvbGFyaXR5CiAqIAkJb24gcGFpcnMgQSxCLEMsRDsgY3Jvc3NvdmVyIG9uIHBhaXJzIEEsQiBhbmQgQyxEOyBhbmQgc2tldyBhbW9uZyAKICoJCXRoZSBwYXJlcy4gVGhlc2Ugc3RhdHVzIGVuaGFuY2UgdGhlIGNhcGFiaWxpdHkgb2YgdGhlIHZpcnR1YWwgY2FibGUgdGVzdGVyCiAqCiAqIEZpZWxkczoKICogICAgICBpc1ZhbGlkCQktIEdUX1RSVUUgaWYgdGhpcyBzdHJ1Y3R1cmUgaGF2ZSB2YWxpZCBpbmZvcm1hdGlvbiwgCiAqIAkJCQkJICBHVF9GQUxTRSBvdGhlcndpc2UuCiAqCQkJCQkgIEl0IGlzIHZhbGlkIG9ubHkgaWYgMTAwMEJBU0UtVCBMaW5rIGlzIHVwLgogKiAgICAgIHBhaXJTd2FwICAgIC0gUmVjZWl2ZSBjaGFubmVsIGFzc2lnbmVtZW50CiAqCQlwYWlyUG9sYXJpdHktIEdUX1BPU0lUSVZFLCBpZiBwb2xhcml0eSBpcyBwb3NpdGl2ZSwKICoJCQkJCSAgR1RfTkVHQVRJVkUsIG90aGVyd2lzZQogKgkJcGFpclNrZXcJLSBwYWlyIHNrZXcgaW4gdW5pdHMgb2YgbnMKICoJCWNhYmxlTGVuCS0gY2FibGUgbGVuZ3RoIGJhc2VkIG9uIERTUAogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgICAgIGlzVmFsaWQ7CiAgICBHVF9SWF9DSEFOTkVMICAgICAgcGFpclN3YXBbR1RfTURJX1BBSVJfTlVNXTsKICAgIEdUX1BPTEFSSVRZX1NUQVRVUyBwYWlyUG9sYXJpdHlbR1RfTURJX1BBSVJfTlVNXTsKICAgIEdUX1UzMiAgICAgICAgICAgICBwYWlyU2tld1tHVF9NRElfUEFJUl9OVU1dOwoJR1RfVTMyCQkJCWNhYmxlTGVuW0dUX01ESV9QQUlSX05VTV07Cn0gR1RfQURWX0VYVEVOREVEX1NUQVRVUzsKCgovKgogKiBpZiBpc0dpZ1BoeSBpbiBHVF9DQUJMRV9TVEFUVVMgaXMgbm90IEdUX1RSVUUsIGNhYmxlU3RhdHVzIGFuZCBjYWJsZUxlbiAKICogd2lsbCBoYXZlIG9ubHkgMiBwYWlycyBhdmFpbGFibGUuCiAqIE9uZSBpcyBSWCBQYWlyIGFuZCB0aGUgb3RoZXIgaXMgVFggUGFpci4KICovCiNkZWZpbmUgTURJX1JYX1BBSVIJCTAJLyogY2FibGVTdGF0dXNbMF0gb3IgY2FibGVMZW5bMF0gKi8KI2RlZmluZSBNRElfVFhfUEFJUgkJMQkvKiBjYWJsZVN0YXR1c1sxXSBvciBjYWJsZUxlblsxXSAqLwoKLyogZGVmaW5pdGlvbiBmb3IgUGh5IFR5cGUgKi8KI2RlZmluZSBQSFlfMTAwTQkJMCAvKiAxMC8xMDBNIHBoeSwgRTMwODIgb3IgRTMwODMgKi8KI2RlZmluZSBQSFlfMTAwME0JCTEgLyogR2lnYWJpdCBwaHksIHRoZSByZXN0IHBoeXMgKi8KI2RlZmluZSBQSFlfMTAwMDBNCQkyIC8qIDEwIEdpZ2FiaXQgcGh5LCB1bnVzZWQgKi8KI2RlZmluZSBQSFlfMTAwME1fQgkJMyAvKiBHaWdhYml0IHBoeSB3aGljaCBuZWVkcyB3b3JrLWFyb3VuZCAqLwojZGVmaW5lIFBIWV8xMDAwTV9NUAk0IC8qIEdpZ2FiaXQgcGh5IHdpdGggbXVsdGlwbGUgcGFnZSBtb2RlICovCgoKLyogRGVmaW5pdGlvbiBmb3IgQWR2YW5jZSBWaXJ0dWFsIENhYmxlIFRlc3QgKi8KCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQURWX1ZDVF9UUkFOU19DSEFOX1NFTAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQWR2YW5jZWQgVkNUIFRyYW5zbWl0dGVyIGNoYW5uZWwgc2VsZWN0CiAqCiAqIEVudW1lcmF0aW9uczoKICoJCUdUX0FEVl9WQ1RfTk9fQ1JPU1NQQUlSIC0gVHJhbnNtaXR0ZXIgY2hhbm5lbCBzZWxlY3QgaXMgMDAwCiAqCQlHVF9BRFZfVkNUX0NST1NTUEFJUiAgICAtIFRyYW5zbWl0dGVyIGNoYW5uZWxzZWxlY3QgaXMgMTAwLzEwMS8xMTAvMTExCiAqLwp0eXBlZGVmIGVudW0KewoJLyogQWR2YW5jZWQgVkNUIE1vZGUgKi8KICAgIEdUX0FEVl9WQ1RfVENTX05PX0NST1NTUEFJUgkJPSAwLAogICAgR1RfQURWX1ZDVF9UQ1NfQ1JPU1NQQUlSXzAJCSAgICA9IDB4NCwKICAgIEdUX0FEVl9WQ1RfVENTX0NST1NTUEFJUl8xCQkgICAgPSAweDUsCiAgICBHVF9BRFZfVkNUX1RDU19DUk9TU1BBSVJfMgkJICAgID0gMHg2LAogICAgR1RfQURWX1ZDVF9UQ1NfQ1JPU1NQQUlSXzMJCSAgICA9IDB4Nwp9IEdUX0FEVl9WQ1RfVFJBTlNfQ0hBTl9TRUw7CgoKdHlwZWRlZiBlbnVtCnsKCS8qIEFkdmFuY2VkIFZDVCBNb2RlICovCiAgICBHVF9BRFZfVkNUX1NBVkdfMgkJPSAwLAogICAgR1RfQURWX1ZDVF9TQVZHXzQJCT0gMSwKICAgIEdUX0FEVl9WQ1RfU0FWR184CQk9IDIsCiAgICBHVF9BRFZfVkNUX1NBVkdfMTYJCT0gMywKICAgIEdUX0FEVl9WQ1RfU0FWR18zMgkJPSA0LAogICAgR1RfQURWX1ZDVF9TQVZHXzY0CQk9IDUsCiAgICBHVF9BRFZfVkNUX1NBVkdfMTI4CT0gNiwKICAgIEdUX0FEVl9WQ1RfU0FWR18yNTYJPSA3Cn0gR1RfQURWX1ZDVF9TQU1QTEVfQVZHOwoKdHlwZWRlZiBlbnVtCnsKCS8qIEFkdmFuY2VkIFZDVCBNb2RlICovCiAgICBHVF9BRFZfVkNUX01BWF9QRUFLCQk9MHgwMCwKICAgIEdUX0FEVl9WQ1RfRklSU1RfUEVBSwkJPTB4MDEsCn0gR1RfQURWX1ZDVF9NT0Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgR1RfQURWX1ZDVF9QRUFLREVUX0hZU1Q7CgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0FEVl9WQ1RfTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQWR2YW5jZWQgVkNUIE1vZGUgYW5kIFRyYW5zbWl0dGVyIGNoYW5uZWwgc2VsZWN0CiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9BRFZfVkNUX0ZJUlNUX1BFQUsgICAtIGZpcnN0IHBlYWsgYWJvdmUgYSBjZXJ0YWluIHRocmVzaG9sZCBpcyByZXBvcnRlZC4KICogICAgICBHVF9BRFZfVkNUX01BWF9QRUFLICAgICAtIG1heGltdW0gcGVhayBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkIGlzIHJlcG9ydGVkLgogKgkJR1RfQURWX1ZDVF9PRkZTRQkgICAgIC0gb2Zmc2V0CiAqCQlHVF9BRFZfVkNUX1NBTVBMRV9QT0lOVCAtIHNhbXBsZSBwb2ludAogKgogKgkJR1RfQURWX1ZDVF9OT19DUk9TU1BBSVIgLSBUcmFuc21pdHRlciBjaGFubmVsIHNlbGVjdCBpcyAwMDAKICoJCUdUX0FEVl9WQ1RfQ1JPU1NQQUlSICAgIC0gVHJhbnNtaXR0ZXIgY2hhbm5lbHNlbGVjdCBpcyAxMDAvMTAxLzExMC8xMTEKICogICBFeGFtcGxlOiBtb2RlID0gR1RfQURWX1ZDVF9GSVJTVF9QRUFLIHwgR1RfQURWX1ZDVF9DUk9TU1BBSVIuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9BRFZfVkNUX01PRAkJCQkJbW9kZTsKICAgIEdUX0FEVl9WQ1RfVFJBTlNfQ0hBTl9TRUwgICAgICB0cmFuc0NoYW5TZWw7CiAgICBHVF9BRFZfVkNUX1NBTVBMRV9BVkcJCQlzYW1wbGVBdmc7CglHVF9BRFZfVkNUX1BFQUtERVRfSFlTVAkJcGVha0RldEh5c3Q7Cn0gR1RfQURWX1ZDVF9NT0RFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQURWX1ZDVF9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIEFkdmFuY2VkIFZDVCBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIEdUX0FEVl9WQ1RfRkFJTCAgICAgLSBhZHZhbmNlZCB2aXJ0dWFsIGNhYmxlIHRlc3QgZmFpbGVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggY2Fubm90IGJlIGRldGVybWluZWQuCiAqICAgICAgR1RfQURWX1ZDVF9OT1JNQUwgICAtIG5vcm1hbCBjYWJsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIG1heSBub3QgYmUgZGV0ZXJtaW5lZC4KICogICAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1IC0gaW1wZWRhbmNlIG1pc21hdGNoID4gMTE1IG9obXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGlzIHZhbGlkLgogKiAgICAgIEdUX0FEVl9WQ1RfSU1QX0xFU1NfVEhBTl84NSAtIGltcGVkYW5jZSBtaXNtYXRjaCA8IDg1IG9obXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGlzIHZhbGlkLgogKiAgICAgIEdUX0FEVl9WQ1RfT1BFTiAJIC0gY2FibGUgb3BlbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9TSE9SVCAJIC0gY2FibGUgc2hvcnRlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9DUk9TU19QQUlSX1NIT1JUIC0gY3Jvc3MgcGFpciBzaG9ydC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGZvciBlYWNoIGNoYW5uZWwgaXMgdmFsaWQuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQURWX1ZDVF9GQUlMLAogICAgR1RfQURWX1ZDVF9OT1JNQUwsCiAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1LAogICAgR1RfQURWX1ZDVF9JTVBfTEVTU19USEFOXzg1LAogICAgR1RfQURWX1ZDVF9PUEVOLAogICAgR1RfQURWX1ZDVF9TSE9SVCwKICAgIEdUX0FEVl9WQ1RfQ1JPU1NfUEFJUl9TSE9SVAp9IEdUX0FEVl9WQ1RfU1RBVFVTOwoKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBHVF9DUk9TU19QQUlSX0xJU1QKICoKICogRGVzY3JpcHRpb246IHN0cnVjdXR1cmUgZm9yIGNyb3NzIHBhaXIgc2hvcnQgY2hhbm5lbHMuCiAqCiAqIEZpZWxkczoKICogICAgICBjaGFubmVsIC0gY3Jvc3MgcGFpciBzaG9ydCBjaGFubmVsIGxpc3QKICogICAgICAgICAgICAgICAgY2hhbm5lbFtpXSBpcyBHVF9UUlVFIGlmIHRoZSBjaGFubmVsW2ldIGlzIGNyb3NzIHBhaXIgc2hvcnQKICogICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBjaGFubmVsIHVuZGVyIHRlc3QuCiAqICAgICAgZGlzdDJmYXVsdCAtIGVzdGltYXRlZCBkaXN0YW5jZSB0byB0aGUgc2hvcnRlZCBsb2NhdGlvbi4KICogICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiByZWxhdGVkIGNoYW5uZWwgKGFib3ZlKSBpcyBHVF9UUlVFLgogKi8KdHlwZWRlZiBzdHJ1Y3QgX0dUX0NST1NTX1NIT1JUX0xJU1QKewogICAgR1RfQk9PTCAgICBjaGFubmVsW0dUX01ESV9QQUlSX05VTV07CiAgICBHVF8xNiAgICAgZGlzdDJmYXVsdFtHVF9NRElfUEFJUl9OVU1dOwp9IEdUX0NST1NTX1NIT1JUX0xJU1Q7CgoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0FEVl9DQUJMRV9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IHN0cnVjdXR1cmUgZm9yIGFkdmFuY2VkIGNhYmxlIHN0YXR1cy4KICoKICogRmllbGRzOgogKiAgICAgIGNhYmxlU3RhdHVzIC0gVkNUIGNhYmxlIHN0YXR1cyBmb3IgZWFjaCBjaGFubmVsLgogKiAgICAgIGNyb3NzU2hvcnQgIC0gY3Jvc3MgcGFpciBzaG9ydCBsaXN0IGZvciBlYWNoIGNoYW5uZWwuIAogKiAgICAgICAgICAgICAgICAgICAgVmFsaWQgb25seSBpZiByZWxhdGl2ZSBjYWJsZVN0YXR1cyBpcyBHVF9BRFZfVkNUX0NST1NTX1BBSVJfU0hPUlQuCiAqICAgICAgZGlzdDJmYXVsdCAgLSBlc3RpbWF0ZWQgZGlzdGFuY2UgdG8gZmF1bHQgZm9yIGVhY2ggY2hhbm5lbC4KICogICAgICAgICAgICAgICAgICAgIFZhbGlkIGlmIHJlbGF0aXZlIGNhYmxlU3RhdHVzIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nczoKICogICAgICAgICAgICAgICAgICAgICAgR1RfQURWX1ZDVF9OT1JNQUwKICogICAgICAgICAgICAgICAgICAgICAgR1RfQURWX1ZDVF9JTVBfR1JFQVRFUl9USEFOXzExNQogKiAgICAgICAgICAgICAgICAgICAgICBHVF9BRFZfVkNUX0lNUF9MRVNTX1RIQU5fODUsCiAqICAgICAgICAgICAgICAgICAgICAgIEdUX0FEVl9WQ1RfT1BFTiwgb3IKICoJCQkJCQlHVF9BRFZfVkNUX1NIT1JUCiAgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQURWX1ZDVF9TVEFUVVMgICBjYWJsZVN0YXR1c1tHVF9NRElfUEFJUl9OVU1dOwogICAgdW5pb24gewogICAgICAgIEdUX0NST1NTX1NIT1JUX0xJU1QgY3Jvc3NTaG9ydDsKICAgICAgICBHVF8xNiAgICAgZGlzdDJmYXVsdDsKICAgIH11W0dUX01ESV9QQUlSX05VTV07Cn0gR1RfQURWX0NBQkxFX1NUQVRVUzsKCgovKgogKiBEZWZpbml0aW9uOgogKgkJR1RfTEVEX0xJTktfQUNUX1NQRUVEIAktIG9mZiA9IG5vIGxpbmssIG9uID0gbGluaywgYmxpbmsgPSBhY3Rpdml0eSwgYmxpbmsgc3BlZWQgPSBsaW5rIHNwZWVkCiAqCQlHVF9MRURfTElOS19BQ1QJIAkJLSBvZmYgPSBubyBsaW5rLCBvbiA9IGxpbmssIGJsaW5rID0gYWN0aXZpdHkKICoJCUdUX0xFRF9MSU5LCQkgCQktIG9mZiA9IG5vIGxpbmssIG9uID0gbGluawogKgkJR1RfTEVEXzEwX0xJTktfQUNUCQktIG9mZiA9IG5vIGxpbmssIG9uID0gMTAsIGJsaW5rID0gYWN0aXZpdHkKICoJCUdUX0xFRF8xMF9MSU5LCQkJLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwCiAqCQlHVF9MRURfMTAwX0xJTktfQUNUCQktIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwIGxpbmssIGJsaW5rID0gYWN0aXZpdHkKICoJCUdUX0xFRF8xMDBfTElOSwkJCS0gb2ZmID0gbm8gbGluaywgb24gPSAxMDAgbGluawogKgkJR1RfTEVEXzEwMDBfTElOS19BQ1QJLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKgkJR1RfTEVEXzEwMDBfTElOSwkJLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwMDAgbGluawogKgkJR1RfTEVEXzEwXzEwMF9MSU5LX0FDVAktIG9mZiA9IG5vIGxpbmssIG9uID0gMTAgb3IgMTAwIGxpbmssIGJsaW5rID0gYWN0aXZpdHkKICoJCUdUX0xFRF8xMF8xMDBfTElOSwkJLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwIG9yIDEwMCBsaW5rCiAqCQlHVF9MRURfMTBfMTAwMF9MSU5LX0FDVAktIG9mZiA9IG5vIGxpbmssIG9uID0gMTAgb3IgMTAwMCBsaW5rLCBibGluayA9IGFjdGl2aXR5CiAqCQlHVF9MRURfMTBfMTAwMF9MSU5LCQktIG9mZiA9IG5vIGxpbmssIG9uID0gMTAgb3IgMTAwMCBsaW5rCiAqCQlHVF9MRURfMTAwXzEwMDBfTElOS19BQ1QtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwIG9yIDEwMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKgkJR1RfTEVEXzEwMF8xMDAwX0xJTksJLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwMCBvciAxMDAwIGxpbmsKICoJCUdUX0xFRF9TUEVDSUFMCQkJLSBzcGVjaWFsIGxlZHMKICoJCUdUX0xFRF9EVVBMRVhfQ09MCQktIG9mZiA9IGhhbGYgZHVwbHgsIG9uID0gZnVsbCBkdXBsZXgsIGJsaW5rID0gY29sbGlzaW9uCiAqCQlHVF9MRURfQUNUSVZJVFkJCQktIG9mZiA9IG5vIGxpbmssIGJsaW5rIG9uID0gYWN0aXZpdHkKICoJCUdUX0xFRF9QVFBfQUNUCQkJLSBibGluayBvbiA9IFBUUCBhY3Rpdml0eQogKgkJR1RfTEVEX0ZPUkNFX0JMSU5LCQktIGZvcmNlIGJsaW5rCiAqCQlHVF9MRURfRk9SQ0VfT0ZGCQktIGZvcmNlIG9mZgogKgkJR1RfTEVEX0ZPUkNFX09OCQkJLSBmb3JjZSBvbgoqLwojZGVmaW5lIEdUX0xFRF9MSU5LX0FDVF9TUEVFRAkJMQojZGVmaW5lIEdUX0xFRF9MSU5LX0FDVAkJCTIKI2RlZmluZSBHVF9MRURfTElOSwkJCQkzCiNkZWZpbmUgR1RfTEVEXzEwX0xJTktfQUNUCQkJNAojZGVmaW5lIEdUX0xFRF8xMF9MSU5LCQkJCTUKI2RlZmluZSBHVF9MRURfMTAwX0xJTktfQUNUCQk2CiNkZWZpbmUgR1RfTEVEXzEwMF9MSU5LCQkJNwojZGVmaW5lIEdUX0xFRF8xMDAwX0xJTktfQUNUCQk4CiNkZWZpbmUgR1RfTEVEXzEwMDBfTElOSwkJCTkKI2RlZmluZSBHVF9MRURfMTBfMTAwX0xJTktfQUNUCQkxMAojZGVmaW5lIEdUX0xFRF8xMF8xMDBfTElOSwkJCTExCiNkZWZpbmUgR1RfTEVEXzEwXzEwMDBfTElOS19BQ1QJMTIKI2RlZmluZSBHVF9MRURfMTBfMTAwMF9MSU5LCQkxMwojZGVmaW5lIEdUX0xFRF8xMDBfMTAwMF9MSU5LX0FDVAkxNAojZGVmaW5lIEdUX0xFRF8xMDBfMTAwMF9MSU5LCQkxNQojZGVmaW5lIEdUX0xFRF9TUEVDSUFMCQkJCTE2CiNkZWZpbmUgR1RfTEVEX0RVUExFWF9DT0wJCQkxNwojZGVmaW5lIEdUX0xFRF9BQ1RJVklUWQkJCTE4CiNkZWZpbmUgR1RfTEVEX1BUUF9BQ1QJCQkJMTkKI2RlZmluZSBHVF9MRURfRk9SQ0VfQkxJTksJCQkyMAojZGVmaW5lIEdUX0xFRF9GT1JDRV9PRkYJCQkyMQojZGVmaW5lIEdUX0xFRF9GT1JDRV9PTgkJCTIyCiNkZWZpbmUgR1RfTEVEX1JFU0VSVkUJCQkJMjMKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0xFRF9DRkcKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIGZvciBMRUQgY29uZmlndXJhdGlvbiB0eXBlCiAqCiAqIEVudW1lcmF0aW9uczoKICoJCUdUX0xFRF9DRkdfTEVEMAkJLSByZWFkL3dyaXRlIGxlZDAgdmFsdWUgKEdUX0xFRF94eHggZGVmaW5pdGlvbikKICoJCUdUX0xFRF9DRkdfTEVEMQkJLSByZWFkL3dyaXRlIGxlZDEgdmFsdWUKICoJCUdUX0xFRF9DRkdfTEVEMgkJLSByZWFkL3dyaXRlIGxlZDIgdmFsdWUKICoJCUdUX0xFRF9DRkdfTEVEMwkJLSByZWFkL3dyaXRlIGxlZDMgdmFsdWUKICoJCUdUX0xFRF9DRkdfUFVMU0VfU1RSRVRDSAktIHJlYWQvd3JpdGUgcHVsc2Ugc3RyZXRjaCAoMCB+IDQpCiAqCQlHVF9MRURfQ0ZHX0JMSU5LX1JBVEUJCS0gcmVhZC93cml0ZSBibGluayByYXRlCSgwIH4gNSkKICoJCUdUX0xFRF9DRkdfU1BFQ0lBTF9DT05UUk9MCS0gcmVhZC93cml0ZSBzcGVjaWFsIGNvbnRyb2wgKHBvcnQgdmVjdG9yKQogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0xFRF9DRkdfTEVEMCwKCUdUX0xFRF9DRkdfTEVEMSwKCUdUX0xFRF9DRkdfTEVEMiwKCUdUX0xFRF9DRkdfTEVEMywKCUdUX0xFRF9DRkdfUFVMU0VfU1RSRVRDSCwKCUdUX0xFRF9DRkdfQkxJTktfUkFURSwKCUdUX0xFRF9DRkdfU1BFQ0lBTF9DT05UUk9MCn0gR1RfTEVEX0NGRzsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0FWQl9SRUNPVkVSRURfQ0xPQ0sKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIGZvciByZWNvdmVyZWQgY2xvY2sgdHlwZQogKgogKiBFbnVtZXJhdGlvbnM6CiAqCQlHVF9QUklNQVJZX1JFQ09WRVJFRF9DTE9DSyAJCS0gcHJpbWFyeSByZWNvdmVyZWQgY2xvY2sKICoJCUdUX1NFQ09OREFSWV9SRUNPVkVSRURfQ0xPQ0sgCS0gc2Vjb25kYXJ5IHJlY292ZXJlZCBjbG9jawogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX1BSSU1BUllfUkVDT1ZFUkVEX0NMT0NLLAoJR1RfU0VDT05EQVJZX1JFQ09WRVJFRF9DTE9DSwp9IEdUX0FWQl9SRUNPVkVSRURfQ0xPQ0s7CgoKLyogRGVmaW5lIFFBViBpbnRlcnJ1cHQgYml0cyAqLwoKI2RlZmluZSBHVF9RQVZfSU5UX1NUQVRVU19FTlFfTE1UX0JJVAkJCTB4ODAwMAkvKiBFblEgTGltaXQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfU1RBVFVTX0lTT19ERUxfQklUCQkJMHgwNDAwCS8qIElzbyBEZWxheSBJbnRlcnJ1cHQgRW5hYmxlICovCiNkZWZpbmUgR1RfUUFWX0lOVF9TVEFUVVNfSVNPX0RJU19CSVQJCQkweDAyMDAgIC8qIElzbyBEaXNjYXJkIEludGVycnVwdCBFbmFibGUgKi8KI2RlZmluZSBHVF9RQVZfSU5UX1NUQVRVU19JU09fTElNSVRfRVhfQklUCQkweDAxMDAgIC8qIElzbyBQYWNrZXQgTWVtb3J5IEV4Y2VlZGVkIEludGVycnVwdCBFbmFibGUgKi8KCiNkZWZpbmUgR1RfUUFWX0lOVF9FTkFCTEVfRU5RX0xNVF9CSVQJCQkweDgwICAvKiBFblEgTGltaXQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfRU5BQkxFX0lTT19ERUxfQklUCQkJMHgwNCAgLyogSXNvIERlbGF5IEludGVycnVwdCBFbmFibGUgKi8KI2RlZmluZSBHVF9RQVZfSU5UX0VOQUJMRV9JU09fRElTX0JJVAkJCTB4MDIgIC8qIElzbyBEaXNjYXJkIEludGVycnVwdCBFbmFibGUgKi8KI2RlZmluZSBHVF9RQVZfSU5UX0VOQUJMRV9JU09fTElNSVRfRVhfQklUCQkweDAxICAvKiBJc28gUGFja2V0IE1lbW9yeSBFeGNlZWRlZCBJbnRlcnJ1cHQgRW5hYmxlICovCgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9FRVBST01fT1BFUkFUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBFRVBST00gT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBUUF9XUklURV9EQVRBIAkJCS0gV3JpdGUgZGF0YSB0byB0aGUgRUVQUk9NIHJlZ2lzdGVyCiAqICAgICAgUFRQX1JFQURfREFUQQkJCS0gUmVhZCBkYXRhIGZyb20gRUVQUk9NIHJlZ2lzdGVyCiAqICAgICAgUFRQX1JFU1RBUlQJCQkJLSBSZXN0YXJ0IEVFUFJPTSBvcHJpdGlvbgogKi8KdHlwZWRlZiBlbnVtCnsKCUdUX0VFUFJPTV9OT19PUAkJIAkJCT0gMHgwLAoJR1RfRUVQUk9NX1dSSVRFX0RBVEEgCQkJPSAweDMsCglHVF9FRVBST01fUkVBRF9EQVRBICAJCQk9IDB4NCwKCUdUX0VFUFJPTV9SRVNUQVJUCQkJCT0gMHg2LAoJR1RfRUVQUk9NX0hBTFQJCQkJCT0gMHg3LAp9IEdUX0VFUFJPTV9PUEVSQVRJT047CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9FRVBST01fT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgRUVQUk9NIE9wZXJhdGlvbgogKgogKiAgRmllbGRzOgogKiAgICAgIGVlcHJvbVBvcnQJCS0gcGh5c2ljYWwgcG9ydCBvZiB0aGUgZGV2aWNlCiAqICAgICAgZWVwcm9tQWRkciAJLSByZWdpc3RlciBhZGRyZXNzCiAqICAgICAgZWVwcm9tRGF0YSAJLSBkYXRhIGZvciBwdHAgcmVnaXN0ZXIuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CglHVF9VMzIJZWVwcm9tUG9ydDsKCUdUX1UzMgllZXByb21CbG9jazsKCUdUX1UzMgllZXByb21BZGRyOwoJR1RfVTMyCWVlcHJvbURhdGE7Cn0gR1RfRUVQUk9NX09QX0RBVEE7CgojZGVmaW5lIEdUX0VFUFJPTV9PUF9TVF9SVU5OSU5HX01BU0sJCTB4ODAwCiNkZWZpbmUgR1RfRUVQUk9NX09QX1NUX1dSSVRFX0VOX01BU0sJCTB4NDAwCgojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX1NDUkFUXzAJMHgwMCAvKiBTY3JhdGNoIEJ5dGUgMCAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX1NDUkFUXzEJMHgwMSAvKiBTY3JhdGNoIEJ5dGUgMSAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX0dQSU9fQ0ZHCTB4NjAgLyogR1BJTyBDb25maWd1cmF0aW9uICovCgkJCQkJCQkJCQkgLyogMHg2MSA9IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfR1BJT19ESVIJMHg2MiAvKiBHUElPIERpcmVjdGlvbiAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX0dQSU9fREFUCTB4NjMgLyogR1BJTyBEYXRhICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfQ0ZHX0RBVDAJMHg3MCAvKiBDT05GSUcgRGF0YSAwICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfQ0ZHX0RBVDEJMHg3MSAvKiBDT05GSUcgRGF0YSAxICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfQ0ZHX0RBVDIJMHg3MiAvKiBDT05GSUcgRGF0YSAyICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfQ0ZHX0RBVDMJMHg3MyAvKiBDT05GSUcgRGF0YSAzICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfU1lOQ0UJCTB4N0MgLyogU3luY0UgJiBUQUlDTEsxMjWScyBEcml2ZSAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX1A1X0NMSwkweDdEIC8qIFA1knMgJiBDTEsxMjWScyBDbG9jayBEcml2ZSAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX1A2X0NMSwkweDdFIC8qIFA2knMgQ2xvY2sgRHJpdmUgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19FRVBST00JMHg3RiAvKiBFRVBST00gUGFkIGRyaXZlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfTUFYCQkweDgwIC8qIE1heGltdW4gcmVnaXN0ZXIgcG9pbnRlciAqLwoKI2RlZmluZSBHVF9HUElPX0JJVF8wCTB4MQojZGVmaW5lIEdUX0dQSU9fQklUXzEJMHgyCiNkZWZpbmUgR1RfR1BJT19CSVRfMgkweDQKI2RlZmluZSBHVF9HUElPX0JJVF8zCTB4OAojZGVmaW5lIEdUX0dQSU9fQklUXzQJMHgxMAojZGVmaW5lIEdUX0dQSU9fQklUXzUJMHgyMAojZGVmaW5lIEdUX0dQSU9fQklUXzYJMHg0MAoKdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICAgICAgICB1c2VyIDogMzsKCUdUX1U4ICAgICAgICAgYWRkciA6IDU7Cn1HVF9DT05GSUdfREFUQV8wOwoKdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICAgICAgICBsZWQgIDogMjsKCUdUX1U4ICAgICAgICAgZm91cmNvbCA6IDE7CglHVF9VOCAgICAgICAgIG5vcm1DeCA6IDE7CglHVF9VOCAgICAgICAgIGp1bWJvIDogMTsKCUdUX1U4ICAgICAgICAgZWVfd2UgOiAxOwoJR1RfVTggICAgICAgICBmZF9mbG93IDogMTsKCUdUX1U4ICAgICAgICAgaGRfZmxvdyA6IDE7Cn1HVF9DT05GSUdfREFUQV8xOwoKdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICAgICAgICBwNV9tb2QgOiAzOwoJR1RfVTggICAgICAgICBiaXQ0CSA6IDE7CglHVF9VOCAgICAgICAgIHA2X21vZCA6IDM7Cn1HVF9DT05GSUdfREFUQV8yOwoKdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTggICAgICAgICBybXVfbW9kIDogMjsKfUdUX0NPTkZJR19EQVRBXzM7Cgp0eXBlZGVmIHN0cnVjdAp7Cgl1bmlvbiB7CgkJR1RfVTgJCQkJQnl0ZTsKCQlHVF9DT05GSUdfREFUQV8wCURhdGE7Cgl9IGNmZ0RhdGEwOwoJdW5pb24gewoJCUdUX1U4CQkJCUJ5dGU7CgkJR1RfQ09ORklHX0RBVEFfMAlEYXRhOwoJfSBjZmdEYXRhMTsKCXVuaW9uIHsKCQlHVF9VOAkJCQlCeXRlOwoJCUdUX0NPTkZJR19EQVRBXzAJRGF0YTsKCX0gY2ZnRGF0YTI7Cgl1bmlvbiB7CgkJR1RfVTgJCQkJQnl0ZTsKCQlHVF9DT05GSUdfREFUQV8wCURhdGE7Cgl9IGNmZ0RhdGEzOwp9R1RfQ09ORklHX0RBVEE7CgoKLyogZGVmaW5pdGlvbiBmb3IgVHJ1bmtpbmcgKi8KI2RlZmluZSBJU19UUlVOS19JRF9WQUxJRChfZGV2LCBfaWQpCSgoKF9pZCkgPCAxNikgPyAxIDogMCkKCgovKiBkZWZpbml0aW9uIGZvciBkZXZpY2Ugc2NhbiBtb2RlICovCiNkZWZpbmUgU01JX0FVVE9fU0NBTl9NT0RFCQkwCS8qIFNjYW4gMCBvciAweDEwIGJhc2UgYWRkcmVzcyB0byBmaW5kIHRoZSBRRCAqLwojZGVmaW5lIFNNSV9NQU5VQUxfTU9ERQkJCTEJLyogVXNlIFFEIGxvY2F0ZWQgYXQgbWFudWFsbHkgZGVmaW5lZCBiYXNlIGFkZHIgKi8KI2RlZmluZSBTTUlfTVVMVElfQUREUl9NT0RFCQkyCS8qIFVzZSBRRCBhdCBiYXNlIGFkZHIgYW5kIHVzZSBpbmRpcmVjdCBhY2Nlc3MgKi8KdHlwZWRlZiBzdHJ1Y3QKewoJR1RfVTMyCXNjYW5Nb2RlOwkvKiBjaGVjayBkZWZpbml0aW9uIGZvciBkZXZpY2Ugc2NhbiBtb2RlICovCglHVF9VMzIJYmFzZUFkZHI7CS8qIG1lYW5pbmdmdWwgaWYgc2Nhbk1vZGUgaXMgbm90IFNNSV9BVVRPX1NDQU5fTU9ERSAqLwp9IEdUX1NDQU5fTU9ERTsKCgojZGVmaW5lIEdUX1NLSVBfSU5JVF9TRVRVUAkweDczNmI2OTcwCgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfU1lTX0NPTkZJRwogKgogKiBEZXNjcmlwdGlvbjogU3lzdGVtIGNvbmZpZ3VyYXRpb24gUGFyYW1ldGVycyBzdHJ1Y3QuCiAqCiAqIEZpZWxkczoKICoJZGV2TnVtCQktIFN3aXRjaCBEZXZpY2UgTnVtYmVyIAogKiAgY3B1UG9ydE51bSAgLSBUaGUgcGh5c2ljYWwgcG9ydCB1c2VkIHRvIGNvbm5lY3QgdGhlIGRldmljZSB0byBDUFUuCiAqICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBvcnQgdG8gd2hpY2ggcGFja2V0cyBkZXN0aW5lZCB0byBDUFUgYXJlCiAqICAgICAgICAgICAgICAgIGZvcndhcmRlZC4KICogIGluaXRQb3J0cyAgIC0gV2hldGhlciB0byBpbml0aWFsaXplIHRoZSBwb3J0cyBzdGF0ZS4KICogICAgICAgICAgICAgICAgR1RfRkFMU0UgICAgLSBsZWF2ZSBpbiBkZWZhdWx0IHN0YXRlLgogKiAgICAgICAgICAgICAgICBHVF9UUlVFICAgICAtIEluaXRpYWxpemUgdG8gRm9yd2FyZGluZyBzdGF0ZS4KICogIHNraXBJbml0U2V0dXAgLSBza2lwIGluaXQgc2V0dXAsIGlmIHZhbHVlIGlzIEdUX1NLSVBfSU5JVF9TRVRVUAogKiAgICAgICAgICAgICAgICAgIHBlcmZvcm0gaW5pdCBzZXR1cCwgb3RoZXJ3aXNlCiAqCSAgICAgICAgICAgICAgICBJbml0aWFsaXppbmcgcG9ydCBzdGF0ZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyB2YXJpYWJsZS4KICoJQlNQRnVuY3Rpb25zCS0gR3JvdXAgb2YgQlNQIHNwZWNpZmljIGZ1bmN0aW9ucy4KICoJCQkJU01JIFJlYWQvV3JpdGUgYW5kIFNlbWFwaG9yZSBSZWxhdGVkIGZ1bmN0aW9ucy4KICovCnR5cGVkZWYgc3RydWN0CnsKCUdUX1U4ICAgICAgICAgZGV2TnVtOwoJR1RfVTggICAgICAgICBjcHVQb3J0TnVtOwoJR1RfQk9PTCAgICAgICBpbml0UG9ydHM7CglCU1BfRlVOQ1RJT05TIEJTUEZ1bmN0aW9uczsKCUdUX1NDQU5fTU9ERSAgbW9kZTsKCUdUX1UzMiAgICAgICAgc2tpcEluaXRTZXR1cDsKfUdUX1NZU19DT05GSUc7CgoKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9RRF9ERVYKICoKICogRGVzY3JpcHRpb246IEluY2x1ZGVzIFRhcGkgbGF5ZXIgc3dpdGNoIGNvbmZpZ3VyYXRpb24gZGF0YS4KICoKICogRmllbGRzOgogKiAgIGRldmljZUlkICAgICAgIC0gVGhlIGRldmljZSB0eXBlIGlkZW50aWZpZXIuCiAqICAgcmV2aXNpb24gICAgICAgLSBUaGUgZGV2aWNlIHJldmlzaW9uIG51bWJlci4KICogICBiYXNlUmVnQWRkciAgICAtIFN3aXRjaCBCYXNlIFJlZ2lzdGVyIGFkZHJlc3MuCiAqICAgbnVtT2ZQb3J0cyAgICAgLSBOdW1iZXIgb2YgYWN0aXZlIHBvcnRzLgogKiAgIG1heFBvcnRzICAgICAgIC0gbWF4IHBvcnRzLiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGRyaXZlcidzIHVzZS4KICogICBjcHVQb3J0TnVtICAgICAtIExvZ2ljYWwgcG9ydCBudW1iZXIgd2hvc2UgcGh5c2ljYWwgcG9ydCBpcyBjb25uZWN0ZWQgdG8gdGhlIENQVS4KICogICBtYXhQaHlOdW0gICAgICAtIG1heCBjb25maWd1cmFibGUgUGh5IGFkZHJlc3MuCiAqICAgc3RwTW9kZSAgICAgICAgLSBjdXJyZW50IHN3aXRjaCBTVFAgbW9kZSAoMCBub25lLCAxIGVuLCAyIGRpcykKICogICBhY2Nlc3NNb2RlCSAgICAtIHNob3dzIGhvdyB0byBmaW5kIGFuZCBhY2Nlc3MgdGhlIGRldmljZS4KICogICBwaHlBZGRyICAgICAgICAtIFNNSSBhZGRyZXNzIHVzZWQgdG8gYWNjZXNzIFN3aXRjaCByZWdpc3RlcnMob25seSBmb3IgU01JX01VTFRJX0FERFJfTU9ERSkuCiAqICAgdmFsaWRQb3J0VmVjICAgLSB2YWxpZCBwb3J0IGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIHZhbGlkUGh5VmVjCS0gdmFsaWQgcGh5IGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIHZhbGlkU2VyZGVzVmVjCS0gdmFsaWQgc2VyZGVzIGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIGRldkdyb3VwCSAgICAtIHRoZSBkZXZpY2UgZ3JvdXAKICogICBkZXZOYW1lCSAgICAtIG5hbWUgb2YgdGhlIGRldmljZQogKiAgIGRldlN0b3JhZ2UJICAgIC0gZHJpdmVyIGludGVybmFsIHVzZSAoaG9sZCB2YXJpb3VzIHRlbXAgaW5mb3JtYXRpb24pCiAqICAgbXVsdGlBZGRyU2VtICAgLSBTZW1hcGhvcmUgZm9yIEFjY2Vzc2luZyBTTUkgRGV2aWNlCiAqICAgYXR1UmVnc1NlbSAgICAgLSBTZW1hcGhvcmUgZm9yIEFUVSBhY2Nlc3MKICogICB2dHVSZWdzU2VtICAgICAtIFNlbWFwaG9yZSBmb3IgVlRVIGFjY2VzcwogKiAgIHN0YXRzUmVnc1NlbSAgIC0gU2VtYXBob3JlIGZvciBSTU9OIGNvdW50ZXIgYWNjZXNzCiAqICAgcGlybFJlZ3NTZW0gICAgLSBTZW1hcGhvcmUgZm9yIFBJUkwgUmVzb3VyY2UgYWNjZXNzCiAqICAgcHRwUmVnc1NlbSAgICAgLSBTZW1hcGhvcmUgZm9yIFBUUCBSZXNvdXJjZSBhY2Nlc3MKICogICB0YmxSZWdzU2VtICAgICAtIFNlbWFwaG9yZSBmb3IgdmFyaW91cyBUYWJsZSBSZXNvdXJjZSBhY2Nlc3MsCiAqICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIFRydW5rIFRhYmxlcyBhbmQgRGV2aWNlIFRhYmxlCiAqICAgZWVwcm9tUmVnc1NlbSAgLSBTZW1hcGhvcmUgZm9yIGVlcHJvbSBjb250cm9sIGFjY2VzcwogKiAgIHBoeVJlZ3NTZW0gICAgIC0gU2VtYXBob3JlIGZvciBQSFkgRGV2aWNlIGFjY2VzcwogKiAgIGZndFJlYWRNaWkgICAgIC0gcGxhdGZvcm0gc3BlY2lmaWMgU01JIHJlZ2lzdGVyIFJlYWQgZnVuY3Rpb24KICogICBmZ3RXcml0ZU1paSAgICAtIHBsYXRmb3JtIHNwZWNpZmljIFNNSSByZWdpc3RlciBXcml0ZSBmdW5jdGlvbgogKiAgIHNlbUNyZWF0ZSAgICAgIC0gZnVuY3Rpb24gdG8gY3JlYXRlIHNlbWFwb3JlCiAqICAgc2VtRGVsZXRlICAgICAgLSBmdW5jdGlvbiB0byBkZWxldGUgdGhlIHNlbWFwb3JlCiAqICAgc2VtVGFrZSAgICAgICAgLSBmdW5jdGlvbiB0byBnZXQgYSBzZW1hcG9yZQogKiAgIHNlbUdpdmUgICAgICAgIC0gZnVuY3Rpb24gdG8gcmV0dXJuIHNlbWFwaG9yZQogKiAgIGFwcERhdGEgICAgICAgIC0gYXBwbGljYXRpb24gZGF0YSB0aGF0IHVzZXIgbWF5IHVzZQogKi8Kc3RydWN0IF9HVF9RRF9ERVYKewoJR1RfREVWSUNFICAgZGV2aWNlSWQ7CglHVF9MUE9SVCAgICBjcHVQb3J0TnVtOwoJR1RfVTggICAgICAgcmV2aXNpb247CglHVF9VOAkJZGV2TnVtOwoJR1RfVTgJCWRldkVuYWJsZWQ7CglHVF9VOCAgICAgICBiYXNlUmVnQWRkcjsKCUdUX1U4ICAgICAgIG51bU9mUG9ydHM7CglHVF9VOAkJbWF4UG9ydHM7CglHVF9VOCAgICAgICBtYXhQaHlOdW07CglHVF9VOAkJc3RwTW9kZTsKCUdUX1U4CQlhY2Nlc3NNb2RlOwoJR1RfVTgJCXBoeUFkZHI7CglHVF9VMTYJCXJlc2VydmVkOwoJR1RfVTE2CQl2YWxpZFBvcnRWZWM7CglHVF9VMTYJCXZhbGlkUGh5VmVjOwoJR1RfVTE2CQl2YWxpZFNlcmRlc1ZlYzsKCUdUX1UxNgkJZGV2R3JvdXA7CglHVF9VMzIJCWRldk5hbWU7CglHVF9VMzIJCWRldlN0b3JhZ2U7CglHVF9TRU0JCW11bHRpQWRkclNlbTsKCUdUX1NFTQkJYXR1UmVnc1NlbTsKCUdUX1NFTQkJdnR1UmVnc1NlbTsKCUdUX1NFTQkJc3RhdHNSZWdzU2VtOwoJR1RfU0VNCQlwaXJsUmVnc1NlbTsKCUdUX1NFTQkJcHRwUmVnc1NlbTsKCUdUX1NFTQkJdGJsUmVnc1NlbTsKCUdUX1NFTQkJZWVwcm9tUmVnc1NlbTsKCUdUX1NFTQkJcGh5UmVnc1NlbTsKCglGR1RfUkVBRF9NSUkgCWZndFJlYWRNaWk7CglGR1RfV1JJVEVfTUlJIAlmZ3RXcml0ZU1paTsKCglGR1RfU0VNX0NSRUFURQlzZW1DcmVhdGU7IAkvKiBjcmVhdGUgc2VtYXBob3JlICovCglGR1RfU0VNX0RFTEVURQlzZW1EZWxldGU7IAkvKiBkZWxldGUgdGhlIHNlbWFwaG9yZSAqLwoJRkdUX1NFTV9UQUtFCXNlbVRha2U7CS8qIHRyeSB0byBnZXQgYSBzZW1hcGhvcmUgKi8KCUZHVF9TRU1fR0lWRQlzZW1HaXZlOwkvKiByZXR1cm4gc2VtYXBob3JlICovCgl2b2lkKgkJYXBwRGF0YTsKCn07CgoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgLyogX19tc0FwaV9oICovCg==