LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNCBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiogQGZpbGUgbWVjMTR4eF90ZmRwLmMNCiAqTUVDMTR4eCBUcmFjZSBGSUZPIERhdGEgUG9ydCBoYXJkd2FyZSBhY2Nlc3MNCiAqLw0KLyoqIEBkZWZncm91cCBNRUMxNHh4IFBlcmlwaGVyYWxzIFRGRFANCiAqICBAew0KICovDQoNCiNpbmNsdWRlICJhcHBjZmcuaCINCiNpbmNsdWRlICJwbGF0Zm9ybS5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eC5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eF9wY3IuaCINCiNpbmNsdWRlICJNRUMxNHh4L21lYzE0eHhfZ3Bpby5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eF90cmFjZV9mdW5jLmgiDQoNCg0KI2lmZGVmIEVOQUJMRV9URkRQX1RSQUNFDQoNCiN1bmRlZiBURkRQX1BJTl8xDQojdW5kZWYgVEZEUF9QSU5fMg0KDQoNCiNkZWZpbmUgVEZEUF9QSU5fMSAoR1BJT18wMTE2X0lEKSAgIC8vIEZ1bmMxIFB1bGxVcCBlbmFibGVkDQojZGVmaW5lIFRGRFBfUElOXzIgKEdQSU9fMDExN19JRCkgICAvLyBGdW5jMSBQdWxsVXAgZW5hYmxlZA0KDQoNCg0Kc3RhdGljIHZvaWQgdGZkcF94bWl0X2hlYWRlcih1aW50MTZfdCBuYnIpDQp7DQogICAgVEZEUC0+REFUQSA9IFRGRFBfRlJBTUVfU1RBUlQ7DQogICAgVEZEUF9ERUxBWSgpOw0KDQogICAgVEZEUC0+REFUQSA9ICh1aW50OF90KW5icjsNCiAgICBURkRQX0RFTEFZKCk7DQogICAgVEZEUC0+REFUQSA9ICh1aW50OF90KShuYnIgPj4gOCk7DQogICAgVEZEUF9ERUxBWSgpOw0KfQ0KDQoNCnN0YXRpYyB2b2lkIHRmZHBfeG1pdF9od29yZCh1aW50MTZfdCBod29yZCkNCnsNCiAgICBURkRQLT5EQVRBID0gKHVpbnQ4X3QpaHdvcmQ7DQogICAgVEZEUF9ERUxBWSgpOw0KICAgIFRGRFAtPkRBVEEgPSAodWludDhfdCkoaHdvcmQgPj4gOCk7DQogICAgVEZEUF9ERUxBWSgpOw0KfQ0KDQoNCnN0YXRpYyB2b2lkIHRmZHBfeG1pdF93b3JkKHVpbnQzMl90IHdvcmQpDQp7DQogICAgdWludDhfdCBpOw0KDQogICAgZm9yIChpID0gMHU7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgVEZEUC0+REFUQSA9ICh1aW50OF90KXdvcmQ7DQogICAgICAgIHdvcmQgPj49IDg7IA0KICAgICAgICBURkRQX0RFTEFZKCk7DQogICAgfQ0KfQ0KDQoNCi8qKg0KICogdGZkcF9zbGVlcF9lbiAtIEdhdGUgY2xvY2tzIE9uL09mZiB0byBURkRQIGJsb2NrIHdoZW4gaWRsZQ0KICogDQogKiBAYXV0aG9yIEMyMTk2OSAoMi80LzIwMTQpDQogKiANCiAqIEBwYXJhbSBzbGVlcF9lbiAoMT1HYXRlIGNsb2NrcyB3aGVuIGlkbGUpLCAoMD1EbyBub3QgZ2F0ZSANCiAqICAgICAgICAgICAgICAgICBjbG9ja3Mgd2hlbiBpZGxlKQ0KICovDQp2b2lkIHRmZHBfc2xlZXBfZW4odWludDhfdCBzbGVlcF9lbikNCnsNCiAgICBpZiAoIHNsZWVwX2VuICkgew0KICAgICAgICBQQ1ItPkVDX1NMRUVQX0VOIHw9IChQQ1JfRUNfVEZEUF9TTFBfQ0xLKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBQQ1ItPkVDX1NMRUVQX0VOICY9IH4oUENSX0VDX1RGRFBfU0xQX0NMSyk7DQogICAgfQ0KfQ0KDQoNCi8qKg0KICogdGZkcF9lbmFibGUgLSBJbml0IFRyYWNlIEZJRk8gRGF0YSBQb3J0DQogKiBAcGFyYW0gYm9vbGVhbiB0cnVlPWVuYWJsZSBURkRQLCBmYWxzZT1kaXNhYmxlIFRGRFAgDQogKiBAcGFyYW0gYm9vbGVhbiB0cnVlPWNoYW5nZSBURkRQIHBpbiBjb25maWd1cmF0aW9uLiANCiAqIElmIFRGRFAgaXMgZW5hYmxlZCB0aGVuIEdQSU8xMDMvMTA0IHNldCB0byBBbHQuIEZ1bmMuIDEgDQogKiBFbHNlIEdQSU8xMDMvMTA0IHNldCB0byBHUElPIGlucHV0LCBpbnRlcm5hbCBQVSBlbmFibGVkLiANCiAqIEBub3RlIC0gDQogKi8NCnZvaWQgdGZkcF9lbmFibGUodWludDhfdCBlbiwgdWludDhfdCBwaW5fY2ZnKQ0Kew0KICAgIHVpbnQzMl90IGRlbGF5Ow0KDQogICAgaWYgKGVuKSB7DQogICAgICAgIA0KICAgICAgICBpZiAocGluX2NmZykgew0KICAgICAgICAgICAgLy8gSW5wdXQgd2l0aCBBbHRPdXQ9MSB0byBkcml2ZSBoaWdoIHdoZW4gc3dpdGNoZWQgdG8gb3V0cHV0DQogICAgICAgICAgICBHUElPX0NUUkwtPlJFR1tURkRQX1BJTl8xXS53ID0gKDF1bCA8PCAxNik7DQogICAgICAgICAgICBHUElPX0NUUkwtPlJFR1tURkRQX1BJTl8yXS53ID0gKDF1bCA8PCAxNik7DQoNCiAgICAgICAgICAgIGRlbGF5ID0gMTI4Ow0KICAgICAgICAgICAgd2hpbGUgKCBkZWxheS0tICkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBDUFVfTk9QKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIEdQSU8gT3V0cHV0IGVuYWJsZWQgKGRyaXZlIGJhc2VkIG9uIGFib3ZlIHNldHRpbmdzKQ0KICAgICAgICAgICAgR1BJT19DVFJMLT5SRUdbVEZEUF9QSU5fMV0udyB8PSAoMXVsIDw8IDkpOw0KICAgICAgICAgICAgR1BJT19DVFJMLT5SRUdbVEZEUF9QSU5fMl0udyB8PSAoMXVsIDw8IDkpOw0KDQogICAgICAgICAgICBkZWxheSA9IDEyODsNCiAgICAgICAgICAgIHdoaWxlICggZGVsYXktLSApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQ1BVX05PUCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBTd2l0Y2ggdG8gRnVuY3Rpb24gMSAoVEZEUCBtb2RlIGJbMTM6MTJdPTAxYikNCiAgICAgICAgICAgIEdQSU9fQ1RSTC0+UkVHW1RGRFBfUElOXzFdLncgPSAoMXVsIDw8IDE2KSArICgxdWwgPDwgMTIpOw0KICAgICAgICAgICAgR1BJT19DVFJMLT5SRUdbVEZEUF9QSU5fMl0udyA9ICgxdWwgPDwgMTYpICsgKDF1bCA8PCAxMik7DQoNCiAgICAgICAgfQ0KICAgICAgICAvKiBiWzBdPTEoRW5hYmxlKQ0KICAgICAgICAgKiBiWzFdPTAoU2hpZnQgZGF0YSBvdXQgb24gcmlzaW5nIGVkZ2UpIA0KICAgICAgICAgKiBiWzM6Ml09MDBiIFRGRFAgc2hpZnQgY2xvY2tzID0gQUhCX0NMSy8yDQogICAgICAgICAqIGJbNjo0XT0wMDBiIDEgY2xvY2sgaW50ZXItcGFja2V0IGRlbGF5DQogICAgICAgICAqLw0KICAgICAgICBURkRQLT5DT05UUk9MID0gMHgwMXU7DQoNCiAgICB9IA0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIFRGRFAtPkNPTlRST0wgPSAweDAwdTsNCiAgICAgICAgaWYgKHBpbl9jZmcpIA0KICAgICAgICB7IC8qIFNldCB0byBQT1IgdmFsdWUgKHRyaS1zdGF0ZWQgaW5wdXQpICovDQogICAgICAgICAgICBHUElPX0NUUkwtPlJFR1tURkRQX1BJTl8xXS53ID0gMDsNCiAgICAgICAgICAgIEdQSU9fQ1RSTC0+UkVHW1RGRFBfUElOXzJdLncgPSAwOw0KICAgICAgICB9DQogICAgfQ0KfSAvLyBlbmQgdGZkcF9lbmFibGUoKQ0KDQoNCi8qKg0KICogVEZEUFRyYWNlMCAtIFRSQUNFMDogdHJhbnNtaXQgMTYtYml0IHRyYWNlIG51bWJlciBsc2IgZmlyc3QgDQogKiBvdmVyIFRGRFAuIA0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSBuYnIgMTYtYml0IHRyYWNlIG51bWJlciANCiAqIEBwYXJhbSBiIHVudXNlZA0KICogDQogKiBAcmV0dXJuIHVpbnQ4X3QgYWx3YXlzIFRSVUUgDQogKiBAbm90ZSBGdW5jdGlvbiBpbXBsZW1lbnRzIGNyaXRpY2FsIHNlY3Rpb24uIA0KICogVXNlcyB0b29sIGtpdCBfX2Rpc2FibGVfaXJxKCkvX19lbmFibGVfaXJxKCkgcGFpciB3aGljaCBtYXkgdXNlIA0KICogcHJpdmlsZWRnZWQgQ29ydGV4LU14IGluc3RydWN0aW9ucy4gDQogKi8NCnZvaWQgVEZEUFRyYWNlMCAoIHVpbnQxNl90IG5iciwgdWludDhfdCBiICkNCnsNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICB1aW50MzJfdCBpc2F2ZTsNCg0KICAgIGlzYXZlID0gbWlwczMycjJfZGlzX2ludHIoKTsNCiNlbmRpZg0KDQogICAgKHZvaWQpYjsNCiAgICB0ZmRwX3htaXRfaGVhZGVyKG5icik7DQoNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICAgbWlwczMycjJfcmVzdG9yZV9pbnRyKGlzYXZlKTsNCiNlbmRpZg0KfQ0KDQoNCi8qKg0KICogVFJEUFRyYWNlMSAtIFRSQUNFMTogdHJhbnNtaXQgMTYtYml0IHRyYWNlIG51bWJlciBsc2IgZmlyc3QgDQogKiBhbmQgMTYtYml0IGRhdGEgbHNiIGZpcnN0IG92ZXIgVEZEUC4gDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIG5iciAxNi1iaXQgdHJhY2UgbnVtYmVyIA0KICogQHBhcmFtIGIgdW51c2VkIA0KICogQHBhcmFtIHVpbnQzMl90IHAxIDE2LWJpdCBkYXRhMSBpbiBiWzE1OjBdDQogKiANCiAqIEByZXR1cm4gdWludDhfdCBhbHdheXMgVFJVRSANCiAqIEBub3RlIEZ1bmN0aW9uIGltcGxlbWVudHMgY3JpdGljYWwgc2VjdGlvbi4gDQogKiBVc2VzIHRvb2wga2l0IF9fZGlzYWJsZV9pcnEoKS9fX2VuYWJsZV9pcnEoKSBwYWlyIHdoaWNoIG1heSB1c2UgDQogKiBwcml2aWxlZGdlZCBDb3J0ZXgtTXggaW5zdHJ1Y3Rpb25zLiANCiAqLw0Kdm9pZCBURkRQVHJhY2UxICggdWludDE2X3QgbmJyLCB1aW50OF90IGIsIHVpbnQzMl90IHAxICkNCnsNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICB1aW50MzJfdCBpc2F2ZTsNCiAgICANCiAgICBpc2F2ZSA9IG1pcHMzMnIyX2Rpc19pbnRyKCk7DQojZW5kaWYNCiAgICAodm9pZCliOw0KICAgIHRmZHBfeG1pdF9oZWFkZXIobmJyKTsNCiAgICB0ZmRwX3htaXRfaHdvcmQocDEpOw0KDQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgbWlwczMycjJfcmVzdG9yZV9pbnRyKGlzYXZlKTsNCiNlbmRpZg0KfQ0KDQoNCi8qKg0KICogVEZEUFRyYWNlMiAtIFRSQUNFMjogdHJhbnNtaXQgMTYtYml0IHRyYWNlIG51bWJlciBsc2IgZmlyc3QgDQogKiBhbmQgdHdvIDE2LWJpdCBkYXRhIHBhcmFtZXRlcnMgbHNiIGZpcnN0IG92ZXIgVEZEUC4NCiAqIA0KICogQGF1dGhvciBzd29ybGV5IA0KICogDQogKiBAcGFyYW0gbmJyIHRyYWNlIG51bWJlcg0KICogQHBhcmFtIGIgdW51c2VkDQogKiBAcGFyYW0gdWludDMyX3QgcDEgMTYtYml0IGRhdGExIGluIGJbMTU6MF0NCiAqIEBwYXJhbSB1aW50MzJfdCBwMiAxNi1iaXQgZGF0YTIgaW4gYlsxNTowXQ0KICogDQogKiBAcmV0dXJuIHVpbnQ4X3QgYWx3YXlzIFRSVUUgDQogKiBAbm90ZSBVc2VzIHRvb2wga2l0IGZ1bmN0aW9ucyB0byBzYXZlL2Rpc2FibGUvcmVzdG9yZSANCiAqICAgICAgIGludGVycnVwdHMgZm9yIGNyaXRpY2FsIHNlY3Rpb24uIFRoZXNlIG1heSB1c2UNCiAqICAgICAgIHByaXZpbGVkZ2VkIGluc3RydWN0aW9ucy4NCiAqLw0Kdm9pZCBURkRQVHJhY2UyICggdWludDE2X3QgbmJyLCB1aW50OF90IGIsIHVpbnQzMl90IHAxLCB1aW50MzJfdCBwMiApDQp7DQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgdWludDMyX3QgaXNhdmU7DQogICAgDQogICAgaXNhdmUgPSBtaXBzMzJyMl9kaXNfaW50cigpOw0KI2VuZGlmDQogICAgKHZvaWQpYjsNCiAgICB0ZmRwX3htaXRfaGVhZGVyKG5icik7DQogICAgdGZkcF94bWl0X2h3b3JkKHAxKTsNCiAgICB0ZmRwX3htaXRfaHdvcmQocDIpOw0KDQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgbWlwczMycjJfcmVzdG9yZV9pbnRyKGlzYXZlKTsNCiNlbmRpZg0KfQ0KDQoNCi8qKg0KICogVEZEUFRyYWNlMyAtIFRSQUNFMzogdHJhbnNtaXQgMTYtYml0IHRyYWNlIG51bWJlciBsc2IgZmlyc3QgDQogKiBhbmQgdGhyZWUgMTYtYml0IGRhdGEgcGFyYW1ldGVycyBsc2IgZmlyc3Qgb3ZlciBURkRQLg0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSBuYnIgdHJhY2UgbnVtYmVyDQogKiBAcGFyYW0gYiB1bnVzZWQNCiAqIEBwYXJhbSB1aW50MzJfdCBwMSAxNi1iaXQgZGF0YTEgaW4gYlsxNTowXQ0KICogQHBhcmFtIHVpbnQzMl90IHAyIDE2LWJpdCBkYXRhMiBpbiBiWzE1OjBdDQogKiBAcGFyYW0gdWludDMyX3QgcDMgMTYtYml0IGRhdGEzIGluIGJbMTU6MF0NCiAqIA0KICogQHJldHVybiB1aW50OF90IGFsd2F5cyBUUlVFIA0KICogQG5vdGUgVXNlcyB0b29sIGtpdCBmdW5jdGlvbnMgdG8gc2F2ZS9kaXNhYmxlL3Jlc3RvcmUgDQogKiAgICAgICBpbnRlcnJ1cHRzIGZvciBjcml0aWNhbCBzZWN0aW9uLiBUaGVzZSBtYXkgdXNlDQogKiAgICAgICBwcml2aWxlZGdlZCBpbnN0cnVjdGlvbnMuIA0KICovDQp2b2lkIFRGRFBUcmFjZTMgKCB1aW50MTZfdCBuYnIsIHVpbnQ4X3QgYiwgdWludDMyX3QgcDEsIHVpbnQzMl90IHAyLCB1aW50MzJfdCBwMykNCnsNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICB1aW50MzJfdCBpc2F2ZTsNCiAgICANCiAgICBpc2F2ZSA9IG1pcHMzMnIyX2Rpc19pbnRyKCk7DQojZW5kaWYgIA0KICAgICh2b2lkKWI7DQogICAgdGZkcF94bWl0X2hlYWRlcihuYnIpOw0KICAgIHRmZHBfeG1pdF9od29yZChwMSk7DQogICAgdGZkcF94bWl0X2h3b3JkKHAyKTsNCiAgICB0ZmRwX3htaXRfaHdvcmQocDMpOw0KDQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgaWYgKCBpc2F2ZSAmICgxdWw8PDApICkNCiAgICB7DQogICAgICAgIG1pcHMzMnIyX2VuX2ludHIoKTsNCiAgICB9DQojZW5kaWYNCn0NCg0KDQovKioNCiAqIFRGRFBUcmFjZTQgLSBUUkFDRTM6IHRyYW5zbWl0IDE2LWJpdCB0cmFjZSBudW1iZXIgbHNiIGZpcnN0IA0KICogYW5kIGZvdXIgMTYtYml0IGRhdGEgcGFyYW1ldGVycyBsc2IgZmlyc3Qgb3ZlciBURkRQLg0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSBuYnIgdHJhY2UgbnVtYmVyDQogKiBAcGFyYW0gYiB1bnVzZWQNCiAqIEBwYXJhbSB1aW50MzJfdCBwMSAxNi1iaXQgZGF0YTEgaW4gYlsxNTowXQ0KICogQHBhcmFtIHVpbnQzMl90IHAyIDE2LWJpdCBkYXRhMiBpbiBiWzE1OjBdDQogKiBAcGFyYW0gdWludDMyX3QgcDMgMTYtYml0IGRhdGEzIGluIGJbMTU6MF0NCiAqIEBwYXJhbSB1aW50MzJfdCBwNCAxNi1iaXQgZGF0YTQgaW4gYlsxNTowXQ0KICogDQogKiBAcmV0dXJuIHVpbnQ4X3QgYWx3YXlzIFRSVUUgDQogKiBAbm90ZSBVc2VzIHRvb2wga2l0IGZ1bmN0aW9ucyB0byBzYXZlL2Rpc2FibGUvcmVzdG9yZSANCiAqICAgICAgIGludGVycnVwdHMgZm9yIGNyaXRpY2FsIHNlY3Rpb24uIFRoZXNlIG1heSB1c2UNCiAqICAgICAgIHByaXZpbGVkZ2VkIGluc3RydWN0aW9ucy4gDQogKi8NCnZvaWQgVEZEUFRyYWNlNCAoIHVpbnQxNl90IG5iciwgdWludDhfdCBiLCB1aW50MzJfdCBwMSwgdWludDMyX3QgcDIsIHVpbnQzMl90IHAzLCB1aW50MzJfdCBwNCkNCnsNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICB1aW50MzJfdCBpc2F2ZTsNCiAgICANCiAgICBpc2F2ZSA9IG1pcHMzMnIyX2Rpc19pbnRyKCk7DQojZW5kaWYNCiAgICAodm9pZCliOw0KICAgIHRmZHBfeG1pdF9oZWFkZXIobmJyKTsNCiAgICB0ZmRwX3htaXRfaHdvcmQocDEpOw0KICAgIHRmZHBfeG1pdF9od29yZChwMik7DQogICAgdGZkcF94bWl0X2h3b3JkKHAzKTsNCiAgICB0ZmRwX3htaXRfaHdvcmQocDQpOw0KICAgICAgDQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgaWYgKCBpc2F2ZSAmICgxdWw8PDApICkNCiAgICB7DQogICAgICAgIG1pcHMzMnIyX2VuX2ludHIoKTsNCiAgICB9DQojZW5kaWYNCn0NCg0KDQovKiogDQogKiAgVEZEUFRyYWNlMTEgLSBUcmFuc21pdCBvbmUgMzItYml0IGRhdGEgaXRlbSBvdmVyIFRGRFAgDQogKiANCiAqICBAcGFyYW0gbmJyIHRyYWNlIG51bWJlcg0KICogIEBwYXJhbSBiIHVudXNlZCANCiAqICBAcGFyYW0gdWludDMyX3QgcDEgMzItYml0IGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQNCiAqIA0KICovDQp2b2lkIFRGRFBUcmFjZTExKCB1aW50MTZfdCBuYnIsIHVpbnQ4X3QgYiwgdWludDMyX3QgcDEpDQp7DQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgdWludDMyX3QgaXNhdmU7DQogICAgDQogICAgaXNhdmUgPSBtaXBzMzJyMl9kaXNfaW50cigpOw0KI2VuZGlmICANCiAgICAodm9pZCliOw0KICAgIHRmZHBfeG1pdF9oZWFkZXIobmJyKTsNCiAgICB0ZmRwX3htaXRfd29yZChwMSk7DQogICAgDQojaWZkZWYgRU5BQkxFX1RSQUNFX01BU0tfSVJRDQogICAgaWYgKCBpc2F2ZSAmICgxdWw8PDApICkNCiAgICB7DQogICAgICAgIG1pcHMzMnIyX2VuX2ludHIoKTsNCiAgICB9DQojZW5kaWYNCn0NCg0KDQovKiogDQogKiAgVEZEUFRyYWNlMTIgLSBUcmFuc21pdCB0d28gMzItYml0IGRhdGEgaXRlbXMgb3ZlciBURkRQIA0KICogDQogKiAgQHBhcmFtIG5iciB0cmFjZSBudW1iZXINCiAqICBAcGFyYW0gYiB1bnVzZWQgDQogKiAgQHBhcmFtIHVpbnQzMl90IHAxIDMyLWJpdCBkYXRhMSB0byBiZSB0cmFuc21pdHRlZA0KICogIEBwYXJhbSB1aW50MzJfdCBwMiAzMi1iaXQgZGF0YTIgdG8gYmUgdHJhbnNtaXR0ZWQNCiAqIA0KICovDQp2b2lkIFRGRFBUcmFjZTEyKCB1aW50MTZfdCBuYnIsIHVpbnQ4X3QgYiwgdWludDMyX3QgcDEsIHVpbnQzMl90IHAyICkNCnsNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICB1aW50MzJfdCBpc2F2ZTsNCiAgICANCiAgICBpc2F2ZSA9IG1pcHMzMnIyX2Rpc19pbnRyKCk7DQojZW5kaWYgIA0KICAgICh2b2lkKWI7DQogICAgdGZkcF94bWl0X2hlYWRlcihuYnIpOw0KICAgIHRmZHBfeG1pdF93b3JkKHAxKTsNCiAgICB0ZmRwX3htaXRfd29yZChwMik7DQoNCiNpZmRlZiBFTkFCTEVfVFJBQ0VfTUFTS19JUlENCiAgICBpZiAoIGlzYXZlICYgKDF1bDw8MCkgKQ0KICAgIHsNCiAgICAgICAgbWlwczMycjJfZW5faW50cigpOw0KICAgIH0NCiNlbmRpZg0KfQ0KDQojZW5kaWYgLy8gI2lmZGVmIEVOQUJMRV9URkRQX1RSQUNFDQoNCg0KLyogZW5kIG1lYzE0eHhfdGZkcC5jICovDQovKiogICBAfQ0KICovDQo=