LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKi8KCi8qKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQGZpbGUKKiAgaWgyNjRlX2NhYmFjLmMKKgoqIEBicmllZgoqICBDb250YWlucyBhbGwgZnVuY3Rpb25zIHRvIGVuY29kZSBpbiBDQUJBQyBlbnRyb3B5IG1vZGUKKgoqCiogQGF1dGhvcgoqIERvbmV5IEFsZXgKKgoqIEBwYXIgTGlzdCBvZiBGdW5jdGlvbnM6CioKKgoqIEByZW1hcmtzCiogIE5vbmUKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZpbGUgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogU3lzdGVtIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgovKiBVc2VyIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgImloMjY0ZV9jb25maWcuaCIKI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCiNpbmNsdWRlICJpdjIuaCIKI2luY2x1ZGUgIml2ZTIuaCIKI2luY2x1ZGUgImloMjY0X2RlYnVnLmgiCiNpbmNsdWRlICJpaDI2NF9kZWZzLmgiCiNpbmNsdWRlICJpaDI2NGVfZGVmcy5oIgojaW5jbHVkZSAiaWgyNjRfbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0ZV9iaXRzdHJlYW0uaCIKI2luY2x1ZGUgImltZV9kaXN0b3J0aW9uX21ldHJpY3MuaCIKI2luY2x1ZGUgImltZV9kZWZzLmgiCiNpbmNsdWRlICJpbWVfc3RydWN0cy5oIgojaW5jbHVkZSAiaWgyNjRfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0X3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0X3RyYW5zX3F1YW50X2l0cmFuc19pcXVhbnQuaCIKI2luY2x1ZGUgImloMjY0X2ludGVyX3ByZWRfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfbWVtX2Zucy5oIgojaW5jbHVkZSAiaWgyNjRfcGFkZGluZy5oIgojaW5jbHVkZSAiaWgyNjRfcGxhdGZvcm1fbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NF9pbnRyYV9wcmVkX2ZpbHRlcnMuaCIKI2luY2x1ZGUgImloMjY0X2RlYmxrX2VkZ2VfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfY2FiYWNfdGFibGVzLmgiCiNpbmNsdWRlICJpcmNfY250cmxfcGFyYW0uaCIKI2luY2x1ZGUgImlyY19mcmFtZV9pbmZvX2NvbGxlY3Rvci5oIgojaW5jbHVkZSAiaWgyNjRlX3JhdGVfY29udHJvbC5oIgojaW5jbHVkZSAiaWgyNjRlX2NhYmFjX3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0ZV9zdHJ1Y3RzLmgiCiNpbmNsdWRlICJpaDI2NGVfY2FiYWMuaCIKI2luY2x1ZGUgImloMjY0ZV9lbmNvZGVfaGVhZGVyLmgiCiNpbmNsdWRlICJpaDI2NF9jYXZsY190YWJsZXMuaCIKI2luY2x1ZGUgImloMjY0ZV9jYXZsYy5oIgojaW5jbHVkZSAiaWgyNjRlX3N0YXRpc3RpY3MuaCIKI2luY2x1ZGUgImloMjY0ZV90cmFjZS5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIEVuY29kZXMgbWJfc2tpcF9mbGFnICB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlLgogKgogKiBAcGFyYW1baW5dIHUxX21iX3NraXBfZmxhZwogKiAgbWJfc2tpcF9mbGFnCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfc2tpcF9mbGFnIGNvbnRleHQKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcChVV09SRDggdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhpZHhfb2Zmc2V0KQp7CgogICAgVVdPUkQ4IHU0X2N0eF9pbmM7CiAgICBXT1JEOCBhLCBiOwogICAgYSA9ICgocHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm8tPnUxX21iX3R5cGUgJiBDQUJfU0tJUF9NQVNLKSA/CiAgICAgICAgICAgICAgICAgICAgMCA6IDEpOwogICAgYiA9ICgocHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mby0+dTFfbWJfdHlwZSAmIENBQl9TS0lQX01BU0spID8KICAgICAgICAgICAgICAgICAgICAwIDogMSk7CgogICAgdTRfY3R4X2luYyA9IGEgKyBiOwogICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQzMikgdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyB1NF9jdHhpZHhfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2luYyk7Cgp9CgoKLyogISA8IFRhYmxlIDktMzYgliBCaW5hcml6YXRpb24gZm9yIG1hY3JvYmxvY2sgdHlwZXMgaW4gSSBzbGljZXMgIGluIElUVV9UX0gyNjQtMjAxNDAyCiAqIEJpdHMgMC03IDogYmluYXJpc2VkIHZhbHVlCiAqIEJpdHMgOC0xNTogbGVuZ3RoIG9mIGJpbmFyeSBzZXF1ZW5jZQogKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfdHlwZV9pbnRyYVsyNl0gPQogICAgeyAweDAxMDAsIDB4MDYyMCwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywgMHgwNzQ4LCAweDA3NDksIDB4MDc0YSwgMHgwNzRiLAogICAgICAweDA3NGMsIDB4MDc0ZCwgMHgwNzRlLCAweDA3NGYsIDB4MDYyOCwgMHgwNjI5LCAweDA2MmEsIDB4MDYyYiwgMHgwNzU4LAogICAgICAweDA3NTksIDB4MDc1YSwgMHgwNzViLCAweDA3NWMsIDB4MDc1ZCwgMHgwNzVlLCAweDA3NWYsIDB4MDIwMyB9OwoKCi8qIEN0eEluYyBmb3IgbWIgdHlwZXMgKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfY3R4aW5jWzJdWzI2XSA9CnsKICAgIC8qIEludHJhIEN0eEluYydzICovCiAgICB7ICAgMHgwMCwKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LAogICAgICAgIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ2NywgMHgwMzQ2NywKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsCiAgICAgICAgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMH0sCiAgICAvKiBJbnRlciBDdHhJbmMncyAqLwogICAgeyAgIDB4MDAsCiAgICAgICAgMHgwMDEyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsCiAgICAgICAgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywKICAgICAgICAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLAogICAgICAgIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDB9Cn07CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBtYl90eXBlIGZvciBhbiBpbnRyYSBNQi4KICoKICogQHBhcmFtW2luXSB1NF9zbGljZV90eXBlCiAqICBzbGljZSB0eXBlCiAqCiAqIEBwYXJhbVtpbl0gdTRfaW50cmFfbWJfdHlwZQogKiAgTUIgdHlwZSAoVGFibGUgNy0xMSkKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfdHlwZSBjb250ZXh0CiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKFVXT1JEMzIgdTRfc2xpY2VfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfaW50cmFfbWJfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2lkeF9vZmZzZXQpCnsKCiAgICBlbmNvZGluZ19lbnZpcm5vbWVudF90ICpwc19jYWJfZW5jX2VudiA9ICYocHNfY2FiYWNfY3R4dC0+c19jYWJfZW5jX2Vudik7CiAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX21iX2Jpbl9jdHh0LCAqcHUxX2Jpbl9jdHh0OwogICAgVVdPUkQ4IHUxX2JpbjsKICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgIFVXT1JEMzIgdTRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDMyIHU0X2NvZGVfaW50X2xvdzsKICAgIFVXT1JEMTYgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDE2IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgIFdPUkQ4IGk7CiAgICBVV09SRDggdTFfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfdGFibGVfdmFsOwoKICAgIHB1MV9tYl9iaW5fY3R4dCA9IHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgdTRfY3R4X2lkeF9vZmZzZXQ7CgogICAgdTRfYmlucyA9IHU0X21iX3R5cGVfaW50cmFbdTRfaW50cmFfbWJfdHlwZV07CiAgICBpMV9iaW5zX2xlbiA9IChXT1JEOCkgKCh1NF9iaW5zID4+IDgpICYgMHgwZik7CiAgICB1NF9jdHhfaW5jID0gdTRfbWJfY3R4aW5jWyh1NF9zbGljZV90eXBlICE9IElTTElDRSldW3U0X2ludHJhX21iX3R5cGVdOwogICAgdTFfY3R4X2luYyA9IDA7CiAgICBpZiAodTRfc2xpY2VfdHlwZSA9PSBJU0xJQ0UpCiAgICB7CiAgICAgICAgaWYgKHBzX2xlZnRfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICB1MV9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKICAgICAgICBpZiAocHNfdG9wX2N0eHQgIT0gcHNfY2FiYWNfY3R4dC0+cHNfZGVmX2N0eHRfbWJfaW5mbykKICAgICAgICAgICAgdTFfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKCiAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKHUxX2N0eF9pbmMgPDwgKChpMV9iaW5zX2xlbiAtIDEpIDw8IDIpKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHUxX21iX2Jpbl9jdHh0ICs9IDM7CiAgICAgICAgaWYgKHU0X3NsaWNlX3R5cGUgPT0gQlNMSUNFKQogICAgICAgICAgICBwdTFfbWJfYmluX2N0eHQgKz0gMjsKCiAgICB9CgogICAgdTRfY29kZV9pbnRfcmFuZ2UgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfcmFuZ2U7CiAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgIGZvciAoaSA9IChpMV9iaW5zX2xlbiAtIDEpOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICBXT1JEMzIgc2hpZnQ7CgogICAgICAgIHUxX2N0eF9pbmMgPSAoKHU0X2N0eF9pbmMgPj4gKGkgPDwgMikpICYgMHgwZik7CiAgICAgICAgdTFfYmluID0gKCh1NF9iaW5zID4+IGkpICYgMHgwMSk7CiAgICAgICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgICAgICBwdTFfYmluX2N0eHQgPSBwdTFfbWJfYmluX2N0eHQgKyB1MV9jdHhfaW5jOwogICAgICAgIGlmIChpICE9IChpMV9iaW5zX2xlbiAtIDIpKQogICAgICAgIHsKICAgICAgICAgICAgV09SRDggaTFfbXBzID0gISEoKCpwdTFfYmluX2N0eHQpICYgKDB4NDApKTsKICAgICAgICAgICAgV09SRDggaTFfc3RhdGUgPSAoKnB1MV9iaW5fY3R4dCkgJiAweDNGOwoKICAgICAgICAgICAgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2UgPSAoKHU0X2NvZGVfaW50X3JhbmdlID4+IDYpICYgMHgwMyk7CiAgICAgICAgICAgIHU0X3RhYmxlX3ZhbCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXU0X2loMjY0X2NhYmFjX3RhYmxlW2kxX3N0YXRlXVt1Ml9xdWFudF9jb2RlX2ludF9yYW5nZV07CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlX2xwcyA9IHU0X3RhYmxlX3ZhbCAmIDB4RkY7CgogICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSAtPSB1NF9jb2RlX2ludF9yYW5nZV9scHM7CiAgICAgICAgICAgIGlmICh1MV9iaW4gIT0gaTFfbXBzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgKz0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSA9IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgICAgICAgICAgICAgIGlmIChpMV9zdGF0ZSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIE1QUyhDdHhJZHgpID0gMSAtIE1QUyhDdHhJZHgpICovCiAgICAgICAgICAgICAgICAgICAgaTFfbXBzID0gMSAtIGkxX21wczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpMV9zdGF0ZSA9ICh1NF90YWJsZV92YWwgPj4gMTUpICYgMHgzRjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGkxX3N0YXRlID0gKHU0X3RhYmxlX3ZhbCA+PiA4KSAmIDB4M0Y7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAoKnB1MV9iaW5fY3R4dCkgPSAoaTFfbXBzIDw8IDYpIHwgaTFfc3RhdGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlIC09IDI7CiAgICAgICAgfQoKICAgICAgICAvKiBSZW5vcm1hbGl6ZSAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBSZW5vcm1hbGl6YXRpb247IGNhbGN1bGF0ZSBiaXRzIGdlbmVyYXRlZCBiYXNlZCBvbiByYW5nZShSKSAgICovCiAgICAgICAgLyogTm90ZSA6IDYgPD0gUiA8IDUxMjsgUiBpcyAyIG9ubHkgZm9yIHRlcm1pbmF0aW5nIGVuY29kZSAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBHRVRSQU5HRShzaGlmdCwgdTRfY29kZV9pbnRfcmFuZ2UpOwogICAgICAgIHNoaWZ0ID0gOSAtIHNoaWZ0OwogICAgICAgIHU0X2NvZGVfaW50X2xvdyA8PD0gc2hpZnQ7CiAgICAgICAgdTRfY29kZV9pbnRfcmFuZ2UgPDw9IHNoaWZ0OwoKICAgICAgICAvKiBiaXRzIHRvIGJlIGluc2VydGVkIGluIHRoZSBiaXRzdHJlYW0gKi8KICAgICAgICBwc19jYWJfZW5jX2Vudi0+dTRfYml0c19nZW4gKz0gc2hpZnQ7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlID0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X2xvdyA9IHU0X2NvZGVfaW50X2xvdzsKCiAgICAgICAgLyogZ2VuZXJhdGUgc3RyZWFtIHdoZW4gYSBieXRlIGlzIHJlYWR5ICovCiAgICAgICAgaWYgKHBzX2NhYl9lbmNfZW52LT51NF9iaXRzX2dlbiA+IENBQkFDX0JJVFMpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfcHV0X2J5dGUocHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlID0gcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlOwogICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgICAgICB9CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBwcmV2X2ludHJhNHg0X3ByZWRfbW9kZV9mbGFnIGFuZAogKiAgcmVtX2ludHJhNHg0X3ByZWRfbW9kZSB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiAgQHBhcmFtW2luXSBwdTFfaW50cmFfNHg0X21vZGVzCiAqICBQb2ludGVyIHRvIGFycmF5IGNvbnRhaW5pbmcgcHJldl9pbnRyYTR4NF9wcmVkX21vZGVfZmxhZyBhbmQKICogIHJlbV9pbnRyYTR4NF9wcmVkX21vZGUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMoY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCAqcHUxX2ludHJhXzR4NF9tb2RlcykKewogICAgV09SRDMyIGk7CiAgICBXT1JEOCBieXRlOwogICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCiAgICB7CiAgICAgICAgLyogc3ViIGJsayBpZHggMSAqLwogICAgICAgIGJ5dGUgPSAqcHUxX2ludHJhXzR4NF9tb2RlcysrOwogICAgICAgIGlmIChieXRlICYgMHgxKQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBSRVZfSU5UUkE0WDRfUFJFRF9NT0RFX0ZMQUcpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5hcml6YXRpb24gaXMgRkwgYW5kIENtYXg9NyAqLwogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnMoYnl0ZSAmIDB4RiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBSRU1fSU5UUkE0WDRfUFJFRF9NT0RFIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgICAgICAvKiBzdWIgYmxrIGlkeCAyICovCiAgICAgICAgYnl0ZSA+Pj0gNDsKICAgICAgICBpZiAoYnl0ZSAmIDB4MSkKICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQUkVWX0lOVFJBNFg0X1BSRURfTU9ERV9GTEFHKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKGJ5dGUgJiAweEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTU1NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUkVNX0lOVFJBNFg0X1BSRURfTU9ERSAtIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICB9CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBjaHJvbWEgIGludHJhcHJlZCBtb2RlIGZvciB0aGUgTUIuCiAqCiAqIEBwYXJhbVtpbl0gdTFfY2hyb21hX3ByZWRfbW9kZQogKiAgQ2hyb21hIGludHIgcHJlZGljdGlvbiBtb2RlCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19jaHJvbWFfcHJlZG1vZGUoVVdPUkQ4IHUxX2Nocm9tYV9wcmVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCkKewoKICAgIFdPUkQ4IGkxX3RlbXA7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgVVdPUkQzMiB1NF9iaW5zID0gMDsKICAgIFdPUkQ4IGkxX2JpbnNfbGVuID0gMTsKICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CiAgICBVV09SRDggYSwgYjsKICAgIGEgPSAoKHBzX2xlZnRfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlICE9IDApID8gMSA6IDApOwogICAgYiA9ICgocHNfdG9wX2N0eHQtPnUxX2ludHJhcHJlZF9jaHJvbWFfbW9kZSAhPSAwKSA/IDEgOiAwKTsKCiAgICAvKiBCaW5hcml6YXRpb24gaXMgVFUgYW5kIENtYXg9MyAqLwogICAgcHNfY3Vycl9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgPSB1MV9jaHJvbWFfcHJlZF9tb2RlOwoKICAgIHU0X2N0eF9pbmMgPSBhICsgYjsKICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MzMwKTsKICAgIGlmICh1MV9jaHJvbWFfcHJlZF9tb2RlKQogICAgewogICAgICAgIHU0X2JpbnMgPSAxOwogICAgICAgIGkxX3RlbXAgPSB1MV9jaHJvbWFfcHJlZF9tb2RlOwogICAgICAgIGkxX3RlbXAtLTsKICAgICAgICAvKiBQdXQgYSBzdHJlYW0gb2YgMSdzIG9mIGxlbmd0aCBDaHJvbWFwc19wcmVkX21vZGVfY3R4dCB2YWx1ZSAqLwogICAgICAgIHdoaWxlIChpMV90ZW1wKQogICAgICAgIHsKICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgaTFfdGVtcC0tOwogICAgICAgIH0KICAgICAgICAvKiBJZiBDaHJvbWFwc19wcmVkX21vZGVfY3R4dCA8IENtYXggaS5lIDMuIFRlcm1pbmF0ZSBwdXQgYSB6ZXJvICovCiAgICAgICAgaWYgKHUxX2Nocm9tYV9wcmVkX21vZGUgPCAzKQogICAgICAgIHsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICB9CiAgICB9CgogICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSU5UUkFfQ0hST01BX1BSRURfTU9ERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBFbmNvZGVzIENCUCBmb3IgdGhlIE1CLgogKgogKiBAcGFyYW1baW5dIHUxX2NicAogKiAgQ0JQIGZvciB0aGUgTUIKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX2NicChVV09SRDMyIHU0X2NicCwgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0KQp7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgV09SRDggaTJfY2JwX2Nocm9tYSwgaSwgajsKICAgIFVXT1JEOCB1MV9jdHh0X2luYywgdTFfYmluOwogICAgVVdPUkQ4IGEsIGI7CiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKCiAgICAvKiBDQlAgTHVtYSwgRkwsIENtYXggPSAxNSwgTCA9IDQgKi8KICAgIHU0X2N0eF9pbmMgPSAwOwogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDU7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgewogICAgICAgIC8qIGNhbHVsYXRlIGN0eHRJbmMsIGRlcGVuZGluZyBvbiBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgLyogdTFfY3R4dF9pbmMgPSBDb25kVGVybShBKSArIDIgKiBDb25kVGVybShCKTsKICAgICAgICAgQTogTGVmdCBibG9jayBhbmQgQjogVG9wIGJsb2NrICovCgogICAgICAgIC8qIENoZWNrIGZvciBUb3AgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgaWYgKGkgPj4gMSkKICAgICAgICB7CiAgICAgICAgICAgIGogPSBpIC0gMjsKICAgICAgICAgICAgLyogVG9wIGlzIGF2YWlsYWJsZSBhbHdheXMgYW5kIGl0J3MgY3VycmVudCBNQiAqLwogICAgICAgICAgICBiID0gKCgodTRfY2JwID4+IGopICYgMHgwMSkgIT0gMCA/IDAgOiAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogZm9yIGJsb2NrcyB3aG9zZSB0b3AgcmVmZXJlbmNlIGlzIGluIGFub3RoZXIgTUIgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IGkgKyAyOwogICAgICAgICAgICAgICAgYiA9ICgocHNfdG9wX2N0eHQtPnUxX2NicCA+PiBqKSAmIDB4MDEpID8gMCA6IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIENoZWNrIGZvciBMZWZ0IGF2YWlsYWJpbGl0eSAqLwogICAgICAgIGlmIChpICYgMHgwMSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIExlZnQgaXMgYXZhaWxhYmxlIGFsd2F5cyBhbmQgaXQncyBjdXJyZW50IE1CICovCiAgICAgICAgICAgIGogPSBpIC0gMTsKICAgICAgICAgICAgYSA9ICgoKHU0X2NicCA+PiBqKSAmIDB4MDEpICE9IDAgPyAwIDogMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgIGEgPSAoKHBzX2xlZnRfY3R4dC0+dTFfY2JwID4+IGopICYgMHgwMSkgPyAwIDogMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1MV9jdHh0X2luYyA9IGEgKyAyICogYjsKICAgICAgICB1MV9iaW4gPSAoKHU0X2NicCA+PiBpKSAmIDB4MDEpOwogICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8ICh1MV9jdHh0X2luYyA8PCAoaSA8PCAyKSkpOwogICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICh1MV9iaW4gPDwgaSkpOwogICAgfQoKICAgIC8qIENCUCBDaHJvbWEsIFRVLCBDbWF4ID0gMiAqLwogICAgaTJfY2JwX2Nocm9tYSA9IHU0X2NicCA+PiA0OwogICAgLyogY2FsdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgIGEgPSAocHNfbGVmdF9jdHh0LT51MV9jYnAgPiAxNSkgPyAxIDogMDsKICAgIGIgPSAocHNfdG9wX2N0eHQtPnUxX2NicCA+IDE1KSA/IDEgOiAwOwoKICAgIHUxX2N0eHRfaW5jID0gYSArIDIgKiBiOwogICAgaWYgKGkyX2NicF9jaHJvbWEpCiAgICB7CiAgICAgICAgdTRfY3R4X2luYyA9IHU0X2N0eF9pbmMgfCAoKDQgKyB1MV9jdHh0X2luYykgPDwgMTYpOwogICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8IDB4MTApOwogICAgICAgIC8qIGNhbHVsYXRlIGN0eHRJbmMsIGRlcGVuZGluZyBvbiBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgYSA9IChwc19sZWZ0X2N0eHQtPnUxX2NicCA+IDMxKSA/IDEgOiAwOwogICAgICAgIGIgPSAocHNfdG9wX2N0eHQtPnUxX2NicCA+IDMxKSA/IDEgOiAwOwogICAgICAgIHUxX2N0eHRfaW5jID0gYSArIDIgKiBiOwogICAgICAgIHU0X2N0eF9pbmMgPSB1NF9jdHhfaW5jIHwgKCg4ICsgdTFfY3R4dF9pbmMpIDw8IDIwKTsKICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoKChpMl9jYnBfY2hyb21hID4+IDEpICYgMHgwMSkgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8ICgoNCArIHUxX2N0eHRfaW5jKSA8PCAxNikpOwogICAgfQogICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLCB1NF9jdHhfaW5jLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JQX0xVTUEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7Cn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBFbmNvZGVzIG1iX3FwX2RlbHRhIGZvciB0aGUgTUIuCiAqCiAqIEBwYXJhbVtpbl0gaTFfbWJfcXBfZGVsdGEKICogIG1iX3FwX2RlbHRhCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShXT1JEOCBpMV9tYl9xcF9kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQpCnsKICAgIFVXT1JEOCB1MV9jb2RlX251bTsKICAgIFVXT1JEOCB1MV9jdHh0X2luYzsKCiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgIFVXT1JEOCB1MV9jdHhfaW5jLCB1MV9iaW47CiAgICAvKiBSYW5nZSBvZiBwc19tYl9xcF9kZWx0YV9jdHh0PSAtMjYgdG8gKzI1IGluY2x1c2l2ZSAqLwogICAgICAgIEFTU0VSVCgoaTFfbWJfcXBfZGVsdGEgPCAyNikgJiYgKGkxX21iX3FwX2RlbHRhID4gLTI3KSk7CiAgICAvKiBpZiBwc19tYl9xcF9kZWx0YV9jdHh0PTAsIHRoZW4gY29kZU51bT0wICovCiAgICB1MV9jb2RlX251bSA9IDA7CiAgICBpZiAoaTFfbWJfcXBfZGVsdGEgPiAwKQogICAgICAgIHUxX2NvZGVfbnVtID0gKGkxX21iX3FwX2RlbHRhIDw8IDEpIC0gMTsKICAgIGVsc2UgaWYgKGkxX21iX3FwX2RlbHRhIDwgMCkKICAgICAgICB1MV9jb2RlX251bSA9IChBQlMoaTFfbWJfcXBfZGVsdGEpKSA8PCAxOwoKICAgIHU0X2N0eF9pbmMgPSAwOwogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDE7CiAgICAvKiBjYWxjdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgIHUxX2N0eHRfaW5jID0gKCEoIShwc19jYWJhY19jdHh0LT5pMV9wcmV2cHNfbWJfcXBfZGVsdGFfY3R4dCkpKTsKICAgIHBzX2NhYmFjX2N0eHQtPmkxX3ByZXZwc19tYl9xcF9kZWx0YV9jdHh0ID0gaTFfbWJfcXBfZGVsdGE7CgogICAgaWYgKHUxX2NvZGVfbnVtID09IDApCiAgICB7CiAgICAgICAgLyogYjAgKi8KICAgICAgICB1MV9iaW4gPSAoVVdPUkQ4KSAodTRfYmlucyk7CiAgICAgICAgdTFfY3R4X2luYyA9IHUxX2N0eHRfaW5jICYgMHgwZjsKICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgTUJfUVBfREVMVEEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTFfY3R4X2luYyk7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIGIwICovCiAgICAgICAgdTRfY3R4X2luYyA9IHUxX2N0eHRfaW5jOwogICAgICAgIHU0X2JpbnMgPSAxOwogICAgICAgIHUxX2NvZGVfbnVtLS07CiAgICAgICAgaWYgKHUxX2NvZGVfbnVtID09IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBiMSAqLwogICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDIwKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLCB1NF9jdHhfaW5jLCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBNQl9RUF9ERUxUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBiMSAqLwogICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDIwKTsKICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgLyogQmluSWR4IGZyb20gYjIgb253YXJkcyAqLwogICAgICAgICAgICBpZiAodTFfY29kZV9udW0gPCAzMCkKICAgICAgICAgICAgeyAvKiBtYXhpbXVtIGkxX2JpbnNfbGVuID0gMzEgKi8KICAgICAgICAgICAgICAgIHdoaWxlICh1MV9jb2RlX251bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDMwMCk7CiAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfUVBfREVMVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGkxX2JpbnNfbGVuID0gNTMgKi8KICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAweGZmZmZmZmZmOwogICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAzMjsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MzAwKTsKICAgICAgICAgICAgICAgIHUxX2NvZGVfbnVtIC09IDMwOwogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfUVBfREVMVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgICAgICB1NF9iaW5zID0gMDsKICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuID0gMDsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAweDAzMzsKICAgICAgICAgICAgICAgIHdoaWxlICh1MV9jb2RlX251bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgzMDApOwogICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1FQX0RFTFRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqICBFbmNvZGVzIDRyZXNpZHVhbF9ibG9ja19jYWJhYyBhcyBkZWZpbmVkIGluIDcuMy41LjMuMy4KICoKICogQHBhcmFtW2luXSBwaTJfcmVzX2Jsb2NrCiAqICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiByZXNpZHVlcwogKgogKiBAcGFyYW1baW5dICB1MV9ubnoKICogIE51bWJlciBvZiBub24gemVybyBjb2VmZnMgaW4gdGhlIGJsb2NrCiAqCiAqIEBwYXJhbVtpbl0gdTFfbWF4X251bV9jb2VmZnMKICogIE1heCBudW1iZXIgb2YgY29lZmZzIHRoYXQgY2FuIGJlIHRoZXJlIGluIHRoZSBibG9jawogKgogKiBAcGFyYW1baW5dIHUyX3NpZ19jb2VmZl9tYXAKICogIFNpZ25pZmljYW50IGNvZWZmIG1hcAogKgogKiBAcGFyYW1baW5dIHU0X2N0eF9jYXRfb2Zmc2V0CiAqICBjdHhJZHhPZmZzZXQgZm9yICBhYnNvbHV0ZSB2YWx1ZSBjb250ZXh0cwogKgogKiBAcGFyYW1baW5dICBwdTFfY3R4dF9zaWdfY29lZmYKICogIFBvaW50ZXIgdG8gcmVzaWR1YWwgc3RhdGUgdmFyaWFibGVzCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KFdPUkQxNiAqcGkyX3Jlc19ibG9jaywgVVdPUkQ4IHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9tYXhfbnVtX2NvZWZmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMTYgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2NhdF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX2N0eHRfc2lnX2NvZWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0KQp7CgogICAgV09SRDggaTsKICAgIFdPUkQxNiAqcGkxNl9jb2VmZnM7CiAgICBVV09SRDMyIHU0X3NpZ19jb2VmZiwgdTRfYmluczsKICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgIFVXT1JEOCB1MV9sYXN0X3NpZ19jb2VmX2luZGV4ID0gKDMxIC0gQ0xaKHUyX3NpZ19jb2VmZl9tYXApKTsKCiAgICAvKiBBbHdheXMgcHV0IENvZGVkIEJsb2NrIEZsYWcgYXMgMSAqLwoKICAgICAgICBwaTE2X2NvZWZmcyA9IHBpMl9yZXNfYmxvY2s7CiAgICAgICAgewogICAgICAgICAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX2Jpbl9jdHh0OwogICAgICAgICAgICBVV09SRDggdTFfYmluLCB1Y19sYXN0OwoKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHB1MV9iaW5fY3R4dCA9IHB1MV9jdHh0X3NpZ19jb2VmZjsKICAgICAgICAgICAgdTRfc2lnX2NvZWZmID0gMDsKICAgICAgICAgICAgdTFfYmluID0gMTsKICAgICAgICAgICAgaWYgKCh1MV9sYXN0X3NpZ19jb2VmX2luZGV4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdTFfYmluID0gISEodTJfc2lnX2NvZWZmX21hcCAmIDAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1Y19sYXN0ID0gMTsKCiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVuY29kZSBEZWNpc2lvbiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwgdTFfYmluLCBwdTFfYmluX2N0eHQpOwoKICAgICAgICAgICAgICAgIGlmICh1MV9iaW4gJiB1Y19sYXN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHU0X3NpZ19jb2VmZiA9ICh1NF9zaWdfY29lZmYgfCAoMSA8PCBpKSk7CiAgICAgICAgICAgICAgICAgICAgcHUxX2Jpbl9jdHh0ID0gcHUxX2N0eHRfc2lnX2NvZWZmICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExBU1RfU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNJR05JRklDQU5UX0NPRUZGX0ZMQUdfRlJBTUU7CiAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gKGkgPT0gdTFfbGFzdF9zaWdfY29lZl9pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgdWNfbGFzdCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgIHB1MV9iaW5fY3R4dCA9IHB1MV9jdHh0X3NpZ19jb2VmZiArIGk7CiAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gKGkgPT0gdTFfbGFzdF9zaWdfY29lZl9pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgdWNfbGFzdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpICE9IHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gISEoKHUyX3NpZ19jb2VmZl9tYXAgPj4gaSkgJiAwMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9d2hpbGUgKCEoKGkgPiB1MV9sYXN0X3NpZ19jb2VmX2luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGkgPiAodTFfbWF4X251bV9jb2VmZnMgLSAxKSkpKTsKICAgICAgICB9CgogICAgICAgIC8qIEVuY29kZSBjb2VmZl9hYnNfbGV2ZWxfbWludXMxIGFuZCBjb2VmZl9zaWduX2ZsYWcgKi8KICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEOCB1MV9zaWduOwogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19sZXZlbDsKICAgICAgICAgICAgVVdPUkQ4IHUxX2Fic19sZXZlbF9lcXVhbDEgPSAxLCB1MV9hYnNfbGV2ZWxfZ3QxID0gMDsKICAgICAgICAgICAgVVdPUkQ4IHUxX2N0eF9pbmM7CiAgICAgICAgICAgIFVXT1JEOCB1MV9jb2ZmOwogICAgICAgICAgICBXT1JEMTYgaTJfc3VmczsKICAgICAgICAgICAgV09SRDggaTFfYmluc19sZW47CiAgICAgICAgICAgIGkgPSB1MV9sYXN0X3NpZ19jb2VmX2luZGV4OwogICAgICAgICAgICBwaTE2X2NvZWZmcyA9IHBpMl9yZXNfYmxvY2sgKyB1MV9ubnogLSAxOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdTRfc2lnX2NvZWZmID0gdTRfc2lnX2NvZWZmICYgKCgxIDw8IGkpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9IDA7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAxOwogICAgICAgICAgICAgICAgICAgIC8qIEVuY29kZSB0aGUgQWJzTGV2ZWxNaW51czEgKi8KICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbGV2ZWwgPSBBQlMoKihwaTE2X2NvZWZmcykpIC0gMTsKICAgICAgICAgICAgICAgICAgICAvKiBDdHhJbmMgZm9yIGJpbjAgKi8KICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gTUlOKHUxX2Fic19sZXZlbF9lcXVhbDEsIDQpOwogICAgICAgICAgICAgICAgICAgIC8qIEN0eEluYyBmb3IgcmVtYWluaW5nICovCiAgICAgICAgICAgICAgICAgICAgdTFfY3R4X2luYyA9IDUgKyBNSU4odTFfYWJzX2xldmVsX2d0MSwgNCk7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IHU0X2N0eF9pbmMgKyAodTFfY3R4X2luYyA8PCA0KTsKICAgICAgICAgICAgICAgICAgICBpZiAodTJfYWJzX2xldmVsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdTFfYWJzX2xldmVsX2d0MSsrOwogICAgICAgICAgICAgICAgICAgICAgICB1MV9hYnNfbGV2ZWxfZXF1YWwxID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF1MV9hYnNfbGV2ZWxfZ3QxKQogICAgICAgICAgICAgICAgICAgICAgICB1MV9hYnNfbGV2ZWxfZXF1YWwxKys7CgogICAgICAgICAgICAgICAgICAgIHUxX2NvZmYgPSAxNDsKICAgICAgICAgICAgICAgICAgICBpZiAodTJfYWJzX2xldmVsID49IHUxX2NvZmYpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVmaXggVFUgaS5lIHN0cmluZyBvZiAxNCAxJ3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9IDB4M2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywgMSwgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2NhdF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1ZmZpeCwgdXNlcyBFbmNvZGVCeXBhc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaTJfc3VmcyA9IHUyX2Fic19sZXZlbCAtIHUxX2NvZmY7CgogICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gaWgyNjRlX2NhYmFjX1VFR2swX2JpbmFyaXphdGlvbihpMl9zdWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaTFfYmluc19sZW4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9ieXBhc3NfYmlucyhwc19jYWJhY19jdHh0LCB1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZWZpeCBvbmx5ICovCiAgICAgICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAoMSA8PCB1Ml9hYnNfbGV2ZWwpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSB1Ml9hYnNfbGV2ZWwgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmNvZGUgVGVybWluYXRpbmcgYml0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLCBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsIDEsIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9jYXRfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogZW5jb2RlIGNvZWZmX3NpZ25fZmxhZ1tpXSAqLwogICAgICAgICAgICAgICAgdTFfc2lnbiA9ICgoKnBpMTZfY29lZmZzKSA8IDApID8gMSA6IDA7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW4ocHNfY2FiYWNfY3R4dCwgdTFfc2lnbik7CiAgICAgICAgICAgICAgICBpID0gQ0xaKHU0X3NpZ19jb2VmZik7CiAgICAgICAgICAgICAgICBpID0gMzEgLSBpOwogICAgICAgICAgICAgICAgcGkxNl9jb2VmZnMtLTsKICAgICAgICAgICAgfXdoaWxlICh1NF9zaWdfY29lZmYpOwogICAgICAgIH0KCn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIFdyaXRlIERDIGNvZWZmcyBmb3IgaW50cmEgcHJlZGljdGVkIGx1bWEgYmxvY2sKICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgUG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWVfbHVtYV9kYyhlbnRyb3B5X2N0eHRfdCAqcHNfZW50X2N0eHQpCnsKCiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CiAgICB0dV9zYmxrX2NvZWZmX2RhdGFfdCAqcHNfbWJfY29lZmZfZGF0YTsKCiAgICAvKiBwYWNrZWQgcmVzaWR1ZSAqLwogICAgdm9pZCAqcHZfbWJfY29lZmZfZGF0YSA9IHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhOwogICAgVVdPUkQxNiB1Ml9zaWdfY29lZmZfbWFwOwogICAgV09SRDE2ICpwaTJfcmVzX2Jsb2NrOwogICAgVVdPUkQ4IHUxX25uejsKICAgIFVXT1JEOCB1MV9jYmY7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgbWJfaW5mb19jdHh0X3QgKnBfQ3VyQ3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvOwoKICAgIFBBUlNFX0NPRUZGX0RBVEFfQkxPQ0tfNHg0KHB2X21iX2NvZWZmX2RhdGEsIHBzX21iX2NvZWZmX2RhdGEsIHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX3NpZ19jb2VmZl9tYXAsIHBpMl9yZXNfYmxvY2spOwoKICAgIHUxX2NiZiA9ICEhKHUxX25ueik7CgogICAgewogICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgICAgICBVV09SRDggdTFfYSwgdTFfYjsKCiAgICAgICAgdTFfYSA9IHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICYgMHgxOwogICAgICAgIHUxX2IgPSBwc190b3BfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJiAweDE7CiAgICAgICAgdTRfY3R4X2luYyA9IHUxX2EgKyAodTFfYiA8PCAxKTsKCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9jYmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBDQkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKExVTUFfRENfQ1RYQ0FUIDw8IDIpICsgdTRfY3R4X2luYyk7CiAgICB9CgogICAgLyogV3JpdGUgY29kZWRfYmxvY2tfZmxhZyAqLwogICAgaWYgKHUxX2NiZikKICAgIHsKICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQocGkyX3Jlc19ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0VGRl9BQlNfTEVWRUxfTUlOVVMxICsgQ09FRkZfQUJTX0xFVkVMX0NBVF8wX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNJR19DT0VGRl9DVFhUX0NBVF8wX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gfD0gMHgxOwogICAgICAgIHBfQ3VyQ3R4dC0+dTFfeXV2X2RjX2NzYnAgfD0gMHgxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4NjsKICAgICAgICBwX0N1ckN0eHQtPnUxX3l1dl9kY19jc2JwICY9IDB4NjsKICAgIH0KCiAgICBwc19lbnRfY3R4dC0+cHZfbWJfY29lZmZfZGF0YSA9IHB2X21iX2NvZWZmX2RhdGE7Cn0KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogV3JpdGUgY2hyb21hIHJlc2lkdWVzIHRvIHRoZSBiaXRzdHJlYW0KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgUG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEBwYXJhbVtpbl0gdTFfY2hyb21hX2NicAogKiBjb2RlZCBibG9jayBwYXR0ZXJuLCBjaHJvbWEKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY193cml0ZV9jaHJvbWFfcmVzaWR1ZShlbnRyb3B5X2N0eHRfdCAqcHNfZW50X2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV09SRDggdTFfY2hyb21hX2NicCkKewogICAgLyogQ0FCQUMgY29udGV4dCAqLwogICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0ID0gcHNfZW50X2N0eHQtPnBzX2NhYmFjOwogICAgdHVfc2Jsa19jb2VmZl9kYXRhX3QgKnBzX21iX2NvZWZmX2RhdGE7CiAgICAvKiBwYWNrZWQgcmVzaWR1ZSAqLwogICAgdm9pZCAqcHZfbWJfY29lZmZfZGF0YSA9IHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhOwogICAgVVdPUkQxNiB1Ml9zaWdfY29lZmZfbWFwOwogICAgVVdPUkQ4IHUxX25uejsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dF9tYl9pbmZvLCAqcHNfY3Vycl9jdHh0OwoKICAgIHBzX3RvcF9jdHh0X21iX2luZm8gPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CgogICAgLyoqKioqKioqKioqKioqKioqKioqLwogICAgLyogV3JpdGUgQ2hyb21hIERDICovCiAgICAvKioqKioqKioqKioqKioqKioqKiovCiAgICB7CiAgICAgICAgV09SRDE2ICpwaTJfcmVzX2Jsb2NrOwogICAgICAgIFVXT1JEOCB1MV9sZWZ0X2RjX2NzYnAsIHUxX3RvcF9kY19jc2JwLCB1MV91diwgdTFfY2JmOwoKICAgICAgICB1MV9sZWZ0X2RjX2NzYnAgPSAocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0pID4+IDE7CiAgICAgICAgdTFfdG9wX2RjX2NzYnAgPSAocHNfdG9wX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnApID4+IDE7CgogICAgICAgIGZvciAodTFfdXYgPSAwOyB1MV91diA8IDI7IHUxX3V2KyspCiAgICAgICAgewogICAgICAgICAgICBQQVJTRV9DT0VGRl9EQVRBX0JMT0NLXzR4NChwdl9tYl9jb2VmZl9kYXRhLCBwc19tYl9jb2VmZl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9ubnosIHUyX3NpZ19jb2VmZl9tYXAsIHBpMl9yZXNfYmxvY2spOwogICAgICAgICAgICB1MV9jYmYgPSAhISh1MV9ubnopOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVV09SRDggdTFfYSwgdTFfYjsKICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgICAgICAgICAgICAgIHUxX2EgPSAodTFfbGVmdF9kY19jc2JwID4+IHUxX3V2KSAmIDB4MDE7CiAgICAgICAgICAgICAgICB1MV9iID0gKHUxX3RvcF9kY19jc2JwID4+IHUxX3V2KSAmIDB4MDE7CiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHUxX2EgKyAodTFfYiA8PCAxKSk7CgogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX2NiZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKENIUk9NQV9EQ19DVFhDQVQgPDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaW5jKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHUxX2NiZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KHBpMl9yZXNfYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0VGRl9BQlNfTEVWRUxfTUlOVVMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09FRkZfQUJTX0xFVkVMX0NBVF8zX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHX0NPRUZGX0NUWFRfQ0FUXzNfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAgICAgU0VUQklUKHUxX3RvcF9kY19jc2JwLCB1MV91dik7CiAgICAgICAgICAgICAgICBTRVRCSVQodTFfbGVmdF9kY19jc2JwLCB1MV91dik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV90b3BfZGNfY3NicCwgdTFfdXYpOwogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfbGVmdF9kY19jc2JwLCB1MV91dik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLyogICAgICBVcGRhdGUgdGhlIERDIGNzYnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHgxOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHgxOwogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdIHw9ICh1MV9sZWZ0X2RjX2NzYnAgPDwgMSk7CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCB8PSAodTFfdG9wX2RjX2NzYnAgPDwgMSk7CiAgICB9CiAgICAvKioqKioqKioqKioqKioqKioqKi8KICAgIC8qIFdyaXRlIENocm9tYSBBQyAqLwogICAgLyoqKioqKioqKioqKioqKioqKiovCiAgICB7CiAgICAgICAgaWYgKHUxX2Nocm9tYV9jYnAgPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEOCB1MV91dl9ibGtubywgdTFfbGVmdF9hY19jc2JwLCB1MV90b3BfYWNfY3NicDsKICAgICAgICAgICAgV09SRDE2ICpwaTJfcmVzX2Jsb2NrOwogICAgICAgICAgICB1MV9sZWZ0X2FjX2NzYnAgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwWzBdOwogICAgICAgICAgICB1MV90b3BfYWNfY3NicCA9IHBzX3RvcF9jdHh0X21iX2luZm8tPnUxX3l1dl9hY19jc2JwID4+IDQ7CgogICAgICAgICAgICBmb3IgKHUxX3V2X2Jsa25vID0gMDsgdTFfdXZfYmxrbm8gPCA4OyB1MV91dl9ibGtubysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVV09SRDggdTFfY2JmOwogICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2IyYjAsIHUxX2IyYjE7CiAgICAgICAgICAgICAgICBQQVJTRV9DT0VGRl9EQVRBX0JMT0NLXzR4NChwdl9tYl9jb2VmZl9kYXRhLCBwc19tYl9jb2VmZl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LCB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkyX3Jlc19ibG9jayk7CgogICAgICAgICAgICAgICAgdTFfY2JmID0gISEodTFfbm56KTsKICAgICAgICAgICAgICAgIHUxX2IyYjAgPSAoKHUxX3V2X2Jsa25vICYgMHg0KSA+PiAxKSB8ICh1MV91dl9ibGtubyAmIDB4MSk7CiAgICAgICAgICAgICAgICB1MV9iMmIxID0gKCh1MV91dl9ibGtubyAmIDB4NCkgPj4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodTFfdXZfYmxrbm8gJiAweDIpID4+IDEpOwoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBVV09SRDggdTFfYSwgdTFfYjsKICAgICAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgY29kZWRfYmxvY2tfZmxhZyAqLwogICAgICAgICAgICAgICAgICAgIHUxX2EgPSAodTFfbGVmdF9hY19jc2JwID4+IHUxX2IyYjEpICYgMHgxOwogICAgICAgICAgICAgICAgICAgIHUxX2IgPSAodTFfdG9wX2FjX2NzYnAgPj4gdTFfYjJiMCkgJiAweDE7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IHUxX2EgKyAodTFfYiA8PCAxKTsKCiAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9jYmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBDQkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKENIUk9NQV9BQ19DVFhDQVQgPDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2luYyk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHUxX2NiZikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQocGkyX3Jlc19ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZfQUJTX0xFVkVMX01JTlVTMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0VGRl9BQlNfTEVWRUxfQ0FUXzRfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyArU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdfQ09FRkZfQ1RYVF9DQVRfNF9PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgICAgICAgICBTRVRCSVQodTFfbGVmdF9hY19jc2JwLCB1MV9iMmIxKTsKICAgICAgICAgICAgICAgICAgICBTRVRCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjJiMSk7CiAgICAgICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgLyogICAgICBVcGRhdGUgdGhlIEFDIGNzYnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwWzBdID0gdTFfbGVmdF9hY19jc2JwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4MGY7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgfD0gKHUxX3RvcF9hY19jc2JwIDw8IDQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwWzBdID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweGY7CiAgICAgICAgfQogICAgfQogICAgcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGEgPSBwdl9tYl9jb2VmZl9kYXRhOwp9CgoKCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIEVuY29kZXMgUmVzaWR1ZXMgZm9yIHRoZSBNQiBhcyBkZWZpbmVkIGluIDcuMy41LjMKICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgUG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEBwYXJhbVtpbl0gdTFfY2JwCiAqIGNvZGVkIGJsb2NrIHBhdHRlcm4KICoKICogQHBhcmFtW2luXSB1MV9jdHhfY2F0CiAqIENvbnRleHQgY2F0ZWdvcnksIExVTUFfQUNfQ1RYQ0FUIG9yIExVTUFfNHg0X0NUWENBVAogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY2JwLCBVV09SRDggdTFfY3R4X2NhdCkKewogICAgLyogQ0FCQUMgY29udGV4dCAqLwogICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0ID0gcHNfZW50X2N0eHQtPnBzX2NhYmFjOwoKICAgIHR1X3NibGtfY29lZmZfZGF0YV90ICpwc19tYl9jb2VmZl9kYXRhOwogICAgLyogcGFja2VkIHJlc2lkdWUgKi8KICAgIHZvaWQgKnB2X21iX2NvZWZmX2RhdGEgPSBwc19lbnRfY3R4dC0+cHZfbWJfY29lZmZfZGF0YTsKICAgIFVXT1JEMTYgdTJfc2lnX2NvZWZmX21hcDsKICAgIFVXT1JEOCB1MV9ubno7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfY3Vycl9jdHh0OwogICAgbWJfaW5mb19jdHh0X3QgKnBzX3RvcF9jdHh0OwogICAgVVdPUkQ4IHUxX2xlZnRfYWNfY3NicDsKICAgIFVXT1JEOCB1MV90b3BfYWNfY3NicDsKICAgIFVXT1JEMzIgdTRfY3R4X2lkeF9vZmZzZXRfc2lnX2NvZWYsIHU0X2N0eF9pZHhfb2Zmc2V0X2Fic19sdmw7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKICAgIHBzX3RvcF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mbzsKICAgIHUxX2xlZnRfYWNfY3NicCA9IHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicFswXTsKICAgIHUxX3RvcF9hY19jc2JwID0gcHNfdG9wX2N0eHQtPnUxX3l1dl9hY19jc2JwOwoKICAgIGlmICh1NF9jYnAgJiAweGYpCiAgICB7CiAgICAgICAgLyogIFdyaXRlIGx1bWEgcmVzaWR1ZSAgKi8KICAgICAgICBVV09SRDggdTFfb2Zmc2V0OwogICAgICAgIFdPUkQxNiAqcGkyX3Jlc19ibG9jazsKICAgICAgICBVV09SRDggdTFfc3ViYmxrX251bTsKICAgICAgICBpZiAodTFfY3R4X2NhdCA9PSBMVU1BX0FDX0NUWENBVCkKICAgICAgICB7CiAgICAgICAgICAgIHUxX29mZnNldCA9IDE7CiAgICAgICAgICAgIHU0X2N0eF9pZHhfb2Zmc2V0X3NpZ19jb2VmID0gU0lHX0NPRUZGX0NUWFRfQ0FUXzFfT0ZGU0VUOwogICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9hYnNfbHZsID0gQ09FRkZfQUJTX0xFVkVMX01JTlVTMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09FRkZfQUJTX0xFVkVMX0NBVF8xX09GRlNFVDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdTFfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgdTRfY3R4X2lkeF9vZmZzZXRfc2lnX2NvZWYgPSBTSUdfQ09FRkZfQ1RYVF9DQVRfMl9PRkZTRVQ7CiAgICAgICAgICAgIHU0X2N0eF9pZHhfb2Zmc2V0X2Fic19sdmwgPSBDT0VGRl9BQlNfTEVWRUxfTUlOVVMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPRUZGX0FCU19MRVZFTF9DQVRfMl9PRkZTRVQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHUxX3N1YmJsa19udW0gPSAwOyB1MV9zdWJibGtfbnVtIDwgMTY7IHUxX3N1YmJsa19udW0rKykKICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEOCB1MV9iMCwgdTFfYjEsIHUxX2IyLCB1MV9iMywgdTFfYjJiMCwgdTFfYjNiMSwgdTFfYjNiMjsKICAgICAgICAgICAgdTFfYjAgPSAodTFfc3ViYmxrX251bSAmIDB4MSk7CiAgICAgICAgICAgIHUxX2IxID0gKHUxX3N1YmJsa19udW0gJiAweDIpID4+IDE7CiAgICAgICAgICAgIHUxX2IyID0gKHUxX3N1YmJsa19udW0gJiAweDQpID4+IDI7CiAgICAgICAgICAgIHUxX2IzID0gKHUxX3N1YmJsa19udW0gJiAweDgpID4+IDM7CiAgICAgICAgICAgIHUxX2IyYjAgPSAodTFfYjIgPDwgMSkgfCAodTFfYjApOwogICAgICAgICAgICB1MV9iM2IxID0gKHUxX2IzIDw8IDEpIHwgKHUxX2IxKTsKICAgICAgICAgICAgdTFfYjNiMiA9ICh1MV9iMyA8PCAxKSB8ICh1MV9iMik7CgogICAgICAgICAgICBpZiAoISgodTRfY2JwID4+IHUxX2IzYjIpICYgMHgxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgYmxvY2sgaXMgbm90IGNvZGVkIHNvIHNraXAgYWxsIHRoZSBzdWIgYmxvY2sgKi8KICAgICAgICAgICAgICAgIC8qIGFuZCBzZXQgdGhlIHBvaW50ZXIgb2Ygc2NhbiBsZXZlbCwgY3NicCBhY2Nyb2RpbmdseSAgICAgICovCiAgICAgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV90b3BfYWNfY3NicCwgdTFfYjJiMCk7CiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV90b3BfYWNfY3NicCwgKHUxX2IyYjAgKyAxKSk7CiAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV9sZWZ0X2FjX2NzYnAsIHUxX2IzYjEpOwogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfbGVmdF9hY19jc2JwLCAodTFfYjNiMSArIDEpKTsKCiAgICAgICAgICAgICAgICB1MV9zdWJibGtfbnVtICs9IDM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVV09SRDggdTFfY3NiZjsKCiAgICAgICAgICAgICAgICBQQVJTRV9DT0VGRl9EQVRBX0JMT0NLXzR4NChwdl9tYl9jb2VmZl9kYXRhLCBwc19tYl9jb2VmZl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LCB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkyX3Jlc19ibG9jayk7CgogICAgICAgICAgICAgICAgdTFfY3NiZiA9ICEhKHUxX25ueik7CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2EsIHUxX2I7CiAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgICAgICAgICAgICAgICAgIHUxX2IgPSAodTFfdG9wX2FjX2NzYnAgPj4gdTFfYjJiMCkgJiAweDAxOwogICAgICAgICAgICAgICAgICAgIHUxX2EgPSAodTFfbGVmdF9hY19jc2JwID4+IHUxX2IzYjEpICYgMHgwMTsKICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gdTFfYSArICh1MV9iIDw8IDEpOwoKICAgICAgICAgICAgICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfY3NiZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIENCRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh1MV9jdHhfY2F0IDw8IDIpICsgdTRfY3R4X2luYyk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICAgICAgICAgLyogV3JpdGUgY29kZWRfYmxvY2tfZmxhZyAqLwogICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICAgICAgICAgaWYgKHUxX2NzYmYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KHBpMl9yZXNfYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEOCkgKDE1IC0gdTFfb2Zmc2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2lkeF9vZmZzZXRfYWJzX2x2bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2lkeF9vZmZzZXRfc2lnX2NvZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgICAgICAgICBTRVRCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwogICAgICAgICAgICAgICAgICAgIFNFVEJJVCh1MV9sZWZ0X2FjX2NzYnAsIHUxX2IzYjEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX3RvcF9hY19jc2JwLCB1MV9iMmIwKTsKICAgICAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV9sZWZ0X2FjX2NzYnAsIHUxX2IzYjEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiAgICAgICAgICAgICAgICAgICBVcGRhdGUgdGhlIEFDIGNzYnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicFswXSA9IHUxX2xlZnRfYWNfY3NicCAmIDB4ZjsKICAgICAgICB1MV90b3BfYWNfY3NicCAmPSAweDBmOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgJj0gMHhmMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwIHw9IHUxX3RvcF9hY19jc2JwOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicFswXSA9IDA7CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweGYwOwogICAgfQoKICAgIC8qICAgICBXcml0ZSBjaHJvbWEgcmVzaWR1ZSAqLwoKICAgIHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhID0gcHZfbWJfY29lZmZfZGF0YTsKICAgIHsKICAgICAgICBVV09SRDggdTFfY2JwX2Nocm9tYTsKICAgICAgICB1MV9jYnBfY2hyb21hID0gdTRfY2JwID4+IDQ7CiAgICAgICAgaWYgKHUxX2NicF9jaHJvbWEpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY2hyb21hX3Jlc2lkdWUocHNfZW50X2N0eHQsIHUxX2NicF9jaHJvbWEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDE7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHgxOwogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwWzBdID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweGY7CiAgICAgICAgfQogICAgfQp9CgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIEVuY29kZXMgYSBNb3Rpb24gdmVjdG9yICg5LjMuMy4xLjEuNyApCiAqCiAqIEBwYXJhbVtpbl0gdTFfbXZkCiAqICBNb3Rpb24gdmVjdG9yIHRvIGJlIGVuY29kZWQKICoKICogQHBhcmFtW2luXSB1NF9jdHhfaWR4X29mZnNldAogKiAqICBjdHhJZHhPZmZzZXQgZm9yIE1WX1ggb3IgTVZfWWNvbnRleHQKICoKICogQHBhcmFtW2luXSAgdWkyX2Fic19tdmQKICogc3VtIG9mIGFic29sdXRlIHZhbHVlIG9mIGNvcnJlc3BvbmRpbmcgbmVpZ2hib3JpbmcgbW90aW9uIHZlY3RvcnMKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQoV09SRDE2IHUxX212ZCwgVVdPUkQzMiB1NF9jdHhfaWR4X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMTYgdWkyX2Fic19tdmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQpCnsKCiAgICBVV09SRDggIHUxX2JpbiwgdTFfY3R4dF9pbmM7CiAgICBXT1JEOCBrID0gMywgdTFfY29mZiA9IDk7CiAgICBXT1JEMTYgaTJfYWJzX212ZCwgaTJfc3VmczsKICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfYmluczsKICAgIFdPUkQ4IGkxX2JpbnNfbGVuOwoKICAgIC8qIGlmIG12ZCA8IHUxX2NvZmYKICAgICBvbmx5IFByZWZpeAogICAgIGVsc2UKICAgICBQcmVmaXggKyBTdWZmaXgKCiAgICAgZW5jb2RlIHNpZ24gYml0CgogICAgIFByZWZpeCBUVSBlbmNvZGluZyBDbWF4ID11MV9jb2ZmIGFuZCBTdWZmaXggM3JkIG9yZGVyIEV4cC1Hb2xvbWIKICAgICAqLwoKICAgIGlmICh1aTJfYWJzX212ZCA8IDMpCiAgICAgICAgdTRfY3R4X2luYyA9IDA7CiAgICBlbHNlIGlmICh1aTJfYWJzX212ZCA+IDMyKQogICAgICAgIHU0X2N0eF9pbmMgPSAyOwogICAgZWxzZQogICAgICAgIHU0X2N0eF9pbmMgPSAxOwoKICAgIHU0X2JpbnMgPSAwOwogICAgaTFfYmluc19sZW4gPSAxOwoKICAgIGlmICh1MV9tdmQgPT0gMCkKICAgIHsKICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyB1NF9jdHhfaWR4X29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaW5jKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpMl9hYnNfbXZkID0gQUJTKHUxX212ZCk7CiAgICAgICAgaWYgKGkyX2Fic19tdmQgPj0gdTFfY29mZikKICAgICAgICB7CiAgICAgICAgICAgIC8qIFByZWZpeCBUVSBpLmUgc3RyaW5nIG9mIDkgMSdzICovCiAgICAgICAgICAgIHU0X2JpbnMgPSAweDFmZjsKICAgICAgICAgICAgaTFfYmluc19sZW4gPSA5OwogICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDA2NTQzMCk7CgogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2lkeF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIC8qIFN1ZmZpeCwgdXNlcyBFbmNvZGVCeXBhc3MgKi8KICAgICAgICAgICAgdTRfYmlucyA9IDA7CiAgICAgICAgICAgIGkxX2JpbnNfbGVuID0gMDsKICAgICAgICAgICAgaTJfc3VmcyA9IGkyX2Fic19tdmQgLSB1MV9jb2ZmOwogICAgICAgICAgICB3aGlsZSAoMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkyX3N1ZnMgPj0gKDEgPDwgaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgKDMxIC0gaTFfYmluc19sZW4pKSk7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICBpMl9zdWZzID0gaTJfc3VmcyAtICgxIDw8IGspOwogICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1MV9iaW4gPSAoKGkyX3N1ZnMgPj4gaykgJiAweDAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKHUxX2JpbiA8PCAoMzEgLSBpMV9iaW5zX2xlbikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdTRfYmlucyA+Pj0gKDMyIC0gaTFfYmluc19sZW4pOwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW5zKHBzX2NhYmFjX2N0eHQsIHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBQcmVmaXggb25seSAqLwogICAgICAgICAgICAvKiBiMCAqLwogICAgICAgICAgICB1NF9iaW5zID0gMTsKICAgICAgICAgICAgaTJfYWJzX212ZC0tOwogICAgICAgICAgICB1MV9jdHh0X2luYyA9IDM7CiAgICAgICAgICAgIHdoaWxlIChpMl9hYnNfbXZkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpMl9hYnNfbXZkLS07CiAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgaWYgKHUxX2N0eHRfaW5jIDw9IDYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHUxX2N0eHRfaW5jIDw8IChpMV9iaW5zX2xlbiA8PCAyKSkpOwogICAgICAgICAgICAgICAgICAgIHUxX2N0eHRfaW5jKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEVuY29kZSBUZXJtaW5hdGluZyBiaXQgKi8KICAgICAgICAgICAgaWYgKGkxX2JpbnNfbGVuIDw9IDQpCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAodTFfY3R4dF9pbmMgPDwgKGkxX2JpbnNfbGVuIDw8IDIpKSk7CiAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaWR4X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgICAgICAvKiBzaWduIGJpdCwgdXNlcyBFbmNvZGVCeXBhc3MgKi8KICAgICAgICBpZiAodTFfbXZkID4gMCkKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9ieXBhc3NfYmluKHBzX2NhYmFjX2N0eHQsIDApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9ieXBhc3NfYmluKHBzX2NhYmFjX2N0eHQsIDEpOwogICAgfQp9CgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIEVuY29kZXMgYWxsIG1vdGlvbiB2ZWN0b3JzIGZvciBhIFAxNngxNiBNQgogKgogKiBAcGFyYW1baW5dIHBzX2NhYmFjX2N0eHQKICogIFBvaW50ZXIgdG8gY2FiYWMgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHBhcmFtW2luXSBwaTJfbXZfcHRyCiAqIFBvaW50ZXIgdG8gYXJyYXkgb2YgbW90aW9uIHZlY3RvcnMKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfbXZkc19wMTZ4MTYoY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQxNiAqcGkyX212X3B0cikKewoKCiAgICAvKiBFbmNvZGUgdGhlIGRpZmZlcmVudGlhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3JzICovCgogICAgewogICAgICAgIFVXT1JEOCB1MV9hYnNfbXZkX3gsIHUxX2Fic19tdmRfeTsKICAgICAgICBVV09SRDggKnB1MV90b3BfbXZfY3R4dCwgKnB1MV9sZnRfbXZfY3R4dDsKICAgICAgICBXT1JEMTYgdTJfbXY7CiAgICAgICAgdTFfYWJzX212ZF94ID0gMDsKICAgICAgICB1MV9hYnNfbXZkX3kgPSAwOwogICAgICAgIHB1MV90b3BfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9tdlswXTsKICAgICAgICBwdTFfbGZ0X212X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luY1swXTsKICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEMTYgdTJfYWJzX212ZF94X2EsIHUyX2Fic19tdmRfeF9iLCB1Ml9hYnNfbXZkX3lfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3hfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMF07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iID0gKFVXT1JEMTYpIHB1MV90b3BfbXZfY3R4dFsxXTsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzBdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYSA9IChVV09SRDE2KSBwdTFfbGZ0X212X2N0eHRbMV07CiAgICAgICAgICAgIHUyX212ID0gKihwaTJfbXZfcHRyKyspOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jdHhfbXZkKHUyX212LCBNVkRfWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEMTYpICh1Ml9hYnNfbXZkX3hfYSArIHUyX2Fic19tdmRfeF9iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICB1MV9hYnNfbXZkX3ggPSBDTElQMygwLCAxMjcsIEFCUyh1Ml9tdikpOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF95X2EgKyB1Ml9hYnNfbXZkX3lfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF95ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICB9CiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBTdG9yZSBhYnNfbXZkX3ZhbHVlcyBjYWJhYyBjb250ZXh0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHUxX3RvcF9tdl9jdHh0WzBdID0gcHUxX2xmdF9tdl9jdHh0WzBdID0gdTFfYWJzX212ZF94OwogICAgICAgIHB1MV90b3BfbXZfY3R4dFsxXSA9IHB1MV9sZnRfbXZfY3R4dFsxXSA9IHUxX2Fic19tdmRfeTsKICAgIH0KfQoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBhbGwgbW90aW9uIHZlY3RvcnMgZm9yIGEgQiBNQiAoQXNzdWVzIHRoYXQgbWJ5cGUgaXMgQl9MMF8xNngxNiwgQl9MMV8xNngxNiBvciBCX0JpXzE2eDE2CiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHBpMl9tdl9wdHIKICogUG9pbnRlciB0byBhcnJheSBvZiBtb3Rpb24gdmVjdG9ycwogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19tdmRzX2IxNngxNihjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRDE2ICpwaTJfbXZfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpNF9tYl9wYXJ0X3ByZWRfbW9kZSApCnsKCiAgICAvKiBFbmNvZGUgdGhlIGRpZmZlcmVudGlhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3JzICovCgogICAgewogICAgICAgIFVXT1JEOCB1MV9hYnNfbXZkX3gsIHUxX2Fic19tdmRfeTsKICAgICAgICBVV09SRDggKnB1MV90b3BfbXZfY3R4dCwgKnB1MV9sZnRfbXZfY3R4dDsKICAgICAgICBXT1JEMTYgdTJfbXY7CiAgICAgICAgdTFfYWJzX212ZF94ID0gMDsKICAgICAgICB1MV9hYnNfbXZkX3kgPSAwOwogICAgICAgIHB1MV90b3BfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9tdlswXTsKICAgICAgICBwdTFfbGZ0X212X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luY1swXTsKICAgICAgICBpZiAoaTRfbWJfcGFydF9wcmVkX21vZGUgIT0gUFJFRF9MMSkvKiB8fCBQUkVEX0JJICovCiAgICAgICAgewogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19tdmRfeF9hLCB1Ml9hYnNfbXZkX3hfYiwgdTJfYWJzX212ZF95X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYjsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2IgPSAoVVdPUkQxNikgcHUxX3RvcF9tdl9jdHh0WzBdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMV07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeF9hID0gKFVXT1JEMTYpIHB1MV9sZnRfbXZfY3R4dFswXTsKICAgICAgICAgICAgdTJfYWJzX212ZF95X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzFdOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSAqKHBpMl9tdl9wdHIrKyk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQodTJfbXYsIE1WRF9ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQxNikgKHUyX2Fic19tdmRfeV9hICsgdTJfYWJzX212ZF95X2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIHUxX2Fic19tdmRfeSA9IENMSVAzKDAsIDEyNywgQUJTKHUyX212KSk7CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLyogU3RvcmUgYWJzX212ZF92YWx1ZXMgY2FiYWMgY29udGV4dHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHB1MV90b3BfbXZfY3R4dFswXSA9IHB1MV9sZnRfbXZfY3R4dFswXSA9IHUxX2Fic19tdmRfeDsKICAgICAgICBwdTFfdG9wX212X2N0eHRbMV0gPSBwdTFfbGZ0X212X2N0eHRbMV0gPSB1MV9hYnNfbXZkX3k7CgogICAgICAgIHUxX2Fic19tdmRfeCA9IDA7CiAgICAgICAgdTFfYWJzX212ZF95ID0gMDsKICAgICAgICBpZiAoaTRfbWJfcGFydF9wcmVkX21vZGUgIT0gUFJFRF9MMCkvKiB8fCBQUkVEX0JJICovCiAgICAgICAgewogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19tdmRfeF9hLCB1Ml9hYnNfbXZkX3hfYiwgdTJfYWJzX212ZF95X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYjsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2IgPSAoVVdPUkQxNikgcHUxX3RvcF9tdl9jdHh0WzJdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbM107CiAgICAgICAgICAgIHUyX2Fic19tdmRfeF9hID0gKFVXT1JEMTYpIHB1MV9sZnRfbXZfY3R4dFsyXTsKICAgICAgICAgICAgdTJfYWJzX212ZF95X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzNdOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSAqKHBpMl9tdl9wdHIrKyk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQodTJfbXYsIE1WRF9ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQxNikgKHUyX2Fic19tdmRfeV9hICsgdTJfYWJzX212ZF95X2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIHUxX2Fic19tdmRfeSA9IENMSVAzKDAsIDEyNywgQUJTKHUyX212KSk7CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLyogU3RvcmUgYWJzX212ZF92YWx1ZXMgY2FiYWMgY29udGV4dHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHB1MV90b3BfbXZfY3R4dFsyXSA9IHB1MV9sZnRfbXZfY3R4dFsyXSA9IHUxX2Fic19tdmRfeDsKICAgICAgICBwdTFfdG9wX212X2N0eHRbM10gPSBwdTFfbGZ0X212X2N0eHRbM10gPSB1MV9hYnNfbXZkX3k7CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgYW4gSW50cmEgU2xpY2UuCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAgVGhlIG1iIHN5bnRheCBsYXllciBmb3IgaW50cmEgc2xpY2VzIGNvbnN0aXR1dGVzIGx1bWEgbWIgbW9kZSwgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24uCiAqCiAqIEBwYXJhbVtpbl0gcHNfZW50X2N0eHQKICogIHBvaW50ZXIgdG8gZW50cm9weSBjb250ZXh0CiAqCiAqIEByZXR1cm5zIGVycm9yIGNvZGUKICoKICogQHJlbWFya3Mgbm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KSUgyNjRFX0VSUk9SX1QgaWgyNjRlX3dyaXRlX2lzbGljZV9tYl9jYWJhYyhlbnRyb3B5X2N0eHRfdCAqcHNfZW50X2N0eHQpCnsKICAgIC8qIGJpdCBzdHJlYW0gcHRyICovCiAgICBiaXRzdHJtX3QgKnBzX2JpdHN0cmVhbSA9IHBzX2VudF9jdHh0LT5wc19iaXRzdHJtOwogICAgLyogQ0FCQUMgY29udGV4dCAqLwogICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0ID0gcHNfZW50X2N0eHQtPnBzX2NhYmFjOwogICAgLyogcGFja2VkIGhlYWRlciBkYXRhICovCiAgICBVV09SRDggKnB1MV9ieXRlID0gcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKICAgIFdPUkQzMiBtYl90cG0sIG1iX3R5cGUsIGNicCwgY2hyb21hX2ludHJhX21vZGUsIGx1bWFfaW50cmFfbW9kZTsKICAgIFdPUkQ4IG1iX3FwX2RlbHRhOwogICAgVVdPUkQzMiB1NF9jYnBfbCwgdTRfY2JwX2M7CiAgICBXT1JEMzIgYnl0ZV9jb3VudCA9IDA7CiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgaWYgKChwc19iaXRzdHJlYW0tPnU0X3N0cm1fYnVmX29mZnNldCArIE1JTl9TVFJFQU1fU0laRV9NQikKICAgICAgICAgICAgICAgICAgICA+PSBwc19iaXRzdHJlYW0tPnU0X21heF9zdHJtX3NpemUpCiAgICB7CiAgICAgICAgLyogcmV0dXJuIHdpdGhvdXQgY29ycnVwdGluZyB0aGUgYnVmZmVyIGJleW9uZCBpdHMgc2l6ZSAqLwogICAgICAgIHJldHVybiAoSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpOwogICAgfQogICAgLyogbWIgaGVhZGVyIGluZm8gKi8KICAgIG1iX3RwbSA9ICpwdTFfYnl0ZSsrOwogICAgYnl0ZV9jb3VudCsrOwogICAgY2JwID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CiAgICBtYl9xcF9kZWx0YSA9ICpwdTFfYnl0ZSsrOwogICAgYnl0ZV9jb3VudCsrOwogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKCiAgICBpaDI2NGVfZ2V0X2NhYmFjX2NvbnRleHQocHNfZW50X2N0eHQsIG1iX3R5cGUpOwogICAgcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CgogICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgIHU0X2NicF9jID0gKGNicCA+PiA0KTsKICAgIHU0X2NicF9sID0gKGNicCAmIDB4Rik7CiAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICB7CiAgICAgICAgbHVtYV9pbnRyYV9tb2RlID0gKChtYl90cG0gPj4gNCkgJiAzKSArIDEgKyAodTRfY2JwX2MgPDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbHVtYV9pbnRyYV9tb2RlID0gMDsKICAgIH0KCiAgICBjaHJvbWFfaW50cmFfbW9kZSA9IChtYl90cG0gPj4gNik7CgogICAgLyogRW5jb2RlIEludHJhIHByZWQgbW9kZSwgTHVtYSAqLwogICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKElTTElDRSwgbHVtYV9pbnRyYV9tb2RlLCBwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfSV9TTElDRSk7CgogICAgaWYgKG1iX3R5cGUgPT0gSTR4NCkKICAgIHsgICAvKiBFbmNvZGUgNHg0IE1CIG1vZGVzICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY180eDRtYl9tb2Rlcyhwc19jYWJhY19jdHh0LCBwdTFfYnl0ZSk7CiAgICAgICAgYnl0ZV9jb3VudCArPSA4OwogICAgfQogICAgLyogRW5jb2RlIGNocm9tYSBtb2RlICovCiAgICBpaDI2NGVfY2FiYWNfZW5jX2Nocm9tYV9wcmVkbW9kZShjaHJvbWFfaW50cmFfbW9kZSwgcHNfY2FiYWNfY3R4dCk7CgogICAgaWYgKG1iX3R5cGUgIT0gSTE2eDE2KQogICAgeyAvKiBFbmNvZGUgTUIgY2JwICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKICAgIH0KCiAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICB7CiAgICAgICAgLyogRW5jb2RlIG1iX3FwX2RlbHRhICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKHBzX2VudF9jdHh0KTsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IEk0eDQ7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicCkgPSAwOwogICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgLyogQ29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdXNlZCB1c2VkIGZvciBlbmNvZGluZyB0aGUgTUIgc3ludGF4ICovCiAgICB9CiAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfY2JwID0gY2JwOwogICAgcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhID0gKChXT1JEOCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSkgKyBieXRlX2NvdW50OwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwoKICAgIH0KICAgIHJldHVybiBJSDI2NEVfU1VDQ0VTUzsKfQoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgSW50ZXIgc2xpY2VzCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAgVGhlIG1iIHN5bnRheCBsYXllciBmb3IgaW50ZXIgc2xpY2VzIGNvbnN0aXR1dGVzIGx1bWEgbWIgbW9kZSwgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgcG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQKICoKICogQHJldHVybnMgZXJyb3IgY29kZQogKgogKiBAcmVtYXJrcyBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpJSDI2NEVfRVJST1JfVCBpaDI2NGVfd3JpdGVfcHNsaWNlX21iX2NhYmFjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewogICAgLyogYml0IHN0cmVhbSBwdHIgKi8KICAgIGJpdHN0cm1fdCAqcHNfYml0c3RyZWFtID0gcHNfZW50X2N0eHQtPnBzX2JpdHN0cm07CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKCiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgV09SRDMyIGJ5dGVfY291bnQgPSAwOwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKCiAgICBpZiAoKHBzX2JpdHN0cmVhbS0+dTRfc3RybV9idWZfb2Zmc2V0ICsgTUlOX1NUUkVBTV9TSVpFX01CKQogICAgICAgICAgICAgICAgICAgID49IHBzX2JpdHN0cmVhbS0+dTRfbWF4X3N0cm1fc2l6ZSkKICAgIHsKICAgICAgICAvKiByZXR1cm4gd2l0aG91dCBjb3JydXB0aW5nIHRoZSBidWZmZXIgYmV5b25kIGl0cyBzaXplICovCiAgICAgICAgcmV0dXJuIChJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVyk7CiAgICB9CiAgICAvKiBtYiBoZWFkZXIgaW5mbyAqLwogICAgbWJfdHBtID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CgogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKICAgIC8qIENBQkFDIGNvbnRleHRzIGZvciB0aGUgTUIgKi8KICAgIGloMjY0ZV9nZXRfY2FiYWNfY29udGV4dChwc19lbnRfY3R4dCwgbWJfdHlwZSk7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKiBpZiBJbnRyYSBNQiAqLwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2IHx8IG1iX3R5cGUgPT0gSTR4NCkKICAgIHsKICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwoKICAgICAgICAvKiBFbmNvZGUgbWJfc2tpcF9mbGFnICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKICAgICAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICAgICAgdTRfY2JwX2wgPSAoY2JwICYgMHhGKTsKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBsdW1hX2ludHJhX21vZGUgPSAoKG1iX3RwbSA+PiA0KSAmIDMpICsgMSArICh1NF9jYnBfYyA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIEVuY29kZSBpbnRyYSBtYiB0eXBlICovCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNQl9UWVBFX1BfU0xJQ0UpOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKFBTTElDRSwgKFVXT1JEOCkgbHVtYV9pbnRyYV9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwgTUJfVFlQRV9QX1NMSUNFKTsKICAgICAgICB9CgogICAgICAgIGlmIChtYl90eXBlID09IEk0eDQpCiAgICAgICAgeyAgIC8qIEludHJhIDR4NCBtb2RlcyAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jXzR4NG1iX21vZGVzKHBzX2NhYmFjX2N0eHQsIHB1MV9ieXRlKTsKICAgICAgICAgICAgYnl0ZV9jb3VudCArPSA4OwogICAgICAgIH0KICAgICAgICBjaHJvbWFfaW50cmFfbW9kZSA9IChtYl90cG0gPj4gNik7CgogICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2hyb21hX3ByZWRtb2RlKGNocm9tYV9pbnRyYV9tb2RlLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgaWYgKG1iX3R5cGUgIT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgLyogZW5jb2RlIENCUCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2NicChjYnAsIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChjYnAgPiAwKSB8fCAobWJfdHlwZSA9PSBJMTZ4MTYpKQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0OwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgUmVzaWR1ZSAqLwogICAgICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IChVV09SRDgpIGNicDsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKHBzX2VudF9jdHh0KTsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZShwc19lbnRfY3R4dCwgY2JwLCBMVU1BX0FDX0NUWENBVCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IChVV09SRDgpIGNicDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IEk0eDQ7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfSTR4NDsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZShwc19lbnRfY3R4dCwgY2JwLCBMVU1BXzRYNF9DVFhDQVQpOwogICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX3l1dl9kY19jc2JwICY9IDB4NjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkZSBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCA9IDA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnApID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95X2FjX2NzYnApID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicCkgPSAwOwogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgIG1lbXNldChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luYywgMCwgMTYpOwogICAgICAgIHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9jYnAgPSAoVVdPUkQ4KSBjYnA7CgogICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgIH0KCiAgICAgICAgcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhID0gKChXT1JEOCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSkgKyBieXRlX2NvdW50OwoKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9CiAgICBlbHNlIC8qIEludGVyIE1CICovCiAgICB7CiAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgLyogRW5jb2RpbmcgUDE2eDE2ICovCiAgICAgICAgaWYgKG1iX3R5cGUgIT0gUFNLSVApCiAgICAgICAgewogICAgICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICAgICAgYnl0ZV9jb3VudCsrOwogICAgICAgICAgICBtYl9xcF9kZWx0YSA9ICpwdTFfYnl0ZSsrOwogICAgICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl9za2lwICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcCgwLCBwc19jYWJhY19jdHh0LCBNQl9TS0lQX0ZMQUdfUF9TTElDRSk7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl90eXBlIGFzIFAxNngxNiAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmNfcDsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmNfcCA9ICgweDAxMCArICgoMikgPDwgOCkpOwoKICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucygwLCAzLCB1NF9jdHhfaW5jX3AsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZVtNQl9UWVBFX1BfU0xJQ0VdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfUDsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV09SRDE2ICpwaTJfbXZfcHRyID0gKFdPUkQxNiAqKSBwdTFfYnl0ZTsKICAgICAgICAgICAgICAgIGJ5dGVfY291bnQgKz0gNDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IChwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENBQl9OT05fQkQxNngxNik7CiAgICAgICAgICAgICAgICAgLyogRW5jb2RpbmcgbW90aW9uIHZlY3RvciBmb3IgUDE2eDE2ICovCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX212ZHNfcDE2eDE2KHBzX2NhYmFjX2N0eHQsIHBpMl9tdl9wdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgIH0KICAgICAgICBlbHNlLyogTUIgPSBQU0tJUCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDEsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKCiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9QX1NLSVA7CiAgICAgICAgICAgICgqcHNfZW50X2N0eHQtPnBpNF9tYl9za2lwX3J1bikrKzsKCiAgICAgICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgICAgIG1lbXNldChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luYywgMCwgMTYpOwogICAgICAgICAgICBjYnAgPSAwOwoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1sxXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCgogICAgICAgIH0KCiAgICAgICAgaWYgKGNicCA+IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBFbmNvZGUgcmVzaWR1ZSAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkZSBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4NjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDY7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnApID0gMDsKICAgICAgICB9CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gY2JwOwogICAgICAgIHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSA9ICgoV09SRDggKilwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEpICsgYnl0ZV9jb3VudDsKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9Cn0KCgovKiAhIDwgVGFibGUgOS0zNyCWIEJpbmFyaXphdGlvbiBmb3IgbWFjcm9ibG9jayB0eXBlcyBpbiBCIHNsaWNlcyAgaW4gSVRVX1RfSDI2NC0yMDE0MDIKICogQml0cyAwLTcgOiBiaW5hcmlzZWQgdmFsdWUKICogQml0cyA4LTE1OiBsZW5ndGggb2YgYmluYXJ5IHNlcXVlbmNlICovCgoKc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfYl9tYl90eXBlWzI3XSA9IHsgMHgwMTAwLCAweDAzMDEsIDB4MDMwNSwgMHgwNjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMsIDB4MDYxMywgMHgwNjMzLCAweDA2MGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyYiwgMHgwNjFiLCAweDA2M2IsIDB4MDYxZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzA3LCAweDA3NDcsIDB4MDcyNywgMHgwNzY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTcsIDB4MDc1NywgMHgwNzM3LCAweDA3NzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwZiwgMHgwNzRmLCAweDA2M2YgfTsKLyogQ3R4SW5jIGZvciBtYiB0eXBlcyBpbiBCIHNsaWNlcyAqLwpzdGF0aWMgY29uc3QgVVdPUkQzMiB1aV9iX21iX3R5cGVfY3R4X2luY1syN10gPSB7IDB4MDAsIDB4MDUzMCwgMHgwNTMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTU0MzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTQzMCB9OwoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgQiBzbGljZXMKICoKICogQGRlc2NyaXB0aW9uCiAqICBUaGUgbWIgc3ludGF4IGxheWVyIGZvciBpbnRlciBzbGljZXMgY29uc3RpdHV0ZXMgbHVtYSBtYiBtb2RlLAogKiAgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgcG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQKICoKICogQHJldHVybnMgZXJyb3IgY29kZQogKgogKiBAcmVtYXJrcyBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpJSDI2NEVfRVJST1JfVCBpaDI2NGVfd3JpdGVfYnNsaWNlX21iX2NhYmFjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewogICAgLyogYml0IHN0cmVhbSBwdHIgKi8KICAgIGJpdHN0cm1fdCAqcHNfYml0c3RyZWFtID0gcHNfZW50X2N0eHQtPnBzX2JpdHN0cm07CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKCiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgV09SRDMyIGJ5dGVfY291bnQgPSAwOwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKCiAgICBpZiAoKHBzX2JpdHN0cmVhbS0+dTRfc3RybV9idWZfb2Zmc2V0ICsgTUlOX1NUUkVBTV9TSVpFX01CKQogICAgICAgICAgICAgICAgICAgID49IHBzX2JpdHN0cmVhbS0+dTRfbWF4X3N0cm1fc2l6ZSkKICAgIHsKICAgICAgICAvKiByZXR1cm4gd2l0aG91dCBjb3JydXB0aW5nIHRoZSBidWZmZXIgYmV5b25kIGl0cyBzaXplICovCiAgICAgICAgcmV0dXJuIChJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVyk7CiAgICB9CiAgICAvKiBtYiBoZWFkZXIgaW5mbyAqLwogICAgbWJfdHBtID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CgogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKICAgIC8qIENBQkFDIGNvbnRleHRzIGZvciB0aGUgTUIgKi8KICAgIGloMjY0ZV9nZXRfY2FiYWNfY29udGV4dChwc19lbnRfY3R4dCwgbWJfdHlwZSk7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKiBpZiBJbnRyYSBNQiAqLwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2IHx8IG1iX3R5cGUgPT0gSTR4NCkKICAgIHsKICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwoKICAgICAgICAvKiBFbmNvZGUgbWJfc2tpcF9mbGFnICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKICAgICAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICAgICAgdTRfY2JwX2wgPSAoY2JwICYgMHhGKTsKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBsdW1hX2ludHJhX21vZGUgPSAoKG1iX3RwbSA+PiA0KSAmIDMpICsgMSArICh1NF9jYnBfYyA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIEVuY29kZSBpbnRyYSBtYiB0eXBlICovCiAgICAgICAgewogICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CgogICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfdG9wX2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwoKICAgICAgICAgICAgLyogSW50cmEgUHJlZml4IE9ubHkgIjExMTEwMSIgKi8KICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgwNTU1NTQzMCk7CiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucygweDJmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1RZUEVfQl9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKEJTTElDRSwgKFVXT1JEOCkgbHVtYV9pbnRyYV9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwgTUJfVFlQRV9CX1NMSUNFKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAobWJfdHlwZSA9PSBJNHg0KQogICAgICAgIHsgLyogSW50cmEgNHg0IG1vZGVzICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMocHNfY2FiYWNfY3R4dCwgcHUxX2J5dGUpOwogICAgICAgICAgICBieXRlX2NvdW50ICs9IDg7CiAgICAgICAgfQogICAgICAgIGNocm9tYV9pbnRyYV9tb2RlID0gKG1iX3RwbSA+PiA2KTsKCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jaHJvbWFfcHJlZG1vZGUoY2hyb21hX2ludHJhX21vZGUsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICBpZiAobWJfdHlwZSAhPSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICAvKiBlbmNvZGUgQ0JQICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2JwKGNicCwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKG1iX3FwX2RlbHRhLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBSZXNpZHVlICovCiAgICAgICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlX2x1bWFfZGMocHNfZW50X2N0eHQpOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gSTR4NDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X3Jlc2lkdWVfYml0c1swXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICB9CgogICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX2NicCA9IChVV09SRDgpIGNicDsKCiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0k0eDQ7CiAgICAgICAgfQoKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSAoKFdPUkQ4ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhKSArIGJ5dGVfY291bnQ7CgogICAgICAgIHJldHVybiBJSDI2NEVfU1VDQ0VTUzsKICAgIH0KCiAgICBlbHNlIC8qIEludGVyIE1CICovCiAgICB7CiAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgLyogRW5jb2RpbmcgQl9EaXJlY3RfMTZ4MTYgKi8KICAgICAgICBpZiAobWJfdHlwZSA9PSBCRElSRUNUKQogICAgICAgIHsKICAgICAgICAgICAgY2JwID0gKnB1MV9ieXRlKys7CiAgICAgICAgICAgIGJ5dGVfY291bnQrKzsKICAgICAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICAgICAgYnl0ZV9jb3VudCsrOwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfc2tpcCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3NraXAoMCwgcHNfY2FiYWNfY3R4dCwgTUJfU0tJUF9GTEFHX0JfU0xJQ0UpOwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfdHlwZSBhcyBCX0RpcmVjdF8xNngxNiAqLwogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbWJfaW5mb19jdHh0X3QgKnBzX2xlZnRfY3R4dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jID0gMDsKCiAgICAgICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX2xlZnRfY3R4dC0+dTFfbWJfdHlwZSAmIENBQl9CRDE2eDE2X01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwogICAgICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ0FCX0JEMTZ4MTYpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfVFlQRV9CX1NMSUNFICsgdTRfY3R4X2luYyk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9CRDE2eDE2OwogICAgICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgICAgICBtZW1zZXQocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfbXZfY3R4dF9pbmMsIDAsIDE2KTsKCiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KCiAgICAgICAgfQoKICAgICAgICBlbHNlIGlmIChtYl90eXBlID09IEJTS0lQKS8qIE1CID0gQlNLSVAgKi8KICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcCgxLCBwc19jYWJhY19jdHh0LCBNQl9TS0lQX0ZMQUdfQl9TTElDRSk7CgogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfQl9TS0lQOwoKICAgICAgICAgICAgbWVtc2V0KHBzX2N1cnJfY3R4dC0+dTFfbXYsIDAsIDE2KTsKICAgICAgICAgICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICAgICAgICAgIGNicCA9IDA7CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KCiAgICAgICAgfQoKICAgICAgICBlbHNlIC8qIG1ieXBlIGlzIEJfTDBfMTZ4MTYsIEJfTDFfMTZ4MTYgb3IgQl9CaV8xNngxNiAqLwogICAgICAgIHsKICAgICAgICAgICAgV09SRDMyIGk0X21iX3BhcnRfcHJlZF9tb2RlID0gKG1iX3RwbSA+PiA0KTsKICAgICAgICAgICAgVVdPUkQzMiB1NF9tYl90eXBlID0gbWJfdHlwZSAtIEIxNngxNiArIEJfTDBfMTZ4MTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaTRfbWJfcGFydF9wcmVkX21vZGU7CiAgICAgICAgICAgIGNicCA9ICpwdTFfYnl0ZSsrOwogICAgICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgICAgIG1iX3FwX2RlbHRhID0gKnB1MV9ieXRlKys7CiAgICAgICAgICAgIGJ5dGVfY291bnQrKzsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3NraXAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3R5cGUgYXMgQjE2eDE2ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnBzX2xlZnRfY3R4dF9tYl9pbmZvOwogICAgICAgICAgICAgICAgbWJfaW5mb19jdHh0X3QgKnBzX3RvcF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mbzsKICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CgogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9tYl90eXBlX2JpbnMgPSB1NF9iX21iX3R5cGVbdTRfbWJfdHlwZV07CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2Jpbl9sZW4gPSAodTRfbWJfdHlwZV9iaW5zID4+IDgpICYgMHgwRjsKICAgICAgICAgICAgICAgIHU0X21iX3R5cGVfYmlucyA9IHU0X21iX3R5cGVfYmlucyAmIDB4RkY7CgogICAgICAgICAgICAgICAgaWYgKHBzX2xlZnRfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgKz0gKChwc19sZWZ0X2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKICAgICAgICAgICAgICAgIGlmIChwc190b3BfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgKz0gKChwc190b3BfY3R4dC0+dTFfbWJfdHlwZSAmIENBQl9CRDE2eDE2X01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwoKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSB1NF9jdHhfaW5jIHwgdWlfYl9tYl90eXBlX2N0eF9pbmNbdTRfbWJfdHlwZV07CgogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X21iX3R5cGVfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5fbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmluX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlW01CX1RZUEVfQl9TTElDRV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfTk9OX0JEMTZ4MTY7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFdPUkQxNiAqcGkyX212X3B0ciA9IChXT1JEMTYgKikgcHUxX2J5dGU7CiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHByZWQgbW9kZXMgKi8KCiAgICAgICAgICAgICAgICBieXRlX2NvdW50ICs9IDQgKiAoMSArIChpNF9tYl9wYXJ0X3ByZWRfbW9kZSA9PSBQUkVEX0JJKSk7CgogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gKHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0FCX05PTl9CRDE2eDE2KTsKICAgICAgICAgICAgICAgIC8qIEVuY29kaW5nIG1vdGlvbiB2ZWN0b3IgZm9yIEIxNngxNiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tdmRzX2IxNngxNihwc19jYWJhY19jdHh0LCBwaTJfbXZfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNF9tYl9wYXJ0X3ByZWRfbW9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogRW5jb2RlIENCUCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2NicChjYnAsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgaWYgKGNicCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogZW5jb2RlIG1iX3FwX2RlbHRhICovCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKG1iX3FwX2RlbHRhLCBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1sxXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQgPSBiaXRzdHJlYW1fZW5kX29mZnNldDsKICAgICAgICB9CgogICAgICAgIGlmIChjYnAgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgLyogRW5jb2RlIHJlc2lkdWUgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZGUgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfcmVzaWR1ZV9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CgogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgfQogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlID0gMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IGNicDsKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSAoKFdPUkQ4ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhKSArIGJ5dGVfY291bnQ7CiAgICAgICAgcmV0dXJuIElIMjY0RV9TVUNDRVNTOwogICAgfQp9Cg==