LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9jYW4uYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIENBTiBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfY2FuLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIENBTiANCiAgKiBAYnJpZWYgQ0FOIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfRGVmaW5lcw0KICAqIEB7DQogICovDQoNCi8qIENBTiBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQoNCiNkZWZpbmUgTUNSX0RCRiAgICAgICgodWludDMyX3QpMHgwMDAxMDAwMCkgLyogc29mdHdhcmUgbWFzdGVyIHJlc2V0ICovDQoNCi8qIENBTiBNYWlsYm94IFRyYW5zbWl0IFJlcXVlc3QgKi8NCiNkZWZpbmUgVE1JRHhSX1RYUlEgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyogVHJhbnNtaXQgbWFpbGJveCByZXF1ZXN0ICovDQoNCi8qIENBTiBGaWx0ZXIgTWFzdGVyIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgRk1SX0ZJTklUICAgICgodWludDMyX3QpMHgwMDAwMDAwMSkgLyogRmlsdGVyIGluaXQgbW9kZSAqLw0KDQovKiBUaW1lIG91dCBmb3IgSU5BSyBiaXQgKi8NCiNkZWZpbmUgSU5BS19USU1FT1VUICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkYpDQovKiBUaW1lIG91dCBmb3IgU0xBSyBiaXQgKi8NCiNkZWZpbmUgU0xBS19USU1FT1VUICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkYpDQoNCg0KDQovKiBGbGFncyBpbiBUU1IgcmVnaXN0ZXIgKi8NCiNkZWZpbmUgQ0FOX0ZMQUdTX1RTUiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA4MDAwMDAwKSANCi8qIEZsYWdzIGluIFJGMVIgcmVnaXN0ZXIgKi8NCiNkZWZpbmUgQ0FOX0ZMQUdTX1JGMVIgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA0MDAwMDAwKSANCi8qIEZsYWdzIGluIFJGMFIgcmVnaXN0ZXIgKi8NCiNkZWZpbmUgQ0FOX0ZMQUdTX1JGMFIgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwKSANCi8qIEZsYWdzIGluIE1TUiByZWdpc3RlciAqLw0KI2RlZmluZSBDQU5fRkxBR1NfTVNSICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDEwMDAwMDApIA0KLyogRmxhZ3MgaW4gRVNSIHJlZ2lzdGVyICovDQojZGVmaW5lIENBTl9GTEFHU19FU1IgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMEYwMDAwMCkgDQoNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9NYWNyb3MNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIENBTl9Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgQ0FOX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQogICogQHsNCiAgKi8NCg0Kc3RhdGljIElUU3RhdHVzIENoZWNrSVRTdGF0dXModWludDMyX3QgQ0FOX1JlZywgdWludDMyX3QgSXRfQml0KTsNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBDQU5fUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX0RlSW5pdChDQU5fVHlwZURlZiogQ0FOeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCiANCiAgaWYgKENBTnggPT0gQ0FOMSkNCiAgew0KICAgIC8qIEVuYWJsZSBDQU4xIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DQU4xLCBFTkFCTEUpOw0KICAgIC8qIFJlbGVhc2UgQ0FOMSBmcm9tIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DQU4xLCBESVNBQkxFKTsNCiAgfQ0KICBlbHNlDQogIHsgIA0KICAgIC8qIEVuYWJsZSBDQU4yIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DQU4yLCBFTkFCTEUpOw0KICAgIC8qIFJlbGVhc2UgQ0FOMiBmcm9tIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9DQU4yLCBESVNBQkxFKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDQU4gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgQ0FOX0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENBTl9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQogICogICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ29uc3RhbnQgaW5kaWNhdGVzIGluaXRpYWxpemF0aW9uIHN1Y2NlZWQgd2hpY2ggd2lsbCBiZSANCiAgKiAgIENBTklOSVRGQUlMRUQgb3IgQ0FOSU5JVE9LLg0KICAqLw0KdWludDhfdCBDQU5fSW5pdChDQU5fVHlwZURlZiogQ0FOeCwgQ0FOX0luaXRUeXBlRGVmKiBDQU5fSW5pdFN0cnVjdCkNCnsNCiAgdWludDhfdCBJbml0U3RhdHVzID0gQ0FOSU5JVEZBSUxFRDsNCiAgdWludDMyX3Qgd2FpdF9hY2sgPSAweDAwMDAwMDAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX1RUQ00pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BQk9NKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fQVdVTSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX05BUlQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9SRkxNKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX01PREUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fU0pXKENBTl9Jbml0U3RydWN0LT5DQU5fU0pXKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fQlMxKENBTl9Jbml0U3RydWN0LT5DQU5fQlMxKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fQlMyKENBTl9Jbml0U3RydWN0LT5DQU5fQlMyKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fUFJFU0NBTEVSKENBTl9Jbml0U3RydWN0LT5DQU5fUHJlc2NhbGVyKSk7DQoNCiAgLyogZXhpdCBmcm9tIHNsZWVwIG1vZGUgKi8NCiAgQ0FOeC0+TUNSICY9ICh+KHVpbnQzMl90KUNBTl9NQ1JfU0xFRVApOw0KDQogIC8qIFJlcXVlc3QgaW5pdGlhbGlzYXRpb24gKi8NCiAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfSU5SUSA7DQoNCiAgLyogV2FpdCB0aGUgYWNrbm93bGVkZ2UgKi8NCiAgd2hpbGUgKCgoQ0FOeC0+TVNSICYgQ0FOX01TUl9JTkFLKSAhPSBDQU5fTVNSX0lOQUspICYmICh3YWl0X2FjayAhPSBJTkFLX1RJTUVPVVQpKQ0KICB7DQogICAgd2FpdF9hY2srKzsNCiAgfQ0KDQogIC8qIC4uLmFuZCBjaGVjayBhY2tub3dsZWRnZWQgKi8NCiAgaWYgKChDQU54LT5NU1IgJiBDQU5fTVNSX0lOQUspICE9IENBTl9NU1JfSU5BSykNCiAgew0KICAgIEluaXRTdGF0dXMgPSBDQU5JTklURkFJTEVEOw0KICB9DQogIGVsc2UgDQogIHsNCiAgICAvKiBTZXQgdGhlIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gbW9kZSAqLw0KICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1RUQ00gPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIENBTngtPk1DUiB8PSBDQU5fTUNSX1RUQ007DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU54LT5NQ1IgJj0gfih1aW50MzJfdClDQU5fTUNSX1RUQ007DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSBhdXRvbWF0aWMgYnVzLW9mZiBtYW5hZ2VtZW50ICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fQUJPTSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfQUJPTTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfQUJPTTsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8NCiAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNID09IEVOQUJMRSkNCiAgICB7DQogICAgICBDQU54LT5NQ1IgfD0gQ0FOX01DUl9BV1VNOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOeC0+TUNSICY9IH4odWludDMyX3QpQ0FOX01DUl9BV1VNOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgbm8gYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fTkFSVCA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfTkFSVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfTkFSVDsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIHJlY2VpdmUgRklGTyBsb2NrZWQgbW9kZSAqLw0KICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1JGTE0gPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIENBTngtPk1DUiB8PSBDQU5fTUNSX1JGTE07DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU54LT5NQ1IgJj0gfih1aW50MzJfdClDQU5fTUNSX1JGTE07DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOeC0+TUNSIHw9IENBTl9NQ1JfVFhGUDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTngtPk1DUiAmPSB+KHVpbnQzMl90KUNBTl9NQ1JfVFhGUDsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIGJpdCB0aW1pbmcgcmVnaXN0ZXIgKi8NCiAgICBDQU54LT5CVFIgPSAodWludDMyX3QpKCh1aW50MzJfdClDQU5fSW5pdFN0cnVjdC0+Q0FOX01vZGUgPDwgMzApIHwgKCh1aW50MzJfdClDQU5fSW5pdFN0cnVjdC0+Q0FOX1NKVyA8PCAyNCkgfA0KICAgICAgICAgICAgICAgKCh1aW50MzJfdClDQU5fSW5pdFN0cnVjdC0+Q0FOX0JTMSA8PCAxNikgfCAoKHVpbnQzMl90KUNBTl9Jbml0U3RydWN0LT5DQU5fQlMyIDw8IDIwKSB8DQogICAgICAgICAgICAgICAoKHVpbnQzMl90KUNBTl9Jbml0U3RydWN0LT5DQU5fUHJlc2NhbGVyIC0gMSk7DQoNCiAgICAvKiBSZXF1ZXN0IGxlYXZlIGluaXRpYWxpc2F0aW9uICovDQogICAgQ0FOeC0+TUNSICY9IH4odWludDMyX3QpQ0FOX01DUl9JTlJROw0KDQogICAvKiBXYWl0IHRoZSBhY2tub3dsZWRnZSAqLw0KICAgd2FpdF9hY2sgPSAweDAwOw0KDQogICB3aGlsZSAoKChDQU54LT5NU1IgJiBDQU5fTVNSX0lOQUspID09IENBTl9NU1JfSU5BSykgJiYgKHdhaXRfYWNrICE9IElOQUtfVElNRU9VVCkpDQogICB7DQogICAgIHdhaXRfYWNrKys7DQogICB9DQoNCiAgICAvKiAuLi5hbmQgY2hlY2sgYWNrbm93bGVkZ2VkICovDQogICAgaWYgKChDQU54LT5NU1IgJiBDQU5fTVNSX0lOQUspID09IENBTl9NU1JfSU5BSykNCiAgICB7DQogICAgICBJbml0U3RhdHVzID0gQ0FOSU5JVEZBSUxFRDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIEluaXRTdGF0dXMgPSBDQU5JTklUT0sgOw0KICAgIH0NCiAgfQ0KDQogIC8qIEF0IHRoaXMgc3RlcCwgcmV0dXJuIHRoZSBzdGF0dXMgb2YgaW5pdGlhbGl6YXRpb24gKi8NCiAgcmV0dXJuIEluaXRTdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBDQU5fRmlsdGVySW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gIENBTl9GaWx0ZXJJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQ0FOX0ZpbHRlckluaXRUeXBlRGVmDQogICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIENBTl9GaWx0ZXJJbml0KENBTl9GaWx0ZXJJbml0VHlwZURlZiogQ0FOX0ZpbHRlckluaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IGZpbHRlcl9udW1iZXJfYml0X3BvcyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX05VTUJFUihDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcikpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9NT0RFKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJTFRFUl9TQ0FMRShDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlclNjYWxlKSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fRklMVEVSX0ZJRk8oQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJGSUZPQXNzaWdubWVudCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckFjdGl2YXRpb24pKTsNCg0KICBmaWx0ZXJfbnVtYmVyX2JpdF9wb3MgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDEpIDw8IENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTnVtYmVyOw0KDQogIC8qIEluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgQ0FOMS0+Rk1SIHw9IEZNUl9GSU5JVDsNCg0KICAvKiBGaWx0ZXIgRGVhY3RpdmF0aW9uICovDQogIENBTjEtPkZBMVIgJj0gfih1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQoNCiAgLyogRmlsdGVyIFNjYWxlICovDQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlclNjYWxlID09IENBTl9GaWx0ZXJTY2FsZV8xNmJpdCkNCiAgew0KICAgIC8qIDE2LWJpdCBzY2FsZSBmb3IgdGhlIGZpbHRlciAqLw0KICAgIENBTjEtPkZTMVIgJj0gfih1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQoNCiAgICAvKiBGaXJzdCAxNi1iaXQgaWRlbnRpZmllciBhbmQgRmlyc3QgMTYtYml0IG1hc2sgKi8NCiAgICAvKiBPciBGaXJzdCAxNi1iaXQgaWRlbnRpZmllciBhbmQgU2Vjb25kIDE2LWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOMS0+c0ZpbHRlclJlZ2lzdGVyW0NBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTnVtYmVyXS5GUjEgPSANCiAgICAoKDB4MDAwMEZGRkYgJiAodWludDMyX3QpQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNYXNrSWRMb3cpIDw8IDE2KSB8DQogICAgICAgICgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRMb3cpOw0KDQogICAgLyogU2Vjb25kIDE2LWJpdCBpZGVudGlmaWVyIGFuZCBTZWNvbmQgMTYtYml0IG1hc2sgKi8NCiAgICAvKiBPciBUaGlyZCAxNi1iaXQgaWRlbnRpZmllciBhbmQgRm91cnRoIDE2LWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOMS0+c0ZpbHRlclJlZ2lzdGVyW0NBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTnVtYmVyXS5GUjIgPSANCiAgICAoKDB4MDAwMEZGRkYgJiAodWludDMyX3QpQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNYXNrSWRIaWdoKSA8PCAxNikgfA0KICAgICAgICAoMHgwMDAwRkZGRiAmICh1aW50MzJfdClDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkSGlnaCk7DQogIH0NCg0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMzJiaXQpDQogIHsNCiAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgICBDQU4xLT5GUzFSIHw9IGZpbHRlcl9udW1iZXJfYml0X3BvczsNCiAgICAvKiAzMi1iaXQgaWRlbnRpZmllciBvciBGaXJzdCAzMi1iaXQgaWRlbnRpZmllciAqLw0KICAgIENBTjEtPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIxID0gDQogICAgKCgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRIaWdoKSA8PCAxNikgfA0KICAgICAgICAoMHgwMDAwRkZGRiAmICh1aW50MzJfdClDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkTG93KTsNCiAgICAvKiAzMi1iaXQgbWFzayBvciBTZWNvbmQgMzItYml0IGlkZW50aWZpZXIgKi8NCiAgICBDQU4xLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMiA9IA0KICAgICgoMHgwMDAwRkZGRiAmICh1aW50MzJfdClDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1hc2tJZEhpZ2gpIDw8IDE2KSB8DQogICAgICAgICgweDAwMDBGRkZGICYgKHVpbnQzMl90KUNBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkTG93KTsNCiAgfQ0KDQogIC8qIEZpbHRlciBNb2RlICovDQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUgPT0gQ0FOX0ZpbHRlck1vZGVfSWRNYXNrKQ0KICB7DQogICAgLypJZC9NYXNrIG1vZGUgZm9yIHRoZSBmaWx0ZXIqLw0KICAgIENBTjEtPkZNMVIgJj0gfih1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQogIH0NCiAgZWxzZSAvKiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUgPT0gQ0FOX0ZpbHRlck1vZGVfSWRMaXN0ICovDQogIHsNCiAgICAvKklkZW50aWZpZXIgbGlzdCBtb2RlIGZvciB0aGUgZmlsdGVyKi8NCiAgICBDQU4xLT5GTTFSIHw9ICh1aW50MzJfdClmaWx0ZXJfbnVtYmVyX2JpdF9wb3M7DQogIH0NCg0KICAvKiBGaWx0ZXIgRklGTyBhc3NpZ25tZW50ICovDQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50ID09IENBTl9GaWx0ZXJGSUZPMCkNCiAgew0KICAgIC8qIEZJRk8gMCBhc3NpZ25hdGlvbiBmb3IgdGhlIGZpbHRlciAqLw0KICAgIENBTjEtPkZGQTFSICY9IH4odWludDMyX3QpZmlsdGVyX251bWJlcl9iaXRfcG9zOw0KICB9DQoNCiAgaWYgKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyRklGT0Fzc2lnbm1lbnQgPT0gQ0FOX0ZpbHRlckZJRk8xKQ0KICB7DQogICAgLyogRklGTyAxIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovDQogICAgQ0FOMS0+RkZBMVIgfD0gKHVpbnQzMl90KWZpbHRlcl9udW1iZXJfYml0X3BvczsNCiAgfQ0KICANCiAgLyogRmlsdGVyIGFjdGl2YXRpb24gKi8NCiAgaWYgKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyQWN0aXZhdGlvbiA9PSBFTkFCTEUpDQogIHsNCiAgICBDQU4xLT5GQTFSIHw9IGZpbHRlcl9udW1iZXJfYml0X3BvczsNCiAgfQ0KDQogIC8qIExlYXZlIHRoZSBpbml0aWFsaXNhdGlvbiBtb2RlIGZvciB0aGUgZmlsdGVyICovDQogIENBTjEtPkZNUiAmPSB+Rk1SX0ZJTklUOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggQ0FOX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBDQU5fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIENBTl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiAgKiAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lLg0KICAqLw0Kdm9pZCBDQU5fU3RydWN0SW5pdChDQU5fSW5pdFR5cGVEZWYqIENBTl9Jbml0U3RydWN0KQ0Kew0KICAvKiBSZXNldCBDQU4gaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgLyogSW5pdGlhbGl6ZSB0aGUgdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbiBtb2RlICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9IERJU0FCTEU7DQogIC8qIEluaXRpYWxpemUgdGhlIGF1dG9tYXRpYyBidXMtb2ZmIG1hbmFnZW1lbnQgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BQk9NID0gRElTQUJMRTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0b21hdGljIHdha2UtdXAgbW9kZSAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX0FXVU0gPSBESVNBQkxFOw0KICAvKiBJbml0aWFsaXplIHRoZSBubyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID0gRElTQUJMRTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBGSUZPIGxvY2tlZCBtb2RlICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fUkZMTSA9IERJU0FCTEU7DQogIC8qIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IEZJRk8gcHJpb3JpdHkgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9UWEZQID0gRElTQUJMRTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX01vZGUgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fTW9kZSA9IENBTl9Nb2RlX05vcm1hbDsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX1NKVyBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9TSlcgPSBDQU5fU0pXXzF0cTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX0JTMSBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzEgPSBDQU5fQlMxXzR0cTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX0JTMiBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIgPSBDQU5fQlMyXzN0cTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX1ByZXNjYWxlciBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9QcmVzY2FsZXIgPSAxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgc3RhcnQgYmFuayBmaWx0ZXIgZm9yIHNsYXZlIENBTi4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIFNUTTMyIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXMuDQogICogQHBhcmFtICBDQU5fQmFua051bWJlcjogU2VsZWN0IHRoZSBzdGFydCBzbGF2ZSBiYW5rIGZpbHRlciBmcm9tIDEuLjI3Lg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX1NsYXZlU3RhcnRCYW5rKHVpbnQ4X3QgQ0FOX0JhbmtOdW1iZXIpIA0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0JBTktOVU1CRVIoQ0FOX0JhbmtOdW1iZXIpKTsNCiAgLyogZW50ZXIgSW5pdGlhbGlzYXRpb24gbW9kZSBmb3IgdGhlIGZpbHRlciAqLw0KICBDQU4xLT5GTVIgfD0gRk1SX0ZJTklUOw0KICAvKiBTZWxlY3QgdGhlIHN0YXJ0IHNsYXZlIGJhbmsgKi8NCiAgQ0FOMS0+Rk1SICY9ICh1aW50MzJfdCkweEZGRkZDMEYxIDsNCiAgQ0FOMS0+Rk1SIHw9ICh1aW50MzJfdCkoQ0FOX0JhbmtOdW1iZXIpPDw4Ow0KICAvKiBMZWF2ZSBJbml0aWFsaXNhdGlvbiBtb2RlIGZvciB0aGUgZmlsdGVyICovDQogIENBTjEtPkZNUiAmPSB+Rk1SX0ZJTklUOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBDQU54IGludGVycnVwdHMuDQogICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENBTl9JVDogc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogDQogICogICAgICAgIC1DQU5fSVRfVE1FLCANCiAgKiAgICAgICAgLUNBTl9JVF9GTVAwLCANCiAgKiAgICAgICAgLUNBTl9JVF9GRjAsDQogICogICAgICAgIC1DQU5fSVRfRk9WMCwgDQogICogICAgICAgIC1DQU5fSVRfRk1QMSwgDQogICogICAgICAgIC1DQU5fSVRfRkYxLA0KICAqICAgICAgICAtQ0FOX0lUX0ZPVjEsIA0KICAqICAgICAgICAtQ0FOX0lUX0VXRywgDQogICogICAgICAgIC1DQU5fSVRfRVBWLA0KICAqICAgICAgICAtQ0FOX0lUX0xFQywgDQogICogICAgICAgIC1DQU5fSVRfRVJSLCANCiAgKiAgICAgICAgLUNBTl9JVF9XS1Ugb3IgDQogICogICAgICAgIC1DQU5fSVRfU0xLLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX0lUQ29uZmlnKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9JVChDQU5fSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQ0FOeCBpbnRlcnJ1cHQgKi8NCiAgICBDQU54LT5JRVIgfD0gQ0FOX0lUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIENBTnggaW50ZXJydXB0ICovDQogICAgQ0FOeC0+SUVSICY9IH5DQU5fSVQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWF0ZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIG1lc3NhZ2UuDQogICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFR4TWVzc2FnZTogcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBDQU4gSWQsIENBTg0KICAqICAgRExDIGFuZCBDQU4gZGF0YXMuDQogICogQHJldHZhbCBUaGUgbnVtYmVyIG9mIHRoZSBtYWlsYm94IHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uDQogICogICBvciBDQU5fTk9fTUIgaWYgdGhlcmUgaXMgbm8gZW1wdHkgbWFpbGJveC4NCiAgKi8NCnVpbnQ4X3QgQ0FOX1RyYW5zbWl0KENBTl9UeXBlRGVmKiBDQU54LCBDYW5UeE1zZyogVHhNZXNzYWdlKQ0Kew0KICB1aW50OF90IHRyYW5zbWl0X21haWxib3ggPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0lEVFlQRShUeE1lc3NhZ2UtPklERSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1JUUihUeE1lc3NhZ2UtPlJUUikpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0RMQyhUeE1lc3NhZ2UtPkRMQykpOw0KDQogIC8qIFNlbGVjdCBvbmUgZW1wdHkgdHJhbnNtaXQgbWFpbGJveCAqLw0KICBpZiAoKENBTngtPlRTUiZDQU5fVFNSX1RNRTApID09IENBTl9UU1JfVE1FMCkNCiAgew0KICAgIHRyYW5zbWl0X21haWxib3ggPSAwOw0KICB9DQogIGVsc2UgaWYgKChDQU54LT5UU1ImQ0FOX1RTUl9UTUUxKSA9PSBDQU5fVFNSX1RNRTEpDQogIHsNCiAgICB0cmFuc21pdF9tYWlsYm94ID0gMTsNCiAgfQ0KICBlbHNlIGlmICgoQ0FOeC0+VFNSJkNBTl9UU1JfVE1FMikgPT0gQ0FOX1RTUl9UTUUyKQ0KICB7DQogICAgdHJhbnNtaXRfbWFpbGJveCA9IDI7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgdHJhbnNtaXRfbWFpbGJveCA9IENBTl9OT19NQjsNCiAgfQ0KDQogIGlmICh0cmFuc21pdF9tYWlsYm94ICE9IENBTl9OT19NQikNCiAgew0KICAgIC8qIFNldCB1cCB0aGUgSWQgKi8NCiAgICBDQU54LT5zVHhNYWlsQm94W3RyYW5zbWl0X21haWxib3hdLlRJUiAmPSBUTUlEeFJfVFhSUTsNCiAgICBpZiAoVHhNZXNzYWdlLT5JREUgPT0gQ0FOX0lEX1NURCkNCiAgICB7DQogICAgICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1NURElEKFR4TWVzc2FnZS0+U3RkSWQpKTsgIA0KICAgICAgQ0FOeC0+c1R4TWFpbEJveFt0cmFuc21pdF9tYWlsYm94XS5USVIgfD0gKChUeE1lc3NhZ2UtPlN0ZElkIDw8IDIxKSB8IFR4TWVzc2FnZS0+UlRSKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGFzc2VydF9wYXJhbShJU19DQU5fRVhUSUQoVHhNZXNzYWdlLT5FeHRJZCkpOw0KICAgICAgQ0FOeC0+c1R4TWFpbEJveFt0cmFuc21pdF9tYWlsYm94XS5USVIgfD0gKChUeE1lc3NhZ2UtPkV4dElkPDwzKSB8IFR4TWVzc2FnZS0+SURFIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4TWVzc2FnZS0+UlRSKTsNCiAgICB9DQogICAgDQoNCiAgICAvKiBTZXQgdXAgdGhlIERMQyAqLw0KICAgIFR4TWVzc2FnZS0+RExDICY9ICh1aW50OF90KTB4MDAwMDAwMEY7DQogICAgQ0FOeC0+c1R4TWFpbEJveFt0cmFuc21pdF9tYWlsYm94XS5URFRSICY9ICh1aW50MzJfdCkweEZGRkZGRkYwOw0KICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVERUUiB8PSBUeE1lc3NhZ2UtPkRMQzsNCg0KICAgIC8qIFNldCB1cCB0aGUgZGF0YSBmaWVsZCAqLw0KICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVERMUiA9ICgoKHVpbnQzMl90KVR4TWVzc2FnZS0+RGF0YVszXSA8PCAyNCkgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVHhNZXNzYWdlLT5EYXRhWzJdIDw8IDE2KSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVR4TWVzc2FnZS0+RGF0YVsxXSA8PCA4KSB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbMF0pKTsNCiAgICBDQU54LT5zVHhNYWlsQm94W3RyYW5zbWl0X21haWxib3hdLlRESFIgPSAoKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbN10gPDwgMjQpIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVR4TWVzc2FnZS0+RGF0YVs2XSA8PCAxNikgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbNV0gPDwgOCkgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClUeE1lc3NhZ2UtPkRhdGFbNF0pKTsNCiAgICAvKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiAqLw0KICAgIENBTngtPnNUeE1haWxCb3hbdHJhbnNtaXRfbWFpbGJveF0uVElSIHw9IFRNSUR4Ul9UWFJROw0KICB9DQogIHJldHVybiB0cmFuc21pdF9tYWlsYm94Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgbWVzc2FnZS4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVHJhbnNtaXRNYWlsYm94OiB0aGUgbnVtYmVyIG9mIHRoZSBtYWlsYm94IHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLg0KICAqIEByZXR2YWwgQ0FOVFhPSyBpZiB0aGUgQ0FOIGRyaXZlciB0cmFuc21pdHMgdGhlIG1lc3NhZ2UsIENBTlRYRkFJTEVEIGluIGFuIG90aGVyIGNhc2UuDQogICovDQp1aW50OF90IENBTl9UcmFuc21pdFN0YXR1cyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBUcmFuc21pdE1haWxib3gpDQp7DQogIC8qIFJRQ1AsIFRYT0sgYW5kIFRNRSBiaXRzICovDQogIHVpbnQ4X3Qgc3RhdGUgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX1RSQU5TTUlUTUFJTEJPWChUcmFuc21pdE1haWxib3gpKTsNCiAgc3dpdGNoIChUcmFuc21pdE1haWxib3gpDQogIHsNCiAgICBjYXNlICgwKTogc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1JRQ1AwKSA8PCAyKTsNCiAgICAgIHN0YXRlIHw9ICh1aW50OF90KSgoQ0FOeC0+VFNSICYgQ0FOX1RTUl9UWE9LMCkgPj4gMCk7DQogICAgICBzdGF0ZSB8PSAodWludDhfdCkoKENBTngtPlRTUiAmIENBTl9UU1JfVE1FMCkgPj4gMjYpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAoMSk6IHN0YXRlIHw9ICh1aW50OF90KSgoQ0FOeC0+VFNSICYgQ0FOX1RTUl9SUUNQMSkgPj4gNik7DQogICAgICBzdGF0ZSB8PSAodWludDhfdCkoKENBTngtPlRTUiAmIENBTl9UU1JfVFhPSzEpID4+IDgpOw0KICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RNRTEpID4+IDI3KTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBzdGF0ZSB8PSAodWludDhfdCkoKENBTngtPlRTUiAmIENBTl9UU1JfUlFDUDIpID4+IDE0KTsNCiAgICAgIHN0YXRlIHw9ICh1aW50OF90KSgoQ0FOeC0+VFNSICYgQ0FOX1RTUl9UWE9LMikgPj4gMTYpOw0KICAgICAgc3RhdGUgfD0gKHVpbnQ4X3QpKChDQU54LT5UU1IgJiBDQU5fVFNSX1RNRTIpID4+IDI4KTsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBzdGF0ZSA9IENBTlRYRkFJTEVEOw0KICAgICAgYnJlYWs7DQogIH0NCiAgc3dpdGNoIChzdGF0ZSkNCiAgew0KICAgICAgLyogdHJhbnNtaXQgcGVuZGluZyAgKi8NCiAgICBjYXNlICgweDApOiBzdGF0ZSA9IENBTlRYUEVORElORzsNCiAgICAgIGJyZWFrOw0KICAgICAgLyogdHJhbnNtaXQgZmFpbGVkICAqLw0KICAgIGNhc2UgKDB4NSk6IHN0YXRlID0gQ0FOVFhGQUlMRUQ7DQogICAgICBicmVhazsNCiAgICAgIC8qIHRyYW5zbWl0IHN1Y2NlZGVlZCAgKi8NCiAgICBjYXNlICgweDcpOiBzdGF0ZSA9IENBTlRYT0s7DQogICAgICBicmVhazsNCiAgICBkZWZhdWx0Og0KICAgICAgc3RhdGUgPSBDQU5UWEZBSUxFRDsNCiAgICAgIGJyZWFrOw0KICB9DQogIHJldHVybiBzdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDYW5jZWxzIGEgdHJhbnNtaXQgcmVxdWVzdC4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLiANCiAgKiBAcGFyYW0gIE1haWxib3g6IE1haWxib3ggbnVtYmVyLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX0NhbmNlbFRyYW5zbWl0KENBTl9UeXBlRGVmKiBDQU54LCB1aW50OF90IE1haWxib3gpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fVFJBTlNNSVRNQUlMQk9YKE1haWxib3gpKTsNCiAgLyogYWJvcnQgdHJhbnNtaXNzaW9uICovDQogIHN3aXRjaCAoTWFpbGJveCkNCiAgew0KICAgIGNhc2UgKDApOiBDQU54LT5UU1IgfD0gQ0FOX1RTUl9BQlJRMDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDEpOiBDQU54LT5UU1IgfD0gQ0FOX1RTUl9BQlJRMTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBDQU54LT5UU1IgfD0gQ0FOX1RTUl9BQlJRMjsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlbGVhc2VzIGEgRklGTy4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLiANCiAgKiBAcGFyYW0gIEZJRk9OdW1iZXI6IEZJRk8gdG8gcmVsZWFzZSwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIENBTl9GSUZPUmVsZWFzZShDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBGSUZPTnVtYmVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJRk8oRklGT051bWJlcikpOw0KICAvKiBSZWxlYXNlIEZJRk8wICovDQogIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMCkNCiAgew0KICAgIENBTngtPlJGMFIgfD0gQ0FOX1JGMFJfUkZPTTA7DQogIH0NCiAgLyogUmVsZWFzZSBGSUZPMSAqLw0KICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovDQogIHsNCiAgICBDQU54LT5SRjFSIHw9IENBTl9SRjFSX1JGT00xOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgbWVzc2FnZXMuDQogICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEZJRk9OdW1iZXI6IFJlY2VpdmUgRklGTyBudW1iZXIsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuDQogICogQHJldHZhbCBOYk1lc3NhZ2Ugd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwZW5kaW5nIG1lc3NhZ2UuDQogICovDQp1aW50OF90IENBTl9NZXNzYWdlUGVuZGluZyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDhfdCBGSUZPTnVtYmVyKQ0Kew0KICB1aW50OF90IG1lc3NhZ2VfcGVuZGluZz0wOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0ZJRk8oRklGT051bWJlcikpOw0KICBpZiAoRklGT051bWJlciA9PSBDQU5fRklGTzApDQogIHsNCiAgICBtZXNzYWdlX3BlbmRpbmcgPSAodWludDhfdCkoQ0FOeC0+UkYwUiYodWludDMyX3QpMHgwMyk7DQogIH0NCiAgZWxzZSBpZiAoRklGT051bWJlciA9PSBDQU5fRklGTzEpDQogIHsNCiAgICBtZXNzYWdlX3BlbmRpbmcgPSAodWludDhfdCkoQ0FOeC0+UkYxUiYodWludDMyX3QpMHgwMyk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgbWVzc2FnZV9wZW5kaW5nID0gMDsNCiAgfQ0KICByZXR1cm4gbWVzc2FnZV9wZW5kaW5nOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY2VpdmVzIGEgbWVzc2FnZS4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgRklGT051bWJlcjogUmVjZWl2ZSBGSUZPIG51bWJlciwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCiAgKiBAcGFyYW0gIFJ4TWVzc2FnZTogcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZWNlaXZlIG1lc3NhZ2Ugd2hpY2ggDQogICogICBjb250YWlucyBDQU4gSWQsIENBTiBETEMsIENBTiBkYXRhcyBhbmQgRk1JIG51bWJlci4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIENBTl9SZWNlaXZlKENBTl9UeXBlRGVmKiBDQU54LCB1aW50OF90IEZJRk9OdW1iZXIsIENhblJ4TXNnKiBSeE1lc3NhZ2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQogIC8qIEdldCB0aGUgSWQgKi8NCiAgUnhNZXNzYWdlLT5JREUgPSAodWludDhfdCkweDA0ICYgQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJJUjsNCiAgaWYgKFJ4TWVzc2FnZS0+SURFID09IENBTl9JRF9TVEQpDQogIHsNCiAgICBSeE1lc3NhZ2UtPlN0ZElkID0gKHVpbnQzMl90KTB4MDAwMDA3RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJJUiA+PiAyMSk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUnhNZXNzYWdlLT5FeHRJZCA9ICh1aW50MzJfdCkweDFGRkZGRkZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVIgPj4gMyk7DQogIH0NCiAgDQogIFJ4TWVzc2FnZS0+UlRSID0gKHVpbnQ4X3QpMHgwMiAmIENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SSVI7DQogIC8qIEdldCB0aGUgRExDICovDQogIFJ4TWVzc2FnZS0+RExDID0gKHVpbnQ4X3QpMHgwRiAmIENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRFRSOw0KICAvKiBHZXQgdGhlIEZNSSAqLw0KICBSeE1lc3NhZ2UtPkZNSSA9ICh1aW50OF90KTB4RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJEVFIgPj4gOCk7DQogIC8qIEdldCB0aGUgZGF0YSBmaWVsZCAqLw0KICBSeE1lc3NhZ2UtPkRhdGFbMF0gPSAodWludDhfdCkweEZGICYgQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFI7DQogIFJ4TWVzc2FnZS0+RGF0YVsxXSA9ICh1aW50OF90KTB4RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFIgPj4gOCk7DQogIFJ4TWVzc2FnZS0+RGF0YVsyXSA9ICh1aW50OF90KTB4RkYgJiAoQ0FOeC0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFIgPj4gMTYpOw0KICBSeE1lc3NhZ2UtPkRhdGFbM10gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDI0KTsNCiAgUnhNZXNzYWdlLT5EYXRhWzRdID0gKHVpbnQ4X3QpMHhGRiAmIENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSOw0KICBSeE1lc3NhZ2UtPkRhdGFbNV0gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDgpOw0KICBSeE1lc3NhZ2UtPkRhdGFbNl0gPSAodWludDhfdCkweEZGICYgKENBTngtPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDE2KTsNCiAgUnhNZXNzYWdlLT5EYXRhWzddID0gKHVpbnQ4X3QpMHhGRiAmIChDQU54LT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUiA+PiAyNCk7DQogIC8qIFJlbGVhc2UgdGhlIEZJRk8gKi8NCiAgQ0FOX0ZJRk9SZWxlYXNlKENBTngsIEZJRk9OdW1iZXIpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIERCRyBGcmVlemUgZm9yIENBTi4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ0FOIHBlcmlwaGVyYWwuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX0RCR0ZyZWV6ZShDQU5fVHlwZURlZiogQ0FOeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgRGVidWcgRnJlZXplICAqLw0KICAgIENBTngtPk1DUiB8PSBNQ1JfREJGOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgRGVidWcgRnJlZXplICovDQogICAgQ0FOeC0+TUNSICY9IH5NQ1JfREJGOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW50ZXJzIHRoZSBsb3cgcG93ZXIgbW9kZS4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ0FOU0xFRVBPSyBpZiBzbGVlcCBlbnRlcmVkLCBDQU5TTEVFUEZBSUxFRCBpbiBhbiBvdGhlciBjYXNlLg0KICAqLw0KdWludDhfdCBDQU5fU2xlZXAoQ0FOX1R5cGVEZWYqIENBTngpDQp7DQogIHVpbnQ4X3Qgc2xlZXBzdGF0dXMgPSBDQU5TTEVFUEZBSUxFRDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogICAgDQogIC8qIFJlcXVlc3QgU2xlZXAgbW9kZSAqLw0KICAgQ0FOeC0+TUNSID0gKCgoQ0FOeC0+TUNSKSAmICh1aW50MzJfdCkofih1aW50MzJfdClDQU5fTUNSX0lOUlEpKSB8IENBTl9NQ1JfU0xFRVApOw0KICAgDQogIC8qIFNsZWVwIG1vZGUgc3RhdHVzICovDQogIGlmICgoQ0FOeC0+TVNSICYgKENBTl9NU1JfU0xBS3xDQU5fTVNSX0lOQUspKSA9PSBDQU5fTVNSX1NMQUspDQogIHsNCiAgICAvKiBTbGVlcCBtb2RlIG5vdCBlbnRlcmVkICovDQogICAgc2xlZXBzdGF0dXMgPSAgQ0FOU0xFRVBPSzsNCiAgfQ0KICAvKiBBdCB0aGlzIHN0ZXAsIHNsZWVwIG1vZGUgc3RhdHVzICovDQogICByZXR1cm4gKHVpbnQ4X3Qpc2xlZXBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV2FrZXMgdGhlIENBTiB1cC4NCiAgKiBAcGFyYW0gIENBTng6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byB0byBzZWxlY3QgdGhlIENBTiBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ0FOV0FLRVVQT0sgaWYgc2xlZXAgbW9kZSBsZWZ0LCBDQU5XQUtFVVBGQUlMRUQgaW4gYW4gb3RoZXIgY2FzZS4NCiAgKi8NCnVpbnQ4X3QgQ0FOX1dha2VVcChDQU5fVHlwZURlZiogQ0FOeCkNCnsNCiAgdWludDMyX3Qgd2FpdF9zbGFrID0gU0xBS19USU1FT1VUOw0KICB1aW50OF90IHdha2V1cHN0YXR1cyA9IENBTldBS0VVUEZBSUxFRDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogICAgDQogIC8qIFdha2UgdXAgcmVxdWVzdCAqLw0KICBDQU54LT5NQ1IgJj0gfih1aW50MzJfdClDQU5fTUNSX1NMRUVQOw0KICAgIA0KICAvKiBTbGVlcCBtb2RlIHN0YXR1cyAqLw0KICB3aGlsZSgoKENBTngtPk1TUiAmIENBTl9NU1JfU0xBSykgPT0gQ0FOX01TUl9TTEFLKSYmKHdhaXRfc2xhayE9MHgwMCkpDQogIHsNCiAgIHdhaXRfc2xhay0tOw0KICB9DQogIGlmKChDQU54LT5NU1IgJiBDQU5fTVNSX1NMQUspICE9IENBTl9NU1JfU0xBSykNCiAgew0KICAgLyogU2xlZXAgbW9kZSBleGl0ZWQgKi8NCiAgICB3YWtldXBzdGF0dXMgPSBDQU5XQUtFVVBPSzsNCiAgfQ0KICAvKiBBdCB0aGlzIHN0ZXAsIHNsZWVwIG1vZGUgc3RhdHVzICovDQogIHJldHVybiAodWludDhfdCl3YWtldXBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDQU5fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRVdHDQogICogICAgICAgICAtIENBTl9GTEFHX0VQViANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfQk9GDQogICogICAgICAgICAtIENBTl9GTEFHX1JRQ1AwDQogICogICAgICAgICAtIENBTl9GTEFHX1JRQ1AxDQogICogICAgICAgICAtIENBTl9GTEFHX1JRQ1AyDQogICogICAgICAgICAtIENBTl9GTEFHX0ZNUDEgICANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRkYxICAgICAgIA0KICAqICAgICAgICAgLSBDQU5fRkxBR19GT1YxICAgDQogICogICAgICAgICAtIENBTl9GTEFHX0ZNUDAgICANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRkYwICAgICAgIA0KICAqICAgICAgICAgLSBDQU5fRkxBR19GT1YwICAgDQogICogICAgICAgICAtIENBTl9GTEFHX1dLVSANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfU0xBSyAgDQogICogICAgICAgICAtIENBTl9GTEFHX0xFQyAgICAgICANCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQ0FOX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIENBTl9HZXRGbGFnU3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fR0VUX0ZMQUcoQ0FOX0ZMQUcpKTsNCiAgDQoNCiAgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX0VTUikgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7IA0KICAgIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyAqLw0KICAgIGlmICgoQ0FOeC0+RVNSICYgKENBTl9GTEFHICYgMHgwMDBGRkZGRikpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgICB7IA0KICAgICAgLyogQ0FOX0ZMQUcgaXMgc2V0ICovDQogICAgICBiaXRzdGF0dXMgPSBTRVQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7IA0KICAgICAgLyogQ0FOX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAgIH0NCiAgfQ0KICBlbHNlIGlmKChDQU5fRkxBRyAmIENBTl9GTEFHU19NU1IpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgeyANCiAgICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQ0FOIGZsYWcgKi8NCiAgICBpZiAoKENBTngtPk1TUiAmIChDQU5fRkxBRyAmIDB4MDAwRkZGRkYpKSAhPSAodWludDMyX3QpUkVTRVQpDQogICAgeyANCiAgICAgIC8qIENBTl9GTEFHIGlzIHNldCAqLw0KICAgICAgYml0c3RhdHVzID0gU0VUOw0KICAgIH0NCiAgICBlbHNlDQogICAgeyANCiAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQogICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICB9DQogIH0NCiAgZWxzZSBpZigoQ0FOX0ZMQUcgJiBDQU5fRkxBR1NfVFNSKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsgDQogICAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENBTiBmbGFnICovDQogICAgaWYgKChDQU54LT5UU1IgJiAoQ0FOX0ZMQUcgJiAweDAwMEZGRkZGKSkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgIHsgDQogICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCiAgICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsgDQogICAgICAvKiBDQU5fRkxBRyBpcyByZXNldCAqLw0KICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQogICAgfQ0KICB9DQogIGVsc2UgaWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX1JGMFIpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgeyANCiAgICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQ0FOIGZsYWcgKi8NCiAgICBpZiAoKENBTngtPlJGMFIgJiAoQ0FOX0ZMQUcgJiAweDAwMEZGRkZGKSkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgIHsgDQogICAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCiAgICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsgDQogICAgICAvKiBDQU5fRkxBRyBpcyByZXNldCAqLw0KICAgICAgYml0c3RhdHVzID0gUkVTRVQ7DQogICAgfQ0KICB9DQogIGVsc2UgLyogSWYoQ0FOX0ZMQUcgJiBDQU5fRkxBR1NfUkYxUiAhPSAodWludDMyX3QpUkVTRVQpICovDQogIHsgDQogICAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIENBTiBmbGFnICovDQogICAgaWYgKCh1aW50MzJfdCkoQ0FOeC0+UkYxUiAmIChDQU5fRkxBRyAmIDB4MDAwRkZGRkYpKSAhPSAodWludDMyX3QpUkVTRVQpDQogICAgeyANCiAgICAgIC8qIENBTl9GTEFHIGlzIHNldCAqLw0KICAgICAgYml0c3RhdHVzID0gU0VUOw0KICAgIH0NCiAgICBlbHNlDQogICAgeyANCiAgICAgIC8qIENBTl9GTEFHIGlzIHJlc2V0ICovDQogICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICB9DQogIH0NCiAgLyogUmV0dXJuIHRoZSBDQU5fRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBDQU4ncyBwZW5kaW5nIGZsYWdzLg0KICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDQU5fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfUlFDUDANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfUlFDUDENCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfUlFDUDINCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRkYxICAgICAgIA0KICAqICAgICAgICAgLSBDQU5fRkxBR19GT1YxICAgDQogICogICAgICAgICAtIENBTl9GTEFHX0ZGMCAgICAgICANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfRk9WMCAgIA0KICAqICAgICAgICAgLSBDQU5fRkxBR19XS1UgICANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfU0xBSyAgICANCiAgKiAgICAgICAgIC0gQ0FOX0ZMQUdfTEVDICAgICAgIA0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgQ0FOX0NsZWFyRmxhZyhDQU5fVHlwZURlZiogQ0FOeCwgdWludDMyX3QgQ0FOX0ZMQUcpDQp7DQogIHVpbnQzMl90IGZsYWd0bXA9MDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9BTExfUEVSSVBIKENBTngpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0NBTl9DTEVBUl9GTEFHKENBTl9GTEFHKSk7DQogIA0KICBpZiAoQ0FOX0ZMQUcgPT0gQ0FOX0ZMQUdfTEVDKSAvKiBFU1IgcmVnaXN0ZXIgKi8NCiAgew0KICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBDQU4gZmxhZ3MgKi8NCiAgICBDQU54LT5FU1IgPSAodWludDMyX3QpUkVTRVQ7DQogIH0NCiAgZWxzZSAvKiBNU1Igb3IgVFNSIG9yIFJGMFIgb3IgUkYxUiAqLw0KICB7DQogICAgZmxhZ3RtcCA9IENBTl9GTEFHICYgMHgwMDBGRkZGRjsNCg0KICAgIGlmICgoQ0FOX0ZMQUcgJiBDQU5fRkxBR1NfUkYwUikhPSh1aW50MzJfdClSRVNFVCkNCiAgICB7DQogICAgICAvKiBSZWNlaXZlIEZsYWdzICovDQogICAgICBDQU54LT5SRjBSID0gKHVpbnQzMl90KShmbGFndG1wKTsNCiAgICB9DQogICAgZWxzZSBpZiAoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX1JGMVIpIT0odWludDMyX3QpUkVTRVQpDQogICAgew0KICAgICAgLyogUmVjZWl2ZSBGbGFncyAqLw0KICAgICAgQ0FOeC0+UkYxUiA9ICh1aW50MzJfdCkoZmxhZ3RtcCk7DQogICAgfQ0KICAgIGVsc2UgaWYgKChDQU5fRkxBRyAmIENBTl9GTEFHU19UU1IpIT0odWludDMyX3QpUkVTRVQpDQogICAgew0KICAgICAgLyogVHJhbnNtaXQgRmxhZ3MgKi8NCiAgICAgIENBTngtPlRTUiA9ICh1aW50MzJfdCkoZmxhZ3RtcCk7DQogICAgfQ0KICAgIGVsc2UgLyogSWYoKENBTl9GTEFHICYgQ0FOX0ZMQUdTX01TUikhPSh1aW50MzJfdClSRVNFVCkgKi8NCiAgICB7DQogICAgICAvKiBPcGVyYXRpbmcgbW9kZSBGbGFncyAqLw0KICAgICAgQ0FOeC0+TVNSID0gKHVpbnQzMl90KShmbGFndG1wKTsNCiAgICB9DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIENBTnggaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQogICogQHBhcmFtICBDQU54OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gdG8gc2VsZWN0IHRoZSBDQU4gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIENBTl9JVDogc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczogDQogICogICAgICAgICAtICBDQU5fSVRfVE1FICAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRk1QMCAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRkYwICAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRk9WMCAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRk1QMSAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRkYxICAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfRk9WMSAgICAgICAgICAgICAgDQogICogICAgICAgICAtICBDQU5fSVRfV0tVICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9TTEsgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0VXRyAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9FUFYgICAgDQogICogICAgICAgICAtICBDQU5fSVRfQk9GICAgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0xFQyAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9FUlIgDQogICogQHJldHZhbCBUaGUgY3VycmVudCAgc3RhdGUgb2YgQ0FOX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgQ0FOX0dldElUU3RhdHVzKENBTl9UeXBlRGVmKiBDQU54LCB1aW50MzJfdCBDQU5fSVQpDQp7DQogIElUU3RhdHVzIGl0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DQU5fQUxMX1BFUklQSChDQU54KSk7DQogIGFzc2VydF9wYXJhbShJU19DQU5fSVQoQ0FOX0lUKSk7DQogIA0KICAvKiBjaGVjayB0aGUgZW5hYmxlIGludGVycnVwdCBiaXQgKi8NCiBpZigoQ0FOeC0+SUVSICYgQ0FOX0lUKSAhPSBSRVNFVCkNCiB7DQogICAvKiBpbiBjYXNlIHRoZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCwgLi4uLiAqLw0KICAgIHN3aXRjaCAoQ0FOX0lUKQ0KICAgIHsNCiAgICAgIGNhc2UgQ0FOX0lUX1RNRToNCiAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9UU1JfUlFDUHggYml0cyAqLw0KCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5UU1IsIENBTl9UU1JfUlFDUDB8Q0FOX1RTUl9SUUNQMXxDQU5fVFNSX1JRQ1AyKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfRk1QMDoNCiAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjBSX0ZNUDAgYml0ICovDQoJICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMFIsIENBTl9SRjBSX0ZNUDApOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9GRjA6DQogICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fUkYwUl9GVUxMMCBiaXQgKi8NCiAgICAgICAgICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMFIsIENBTl9SRjBSX0ZVTEwwKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfRk9WMDoNCiAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9SRjBSX0ZPVlIwIGJpdCAqLw0KICAgICAgICAgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+UkYwUiwgQ0FOX1JGMFJfRk9WUjApOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9GTVAxOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX1JGMVJfRk1QMSBiaXQgKi8NCiAgICAgICAgICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMVIsIENBTl9SRjFSX0ZNUDEpOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9GRjE6DQogICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fUkYxUl9GVUxMMSBiaXQgKi8NCgkgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+UkYxUiwgQ0FOX1JGMVJfRlVMTDEpOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9GT1YxOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX1JGMVJfRk9WUjEgYml0ICovDQoJICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPlJGMVIsIENBTl9SRjFSX0ZPVlIxKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfV0tVOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX01TUl9XS1VJIGJpdCAqLw0KICAgICAgICAgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+TVNSLCBDQU5fTVNSX1dLVUkpOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9TTEs6DQogICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fTVNSX1NMQUtJIGJpdCAqLw0KCSAgICAgIGl0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU54LT5NU1IsIENBTl9NU1JfU0xBS0kpOyAgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9FV0c6DQogICAgICAgICAgICAgICAvKiBDaGVjayBDQU5fRVNSX0VXR0YgYml0ICovDQoJICAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPkVTUiwgQ0FOX0VTUl9FV0dGKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfRVBWOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX0VTUl9FUFZGIGJpdCAqLw0KCSAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPkVTUiwgQ0FOX0VTUl9FUFZGKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfQk9GOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX0VTUl9CT0ZGIGJpdCAqLw0KCSAgICAgaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTngtPkVTUiwgQ0FOX0VTUl9CT0ZGKTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfTEVDOg0KICAgICAgICAgICAgICAgLyogQ2hlY2sgQ0FOX0VTUl9MRUMgYml0ICovDQoJICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+RVNSLCBDQU5fRVNSX0xFQyk7ICANCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX0VSUjoNCiAgICAgICAgICAgICAgIC8qIENoZWNrIENBTl9NU1JfRVJSSSwgQ0FOX0VTUl9FV0dGLCBDQU5fRVNSX0VQVkYsIENBTl9FU1JfQk9GRiBhbmQgQ0FOX0VTUl9MRUMgIGJpdHMgKi8NCgkgICAgICBpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOeC0+RVNSLCBDQU5fRVNSX0VXR0Z8Q0FOX0VTUl9FUFZGfENBTl9FU1JfQk9GRnxDQU5fRVNSX0xFQyk7IA0KICAgICAgICAgICAgICBpdHN0YXR1cyB8PSBDaGVja0lUU3RhdHVzKENBTngtPk1TUiwgQ0FOX01TUl9FUlJJKTsgDQoJICAgICAgYnJlYWs7DQogICAgICBkZWZhdWx0IDoNCiAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBSRVNFVCAqLw0KICAgICAgICAgICAgICBpdHN0YXR1cyA9IFJFU0VUOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAvKiBpbiBjYXNlIHRoZSBJbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQsIHJldHVybiBSRVNFVCAqLw0KICAgIGl0c3RhdHVzICA9IFJFU0VUOw0KICB9DQogIA0KICAvKiBSZXR1cm4gdGhlIENBTl9JVCBzdGF0dXMgKi8NCiAgcmV0dXJuICBpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIENBTniScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KICAqIEBwYXJhbSAgQ0FOeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHRvIHNlbGVjdCB0aGUgQ0FOIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDQU5fSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KICAqICAgICAgICAgLSAgQ0FOX0lUX1RNRSAgICAgICAgICAgICAgICAgICAgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0ZGMCAgICAgICAgICAgICAgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0ZPVjAgICAgICAgICAgICAgICAgICAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9GRjEgICAgICAgICAgICAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9GT1YxICAgICAgICAgICAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9XS1UgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX1NMSyAgDQogICogICAgICAgICAtICBDQU5fSVRfRVdHICAgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0VQViAgICANCiAgKiAgICAgICAgIC0gIENBTl9JVF9CT0YgICAgDQogICogICAgICAgICAtICBDQU5fSVRfTEVDICAgIA0KICAqICAgICAgICAgLSAgQ0FOX0lUX0VSUiANCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIENBTl9DbGVhcklUUGVuZGluZ0JpdChDQU5fVHlwZURlZiogQ0FOeCwgdWludDMyX3QgQ0FOX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0FMTF9QRVJJUEgoQ0FOeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQ0FOX0NMRUFSX0lUKENBTl9JVCkpOw0KDQogIHN3aXRjaCAoQ0FOX0lUKQ0KICB7DQogICAgICBjYXNlIENBTl9JVF9UTUU6DQogICAgICAgICAgICAgIC8qIENsZWFyIENBTl9UU1JfUlFDUHggKHJjX3cxKSovDQoJICAgICAgQ0FOeC0+VFNSID0gQ0FOX1RTUl9SUUNQMHxDQU5fVFNSX1JRQ1AxfENBTl9UU1JfUlFDUDI7ICANCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX0ZGMDoNCiAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX1JGMFJfRlVMTDAgKHJjX3cxKSovDQoJICAgICAgQ0FOeC0+UkYwUiA9IENBTl9SRjBSX0ZVTEwwOyANCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX0ZPVjA6DQogICAgICAgICAgICAgIC8qIENsZWFyIENBTl9SRjBSX0ZPVlIwIChyY193MSkqLw0KCSAgICAgIENBTngtPlJGMFIgPSBDQU5fUkYwUl9GT1ZSMDsgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9GRjE6DQogICAgICAgICAgICAgIC8qIENsZWFyIENBTl9SRjFSX0ZVTEwxIChyY193MSkqLw0KCSAgICAgIENBTngtPlJGMVIgPSBDQU5fUkYxUl9GVUxMMTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfRk9WMToNCiAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX1JGMVJfRk9WUjEgKHJjX3cxKSovDQoJICAgICAgQ0FOeC0+UkYxUiA9IENBTl9SRjFSX0ZPVlIxOyANCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX1dLVToNCiAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX01TUl9XS1VJIChyY193MSkqLw0KCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfV0tVSTsgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfU0xLOg0KICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX1NMQUtJIChyY193MSkqLyANCgkgICAgICBDQU54LT5NU1IgPSBDQU5fTVNSX1NMQUtJOyAgIA0KCSAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBDQU5fSVRfRVdHOg0KICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX0VSUkkgKHJjX3cxKSAqLw0KCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfRVJSSTsNCiAgICAgICAgICAgICAgLyogTm90ZSA6IHRoZSBjb3JyZXNwb25kaW5nIEZsYWcgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSBkZXBlbmRpbmcgb2YgdGhlIENBTiBCdXMgc3RhdHVzKi8gDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9FUFY6DQogICAgICAgICAgICAgIC8qIENsZWFyIENBTl9NU1JfRVJSSSAocmNfdzEpICovDQoJICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9FUlJJOyANCiAgICAgICAgICAgICAgLyogTm90ZSA6IHRoZSBjb3JyZXNwb25kaW5nIEZsYWcgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSBkZXBlbmRpbmcgb2YgdGhlIENBTiBCdXMgc3RhdHVzKi8NCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX0JPRjoNCiAgICAgICAgICAgICAgLyogQ2xlYXIgQ0FOX01TUl9FUlJJIChyY193MSkgKi8gDQoJICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9FUlJJOyANCiAgICAgICAgICAgICAgLyogTm90ZSA6IHRoZSBjb3JyZXNwb25kaW5nIEZsYWcgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSBkZXBlbmRpbmcgb2YgdGhlIENBTiBCdXMgc3RhdHVzKi8NCgkgICAgICBicmVhazsNCiAgICAgIGNhc2UgQ0FOX0lUX0xFQzoNCiAgICAgICAgICAgICAgLyogIENsZWFyIExFQyBiaXRzICovDQoJICAgICAgQ0FOeC0+RVNSID0gUkVTRVQ7IA0KICAgICAgICAgICAgICAvKiBDbGVhciBDQU5fTVNSX0VSUkkgKHJjX3cxKSAqLw0KCSAgICAgIENBTngtPk1TUiA9IENBTl9NU1JfRVJSSTsgDQoJICAgICAgYnJlYWs7DQogICAgICBjYXNlIENBTl9JVF9FUlI6DQogICAgICAgICAgICAgIC8qQ2xlYXIgTEVDIGJpdHMgKi8NCgkgICAgICBDQU54LT5FU1IgPSBSRVNFVDsgDQogICAgICAgICAgICAgIC8qIENsZWFyIENBTl9NU1JfRVJSSSAocmNfdzEpICovDQoJICAgICAgQ0FOeC0+TVNSID0gQ0FOX01TUl9FUlJJOyANCgkgICAgICAvKiBOb3RlIDogQk9GRiwgRVBWRiBhbmQgRVdHRiBGbGFncyBhcmUgY2xlYXJlZCBieSBoYXJkd2FyZSBkZXBlbmRpbmcgb2YgdGhlIENBTiBCdXMgc3RhdHVzKi8NCgkgICAgICBicmVhazsNCiAgICAgIGRlZmF1bHQgOg0KCSAgICAgIGJyZWFrOw0KICAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBDQU4gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQogICogQHBhcmFtICBDQU5fUmVnOiBzcGVjaWZpZXMgdGhlIENBTiBpbnRlcnJ1cHQgcmVnaXN0ZXIgdG8gY2hlY2suDQogICogQHBhcmFtICBJdF9CaXQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSBiaXQgdG8gY2hlY2suDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBDQU4gSW50ZXJydXB0IChTRVQgb3IgUkVTRVQpLg0KICAqLw0Kc3RhdGljIElUU3RhdHVzIENoZWNrSVRTdGF0dXModWludDMyX3QgQ0FOX1JlZywgdWludDMyX3QgSXRfQml0KQ0Kew0KICBJVFN0YXR1cyBwZW5kaW5nYml0c3RhdHVzID0gUkVTRVQ7DQogIA0KICBpZiAoKENBTl9SZWcgJiBJdF9CaXQpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIC8qIENBTl9JVCBpcyBzZXQgKi8NCiAgICBwZW5kaW5nYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIENBTl9JVCBpcyByZXNldCAqLw0KICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gcGVuZGluZ2JpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==