LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQogKiBWZXJzaW9uOiAgMy41CiAqCiAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgogKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCiAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCiAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIEF1dGhvcnM6CiAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdmFsaW51eC5jb20+CiAqCiAqIE1vZGlmaWVkIGZvciBtYWNoNjQgYnk6CiAqICAgIExlaWYgRGVsZ2FzcyA8bGRlbGdhc3NAcmV0aW5hbGJ1cm4ubmV0PgogKiAgICBKb3PpIEZvbnNlY2EgPGpfcl9mb25zZWNhQHlhaG9vLmNvLnVrPgogKi8KCgovKiBVbmxpa2UgdGhlIG90aGVyIHRlbXBsYXRlcyBoZXJlLCB0aGlzIGFzc3VtZXMgcXVpdGUgYSBiaXQgYWJvdXQgdGhlCiAqIHVuZGVybHlpbmcgaGFyZHdhcmUuICBTcGVjaWZpY2FsbHkgaXQgYXNzdW1lcyBhIGQzZC1saWtlIHZlcnRleAogKiBmb3JtYXQsIHdpdGggYSBsYXlvdXQgbW9yZSBvciBsZXNzIGNvbnN0cmFpbmVkIHRvIGxvb2sgbGlrZSB0aGUKICogZm9sbG93aW5nOgogKgogKiB1bmlvbiB7CiAqICAgIHN0cnVjdCB7CiAqICAgICAgICBmbG9hdCB4LCB5LCB6LCB3OwogKiAgICAgICAgc3RydWN0IHsgY2hhciByLCBnLCBiLCBhOyB9IGNvbG9yOwogKiAgICAgICAgc3RydWN0IHsgY2hhciByLCBnLCBiLCBmb2c7IH0gc3BlYzsKICogICAgICAgIGZsb2F0IHUwLCB2MDsKICogICAgICAgIGZsb2F0IHUxLCB2MTsKICogICAgICAgIGZsb2F0IHUyLCB2MjsKICogICAgICAgIGZsb2F0IHUzLCB2MzsKICogICAgfSB2OwogKiAgICBzdHJ1Y3QgewogKiAgICAgICAgZmxvYXQgeCwgeSwgeiwgdzsKICogICAgICAgIHN0cnVjdCB7IGNoYXIgciwgZywgYiwgYTsgfSBjb2xvcjsKICogICAgICAgIHN0cnVjdCB7IGNoYXIgciwgZywgYiwgZm9nOyB9IHNwZWM7CiAqICAgICAgICBmbG9hdCB1MCwgdjAsIHEwOwogKiAgICAgICAgZmxvYXQgdTEsIHYxLCBxMTsKICogICAgICAgIGZsb2F0IHUyLCB2MiwgcTI7CiAqICAgICAgICBmbG9hdCB1MywgdjMsIHEzOwogKiAgICB9IHB2OwogKiAgICBzdHJ1Y3QgewogKiAgICAgICAgZmxvYXQgeCwgeSwgejsKICogICAgICAgIHN0cnVjdCB7IGNoYXIgciwgZywgYiwgYTsgfSBjb2xvcjsKICogICAgfSB0djsKICogICAgZmxvYXQgZlsxNl07CiAqICAgIHVuc2lnbmVkIGludCB1aVsxNl07CiAqICAgIHVuc2lnbmVkIGNoYXIgdWI0WzRdWzE2XTsKICogfQogKgoKICogRE9fWFlaVzogIEVtaXQgeHl6IGFuZCBtYXliZSB3IGNvb3JkaW5hdGVzLgogKiBET19SR0JBOiAgRW1pdCBjb2xvci4KICogRE9fU1BFQzogIEVtaXQgc3BlY3VsYXIgY29sb3IuCiAqIERPX0ZPRzogICBFbWl0IGZvZyBjb29yZGluYXRlIGluIHNwZWN1bGFyIGFscGhhLgogKiBET19URVgwOiAgRW1pdCB0ZXgwIHUsdiBjb29yZGluYXRlcy4KICogRE9fVEVYMTogIEVtaXQgdGV4MSB1LHYgY29vcmRpbmF0ZXMuCiAqIERPX1RFWDI6ICBFbWl0IHRleDIgdSx2IGNvb3JkaW5hdGVzLgogKiBET19URVgzOiAgRW1pdCB0ZXgzIHUsdiBjb29yZGluYXRlcy4KICogRE9fUFRFWDogIEVtaXQgdGV4MCwxLDIsMyBxIGNvb3JkaW5hdGVzIHdoZXJlIHBvc3NpYmxlLgogKgogKiBIQVZFX1JHQkFfQ09MT1I6IEhhcmR3YXJlIHRha2VzIGNvbG9yIGluIHJnYmEgb3JkZXIgKGVsc2UgYmdyYSkuCiAqCiAqIEhBVkVfSFdfVklFV1BPUlQ6ICBIYXJkd2FyZSBwZXJmb3JtcyB2aWV3cG9ydCB0cmFuc2Zvcm0uCiAqIEhBVkVfSFdfRElWSURFOiAgSGFyZHdhcmUgcGVyZm9ybXMgcGVyc3BlY3RpdmUgZGl2aWRlLgogKgogKiBIQVZFX1RJTllfVkVSVElDRVM6ICBIYXJkd2FyZSB1bmRlcnN0YW5kcyB2LnR2IGZvcm1hdC4KICogSEFWRV9QVEVYX1ZFUlRJQ0VTOiAgSGFyZHdhcmUgdW5kZXJzdGFuZHMgdi5wdiBmb3JtYXQuCiAqIEhBVkVfTk9URVhfVkVSVElDRVM6ICBIYXJkd2FyZSB1bmRlcnN0YW5kcyB2LnYgZm9ybWF0IHdpdGggdGV4Y291bnQgMC4KICoKICogQWRkaXRpb25hbGx5LCB0aGlzIHRlbXBsYXRlIGFzc3VtZXMgaXQgaXMgZW1pdHRpbmcgKnRyYW5zZm9ybWVkKgogKiB2ZXJ0aWNlczsgdGhlIG1vZGlmaWNhdGlvbnMgdG8gZW1pdCB1bnRyYW5zZm9ybWVkIHZlcnRpY2VzIChpZS4gdG8KICogdCZsIGhhcmR3YXJlKSBhcmUgcHJvYmFibHkgdG9vIGdyZWF0IHRvIGNvb2V4aXN0IHdpdGggdGhlIGNvZGUKICogYWxyZWFkeSBpbiB0aGlzIGZpbGUuCiAqCiAqIE5PVEU6IFRoZSBQVEVYIHZlcnRleCBmb3JtYXQgYWx3YXlzIGluY2x1ZGVzIFRFWDAgYW5kIFRFWDEsIGV2ZW4gaWYKICogb25seSBURVgwIGlzIGVuYWJsZWQsIGluIG9yZGVyIHRvIG1haW50YWluIGEgdmVydGV4IHNpemUgd2hpY2ggaXMKICogYW4gZXhhY3QgbnVtYmVyIG9mIHF1YWR3b3Jkcy4KICovCgojaWYgKEhBVkVfSFdfVklFV1BPUlQpCiNkZWZpbmUgVklFV1BPUlRfWChkc3QseCkgZHN0ID0geAojZGVmaW5lIFZJRVdQT1JUX1koZHN0LHkpIGRzdCA9IHkKI2RlZmluZSBWSUVXUE9SVF9aKGRzdCx6KSBkc3QgPSB6CiNlbHNlCiNkZWZpbmUgVklFV1BPUlRfWChkc3QseCkgZHN0ID0gc1swXSAgKiB4ICsgc1sxMl0KI2RlZmluZSBWSUVXUE9SVF9ZKGRzdCx5KSBkc3QgPSBzWzVdICAqIHkgKyBzWzEzXQojZGVmaW5lIFZJRVdQT1JUX1ooZHN0LHopIGRzdCA9IHNbMTBdICogeiArIHNbMTRdCiNlbmRpZgoKI2lmIChIQVZFX0hXX0RJVklERSAmJiAhSEFWRV9QVEVYX1ZFUlRJQ0VTKQojZXJyb3IgImNhbid0IGNvcGUgd2l0aCB0aGlzIGNvbWJpbmF0aW9uIiAKI2VuZGlmIAoKI2lmbmRlZiBMT0NBTFZBUlMKI2RlZmluZSBMT0NBTFZBUlMKI2VuZGlmCgojaWZuZGVmIENIRUNLX0hXX0RJVklERQojZGVmaW5lIENIRUNLX0hXX0RJVklERSAxCiNlbmRpZgoKI2lmIChIQVZFX0hXX0RJVklERSB8fCBET19TUEVDIHx8IERPX1RFWDAgfHwgRE9fRk9HIHx8ICFIQVZFX1RJTllfVkVSVElDRVMpCgpzdGF0aWMgdm9pZCBUQUcoZW1pdCkoIEdMY29udGV4dCAqY3R4LAoJCSAgICAgICBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsCgkJICAgICAgIHZvaWQgKmRlc3QsCgkJICAgICAgIEdMdWludCBzdHJpZGUgKQp7CiAgIExPQ0FMVkFSUwogICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmVE5MX0NPTlRFWFQoY3R4KS0+dmI7CiAgIEdMZmxvYXQgKCp0YzApWzRdLCAoKnRjMSlbNF0sICgqZm9nKVs0XTsKICAgR0xmbG9hdCAoKnRjMilbNF0sICgqdGMzKVs0XTsKICAgR0xmbG9hdCAoKnNwZWMpWzRdOwogICBHTGZsb2F0ICgqY29sKVs0XTsKICAgR0x1aW50IGNvbF9zdHJpZGU7CiAgIEdMdWludCB0YzBfc3RyaWRlLCB0YzFfc3RyaWRlLCBzcGVjX3N0cmlkZSwgZm9nX3N0cmlkZTsKICAgR0x1aW50IHRjMl9zdHJpZGUsIHRjM19zdHJpZGU7CiAgIEdMdWludCB0YzBfc2l6ZSwgdGMxX3NpemU7CiAgIEdMdWludCB0YzJfc2l6ZSwgdGMzX3NpemU7CiAgIEdMZmxvYXQgKCpjb29yZClbNF07CiAgIEdMdWludCBjb29yZF9zdHJpZGU7CiAgIFZFUlRFWCAqdiA9IChWRVJURVggKilkZXN0OwogICBjb25zdCBHTGZsb2F0ICpzID0gR0VUX1ZJRVdQT1JUX01BVCgpOwogICBjb25zdCBHTHVieXRlICptYXNrID0gVkItPkNsaXBNYXNrOwogICBpbnQgaTsKCi8qICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKGJpZykgaW1wb3J0YWJsZSAlZCAlZC4uJWRcbiIsICAqLwovKiAgCSAgIF9fRlVOQ1RJT05fXywgVkItPmltcG9ydGFibGVfZGF0YSwgc3RhcnQsIGVuZCk7ICovCgogICBpZiAoSEFWRV9IV19WSUVXUE9SVCAmJiBIQVZFX0hXX0RJVklERSAmJiBDSEVDS19IV19ESVZJREUpIHsKICAgICAgKHZvaWQpIHM7CiAgICAgIGNvb3JkID0gVkItPkNsaXBQdHItPmRhdGE7CiAgICAgIGNvb3JkX3N0cmlkZSA9IFZCLT5DbGlwUHRyLT5zdHJpZGU7CiAgIH0KICAgZWxzZSB7CiAgICAgIGNvb3JkID0gVkItPk5kY1B0ci0+ZGF0YTsKICAgICAgY29vcmRfc3RyaWRlID0gVkItPk5kY1B0ci0+c3RyaWRlOwogICB9CgogICBpZiAoRE9fVEVYMykgewogICAgICBjb25zdCBHTHVpbnQgdDMgPSBHRVRfVEVYU09VUkNFKDMpOwogICAgICB0YzMgPSBWQi0+VGV4Q29vcmRQdHJbdDNdLT5kYXRhOwogICAgICB0YzNfc3RyaWRlID0gVkItPlRleENvb3JkUHRyW3QzXS0+c3RyaWRlOwogICAgICBpZiAoRE9fUFRFWCkKCSB0YzNfc2l6ZSA9IFZCLT5UZXhDb29yZFB0clt0M10tPnNpemU7CiAgIH0KCiAgIGlmIChET19URVgyKSB7CiAgICAgIGNvbnN0IEdMdWludCB0MiA9IEdFVF9URVhTT1VSQ0UoMik7CiAgICAgIHRjMiA9IFZCLT5UZXhDb29yZFB0clt0Ml0tPmRhdGE7CiAgICAgIHRjMl9zdHJpZGUgPSBWQi0+VGV4Q29vcmRQdHJbdDJdLT5zdHJpZGU7CiAgICAgIGlmIChET19QVEVYKQoJIHRjMl9zaXplID0gVkItPlRleENvb3JkUHRyW3QyXS0+c2l6ZTsKICAgfQoKICAgaWYgKERPX1RFWDEpIHsKICAgICAgY29uc3QgR0x1aW50IHQxID0gR0VUX1RFWFNPVVJDRSgxKTsKICAgICAgdGMxID0gVkItPlRleENvb3JkUHRyW3QxXS0+ZGF0YTsKICAgICAgdGMxX3N0cmlkZSA9IFZCLT5UZXhDb29yZFB0clt0MV0tPnN0cmlkZTsKICAgICAgaWYgKERPX1BURVgpCgkgdGMxX3NpemUgPSBWQi0+VGV4Q29vcmRQdHJbdDFdLT5zaXplOwogICB9CgogICBpZiAoRE9fVEVYMCkgewogICAgICBjb25zdCBHTHVpbnQgdDAgPSBHRVRfVEVYU09VUkNFKDApOwogICAgICB0YzBfc3RyaWRlID0gVkItPlRleENvb3JkUHRyW3QwXS0+c3RyaWRlOwogICAgICB0YzAgPSBWQi0+VGV4Q29vcmRQdHJbdDBdLT5kYXRhOwogICAgICBpZiAoRE9fUFRFWCkgCgkgdGMwX3NpemUgPSBWQi0+VGV4Q29vcmRQdHJbdDBdLT5zaXplOwogICB9CgogICBpZiAoRE9fUkdCQSkgewogICAgICBjb2wgPSBWQi0+Q29sb3JQdHJbMF0tPmRhdGE7CiAgICAgIGNvbF9zdHJpZGUgPSBWQi0+Q29sb3JQdHJbMF0tPnN0cmlkZTsKICAgfQoKICAgaWYgKERPX1NQRUMpIHsKICAgICAgc3BlYyA9IFZCLT5TZWNvbmRhcnlDb2xvclB0clswXS0+ZGF0YTsKICAgICAgc3BlY19zdHJpZGUgPSBWQi0+U2Vjb25kYXJ5Q29sb3JQdHJbMF0tPnN0cmlkZTsKICAgfSBlbHNlIHsKICAgICAgc3BlYyA9IChHTGZsb2F0ICgqKVs0XSljdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX0NPTE9SMV07CiAgICAgIHNwZWNfc3RyaWRlID0gMDsKICAgfQoKICAgaWYgKERPX0ZPRykgewogICAgICBpZiAoVkItPkZvZ0Nvb3JkUHRyKSB7CgkgZm9nID0gVkItPkZvZ0Nvb3JkUHRyLT5kYXRhOwoJIGZvZ19zdHJpZGUgPSBWQi0+Rm9nQ29vcmRQdHItPnN0cmlkZTsKICAgICAgfSBlbHNlIHsKCSBzdGF0aWMgR0xmbG9hdCB0bXBbNF0gPSB7MCwgMCwgMCwgMH07CgkgZm9nID0gJnRtcDsKCSBmb2dfc3RyaWRlID0gMDsKICAgICAgfQogICB9CgogICAvKiBNYXkgaGF2ZSBub25zdGFuZGFyZCBzdHJpZGVzOgogICAgKi8KICAgaWYgKHN0YXJ0KSB7CiAgICAgIGNvb3JkID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKiljb29yZCArIHN0YXJ0ICogY29vcmRfc3RyaWRlKTsKICAgICAgaWYgKERPX1RFWDApCgkgdGMwID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKil0YzAgKyBzdGFydCAqIHRjMF9zdHJpZGUpOwogICAgICBpZiAoRE9fVEVYMSkgCgkgdGMxID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKil0YzEgKyBzdGFydCAqIHRjMV9zdHJpZGUpOwogICAgICBpZiAoRE9fVEVYMikgCgkgdGMyID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKil0YzIgKyBzdGFydCAqIHRjMl9zdHJpZGUpOwogICAgICBpZiAoRE9fVEVYMykgCgkgdGMzID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKil0YzMgKyBzdGFydCAqIHRjM19zdHJpZGUpOwogICAgICBpZiAoRE9fUkdCQSkgCgkgU1RSSURFXzRGKGNvbCwgc3RhcnQgKiBjb2xfc3RyaWRlKTsKICAgICAgaWYgKERPX1NQRUMpCgkgU1RSSURFXzRGKHNwZWMsIHN0YXJ0ICogc3BlY19zdHJpZGUpOwogICAgICBpZiAoRE9fRk9HKQoJIFNUUklERV80Rihmb2csIHN0YXJ0ICogZm9nX3N0cmlkZSk7CiAgICAgIC8vCSBmb2cgPSAgKEdMZmxvYXQgKCopWzRdKSgoR0x1Ynl0ZSAqKWZvZyArIHN0YXJ0ICogZm9nX3N0cmlkZSk7CiAgICAgIC8qICBTVFJJREVfRihmb2csIHN0YXJ0ICogZm9nX3N0cmlkZSk7ICovCiAgIH0KICAgCiAgIGZvciAoaT1zdGFydDsgaSA8IGVuZDsgaSsrLCB2ID0gKFZFUlRFWCAqKSgoR0x1Ynl0ZSAqKXYgKyBzdHJpZGUpKSB7CiAgICAgIGlmIChET19YWVpXKSB7CgkgaWYgKEhBVkVfSFdfVklFV1BPUlQgfHwgbWFza1tpXSA9PSAwKSB7CgkgICAgLyogdW5jbGlwcGVkICovCgkgICAgVklFV1BPUlRfWCh2LT52LngsIGNvb3JkWzBdWzBdKTsKCSAgICBWSUVXUE9SVF9ZKHYtPnYueSwgY29vcmRbMF1bMV0pOwoJICAgIFZJRVdQT1JUX1oodi0+di56LCBjb29yZFswXVsyXSk7CgkgICAgdi0+di53ID0gY29vcmRbMF1bM107CgkgfSBlbHNlIHsKCSAgICAvKiBjbGlwcGVkICovCgkgICAgdi0+di53ID0gMS4wOwoJIH0KCSBpZiAoTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9QUklNUykgewoJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHZlcnQgKGltcG9ydGFibGUpICVkOiAlLjJmICUuMmYgJS4yZiAlZlxuIiwgCgkJICAgIF9fRlVOQ1RJT05fXywgaSwgdi0+di54LCB2LT52LnksIHYtPnYueiwgdi0+di53KTsKCSB9CgkgY29vcmQgPSAgKEdMZmxvYXQgKCopWzRdKSgoR0x1Ynl0ZSAqKWNvb3JkICsgIGNvb3JkX3N0cmlkZSk7CiAgICAgIH0KICAgICAgaWYgKERPX1JHQkEpIHsKCSBpZiAoSEFWRV9SR0JBX0NPTE9SKSB7CgkgICAgKihHTHVpbnQgKikmdi0+di5jb2xvciA9ICooR0x1aW50ICopJmNvbFswXTsKCSAgICBTVFJJREVfNEYoY29sLCBjb2xfc3RyaWRlKTsKCSB9IGVsc2UgewoJICAgIHYtPnYuY29sb3IuYmx1ZSAgPSBjb2xbMF1bMl07CgkgICAgdi0+di5jb2xvci5ncmVlbiA9IGNvbFswXVsxXTsKCSAgICB2LT52LmNvbG9yLnJlZCAgID0gY29sWzBdWzBdOwoJICAgIHYtPnYuY29sb3IuYWxwaGEgPSBjb2xbMF1bM107CgkgICAgU1RSSURFXzRGKGNvbCwgY29sX3N0cmlkZSk7CgkgfQogICAgICB9CiAgICAgIGlmIChET19TUEVDKSB7Cgkgdi0+di5zcGVjdWxhci5yZWQgPSBzcGVjWzBdWzBdOwoJIHYtPnYuc3BlY3VsYXIuZ3JlZW4gPSBzcGVjWzBdWzFdOwoJIHYtPnYuc3BlY3VsYXIuYmx1ZSA9IHNwZWNbMF1bMl07CgkgU1RSSURFXzRGKHNwZWMsIHNwZWNfc3RyaWRlKTsKICAgICAgfQogICAgICBpZiAoRE9fRk9HKSB7Cgkgdi0+di5zcGVjdWxhci5hbHBoYSA9IGZvZ1swXVswXSAqIDI1NS4wOwoJIC8qICBTVFJJREVfRihmb2csIGZvZ19zdHJpZGUpOyAqLwoJIGZvZyA9ICAoR0xmbG9hdCAoKilbNF0pKChHTHVieXRlICopZm9nICsgZm9nX3N0cmlkZSk7CiAgICAgIH0KICAgICAgaWYgKERPX1RFWDApIHsKCSB2LT52LnUwID0gdGMwWzBdWzBdOwoJIHYtPnYudjAgPSB0YzBbMF1bMV07CgkgaWYgKE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB2ZXJ0IChpbXBvcnRhYmxlKSAlZDogdTA6ICUuMmYsIHYwOiAlLjJmLCB3OiAlZlxuIiwgCgkJICAgIF9fRlVOQ1RJT05fXywgaSwgdi0+di51MCwgdi0+di52MCwgdi0+di53KTsKCSB9CiNpZmRlZiBNQUNINjRfUFJFTVVMVF9URVhDT09SRFMKCSB2LT52LnUwICo9IHYtPnYudzsKCSB2LT52LnYwICo9IHYtPnYudzsKI2VuZGlmCgkgaWYgKERPX1BURVgpIHsKCSAgICBpZiAoSEFWRV9QVEVYX1ZFUlRJQ0VTKSB7CgkgICAgICAgaWYgKHRjMF9zaXplID09IDQpIAoJCSAgdi0+cHYucTAgPSB0YzBbMF1bM107CgkgICAgICAgZWxzZQoJCSAgdi0+cHYucTAgPSAxLjA7CgkgICAgfSAKCSAgICBlbHNlIGlmICh0YzBfc2l6ZSA9PSA0KSB7CiNpZmRlZiBNQUNINjRfUFJFTVVMVF9URVhDT09SRFMKCSAgICAgICB2LT52LncgKj0gdGMwWzBdWzNdOwojZWxzZQoJICAgICAgIGZsb2F0IHJodyA9IDEuMCAvIHRjMFswXVszXTsKCSAgICAgICB2LT52LncgKj0gdGMwWzBdWzNdOwoJICAgICAgIHYtPnYudTAgKj0gcmh3OwoJICAgICAgIHYtPnYudjAgKj0gcmh3OwojZW5kaWYKCSAgICB9IAoJIH0gCgkgdGMwID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKil0YzAgKyAgdGMwX3N0cmlkZSk7CiAgICAgIH0KICAgICAgaWYgKERPX1RFWDEpIHsKCSBpZiAoRE9fUFRFWCkgewoJICAgIHYtPnB2LnUxID0gdGMxWzBdWzBdOwoJICAgIHYtPnB2LnYxID0gdGMxWzBdWzFdOwoJICAgIGlmICh0YzFfc2l6ZSA9PSA0KSAKCSAgICAgICB2LT5wdi5xMSA9IHRjMVswXVszXTsKCSAgICBlbHNlCgkgICAgICAgdi0+cHYucTEgPSAxLjA7CgkgfSAKCSBlbHNlIHsKCSAgICB2LT52LnUxID0gdGMxWzBdWzBdOwoJICAgIHYtPnYudjEgPSB0YzFbMF1bMV07CgkgfQojaWZkZWYgTUFDSDY0X1BSRU1VTFRfVEVYQ09PUkRTCgkgdi0+di51MSAqPSB2LT52Lnc7Cgkgdi0+di52MSAqPSB2LT52Lnc7CiNlbmRpZgoJIHRjMSA9ICAoR0xmbG9hdCAoKilbNF0pKChHTHVieXRlICopdGMxICsgIHRjMV9zdHJpZGUpOwogICAgICB9IAogICAgICBlbHNlIGlmIChET19QVEVYKSB7CgkgKihHTHVpbnQgKikmdi0+cHYucTEgPSAwOwkvKiBhdm9pZCBjdWxsaW5nIG9uIHJhZGVvbiAqLwogICAgICB9CiAgICAgIGlmIChET19URVgyKSB7CgkgaWYgKERPX1BURVgpIHsKCSAgICB2LT5wdi51MiA9IHRjMlswXVswXTsKCSAgICB2LT5wdi52MiA9IHRjMlswXVsxXTsKCSAgICBpZiAodGMyX3NpemUgPT0gNCkgCgkgICAgICAgdi0+cHYucTIgPSB0YzJbMF1bM107CgkgICAgZWxzZQoJICAgICAgIHYtPnB2LnEyID0gMS4wOwoJIH0gCgkgZWxzZSB7CgkgICAgdi0+di51MiA9IHRjMlswXVswXTsKCSAgICB2LT52LnYyID0gdGMyWzBdWzFdOwoJIH0KCSB0YzIgPSAgKEdMZmxvYXQgKCopWzRdKSgoR0x1Ynl0ZSAqKXRjMiArICB0YzJfc3RyaWRlKTsKICAgICAgfSAKICAgICAgaWYgKERPX1RFWDMpIHsKCSBpZiAoRE9fUFRFWCkgewoJICAgIHYtPnB2LnUzID0gdGMzWzBdWzBdOwoJICAgIHYtPnB2LnYzID0gdGMzWzBdWzFdOwoJICAgIGlmICh0YzNfc2l6ZSA9PSA0KSAKCSAgICAgICB2LT5wdi5xMyA9IHRjM1swXVszXTsKCSAgICBlbHNlCgkgICAgICAgdi0+cHYucTMgPSAxLjA7CgkgICAgfSAKCSBlbHNlIHsKCSAgICB2LT52LnUzID0gdGMzWzBdWzBdOwoJICAgIHYtPnYudjMgPSB0YzNbMF1bMV07CgkgfQoJIHRjMyA9ICAoR0xmbG9hdCAoKilbNF0pKChHTHVieXRlICopdGMzICsgIHRjM19zdHJpZGUpOwogICAgICB9IAogICB9Cn0KCiNlbHNlCiNpZiBET19YWVpXCgojaWYgSEFWRV9IV19ESVZJREUKI2Vycm9yICJjYW5ub3QgdXNlIHRpbnkgdmVydGljZXMgd2l0aCBodyBwZXJzcGVjdGl2ZSBkaXZpZGUiCiNlbmRpZgoKc3RhdGljIHZvaWQgVEFHKGVtaXQpKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLAoJCSAgICAgICB2b2lkICpkZXN0LCBHTHVpbnQgc3RyaWRlICkKewogICBMT0NBTFZBUlMKICAgc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJlROTF9DT05URVhUKGN0eCktPnZiOwogICBHTGZsb2F0ICgqY29sKVs0XTsKICAgR0x1aW50IGNvbF9zdHJpZGU7CiAgIEdMZmxvYXQgKCpjb29yZClbNF0gPSBWQi0+TmRjUHRyLT5kYXRhOwogICBHTHVpbnQgY29vcmRfc3RyaWRlID0gVkItPk5kY1B0ci0+c3RyaWRlOwogICBHTGZsb2F0ICp2ID0gKEdMZmxvYXQgKilkZXN0OwogICBjb25zdCBHTHVieXRlICptYXNrID0gVkItPkNsaXBNYXNrOwogICBjb25zdCBHTGZsb2F0ICpzID0gR0VUX1ZJRVdQT1JUX01BVCgpOwogICBpbnQgaTsKCiAgICh2b2lkKSBzOwoKICAgQVNTRVJUKHN0cmlkZSA9PSA0KTsKCiAgIGNvbCA9IFZCLT5Db2xvclB0clswXS0+ZGF0YTsKICAgY29sX3N0cmlkZSA9IFZCLT5Db2xvclB0clswXS0+c3RyaWRlOwoKICAgLyogUGFjayB3aGF0J3MgbGVmdCBpbnRvIGEgNC1kd29yZCB2ZXJ0ZXguICBDb2xvciBpcyBpbiBhIGRpZmZlcmVudAogICAgKiBwbGFjZSwgYW5kIHRoZXJlIGlzIG5vICd3JyBjb29yZGluYXRlLgogICAgKi8KICAgaWYgKHN0YXJ0KSB7CiAgICAgIGNvb3JkID0gIChHTGZsb2F0ICgqKVs0XSkoKEdMdWJ5dGUgKiljb29yZCArIHN0YXJ0ICogY29vcmRfc3RyaWRlKTsKICAgICAgU1RSSURFXzRGKGNvbCwgc3RhcnQgKiBjb2xfc3RyaWRlKTsKICAgfQogICAKICAgZm9yIChpPXN0YXJ0OyBpIDwgZW5kOyBpKyssIHYrPTQpIHsKICAgICAgaWYgKEhBVkVfSFdfVklFV1BPUlQgfHwgbWFza1tpXSA9PSAwKSB7CgkgVklFV1BPUlRfWCh2WzBdLCBjb29yZFswXVswXSk7CgkgVklFV1BPUlRfWSh2WzFdLCBjb29yZFswXVsxXSk7CgkgVklFV1BPUlRfWih2WzJdLCBjb29yZFswXVsyXSk7CiAgICAgIH0KICAgICAgY29vcmQgPSAgKEdMZmxvYXQgKCopWzRdKSgoR0x1Ynl0ZSAqKWNvb3JkICsgIGNvb3JkX3N0cmlkZSk7CiAgICAgIGlmIChET19SR0JBKSB7CgkgaWYgKEhBVkVfUkdCQV9DT0xPUikgewoJICAgICooR0x1aW50ICopJnZbM10gPSAqKEdMdWludCAqKWNvbDsKCSB9CgkgZWxzZSB7CgkgICAgR0x1Ynl0ZSAqYiA9IChHTHVieXRlICopJnZbM107CgkgICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMF0sIGNvbFswXVsyXSk7CgkgICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMV0sIGNvbFswXVsxXSk7CgkgICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMl0sIGNvbFswXVswXSk7CgkgICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbM10sIGNvbFswXVszXSk7CgkgfQoJIFNUUklERV80RiggY29sLCBjb2xfc3RyaWRlICk7CiAgICAgIH0KICAgICAgaWYgKE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMpIHsKCSBmcHJpbnRmKHN0ZGVyciwgInZlcnQgKGltcG9ydGFibGUpICVkOiAlLjJmICUuMmYgJS4yZiAleFxuIiwKCQkgaSwgdlswXSwgdlsxXSwgdlsyXSwgKihpbnQgKikmdlszXSk7CiAgICAgIH0KICAgfQp9CiNlbHNlCnN0YXRpYyB2b2lkIFRBRyhlbWl0KSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwKCQkgICAgICAgdm9pZCAqZGVzdCwgR0x1aW50IHN0cmlkZSApCnsKICAgTE9DQUxWQVJTCiAgIHN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQiA9ICZUTkxfQ09OVEVYVChjdHgpLT52YjsKICAgR0xmbG9hdCAoKmNvbClbNF07CiAgIEdMdWludCBjb2xfc3RyaWRlOwogICBHTGZsb2F0ICp2ID0gKEdMZmxvYXQgKilkZXN0OwogICBpbnQgaTsKCiAgIGNvbCA9IFZCLT5Db2xvclB0clswXS0+ZGF0YTsKICAgY29sX3N0cmlkZSA9IFZCLT5Db2xvclB0clswXS0+c3RyaWRlOwoKICAgaWYgKHN0YXJ0KQogICAgICBTVFJJREVfNEYoY29sLCBjb2xfc3RyaWRlICogc3RhcnQpOwoKICAgLyogTmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGNvbG9yIGlzOgogICAgKi8KICAgaWYgKEdFVF9WRVJURVhfRk9STUFUKCkgPT0gVElOWV9WRVJURVhfRk9STUFUKQogICAgICB2ICs9IDM7CiAgIGVsc2UKICAgICAgdiArPSA0OwoKICAgZm9yIChpPXN0YXJ0OyBpIDwgZW5kOyBpKyssIFNUUklERV9GKHYsIHN0cmlkZSkpIHsKICAgICAgaWYgKEhBVkVfUkdCQV9DT0xPUikgewoJICooR0x1aW50ICopdiA9ICooR0x1aW50ICopY29sWzBdOwogICAgICB9CiAgICAgIGVsc2UgewoJIEdMdWJ5dGUgKmIgPSAoR0x1Ynl0ZSAqKXY7CgkgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMF0sIGNvbFswXVsyXSk7CgkgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMV0sIGNvbFswXVsxXSk7CgkgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbMl0sIGNvbFswXVswXSk7CgkgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGJbM10sIGNvbFswXVszXSk7CiAgICAgIH0KICAgICAgU1RSSURFXzRGKCBjb2wsIGNvbF9zdHJpZGUgKTsKICAgfQp9CiNlbmRpZiAvKiBlbWl0ICovCiNlbmRpZiAvKiBlbWl0ICovCgojaWYgKERPX1hZWlcpICYmIChET19SR0JBKQoKCiNpZiAoSEFWRV9QVEVYX1ZFUlRJQ0VTKQpzdGF0aWMgR0xib29sZWFuIFRBRyhjaGVja190ZXhfc2l6ZXMpKCBHTGNvbnRleHQgKmN0eCApCnsKICAgTE9DQUxWQVJTCiAgIHN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQiA9ICZUTkxfQ09OVEVYVChjdHgpLT52YjsKCiAgIC8qIEZvcmNlICdtaXNzaW5nJyB0ZXhjb29yZHMgdG8gc29tZXRoaW5nIHZhbGlkLgogICAgKi8KICAgaWYgKERPX1RFWDMgJiYgVkItPlRleENvb3JkUHRyWzJdID09IDApCiAgICAgIFZCLT5UZXhDb29yZFB0clsyXSA9IFZCLT5UZXhDb29yZFB0clszXTsKCiAgIGlmIChET19URVgyICYmIFZCLT5UZXhDb29yZFB0clsxXSA9PSAwKQogICAgICBWQi0+VGV4Q29vcmRQdHJbMV0gPSBWQi0+VGV4Q29vcmRQdHJbMl07CgogICBpZiAoRE9fVEVYMSAmJiBWQi0+VGV4Q29vcmRQdHJbMF0gPT0gMCkKICAgICAgVkItPlRleENvb3JkUHRyWzBdID0gVkItPlRleENvb3JkUHRyWzFdOwoKICAgaWYgKERPX1BURVgpCiAgICAgIHJldHVybiBHTF9UUlVFOwogICAKICAgaWYgKChET19URVgzICYmIFZCLT5UZXhDb29yZFB0cltHRVRfVEVYU09VUkNFKDMpXS0+c2l6ZSA9PSA0KSB8fAogICAgICAgKERPX1RFWDIgJiYgVkItPlRleENvb3JkUHRyW0dFVF9URVhTT1VSQ0UoMildLT5zaXplID09IDQpIHx8CiAgICAgICAoRE9fVEVYMSAmJiBWQi0+VGV4Q29vcmRQdHJbR0VUX1RFWFNPVVJDRSgxKV0tPnNpemUgPT0gNCkgfHwKICAgICAgIChET19URVgwICYmIFZCLT5UZXhDb29yZFB0cltHRVRfVEVYU09VUkNFKDApXS0+c2l6ZSA9PSA0KSkKICAgICAgcmV0dXJuIEdMX0ZBTFNFOwoKICAgcmV0dXJuIEdMX1RSVUU7Cn0KI2Vsc2UKc3RhdGljIEdMYm9vbGVhbiBUQUcoY2hlY2tfdGV4X3NpemVzKSggR0xjb250ZXh0ICpjdHggKQp7CiAgIExPQ0FMVkFSUwogICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmVE5MX0NPTlRFWFQoY3R4KS0+dmI7CgogICAvKiBGb3JjZSAnbWlzc2luZycgdGV4Y29vcmRzIHRvIHNvbWV0aGluZyB2YWxpZC4KICAgICovCiAgIGlmIChET19URVgzICYmIFZCLT5UZXhDb29yZFB0clsyXSA9PSAwKQogICAgICBWQi0+VGV4Q29vcmRQdHJbMl0gPSBWQi0+VGV4Q29vcmRQdHJbM107CgogICBpZiAoRE9fVEVYMiAmJiBWQi0+VGV4Q29vcmRQdHJbMV0gPT0gMCkKICAgICAgVkItPlRleENvb3JkUHRyWzFdID0gVkItPlRleENvb3JkUHRyWzJdOwoKICAgaWYgKERPX1RFWDEgJiYgVkItPlRleENvb3JkUHRyWzBdID09IDApCiAgICAgIFZCLT5UZXhDb29yZFB0clswXSA9IFZCLT5UZXhDb29yZFB0clsxXTsKCiAgIGlmIChET19QVEVYKQogICAgICByZXR1cm4gR0xfVFJVRTsKCiAgIC8qIE5vIGhhcmR3YXJlIHN1cHBvcnQgZm9yIHByb2plY3RpdmUgdGV4dHVyZS4gIENhbiBmYWtlIGl0IGZvcgogICAgKiBURVgwIG9ubHkuCiAgICAqLwogICBpZiAoKERPX1RFWDMgJiYgVkItPlRleENvb3JkUHRyW0dFVF9URVhTT1VSQ0UoMyldLT5zaXplID09IDQpIHx8CiAgICAgICAoRE9fVEVYMiAmJiBWQi0+VGV4Q29vcmRQdHJbR0VUX1RFWFNPVVJDRSgyKV0tPnNpemUgPT0gNCkgfHwKICAgICAgIChET19URVgxICYmIFZCLT5UZXhDb29yZFB0cltHRVRfVEVYU09VUkNFKDEpXS0+c2l6ZSA9PSA0KSkgewogICAgICBQVEVYX0ZBTExCQUNLKCk7CiAgICAgIHJldHVybiBHTF9GQUxTRTsKICAgfQoKICAgaWYgKERPX1RFWDAgJiYgVkItPlRleENvb3JkUHRyW0dFVF9URVhTT1VSQ0UoMCldLT5zaXplID09IDQpIHsKICAgICAgaWYgKERPX1RFWDEgfHwgRE9fVEVYMiB8fCBET19URVgzKSB7CgkgUFRFWF9GQUxMQkFDSygpOwogICAgICB9CiAgICAgIHJldHVybiBHTF9GQUxTRTsKICAgfQoKICAgcmV0dXJuIEdMX1RSVUU7Cn0KI2VuZGlmIC8qIHB0ZXggKi8KCgpzdGF0aWMgdm9pZCBUQUcoaW50ZXJwKSggR0xjb250ZXh0ICpjdHgsCgkJCSBHTGZsb2F0IHQsCgkJCSBHTHVpbnQgZWRzdCwgR0x1aW50IGVvdXQsIEdMdWludCBlaW4sCgkJCSBHTGJvb2xlYW4gZm9yY2VfYm91bmRhcnkgKQp7CiAgIExPQ0FMVkFSUwogICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmVE5MX0NPTlRFWFQoY3R4KS0+dmI7CiAgIEdMdWJ5dGUgKmRkdmVydHMgPSBHRVRfVkVSVEVYX1NUT1JFKCk7CiAgIEdMdWludCBzaXplID0gR0VUX1ZFUlRFWF9TSVpFKCk7CiAgIGNvbnN0IEdMZmxvYXQgKmRzdGNsaXAgPSBWQi0+Q2xpcFB0ci0+ZGF0YVtlZHN0XTsKICAgR0xmbG9hdCB3OwogICBjb25zdCBHTGZsb2F0ICpzID0gR0VUX1ZJRVdQT1JUX01BVCgpOwoKICAgVkVSVEVYICpkc3QgPSAoVkVSVEVYICopKGRkdmVydHMgKyAoZWRzdCAqIHNpemUpKTsKICAgVkVSVEVYICppbiAgPSAoVkVSVEVYICopKGRkdmVydHMgKyAoZWluICogc2l6ZSkpOwogICBWRVJURVggKm91dCA9IChWRVJURVggKikoZGR2ZXJ0cyArIChlb3V0ICogc2l6ZSkpOwoKICAgKHZvaWQpczsKCiAgIGlmIChIQVZFX0hXX0RJVklERSAmJiBDSEVDS19IV19ESVZJREUpIHsKICAgICAgVklFV1BPUlRfWCggZHN0LT52LngsIGRzdGNsaXBbMF0gKTsKICAgICAgVklFV1BPUlRfWSggZHN0LT52LnksIGRzdGNsaXBbMV0gKTsKICAgICAgVklFV1BPUlRfWiggZHN0LT52LnosIGRzdGNsaXBbMl0gKTsKICAgICAgdyA9IGRzdGNsaXBbM107CiAgIH0KICAgZWxzZSB7CiAgICAgIHcgPSAoZHN0Y2xpcFszXSA9PSAwLjBGKSA/IDEuMCA6ICgxLjAgLyBkc3RjbGlwWzNdKTsKICAgICAgVklFV1BPUlRfWCggZHN0LT52LngsIGRzdGNsaXBbMF0gKiB3ICk7CiAgICAgIFZJRVdQT1JUX1koIGRzdC0+di55LCBkc3RjbGlwWzFdICogdyApOwogICAgICBWSUVXUE9SVF9aKCBkc3QtPnYueiwgZHN0Y2xpcFsyXSAqIHcgKTsKICAgfQoKICAgaWYgKE1BQ0g2NF9ERUJVRyAmIERFQlVHX1ZFUkJPU0VfUFJJTVMpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAiJXM6IGRzdCB2ZXJ0OiAlLjJmICUuMmYgJS4yZiAlZlxuIiwKCSAgICAgICBfX0ZVTkNUSU9OX18sCgkgICAgICAgZHN0LT52LngsCgkgICAgICAgZHN0LT52LnksCgkgICAgICAgZHN0LT52LnosCgkgICAgICAgdyApOwogICB9CgogICBpZiAoKEhBVkVfSFdfRElWSURFICYmIENIRUNLX0hXX0RJVklERSkgfHwgCiAgICAgICBET19GT0cgfHwgRE9fU1BFQyB8fCBET19URVgwIHx8IERPX1RFWDEgfHwKICAgICAgIERPX1RFWDIgfHwgRE9fVEVYMyB8fCAhSEFWRV9USU5ZX1ZFUlRJQ0VTKSB7CgogICAgICBkc3QtPnYudyA9IHc7CgogICAgICBJTlRFUlBfVUIoIHQsIGRzdC0+dWI0WzRdWzBdLCBvdXQtPnViNFs0XVswXSwgaW4tPnViNFs0XVswXSApOwogICAgICBJTlRFUlBfVUIoIHQsIGRzdC0+dWI0WzRdWzFdLCBvdXQtPnViNFs0XVsxXSwgaW4tPnViNFs0XVsxXSApOwogICAgICBJTlRFUlBfVUIoIHQsIGRzdC0+dWI0WzRdWzJdLCBvdXQtPnViNFs0XVsyXSwgaW4tPnViNFs0XVsyXSApOwogICAgICBJTlRFUlBfVUIoIHQsIGRzdC0+dWI0WzRdWzNdLCBvdXQtPnViNFs0XVszXSwgaW4tPnViNFs0XVszXSApOwoKICAgICAgaWYgKERPX1NQRUMpIHsKCSBJTlRFUlBfVUIoIHQsIGRzdC0+dWI0WzVdWzBdLCBvdXQtPnViNFs1XVswXSwgaW4tPnViNFs1XVswXSApOwoJIElOVEVSUF9VQiggdCwgZHN0LT51YjRbNV1bMV0sIG91dC0+dWI0WzVdWzFdLCBpbi0+dWI0WzVdWzFdICk7CgkgSU5URVJQX1VCKCB0LCBkc3QtPnViNFs1XVsyXSwgb3V0LT51YjRbNV1bMl0sIGluLT51YjRbNV1bMl0gKTsKICAgICAgfQogICAgICBpZiAoRE9fRk9HKSB7CgkgSU5URVJQX1VCKCB0LCBkc3QtPnViNFs1XVszXSwgb3V0LT51YjRbNV1bM10sIGluLT51YjRbNV1bM10gKTsKICAgICAgfQogICAgICBpZiAoRE9fVEVYMCkgewoJIGlmIChET19QVEVYKSB7CgkgICAgaWYgKEhBVkVfUFRFWF9WRVJUSUNFUykgewoJICAgICAgIElOVEVSUF9GKCB0LCBkc3QtPnB2LnUwLCBvdXQtPnB2LnUwLCBpbi0+cHYudTAgKTsKCSAgICAgICBJTlRFUlBfRiggdCwgZHN0LT5wdi52MCwgb3V0LT5wdi52MCwgaW4tPnB2LnYwICk7CgkgICAgICAgSU5URVJQX0YoIHQsIGRzdC0+cHYucTAsIG91dC0+cHYucTAsIGluLT5wdi5xMCApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgR0xmbG9hdCB3b3V0ID0gVkItPk5kY1B0ci0+ZGF0YVtlb3V0XVszXTsKCSAgICAgICBHTGZsb2F0IHdpbiA9IFZCLT5OZGNQdHItPmRhdGFbZWluXVszXTsKCSAgICAgICBHTGZsb2F0IHFvdXQgPSBvdXQtPnB2LncgLyB3b3V0OwoJICAgICAgIEdMZmxvYXQgcWluID0gaW4tPnB2LncgLyB3aW47CgkgICAgICAgR0xmbG9hdCBxZHN0LCBycWRzdDsKCgkgICAgICAgQVNTRVJUKCAhSEFWRV9IV19ESVZJREUgKTsKCgkgICAgICAgSU5URVJQX0YoIHQsIGRzdC0+di51MCwgb3V0LT52LnUwICogcW91dCwgaW4tPnYudTAgKiBxaW4gKTsKCSAgICAgICBJTlRFUlBfRiggdCwgZHN0LT52LnYwLCBvdXQtPnYudjAgKiBxb3V0LCBpbi0+di52MCAqIHFpbiApOwoJICAgICAgIElOVEVSUF9GKCB0LCBxZHN0LCBxb3V0LCBxaW4gKTsKCgkgICAgICAgcnFkc3QgPSAxLjAgLyBxZHN0OwoJICAgICAgIGRzdC0+di51MCAqPSBycWRzdDsKCSAgICAgICBkc3QtPnYudjAgKj0gcnFkc3Q7CgkgICAgICAgZHN0LT52LncgKj0gcnFkc3Q7CgkgICAgfQoJIH0KCSBlbHNlIHsKI2lmZGVmIE1BQ0g2NF9QUkVNVUxUX1RFWENPT1JEUwoJICAgIEdMZmxvYXQgcW91dCA9IDEgLyBvdXQtPnYudzsKCSAgICBHTGZsb2F0IHFpbiA9IDEgLyBpbi0+di53OwoJICAgIAoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudTAsIG91dC0+di51MCAqIHFvdXQsIGluLT52LnUwICogcWluKTsKCSAgICBJTlRFUlBfRiggdCwgZHN0LT52LnYwLCBvdXQtPnYudjAgKiBxb3V0LCBpbi0+di52MCAqIHFpbik7CgoJICAgIGRzdC0+di51MCAqPSB3OwoJICAgIGRzdC0+di52MCAqPSB3OwojZWxzZQoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudTAsIG91dC0+di51MCwgaW4tPnYudTAgKTsKCSAgICBJTlRFUlBfRiggdCwgZHN0LT52LnYwLCBvdXQtPnYudjAsIGluLT52LnYwICk7CiNlbmRpZgoJIH0KICAgICAgfQogICAgICBpZiAoRE9fVEVYMSkgewoJIGlmIChET19QVEVYKSB7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+cHYudTEsIG91dC0+cHYudTEsIGluLT5wdi51MSApOwoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnB2LnYxLCBvdXQtPnB2LnYxLCBpbi0+cHYudjEgKTsKCSAgICBJTlRFUlBfRiggdCwgZHN0LT5wdi5xMSwgb3V0LT5wdi5xMSwgaW4tPnB2LnExICk7CgkgfSBlbHNlIHsKI2lmZGVmIE1BQ0g2NF9QUkVNVUxUX1RFWENPT1JEUwoJICAgIEdMZmxvYXQgcW91dCA9IDEgLyBvdXQtPnYudzsKCSAgICBHTGZsb2F0IHFpbiA9IDEgLyBpbi0+di53OwoJICAgIAoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudTEsIG91dC0+di51MSAqIHFvdXQsIGluLT52LnUxICogcWluICk7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+di52MSwgb3V0LT52LnYxICogcW91dCwgaW4tPnYudjEgKiBxaW4gKTsKCgkgICAgZHN0LT52LnUxICo9IHc7CgkgICAgZHN0LT52LnYxICo9IHc7CiNlbHNlCgkgICAgSU5URVJQX0YoIHQsIGRzdC0+di51MSwgb3V0LT52LnUxLCBpbi0+di51MSApOwoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudjEsIG91dC0+di52MSwgaW4tPnYudjEgKTsKI2VuZGlmCgkgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKERPX1BURVgpIHsKCSBkc3QtPnB2LnEwID0gMC4wOwkvKiBtdXN0IGJlIGEgdmFsaWQgZmxvYXQgb24gcmFkZW9uICovCiAgICAgIH0KICAgICAgaWYgKERPX1RFWDIpIHsKCSBpZiAoRE9fUFRFWCkgewoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnB2LnUyLCBvdXQtPnB2LnUyLCBpbi0+cHYudTIgKTsKCSAgICBJTlRFUlBfRiggdCwgZHN0LT5wdi52Miwgb3V0LT5wdi52MiwgaW4tPnB2LnYyICk7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+cHYucTIsIG91dC0+cHYucTIsIGluLT5wdi5xMiApOwoJIH0gZWxzZSB7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+di51Miwgb3V0LT52LnUyLCBpbi0+di51MiApOwoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudjIsIG91dC0+di52MiwgaW4tPnYudjIgKTsKCSB9CiAgICAgIH0KICAgICAgaWYgKERPX1RFWDMpIHsKCSBpZiAoRE9fUFRFWCkgewoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnB2LnUzLCBvdXQtPnB2LnUzLCBpbi0+cHYudTMgKTsKCSAgICBJTlRFUlBfRiggdCwgZHN0LT5wdi52Mywgb3V0LT5wdi52MywgaW4tPnB2LnYzICk7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+cHYucTMsIG91dC0+cHYucTMsIGluLT5wdi5xMyApOwoJIH0gZWxzZSB7CgkgICAgSU5URVJQX0YoIHQsIGRzdC0+di51Mywgb3V0LT52LnUzLCBpbi0+di51MyApOwoJICAgIElOVEVSUF9GKCB0LCBkc3QtPnYudjMsIG91dC0+di52MywgaW4tPnYudjMgKTsKCSB9CiAgICAgIH0KICAgfSBlbHNlIHsKICAgICAgLyogNC1kd29yZCB2ZXJ0ZXguICBDb2xvciBpcyBpbiB2WzNdIGFuZCB0aGVyZSBpcyBubyBvb3cgY29vcmRpbmF0ZS4KICAgICAgICovCiAgICAgIElOVEVSUF9VQiggdCwgZHN0LT51YjRbM11bMF0sIG91dC0+dWI0WzNdWzBdLCBpbi0+dWI0WzNdWzBdICk7CiAgICAgIElOVEVSUF9VQiggdCwgZHN0LT51YjRbM11bMV0sIG91dC0+dWI0WzNdWzFdLCBpbi0+dWI0WzNdWzFdICk7CiAgICAgIElOVEVSUF9VQiggdCwgZHN0LT51YjRbM11bMl0sIG91dC0+dWI0WzNdWzJdLCBpbi0+dWI0WzNdWzJdICk7CiAgICAgIElOVEVSUF9VQiggdCwgZHN0LT51YjRbM11bM10sIG91dC0+dWI0WzNdWzNdLCBpbi0+dWI0WzNdWzNdICk7CiAgIH0KfQoKI2VuZGlmIC8qIHJnYmEgJiYgeHl6dyAqLwoKCnN0YXRpYyB2b2lkIFRBRyhpbml0KSggdm9pZCApCnsKICAgc2V0dXBfdGFiW0lORF0uZW1pdCA9IFRBRyhlbWl0KTsKCiNpZiAoRE9fWFlaVyAmJiBET19SR0JBKQogICBzZXR1cF90YWJbSU5EXS5jaGVja190ZXhfc2l6ZXMgPSBUQUcoY2hlY2tfdGV4X3NpemVzKTsKICAgc2V0dXBfdGFiW0lORF0uaW50ZXJwID0gVEFHKGludGVycCk7CiNlbmRpZgoKICAgaWYgKERPX1NQRUMpCiAgICAgIHNldHVwX3RhYltJTkRdLmNvcHlfcHYgPSBjb3B5X3B2X3JnYmE0X3NwZWM1OwogICBlbHNlIGlmIChIQVZFX0hXX0RJVklERSB8fCBET19TUEVDIHx8IERPX0ZPRyB8fCBET19URVgwIHx8IERPX1RFWDEgfHwKCSAgICBET19URVgyIHx8IERPX1RFWDMgfHwgIUhBVkVfVElOWV9WRVJUSUNFUykKICAgICAgc2V0dXBfdGFiW0lORF0uY29weV9wdiA9IGNvcHlfcHZfcmdiYTQ7CiAgIGVsc2UKICAgICAgc2V0dXBfdGFiW0lORF0uY29weV9wdiA9IGNvcHlfcHZfcmdiYTM7CgogICBpZiAoRE9fVEVYMykgewogICAgICBpZiAoRE9fUFRFWCkgewoJIEFTU0VSVChIQVZFX1BURVhfVkVSVElDRVMpOwoJIHNldHVwX3RhYltJTkRdLnZlcnRleF9mb3JtYXQgPSBQUk9KX1RFWDNfVkVSVEVYX0ZPUk1BVDsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfc2l6ZSA9IDE4OwogICAgICB9CiAgICAgIGVsc2UgewoJIHNldHVwX3RhYltJTkRdLnZlcnRleF9mb3JtYXQgPSBURVgzX1ZFUlRFWF9GT1JNQVQ7Cgkgc2V0dXBfdGFiW0lORF0udmVydGV4X3NpemUgPSAxNDsKICAgICAgfQogICB9CiAgIGVsc2UgaWYgKERPX1RFWDIpIHsKICAgICAgaWYgKERPX1BURVgpIHsKCSBBU1NFUlQoSEFWRV9QVEVYX1ZFUlRJQ0VTKTsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gUFJPSl9URVgzX1ZFUlRFWF9GT1JNQVQ7Cgkgc2V0dXBfdGFiW0lORF0udmVydGV4X3NpemUgPSAxODsKICAgICAgfQogICAgICBlbHNlIHsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gVEVYMl9WRVJURVhfRk9STUFUOwoJIHNldHVwX3RhYltJTkRdLnZlcnRleF9zaXplID0gMTI7CiAgICAgIH0KICAgfQogICBlbHNlIGlmIChET19URVgxKSB7CiAgICAgIGlmIChET19QVEVYKSB7CgkgQVNTRVJUKEhBVkVfUFRFWF9WRVJUSUNFUyk7Cgkgc2V0dXBfdGFiW0lORF0udmVydGV4X2Zvcm1hdCA9IFBST0pfVEVYMV9WRVJURVhfRk9STUFUOwoJIHNldHVwX3RhYltJTkRdLnZlcnRleF9zaXplID0gMTI7CiAgICAgIH0KICAgICAgZWxzZSB7Cgkgc2V0dXBfdGFiW0lORF0udmVydGV4X2Zvcm1hdCA9IFRFWDFfVkVSVEVYX0ZPUk1BVDsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfc2l6ZSA9IDEwOwogICAgICB9CiAgIH0KICAgZWxzZSBpZiAoRE9fVEVYMCkgewogICAgICBpZiAoRE9fUFRFWCAmJiBIQVZFX1BURVhfVkVSVElDRVMpIHsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gUFJPSl9URVgxX1ZFUlRFWF9GT1JNQVQ7Cgkgc2V0dXBfdGFiW0lORF0udmVydGV4X3NpemUgPSAxMjsKICAgICAgfSBlbHNlIHsKCSBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gVEVYMF9WRVJURVhfRk9STUFUOwoJIHNldHVwX3RhYltJTkRdLnZlcnRleF9zaXplID0gODsKICAgICAgfQogICB9CiAgIGVsc2UgaWYgKCFIQVZFX0hXX0RJVklERSAmJiAhRE9fU1BFQyAmJiAhRE9fRk9HICYmIEhBVkVfVElOWV9WRVJUSUNFUykgewogICAgICBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gVElOWV9WRVJURVhfRk9STUFUOwogICAgICBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfc2l6ZSA9IDQ7CiAgIH0gZWxzZSBpZiAoSEFWRV9OT1RFWF9WRVJUSUNFUykgewogICAgICBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gTk9URVhfVkVSVEVYX0ZPUk1BVDsKICAgICAgc2V0dXBfdGFiW0lORF0udmVydGV4X3NpemUgPSA2OwogICB9IGVsc2UgewogICAgICBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfZm9ybWF0ID0gVEVYMF9WRVJURVhfRk9STUFUOwogICAgICBzZXR1cF90YWJbSU5EXS52ZXJ0ZXhfc2l6ZSA9IDg7CiAgIH0KCn0KCgojdW5kZWYgSU5ECiN1bmRlZiBUQUcK