LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX2NyeXBfZXguYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEV4dGVuZGVkIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIKICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgQ1JZUCBleHRlbnNpb24gcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAgICAgCiAgKiAgCiAgQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoZSBDUllQIGV4dGVuc2lvbiBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAoIylBZnRlciBBRVMtR0NNIG9yIEFFUy1DQ00gIEVuY3J5cHRpb24vRGVjcnlwdGlvbiB1c2VyIGNhbiBzdGFydCBmb2xsb3dpbmcgQVBJIAogICAgICAgdG8gZ2V0IHRoZSAgYXV0aGVudGljYXRpb24gbWVzc2FnZXMgOgogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8gCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCiNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQojaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKXx8IGRlZmluZWQgKEFFUykKLyoqIEBkZWZncm91cCBDUllQRXggQ1JZUEV4CiAgKiBAYnJpZWYgQ1JZUCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRGVmaW5lcwogICogQHsKICAqLwojaWYgZGVmaW5lZChBRVMpCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovIAojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgKi8gCiNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLyAKCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBFbmNyeXB0aW9uIG1vZGUgICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OICAgICAgICAgICAgIEFFU19DUl9NT0RFXzAgICAgICAgICAgIC8qITwgS2V5IGRlcml2YXRpb24gbW9kZSAgb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAgKi8KI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgICAgICAgICAvKiE8IERlY3J5cHRpb24gICAgICAgKi8KI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUICAgICBBRVNfQ1JfTU9ERSAgICAgICAgICAgICAvKiE8IEtleSBkZXJpdmF0aW9uIGFuZCBkZWNyeXB0aW9uIG9ubHkgdXNlZCB3aGVuIHBlcmZvcm1pbmcgRUNCIGFuZCBDQkMgZGVjcnlwdGlvbnMgICovCgojZWxzZSAvKiBDUllQICovCgojZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKI2RlZmluZSBDUllQX1BIQVNFX0hFQURFUiAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAKI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzEKI2RlZmluZSBDUllQX1BIQVNFX0ZJTkFMICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBICgojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgMHgwMDAwMDAwMFUKI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgIENSWVBfQ1JfQUxHT0RJUgojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCgojZGVmaW5lICBDUllQRXhfUEhBU0VfUFJPQ0VTUyAgICAgICAweDAyVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLwojZGVmaW5lICBDUllQRXhfUEhBU0VfRklOQUwgICAgICAgICAweDAzVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gZmluYWwgcGhhc2UgdGhpcyBpcyByZWxldmFudCBvbmx5IHdpdGggQ0NNIGFuZCBHQ00gbW9kZXMgKi8gICAKCiAvKiAgQ1RSMCBpbmZvcm1hdGlvbiB0byB1c2UgaW4gQ0NNIGFsZ29yaXRobSAqLwojZGVmaW5lIENSWVBfQ0NNX0NUUjBfMCAgICAgICAgICAgIDB4MDdGRkZGRkZVICAgICAgICAgCiNkZWZpbmUgQ1JZUF9DQ01fQ1RSMF8zICAgICAgICAgICAgMHhGRkZGRkYwMFUgICAgICAgICAKCgovKioKICAqIEB9CiAgKi8KCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAKICogIEBicmllZiAgIEV4dGVuZGVkIHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAKICoKQHZlcmJhdGltICAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gZ2VuZXJhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIAogICAgICAgICAgVEFHIGluIFBvbGxpbmcgbW9kZSAKICAgICAgKCMpSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICgjKUhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCgovKioKICAqIEBicmllZiAgZ2VuZXJhdGUgdGhlIEdDTSBhdXRoZW50aWNhdGlvbiBUQUcuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBBdXRoVGFnOiBQb2ludGVyIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBidWZmZXIKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OyAgICAKICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpICogMzJVOyAvKiBIZWFkZXIgbGVuZ3RoIGluIGJpdHMgKi8KICB1aW50NjRfdCBpbnB1dGxlbmd0aCA9ICh1aW50NjRfdCkoaGNyeXAtPlNpemUpICogOFU7IC8qIGlucHV0IGxlbmd0aCBpbiBiaXRzICovCiAgdWludDMyX3QgdGFnYWRkciA9ICh1aW50MzJfdClBdXRoVGFnOyAgCiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsgIAogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKICAgIAogICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBDUllQRXhfUEhBU0VfUFJPQ0VTUykKICAgIHsKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBFeF9QSEFTRV9GSU5BTDsKICAgIH0KICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCiAgICB7IAogICAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBTZXF1ZW5jZSBlcnJvciBjb2RlIGZpZWxkICovIAogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0FVVEhfVEFHX1NFUVVFTkNFOyAKICAgICAgCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICAgIAojaWYgZGVmaW5lZChDUllQKQogICAgCiAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgCiAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8gIAogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7ICAKICAgIAogICAgLypBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuKi8gCiAgICBoY3J5cC0+SW5zdGFuY2UtPkNSICY9ICB+Q1JZUF9DUl9BTEdPRElSOwogICAgCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgCiAgICAvKiBXcml0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gaGVhZGVyICg2NCBiaXRzKSBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKICAgIGluIHRoZSBwYXlsb2FkICovCiAgICBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICB9CiAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7ICAgIAogICAgfQogICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigodWludDMyX3QpaGVhZGVybGVuZ3RoLCAxNlUpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdClpbnB1dGxlbmd0aCwgMTZVKTsKICAgIH0KICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaW5wdXRsZW5ndGgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICB9CiAgICAKICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCiAgICAgICAgeyAgICAgICAKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAgIAogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfSAgICAgICAgICAKICAgIAogICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwogICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkcis9NFU7CiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyKz00VTsKICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIrPTRVOwogICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAgIAogICAgCiNlbHNlIC8qIEFFUyovCiAgICAKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAgICAKICAgIAogICAgLyogV3JpdGUgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzCiAgICBpbiB0aGUgcGF5bG9hZCAqLyAKICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICB9CiAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOyAgICAKICAgIH0KICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigodWludDMyX3QpaGVhZGVybGVuZ3RoLCAxNlUpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKHVpbnQzMl90KWlucHV0bGVuZ3RoLCAxNlUpOwogICAgfQogICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzMyQikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaW5wdXRsZW5ndGgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICB9CiAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7ICAgICAgIAogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgICAKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9ICAgICAgICAgCiAgICAKICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyKz00VTsKICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyKz00VTsKICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyKz00VTsKICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7IAogICAgCiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgIAogICAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCiAgICAKICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgCiAgICAKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0gICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEFFUyBDQ00gQXV0aGVudGljYXRpb24gVEFHIGdlbmVyYXRpb24uCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBBdXRoVGFnOiBQb2ludGVyIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBidWZmZXIKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGFnYWRkciA9ICh1aW50MzJfdClBdXRoVGFnOwogIHVpbnQzMl90IGN0cjAgWzRdPXswfTsKICB1aW50MzJfdCBjdHIwYWRkciA9ICh1aW50MzJfdCljdHIwOwogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLwogICAgaWYoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQogICAgewogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOwogICAgfQogICAgZWxzZSAvKiBJbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkKi8KICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0FVVEhfVEFHX1NFUVVFTkNFOwoKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CgojaWYgZGVmaW5lZChDUllQKSAKCiAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAmIEFMR09ESVIgYml0IG11c3QgYmUgc2V0IHRvIJEwki4gKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEh8Q1JZUF9DUl9BTEdPRElSLCBDUllQX1BIQVNFX0ZJTkFMfENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgIGRhdGEgaGFzIHRvIGJlIHN3YXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBEQVRBVFlQRSovCiAgICBjdHIwWzBdPShoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7CiAgICBjdHIwWzFdPWhjcnlwLT5Jbml0LkIwWzFdOwogICAgY3RyMFsyXT1oY3J5cC0+SW5pdC5CMFsyXTsKICAgIGN0cjBbM109aGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOwoKICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CiAgICB9CiAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7CiAgICB9CiAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7CiAgICB9CiAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICB7CiAgICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFJlYWQgdGhlIEF1dGggVEFHIGluIHRoZSBJTiBGSUZPICovCiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyKz00VTsKICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIrPTRVOwogICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkcis9NFU7CiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CgojZWxzZSAvKiBBRVMgKi8KCiAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKCiAgICAvKiBXcml0ZSB0aGUgY291bnRlciBibG9jayBpbiB0aGUgSU4gRklGTywgQ1RSMCBpbmZvcm1hdGlvbiBmcm9tIEIwCiAgICBkYXRhIGhhcyB0byBiZSBzd2FwcGVkIGFjY29yZGluZyB0byB0aGUgREFUQVRZUEUqLwogICAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgY3RyMFswXT0oX19SRVYoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wKTsKICAgICAgY3RyMFsxXT1fX1JFVihoY3J5cC0+SW5pdC5CMFsxXSk7CiAgICAgIGN0cjBbMl09X19SRVYoaGNyeXAtPkluaXQuQjBbMl0pOwogICAgICBjdHIwWzNdPShfX1JFVihoY3J5cC0+SW5pdC5CMFszXSkmIENSWVBfQ0NNX0NUUjBfMyk7CgogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgIH0KICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICB7CiAgICAgIGN0cjBbMF09ICggX19ST1IoKGhjcnlwLT5Jbml0LkIwWzBdKSwgMTZVKSYgQ1JZUF9DQ01fQ1RSMF8wKTsKICAgICAgY3RyMFsxXT0gICBfX1JPUigoaGNyeXAtPkluaXQuQjBbMV0pLCAxNlUpOwogICAgICBjdHIwWzJdPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsyXSksIDE2VSk7CiAgICAgIGN0cjBbM109ICggX19ST1IoKGhjcnlwLT5Jbml0LkIwWzNdKSwgMTZVKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7CiAgICB9CiAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGN0cjBbMF09KF9fUkJJVChoY3J5cC0+SW5pdC5CMFswXSkmIENSWVBfQ0NNX0NUUjBfMCk7CiAgICAgIGN0cjBbMV09X19SQklUKGhjcnlwLT5Jbml0LkIwWzFdKTsKICAgICAgY3RyMFsyXT1fX1JCSVQoaGNyeXAtPkluaXQuQjBbMl0pOwogICAgICBjdHIwWzNdPShfX1JCSVQoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBjdHIwWzBdPShoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7CiAgICAgIGN0cjBbMV09aGNyeXAtPkluaXQuQjBbMV07CiAgICAgIGN0cjBbMl09aGNyeXAtPkluaXQuQjBbMl07CiAgICAgIGN0cjBbM109aGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkcis9NFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKICAgIH0KCiAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgQ2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkcis9NFU7CiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkcis9NFU7CiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkcis9NFU7CiAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwoKICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiNlbmRpZiAvKiBFbmQgb2YgQUVTIHx8IENSWVAgKi8KCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAvKiBEaXNhYmxlIENSWVAgICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOyAgIAp9CgovKioKICAqIEB9CiAgKi8KCiNpZiBkZWZpbmVkIChBRVMpCi8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zCiAqICBAYnJpZWYgICBBdXRvS2V5RGVyaXZhdGlvbiBmdW5jdGlvbnMgCiAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICMjIyMjIEtleSBEZXJpdmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIEVuYWJsZSBvciBEaXNhYmxlIHRoZQogICAgICAgICAgdGhlIEF1dG9LZXlEZXJpdmF0aW9uIHBhcmFtZXRlciBpbiBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbiBhcmUgYWxsb3dlZCBvbmx5IGluIFRpbnlBRVMgSVAuCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBBRVMgZW5hYmxlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9ucwogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkICBIQUxfQ1JZUEV4X0VuYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgeyAgCiAgICBoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPSBFTkFCTEU7CiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKICB9IAp9Ci8qKgogICogQGJyaWVmICBBRVMgZGlzYWJsZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbnMKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlLgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCAgSEFMX0NSWVBFeF9EaXNhYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICBoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPSBESVNBQkxFOwogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCiAgfSAgCn0KCi8qKgogICogQH0KICAqLwojZW5kaWYgLyogQUVTIG9yIEdDTSBDQ00gZGVmaW5lZCovCiNlbmRpZiAvKiBBRVMgKi8gCiNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLwoKLyoqCiAgKiBAfQogICovCiNlbmRpZiAvKiBUaW55QUVTIG9yIENSWVAqLwovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K