ZGlmZiAtLWdpdCBhL01hYy9HVVNJLW1vZHMvaW50by1pbmNsdWRlL0dVU0kuaCBiL01hYy9HVVNJLW1vZHMvaW50by1pbmNsdWRlL0dVU0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NlNDI5Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL0dVU0ktbW9kcy9pbnRvLWluY2x1ZGUvR1VTSS5oCkBAIC0wLDAgKzEsMzY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQcm9qZWN0CToJR1VTSQkJCQktCUdyYW5kIFVuaWZpZWQgU29ja2V0IEludGVyZmFjZQorRmlsZQkJOglHVVNJLmgJCQktCVNvY2tldCBjYWxscworQXV0aG9yCToJTWF0dGhpYXMgTmVlcmFjaGVyCitMYW5ndWFnZQk6CU1QVyBDL0MrKworCiskTG9nJAorUmV2aXNpb24gMS4xICAxOTk4LzA4LzE4IDE0OjUyOjMzICBqYWNrCitQdXR0aW5nIFB5dGhvbi1zcGVjaWZpYyBHVVNJIG1vZGlmaWNhdGlvbnMgdW5kZXIgQ1ZTLgorCitSZXZpc2lvbiAxLjIgIDE5OTQvMTIvMzEgIDAxOjQ1OjU0ICBuZWVyaQorRml4IGFsaWdubWVudC4KKworUmV2aXNpb24gMS4xICAxOTk0LzAyLzI1ICAwMjo1Njo0OSAgbmVlcmkKK0luaXRpYWwgcmV2aXNpb24KKworUmV2aXNpb24gMC4xNSAgMTk5My8wNi8yNyAgMDA6MDA6MDAgIG5lZXJpCitmP3RydW5jYXRlCisKK1JldmlzaW9uIDAuMTQgIDE5OTMvMDYvMjAgIDAwOjAwOjAwICBuZWVyaQorQ2hhbmdlZCBzYV9jb25zdHJfcHBjCisKK1JldmlzaW9uIDAuMTMgIDE5OTMvMDIvMTQgIDAwOjAwOjAwICBuZWVyaQorQUZfUEFQCisKK1JldmlzaW9uIDAuMTIgIDE5OTIvMTIvMDggIDAwOjAwOjAwICBuZWVyaQorZ2V0Y3dkKCkKKworUmV2aXNpb24gMC4xMSAgMTk5Mi8xMS8xNSAgMDA6MDA6MDAgIG5lZXJpCityZW1vdmUgbmV0ZGIuaCBkZWZpbml0aW9ucworCitSZXZpc2lvbiAwLjEwICAxOTkyLzA5LzI2ICAwMDowMDowMCAgbmVlcmkKK1NlcGFyYXRlIGRpcmVudCBhbmQgc3RhdAorCitSZXZpc2lvbiAwLjkgIDE5OTIvMDkvMTIgIDAwOjAwOjAwICBuZWVyaQorSG9zdG5hbWUgc3R1ZmYKKworUmV2aXNpb24gMC44ICAxOTkyLzA5LzA3ICAwMDowMDowMCAgbmVlcmkKK3JlYWRsaW5rKCkKKworUmV2aXNpb24gMC43ICAxOTkyLzA4LzAzICAwMDowMDowMCAgbmVlcmkKK3NhX2NvbnN0cl9wcGMKKworUmV2aXNpb24gMC42ICAxOTkyLzA3LzIxICAwMDowMDowMCAgbmVlcmkKK3NvY2thZGRyX2F0bGtfc3ltCisKK1JldmlzaW9uIDAuNSAgMTk5Mi8wNi8yNiAgMDA6MDA6MDAgIG5lZXJpCitjaG9vc2UoKQorCitSZXZpc2lvbiAwLjQgIDE5OTIvMDUvMTggIDAwOjAwOjAwICBuZWVyaQorUFBDIHN0dWZmCisKK1JldmlzaW9uIDAuMyAgMTk5Mi8wNC8yNyAgMDA6MDA6MDAgIG5lZXJpCitnZXRzb2Nrb3B0KCkKKworUmV2aXNpb24gMC4yICAxOTkyLzA0LzE5ICAwMDowMDowMCAgbmVlcmkKK0MrKyBjb21wYXRpYmlsaXR5CisKK1JldmlzaW9uIDAuMSAgMTk5Mi8wNC8xNyAgMDA6MDA6MDAgIG5lZXJpCitiemVybygpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfR1VTSV8KKyNkZWZpbmUgX0dVU0lfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogRmVlbCBmcmVlIHRvIGluY3JlYXNlIEZEX1NFVFNJWkUgYXMgbmVlZGVkICovCisjZGVmaW5lIEdVU0lfTUFYX0ZECUZEX1NFVFNJWkUKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGNvbXBhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8VHlwZXMuaD4KKyNpbmNsdWRlIDxFdmVudHMuaD4KKyNpbmNsdWRlIDxGaWxlcy5oPgorI2luY2x1ZGUgPEFwcGxlVGFsay5oPgorI2luY2x1ZGUgPENUQlV0aWxpdGllcy5oPgorI2luY2x1ZGUgPFBhY2thZ2VzLmg+CisjaW5jbHVkZSA8UFBDVG9vbEJveC5oPgorI2luY2x1ZGUgPFN0YW5kYXJkRmlsZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKwordHlwZWRlZiBlbnVtIHNwaW5fbXNnIHsKKwlTUF9NSVNDLAkJCQkvKiBzb21lIHdlaXJkIHRoaW5nLCB1c3VhbGx5IGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHlvdSBnZXQgdGhpcyAqLworCVNQX1NFTEVDVCwJCQkvKiBpbiBhIHNlbGVjdCBjYWxsICovCisJU1BfTkFNRSwJCQkJLyogZ2V0dGluZyBhIGhvc3QgYnkgbmFtZSAqLworCVNQX0FERFIsCQkJCS8qIGdldHRpbmcgYSBob3N0IGJ5IGFkZHJlc3MgKi8KKwlTUF9TVFJFQU1fUkVBRCwJLyogU3RyZWFtIHJlYWQgY2FsbCAqLworCVNQX1NUUkVBTV9XUklURSwJLyogU3RyZWFtIHdyaXRlIGNhbGwgKi8KKwlTUF9ER1JBTV9SRUFELAkJLyogRGF0YWdyYW0gcmVhZCBjYWxsICovCisJU1BfREdSQU1fV1JJVEUsCS8qIERhdGFncmFtIHdyaXRlIGNhbGwgKi8KKwlTUF9TTEVFUCwJCQkvKiBzbGVlcGluZywgcGFzc2VzIHRpY2tzIGxlZnQgdG8gc2xlZXAgKi8KKwlTUF9BVVRPX1NQSU4JCS8qIEF1dG9zcGluLCBwYXNzZXMgYXJndW1lbnQgdG8gU3BpbkN1cnNvciAqLworfSBzcGluX21zZzsKKwordHlwZWRlZiBpbnQgKCpHVVNJU3BpbkZuKShzcGluX21zZyBtc2csIGxvbmcgcGFyYW0pOwordHlwZWRlZiB2b2lkICgqR1VTSUV2dEhhbmRsZXIpKEV2ZW50UmVjb3JkICogZXYpOwordHlwZWRlZiBHVVNJRXZ0SGFuZGxlcglHVVNJRXZ0VGFibGVbMjRdOworCisvKgorICogQWRkcmVzcyBmYW1pbGllcywgZGVmaW5lZCBpbiBzeXMvc29ja2V0LmgKKyAqCisgCisjZGVmaW5lCUFGX1VOU1BFQwkJIDAJCS8vIHVuc3BlY2lmaWVkCisjZGVmaW5lCUFGX1VOSVgJCQkgMQkJLy8gbG9jYWwgdG8gaG9zdCAocGlwZXMsIHBvcnRhbHMpCisjZGVmaW5lCUFGX0lORVQJCQkgMgkJLy8gaW50ZXJuZXR3b3JrOiBVRFAsIFRDUCwgZXRjLgorI2RlZmluZQlBRl9DVEIJCQkgMwkJLy8gQXBwbGUgQ29tbSBUb29sYm94IChub3QgeWV0IHN1cHBvcnRlZCkKKyNkZWZpbmUJQUZfRklMRQkJCSA0CQkvLyBOb3JtYWwgRmlsZSBJL08gKHVzZWQgaW50ZXJuYWxseSkKKyNkZWZpbmUJQUZfUFBDCQkJIDUJCS8vIFBQQyBUb29sYm94CisjZGVmaW5lCUFGX1BBUAkJCSA2CQkvLyBQcmludGVyIEFjY2VzcyBQcm90b2NvbCAoY2xpZW50IG9ubHkpCisjZGVmaW5lCUFGX0FQUExFVEFMSwkxNgkJLy8gQXBwbGUgVGFsaworCisqLworCisjZGVmaW5lCUFUQUxLX1NZTUFERFIgMjcyCQkvKiBTeW1ib2xpYyBBZGRyZXNzIGZvciBBcHBsZVRhbGsgCQkJKi8KKworLyoKKyAqIFNvbWUgSW1wbGVtZW50YXRpb25zIG9mIEdVU0kgcmVxdWlyZSB5b3UgdG8gY2FsbCBHVVNJU2V0dXAgZm9yIHRoZQorICogc29ja2V0IGZhbWlsaWVzIHlvdSdkIGxpa2UgdG8gaGF2ZSBkZWZpbmVkLiBJdCdzIGEgZ29vZCBpZGVhIHRvIGNhbGwKKyAqIHRoaXMgZm9yICphbGwqIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBHVVNJRGVmYXVsdFNldHVwKCkgd2lsbCBpbmNsdWRlIGFsbCBzb2NrZXQgZmFtaWxpZXMuCisgKgorICogTmV2ZXIgY2FsbCBhbnkgb2YgdGhlIEdVU0l3aXRoWFhYIHJvdXRpbmVzIGRpcmVjdGx5LgorICovCisKK19fQkVHSU5fREVDTFMKK3ZvaWQgR1VTSXdpdGhBcHBsZVRhbGtTb2NrZXRzKCk7Cit2b2lkIEdVU0l3aXRoSW50ZXJuZXRTb2NrZXRzKCk7Cit2b2lkIEdVU0l3aXRoUEFQU29ja2V0cygpOwordm9pZCBHVVNJd2l0aFBQQ1NvY2tldHMoKTsKK3ZvaWQgR1VTSXdpdGhVbml4U29ja2V0cygpOwordm9pZCBHVVNJd2l0aFNJT1VYU29ja2V0cygpOwordm9pZCBHVVNJd2l0aE1QV1NvY2tldHMoKTsKKwordm9pZCBHVVNJU2V0dXAodm9pZCAoKnNvY2tldGZhbWlseSkoKSk7Cit2b2lkIEdVU0lEZWZhdWx0U2V0dXAoKTsKK3ZvaWQgR1VTSUxvYWRDb25maWd1cmF0aW9uKEhhbmRsZSk7CitfX0VORF9ERUNMUworLyoKKyAqIFR5cGVzLCAgZGVmaW5lZCBpbiBzeXMvc29ja2V0LmgKKyAqCisKKyNkZWZpbmUJU09DS19TVFJFQU0JCSAxCQkvLyBzdHJlYW0gc29ja2V0IAorI2RlZmluZQlTT0NLX0RHUkFNCQkgMgkJLy8gZGF0YWdyYW0gc29ja2V0CisKKyovCisKKy8qCisgKiBEZWZpbmVkIGluIHN5cy91bi5oCisgKgorIAorc3RydWN0IHNvY2thZGRyX3VuIHsKKwlzaG9ydAkJc3VuX2ZhbWlseTsKKwljaGFyIAkJc3VuX3BhdGhbMTA4XTsKK307CisKKyovCisKKyNpZm5kZWYgUFJBR01BX0FMSUdOX1NVUFBPUlRFRAorI2Vycm9yIEFwcGxlIGhhZCBzb21lIGZ1biB3aXRoIHRoZSBjb25kaXRpb25hbCBtYWNyb3MgYWdhaW4KKyNlbmRpZgorCisjaWYgUFJBR01BX0FMSUdOX1NVUFBPUlRFRAorI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4aworI2VuZGlmCisKK3N0cnVjdCBzb2NrYWRkcl9hdGxrIHsKKwlzaG9ydAkJCWZhbWlseTsKKwlBZGRyQmxvY2sJYWRkcjsKK307CisKK3N0cnVjdCBzb2NrYWRkcl9hdGxrX3N5bSB7CisJc2hvcnQJCQlmYW1pbHk7CisJRW50aXR5TmFtZQluYW1lOworfTsKKworc3RydWN0IHNvY2thZGRyX3BwYyB7CisJc2hvcnQJCQkJCWZhbWlseTsKKwlMb2NhdGlvbk5hbWVSZWMJbG9jYXRpb247CisJUFBDUG9ydFJlYwkJCXBvcnQ7Cit9OworCisvKiBEZWZpbml0aW9ucyBmb3IgY2hvb3NlKCkgKi8KKworI2RlZmluZSAJQ0hPT1NFX0RFRkFVTFQJMQkJLyoJVXNlICpuYW1lIGFzIGRlZmF1bHQgbmFtZQkJCQkJCSovCisjZGVmaW5lCUNIT09TRV9ORVcJCTIJCS8qIENob29zZSBuZXcgZW50aXR5IG5hbWUsIG5vdCBleGlzdGluZyBvbmUJKi8KKyNkZWZpbmUJQ0hPT1NFX0RJUgkJNAkJLyogQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUsIG5vdCBhIGZpbGUgCQkqLworCit0eXBlZGVmIHN0cnVjdCB7CisJc2hvcnQJCQludW1UeXBlczsKKwlTRlR5cGVMaXN0CXR5cGVzOworfSBzYV9jb25zdHJfZmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXNob3J0CQkJbnVtVHlwZXM7CisJTkxUeXBlCQl0eXBlczsKK30gc2FfY29uc3RyX2F0bGs7CisKKy8qIERlZmluaXRpb25zIGZvciBzYV9jb25zdHJfcHBjICovCisKKyNkZWZpbmUgUFBDX0NPTl9ORVdTVFlMRQkJMHg4MDAwCS8qIFJlcXVpcmVkICovCisjZGVmaW5lIFBQQ19DT05fTUFUQ0hfTkFNRQkJMHgwMDAxCS8qIE1hdGNoIG5hbWUgKi8KKyNkZWZpbmUgUFBDX0NPTl9NQVRDSF9UWVBFIAkweDAwMDIgCS8qIE1hdGNoIHBvcnQgdHlwZSAqLworI2RlZmluZSBQUENfQ09OX01BVENIX05CUAkJMHgwMDA0CS8qIE1hdGNoIE5CUCB0eXBlICovCisKK3R5cGVkZWYgc3RydWN0CXsKKwlzaG9ydAkJCWZsYWdzOworCVN0cjMyCQkJbmJwVHlwZTsKKwlQUENQb3J0UmVjCW1hdGNoOworfSBzYV9jb25zdHJfcHBjOworCisjaWYgUFJBR01BX0FMSUdOX1NVUFBPUlRFRAorI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworLyogCisgKiBJTy9Tb2NrZXQgc3R1ZmYsIGRlZmluZWQgZWxzZXdoZXJlICh1bmlzdGQuaCwgc3lzL3NvY2tldC5oCisgKgorCitpbnQgc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBzaG9ydCBwcm90b2NvbCk7CitpbnQgYmluZChpbnQgcywgdm9pZCAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IGNvbm5lY3QoaW50IHMsIHZvaWQgKmFkZHIsIGludCBhZGRybGVuKTsKK2ludCBsaXN0ZW4oaW50IHMsIGludCBxbGVuKTsKK2ludCBhY2NlcHQoaW50IHMsIHZvaWQgKmFkZHIsIGludCAqYWRkcmxlbik7CitpbnQgY2xvc2UoaW50IHMpOworaW50IHJlYWQoaW50IHMsIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgYnVmbGVuKTsKK2ludCByZWFkdihpbnQgcywgc3RydWN0IGlvdmVjICppb3YsIGludCBjb3VudCk7CitpbnQgcmVjdihpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MpOworaW50IHJlY3Zmcm9tKGludCBzLCB2b2lkICpidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncywgdm9pZCAqZnJvbSwgaW50ICpmcm9tbGVuKTsKK2ludCByZWN2bXNnKGludCBzLHN0cnVjdCBtc2doZHIgKm1zZyxpbnQgZmxhZ3MpOworaW50IHdyaXRlKGludCBzLCBjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGJ1Zmxlbik7CitpbnQgd3JpdGV2KGludCBzLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KTsKK2ludCBzZW5kKGludCBzLCB2b2lkICpidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncyk7CitpbnQgc2VuZHRvIChpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MsIHZvaWQgKnRvLCBpbnQgdG9sZW4pOworaW50IHNlbmRtc2coaW50IHMsc3RydWN0IG1zZ2hkciAqbXNnLGludCBmbGFncyk7CitpbnQgc2VsZWN0KGludCB3aWR0aCwgZmRfc2V0ICpyZWFkZmRzLCBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKmV4Y2VwdGZkcywgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpOworaW50IGdldGR0YWJsZXNpemUodm9pZCk7CitpbnQgZ2V0c29ja25hbWUoaW50IHMsIHZvaWQgKm5hbWUsIGludCAqbmFtZWxlbik7CitpbnQgZ2V0cGVlcm5hbWUoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgaW50ICpuYW1lbGVuKTsKK2ludCBzaHV0ZG93bihpbnQgcywgaW50IGhvdyk7CitpbnQgZmNudGwoaW50IHMsIHVuc2lnbmVkIGludCBjbWQsIGludCBhcmcpOworaW50IGR1cChpbnQgcyk7CitpbnQgZHVwMihpbnQgcywgaW50IHMxKTsKK2ludCBpb2N0bChpbnQgZCwgdW5zaWduZWQgaW50IHJlcXVlc3QsIGxvbmcgKmFyZ3ApOworaW50IGdldHNvY2tvcHQoaW50IHMsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgKm9wdHZhbCwgaW50ICogb3B0bGVuKTsKK2ludCBzZXRzb2Nrb3B0KGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyICpvcHR2YWwsIGludCBvcHRsZW4pOworaW50IGlzYXR0eShpbnQpOworaW50IHJlbW92ZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpbnQgcmVuYW1lKGNvbnN0IGNoYXIgKm9sZG5hbWUsIGNvbnN0IGNoYXIgKm5ld25hbWUpOworaW50IGNyZWF0KGNvbnN0IGNoYXIqKTsKK2ludCBmYWNjZXNzKGNoYXIqLCB1bnNpZ25lZCBpbnQsIGxvbmcqKTsKK2xvbmcgbHNlZWsoaW50LCBsb25nLCBpbnQpOworaW50IG9wZW4oY29uc3QgY2hhciosIGludCk7CitpbnQgdW5saW5rKGNoYXIqKTsKK2ludCBzeW1saW5rKGNoYXIqIGxpbmt0bywgY2hhciogbGlua25hbWUpOworaW50IHJlYWRsaW5rKGNoYXIqIHBhdGgsIGNoYXIqIGJ1ZiwgaW50IGJ1ZnNpeik7CitpbnQgdHJ1bmNhdGUoY2hhciAqcGF0aCwgbG9uZyBsZW5ndGgpOworaW50IGZ0cnVuY2F0ZShpbnQgZmQsIGxvbmcgbGVuZ3RoKTsKK2ludCBjaGRpcihjaGFyICogcGF0aCk7CitpbnQgbWtkaXIoY2hhciAqIHBhdGgpOworaW50IHJtZGlyKGNoYXIgKiBwYXRoKTsKK2NoYXIgKiBnZXRjd2QoY2hhciAqIGJ1ZiwgaW50IHNpemUpOworKi8KKworLyogCisgKiBEZWZpbmVkIGluIHN0ZGlvLmgKKyAqLworIAorI2lmZGVmIF9fTVdFUktTX18KK3ZvaWQgZnNldGZpbGVpbmZvIChjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgbG9uZyBuZXdjcmVhdG9yLCB1bnNpZ25lZCBsb25nIG5ld3R5cGUpOworI2VuZGlmCisKK3ZvaWQgZmdldGZpbGVpbmZvIChjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgbG9uZyAqIGNyZWF0b3IsIHVuc2lnbmVkIGxvbmcgKiB0eXBlKTsKKworI2lmZGVmIF9fTVdFUktTX18KK0ZJTEUgKmZkb3BlbihpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpOworaW50IGZ3YWxrKGludCAoKmZ1bmMpKEZJTEUgKiBzdHJlYW0pKTsKKyNlbmRpZgorCitpbnQgY2hvb3NlKAorCQlpbnQgCQlkb21haW4sCisJCWludCAJCXR5cGUsCisJCWNoYXIgKiAJcHJvbXB0LAorCQl2b2lkICogCWNvbnN0cmFpbnQsCisJCWludCAJCWZsYWdzLAorCQl2b2lkICogCW5hbWUsCisJCWludCAqIAluYW1lbGVuKTsKKworLyogCisgKiBIb3N0bmFtZSByb3V0aW5lcywgZGVmaW5lZCBpbiBuZXRkYi5oCisgKgorIAorc3RydWN0IGhvc3RlbnQgKiBnZXRob3N0YnluYW1lKGNoYXIgKm5hbWUpOworc3RydWN0IGhvc3RlbnQgKiBnZXRob3N0YnlhZGRyKHN0cnVjdCBpbl9hZGRyICphZGRyUCwgaW50LCBpbnQpOworaW50IGdldGhvc3RuYW1lKGNoYXIgKm1hY2huYW1lLCBsb25nIGJ1Zmxlbik7CitzdHJ1Y3Qgc2VydmVudCAqIGdldHNlcnZieW5hbWUgKGNoYXIgKiBuYW1lLCBjaGFyICogcHJvdG8pOworc3RydWN0IHByb3RvZW50ICogZ2V0cHJvdG9ieW5hbWUoY2hhciAqIG5hbWUpOworCisqLworCitjaGFyICogaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluYWRkcik7CitzdHJ1Y3QgaW5fYWRkciBpbmV0X2FkZHIoY2hhciAqYWRkcmVzcyk7CisKKy8qIAorICogR1VTSSBzdXBwb3J0cyBhIG51bWJlciBvZiBob29rcy4gRXZlcnkgb25lIG9mIHRoZW0gaGFzIGEgZGlmZmVyZW50IHByb3RvdHlwZSwgYnV0IG5lZWRzCisgKiB0byBiZSBwYXNzZWQgYXMgYSBHVVNJSG9vaworICovCisKK3R5cGVkZWYgZW51bSB7CisJR1VTSV9TcGluSG9vaywJLyogQSBHVVNJU3BpbkZuLCB0byBiZSBjYWxsZWQgd2hlbiBhIGNhbGwgYmxvY2tzICovCisJR1VTSV9FeGVjSG9vaywgLyogQm9vbGVhbiAoKmhvb2spKGNvbnN0IEdVU0lGaWxlUmVmICYgcmVmKSwgZGVjaWRlcyBpZiBmaWxlIGlzIGV4ZWN1dGFibGUgKi8KKwlHVVNJX0ZUeXBlSG9vaywvKiBCb29sZWFuICgqaG9vaykoY29uc3QgRlNTcGVjICYgc3BlYykgc2V0cyBhIGRlZmF1bHQgZmlsZSB0eXBlICovCisJR1VTSV9TcGVlZEhvb2sgLyogQSBsb25nIGludGVnZXIsIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJzb3Igc3BpbiB2YXJpYWJsZSAqLworfSBHVVNJSG9va0NvZGU7CisKK3R5cGVkZWYgdm9pZCAoKkdVU0lIb29rKSh2b2lkKTsKK3ZvaWQgR1VTSVNldEhvb2soR1VTSUhvb2tDb2RlIGNvZGUsIEdVU0lIb29rIGhvb2spOworR1VTSUhvb2sgR1VTSUdldEhvb2soR1VTSUhvb2tDb2RlIGNvZGUpOworCisvKiAKKyAqIFdoYXQgdG8gZG8gd2hlbiBhIHJvdXRpbmUgYmxvY2tzCisgKi8KKworLyogRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBHVVNJU2V0U3Bpbihyb3V0aW5lKQlHVVNJU2V0SG9vayhHVVNJX1NwaW5Ib29rLCAoR1VTSUhvb2spcm91dGluZSkKKyNkZWZpbmUgR1VTSUdldFNwaW4oKQkJCShHVVNJU3BpbkZuKSBHVVNJR2V0SG9vayhHVVNJX1NwaW5Ib29rKQorCitpbnQgR1VTSVNldEV2ZW50cyhHVVNJRXZ0VGFibGUgdGFibGUpOworR1VTSUV2dEhhbmRsZXIgKiBHVVNJR2V0RXZlbnRzKHZvaWQpOworCitleHRlcm4gR1VTSUV2dEhhbmRsZXIJR1VTSVNJT1dFdmVudHNbXTsKKworI2RlZmluZSBTSUdQSVBFCTEzCisjZGVmaW5lIFNJR0FMUk0JMTQKKworLyogCisgKiBCU0QgbWVtb3J5IHJvdXRpbmVzLCBkZWZpbmVkIGluIGNvbXBhdC5oCisgKgorCisjZGVmaW5lIGluZGV4KGEsIGIpCQkJCQkJc3RyY2hyKGEsIGIpCisjZGVmaW5lIHJpbmRleChhLCBiKQkJCQkJCXN0cnJjaHIoYSwgYikKKyNkZWZpbmUgYnplcm8oZnJvbSwgbGVuKSAJCQkJbWVtc2V0KGZyb20sIDAsIGxlbikKKyNkZWZpbmUgYmNvcHkoZnJvbSwgdG8sIGxlbikJCQltZW1jcHkodG8sIGZyb20sIGxlbikKKyNkZWZpbmUgYmNtcChzMSwgczIsIGxlbikJCQkJbWVtY21wKHMxLCBzMiwgbGVuKQorI2RlZmluZSBiZmlsbChmcm9tLCBsZW4sIHgpCQkJbWVtc2V0KGZyb20sIHgsIGxlbikKKworICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiAhX0dVU0lfICovCmRpZmYgLS1naXQgYS9NYWMvR1VTSS1tb2RzL2ludG8taW5jbHVkZS9HVVNJX1AuaCBiL01hYy9HVVNJLW1vZHMvaW50by1pbmNsdWRlL0dVU0lfUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvR1VTSS1tb2RzL2ludG8taW5jbHVkZS9HVVNJX1AuaApAQCAtMCwwICsxLDQ3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUHJvamVjdAk6CUdVU0kJCQkJLQlHcmFuZCBVbmlmaWVkIFNvY2tldCBJbnRlcmZhY2UKK0ZpbGUJCToJR1VTSV9QLmgJCQktCVByaXZhdGUgc3R1ZmYKK0F1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgorTGFuZ3VhZ2UJOglNUFcgQy9DKysKKworJExvZyQKK1JldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozMyAgamFjaworUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KKworUmV2aXNpb24gMS4zICAxOTk0LzEyLzMxICAwMTozMDoyNiAgbmVlcmkKK1Jlb3JnYW5pemUgZmlsZW5hbWUgZGlzcGF0Y2hpbmcuCisKK1JldmlzaW9uIDEuMiAgMTk5NC8wOC8xMCAgMDA6NDE6MDUgIG5lZXJpCitTYW5pdGl6ZWQgZm9yIHVuaXZlcnNhbCBoZWFkZXJzLgorCitSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMjUgIDAyOjU3OjAxICBuZWVyaQorSW5pdGlhbCByZXZpc2lvbgorCitSZXZpc2lvbiAwLjIyICAxOTkzLzA3LzE3ICAwMDowMDowMCAgbmVlcmkKK0dVU0lSaW5nQnVmZmVyOjpwcm9jIC0+IGRlZnByb2MKKworUmV2aXNpb24gMC4yMSAgMTk5My8wNy8xNyAgMDA6MDA6MDAgIG5lZXJpCitHVVNJT19NQVhfRE9NQUlOIC0+IEFGX01BWAorCitSZXZpc2lvbiAwLjIwICAxOTkzLzA2LzI3ICAwMDowMDowMCAgbmVlcmkKK1NvY2tldDo6e3ByZSxwb3N0fV9zZWxlY3QKKworUmV2aXNpb24gMC4xOSAgMTk5My8wNi8yNyAgMDA6MDA6MDAgIG5lZXJpCitTb2NrZXQ6OmZ0cnVuY2F0ZQorCitSZXZpc2lvbiAwLjE4ICAxOTkzLzAyLzA5ICAwMDowMDowMCAgbmVlcmkKK1NvY2tldDo6bHVya2luZywgU29ja2V0OjpsdXJrZGVzY3IKKworUmV2aXNpb24gMC4xNyAgMTk5My8wMS8zMSAgMDA6MDA6MDAgIG5lZXJpCitHVVNJQ29uZmlndXJhdGlvbjo6ZGFlbW9uCisKK1JldmlzaW9uIDAuMTYgIDE5OTMvMDEvMTcgIDAwOjAwOjAwICBuZWVyaQorRGVzdHJ1Y3RvcnMgZm9yIFNvY2tldGRvbWFpbgorCitSZXZpc2lvbiAwLjE1ICAxOTkzLzAxLzE3ICAwMDowMDowMCAgbmVlcmkKK1NBRkVTUElOCisKK1JldmlzaW9uIDAuMTQgIDE5OTMvMDEvMDMgIDAwOjAwOjAwICBuZWVyaQorR1VTSUNvbmZpZworCitSZXZpc2lvbiAwLjEzICAxOTkyLzA5LzI0ICAwMDowMDowMCAgbmVlcmkKK0luY2x1ZGUgR1VTSVJzcmNfUC5oCisKK1JldmlzaW9uIDAuMTIgIDE5OTIvMDkvMTMgIDAwOjAwOjAwICBuZWVyaQorU1BJTlZPSUQgZGlkbid0IHJldHVybgorCitSZXZpc2lvbiAwLjExICAxOTkyLzA4LzMwICAwMDowMDowMCAgbmVlcmkKK0FwcGxlVGFsa0lkZW50aXR5KCkKKworUmV2aXNpb24gMC4xMCAgMTk5Mi8wOC8wMyAgMDA6MDA6MDAgIG5lZXJpCitSaW5nQnVmZmVyCisKK1JldmlzaW9uIDAuOSAgMTk5Mi8wNy8zMCAgMDA6MDA6MDAgIG5lZXJpCitJbml0aWFsaXplciBGZWF0dXJlcworCitSZXZpc2lvbiAwLjggIDE5OTIvMDcvMjYgIDAwOjAwOjAwICBuZWVyaQorVW5peFNvY2tldHMuY2hvb3NlKCkKKworUmV2aXNpb24gMC43ICAxOTkyLzA3LzEzICAwMDowMDowMCAgbmVlcmkKK01ha2UgQXBwbGVUYWxrU29ja2V0cyBnbG9iYWwKKworUmV2aXNpb24gMC42ICAxOTkyLzA2LzI3ICAwMDowMDowMCAgbmVlcmkKK2Nob29zZSgpLCBoYXNOZXdTRgorCitSZXZpc2lvbiAwLjUgIDE5OTIvMDYvMDcgIDAwOjAwOjAwICBuZWVyaQorRmVhdHVyZQorCitSZXZpc2lvbiAwLjQgIDE5OTIvMDUvMjEgIDAwOjAwOjAwICBuZWVyaQorSW1wbGVtZW50ZWQgc2VsZWN0KCkKKworUmV2aXNpb24gMC4zICAxOTkyLzA0LzE5ICAwMDowMDowMCAgbmVlcmkKK0MrKyByZXdyaXRlCisKK1JldmlzaW9uIDAuMiAgMTk5Mi8wNC8xOCAgMDA6MDA6MDAgIG5lZXJpCitjaGFuZ2VkIHJlYWQvd3JpdGUvc2VuZC9yZWN2IGRpc3BhdGNoZXJzCisKK1JldmlzaW9uIDAuMSAgMTk5Mi8wNC8xOCAgMDA6MDA6MDAgIG5lZXJpCitwcGMgRG9tYWluCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0dVU0lfUF9fCisjZGVmaW5lIF9fR1VTSV9QX18KKworI2RlZmluZSBfX3VzZUFwcGxlRXh0c19fCisKKyNpbmNsdWRlIDxHVVNJLmg+CisjaW5jbHVkZSA8R1VTSVJzcmNfUC5oPgorI2luY2x1ZGUgPFRGaWxlU3BlYy5oPgorCisKKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitleHRlcm4gIkMiIHsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAJCUdVU0lfZXJyb3IoaW50IGVycik7Cit2b2lkICoJR1VTSV9lcnJvcl9uaWwoaW50IGVycik7Cit9CisKKyNpbmNsdWRlIDxNZW1vcnkuaD4KKyNpbmNsdWRlIDxHZXN0YWx0Lmg+CisjaW5jbHVkZSA8VHJhcHMuaD4KKyNpbmNsdWRlIDxBcHBsZUV2ZW50cy5oPgorI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgorI2luY2x1ZGUgPE1peGVkTW9kZS5oPgorCisjaWYgTVNMR1VTSQordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZgorCisjaWYgR0VORVJBVElORzY4SworI3ByYWdtYSBzZWdtZW50IEdVU0kKKyNlbmRpZgorCisjZGVmaW5lIEdVU0lfTUFYX0RPTUFJTgkJCUFGX01BWAorI2RlZmluZSBERUZBVUxUX0JVRkZFUl9TSVpFCTQwOTYKKworLyoKKyAqCUluIHVzZSBhbmQgc2h1dGRvd24gc3RhdHVzLgorICovCisjZGVmaW5lCVNPQ0tfU1RBVFVTX1VTRUQJCTB4MQkJLyogVXNlZCBzb2NrZXQgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUJU09DS19TVEFUVVNfTk9SRUFECTB4MgkJLyogTm8gbW9yZSByZWFkaW5nIGFsbG93ZWQgZnJvbSBzb2NrZXQgKi8KKyNkZWZpbmUJU09DS19TVEFUVVNfTk9XUklURQkweDQJCS8qIE5vIG1vcmUgd3JpdGluZyBhbGxvd2VkIHRvIHNvY2tldCAqLworCisvKgorICoJU29ja2V0IGNvbm5lY3Rpb24gc3RhdGVzLgorICovCisjZGVmaW5lCVNPQ0tfU1RBVEVfTk9fU1RSRUFNCQkwCS8qIFNvY2tldCBkb2Vzbid0IGhhdmUgYSBNYWNUQ1Agc3RyZWFtIHlldCAqLworI2RlZmluZQlTT0NLX1NUQVRFX1VOQ09OTkVDVEVECTEJLyogU29ja2V0IGlzIHVuY29ubmVjdGVkLiAqLworI2RlZmluZQlTT0NLX1NUQVRFX0xJU1RFTklORwkJMgkvKiBTb2NrZXQgaXMgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9uLiAqLworI2RlZmluZQlTT0NLX1NUQVRFX0xJU19DT04JCTMJLyogU29ja2V0IGlzIGluIHRyYW5zaXRpb24gZnJvbSBsaXN0ZW4gdG8gY29ubmVjdGVkLiAqLworI2RlZmluZQlTT0NLX1NUQVRFX0NPTk5FQ1RJTkcJNAkvKiBTb2NrZXQgaXMgaW5pdGlhdGluZyBhIGNvbm5lY3Rpb24uICovCisjZGVmaW5lCVNPQ0tfU1RBVEVfQ09OTkVDVEVECQk1CS8qIFNvY2tldCBpcyBjb25uZWN0ZWQuICovCisjZGVmaW5lCVNPQ0tfU1RBVEVfQ0xPU0lORyAgICAgIDYJLyogU29ja2V0IGlzIGNsb3NpbmcgKi8KKyNkZWZpbmUJU09DS19TVEFURV9MSVNfQ0xPU0UgICAgNwkvKiBTb2NrZXQgY2xvc2VkIHdoaWxlIGxpc3RlbmluZyAqLworCisjZGVmaW5lCQltaW4oYSxiKQkJCQkoIChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUJCW1heChhLGIpCQkJCSggKGEpID4gKGIpID8gKGEpIDogKGIpKQorCitleHRlcm4gR1VTSVNwaW5GbiBHVVNJU3BpbjsKK2V4dGVybiAiQyIgaW50IEdVU0lEZWZhdWx0U3BpbihzcGluX21zZywgbG9uZyk7CitleHRlcm4gaW50IEdVU0lDaGVja0FsYXJtKCk7CisKKyNkZWZpbmUgR1VTSV9JTlRFUlJVUFQobWVzZyxwYXJhbSkJKEdVU0lDaGVja0FsYXJtKCkgfHwgKEdVU0lTcGluICYmICgqR1VTSVNwaW4pKG1lc2cscGFyYW0pKSkKKworLyogU1BJTiByZXR1cm5zIGEgLTEgb24gdXNlciBjYW5jZWwgZm9yIGZuIHJldHVybmluZyBpbnRlZ2VycyAqLworI2RlZmluZQkJU1BJTihjb25kLG1lc2cscGFyYW0pCQkJCQkJCVwKKwkJCQkJZG8gewkJCQkJCQkJCQkJCVwKKwkJCQkJCWlmIChHVVNJX0lOVEVSUlVQVChtZXNnLHBhcmFtKSkJCVwKKwkJCQkJCQlyZXR1cm4gR1VTSV9lcnJvcihFSU5UUik7CQkJXAorCQkJCQl9IHdoaWxlKGNvbmQpCisKKy8qIFNQSU5QIHJldHVybnMgYSBOVUxMIG9uIHVzZXIgY2FuY2VsLCBmb3IgZm4gcmV0dXJuaW5nIHBvaW50ZXJzICovCQkJCQorI2RlZmluZQkJU1BJTlAoY29uZCxtZXNnLHBhcmFtKQkJCQkJCQlcCisJCQkJCWRvIHsJCQkJCQkJCQkJCQlcCisJCQkJCQlpZiAoR1VTSV9JTlRFUlJVUFQobWVzZyxwYXJhbSkpIHsJXAorCQkJCQkJCUdVU0lfZXJyb3IoRUlOVFIpOwkJCQkJXAorCQkJCQkJCXJldHVybiBOVUxMOwkJCQkJCQlcCisJCQkJCQl9CQkJCQkJCQkJCQkJXAorCQkJCQl9IHdoaWxlKGNvbmQpCisKKy8qIFNQSU5WT0lEIGp1c3QgcmV0dXJucyBvbiB1c2VyIGNhbmNlbCwgZm9yIGZuIHJldHVybmluZyB2b2lkICovCQkJCQorI2RlZmluZQkJU1BJTlZPSUQoY29uZCxtZXNnLHBhcmFtKQkJCQkJCVwKKwkJCQkJZG8gewkJCQkJCQkJCQkJCVwKKwkJCQkJCWlmIChHVVNJX0lOVEVSUlVQVChtZXNnLHBhcmFtKSkgewlcCisJCQkJCQkJCUdVU0lfZXJyb3IoRUlOVFIpOwkJCQlcCisJCQkJCQkJCXJldHVybjsJCQkJCQkJCVwKKwkJCQkJCQl9CQkJCQkJCQkJCQlcCisJCQkJCX0gd2hpbGUoY29uZCkKKwkJCQkJCisvKiBTQUZFU1BJTiBkb2Vzbid0IHJldHVybiwgeW91IGhhdmUgdG8gY2hlY2sgZXJybm8gKi8JCQkJCisjZGVmaW5lCQlTQUZFU1BJTihjb25kLG1lc2cscGFyYW0pCQkJCQkJXAorCQkJCQlkbyB7CQkJCQkJCQkJCQkJXAorCQkJCQkJaWYgKEdVU0lfSU5URVJSVVBUKG1lc2cscGFyYW0pKSB7CVwKKwkJCQkJCQlHVVNJX2Vycm9yKEVJTlRSKTsJCQkJCVwKKwkJCQkJCQlicmVhazsJCQkJCQkJCQlcCisJCQkJCQl9IGVsc2UJCQkJCQkJCQkJXAorCQkJCQkJCWVycm5vID0gMDsJCQkJCQkJCVwKKwkJCQkJfSB3aGlsZShjb25kKQorCisvLworLy8gTGlicmFyeSBmdW5jdGlvbnMgYXJlIG5ldmVyIGFsbG93ZWQgdG8gY2xlYXIgZXJybm8sIHNvIHdlIGhhdmUgdG8gc2F2ZQorLy8KK2NsYXNzIEVycm5vU2F2ZXIgeworcHVibGljOgorCUVycm5vU2F2ZXIoKSAgeyBmU2F2ZWRFcnJubyA9IDo6ZXJybm87IDo6ZXJybm8gPSAwOyAJfQorCX5FcnJub1NhdmVyKCkgeyBpZiAoITo6ZXJybm8pIDo6ZXJybm8gPSBmU2F2ZWRFcnJubzsgIH0KK3ByaXZhdGU6CisJaW50IGZTYXZlZEVycm5vOworfTsKKworI2RlZmluZSBTQVZFX0FORF9DTEVBUl9FUlJOTwlFcnJub1NhdmVyIHNhdmVFcnJubworCQkJCitjbGFzcyBTb2NrZXRUYWJsZTsKKworI2lmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKKyNlbmRpZgorCitjbGFzcyBTb2NrZXQgeworCWZyaWVuZCBjbGFzcyBTb2NrZXRUYWJsZTsKKwkKKwlzaG9ydAkJCXJlZkNvdW50OworcHJvdGVjdGVkOgorCQkJCQlTb2NrZXQoKTsKK3B1YmxpYzoKKwl2aXJ0dWFsIGludAliaW5kKHZvaWQgKiBuYW1lLCBpbnQgbmFtZWxlbik7CisJdmlydHVhbCBpbnQgY29ubmVjdCh2b2lkICogYWRkcmVzcywgaW50IGFkZHJsZW4pOworCXZpcnR1YWwgaW50IGxpc3RlbihpbnQgcWxlbik7CisJdmlydHVhbCBTb2NrZXQgKiBhY2NlcHQodm9pZCAqIGFkZHJlc3MsIGludCAqIGFkZHJsZW4pOworCXZpcnR1YWwgaW50CXJlYWQodm9pZCAqIGJ1ZmZlciwgaW50IGJ1Zmxlbik7CisJdmlydHVhbCBpbnQgd3JpdGUodm9pZCAqIGJ1ZmZlciwgaW50IGJ1Zmxlbik7CisJdmlydHVhbCBpbnQgcmVjdmZyb20odm9pZCAqIGJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGZsYWdzLCB2b2lkICogZnJvbSwgaW50ICogZnJvbWxlbik7CisJdmlydHVhbCBpbnQgc2VuZHRvKHZvaWQgKiBidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncywgdm9pZCAqIHRvLCBpbnQgdG9sZW4pOworCXZpcnR1YWwgaW50IGdldHNvY2tuYW1lKHZvaWQgKiBuYW1lLCBpbnQgKiBuYW1lbGVuKTsKKwl2aXJ0dWFsIGludCBnZXRwZWVybmFtZSh2b2lkICogbmFtZSwgaW50ICogbmFtZWxlbik7CisJdmlydHVhbCBpbnQgZ2V0c29ja29wdChpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkICpvcHR2YWwsIGludCAqIG9wdGxlbik7CisJdmlydHVhbCBpbnQgc2V0c29ja29wdChpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkICpvcHR2YWwsIGludCBvcHRsZW4pOworCXZpcnR1YWwgaW50CWZjbnRsKHVuc2lnbmVkIGludCBjbWQsIGludCBhcmcpOworCXZpcnR1YWwgaW50CWlvY3RsKHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICphcmdwKTsKKwl2aXJ0dWFsIGludAlmc3RhdChzdHJ1Y3Qgc3RhdCAqIGJ1Zik7CisJdmlydHVhbCBsb25nIGxzZWVrKGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKwl2aXJ0dWFsIGludCBmdHJ1bmNhdGUobG9uZyBvZmZzZXQpOworCXZpcnR1YWwgaW50CWlzYXR0eSgpOworCXZpcnR1YWwgaW50IHNodXRkb3duKGludCBob3cpOworCXZpcnR1YWwgdm9pZCBwcmVfc2VsZWN0KEJvb2xlYW4gd2FudFJlYWQsIEJvb2xlYW4gd2FudFdyaXRlLCBCb29sZWFuIHdhbnRFeGNlcHQpOworCXZpcnR1YWwgaW50IHNlbGVjdChCb29sZWFuICogY2FuUmVhZCwgQm9vbGVhbiAqIGNhbldyaXRlLCBCb29sZWFuICogZXhjZXB0aW9uKTsKKwl2aXJ0dWFsIHZvaWQgcG9zdF9zZWxlY3QoQm9vbGVhbiB3YW50UmVhZCwgQm9vbGVhbiB3YW50V3JpdGUsIEJvb2xlYW4gd2FudEV4Y2VwdCk7CisJdmlydHVhbCAJCX5Tb2NrZXQoKTsKKwkKKwl2b2lkIG9wZXJhdG9yKysoKQl7CSsrcmVmQ291bnQ7CQkJCQkJCX0KKwl2b2lkIG9wZXJhdG9yLS0oKQl7CWlmICghLS1yZWZDb3VudCkgZGVsZXRlIHRoaXM7CX0KK307CisKKworI2lmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKK2NsYXNzIFNvY2tldERvbWFpbiB7CisJc3RhdGljIFNvY2tldERvbWFpbiAqCQlkb21haW5zW0dVU0lfTUFYX0RPTUFJTl07CisJc3RhdGljIFByb2Nlc3NTZXJpYWxOdW1iZXIJcHJvY2VzczsKK3Byb3RlY3RlZDoKKwlTb2NrZXREb21haW4oaW50IGRvbWFpbik7CisJdmlydHVhbCB+U29ja2V0RG9tYWluKCk7CitwdWJsaWM6CisJaW5saW5lIHN0YXRpYyBTb2NrZXREb21haW4gKglEb21haW4oaW50IGRvbWFpbik7CisJc3RhdGljIHZvaWQgUmVhZHkoKTsKKwkKKwkvLyBPcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcKKwkKKwl2aXJ0dWFsIFNvY2tldCAqIHNvY2tldChpbnQgdHlwZSwgc2hvcnQgcHJvdG9jb2wpOworCQorCS8vIE9wdGlvbmFsbHkgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZworCQorCXZpcnR1YWwgaW50IHNvY2tldHBhaXIoaW50IHR5cGUsIHNob3J0IHByb3RvY29sLCBTb2NrZXQgKiBzb2NrZXRzW10pOworCQorCS8vIE9wdGlvbmFsbHkgZGVmaW5lIHRoZSBmb2xsb3dpbmcKKwkKKwl2aXJ0dWFsIGludCBjaG9vc2UoCisJCQkJCQlpbnQgCQl0eXBlLCAKKwkJCQkJCWNoYXIgKiAJcHJvbXB0LCAKKwkJCQkJCXZvaWQgKiAJY29uc3RyYWludCwJCQorCQkJCQkJaW50IAkJZmxhZ3MsCisgCQkJCQkJdm9pZCAqIAluYW1lLCAKKwkJCQkJCWludCAqIAluYW1lbGVuKTsKKwkKKwkvLyBOZXZlciBvdmVycmlkZSB0aGUgZm9sbG93aW5nCisJCisJdm9pZCBEb250U3RyaXAoKTsKK307CisKK2NsYXNzIFNvY2tldFRhYmxlIHsKKwlTb2NrZXQgKglzb2NrZXRzW0dVU0lfTUFYX0ZEXTsKKwlCb29sZWFuCW5lZWRzQ29uc29sZTsKK3B1YmxpYzoKKwlTb2NrZXRUYWJsZSgpOworCX5Tb2NrZXRUYWJsZSgpOworCQorCXZvaWQJCUluaXRDb25zb2xlKCk7CisJaW50CQlJbnN0YWxsKFNvY2tldCAqIHNvY2ssIGludCBzdGFydCA9IDApOworCWludAkJUmVtb3ZlKGludCBmZCk7CisJU29ja2V0ICogb3BlcmF0b3JbXShpbnQgZmQpOworfTsKKworc3RydWN0IEdVU0lTdWZmaXggeworCWNoYXIgCQlzdWZmaXhbNF07CisJT1NUeXBlCXN1ZmZUeXBlOworCU9TVHlwZQlzdWZmQ3JlYXRvcjsKK307CisKKyNpZiBQUkFHTUFfQUxJR05fU1VQUE9SVEVECisjcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCisjZW5kaWYKKworLy8KKy8vIEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkgbm90IHRvIHJlbHkgb24gYml0IGZpZWxkIGFsaWdubWVudHMKKy8vCisKK3N0cnVjdCBHVVNJQ29uZmlnUnNyYyB7CisJT1NUeXBlCQkJZGVmYXVsdFR5cGU7CisJT1NUeXBlCQkJZGVmYXVsdENyZWF0b3I7CisJCisJY2hhcgkJCQlhdXRvU3BpbjsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCQorCU9TVHlwZQkJCXZlcnNpb247CisJc2hvcnQJCQkJbnVtU3VmZmljZXM7CisJR1VTSVN1ZmZpeCAJCXN1ZmZpY2VzWzFdOworfTsKKworI2lmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKK3N0cnVjdCBHVVNJQ29uZmlndXJhdGlvbiB7CisJT1NUeXBlCQkJZGVmYXVsdFR5cGU7CisJT1NUeXBlCQkJZGVmYXVsdENyZWF0b3I7CisJCisJY2hhcgkJCQlhdXRvU3BpbjsKKwkKKwlCb29sZWFuCSAJCW5vQ2hkaXI7CQkvLyBTZXQgY3VycmVudCBkaXJlY3Rvcnkgd2l0aG91dCBjaGRpcigpCisJQm9vbGVhbiAJCQlhY2N1clN0YXQ7CS8vIFJldHVybiAjIG9mIHN1YmRpcmVjdG9yaWVzICsgMiBpbiBzdF9ubGluaworCUJvb2xlYW4JIAkJaGFzQ29uc29sZTsJLy8gRG8gd2UgaGF2ZSBvdXIgb3duIGNvbnNvbGUgPworCUJvb2xlYW4JCQlub0F1dG9Jbml0R3JhZjsJLy8gTmV2ZXIgYXV0b21hdGljYWxseSBkbyBJbml0R3JhZgorCUJvb2xlYW4JCQlzaGFyZWRPcGVuOwkvLyBPcGVuIGZpbGVzIHdpdGggc2hhcmVkIHBlcm1pc3Npb25zCisJQm9vbGVhbgkJCXNpZ1BpcGU7CQkvLyByYWlzZSBTSUdQSVBFIG9uIHdyaXRlIHRvIGNsb3NlZCBzb2NrZXQKKwlCb29sZWFuCQkJbm9BcHBsZUV2ZW50czsgLy8gRG9uJ3Qgc29saWNpdCBBcHBsZUV2ZW50cyBmb3IgTVBXIHRvb2xzCisJQm9vbGVhbgkJCWRlbGF5Q29uc29sZTsJLy8gRG8gbm90IG9wZW4gY29uc29sZSB1bnRpbCBuZWVkZWQKKwkKKwlPU1R5cGUJCQl2ZXJzaW9uOworCXNob3J0CQkJCW51bVN1ZmZpY2VzOworCUdVU0lTdWZmaXggKglzdWZmaWNlczsKKwkKKwlHVVNJQ29uZmlndXJhdGlvbigpOworCXZvaWQgR1VTSUxvYWRDb25maWd1cmF0aW9uKEhhbmRsZSBjb25maWcpOworCQorCXZvaWQgU2V0RGVmYXVsdEZUeXBlKGNvbnN0IFRGaWxlU3BlYyAmIG5hbWUpIGNvbnN0OworCXZvaWQgRG9BdXRvU3BpbigpIGNvbnN0OworCXZvaWQgQXV0b0luaXRHcmFmKCkJY29uc3QgewlpZiAoIW5vQXV0b0luaXRHcmFmKSBEb0F1dG9Jbml0R3JhZigpOwl9CisJdm9pZCBEb0F1dG9Jbml0R3JhZigpIGNvbnN0OworCUJvb2xlYW4gRGVsYXlDb25zb2xlKCkgY29uc3Q7Citwcml2YXRlOgorCXN0YXRpYyBCb29sZWFuIGZpcnN0VGltZTsKKwlzdGF0aWMgc2hvcnQJd2U7Cit9OworCitleHRlcm4gR1VTSUNvbmZpZ3VyYXRpb24JR1VTSUNvbmZpZzsKK2V4dGVybiBTb2NrZXRUYWJsZQkJCQkJU29ja2V0czsKKwordHlwZWRlZiBwYXNjYWwgT1NFcnIgKCpPU0VyckluaXRpYWxpemVyKSgpOwordHlwZWRlZiBwYXNjYWwgdm9pZCAgKCp2b2lkSW5pdGlhbGl6ZXIpKCk7CisKK2NsYXNzIEZlYXR1cmUgeworCUJvb2xlYW4JZ29vZDsKK3B1YmxpYzoKKwlGZWF0dXJlKHVuc2lnbmVkIHNob3J0IHRyYXBOdW0sIFRyYXBUeXBlIHRUeXApOworCUZlYXR1cmUoT1NUeXBlIHR5cGUsIGxvbmcgdmFsdWUpOworCUZlYXR1cmUoT1NUeXBlIHR5cGUsIGxvbmcgbWFzaywgbG9uZyB2YWx1ZSk7CisJRmVhdHVyZShjb25zdCBGZWF0dXJlICYgcHJlY29uZGl0aW9uLCBPU0VyckluaXRpYWxpemVyIGluaXQpOworCUZlYXR1cmUoT1NFcnJJbml0aWFsaXplciBpbml0KTsKKwlGZWF0dXJlKGNvbnN0IEZlYXR1cmUgJiBwcmVjb25kaXRpb24sIHZvaWRJbml0aWFsaXplciBpbml0KTsKKwlGZWF0dXJlKHZvaWRJbml0aWFsaXplciBpbml0KTsKKwlGZWF0dXJlKGNvbnN0IEZlYXR1cmUgJiBjb25kMSwgY29uc3QgRmVhdHVyZSAmIGNvbmQyKTsKKworCW9wZXJhdG9yIHZvaWQqKCkgY29uc3QgewlyZXR1cm4gKHZvaWQgKikgZ29vZDsJfQorfTsKKworZXh0ZXJuIEZlYXR1cmUgaGFzTWFrZUZTU3BlYzsKK2V4dGVybiBGZWF0dXJlIGhhc0FsaWFzOworZXh0ZXJuIEZlYXR1cmUgaGFzTmV3U0Y7CitleHRlcm4gRmVhdHVyZSBoYXNQcm9jZXNzTWdyOworZXh0ZXJuIEZlYXR1cmUgaGFzQ1JNOworZXh0ZXJuIEZlYXR1cmUgaGFzQ1RCOworZXh0ZXJuIEZlYXR1cmUgaGFzU3RkTkJQOworZXh0ZXJuIEZlYXR1cmUgaGFzQ007CitleHRlcm4gRmVhdHVyZSBoYXNGVDsKK2V4dGVybiBGZWF0dXJlIGhhc1RNOworZXh0ZXJuIEZlYXR1cmUJaGFzUFBDOworZXh0ZXJuIEZlYXR1cmUgaGFzUmV2aXNlZFRpbWVNZ3I7CisKK2NsYXNzIFNjYXR0R2F0aAl7CisJSGFuZGxlCQkJc2NyYXRjaDsKK3Byb3RlY3RlZDoKKwl2b2lkICoJCQlidWY7CisJaW50CQkJCQkJbGVuOworCWludAkJCQkJCWNvdW50OworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqCWlvOworCisJU2NhdHRHYXRoKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY250KTsKKwl2aXJ0dWFsIH5TY2F0dEdhdGgoKTsKK3B1YmxpYzoKKwl2b2lkICoJCQlidWZmZXIoKQkJCXsJcmV0dXJuIGJ1ZjsJCQl9CisJaW50CQkJCWJ1ZmxlbigpCQkJewlyZXR1cm4gbGVuOwkJCX0KKwlpbnQJCQkJbGVuZ3RoKGludCBsKQl7CXJldHVybiBsZW4gPSBsOwl9CisJb3BlcmF0b3Igdm9pZCAqKCkJCQkJCXsJcmV0dXJuIGJ1ZjsJCQl9Cit9OworCitjbGFzcyBTY2F0dGVyZXIgOiBwdWJsaWMgU2NhdHRHYXRoIHsKK3B1YmxpYzoKKwlTY2F0dGVyZXIoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBjb3VudCk7CisJdmlydHVhbCB+U2NhdHRlcmVyKCk7Cit9OworCitjbGFzcyBHYXRoZXJlciA6IHB1YmxpYyBTY2F0dEdhdGggeworcHVibGljOgorCUdhdGhlcmVyKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpOworCXZpcnR1YWwgfkdhdGhlcmVyKCk7Cit9OworCit0eXBlZGVmIHBhc2NhbCB2b2lkICgqRGVmZXJyZWQpKHZvaWQgKik7CisKK2NsYXNzIFJpbmdCdWZmZXIgeworCS8vIFZhbGlkIGJ5dGVzIGFyZSBiZXR3ZWVuIGNvbnN1bWUgYW5kIHByb2R1Y2UKKwkvLyBGcmVlIGJ5dGVzIGFyZSBiZXR3ZWVuIHByb2R1Y2UgYW5kIGNvbnN1bWUKKwkvLyBieXRlcyBiZXR3ZWVuIGVuZGJ1Zi1zcGFyZSBhbmQgZW5kYnVmIGFyZSBuZWl0aGVyCisJUHRyCQlidWZmZXI7CisJUHRyCQllbmRidWY7CisJUHRyIAkJY29uc3VtZTsKKwlQdHIJCXByb2R1Y2U7CisJdV9zaG9ydAlmcmVlOworCXVfc2hvcnQJdmFsaWQ7CisJdV9zaG9ydAlzcGFyZTsKKwlCb29sZWFuCWxvY2s7CisJRGVmZXJyZWQJZGVmcHJvYzsKKwl2b2lkICoJYXJnOworCQorcHVibGljOgorCQkJCVJpbmdCdWZmZXIodV9zaG9ydCBidWZzaXopOworCQkJCX5SaW5nQnVmZmVyKCk7CisJCisJUHRyCQlQcm9kdWNlcihsb25nICYgbGVuKTsJCQkvLwlGaW5kIGNvbnRpbnVvdXMgbWVtb3J5IGZvciBwcm9kdWNlcgorCVB0cgkJQ29uc3VtZXIobG9uZyAmIGxlbik7CQkJLy8JRmluZCBjb250aW51b3VzIG1lbW9yeSBmb3IgY29uc3VtZXIKKwl2b2lkCQlWYWxpZGF0ZShsb25nIGxlbik7CQkJCS8vIFZhbGlkYXRlIHRoaXMsIHVuYWxsb2NhdGUgcmVzdAorCXZvaWQgCQlJbnZhbGlkYXRlKGxvbmcgbGVuKTsKKwl2b2lkCQlQcm9kdWNlKFB0ciBmcm9tLCBsb25nICYgbGVuKTsvLwlBbGxvY2F0ZSwgY29weSAmIHZhbGlkYXRlCisJdm9pZAkJQ29uc3VtZShQdHIgdG8sIGxvbmcgJiBsZW4pOwkvLyBDb3B5ICYgaW52YWxpZGF0ZQorCQorCWxvbmcJCUZyZWUoKQkJCQkJCQkJeyByZXR1cm4gZnJlZTsJCQkJCQkJCQl9CQkKKwlsb25nCQlWYWxpZCgpCQkJCQkJCQl7IHJldHVybiB2YWxpZDsJCQkJCQkJCX0KKwkKKwl2b2lkIAkJRGVmZXIoKQkJCQkJCQkJeyBsb2NrID0gdHJ1ZTsJCQkJCQkJCQl9CisJdm9pZCAJCVVuZGVmZXIoKQkJCQkJCQl7IGxvY2sgPSBmYWxzZTsgaWYgKGRlZnByb2MpIGRlZnByb2MoYXJnKTt9CisJQm9vbGVhbglMb2NrZWQoKQkJCQkJCQkJeyByZXR1cm4gbG9jazsJCQkJCQkJCQl9CisJdm9pZAkJTGF0ZXIoRGVmZXJyZWQgZGVmLCB2b2lkICogYXIpeyBkZWZwcm9jID0gZGVmOyBhcmcgPSBhcjsJCQkJCX0KKwkKKwlvcGVyYXRvciB2b2lkICooKQkJCQkJCQkJeyByZXR1cm4gYnVmZmVyOwkJCQkJCQkJfQorfTsKKworQm9vbGVhbiBHVVNJSW50ZXJydXB0KCk7CisKK0Jvb2xlYW4gQ29weUljb25GYW1pbHkoc2hvcnQgc3JjUmVzRmlsZSwgc2hvcnQgc3JjSUQsIHNob3J0IGRzdFJlc0ZpbGUsIHNob3J0IGRzdElEKTsKKworcGFzY2FsIE9TRXJyIFBQQ0luaXRfUCgpOworCitPU0VyciBBcHBsZVRhbGtJZGVudGl0eShzaG9ydCAmIG5ldCwgc2hvcnQgJiBub2RlKTsKKwordm9pZCBDb3B5QzJQU3RyKGNvbnN0IGNoYXIgKiBjc3RyLCBTdHJpbmdQdHIgcHN0cik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJLnIgYi9NYWMvR1VTSS1tb2RzL2ludG8tc3JjL0dVU0kucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE3ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJLnIKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1Byb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgVW5pZmllZCBTb2NrZXQgSW50ZXJmYWNlCitGaWxlCQk6CUdVU0kucgkJCS0JSW5jbHVkZSB0aGlzCitBdXRob3IJOglNYXR0aGlhcyBOZWVyYWNoZXIKK0xhbmd1YWdlCToJTVBXIFJleiAzLjAKKworJExvZyQKK1JldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozNyAgamFjaworUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KKworUmV2aXNpb24gMS4zICAxOTk0LzEyLzMwICAxOTozMzozNCAgbmVlcmkKK0VubGFyZ2VuZWQgbWVzc2FnZSBib3ggZm9yIHNlbGVjdCBmb2xkZXIgZGlhbG9nLgorCitSZXZpc2lvbiAxLjIgIDE5OTQvMDgvMTAgIDAwOjM0OjE4ICBuZWVyaQorU2FuaXRpemVkIGZvciB1bml2ZXJzYWwgaGVhZGVycy4KKworUmV2aXNpb24gMS4xICAxOTk0LzAyLzI1ICAwMjoxMjowNCAgbmVlcmkKK0luaXRpYWwgcmV2aXNpb24KKworUmV2aXNpb24gMC41ICAxOTkzLzA1LzIxICAwMDowMDowMCAgbmVlcmkKK3N1ZmZpeGVzCisKK1JldmlzaW9uIDAuNCAgMTk5My8wMS8zMSAgMDA6MDA6MDAgIG5lZXJpCitEYWVtb24KKworUmV2aXNpb24gMC4zICAxOTkzLzAxLzAzICAwMDowMDowMCAgbmVlcmkKK2F1dG9TcGluCisKK1JldmlzaW9uIDAuMiAgMTk5Mi8wOS8yNCAgMDA6MDA6MDAgIG5lZXJpCitEb24ndCBpbmNsdWRlIENLSUQsIGNyZWF0ZSBHVVNJUnNyY19QLmgKKworUmV2aXNpb24gMC4xICAxOTkyLzA3LzEzICAwMDowMDowMCAgbmVlcmkKKy5yc3JjCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlR5cGVzLnIiCisjaW5jbHVkZSAiR1VTSVJzcmNfUC5oIgorCitpbmNsdWRlICJHVVNJLnJzcmMiIG5vdCAnY2tpZCc7CisKKy8qIERlZmluZSBhIHJlc291cmNlICgnR1WFSScsIEdVU0lSc3JjSUQpIHRvIG92ZXJyaWRlIEdVU0kgZGVmYXVsdHMgCQkKKwlUbyBhdm9pZCBoYXZpbmcgdG8gY2hhbmdlIHRoZSBSZXogZmlsZSBldmVyeSB0aW1lIEkgaW50cm9kdWNlIGFub3RoZXIKKwlmZWF0dXJlLCB0aGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIEdVU0lfUFJFRl9WRVJTSU9OIGJ5IGRlZmF1bHQga2VlcHMKKwlldmVyeXRoaW5nIGNvbXBhdGlibGUgd2l0aCB2ZXJzaW9uIDEuMC4yLiBKdXN0IGRlZmluZSBHVVNJX1BSRUZfVkVSU0lPTgorCXRvIGJlIHRoZSB2ZXJzaW9uIHlvdSB3YW50IHRvIHVzZS4KKyovCisKKyNpZm5kZWYgR1VTSV9QUkVGX1ZFUlNJT04KKyNkZWZpbmUgR1VTSV9QUkVGX1ZFUlNJT04gJzAxMDInCisjZW5kaWYKKwordHlwZSAnR1WFSScgeworCWxpdGVyYWwgbG9uZ2ludAl0ZXh0IAk9CSdURVhUJzsJLyogVHlwZSBmb3IgY3JlYXQnZWQgZmlsZXMgCQkJCSovCisJbGl0ZXJhbCBsb25naW50CW1wdwk9CSdNUFMgJzsJLyogQ3JlYXRvciBmb3IgY3JlYXQnZWQgZmlsZXMgIAkJCSovCisJYnl0ZSAJCW5vQXV0b1NwaW4sIGF1dG9TcGluOwkJLyogQXV0b21hdGljYWxseSBzcGluIGN1cnNvciA/CQkJKi8KKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+ICcwMTAyJworCWJvb2xlYW4gCXVzZUNoZGlyLCBkb250VXNlQ2hkaXI7CQkvKiBVc2UgY2hkaXIoKSA/CQkJCQkJCSovCisJYm9vbGVhbglhcHByb3hTdGF0LCBhY2N1cmF0ZVN0YXQ7CS8qIHN0YXRidWYuc3RfbmxpbmsgPSAjIG9mIHN1YmRpcmVjdG9yaWVzID8gKi8KKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE4MScKKwlib29sZWFuCW5vRGVsYXlDb25zb2xlLCBEZWxheUNvbnNvbGU7CS8qIERlbGF5IG9wZW5pbmcgY29uc29sZSB3aW5kb3cgdW50aWwgbmVlZGVkPyAqLworCWZpbGwJCWJpdFsxXTsKKyNlbHNlCisJYm9vbGVhbglub1RDUERhZW1vbiwgaXNUQ1BEYWVtb247CS8qIEluZXRkIGNsaWVudCA/CQkJCQkJCSovCisJYm9vbGVhbglub1VEUERhZW1vbiwgaXNVRFBEYWVtb247CisjZW5kaWYKKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE1MCcKKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE4MScKKwlib29sZWFuCXdhbnRBcHBsZUV2ZW50cywgbm9BcHBsZUV2ZW50czsgLyogQWx3YXlzIHNvbGljaXQgQXBwbGVFdmVudHMgKi8KKyNlbHNlCisJYm9vbGVhbglub0NvbnNvbGUsIGhhc0NvbnNvbGU7CQkvKiBBcmUgd2UgcHJvdmlkaW5nIG91ciBvd24gZGV2OmNvbnNvbGUgPyAoT2Jzb2xldGUpICovCisjZW5kaWYKKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE4MCcKKwlib29sZWFuCWF1dG9Jbml0R3JhZiwgbm9BdXRvSW5pdEdyYWY7CS8qIEF1dG9tYXRpY2FsbHkgZG8gSW5pdEdyYWYgPyAqLworCWJvb2xlYW4JZXhjbHVzaXZlT3Blbiwgc2hhcmVkT3BlbjsJLyogU2hhcmVkIG9wZW4oKSA/IAkJCQkJCQkqLworCWJvb2xlYW4Jbm9TaWdQaXBlLCBzaWdQaXBlOwkJCS8qIHJhaXNlIFNJR1BJUEUgb24gd3JpdGUgdG8gY2xvc2VkIFBJUEUgKi8KKyNlbHNlCisJZmlsbCAJCWJpdFszXTsKKyNlbmRpZgorI2Vsc2UKKwlmaWxsIAkJYml0WzRdOworI2VuZGlmCisJbGl0ZXJhbCBsb25naW50ID0gR1VTSV9QUkVGX1ZFUlNJT047CisjaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxMjAnCisJaW50ZWdlciA9ICQkQ291bnRvZihTdWZmaXhBcnJheSk7CisJd2lkZSBhcnJheSBTdWZmaXhBcnJheSB7CisJCQlsaXRlcmFsIGxvbmdpbnQ7CQkJCQkvKiBTdWZmaXggb2YgZmlsZSAqLworCQkJbGl0ZXJhbCBsb25naW50OwkJCQkJLyogVHlwZSBmb3IgZmlsZSAqLworCQkJbGl0ZXJhbCBsb25naW50OwkJCQkJLyogQ3JlYXRvciBmb3IgZmlsZSAqLworCX07CisjZW5kaWYKKyNlbmRpZgorfTsKKwordHlwZSAnVE1QTCcgeworCXdpZGUgYXJyYXkgeworCQlwc3RyaW5nOworCQlsaXRlcmFsIGxvbmdpbnQ7CisJfTsKK307CisKK3Jlc291cmNlICdUTVBMJyAoR1VTSVJzcmNJRCwgIkdVhUkiKSB7CisJeworCQkiVHlwZSBvZiBjcmVhdGVkIGZpbGVzIiwJCSdUTkFNJywKKwkJIkNyZWF0b3Igb2YgY3JlYXRlZCBmaWxlcyIsCSdUTkFNJywKKwkJIkF1dG9tYXRpY2FsbHkgc3BpbiBjdXJzb3IiLCAJJ0RCWVQnLAorI2lmIEdVU0lfUFJFRl9WRVJTSU9OID4gJzAxMDInCisJCSJOb3QgdXNpbmcgY2hkaXIoKSIsCQkJCSdCQklUJywKKwkJIkFjY3VyYXRlIHN0YXQoKSIsCQkJCSdCQklUJywKKwkJIlRDUCBkYWVtb24iLAkJCQkJCSdCQklUJywKKwkJIlVEUCBkYWVtb24iLAkJCQkJCSdCQklUJywKKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE1MCcKKwkJIk93biBDb25zb2xlIiwJCQkJCQknQkJJVCcsCisjZWxzZQorCQkiUmVzZXJ2ZWQiLAkJCQkJCQknQkJJVCcsCisjZW5kaWYKKyNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+PSAnMDE4MCcKKwkJIkRvbid0IGluaXRpYWxpemUgUXVpY2tEcmF3IiwJJ0JCSVQnLAorCQkiT3BlbiBmaWxlcyBzaGFyZWQiLAkJCQknQkJJVCcsCisJCSJSYWlzZSBTSUdQSVBFIiwJCQkJCSdCQklUJywKKyNlbHNlCisJCSJSZXNlcnZlZCIsCQkJCQkJCSdCQklUJywKKwkJIlJlc2VydmVkIiwJCQkJCQkJJ0JCSVQnLAorCQkiUmVzZXJ2ZWQiLAkJCQkJCQknQkJJVCcsCisjZW5kaWYKKwkJIlZlcnNpb24gKGRvbid0IGNoYW5nZSkiLAkJJ1ROQU0nLAkJCisjaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxMjAnCisJCSJOdW1TdWZmaWNlcyIsCQkJCQkJJ09DTlQnLAorCQkiKioqKioiLAkJCQkJCQkJJ0xTVEMnLAorCQkiU3VmZml4IiwJCQkJCQkJJ1ROQU0nLAorCQkiVHlwZSBmb3Igc3VmZml4IiwJCQkJJ1ROQU0nLAorCQkiQ3JlYXRvciBmb3Igc3VmZml4IiwJCQknVE5BTScsCisJCSIqKioqKiIsCQkJCQkJCQknTFNURScsCisjZW5kaWYKKyNlbmRpZgkJCisJfQorfTsKKworcmVzb3VyY2UgJ0RMT0cnIChHVVNJUnNyY0lELCAiR2V0IERpcmVjdG9yeSIpIHsKKwl7MCwgMCwgMjE3LCAzNDh9LCAKKwlkQm94UHJvYywgCisJaW52aXNpYmxlLCAKKwlub0dvQXdheSwgCisJMHgwLCAKKwkxMDI0MCwgCisJIiIsCisJYWxlcnRQb3NpdGlvbk1haW5TY3JlZW4KK307CisKK3Jlc291cmNlICdESVRMJyAoR1VTSVJzcmNJRCwgIkdldCBEaXJlY3RvcnkiKSB7CisJeworCQl7IDE0MiwgMjU2LCAgMTYwLCAzMzZ9LAlCdXR0b24JCXtlbmFibGVkLCJPcGVuIn0sCisJCXsxMTUyLCAgNTksIDEyMzIsICA3N30sCUJ1dHRvbgkJe2VuYWJsZWQsIkhpZGRlbiJ9LAorCQl7IDE5MywgMjU2LCAgMjExLCAzMzZ9LAlCdXR0b24JCXtlbmFibGVkLCJDYW5jZWwifSwKKwkJeyAgNDMsIDIzMiwgICA2MywgMzQ3fSwJVXNlckl0ZW0JCXtkaXNhYmxlZH0sCisJCXsgIDcyLCAyNTYsICAgOTAsIDMzNn0sCUJ1dHRvbgkJe2VuYWJsZWQsIkVqZWN0In0sCisJCXsgIDk3LCAyNTYsICAxMTUsIDMzNn0sCUJ1dHRvbgkJe2VuYWJsZWQsIkRyaXZlIn0sCisJCXsgIDQzLCAgMTIsICAxODksIDIzMH0sCVVzZXJJdGVtCQl7ZW5hYmxlZH0sCisJCXsgIDQzLCAyMjksICAxODksIDI0Nn0sCVVzZXJJdGVtCQl7ZW5hYmxlZH0sCisJCXsgMTI4LCAyNTIsICAxMjksIDM0MH0sCVVzZXJJdGVtCQl7ZGlzYWJsZWR9LAorCQl7MTA0NCwgIDIwLCAxMTQ1LCAxMTZ9LAlTdGF0aWNUZXh0CXtkaXNhYmxlZCwiIn0sCisJCXsgMTY3LCAyNTYsICAxODUsIDMzNn0sCUJ1dHRvbgkJe2VuYWJsZWQsIkRpcmVjdG9yeSJ9LAorCQl7ICAgMCwgIDMwLCAgIDE4LCAyMTV9LAlCdXR0b24JCXtlbmFibGVkLCJTZWxlY3QgQ3VycmVudCBEaXJlY3Rvcnk6In0sCisJCXsgMjAwLCAgMjAsIDExNDUsIDIyMn0sCVN0YXRpY1RleHQJe2Rpc2FibGVkLCJTZWxlY3QgYSBGb2xkZXIifQorCX0KK307CisKKwpkaWZmIC0tZ2l0IGEvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJRGlzcGF0Y2guY3AgYi9NYWMvR1VTSS1tb2RzL2ludG8tc3JjL0dVU0lEaXNwYXRjaC5jcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk0MWNiCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJRGlzcGF0Y2guY3AKQEAgLTAsMCArMSwxNDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQcm9qZWN0CToJR1VTSQkJCQktCUdyYW5kIFVuaWZpZWQgU29ja2V0IEludGVyZmFjZQorRmlsZQk6CUdVU0lEaXNwYXRjaC5jcC0JRGlzcGF0Y2ggY2FsbHMgdG8gdGhlaXIgY29ycmVjdCByZWNpcGllbnQKK0F1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgorTGFuZ3VhZ2U6CU1QVyBDL0MrKworCiskTG9nJAorUmV2aXNpb24gMS4xICAxOTk4LzA4LzE4IDE0OjUyOjM3ICBqYWNrCitQdXR0aW5nIFB5dGhvbi1zcGVjaWZpYyBHVVNJIG1vZGlmaWNhdGlvbnMgdW5kZXIgQ1ZTLgorCitSZXZpc2lvbiAxLjQgIDE5OTQvMTIvMzAgIDE5OjQ4OjA5ICBuZWVyaQorUmVtb3ZlICh0aGVvcmV0aWNhbCkgc3VwcG9ydCBmb3IgcHJlLVN5c3RlbSA2IHN5c3RlbXMuCitSZW1vdmUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgSU5FVGQuCitGaXggcHJvYmxlbXMgaW4gY29ubmVjdGlvbiB3aXRoIFJPTSBQb3dlclBDIGxpYnJhcnkuCitNb3ZlIG9wZW4oKSB0byBHVVNJRmlsZURpc3BhdGNoLmNwLgorU3VwcG9ydCBBRl9VTlNQRUMgZG9tYWlucy4KK01vcmUgd29yayBvbiBzcGlubmluZyBwZXJmb3JtYW5jZS4KKworUmV2aXNpb24gMS4zICAxOTk0LzA4LzEwICAwMDozMDozMCAgbmVlcmkKK1Nhbml0aXplZCBmb3IgdW5pdmVyc2FsIGhlYWRlcnMuCitQcmV2ZW50IG92ZXJseSBmYXN0IHNwaW5uaW5nLgorCitSZXZpc2lvbiAxLjIgIDE5OTQvMDUvMDEgIDIzOjQ3OjM0ICBuZWVyaQorRXh0ZW5kIGZmbHVzaCgpIGtsdWRnZS4KK0RlZmluZSBfbGFzdGJ1ZiBmb3IgTVBXIDMuMiBjb21wYXRpYmlsaXR5LgorCitSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMjUgIDAyOjI4OjM2ICBuZWVyaQorSW5pdGlhbCByZXZpc2lvbgorCitSZXZpc2lvbiAwLjI3ICAxOTkzLzExLzI0ICAwMDowMDowMCAgbmVlcmkKK0ZsdXNoIHN0ZGlvIGJlZm9yZSBjbG9zaW5nCisKK1JldmlzaW9uIDAuMjYgIDE5OTMvMTEvMjIgIDAwOjAwOjAwICBuZWVyaQorRXh0ZW5kIHR3byB0aW1lIGxvc2VyIGZvciBFQkFERgorCitSZXZpc2lvbiAwLjI1ICAxOTkzLzExLzEyICAwMDowMDowMCAgbmVlcmkKK1R3byB0aW1lIGxvc2VyIHdvcmthcm91bmQgZm9yIGZsdXNoIGJ1ZworCitSZXZpc2lvbiAwLjI0ICAxOTkzLzA2LzI3ICAwMDowMDowMCAgbmVlcmkKK3twcmUscG9zdH1fc2VsZWN0CisKK1JldmlzaW9uIDAuMjMgIDE5OTMvMDYvMjcgIDAwOjAwOjAwICBuZWVyaQorZnRydW5jYXRlCisKK1JldmlzaW9uIDAuMjIgIDE5OTMvMDYvMjAgIDAwOjAwOjAwICBuZWVyaQorRnVydGhlciBzdWJ0bGV0aWVzIGluIGNvbnNvbGUgaGFuZGxpbmcgCisKK1JldmlzaW9uIDAuMjEgIDE5OTMvMDUvMjEgIDAwOjAwOjAwICBuZWVyaQorU3VmZml4ZXMKKworUmV2aXNpb24gMC4yMCAgMTk5My8wNS8xNSAgMDA6MDA6MDAgIG5lZXJpCitUcnkgdG8ga2VlcCBlcnJubyBhbHdheXMgc2V0IG9uIGVycm9yIHJldHVybnMKKworUmV2aXNpb24gMC4xOSAgMTk5My8wNS8xMyAgMDA6MDA6MDAgIG5lZXJpCitMaW1pdCBTZWFyY2ggZm9yIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UgdG8gYXBwbGljYXRpb24KKworUmV2aXNpb24gMC4xOCAgMTk5My8wMS8zMSAgMDA6MDA6MDAgIG5lZXJpCitJbnRyb2R1Y2luZyBkYWVtb25zIChwbGVhc2VkIHRvIG1lZXQgeW91LCBob3BlIHlvdSBndWVzcyBteSBuYW1lKQorCitSZXZpc2lvbiAwLjE3ICAxOTkzLzAxLzE3ICAwMDowMDowMCAgbmVlcmkKK0JlIG1vcmUgY2FyZWZ1bCBhYm91dCB1c2VyIGFib3J0cy4KKworUmV2aXNpb24gMC4xNiAgMTk5My8wMS8wMyAgMDA6MDA6MDAgIG5lZXJpCitHVVNJQ29uZmlndXJhdGlvbgorCitSZXZpc2lvbiAwLjE1ICAxOTkyLzExLzI1ICAwMDowMDowMCAgbmVlcmkKK1N0aWxsIHRyeWluZyB0byBnZXQgc3RhbmRhcmQgZGVzY3JpcHRvcnMgZm9yIHN0YW5kYWxvbmUgcHJvZ3JhbXMgcmlnaHQuIHNpZ2guCisKK1JldmlzaW9uIDAuMTQgIDE5OTIvMTAvMDUgIDAwOjAwOjAwICBuZWVyaQorU21hbGwgZml4IGluIGV2ZW50IGRpc3BhdGNoaW5nCisKK1JldmlzaW9uIDAuMTMgIDE5OTIvMDkvMTIgIDAwOjAwOjAwICBuZWVyaQorZ2V0ZHRhYmxlc2l6ZSgpCisKK1JldmlzaW9uIDAuMTIgIDE5OTIvMDgvMzAgIDAwOjAwOjAwICBuZWVyaQorTW92ZSBoYXNQUEMgdG8gR1VTSVBQQy5jcCwgQXBwbGVUYWxrSWRlbnRpdHkKKworUmV2aXNpb24gMC4xMSAgMTk5Mi8wOC8wNSAgMDA6MDA6MDAgIG5lZXJpCitDaGFuZ2UgdGhlIHdheSBzdGFuZGFyZCBJL08gY2hhbm5lbHMgYXJlIG9wZW5lZAorCitSZXZpc2lvbiAwLjEwICAxOTkyLzA4LzAzICAwMDowMDowMCAgbmVlcmkKK01vdmUgU2NhdHRlci9HYXRoZXIgdG8gR1VTSUJ1ZmZlci5jcAorCitSZXZpc2lvbiAwLjkgIDE5OTIvMDcvMzAgIDAwOjAwOjAwICBuZWVyaQorRmVhdHVyZXMgd2l0aCBpbml0aWFsaXplcnMKKworUmV2aXNpb24gMC44ICAxOTkyLzA3LzEzICAwMDowMDowMCAgbmVlcmkKK2hhc1Byb2Nlc3NNZ3IKKworUmV2aXNpb24gMC43ICAxOTkyLzA2LzI3ICAwMDowMDowMCAgbmVlcmkKK2Nob29zZSgpLCBoYXNOZXdTRgorCitSZXZpc2lvbiAwLjYgIDE5OTIvMDYvMDYgIDAwOjAwOjAwICBuZWVyaQorRmVhdHVyZQorCitSZXZpc2lvbiAwLjUgIDE5OTIvMDQvMTkgIDAwOjAwOjAwICBuZWVyaQorQysrIFJld3JpdGUKKworUmV2aXNpb24gMC40ICAxOTkyLzA0LzE4ICAwMDowMDowMCAgbmVlcmkKK0NoYW5nZWQgcmVhZC93cml0ZS9zZW5kL3JlY3YgZGlzcGF0Y2hlcnMKKworUmV2aXNpb24gMC4zICAxOTkyLzA0LzE3ICAwMDowMDowMCAgbmVlcmkKK1NwaW4gcm91dGluZXMKKworUmV2aXNpb24gMC4yICAxOTkyLzA0LzE2ICAwMDowMDowMCAgbmVlcmkKK1VzZXIgaW50ZXJydXB0IHN0dWZmCisKK1JldmlzaW9uIDAuMSAgMTk5Mi8wMy8zMSAgMDA6MDA6MDAgIG5lZXJpCit1bml4IGRvbWFpbiBzb2NrZXQgY2FsbHMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiR1VTSUZpbGVfUC5oIgorI2luY2x1ZGUgIkdVU0lNUFdfUC5oIgorI2luY2x1ZGUgPFNldEptcC5oPgorI2luY2x1ZGUgPFNpZ25hbC5oPgorI2luY2x1ZGUgPEN1cnNvckN0bC5oPgorI2luY2x1ZGUgPFJlc291cmNlcy5oPgorI2luY2x1ZGUgPEV2ZW50cy5oPiAKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8RmluZGVyLmg+CisjaW5jbHVkZSA8U2NyaXB0Lmg+CisjaW5jbHVkZSA8RXZlbnRzLmg+CisjaW5jbHVkZSA8VHJhcHMuaD4KKyNpbmNsdWRlIDxDb21tUmVzb3VyY2VzLmg+CisjaW5jbHVkZSA8Q1RCVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8Q29ubmVjdGlvbnMuaD4KKyNpbmNsdWRlIDxGaWxlVHJhbnNmZXJzLmg+CisjaW5jbHVkZSA8VGVybWluYWxzLmg+CisjaW5jbHVkZSA8RVBQQy5oPgorI2luY2x1ZGUgPFBMU3RyaW5nRnVuY3MuaD4KKyNpbmNsdWRlIDxMb3dNZW0uaD4KKyNpbmNsdWRlIDxQcm9jZXNzZXMuaD4KKworI2lmIEdFTkVSQVRJTkdDRk0KKyNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisjZW5kaWYKKworI3ByYWdtYSBzZWdtZW50IEdVU0kKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHVVNJQ29uZmlndXJhdGlvbiBHVVNJQ29uZmlnOwkJLy8gQ2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSBkZWNsYXJhdGlvbnMKK1NvY2tldFRhYmxlCQkJCQlTb2NrZXRzOwkJCS8vIAlhbmQgeW91J2xsIHJlZ3JldCBpdCAoQVJNIKcxMi42LjEpCitHVVNJU3BpbkZuIAkJCQkJR1VTSVNwaW4gCT0gR1VTSURlZmF1bHRTcGluOworR1VTSUV4ZWNGbgkJCQkJR1VTSUV4ZWMJPSBHVVNJRGVmYXVsdEV4ZWM7CitHVVNJRlR5cGVGbgkJCQkJR1VTSUZUeXBlCT0gKEdVU0lGVHlwZUZuKTA7Citsb25nCQkJCQkJZ0dVU0lTcGVlZAk9IDE7CitzdGF0aWMgR1VTSUV2dEhhbmRsZXIgKglldnRIYW5kbGVyCT0gbmlsOworc3RhdGljIHNob3J0CQkJCWV2dE1hc2sJCT0gMDsKK3N0YXRpYyBpbnQJCQkJCWVycm9yU29jawk9IC0xOworc3RhdGljIGludAkJCQkJZXJyb3JUeXBlCT0gMDsKK3N0YXRpYyBpbnQJCQkJCWVycm9yQ291bnQJPSAwOworY29uc3QgaW50CQkJCQllcnJvck1heAkJPSAzOworQm9vbGVhbgkJCQkJCUNhdGNoU3RkSU8JPSBmYWxzZTsKKworRmVhdHVyZSAJaGFzTWFrZUZTU3BlYygKKwkJCQlnZXN0YWx0RlNBdHRyLAorCQkJCSgxPDxnZXN0YWx0SGFzRlNTcGVjQ2FsbHMpLAorCQkJCSgxPDxnZXN0YWx0SGFzRlNTcGVjQ2FsbHMpKTsKK0ZlYXR1cmUgCWhhc0FsaWFzKAorCQkJCWdlc3RhbHRBbGlhc01nckF0dHIsCisJCQkJKDE8PGdlc3RhbHRBbGlhc01nclByZXNlbnQpLAorCQkJCSgxPDxnZXN0YWx0QWxpYXNNZ3JQcmVzZW50KSk7CitGZWF0dXJlCWhhc05ld1NGKAorCQkJCWdlc3RhbHRTdGFuZGFyZEZpbGVBdHRyLAorCQkJCSgxPDxnZXN0YWx0U3RhbmRhcmRGaWxlNTgpLAorCQkJCSgxPDxnZXN0YWx0U3RhbmRhcmRGaWxlNTgpKTsKK0ZlYXR1cmUgCWhhc1Byb2Nlc3NNZ3IoCisJCQkJZ2VzdGFsdE9TQXR0ciwKKwkJCQkoMTw8Z2VzdGFsdExhdW5jaENvbnRyb2wpLAorCQkJCSgxPDxnZXN0YWx0TGF1bmNoQ29udHJvbCkpOworRmVhdHVyZSBoYXNDUk1fUCgKKwkJCQlnZXN0YWx0Q1JNQXR0ciwKKwkJCQkoMTw8Z2VzdGFsdENSTVByZXNlbnQpLAorCQkJCSgxPDxnZXN0YWx0Q1JNUHJlc2VudCkpOworRmVhdHVyZSBoYXNDUk0oaGFzQ1JNX1AsIEluaXRDUk0pOworRmVhdHVyZSBoYXNDVEIoaGFzQ1JNLCBJbml0Q1RCVXRpbGl0aWVzKTsKK0ZlYXR1cmUgaGFzU3RkTkJQX1AoCisJCQkJZ2VzdGFsdFN0ZE5CUEF0dHIsCisJCQkJKDE8PGdlc3RhbHRTdGROQlBQcmVzZW50KSwKKwkJCQkoMTw8Z2VzdGFsdFN0ZE5CUFByZXNlbnQpKTsKK0ZlYXR1cmUgaGFzU3RkTkJQKGhhc0NUQiwgaGFzU3RkTkJQX1ApOworRmVhdHVyZSBoYXNBcHBsZUV2ZW50cygKKwkJCQlnZXN0YWx0QXBwbGVFdmVudHNBdHRyLAorCQkJCSgxPDxnZXN0YWx0QXBwbGVFdmVudHNQcmVzZW50KSwKKwkJCQkoMTw8Z2VzdGFsdEFwcGxlRXZlbnRzUHJlc2VudCkpOworRmVhdHVyZSBoYXNSZXZpc2VkVGltZU1ncigKKwkJCWdlc3RhbHRUaW1lTWdyVmVyc2lvbiwKKwkJCTJMKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIHByb3BhZ2F0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEdVU0lfRElTUEFUQ0gKK2lubGluZQorI2VuZGlmCitpbnQgR1VTSV9lcnJvcihpbnQgZXJyKQoreworCWlmIChlcnIpCisJCWVycm5vID0JZXJyOworCisJcmV0dXJuIC0xOworfQorCisjaWZkZWYgR1VTSV9ESVNQQVRDSAoraW5saW5lCisjZW5kaWYKK3ZvaWQgKiBHVVNJX2Vycm9yX25pbChpbnQgZXJyKQoreworCWlmIChlcnIpCisJCWVycm5vID0JZXJyOworCisJcmV0dXJuIG5pbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEdVU0lDb25maWd1cmF0aW9uIG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdVU0lfRElTUEFUQ0gKKworQm9vbGVhbiAJR1VTSUNvbmZpZ3VyYXRpb246OmZpcnN0VGltZSA9IGZhbHNlOworc2hvcnQJCUdVU0lDb25maWd1cmF0aW9uOjp3ZTsKKwordm9pZCBHVVNJQ29uZmlndXJhdGlvbjo6R1VTSUxvYWRDb25maWd1cmF0aW9uKEhhbmRsZSBoKQoreworCXR5cGVkZWYgCUdVU0lDb25maWdSc3JjICoqCUdVU0lDb25mSGRsOwkJCisJR1VTSUNvbmZIZGwgY29uZmlnIAkJPQlHVVNJQ29uZkhkbChoKTsKKwlsb25nCQljb25mU2l6ZQk9CWNvbmZpZyA/IEdldEhhbmRsZVNpemUoSGFuZGxlKGNvbmZpZykpIDogMDsKKwkKKwlpZiAoY29uZlNpemUgPCA0IHx8ICEoZGVmYXVsdFR5cGUgPSAoKmNvbmZpZyktPmRlZmF1bHRUeXBlKSkKKwkJZGVmYXVsdFR5cGUJPQknVEVYVCc7CisJaWYgKGNvbmZTaXplIDwgOCB8fCAhKGRlZmF1bHRDcmVhdG9yID0gKCpjb25maWcpLT5kZWZhdWx0Q3JlYXRvcikpCisJCWRlZmF1bHRDcmVhdG9yCT0JJ01QUyAnOworCWlmIChjb25mU2l6ZSA8IDkpIAorCQlhdXRvU3Bpbgk9CTE7CQkJLy8gZG8gYXV0b21hdGljIHNwaW4gb24gcmVhZC93cml0ZQorCWVsc2UKKwkJYXV0b1NwaW4gPSAoKmNvbmZpZyktPmF1dG9TcGluOworCQkJCisJaWYgKGNvbmZTaXplIDwgMTQpCisJCXZlcnNpb24gPSAnMDEwMic7CisJZWxzZQorCQl2ZXJzaW9uID0gKCpjb25maWcpLT52ZXJzaW9uOworCisJaWYgKGNvbmZTaXplIDwgMTApIHsKKwkJbm9DaGRpcgkJCT0JZmFsc2U7CS8vIFVzZSBjaGRpcigpCisJCWFjY3VyU3RhdAkJPQlmYWxzZTsJLy8gc3RfbmxpbmsgPSAjIG9mIGVudHJpZXMgKyAyCisJCWhhc0NvbnNvbGUJCT0JZmFsc2U7CisJCW5vQXV0b0luaXRHcmFmCT0gCWZhbHNlOworCQlzaGFyZWRPcGVuCQk9CWZhbHNlOworCQlzaWdQaXBlCQkJPQlmYWxzZTsKKwkJbm9BcHBsZUV2ZW50cwk9IAlmYWxzZTsKKwkJZGVsYXlDb25zb2xlCQk9CWZhbHNlOworCX0gZWxzZSB7CisJCW5vQ2hkaXIJCQk9CSgoKmNvbmZpZyktPmZsYWdzICYgMHg4MCkgIT0gMDsKKwkJYWNjdXJTdGF0CQk9CSgoKmNvbmZpZyktPmZsYWdzICYgMHg0MCkgIT0gMDsKKwkJaGFzQ29uc29sZQkJPQl2ZXJzaW9uID49ICcwMTUwJyAmJiB2ZXJzaW9uIDw9ICcwMTgwJyAmJiAoKCpjb25maWcpLT5mbGFncyAmIDB4MDgpICE9IDA7CisJCWRlbGF5Q29uc29sZQk9CXZlcnNpb24gPj0gJzAxODEnICYmICgoKmNvbmZpZyktPmZsYWdzICYgMHgyMCkgIT0gMDsKKwkJbm9BcHBsZUV2ZW50cwk9CXZlcnNpb24gPj0gJzAxODEnICYmICgoKmNvbmZpZyktPmZsYWdzICYgMHgwOCkgIT0gMDsKKwkJbm9BdXRvSW5pdEdyYWYJPQl2ZXJzaW9uID49ICcwMTc0JyAmJiAoKCpjb25maWcpLT5mbGFncyAmIDB4MDQpICE9IDA7CisJCXNoYXJlZE9wZW4JCT0JdmVyc2lvbiA+PSAnMDE3NCcgJiYgKCgqY29uZmlnKS0+ZmxhZ3MgJiAweDAyKSAhPSAwOworCQlzaWdQaXBlCQkJPQl2ZXJzaW9uID49ICcwMTc0JyAmJiAoKCpjb25maWcpLT5mbGFncyAmIDB4MDEpICE9IDA7CisJfQorCQorCWlmICh2ZXJzaW9uIDwgJzAxMjAnIHx8IGNvbmZTaXplIDwgMTYpCisJCW51bVN1ZmZpY2VzID0gMDsKKwllbHNlCisJCW51bVN1ZmZpY2VzID0gKCpjb25maWcpLT5udW1TdWZmaWNlczsKKwkKKwlpZiAoIW51bVN1ZmZpY2VzKQorCQlzdWZmaWNlcyA9IG5pbDsKKwllbHNlIGlmIChzdWZmaWNlcyA9IG5ldyBHVVNJU3VmZml4W251bVN1ZmZpY2VzXSkgeworCQlITG9jaygoSGFuZGxlKWNvbmZpZyk7CisJCW1lbWNweShzdWZmaWNlcywgKCpjb25maWcpLT5zdWZmaWNlcywgbnVtU3VmZmljZXMqc2l6ZW9mKEdVU0lTdWZmaXgpKTsKKwkJZm9yIChpbnQgaT0wOyBpPG51bVN1ZmZpY2VzOyBpKyspCisJCQlmb3IgKGludCBqPTA7IGo8NDsgaisrKQorCQkJCWlmICgoKGNoYXIgKikgKHN1ZmZpY2VzK2kpKVtqXSA9PSAnICcpCisJCQkJCSgoY2hhciAqKSAoc3VmZmljZXMraSkpW2pdID0gMDsKKwl9Cit9CisKK0dVU0lDb25maWd1cmF0aW9uOjpHVVNJQ29uZmlndXJhdGlvbigpCit7CisJc2hvcnQJb2xkUmVzRmlsZSA9IEN1clJlc0ZpbGUoKTsKKwkKKwlpZiAoIWZpcnN0VGltZSkKKwkJd2UgPSBvbGRSZXNGaWxlOworCWVsc2UKKwkJVXNlUmVzRmlsZSh3ZSk7CisJCQorCUhhbmRsZSBjb25maWcgCT0JR2V0MVJlc291cmNlKCdHVYVJJywgR1VTSVJzcmNJRCk7CisJR1VTSUxvYWRDb25maWd1cmF0aW9uKGNvbmZpZyk7CQorCWlmICghZmlyc3RUaW1lKSB7CisJCWZpcnN0VGltZQk9CXRydWU7CisJCQorCQlpZiAoIW5vQ2hkaXIpCisJCQljaGRpcigiOiIpOworCX0gZWxzZQorCQlVc2VSZXNGaWxlKG9sZFJlc0ZpbGUpOworCQorCVJlbGVhc2VSZXNvdXJjZSgoSGFuZGxlKWNvbmZpZyk7Cit9CisKK3ZvaWQgR1VTSUNvbmZpZ3VyYXRpb246OlNldERlZmF1bHRGVHlwZShjb25zdCBURmlsZVNwZWMgJiBuYW1lKSBjb25zdAoreworCUZJbmZvCWluZm87CQorCisJLy8gCisJLy8gQ3VzdG9tIGhvb2sgaWYgZXhpc3RpbmcKKwkvLworCWlmIChHVVNJRlR5cGUgJiYgR1VTSUZUeXBlKG5hbWUpKQorCQlyZXR1cm47CisJCisJLy8KKwkvLyBPdGhlcndpc2UgZGVmYXVsdCBiZWhhdmlvdXIKKwkvLworCWlmIChIR2V0RkluZm8obmFtZS52UmVmTnVtLCBuYW1lLnBhcklELCBuYW1lLm5hbWUsICZpbmZvKSkKKwkJcmV0dXJuOworCisJUHRyIGRvdCA9IFBMc3RycmNocihuYW1lLm5hbWUsICcuJyk7CisJCisJaWYgKGRvdCAmJiAobmFtZS5uYW1lWzBdIC0gKGRvdC1QdHIobmFtZS5uYW1lKSkpIDw9IDQpIHsKKwkJY2hhciBzZWFyY2hzdWZmaXhbNV07CisJCQorCQlzdHJuY3B5KHNlYXJjaHN1ZmZpeCwgZG90KzEsIG5hbWUubmFtZVswXSAtIChkb3QtUHRyKG5hbWUubmFtZSkpKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpPG51bVN1ZmZpY2VzOyBpKyspCisJCQlpZiAoIXN0cm5jbXAoc3VmZmljZXNbaV0uc3VmZml4LCBzZWFyY2hzdWZmaXgsIDQpKSB7CisJCQkJaW5mby5mZFR5cGUgCT0Jc3VmZmljZXNbaV0uc3VmZlR5cGU7CisJCQkJaW5mby5mZENyZWF0b3IJPQlzdWZmaWNlc1tpXS5zdWZmQ3JlYXRvcjsKKwkJCQkKKwkJCQlnb3RvIGRldGVybWluZWQ7CisJCQl9CisJfQorCisJaW5mby5mZFR5cGUgCT0JZGVmYXVsdFR5cGU7CisJaW5mby5mZENyZWF0b3IJPQlkZWZhdWx0Q3JlYXRvcjsKKwlpbmZvLmZkRmxhZ3MJJj0gfmtIYXNCZWVuSW5pdGVkOworCitkZXRlcm1pbmVkOgkKKwlIU2V0RkluZm8obmFtZS52UmVmTnVtLCBuYW1lLnBhcklELCBuYW1lLm5hbWUsICZpbmZvKTsKK30KKwordm9pZCBHVVNJQ29uZmlndXJhdGlvbjo6RG9BdXRvSW5pdEdyYWYoKSBjb25zdAoreworCWlmICgqKEdyYWZQdHIgKiopIExNR2V0Q3VycmVudEE1KCkgIT0gJnFkLnRoZVBvcnQpCisJCUluaXRHcmFmKCZxZC50aGVQb3J0KTsKKwljb25zdF9jYXN0PEdVU0lDb25maWd1cmF0aW9uICo+KHRoaXMpLT5ub0F1dG9Jbml0R3JhZgk9CXRydWU7Cit9CisKKyNlbmRpZiAvLyBHVVNJX0RJU1BBVENICisKK2lubGluZSB2b2lkIEdVU0lDb25maWd1cmF0aW9uOjpEb0F1dG9TcGluKCkgY29uc3QgCit7CisJaWYgKGF1dG9TcGluKQorCQlTQUZFU1BJTigwLCBTUF9BVVRPX1NQSU4sIGF1dG9TcGluKTsKK30KKworQm9vbGVhbiBHVVNJQ29uZmlndXJhdGlvbjo6RGVsYXlDb25zb2xlKCkgY29uc3QKK3sKKwlyZXR1cm4gZGVsYXlDb25zb2xlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIEhhbmRsZSBub25zdGFuZGFyZCBjb25zb2xlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdVU0lfRElTUEFUQ0gKKworc3RhdGljIHZvaWQgSW5pdENvbnNvbGUoKQoreworCWlmIChNUFdEb21haW46OnN0ZG9wZW4pIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCVNvY2tldCAqIHNvY2sgPSAJTVBXRG9tYWluOjpzdGRvcGVuKGkpOworCisJCQlpZiAoc29jaykKKwkJCQlTb2NrZXRzLkluc3RhbGwoc29jayk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAob3BlbigiZGV2OmNvbnNvbGUiLCBPX1JET05MWSkgPCAwKQorCQkJb3BlbigiZGV2Om51bGwiLCBPX1JET05MWSk7CisJCWlmIChvcGVuKCJkZXY6Y29uc29sZSIsIE9fV1JPTkxZKSA8IDApCisJCQlvcGVuKCJkZXY6bnVsbCIsIE9fV1JPTkxZKTsKKwkJaWYgKG9wZW4oImRldjpjb25zb2xlIiwgT19XUk9OTFkpIDwgMCkKKwkJCW9wZW4oImRldjpudWxsIiwgT19XUk9OTFkpOyAKKwl9Cit9CisKK3ZvaWQgU29ja2V0VGFibGU6OkluaXRDb25zb2xlKCkKK3sKKwlpZiAobmVlZHNDb25zb2xlKSB7CisJCW5lZWRzQ29uc29sZSA9IGZhbHNlOworCQk6OkluaXRDb25zb2xlKCk7CisJfQorfQorCisjZW5kaWYgLy8gR1VTSV9ESVNQQVRDSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIEV4dGVybmFsIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBnZXRkdGFibGVzaXplKCkKK3sKKwlyZXR1cm4gR1VTSV9NQVhfRkQ7Cit9CisKK2ludCBzb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKwlTb2NrZXREb21haW4gKglkb207CisJU29ja2V0ICogCQlzb2NrOworCWludAkJCQlmZDsKKworCVNvY2tldHMuSW5pdENvbnNvbGUoKTsKKwkKKwlpZiAoZG9tID0gU29ja2V0RG9tYWluOjpEb21haW4oZG9tYWluKSkKKwkJaWYgKHNvY2sgPSBkb20tPnNvY2tldCh0eXBlLCBwcm90b2NvbCkpCisJCQlpZiAoKGZkID0gU29ja2V0cy5JbnN0YWxsKHNvY2spKSAhPSAtMSkKKwkJCQlyZXR1cm4gZmQ7CisJCQllbHNlCisJCQkJZGVsZXRlIHNvY2s7CisKKwlpZiAoIWVycm5vKQorCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitpbnQgc29ja2V0cGFpcihpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBpbnQgKiBzdikKK3sKKwlTb2NrZXREb21haW4gKglkb207CisJU29ja2V0ICogCQlzb2NrWzJdOworCisJU29ja2V0cy5Jbml0Q29uc29sZSgpOworCQorCWlmIChkb20gPSBTb2NrZXREb21haW46OkRvbWFpbihkb21haW4pKQorCQlpZiAoIWRvbS0+c29ja2V0cGFpcih0eXBlLCBwcm90b2NvbCwgc29jaykpCisJCQlpZiAoKHN2WzBdID0gU29ja2V0cy5JbnN0YWxsKHNvY2tbMF0pKSAhPSAtMSkKKwkJCQlpZiAoKHN2WzFdID0gU29ja2V0cy5JbnN0YWxsKHNvY2tbMV0pKSAhPSAtMSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZSB7CisJCQkJCVNvY2tldHMuUmVtb3ZlKHN2WzBdKTsKKwkJCQkJCisJCQkJCWdvdG8gZmFpbEluc3RhbGw7CisJCQkJfQorCQkJZWxzZSB7CitmYWlsSW5zdGFsbDoKKwkJCQlkZWxldGUgc29ja1swXTsKKwkJCQlkZWxldGUgc29ja1sxXTsKKwkJCX0KKwkJCisJaWYgKCFlcnJubykKKwkJcmV0dXJuIEdVU0lfZXJyb3IoRU5PTUVNKTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworaW50IHBpcGUoaW50ICogZmQpCit7CisJR1VTSXdpdGhVbml4U29ja2V0cygpOworCQorCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCkpCisJCXJldHVybiAtMTsKKwlzaHV0ZG93bihmZFswXSwgMSk7CisJc2h1dGRvd24oZmRbMV0sIDApOworCQorCXJldHVybiAwOworfQorCitpbnQgY2hvb3NlKGludCBkb21haW4sIGludCB0eXBlLCBjaGFyICogcHJvbXB0LCB2b2lkICogY29uc3RyYWludCwgaW50IGZsYWdzLCB2b2lkICogbmFtZSwgaW50ICogbmFtZWxlbikKK3sKKwlTb2NrZXREb21haW4gKglkb207CisKKwlpZiAoZG9tID0gU29ja2V0RG9tYWluOjpEb21haW4oZG9tYWluKSkKKwkJcmV0dXJuIGRvbS0+Y2hvb3NlKHR5cGUsIHByb21wdCwgY29uc3RyYWludCwgZmxhZ3MsIG5hbWUsIG5hbWVsZW4pOworCisJcmV0dXJuIC0xOworfQorCitpbnQgYmluZChpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+YmluZCgodm9pZCAqKSBuYW1lLCBuYW1lbGVuKSA6IC0xOworfQorCitpbnQgY29ubmVjdChpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+Y29ubmVjdCgodm9pZCAqKSBhZGRyLCBhZGRybGVuKSA6IC0xOworfQorCitpbnQgbGlzdGVuKGludCBzLCBpbnQgcWxlbikKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+bGlzdGVuKHFsZW4pIDogLTE7Cit9CisKK2ludCBhY2NlcHQoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50ICphZGRybGVuKQoreworCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOworCisJaWYgKHNvY2spCisJCWlmIChzb2NrCT0gc29jay0+YWNjZXB0KGFkZHIsIGFkZHJsZW4pKQorCQkJaWYgKChzID0gU29ja2V0cy5JbnN0YWxsKHNvY2spKSAhPSAtMSkKKwkJCQlyZXR1cm4gczsKKwkJCWVsc2UKKwkJCQlkZWxldGUgc29jazsKKworCXJldHVybiAtMTsKK30KKworaW50IGNsb3NlKGludCBzKQoreworCWVycm9yU29jawk9CS0xOworCQorCXJldHVybiBTb2NrZXRzLlJlbW92ZShzKTsKK30KKworI2lmZGVmIF9fTVdFUktTX18KK2ludCByZWFkKGludCBzLCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pCisjZWxzZQoraW50IHJlYWQoaW50IHMsIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgYnVmbGVuKQorI2VuZGlmCit7CisJR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7CisJCisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPnJlYWQoYnVmZmVyLCAodW5zaWduZWQpIGJ1ZmxlbikgOiAtMTsKK30KKworaW50IHJlYWR2KGludCBzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KQoreworCUdVU0lDb25maWcuRG9BdXRvU3BpbigpOworCQorCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOworCisJaWYgKHNvY2spCXsKKwkJU2NhdHRlcmVyCXNjYXR0KGlvdiwgY291bnQpOworCisJCWlmIChzY2F0dCkKKwkJCXJldHVybiBzY2F0dC5sZW5ndGgoc29jay0+cmVhZChzY2F0dC5idWZmZXIoKSwgc2NhdHQuYnVmbGVuKCkpKTsKKwkJZWxzZQorCQkJcmV0dXJuIEdVU0lfZXJyb3IoRU5PTUVNKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworfQorCitpbnQgcmVjdihpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MpCit7CisJR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7CisJCisJaW50IAkJZnJvbWxlbiAJPQkwOworCVNvY2tldCAqCXNvY2sJCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+cmVjdmZyb20oYnVmZmVyLCBidWZsZW4sIGZsYWdzLCBuaWwsICZmcm9tbGVuKSA6IC0xOworfQorCitpbnQgcmVjdmZyb20oaW50IHMsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIGludCAqZnJvbWxlbikKK3sKKwlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKKwkKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+cmVjdmZyb20oYnVmZmVyLCBidWZsZW4sIGZsYWdzLCBmcm9tLCBmcm9tbGVuKSA6IC0xOworfQorCitpbnQgcmVjdm1zZyhpbnQgcywgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpCit7CisJR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7CisJCisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlpZiAoc29jaykJeworCQlTY2F0dGVyZXIJc2NhdHQoKHN0cnVjdCBpb3ZlYyAqKW1zZy0+bXNnX2lvdiwgbXNnLT5tc2dfaW92bGVuKTsKKworCQlpZiAoc2NhdHQpCisJCQlyZXR1cm4KKwkJCQlzY2F0dC5sZW5ndGgoCisJCQkJCXNvY2stPnJlY3Zmcm9tKAorCQkJCQkJc2NhdHQuYnVmZmVyKCksCisJCQkJCQlzY2F0dC5idWZsZW4oKSwKKwkJCQkJCWZsYWdzLAorCQkJCQkJbXNnLT5tc2dfbmFtZSwKKwkJCQkJCShpbnQgKikmbXNnLT5tc2dfbmFtZWxlbikpOworCQllbHNlCisJCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOworCX0gZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBfX01XRVJLU19fCitpbnQgd3JpdGUoaW50IHMsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKKyNlbHNlCitpbnQgd3JpdGUoaW50IHMsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgYnVmbGVuKQorI2VuZGlmCit7CisJLyogZmZsdXNoKCkgaW4gdGhlIE1QVyBzdGRpbyBsaWJyYXJ5IGRvZXNuJ3QgdGFrZSBubyBmb3IgYW4gYW5zd2VyLgorCQlPdXIgd29ya2Fyb3VuZCBpcyB0byB0cmVhdCBhIHNlY29uZCBzdWJzZXF1ZW50IEVTSFVURE9XTiBvciBFQkFERiBhcyAKKwkJYW4gaW52aXRhdGlvbiB0byBsaWUgYnkgcHJldGVuZGluZyB0aGUgd3JpdGUgd29ya2VkLgorCSovCisJCisJaW50CWxlbjsKKwkKKwlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKKwkKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCWlmIChzb2NrICYmIChsZW4gPSBzb2NrLT53cml0ZSgoY2hhciAqKSBidWZmZXIsICh1bnNpZ25lZCkgYnVmbGVuKSkgIT0gLTEpCisJCXJldHVybiBsZW47CisJCQorCXN3aXRjaCAoZXJybm8pIHsKKwljYXNlIEVJTlRSOgorCWNhc2UgRVdPVUxEQkxPQ0s6CisJY2FzZSBFSU5QUk9HUkVTUzoKKwljYXNlIEVBTFJFQURZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoR1VTSUNvbmZpZy5zaWdQaXBlKQorCQkJcmFpc2UoU0lHUElQRSk7CisJCWlmIChlcnJvclNvY2sgPT0gcyAmJiBlcnJvclR5cGUgPT0gZXJybm8pIHsKKwkJCWlmICgrK2Vycm9yQ291bnQgPT0gZXJyb3JNYXgpIHsKKwkJCQllcnJvclNvY2sgPSAtMTsKKwkJCQorCQkJCXJldHVybiBidWZsZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQllcnJvclNvY2sgPSBzOworCQkJZXJyb3JUeXBlID0gZXJybm87CisJCQllcnJvckNvdW50PSAxOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBIYW5kbGVXcml0ZUVycm9ycyhpbnQgcmV0dmFsKQoreworCWlmIChyZXR2YWwgPT0gLTEpCisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFSU5UUjoKKwkJY2FzZSBFV09VTERCTE9DSzoKKwkJY2FzZSBFSU5QUk9HUkVTUzoKKwkJY2FzZSBFQUxSRUFEWToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKEdVU0lDb25maWcuc2lnUGlwZSkKKwkJCQlyYWlzZShTSUdQSVBFKTsKKwkJCWJyZWFrOworCQl9CisJCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHdyaXRldihpbnQgcywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBjb3VudCkKK3sKKwlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKKwkKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCWlmIChzb2NrKQl7CisJCUdhdGhlcmVyCWdhdGgoaW92LCBjb3VudCk7CisKKwkJaWYgKGdhdGgpCisJCQlyZXR1cm4gSGFuZGxlV3JpdGVFcnJvcnMoZ2F0aC5sZW5ndGgoc29jay0+d3JpdGUoZ2F0aC5idWZmZXIoKSwgZ2F0aC5idWZsZW4oKSkpKTsKKwkJZWxzZQorCQkJcmV0dXJuIEdVU0lfZXJyb3IoRU5PTUVNKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworfQorCitpbnQgc2VuZChpbnQgcywgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MpCit7CisJR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7CisJCisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IEhhbmRsZVdyaXRlRXJyb3JzKHNvY2stPnNlbmR0bygodm9pZCAqKWJ1ZmZlciwgYnVmbGVuLCBmbGFncywgbmlsLCAwKSkgOiAtMTsKK30KKworaW50IHNlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIGludCB0b2xlbikKK3sKKwlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKKwkKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gSGFuZGxlV3JpdGVFcnJvcnMoc29jay0+c2VuZHRvKCh2b2lkICopYnVmZmVyLCBidWZsZW4sIGZsYWdzLCAodm9pZCAqKSB0bywgdG9sZW4pKSA6IC0xOworfQorCitpbnQgc2VuZG1zZyhpbnQgcywgY29uc3Qgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpCit7CisJR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7CisJCisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlpZiAoc29jaykJeworCQlHYXRoZXJlcglnYXRoKChzdHJ1Y3QgaW92ZWMgKikgbXNnLT5tc2dfaW92LCBtc2ctPm1zZ19pb3ZsZW4pOworCisJCWlmIChnYXRoKQorCQkJcmV0dXJuCisJCQkJSGFuZGxlV3JpdGVFcnJvcnMoZ2F0aC5sZW5ndGgoCisJCQkJCXNvY2stPnNlbmR0bygKKwkJCQkJCWdhdGguYnVmZmVyKCksCisJCQkJCQlnYXRoLmJ1ZmxlbigpLAorCQkJCQkJZmxhZ3MsCisJCQkJCQltc2ctPm1zZ19uYW1lLAorCQkJCQkJbXNnLT5tc2dfbmFtZWxlbikpKTsKKwkJZWxzZQorCQkJcmV0dXJuIEdVU0lfZXJyb3IoRU5PTUVNKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworfQorCitpbnQgc2VsZWN0KGludCB3aWR0aCwgZmRfc2V0ICpyZWFkZmRzLCBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKmV4Y2VwdGZkcywgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpCit7CisJU29ja2V0CSoJc29jazsKKwlsb25nIAkJCWNvdW50OworCWludCAJCQlzOworCWxvbmcgCQkJc3RhcnR0aW1lLCB3YWl0dGltZTsKKwlmZF9zZXQgCQlyZCwgd2QsIGVkOworCUJvb2xlYW4JCXIsdyxlOworCUJvb2xlYW4gKgljYW5SZWFkOworCUJvb2xlYW4gKgljYW5Xcml0ZTsKKwlCb29sZWFuICoJZXhjZXB0aW9uOworCisJY291bnQgPSAwOworCUZEX1pFUk8oJnJkKTsKKwlGRF9aRVJPKCZ3ZCk7CisJRkRfWkVSTygmZWQpOworCisJaWYgKHRpbWVvdXQpCisJCXdhaXR0aW1lID0gIHRpbWVvdXQtPnR2X3NlYyo2MCArIHRpbWVvdXQtPnR2X3VzZWMvMTY2NjY7CisJZWxzZQorCQl3YWl0dGltZSA9CTIwMDAwMDAwMDA7CS8vIFNsaWdodGx5IG1vcmUgdGhhbiBhIHllYXI7IGNsb3NlIGVub3VnaCB0byAibm8gdGltZW91dCIKKwkJCisJc3RhcnR0aW1lID0gTE1HZXRUaWNrcygpOworCisJLy8gQ2hlY2sgZmlsZXMgZm9yIGtvc2hlcm5lc3MKKworCWZvciAocyA9IDA7IHMgPCB3aWR0aCA7ICsrcykKKwkJaWYgKAkocmVhZGZkcyAmJiBGRF9JU1NFVChzLHJlYWRmZHMpKQorCQkJfHwJKHdyaXRlZmRzICYmIEZEX0lTU0VUKHMsd3JpdGVmZHMpKQorCQkJfHwJKGV4Y2VwdGZkcyAmJiBGRF9JU1NFVChzLGV4Y2VwdGZkcykpCisJCSkKKwkJCWlmICghU29ja2V0c1tzXSkKKwkJCQlyZXR1cm4gR1VTSV9lcnJvcihFQkFERik7CisJCisJZm9yIChzID0gMDsgcyA8IHdpZHRoIDsgKytzKQorCQlpZiAoc29jayA9IFNvY2tldHNbc10pIHsKKwkJCXIgPSByZWFkZmRzICYmIEZEX0lTU0VUKHMscmVhZGZkcyk7CisJCQl3ID0gd3JpdGVmZHMgJiYgRkRfSVNTRVQocyx3cml0ZWZkcyk7CisJCQllID0gZXhjZXB0ZmRzICYmIEZEX0lTU0VUKHMsZXhjZXB0ZmRzKTsKKworCQkJaWYgKHIgfHwgdyB8fCBlKQorCQkJCXNvY2stPnByZV9zZWxlY3QociwgdywgZSk7CisJCX0KKwkJCisJZG8geworCQlmb3IgKHMgPSAwOyBzIDwgd2lkdGggOyArK3MpICB7CisJCQlpZiAoc29jayA9IFNvY2tldHNbc10pIHsKKwkJCQlyID0gZmFsc2U7CisJCQkJdyA9IGZhbHNlOworCQkJCWUgPSBmYWxzZTsKKworCQkJCWNhblJlYWQgPSAocmVhZGZkcyAmJiBGRF9JU1NFVChzLHJlYWRmZHMpKSA/ICZyIDogbmlsOworCQkJCWNhbldyaXRlID0gKHdyaXRlZmRzICYmIEZEX0lTU0VUKHMsd3JpdGVmZHMpKSA/ICZ3IDogbmlsOworCQkJCWV4Y2VwdGlvbiA9IChleGNlcHRmZHMgJiYgRkRfSVNTRVQocyxleGNlcHRmZHMpKSA/ICZlIDogbmlsOworCisJCQkJaWYgKGNhblJlYWQgfHwgY2FuV3JpdGUgfHwgZXhjZXB0aW9uKQl7CisJCQkJCWNvdW50CSs9IHNvY2stPnNlbGVjdChjYW5SZWFkLCBjYW5Xcml0ZSwgZXhjZXB0aW9uKTsKKworCQkJCQlpZiAocikKKwkJCQkJCUZEX1NFVChzLCZyZCk7CisJCQkJCWlmICh3KQorCQkJCQkJRkRfU0VUKHMsJndkKTsKKwkJCQkJaWYgKGUpCisJCQkJCQlGRF9TRVQocywmZWQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY291bnQpCisJCQlicmVhazsKKworCQlTQVZFX0FORF9DTEVBUl9FUlJOTzsKKwkJU0FGRVNQSU4oZmFsc2UsIFNQX1NFTEVDVCwgd2FpdHRpbWUpOworCisJCWlmIChlcnJubykgeworCQkJY291bnQgPSAtMTsKKwkJCQorCQkJYnJlYWs7CisJCX0KKwl9ICB3aGlsZSAoTE1HZXRUaWNrcygpIC0gc3RhcnR0aW1lIDwgd2FpdHRpbWUpOworCisJZm9yIChzID0gMDsgcyA8IHdpZHRoIDsgKytzKQorCQlpZiAoc29jayA9IFNvY2tldHNbc10pIHsKKwkJCXIgPSByZWFkZmRzICYmIEZEX0lTU0VUKHMscmVhZGZkcyk7CisJCQl3ID0gd3JpdGVmZHMgJiYgRkRfSVNTRVQocyx3cml0ZWZkcyk7CisJCQllID0gZXhjZXB0ZmRzICYmIEZEX0lTU0VUKHMsZXhjZXB0ZmRzKTsKKworCQkJaWYgKHIgfHwgdyB8fCBlKQorCQkJCXNvY2stPnBvc3Rfc2VsZWN0KHIsIHcsIGUpOworCQl9CisJCQorCWlmIChjb3VudCA8IDApCisJCXJldHVybiBHVVNJX2Vycm9yKEVJTlRSKTsKKwkJCisJaWYgKHJlYWRmZHMpCisJCSpyZWFkZmRzID0gcmQ7CisJaWYgKHdyaXRlZmRzKQorCQkqd3JpdGVmZHMgPSB3ZDsKKwlpZiAoZXhjZXB0ZmRzKQorCQkqZXhjZXB0ZmRzID0gZWQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBnZXRzb2NrbmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBpbnQgKm5hbWVsZW4pCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPmdldHNvY2tuYW1lKG5hbWUsIG5hbWVsZW4pIDogLTE7Cit9CisKK2ludCBnZXRwZWVybmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBpbnQgKm5hbWVsZW4pCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPmdldHBlZXJuYW1lKG5hbWUsIG5hbWVsZW4pIDogLTE7Cit9CisKK2ludCBzaHV0ZG93bihpbnQgcywgaW50IGhvdykKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+c2h1dGRvd24oaG93KSA6IC0xOworfQorCitpbnQgZmNudGwoaW50IHMsIHVuc2lnbmVkIGludCBjbWQsIGludCBhcmcpCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlpZiAoc29jaykKKwkJcmV0dXJuIChjbWQgPT0gRl9EVVBGRCkgPyBTb2NrZXRzLkluc3RhbGwoc29jaywgYXJnKSA6IHNvY2stPmZjbnRsKGNtZCwgYXJnKTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworaW50IGR1cChpbnQgcykKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gU29ja2V0cy5JbnN0YWxsKHNvY2spIDogLTE7Cit9CisKK2ludCBkdXAyKGludCBzLCBpbnQgczEpCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMTsKKworCWlmIChTb2NrZXRzW3MxXSkKKwkJU29ja2V0cy5SZW1vdmUoczEpOworCisJcmV0dXJuIFNvY2tldHMuSW5zdGFsbChzb2NrLCBzMSk7Cit9CisKK2ludCBpb2N0bChpbnQgcywgdW5zaWduZWQgaW50IHJlcXVlc3QsIGxvbmcgKmFyZ3ApCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMTsKKwkKKwlyZXR1cm4gc29jay0+aW9jdGwocmVxdWVzdCwgYXJncCk7Cit9CisKK2ludCBnZXRzb2Nrb3B0KGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkICpvcHR2YWwsIGludCAqIG9wdGxlbikKK3sKKwlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKKworCXJldHVybiBzb2NrID8gc29jay0+Z2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pIDogLTE7Cit9CisKK2ludCBzZXRzb2Nrb3B0KGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjb25zdCB2b2lkICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPnNldHNvY2tvcHQobGV2ZWwsIG9wdG5hbWUsICh2b2lkICopIG9wdHZhbCwgb3B0bGVuKSA6IC0xOworfQorCitpbnQgZnN0YXQoaW50IHMsIHN0cnVjdCBzdGF0ICogYnVmKQoreworCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOworCisJcmV0dXJuIHNvY2sgPyBzb2NrLT5mc3RhdChidWYpIDogLTE7Cit9CisKK2xvbmcgbHNlZWsoaW50IHMsIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOworCisJcmV0dXJuIHNvY2sgPyBzb2NrLT5sc2VlayhvZmZzZXQsIHdoZW5jZSkgOiAtMTsKK30KKworaW50IGZ0cnVuY2F0ZShpbnQgcywgbG9uZyBvZmZzZXQpCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPmZ0cnVuY2F0ZShvZmZzZXQpIDogLTE7Cit9CisKK2ludCBpc2F0dHkoaW50IHMpCit7CisJU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107CisKKwlyZXR1cm4gc29jayA/IHNvY2stPmlzYXR0eSgpIDogLTE7Cit9CisKK3ZvaWQgR1VTSVNldEhvb2soR1VTSUhvb2tDb2RlIGNvZGUsIEdVU0lIb29rIGhvb2spCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBHVVNJX1NwaW5Ib29rOgorCQlHVVNJU3BpbiA9IChHVVNJU3BpbkZuKSBob29rOworCQlicmVhazsKKwljYXNlIEdVU0lfRXhlY0hvb2s6CisJCUdVU0lFeGVjID0gKEdVU0lFeGVjRm4pIGhvb2s7CisJCWJyZWFrOworCWNhc2UgR1VTSV9GVHlwZUhvb2s6CisJCUdVU0lGVHlwZSA9IChHVVNJRlR5cGVGbikgaG9vazsKKwkJYnJlYWs7CisJY2FzZSBHVVNJX1NwZWVkSG9vazoKKwkJZ0dVU0lTcGVlZCA9IChsb25nKSBob29rOworCQlicmVhazsKKwl9Cit9CisKK0dVU0lIb29rIEdVU0lHZXRIb29rKEdVU0lIb29rQ29kZSBjb2RlKQoreworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgR1VTSV9TcGluSG9vazoKKwkJcmV0dXJuIChHVVNJSG9vaykgR1VTSVNwaW47CisJY2FzZSBHVVNJX0V4ZWNIb29rOgorCQlyZXR1cm4gKEdVU0lIb29rKSBHVVNJRXhlYzsKKwljYXNlIEdVU0lfRlR5cGVIb29rOgorCQlyZXR1cm4gKEdVU0lIb29rKSBHVVNJRlR5cGU7CisJY2FzZSBHVVNJX1NwZWVkSG9vazoKKwkJcmV0dXJuIChHVVNJSG9vaykgZ0dVU0lTcGVlZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChHVVNJSG9vaykgbmlsOworCX0KK30KKworaW50IEdVU0lTZXRFdmVudHMoR1VTSUV2dFRhYmxlIHRhYmxlKQoreworCXNob3J0CWV2dDsKKworCWV2dEhhbmRsZXIJPQl0YWJsZTsKKwlldnRNYXNrCQk9CTA7CisKKwlmb3IgKGV2dCA9IDA7IGV2dDwxNjsgKytldnQpCisJCWlmIChldnRIYW5kbGVyW2V2dF0pCisJCQlldnRNYXNrCXw9CTEgPDwgZXZ0OworCisJcmV0dXJuIDA7Cit9CisKK0dVU0lFdnRIYW5kbGVyICogR1VTSUdldEV2ZW50cyh2b2lkKQoreworCXJldHVybiBldnRIYW5kbGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogU29ja2V0RG9tYWluIG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR1VTSV9ESVNQQVRDSAorCitTb2NrZXREb21haW4gKgkJCVNvY2tldERvbWFpbjo6ZG9tYWluc1tHVVNJX01BWF9ET01BSU5dOworUHJvY2Vzc1NlcmlhbE51bWJlcglTb2NrZXREb21haW46OnByb2Nlc3M7CisKK1NvY2tldERvbWFpbiAqIFNvY2tldERvbWFpbjo6RG9tYWluKGludCBkb21haW4pCit7CisJaWYgKGRvbWFpbiA8IDAgfHwgZG9tYWluID49IEdVU0lfTUFYX0RPTUFJTiB8fCAhZG9tYWluc1tkb21haW5dKQl7CisJCUdVU0lfZXJyb3IoRUlOVkFMKTsKKworCQlyZXR1cm4gbmlsOworCX0gZWxzZQorCQlyZXR1cm4gZG9tYWluc1tkb21haW5dOworfQorCit2b2lkIFNvY2tldERvbWFpbjo6UmVhZHkoKQoreworCWlmIChoYXNQcm9jZXNzTWdyKQorCQlXYWtlVXBQcm9jZXNzKCZwcm9jZXNzKTsKK30KKworU29ja2V0RG9tYWluOjpTb2NrZXREb21haW4oaW50IGRvbWFpbikKK3sKKyNpZmRlZiBQUkVWRU5UX0RVUExJQ0FURV9ET01BSU5TCisJaWYgKGRvbWFpbnNbZG9tYWluXSkJeworCQlTdHI2Mwltc2c7CisKKwkJc3ByaW50ZigoY2hhciAqKSBtc2crMSwgIkR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBmb3IgZG9tYWluICVkXG4iLCBkb21haW4pOworCQltc2dbMF0gPSAodW5zaWduZWQgY2hhcilzdHJsZW4oKGNoYXIgKikgbXNnKzEpOworCisJCURlYnVnU3RyKG1zZyk7CisJfQorI2VuZGlmCisJaWYgKGRvbWFpbikJCQkJCQkJCQkvLyBJZ25vcmUgQUZfVU5TUEVDIGRvbWFpbnMKKwkJZG9tYWluc1tkb21haW5dCT0JdGhpczsKKwkKKwlpZiAoaGFzUHJvY2Vzc01nciAmJiAhcHJvY2Vzcy5oaWdoTG9uZ09mUFNOICYmICFwcm9jZXNzLmxvd0xvbmdPZlBTTikKKwkJR2V0Q3VycmVudFByb2Nlc3MoJnByb2Nlc3MpOworfQorCitTb2NrZXREb21haW46On5Tb2NrZXREb21haW4oKQoreworfQorCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBzb2NrZXQoKSBqdXN0IHJldHVybnMgYW4gZXJyb3IKKworU29ja2V0ICogU29ja2V0RG9tYWluOjpzb2NrZXQoaW50LCBzaG9ydCkKK3sKKwlHVVNJX2Vycm9yKEVPUE5PVFNVUFApOworCisJcmV0dXJuIG5pbDsKK30KKworLy8gU2FtZSB3aXRoIHNvY2tldHBhaXIKKworaW50IFNvY2tldERvbWFpbjo6c29ja2V0cGFpcihpbnQsIHNob3J0LCBTb2NrZXQgKiopCit7CisJcmV0dXJuIEdVU0lfZXJyb3IoRU9QTk9UU1VQUCk7Cit9CisKKworaW50IFNvY2tldERvbWFpbjo6Y2hvb3NlKGludCwgY2hhciAqLCB2b2lkICosIGludCwgdm9pZCAqLCBpbnQgKikKK3sKKwlyZXR1cm4gR1VTSV9lcnJvcihFT1BOT1RTVVBQKTsKK30KKwordm9pZCBTb2NrZXREb21haW46OkRvbnRTdHJpcCgpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBTb2NrZXRUYWJsZSBtZW1iZXJzICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgRmx1c2hTdGRpbygpCit7CisJZndhbGsoZmZsdXNoKTsKK30KKworU29ja2V0VGFibGU6OlNvY2tldFRhYmxlKCkKK3sKKwlhdGV4aXQoRmx1c2hTdGRpbyk7CisJCisJbmVlZHNDb25zb2xlID0gdHJ1ZTsKK30KKwkKK2ludCBTb2NrZXRUYWJsZTo6SW5zdGFsbChTb2NrZXQgKiBzb2NrLCBpbnQgc3RhcnQpCit7CisJc2hvcnQJZmQ7CisKKwlpZiAoc3RhcnQ8MCB8fCBzdGFydCA+PSBHVVNJX01BWF9GRCkKKwkJcmV0dXJuIEdVU0lfZXJyb3IoRUlOVkFMKTsKKworCWZvciAoZmQ9c3RhcnQ7IGZkPEdVU0lfTUFYX0ZEOyArK2ZkKQorCQlpZiAoIXNvY2tldHNbZmRdKQl7CisJCQlzb2NrZXRzW2ZkXSA9IHNvY2s7CisJCQorCQkJKytzb2NrLT5yZWZDb3VudDsKKwkJCXJldHVybiBmZDsKKwkJfQorCisJcmV0dXJuIEdVU0lfZXJyb3IoRU1GSUxFKTsKK30KKworaW50IFNvY2tldFRhYmxlOjpSZW1vdmUoaW50IGZkKQoreworCVNvY2tldCAqCXNvY2s7CisKKwlJbml0Q29uc29sZSgpOworCisJaWYgKGZkPDAgfHwgZmQgPj0gR1VTSV9NQVhfRkQgfHwgIShzb2NrID0gc29ja2V0c1tmZF0pKQorCQlyZXR1cm4gR1VTSV9lcnJvcihFQkFERik7CisKKwlzb2NrZXRzW2ZkXSAJPQluaWw7CisKKwlpZiAoIS0tc29jay0+cmVmQ291bnQpCisJCWRlbGV0ZSBzb2NrOworCisJcmV0dXJuIDA7Cit9CisKK1NvY2tldCAqIFNvY2tldFRhYmxlOjpvcGVyYXRvcltdKGludCBmZCkKK3sKKwlTb2NrZXQgKiBzb2NrOworCisJSW5pdENvbnNvbGUoKTsKKwkKKwlpZiAoZmQ8MCB8fCBmZCA+PSBHVVNJX01BWF9GRCB8fCAhKHNvY2sgPSBzb2NrZXRzW2ZkXSkpCXsKKwkJR1VTSV9lcnJvcihFQkFERik7CisKKwkJcmV0dXJuIG5pbDsKKwl9IGVsc2UKKwkJcmV0dXJuIHNvY2s7Cit9CisKKyNpZm5kZWYgcG93ZXJjCisjcHJhZ21hIGZhcl9jb2RlCisjZW5kaWYKKworU29ja2V0VGFibGU6On5Tb2NrZXRUYWJsZSgpCit7CisJaW50IGk7CisKKwkvLyBGbHVzaCBzdGRpbyBmaWxlcyAobmVjZXNzYXJ5IHRvIGZsdXNoIGJ1ZmZlcnMpCisKKwlmd2FsayhmZmx1c2gpOworCisJLy8gSWYgd2UgZGlkbid0IG5lZWQgYSBjb25zb2xlIHNvIGZhciwgd2UgY2VydGFpbmx5IGRvbid0IG5lZWQgb25lIG5vdyEKKwkvLyBEb2luZyB0aGlzIGZ1cnRoZXIgdXAgd291bGQgYmUgZGFuZ2Vyb3VzIGZvciBzbWFsbCB3cml0ZSBvbmx5IGFwcHMKKwkKKwluZWVkc0NvbnNvbGUgPSBmYWxzZTsKKworCS8vIE5vdyBjbG9zZSBzdGRpbyBmaWxlcywganVzdCB0byBiZSBzdXJlCisKKwlmd2FsayhmY2xvc2UpOworCisJLy8gQ2xvc2UgYWxsIGZpbGVzCisKKwlmb3IgKGkgPSAwOyBpPEdVU0lfTUFYX0ZEOyArK2kpCisJCWlmIChzb2NrZXRzW2ldKQorCQkJY2xvc2UoaSk7Cit9CisKKyNlbmRpZiAvLyBHVVNJX0RJU1BBVENICisKKy8qKioqKioqKioqKioqKioqKioqKioqIHNsZWVwKCkvYWxhcm0oKSAqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGxvbmcJR1VTSUFsYXJtID0gMDsKKworaW50IEdVU0lDaGVja0FsYXJtKCkKK3sKKwlpZiAoR1VTSUFsYXJtICYmIExNR2V0VGlja3MoKSA+IEdVU0lBbGFybSkgeworCQlHVVNJQWxhcm0gPSAwOworCQlyYWlzZShTSUdBTFJNKTsKKwkJCisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKwordV9pbnQJIGFsYXJtKHVfaW50IHNlY29uZHMpCit7CisJbG9uZyByZW1haW5pbmcgPSBHVVNJQWxhcm0gPyAoTE1HZXRUaWNrcygpIC0gR1VTSUFsYXJtKSAvIDYwIDogMDsKKwkKKwlHVVNJQWxhcm0gPSBzZWNvbmRzID8gTE1HZXRUaWNrcygpICsgNjAgKiBzZWNvbmRzIDogMDsKKwkKKwlyZXR1cm4gKHJlbWFpbmluZyA8IDApID8gMCA6ICh1X2ludCkgcmVtYWluaW5nOworfQorCitzdGF0aWMgdV9pbnQgRG9TbGVlcChsb25nIHRpY2tzKQoreworCWxvbmcgd2FrZXVwID0gTE1HZXRUaWNrcygpICsgdGlja3M7CisJCisJU0FGRVNQSU4od2FrZXVwID4gTE1HZXRUaWNrcygpLCBTUF9TTEVFUCwgd2FrZXVwIC0gTE1HZXRUaWNrcygpKTsKKwkKKwlsb25nIHJlbWFpbmluZyA9IChMTUdldFRpY2tzKCkgLSB3YWtldXApIC8gNjA7CisJCisJcmV0dXJuIChyZW1haW5pbmcgPCAwKSA/IDAgOiAodV9pbnQpIHJlbWFpbmluZzsKK30KKwordV9pbnQgc2xlZXAodV9pbnQgc2Vjb25kcykgCit7CisJcmV0dXJuIERvU2xlZXAoc2Vjb25kcyAqIDYwKTsKK30KKwordm9pZCB1c2xlZXAodV9pbnQgdXNlY29uZHMpCit7CisJRG9TbGVlcCgodXNlY29uZHMgKiAzKSAvIDUwMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiogRGVmYXVsdCBzcGluIGZ1bmN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdVU0lfRElTUEFUQ0gKKworI2lmbmRlZiBwb3dlcmMKKyNwcmFnbWEgc21hcnRfY29kZQorI2VuZGlmCisKKy8qIEJvcnJvd2VkIGZyb20gdGVjaCBub3RlIDI2MyAqLworCisjZGVmaW5lIGtNYXNrTW9kaWZpZXJzICAJMHhGRTAwICAgICAJLy8gd2UgbmVlZCB0aGUgbW9kaWZpZXJzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLy8gY29tbWFuZCBrZXkgZm9yIEtleVRyYW5zCisjZGVmaW5lIGtNYXNrVmlydHVhbEtleSAJMHgwMDAwRkYwMCAJLy8gZ2V0IHZpcnR1YWwga2V5IGZyb20gZXZlbnQgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCS8vIGZvciBLZXlUcmFucworI2RlZmluZSBrVXBLZXlNYXNrICAgICAgCTB4MDA4MAorI2RlZmluZSBrU2hpZnRXb3JkICAgICAgCTggICAgICAgICAgCS8vIHdlIHNoaWZ0IHRoZSB2aXJ0dWFsIGtleSB0byBtYXNrIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLy8gaW50byB0aGUga2V5Q29kZSBmb3IgS2V5VHJhbnMKKyNkZWZpbmUga01hc2tBU0NJSTEgICAgIAkweDAwRkYwMDAwIAkvLyBnZXQgdGhlIGtleSBvdXQgb2YgdGhlIEFTQ0lJMSBieXRlCisjZGVmaW5lIGtNYXNrQVNDSUkyICAgICAJMHgwMDAwMDBGRiAJLy8gZ2V0IHRoZSBrZXkgb3V0IG9mIHRoZSBBU0NJSTIgYnl0ZQorI2RlZmluZSBrUGVyaW9kICAgICAgICAgCTB4MkUgICAgICAgCS8vIGFzY2lpIGZvciBhIHBlcmlvZAorCitzdGF0aWMgQm9vbGVhbiBDbWRQZXJpb2QoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KQoreworICAJQm9vbGVhbiAgZlRpbWVUb1F1aXQ7CisgIAlzaG9ydCAgICBrZXlDb2RlOworICAJbG9uZyAgICAgdmlydHVhbEtleSwga2V5SW5mbywgbG93Q2hhciwgaGlnaENoYXIsIGtleUNJZDsKKyAgCVVJbnQzMglzdGF0ZTsKKyAgCUhhbmRsZSAgIGhLQ0hSOworCVB0ciAJCUtDSFJQdHI7CisKKwlmVGltZVRvUXVpdCA9IGZhbHNlOworCisJaWYgKCgoKnRoZUV2ZW50KS53aGF0ID09IGtleURvd24pIHx8ICgoKnRoZUV2ZW50KS53aGF0ID09IGF1dG9LZXkpKSB7CisKKwkJLy8gc2VlIGlmIHRoZSBjb21tYW5kIGtleSBpcyBkb3duLiAgSWYgaXQgaXMsIGZpbmQgb3V0IHRoZSBBU0NJSQorCQkvLyBlcXVpdmFsZW50IGZvciB0aGUgYWNjb21wYW55aW5nIGtleS4KKworCQlpZiAoKCp0aGVFdmVudCkubW9kaWZpZXJzICYgY21kS2V5ICkgeworCisJCQl2aXJ0dWFsS2V5ID0gKCgqdGhlRXZlbnQpLm1lc3NhZ2UgJiBrTWFza1ZpcnR1YWxLZXkpID4+IGtTaGlmdFdvcmQ7CisJCQkvLyBBbmQgb3V0IHRoZSBjb21tYW5kIGtleSBhbmQgT3IgaW4gdGhlIHZpcnR1YWxLZXkKKwkJCWtleUNvZGUgICAgPSBzaG9ydCgoKCp0aGVFdmVudCkubW9kaWZpZXJzICYga01hc2tNb2RpZmllcnMpIHwgdmlydHVhbEtleSk7CisJCQlzdGF0ZSAgICAgID0gMDsKKworCQkJaEtDSFIgPSBuaWw7ICAvKiBzZXQgdGhpcyB0byBuaWwgYmVmb3JlIHN0YXJ0aW5nICovCisJCSAJS0NIUlB0ciA9IChQdHIpR2V0U2NyaXB0TWFuYWdlclZhcmlhYmxlKHNtS0NIUkNhY2hlKTsKKworCQkJaWYgKCAhS0NIUlB0ciApIHsKKwkJCQlrZXlDSWQgPSBHZXRTY3JpcHRWYXJpYWJsZShzaG9ydChHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LZXlTY3JpcHQpKSwgc21TY3JpcHRLZXlzKTsKKworCQkJCWhLQ0hSICAgPSBHZXRSZXNvdXJjZSgnS0NIUicsc2hvcnQoa2V5Q0lkKSk7CisJCQkJS0NIUlB0ciA9ICpoS0NIUjsKKwkJCX0KKworCQkJaWYgKEtDSFJQdHIpIHsKKwkJCQlrZXlJbmZvID0gS2V5VHJhbnMoS0NIUlB0ciwga2V5Q29kZSwgJnN0YXRlKTsKKwkJCQlpZiAoaEtDSFIpCisJCQkJCVJlbGVhc2VSZXNvdXJjZShoS0NIUik7CisJCQl9IGVsc2UKKwkJCQlrZXlJbmZvID0gKCp0aGVFdmVudCkubWVzc2FnZTsKKworCQkJbG93Q2hhciA9ICBrZXlJbmZvICYgIGtNYXNrQVNDSUkyOworCQkJaGlnaENoYXIgPSAoa2V5SW5mbyAmIGtNYXNrQVNDSUkxKSA+PiAxNjsKKwkJCWlmIChsb3dDaGFyID09IGtQZXJpb2QgfHwgaGlnaENoYXIgPT0ga1BlcmlvZCkKKwkJCQlmVGltZVRvUXVpdCA9IHRydWU7CisKKwkJfSAgLy8gZW5kIHRoZSBjb21tYW5kIGtleSBpcyBkb3duCisJfSAgLy8gZW5kIGtleSBkb3duIGV2ZW50CisKKwlyZXR1cm4oIGZUaW1lVG9RdWl0ICk7Cit9CisKK0Jvb2xlYW4gR1VTSUludGVycnVwdCgpCit7CisJRXZRRWxQdHIJCWV2ZW50UTsKKworCWZvciAoZXZlbnRRID0gKEV2UUVsUHRyKSBMTUdldEV2ZW50UXVldWUoKS0+cUhlYWQ7IGV2ZW50UTsgKQorCQlpZiAoQ21kUGVyaW9kKChFdmVudFJlY29yZCAqKSAmZXZlbnRRLT5ldnRRV2hhdCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJZXZlbnRRID0gKEV2UUVsUHRyKWV2ZW50US0+cUxpbms7CisJCisJcmV0dXJuIGZhbHNlOworfQorCitpbnQgU3RhbmRBbG9uZSA9IDE7Citsb25nIGdHVVNJU3BpbkNvbnRyb2wgPSAwOworCitpbnQgR1VTSURlZmF1bHRTcGluKHNwaW5fbXNnIG1zZywgbG9uZyBhcmcpCit7CisJc3RhdGljIEJvb2xlYW4JCQlpbkZvcmVncm91bmQJPQl0cnVlOworCVdpbmRvd1B0cgkJCQl3aW47CisJRXZlbnRSZWNvcmQJCQkJZXY7CisJbG9uZwkJCQkJc2xlZXBUaW1lCT0JNjsJLy8gMS8xMCBvZiBhIHNlY29uZCBieSBkZWZhdWx0CisJc2hvcnQJCQkJCW1hc2sgCQk9IAlvc01hc2t8aGlnaExldmVsRXZlbnRNYXNrfG1Eb3duTWFza3xldnRNYXNrOworCisJR1VTSUNvbmZpZy5BdXRvSW5pdEdyYWYoKTsKKwkKKwlpZiAoaW5Gb3JlZ3JvdW5kKSB7CisJCXJlZ2lzdGVyIGxvbmcgY29udHJpYiA9IChtc2cgPT0gU1BfQVVUT19TUElOKSA/IGFyZyA6IGdHVVNJU3BlZWQ7CisJCWdHVVNJU3BpbkNvbnRyb2wgKz0gY29udHJpYjsKKwkJLy8gVHdlYWsgd2hlbiBhIHNwaW4gcG9pbnQgaGFzIGJlZW4gb3ZlcnNob3QKKwkJUm90YXRlQ3Vyc29yKChnR1VTSVNwaW5Db250cm9sICYgMzEpIDwgY29udHJpYiA/IDMyIDogZ0dVU0lTcGluQ29udHJvbCk7CisJfQorCisJaWYgKEdVU0lJbnRlcnJ1cHQoKSkKKwkJZ290byBpbnRlcnJ1cHQ7CisKKwlpZiAoIVN0YW5kQWxvbmUgJiYgaW5Gb3JlZ3JvdW5kKQkJLy8gRm9yIE1QVyB0b29scywgU3BpbkN1cnNvciBhbHJlYWR5IGNhbGxzIFdORQorCQlpZiAoIUdVU0lDb25maWcubm9BcHBsZUV2ZW50cykJCQkvLyBidXQgaXQgbm8gbG9uZ2VyIHJlcG9ydHMgQXBwbGVFdmVudHMKKwkJCW1hc2sgPSBoaWdoTGV2ZWxFdmVudE1hc2t8ZXZ0TWFzazsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CQkJCQkJCQkKKwkJCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIFNQX1NMRUVQOgorCWNhc2UgU1BfU0VMRUNUOgorCQlpZiAoYXJnID49IHNsZWVwVGltZSkJCQkJLy8gT25seSBzbGVlcCBpZiBwYXRpZW5jZSBndWFyYW50ZWVkCisJCQlicmVhazsKKwkJLy8gT3RoZXJ3aXNlLCBmYWxsIHRocm91Z2gJCisJY2FzZSBTUF9BVVRPX1NQSU46CisJCXNsZWVwVGltZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkKKwlpZiAoV2FpdE5leHRFdmVudChtYXNrLCAmZXYsIHNsZWVwVGltZSwgbmlsKSkKKwkJc3dpdGNoIChldi53aGF0KSB7CisJCWNhc2UgbW91c2VEb3duOgorCQkJaWYgKCFldnRIYW5kbGVyIHx8ICFldnRIYW5kbGVyW21vdXNlRG93bl0pCisJCQkJaWYgKEZpbmRXaW5kb3coZXYud2hlcmUsICZ3aW4pID09IGluU3lzV2luZG93KQorCQkJCQlTeXN0ZW1DbGljaygmZXYsIHdpbik7CisKKwkJCWJyZWFrOworCQljYXNlIG9zRXZ0OgorCQkJaWYgKGV2Lm1lc3NhZ2UgJiAxKQorCQkJCWluRm9yZWdyb3VuZAk9CXRydWU7CisJCQllbHNlCisJCQkJaW5Gb3JlZ3JvdW5kCT0JZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSBrSGlnaExldmVsRXZlbnQ6CisJCQlpZiAoIWV2dEhhbmRsZXIgfHwgIWV2dEhhbmRsZXJba0hpZ2hMZXZlbEV2ZW50XSkKKwkJCQlpZiAoaGFzQXBwbGVFdmVudHMpCQkJCS8vIGFjdHVhbGx5IHByZXR0eSBsaWtlbHksIGlmIHdlIGdldCBITCBFdmVudHMKKwkJCQkJQUVQcm9jZXNzQXBwbGVFdmVudCgmZXYpOwkvLyBJZ25vcmUgZXJyb3JzCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoZXYud2hhdCA+PSAwICYmIGV2LndoYXQgPCAyNCAmJiBldnRIYW5kbGVyICYmIGV2dEhhbmRsZXJbZXYud2hhdF0pCisJCWV2dEhhbmRsZXJbZXYud2hhdF0oJmV2KTsKKworCXJldHVybiAwOworCitpbnRlcnJ1cHQ6CisJRmx1c2hFdmVudHMoLTEsIDApOworCisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRmVhdHVyZSBtZW1iZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGZWF0dXJlOjpGZWF0dXJlKHVuc2lnbmVkIHNob3J0IHRyYXBOdW0sIFRyYXBUeXBlIHRUeXApCit7CisJZ29vZCA9CisJCU5HZXRUcmFwQWRkcmVzcyh0cmFwTnVtLCB0VHlwKSAhPSBOR2V0VHJhcEFkZHJlc3MoX1VuaW1wbGVtZW50ZWQsIFRvb2xUcmFwKTsKK30KKworRmVhdHVyZTo6RmVhdHVyZShPU1R5cGUgdHlwZSwgbG9uZyB2YWx1ZSkKK3sKKwlsb25nCQlhdHRyOworCisJZ29vZCA9ICghR2VzdGFsdCh0eXBlLCAmYXR0cikgJiYgKGF0dHIgPj0gdmFsdWUpKTsKK30KKworRmVhdHVyZTo6RmVhdHVyZShPU1R5cGUgdHlwZSwgbG9uZyBtYXNrLCBsb25nIHZhbHVlKQoreworCWxvbmcJCWF0dHI7CisKKwlnb29kID0gKCFHZXN0YWx0KHR5cGUsICZhdHRyKSAmJiAoKGF0dHIgJiBtYXNrKSA9PSB2YWx1ZSkpOworfQorCitGZWF0dXJlOjpGZWF0dXJlKGNvbnN0IEZlYXR1cmUgJiBwcmVjb25kaXRpb24sIE9TRXJySW5pdGlhbGl6ZXIgaW5pdCkKK3sKKwlnb29kCT0JcHJlY29uZGl0aW9uICYmICFpbml0KCk7Cit9CisKK0ZlYXR1cmU6OkZlYXR1cmUoT1NFcnJJbml0aWFsaXplciBpbml0KQoreworCWdvb2QJPQkhaW5pdCgpOworfQorCitGZWF0dXJlOjpGZWF0dXJlKGNvbnN0IEZlYXR1cmUgJiBwcmVjb25kaXRpb24sIHZvaWRJbml0aWFsaXplciBpbml0KQoreworCWlmIChwcmVjb25kaXRpb24pCXsKKwkJZ29vZCA9IHRydWU7CisJCWluaXQoKTsKKwl9IGVsc2UKKwkJZ29vZCA9IGZhbHNlOworfQorCitGZWF0dXJlOjpGZWF0dXJlKHZvaWRJbml0aWFsaXplciBpbml0KQoreworCWdvb2QgPSB0cnVlOworCWluaXQoKTsKK30KKworRmVhdHVyZTo6RmVhdHVyZShjb25zdCBGZWF0dXJlICYgY29uZDEsIGNvbnN0IEZlYXR1cmUgJiBjb25kMikKK3sKKwlnb29kID0gY29uZDEgJiYgY29uZDI7Cit9CisKK09TRXJyIEFwcGxlVGFsa0lkZW50aXR5KHNob3J0ICYgbmV0LCBzaG9ydCAmIG5vZGUpCit7CisJc3RhdGljIHNob3J0CW15bmV0OworCXN0YXRpYyBzaG9ydAlteW5vZGU7CisJc3RhdGljIE9TRXJyCWVyciA9IDE7CisKKwlpZiAoZXJyID09IDEpCisJCWlmICghKGVyciA9IE1QUE9wZW4oKSkpCisJCQllcnIgPSBHZXROb2RlQWRkcmVzcygmbXlub2RlLCAmbXluZXQpOworCisKKwluZXQJPQlteW5ldDsKKwlub2RlCT0JbXlub2RlOworCisJcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNldHVwIHN1cHBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQcmF5IHRoYXQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBuZXZlciBpbmxpbmVzIEdVU0lTZXR1cCAqLworCit2b2lkIEdVU0lEZWZhdWx0U2V0dXAoKQoreworCUdVU0lTZXR1cChHVVNJd2l0aEFwcGxlVGFsa1NvY2tldHMpOworCUdVU0lTZXR1cChHVVNJd2l0aEludGVybmV0U29ja2V0cyk7CisJR1VTSVNldHVwKEdVU0l3aXRoUEFQU29ja2V0cyk7CisJR1VTSVNldHVwKEdVU0l3aXRoUFBDU29ja2V0cyk7CisJR1VTSVNldHVwKEdVU0l3aXRoVW5peFNvY2tldHMpOworCUdVU0lTZXR1cChHVVNJd2l0aFNJT1VYU29ja2V0cyk7Cit9CisKK3ZvaWQgR1VTSVNldHVwKHZvaWQgKCpwcm9jKSgpKQoreworCXByb2MoKTsKK30KKwordm9pZCBHVVNJTG9hZENvbmZpZ3VyYXRpb24oSGFuZGxlIGhkbCkKK3sKKwlHVVNJQ29uZmlnLkdVU0lMb2FkQ29uZmlndXJhdGlvbihoZGwpOworfQorCisjZW5kaWYgLy8gR1VTSV9ESVNQQVRDSApkaWZmIC0tZ2l0IGEvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJTmV0REIuY3AgYi9NYWMvR1VTSS1tb2RzL2ludG8tc3JjL0dVU0lOZXREQi5jcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQzNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL0dVU0ktbW9kcy9pbnRvLXNyYy9HVVNJTmV0REIuY3AKQEAgLTAsMCArMSw1NzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1Byb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgVW5pZmllZCBTb2NrZXQgSW50ZXJmYWNlCitGaWxlCQk6CUdVU0lOZXREQi5jcAktCUNvbnZlcnQgaW50ZXJuZXQgbmFtZXMgdG8gYWRyZXNzZXMKK0F1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgorCisJVGhpcyBmaWxlIHdhcyBkZXJpdmVkIGZyb20gdGhlIHNvY2tldCBsaWJyYXJ5IGJ5CisKKwkJQ2hhcmxpZSBSZWltYW4JPGNyZWltYW5AbmNzYS51aXVjLmVkdT4gYW5kCisJCVRvbSBNaWxsaWdhbgk8bWlsbGlnYW5AbWFkaGF1cy51dGNzLnV0b3JvbnRvLmNhPgorCitMYW5ndWFnZQk6CU1QVyBDKysKKworJExvZyQKK1JldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozOCAgamFjaworUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KKworUmV2aXNpb24gMS4zICAxOTk0LzA4LzEwICAwMDowNzozMCAgbmVlcmkKK1Nhbml0aXplZCBmb3IgdW5pdmVyc2FsIGhlYWRlcnMuCisKK1JldmlzaW9uIDEuMiAgMTk5NC8wNS8wMSAgMjM6NDM6MzEgIG5lZXJpCitnZXRzZXJ2YnluYW1lKCkgd2l0aG91dCAvZXRjL3NlcnZpY2VzIHdvdWxkIGZhaWwuCisKK1JldmlzaW9uIDEuMSAgMTk5NC8wMi8yNSAgMDI6Mjk6MzYgIG5lZXJpCitJbml0aWFsIHJldmlzaW9uCisKK1JldmlzaW9uIDAuNSAgMTk5My8xMC8zMSAgMDA6MDA6MDAgIG5lZXJpCitEZWZlcnJlZCBvcGVuaW5nIG9mIHJlc29sdmVyCisKK1JldmlzaW9uIDAuNCAgMTk5My8wNy8yOSAgMDA6MDA6MDAgIG5lZXJpCitSZWFsIGdldHNlcnZlbnQgY29kZSAoYWRhcHRlZCBmcm9tIFNhayBXYXRoYW5hc2luKQorCitSZXZpc2lvbiAwLjMgIDE5OTMvMDEvMTkgIDAwOjAwOjAwICBuZWVyaQorQ2FuJ3Qgc2V0IGFsaWFzZXMgdG8gTlVMTC4KKworUmV2aXNpb24gMC4yICAxOTkyLzExLzIxICAwMDowMDowMCAgbmVlcmkKK1JlbW92ZSBmb3JjZV9hY3RpdmUKKworUmV2aXNpb24gMC4xICAxOTkyLzA5LzE0ICAwMDowMDowMCAgbmVlcmkKK01heWJlIGl0IHdvcmtzLCBtYXliZSBpdCBkb2Vzbid0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkdVU0lJTkVUX1AuaCIKKworI2luY2x1ZGUgIlRGaWxlU3BlYy5oIgorI2luY2x1ZGUgIkZvbGRlcnMuaCIKKyNpbmNsdWRlICJQTFN0cmluZ0Z1bmNzLmgiCisKKyNpZmRlZiBfX01XRVJLU19fCisvLworLy8gSSBkaXNhcHByb3ZlIG9mIHRoZSB3YXkgZG5yLmMgaXMgd3JpdHRlbgorLy8gVGhpcyBkaXNhcHByb3ZhbCBnZXRzIHN0cm9uZ2VyIHdpdGggZXZlcnkgdmVyc2lvbgorLy8KKyNpbmNsdWRlICJkbnIuYyIKKyNwcmFnbWEgcmVxdWlyZV9wcm90b3R5cGVzIHJlc2V0CisjcHJhZ21hIGNwbHVzcGx1cyByZXNldAorI2VuZGlmCisKKyNpZiBHRU5FUkFUSU5HNjhLCisjcHJhZ21hIHNlZ21lbnQgR1VTSUlORVQKKyNlbmRpZgorCitzdGF0aWMgcGFzY2FsIHZvaWQgRE5SRG9uZShzdHJ1Y3QgaG9zdEluZm8gKiwgQm9vbGVhbiAqIGRvbmUpCit7CisJKmRvbmUgPSB0cnVlOworfQorCisjaWYgR0VORVJBVElOR0NGTQorUm91dGluZURlc2NyaXB0b3IJdUROUkRvbmUgPSAKKwkJQlVJTERfUk9VVElORV9ERVNDUklQVE9SKHVwcFJlc3VsdFByb2NJbmZvLCBETlJEb25lKTsKKyNlbHNlCisjZGVmaW5lIHVETlJEb25lIEROUkRvbmUKKyNlbmRpZgorCitpbnQgaF9lcnJubzsKKworLyoKKyAqICAgR2V0aG9zdGJ5bmFtZSBhbmQgZ2V0aG9zdGJ5YWRkciBlYWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYW4KKyAqICAgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBJbnRlcm5ldAorICogICBob3N0IHJlZmVyZW5jZWQgYnkgbmFtZSBvciBieSBhZGRyZXNzLCByZXNwZWN0aXZlbHkuIFRoaXMKKyAqICAgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBNYWNUQ1AKKyAqICAgbmFtZSBzZXJ2ZXIuCisgKgorICogICBzdHJ1Y3QgICAgaG9zdGVudAorICogICB7CisgKiAgICAgICAgY2hhciAqaF9uYW1lOworICogICAgICAgIGNoYXIgKipoX2FsaWFzZXM7CisgKiAgICAgICAgaW50ICBoX2FkZHJ0eXBlOworICogICAgICAgIGludCAgaF9sZW5ndGg7CisgKiAgICAgICAgY2hhciAqKmhfYWRkcl9saXN0OworICogICB9OworICogICAjZGVmaW5lICAgaF9hZGRyICBoX2FkZHJfbGlzdFswXQorICoKKyAqICAgVGhlIG1lbWJlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlOgorICoKKyAqICAgaF9uYW1lICAgICAgIE9mZmljaWFsIG5hbWUgb2YgdGhlIGhvc3QuCisgKgorICogICBoX2FsaWFzZXMgICAgQSB6ZXJvIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYWx0ZXJuYXRlIG5hbWVzIGZvciB0aGUgaG9zdC4KKyAqCisgKiAgIGhfYWRkcnR5cGUgICBUaGUgdHlwZSBvZiBhZGRyZXNzIGJlaW5nICByZXR1cm5lZDsgYWx3YXlzIEFGX0lORVQuCisgKgorICogICBoX2xlbmd0aCAgICAgVGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBhZGRyZXNzLgorICoKKyAqICAgaF9hZGRyX2xpc3QgIEEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIG5ldHdvcmsgYWRkcmVzc2VzIGZvciB0aGUgaG9zdC4KKyAqCisgKiAgIEVycm9yIHJldHVybiBzdGF0dXMgZnJvbSBnZXRob3N0YnluYW1lIGFuZCBnZXRob3N0YnlhZGRyICBpcworICogICBpbmRpY2F0ZWQgYnkgcmV0dXJuIG9mIGEgbnVsbCBwb2ludGVyLiAgVGhlIGV4dGVybmFsIGludGVnZXIKKyAqICAgaF9lcnJubyBtYXkgdGhlbiAgYmUgY2hlY2tlZCAgdG8gIHNlZSAgd2hldGhlciAgdGhpcyAgaXMgIGEKKyAqICAgdGVtcG9yYXJ5ICBmYWlsdXJlICBvciAgYW4gIGludmFsaWQgIG9yICB1bmtub3duICBob3N0LiAgVGhlCisgKiAgIHJvdXRpbmUgaGVycm9yICBjYW4gIGJlICB1c2VkICB0byAgcHJpbnQgIGFuIGVycm9yICBtZXNzYWdlCisgKiAgIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUuICBJZiBpdHMgYXJndW1lbnQgc3RyaW5nIGlzIG5vbi1OVUxMLAorICogICBpdCBpcyBwcmludGVkLCBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZCBhIHNwYWNlLiAgIFRoZSAgZXJyb3IKKyAqICAgbWVzc2FnZSBpcyBwcmludGVkIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLgorICoKKyAqICAgaF9lcnJubyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqCisgKiAgICAgSE9TVF9OT1RfRk9VTkQgIE5vIHN1Y2ggaG9zdCBpcyBrbm93bi4KKyAqCisgKiAgICAgVFJZX0FHQUlOCVRoaXMgaXMgdXN1YWxseSBhIHRlbXBvcmFyeSBlcnJvciBhbmQKKyAqCQkJCQltZWFucyAgIHRoYXQgIHRoZSAgbG9jYWwgIHNlcnZlciAgZGlkICBub3QKKyAqCQkJCQlyZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSAgYW4gIGF1dGhvcml0YXRpdmUKKyAqCQkJCQlzZXJ2ZXIuICAgQSAgcmV0cnkgYXQgc29tZSBsYXRlciB0aW1lIG1heQorICoJCQkJCXN1Y2NlZWQuCisgKgorICogICAgIE5PX1JFQ09WRVJZCVNvbWUgdW5leHBlY3RlZCBzZXJ2ZXIgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQuCisgKgkgCQkJCVRoaXMgaXMgYSBub24tcmVjb3ZlcmFibGUgZXJyb3IuCisgKgorICogICAgIE5PX0RBVEEJCVRoZSByZXF1ZXN0ZWQgbmFtZSBpcyB2YWxpZCBidXQgIGRvZXMgIG5vdAorICoJCQkJCWhhdmUgICBhbiBJUCAgYWRkcmVzczsgIHRoaXMgIGlzIG5vdCAgYQorICoJCQkJCXRlbXBvcmFyeSBlcnJvci4gVGhpcyBtZWFucyB0aGF0IHRoZSAgbmFtZQorICoJCQkJCWlzIGtub3duICB0byB0aGUgbmFtZSBzZXJ2ZXIgYnV0IHRoZXJlIGlzCisgKgkJCQkJbm8gYWRkcmVzcyAgYXNzb2NpYXRlZCAgd2l0aCAgdGhpcyAgbmFtZS4KKyAqCQkJCQlBbm90aGVyIHR5cGUgb2YgcmVxdWVzdCB0byB0aGUgbmFtZSBzZXJ2ZXIKKyAqCQkJCQl1c2luZyB0aGlzIGRvbWFpbiBuYW1lIHdpbGwgcmVzdWx0IGluICBhbgorICoJCQkJCWFuc3dlcjsgIGZvciBleGFtcGxlLCBhIG1haWwtZm9yd2FyZGVyIG1heQorICoJCQkJCWJlIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZG9tYWluLgorICoJCQkJCShOT1QgR0VORVJBVEVEIEJZIFRISVMgSU1QTEVNRU5UQVRJT04pCisgKi8KKworc3RhdGljIHN0cnVjdCBob3N0SW5mbyBtYWNIb3N0OworCisjZGVmaW5lIE1BWEFMSUFTRVMgMAorc3RhdGljIGNoYXIgKmFsaWFzUHRyc1tNQVhBTElBU0VTKzFdID0ge05VTEx9Oworc3RhdGljIGlwX2FkZHIgKmFkZHJQdHJzW05VTV9BTFRfQUREUlMrMV07CisKK3N0YXRpYyBzdHJ1Y3QgaG9zdGVudCAgdW5peEhvc3QgPQoreworCW1hY0hvc3QuY25hbWUsCisJYWxpYXNQdHJzLAorCUFGX0lORVQsCisJc2l6ZW9mKGlwX2FkZHIpLAorCShjaGFyICoqKSBhZGRyUHRycworfTsKKworaW5saW5lIHN0cnVjdCBpbl9hZGRyIG1ha2VfaW5fYWRkcihpcF9hZGRyIGFkZHIpCit7CisJc3RydWN0IGluX2FkZHIJcmVzOworCisJcmVzLnNfYWRkcgk9CWFkZHI7CisKKwlyZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgaG9zdGVudCAqIGdldGhvc3RieW5hbWUoY2hhciAqbmFtZSkKK3sKKwlCb29sZWFuIGRvbmU7CisJaW50IGk7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAibG9jYWxob3N0IikpIHsKKwkJaW5fYWRkciBpcGFkZHI7CisKKwkJaXBhZGRyCT0JbWFrZV9pbl9hZGRyKGlwX2FkZHIoZ2V0aG9zdGlkKCkpKTsKKworCQlpZiAoaXBhZGRyLnNfYWRkcikKKwkJCXJldHVybiBnZXRob3N0YnlhZGRyKChjaGFyICopICZpcGFkZHIsIHNpemVvZihpbl9hZGRyKSwgQUZfSU5FVCk7CisKKwkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOworCQkJCisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgeworCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQorCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUzsgaSsrKQorCQltYWNIb3N0LmFkZHJbaV0gPSAwOworCisJZG9uZSA9IGZhbHNlOworCisJaWYgKFN0clRvQWRkcihuYW1lLCAmbWFjSG9zdCwgUmVzdWx0VVBQKCZ1RE5SRG9uZSksIChjaGFyICopICZkb25lKSA9PSBjYWNoZUZhdWx0KQorCQlTUElOUCghZG9uZSxTUF9OQU1FLDBMKTsKKworCXN3aXRjaCAobWFjSG9zdC5ydG5Db2RlKSB7CisJY2FzZSBub0VycjogYnJlYWs7CisKKwljYXNlIG5hbWVTeW50YXhFcnI6CWhfZXJybm8gPSBIT1NUX05PVF9GT1VORDsJcmV0dXJuKE5VTEwpOworCWNhc2UgY2FjaGVGYXVsdDoJCWhfZXJybm8gPSBOT19SRUNPVkVSWTsJCXJldHVybihOVUxMKTsKKwljYXNlIG5vUmVzdWx0UHJvYzoJaF9lcnJubyA9IE5PX1JFQ09WRVJZOwkJcmV0dXJuKE5VTEwpOworCWNhc2Ugbm9OYW1lU2VydmVyOgloX2Vycm5vID0gSE9TVF9OT1RfRk9VTkQ7CXJldHVybihOVUxMKTsKKwljYXNlIGF1dGhOYW1lRXJyOgkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOwlyZXR1cm4oTlVMTCk7CisJY2FzZSBub0Fuc0VycjoJCQloX2Vycm5vID0gVFJZX0FHQUlOOwkJCXJldHVybihOVUxMKTsKKwljYXNlIGRuckVycjoJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7CisJY2FzZSBvdXRPZk1lbW9yeToJCWhfZXJybm8gPSBUUllfQUdBSU47CQkJcmV0dXJuKE5VTEwpOworCWRlZmF1bHQ6CQkJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogd2FzIHRoZSAnbmFtZScgYW4gSVAgYWRkcmVzcz8gKi8KKwlpZiAobWFjSG9zdC5jbmFtZVswXSA9PSAwKSB7CisJCWhfZXJybm8gPSBIT1NUX05PVF9GT1VORDsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCS8qIGZvciBzb21lIHJlYXNvbiB0aGVyZSBpcyBhIGRvdCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lICovCisJaSA9IGludChzdHJsZW4obWFjSG9zdC5jbmFtZSkpIC0gMTsKKwlpZiAobWFjSG9zdC5jbmFtZVtpXSA9PSAnLicpCisJCW1hY0hvc3QuY25hbWVbaV0gPSAwOworCisJZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUyAmJiBtYWNIb3N0LmFkZHJbaV0hPTA7IGkrKykKKwkJYWRkclB0cnNbaV0gPQkoaXBfYWRkciAqKSAmbWFjSG9zdC5hZGRyW2ldOworCisJYWRkclB0cnNbaV0gPSBOVUxMOworCisJcmV0dXJuICZ1bml4SG9zdDsKK30KKworc3RydWN0IGhvc3RlbnQgKiBnZXRob3N0YnlhZGRyKGNvbnN0IGNoYXIgKmFkZHJQLCBpbnQsIGludCkKK3sKKwlCb29sZWFuCWRvbmU7CisJaW50IAkJaTsKKworCWlmIChJTkVUU29ja2V0cy5SZXNvbHZlcigpKSB7CisJCWhfZXJybm8gPSBOT19SRUNPVkVSWTsJCisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaT0wOyBpPE5VTV9BTFRfQUREUlM7IGkrKykKKwkJbWFjSG9zdC5hZGRyW2ldID0gMDsKKworCWRvbmUgPSBmYWxzZTsKKworCWlwX2FkZHIgYWRkciA9IEZJWF9MT09QQkFDSygqKGlwX2FkZHIgKilhZGRyUCk7CisJCisJaWYgKEFkZHJUb05hbWUoYWRkciwgJm1hY0hvc3QsIFJlc3VsdFVQUCgmdUROUkRvbmUpLCAoY2hhciAqKSAmZG9uZSkgPT0gY2FjaGVGYXVsdCkKKwkJU1BJTlAoIWRvbmUsU1BfQUREUiwwTCk7CisKKwlzd2l0Y2ggKG1hY0hvc3QucnRuQ29kZSkgeworCWNhc2Ugbm9FcnI6IAkJCWJyZWFrOworCisJY2FzZSBjYWNoZUZhdWx0OgkJaF9lcnJubyA9IE5PX1JFQ09WRVJZOwkJcmV0dXJuKE5VTEwpOworCWNhc2Ugbm9OYW1lU2VydmVyOgloX2Vycm5vID0gSE9TVF9OT1RfRk9VTkQ7CXJldHVybihOVUxMKTsKKwljYXNlIGF1dGhOYW1lRXJyOgkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOwlyZXR1cm4oTlVMTCk7CisJY2FzZSBub0Fuc0VycjoJCQloX2Vycm5vID0gVFJZX0FHQUlOOwkJCXJldHVybihOVUxMKTsKKwljYXNlIGRuckVycjoJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7CisJY2FzZSBvdXRPZk1lbW9yeToJCWhfZXJybm8gPSBUUllfQUdBSU47CQkJcmV0dXJuKE5VTEwpOworCWRlZmF1bHQ6CQkJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7CisJfQorCisJLyogZm9yIHNvbWUgcmVhc29uIHRoZXJlIGlzIGEgZG90IGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUgKi8KKwlpID0gaW50KHN0cmxlbihtYWNIb3N0LmNuYW1lKSkgLSAxOworCWlmIChtYWNIb3N0LmNuYW1lW2ldID09ICcuJykKKwkJbWFjSG9zdC5jbmFtZVtpXSA9IDA7CisKKwkvKiBGb3Igc29tZSByZWFzb24sIHRoZSBJUCBhZGRyZXNzIHVzdWFsbHkgc2VlbXMgdG8gYmUgc2V0IHRvIDAgKi8KKwlpZiAoIW1hY0hvc3QuYWRkclswXSkKKwkJbWFjSG9zdC5hZGRyWzBdID0gYWRkcjsKKwkJCisJZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUzsgaSsrKQorCQlhZGRyUHRyc1tpXSA9IChpcF9hZGRyICopICZtYWNIb3N0LmFkZHJbaV07CisKKwlhZGRyUHRyc1tOVU1fQUxUX0FERFJTXSA9IE5VTEw7CisKKwlyZXR1cm4gJnVuaXhIb3N0OworfQorCitjaGFyICogaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluYWRkcikKK3sKKwlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgeworCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQorCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJKHZvaWQpIEFkZHJUb1N0cihpbmFkZHIuc19hZGRyLCBtYWNIb3N0LmNuYW1lKTsKKworCXJldHVybiBtYWNIb3N0LmNuYW1lOworfQorCitzdHJ1Y3QgaW5fYWRkciBpbmV0X2FkZHIoY2hhciAqYWRkcmVzcykKK3sKKwlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgeworCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQorCQlyZXR1cm4gbWFrZV9pbl9hZGRyKDB4RkZGRkZGRkYpOworCX0KKwkKKwlpZiAoU3RyVG9BZGRyKGFkZHJlc3MsJm1hY0hvc3QsTlVMTCxOVUxMKSAhPSBub0VycikKKwkJcmV0dXJuIG1ha2VfaW5fYWRkcigweEZGRkZGRkZGKTsKKworCS8qIHdhcyB0aGUgJ2FkZHJlc3MnIHJlYWxseSBhIG5hbWU/ICovCisJaWYgKG1hY0hvc3QuY25hbWVbMF0gIT0gMCkKKwkJcmV0dXJuIG1ha2VfaW5fYWRkcigweEZGRkZGRkZGKTsKKworCXJldHVybiBtYWtlX2luX2FkZHIobWFjSG9zdC5hZGRyWzBdKTsKK30KKworLyoKKyAqIGdldGhvc3RpZCgpCisgKgorICogR2V0IGludGVybmV0IGFkZHJlc3Mgb2YgY3VycmVudCBob3N0CisgKi8KKworbG9uZyBnZXRob3N0aWQoKQoreworCXN0YXRpYyBsb25nIHNIb3N0SUQgPSAwOworCWlmIChzSG9zdElEKQorCQlyZXR1cm4gc0hvc3RJRDsKKwkKKwlzdHJ1Y3QgR2V0QWRkclBhcmFtQmxvY2sgcGJyOworCQkKKwlwYnIuaW9DUmVmTnVtIAk9IElORVRTb2NrZXRzLkRyaXZlcigpOworCXBici5jc0NvZGUgCQk9IGlwY3RsR2V0QWRkcjsKKworCWlmIChQQkNvbnRyb2xTeW5jKFBhcm1CbGtQdHIoJnBicikpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBzSG9zdElEID0gKGxvbmcpcGJyLm91ckFkZHJlc3M7Cit9CisKKy8qCisgKiBnZXRob3N0bmFtZSgpCisgKgorICogVHJ5IHRvIGdldCBteSBob3N0IG5hbWUgZnJvbSBETlIuIElmIGl0IGZhaWxzLCBqdXN0IHJldHVybiBteQorICogSVAgYWRkcmVzcyBhcyBBU0NJSS4gVGhpcyBpcyBub24tc3RhbmRhcmQsIGJ1dCBpdCdzIGEgbWFjLAorICogd2hhdCBkbyB5b3Ugd2FudCBtZSB0byBkbz8KKyAqLworCitpbnQgZ2V0aG9zdG5hbWUoY2hhciAqbWFjaG5hbWUsIGludCBidWZsZW4pCit7CisJc3RhdGljIGNoYXIgKiBzSG9zdE5hbWUgPSBuaWw7CisJCisJaWYgKCFzSG9zdE5hbWUpIHsKKwkJaW5fYWRkciBpcGFkZHI7CisJCXN0cnVjdAlob3N0ZW50ICpocDsKKworCQlpcGFkZHIJPQltYWtlX2luX2FkZHIoaXBfYWRkcihnZXRob3N0aWQoKSkpOworCisJCWlmICghaXBhZGRyLnNfYWRkcikgCQkJCQkvLyBUQ1AvSVAgbm90IHVwIGF0IGFsbAorCQkJcmV0dXJuIEdVU0lfZXJyb3IoRU5FVERPV04pOworCQkKKwkJaHAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZpcGFkZHIsIHNpemVvZihpbl9hZGRyKSwgQUZfSU5FVCk7CisKKwkJaWYgKCFocCkgeworCQkJLy8gTm8gZ29vZCBuYW1lCisJCQlpZiAoYnVmbGVuIDwgMTYpCQkJCQkJLy8gTm90IGVub3VnaCBzcGFjZQorCQkJCXJldHVybiBHVVNJX2Vycm9yKEVJTlZBTCk7CQorCQkJc3ByaW50ZihtYWNobmFtZSwgIiVkLiVkLiVkLiVkIiwKKwkJCQkJCQlpcGFkZHIuc19hZGRyPj4yNCwKKwkJCQkJCQlpcGFkZHIuc19hZGRyPj4xNiAmIDB4ZmYsCisJCQkJCQkJaXBhZGRyLnNfYWRkcj4+OCAmIDB4ZmYsCisJCQkJCQkJaXBhZGRyLnNfYWRkciAmIDB4ZmYpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvLyBXZSBvbmx5IGNhY2hlIHNhdGlzZmFjdG9yeSByZXBsaWVzIGluIHNIb3N0TmFtZQorCQkJc0hvc3ROYW1lID0gbmV3IGNoYXJbc3RybGVuKGhwLT5oX25hbWUpKzFdOworCQkJc3RyY3B5KHNIb3N0TmFtZSwgaHAtPmhfbmFtZSk7CisJCX0KKwl9CisJc3RybmNweShtYWNobmFtZSwgc0hvc3ROYW1lLCB1bnNpZ25lZChidWZsZW4pKTsKKwltYWNobmFtZVtidWZsZW4tMV0gPSAwOyAgLyogZXh0cmEgc2FmZWd1YXJkICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZ2V0c2VydmJ5Ym5hbWUoKQorICoKKyAqLworCitzdGF0aWMgY2hhciAqIHNlcnZsaXN0W10gPQoreworCSJlY2hvICAgCQkgIDcvdWRwIiwKKwkiZGlzY2FyZCAgIAkgIDkvdWRwIiwKKwkidGltZSAgIAkJIDM3L3VkcCIsCisJImRvbWFpbiAgIAkgNTMvdWRwIiwKKwkic3VucnBjICAgCTExMS91ZHAiLAorCSJ0ZnRwICAJCSA2OS91ZHAiLAorCSJiaWZmICAgCQk1MTIvdWRwIiwKKwkid2hvICAgCQk1MTMvdWRwIiwKKwkidGFsayAgIAkJNTE3L3VkcCIsCisJImZ0cC1kYXRhICAJIDIwL3RjcCIsCisJImZ0cCAgCQkgMjEvdGNwIiwKKwkidGVsbmV0ICAJIDIzL3RjcCIsCisJInNtdHAgIAkJIDI1L3RjcCIsCisJInRpbWUgIAkJIDM3L3RjcCIsCisJIndob2lzICAJCSA0My90Y3AiLAorCSJkb21haW4gCSAJIDUzL3RjcCIsCisJImhvc3RuYW1lcyAgMTAxL3RjcCIsCisJIm5udHAgICAJCTExOS90Y3AiLAorCSJmaW5nZXIgIAkgNzkvdGNwIiwKKwkibnRwICAgCQkxMjMvdGNwIiwKKwkidXVjcCAgIAkJNTQwL3RjcCIsCisJTlVMTAorfTsKKworc3RhdGljIGNoYXIgCQkJCXNlcnZsaW5lWzEyOF07CitzdGF0aWMgc3RydWN0IHNlcnZlbnQJc2VydjsKK3N0YXRpYyBGSUxFICogCQkJCXNlcnZmaWw7CitzdGF0aWMgaW50CQkJCQlzZXJ2cHRyOworc3RhdGljIGNoYXIgKgkJCQlzZXJ2YWxpYXNbOF07CitzdGF0aWMgaW50CQkJCQlzZXJ2c3RheSA9IDA7CisKK3ZvaWQgc2V0c2VydmVudChpbnQgc3RheW9wZW4pCit7CisJaWYgKHNlcnZmaWwgJiYgc2VydmZpbCAhPSAoRklMRSAqKSAtMSkgeworCQlyZXdpbmQoc2VydmZpbCk7CisJfQorCXNlcnZwdHIJPSAwOworCXNlcnZzdGF5ID0gc2VydnN0YXkgfHwgc3RheW9wZW47Cit9CisKK3ZvaWQgZW5kc2VydmVudCgpCit7CisJaWYgKHNlcnZmaWwgJiYgc2VydmZpbCAhPSAoRklMRSAqKSAtMSkgeworCQlmY2xvc2Uoc2VydmZpbCk7CisJCXNlcnZmaWwgPSBOVUxMOworCX0KKwkKKwlzZXJ2c3RheSA9IDA7Cit9CisKK3N0cnVjdCBzZXJ2ZW50ICogIGdldHNlcnZlbnQoKQoreworCWNoYXIgKglwOworCWludAkJYWxpYXNjb3VudDsKKwkKKwlpZiAoIXNlcnZmaWwpIHsKKwkJVEZpbGVTcGVjIHNlcnY7CisJCQorCQlpZiAoIUZpbmRGb2xkZXIoCisJCQkJa09uU3lzdGVtRGlzaywgCisJCQkJa1ByZWZlcmVuY2VzRm9sZGVyVHlwZSwgCisJCQkJa0RvbnRDcmVhdGVGb2xkZXIsIAorCQkJCSZzZXJ2LnZSZWZOdW0sCisJCQkJJnNlcnYucGFySUQpCisJCSkgeworCQkJUExzdHJjcHkoc2Vydi5uYW1lLCAoU3RyaW5nUHRyKSAiXHAvZXRjL3NlcnZpY2VzIik7CisJCQorCQkJaWYgKHNlcnZmaWwgPSBmb3BlbihzZXJ2LkZ1bGxQYXRoKCksICJyIikpCisJCQkJZ290byByZXRyeTsKKwkJfQkKKwkJc2VydmZpbCAJPSAoRklMRSAqKSAtMTsKKwkJc2VydnB0cgk9IDA7CisJfQorCQorcmV0cnk6CisJaWYgKHNlcnZmaWwgPT0gKEZJTEUgKikgLTEpCisJCWlmICghc2Vydmxpc3Rbc2VydnB0cl0pCisJCQlyZXR1cm4gKHN0cnVjdCBzZXJ2ZW50ICopIE5VTEw7CisJCWVsc2UKKwkJCXN0cmNweShzZXJ2bGluZSwgc2Vydmxpc3Rbc2VydnB0cisrXSk7CisJZWxzZSBpZiAoIShmZ2V0cyhzZXJ2bGluZSwgMTI4LCBzZXJ2ZmlsKSkpCisJCXJldHVybiAoc3RydWN0IHNlcnZlbnQgKikgTlVMTDsKKwkJCisJaWYgKHAgPSBzdHJwYnJrKHNlcnZsaW5lLCAiI1xuXHIiKSkKKwkJKnAgPSAwOworCWlmICghc2VydmxpbmVbMF0pCisJCWdvdG8gcmV0cnk7CisJCisJaWYgKCEoc2Vydi5zX25hbWUgPSBzdHJ0b2soc2VydmxpbmUsICIgXHQiKSkpCisJCWdvdG8gcmV0cnk7CisJCQorCWlmICghKHAgPSBzdHJ0b2soTlVMTCwgIiBcdCIpKSkKKwkJZ290byByZXRyeTsKKwkKKwlpZiAoIShzZXJ2LnNfcHJvdG8gPSBzdHJwYnJrKHAsICIvLCIpKSkKKwkJZ290byByZXRyeTsKKwkJCisJKnNlcnYuc19wcm90bysrIAk9IDA7CisJc2Vydi5zX3BvcnQgCQk9IGh0b25zKGF0b2kocCkpOworCXNlcnYuc19hbGlhc2VzIAk9IHNlcnZhbGlhczsKKwkKKwlmb3IgKGFsaWFzY291bnQgPSAwOyBhbGlhc2NvdW50IDwgNzsgKSAKKwkJaWYgKCEoc2VydmFsaWFzW2FsaWFzY291bnQrK10gPSBzdHJ0b2soTlVMTCwgIiBcdCIpKSkKKwkJCWJyZWFrOworCQorCXNlcnZhbGlhc1thbGlhc2NvdW50XSA9IE5VTEw7CisJCisJcmV0dXJuICZzZXJ2OworfQorCitzdHJ1Y3Qgc2VydmVudCAqIGdldHNlcnZieW5hbWUoY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBwcm90bykKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqIAllbnQ7CisJY2hhciAqKiAJCQkJYWw7CisJc2V0c2VydmVudCgwKTsKKwkKKwl3aGlsZSAoZW50ID0gZ2V0c2VydmVudCgpKSB7CisJCWlmICghc3RyY21wKG5hbWUsIGVudC0+c19uYW1lKSkKKwkJCWdvdG8gaGF2ZU5hbWU7CisJCQorCQlmb3IgKGFsID0gZW50LT5zX2FsaWFzZXM7ICphbDsgKythbCkKKwkJCWlmICghc3RyY21wKG5hbWUsICphbCkpCisJCQkJZ290byBoYXZlTmFtZTsKKwkJCisJCWNvbnRpbnVlOworaGF2ZU5hbWU6CisJCWlmICghcHJvdG8gfHwgIXN0cmNtcChwcm90bywgZW50LT5zX3Byb3RvKSkKKwkJCWJyZWFrOworCX0KKwkKKwlpZiAoIXNlcnZzdGF5KQorCQllbmRzZXJ2ZW50KCk7CisJCisJcmV0dXJuIGVudDsKK30KKworc3RydWN0IHNlcnZlbnQgKiBnZXRzZXJ2Ynlwb3J0KGludCBwb3J0LCBjb25zdCBjaGFyICogcHJvdG8pCit7CisJc3RydWN0IHNlcnZlbnQgKiBlbnQ7CisJCisJc2V0c2VydmVudCgwKTsKKwkKKwl3aGlsZSAoZW50ID0gZ2V0c2VydmVudCgpKQorCQlpZiAocG9ydCA9PSBlbnQtPnNfcG9ydCAmJiAoIXByb3RvIHx8ICFzdHJjbXAocHJvdG8sIGVudC0+c19wcm90bykpKQorCQkJYnJlYWs7CisJCisJaWYgKCFzZXJ2c3RheSkKKwkJZW5kc2VydmVudCgpOworCQorCXJldHVybiBlbnQ7Cit9CisKK3N0YXRpYwljaGFyCXRjcFtdID0gInRjcCI7CitzdGF0aWMJY2hhcgl1ZHBbXSA9ICJ1ZHAiOworI2RlZmluZQlNQVhfUFJPVE9FTlQJCQkxMAorc3RhdGljIAlzdHJ1Y3QgcHJvdG9lbnQJCXByb3RvZW50c1tNQVhfUFJPVE9FTlRdOworc3RhdGljIAlpbnQJCQkJCQlwcm90b2VudF9jb3VudD0wOworCitzdHJ1Y3QgcHJvdG9lbnQgKiBnZXRwcm90b2J5bmFtZShjb25zdCBjaGFyICogbmFtZSkKK3sKKwlzdHJ1Y3QgcHJvdG9lbnQgKnBlOworCisJcGUgPSAmcHJvdG9lbnRzW3Byb3RvZW50X2NvdW50XTsKKwlpZiAoc3RyY21wKG5hbWUsICJ1ZHAiKSA9PSAwKSB7CisJCXBlLT5wX25hbWUgPSB1ZHA7CisJCXBlLT5wX3Byb3RvID0gSVBQUk9UT19VRFA7CisJfSBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ0Y3AiKSA9PSAwKSAgeworCQlwZS0+cF9uYW1lID0gdGNwOworCQlwZS0+cF9wcm90byA9IElQUFJPVE9fVENQOworCX0gZWxzZSB7CisJCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcGUtPnBfYWxpYXNlcyA9IGFsaWFzUHRyczsKKwlwcm90b2VudF9jb3VudCA9IChwcm90b2VudF9jb3VudCArMSkgJSBNQVhfUFJPVE9FTlQ7CisJcmV0dXJuIHBlOworfQorCitzdHJ1Y3QgcHJvdG9lbnQgKiBnZXRwcm90b2J5bnVtYmVyKGludCBwcm90bykKK3sKKwlzdHJ1Y3QgcHJvdG9lbnQgKnBlOworCisJcGUgPSAmcHJvdG9lbnRzW3Byb3RvZW50X2NvdW50XTsKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApIHsKKwkJcGUtPnBfbmFtZSA9IHVkcDsKKwkJcGUtPnBfcHJvdG8gPSBJUFBST1RPX1VEUDsKKwl9IGVsc2UgaWYgKHByb3RvID09IElQUFJPVE9fVENQKSAgeworCQlwZS0+cF9uYW1lID0gdGNwOworCQlwZS0+cF9wcm90byA9IElQUFJPVE9fVENQOworCX0gZWxzZSB7CisJCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcGUtPnBfYWxpYXNlcyA9IGFsaWFzUHRyczsKKwlwcm90b2VudF9jb3VudCA9IChwcm90b2VudF9jb3VudCArMSkgJSBNQVhfUFJPVE9FTlQ7CisJcmV0dXJuIHBlOworfQorCmRpZmYgLS1naXQgYS9NYWMvR1VTSS1tb2RzL2ludG8tc3JjL0dVU0lTSU9VWC5jcCBiL01hYy9HVVNJLW1vZHMvaW50by1zcmMvR1VTSVNJT1VYLmNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Yjk4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvR1VTSS1tb2RzL2ludG8tc3JjL0dVU0lTSU9VWC5jcApAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUHJvamVjdAk6CUdVU0kJCQkJLQlHcmFuZCB1bmlmaWVkIHNvY2tldCBpbnRlcmZhY2UKK0ZpbGUJCToJR1VTSVNJT1VYLmNwCS0JSW50ZXJmYWNlIHRvIE1ldHJvd2Vya3MgU0lPVVggbGlicmFyeQorQXV0aG9yCToJTWF0dGhpYXMgTmVlcmFjaGVyCitMYW5ndWFnZQk6CU1QVyBDL0MrKworCiskTG9nJAorUmV2aXNpb24gMS4xICAxOTk4LzA4LzE4IDE0OjUyOjM4ICBqYWNrCitQdXR0aW5nIFB5dGhvbi1zcGVjaWZpYyBHVVNJIG1vZGlmaWNhdGlvbnMgdW5kZXIgQ1ZTLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxHVVNJRmlsZV9QLmg+CisjaW5jbHVkZSA8aW9jdGwuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisKKyNpbmNsdWRlIDxFdmVudHMuaD4KKyNpbmNsdWRlIDxMb3dNZW0uaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBTSU9VWFNvY2tldCBtZW1iZXJzICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBkZWNsYXJhdGlvbiBsaWVzIGFib3V0IHRoZSByZXR1cm4gdHlwZSAqLworZXh0ZXJuICJDIiB2b2lkIFNJT1VYSGFuZGxlT25lRXZlbnQoRXZlbnRSZWNvcmQgKnVzZXJldmVudCk7CisKK0dVU0lFdnRIYW5kbGVyCUdVU0lTSU9VWEV2ZW50c1tdCT0JeworCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyBudWxsRXZlbnQKKwkKKwlTSU9VWEhhbmRsZU9uZUV2ZW50LAkJLy8gbW91c2VEb3duCisJU0lPVVhIYW5kbGVPbmVFdmVudCwJCS8vIG1vdXNlVXAKKwluaWwsCQkJCQkJCS8vIGtleURvd24KKwluaWwsCisJCisJbmlsLAkJCQkJCQkvLyBhdXRvS2V5CisJU0lPVVhIYW5kbGVPbmVFdmVudCwJCS8vIHVwZGF0ZUV2dAorCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyBkaXNrRXZ0CisJU0lPVVhIYW5kbGVPbmVFdmVudCwJCS8vIGFjdGl2YXRlRXZ0CisJCisJbmlsLAorCW5pbCwKKwluaWwsCisJbmlsLAorCQorCW5pbCwKKwluaWwsCisJU0lPVVhIYW5kbGVPbmVFdmVudCwJCS8vIG9zRXZ0CisJbmlsLAorCQorCW5pbCwKKwluaWwsCisJbmlsLAorCW5pbCwKKwkKKwluaWwsCisJbmlsLAorCW5pbCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogRGVjbGFyYXRpb24gb2YgU0lPVVhTb2NrZXQgKioqKioqKioqKioqKioqKioqKioqKioqLworCitjbGFzcyBTSU9VWFNvY2tldCA6IHB1YmxpYyBTb2NrZXQJewkJCisJZnJpZW5kIGNsYXNzIFNJT1VYU29ja2V0RG9tYWluOwkKKwkKKwkJCQkJU0lPVVhTb2NrZXQoKTsKKwkJCQkJCisJdmlydHVhbCAJCX5TSU9VWFNvY2tldCgpOworcHJvdGVjdGVkOgorCWludAkJCWluaXRpYWxpemVkOworCXZvaWQJCQlEb0luaXRpYWxpemUodm9pZCk7CitwdWJsaWM6CisJdmlydHVhbCBpbnQJcmVhZCh2b2lkICogYnVmZmVyLCBpbnQgYnVmbGVuKTsKKwl2aXJ0dWFsIGludCB3cml0ZSh2b2lkICogYnVmZmVyLCBpbnQgYnVmbGVuKTsKKwl2aXJ0dWFsIGludCBzZWxlY3QoQm9vbGVhbiAqIGNhblJlYWQsIEJvb2xlYW4gKiBjYW5Xcml0ZSwgQm9vbGVhbiAqIGV4Y2VwdGlvbik7CisJdmlydHVhbCBpbnQJaW9jdGwodW5zaWduZWQgaW50IHJlcXVlc3QsIHZvaWQgKmFyZ3ApOworCXZpcnR1YWwgaW50CWlzYXR0eSgpOworfTsJCisKK2NsYXNzIFNJT1VYU29ja2V0RG9tYWluIDogcHVibGljIEZpbGVTb2NrZXREb21haW4geworCVNJT1VYU29ja2V0ICoJc2luZ2xldG9uOworcHVibGljOgorCVNJT1VYU29ja2V0RG9tYWluKCkJOglGaWxlU29ja2V0RG9tYWluKEFGX1VOU1BFQywgdHJ1ZSwgZmFsc2UpLCBzaW5nbGV0b24obmlsKQl7CX0KKwkKKwl2aXJ0dWFsIEJvb2xlYW4gWW91cnMoY29uc3QgR1VTSUZpbGVSZWYgJiByZWYsIFJlcXVlc3QgcmVxdWVzdCk7CisJdmlydHVhbCBTb2NrZXQgKiBvcGVuKGNvbnN0IEdVU0lGaWxlUmVmICYgcmVmLCBpbnQgb2ZsYWcpOworfTsKKworI2lmIEdFTkVSQVRJTkc2OEsKKyNwcmFnbWEgc2VnbWVudCBTSU9VWAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogU0lPVVhTb2NrZXQgbWVtYmVycyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgU0lPVVhTb2NrZXQ6OkRvSW5pdGlhbGl6ZSgpCit7CisJaWYgKCBpbml0aWFsaXplZCApIHJldHVybjsKKwlpbml0aWFsaXplZCsrOworCUluc3RhbGxDb25zb2xlKDApOworCUdVU0lTZXRFdmVudHMoR1VTSVNJT1VYRXZlbnRzKTsKK30KKworU0lPVVhTb2NrZXQ6OlNJT1VYU29ja2V0KCkKK3sKKwlpbml0aWFsaXplZCA9IDA7CisJaWYgKCAhR1VTSUNvbmZpZy5EZWxheUNvbnNvbGUoKSApCisJCURvSW5pdGlhbGl6ZSgpOworfQorCitTSU9VWFNvY2tldDo6flNJT1VYU29ja2V0KCkKK3sKKwlSZW1vdmVDb25zb2xlKCk7Cit9CisKK2ludCBTSU9VWFNvY2tldDo6aW9jdGwodW5zaWduZWQgaW50IHJlcXVlc3QsIHZvaWQgKikKK3sKKwlpZiAoICFpbml0aWFsaXplZCkgRG9Jbml0aWFsaXplKCk7CisJc3dpdGNoIChyZXF1ZXN0KQl7CisJY2FzZSBGSU9JTlRFUkFDVElWRToKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEdVU0lfZXJyb3IoRU9QTk9UU1VQUCk7CisJfQorfQorCitpbnQgU0lPVVhTb2NrZXQ6OnJlYWQodm9pZCAqIGJ1ZmZlciwgaW50IGJ1ZmxlbikKK3sKKwlpZiAoICFpbml0aWFsaXplZCkgRG9Jbml0aWFsaXplKCk7CisJZmZsdXNoKHN0ZG91dCk7CisJCisJcmV0dXJuIFJlYWRDaGFyc0Zyb21Db25zb2xlKChjaGFyICopIGJ1ZmZlciwgYnVmbGVuKTsKK30KKworaW50IFNJT1VYU29ja2V0Ojp3cml0ZSh2b2lkICogYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWlmICggIWluaXRpYWxpemVkKSBEb0luaXRpYWxpemUoKTsKKwlyZXR1cm4gV3JpdGVDaGFyc1RvQ29uc29sZSgoY2hhciAqKSBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK3N0YXRpYyBCb29sZWFuIGlucHV0X3BlbmRpbmcoKQoreworCVFIZHJQdHIgZXZlbnRRdWV1ZSA9IExNR2V0RXZlbnRRdWV1ZSgpOworCUV2UUVsUHRyIGVsZW1lbnQgPSAoRXZRRWxQdHIpZXZlbnRRdWV1ZS0+cUhlYWQ7CisJCisJLy8gbm93LCBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcga2V5RG93biBldmVudHMuCisJd2hpbGUgKGVsZW1lbnQgIT0gbmlsKSB7CisJCWlmIChlbGVtZW50LT5ldnRRV2hhdCA9PSBrZXlEb3duIHx8IGVsZW1lbnQtPmV2dFFXaGF0ID09IGF1dG9LZXkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxlbWVudCA9IChFdlFFbFB0cillbGVtZW50LT5xTGluazsKKwl9CisJCisJcmV0dXJuIGZhbHNlOworfQorCitpbnQgU0lPVVhTb2NrZXQ6OnNlbGVjdChCb29sZWFuICogY2FuUmVhZCwgQm9vbGVhbiAqIGNhbldyaXRlLCBCb29sZWFuICogZXhjZXB0aW9uKQoreworCWludAkJZ29vZGllcyAJPSAJMDsKKwkJCisJaWYgKCAhaW5pdGlhbGl6ZWQpIERvSW5pdGlhbGl6ZSgpOworCWZmbHVzaChzdGRvdXQpOworCQorCWlmIChjYW5SZWFkKSAKKwkJaWYgKCpjYW5SZWFkID0gaW5wdXRfcGVuZGluZygpKQorCQkJKytnb29kaWVzOworCQorCWlmIChjYW5Xcml0ZSkgeworCQkqY2FuV3JpdGUgPSB0cnVlOworCQkrK2dvb2RpZXM7CisJfQorCQorCWlmIChleGNlcHRpb24pCisJCSpleGNlcHRpb24gPSBmYWxzZTsKKwkKKwlyZXR1cm4gZ29vZGllczsKK30KKworaW50IFNJT1VYU29ja2V0Ojppc2F0dHkoKQoreworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqIFNJT1VYU29ja2V0RG9tYWluIG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIE1TTEdVU0kKKyNpZm5kZWYgU0ZJT0dVU0kKKwlleHRlcm4gdm9pZCBHVVNJU2V0dXBNU0xTSU9VWCgpOworI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuICJDIiB2b2lkIEdVU0l3aXRoU0lPVVhTb2NrZXRzKCkKK3sKKwlzdGF0aWMgU0lPVVhTb2NrZXREb21haW4JU0lPVVhTb2NrZXRzOworCVNJT1VYU29ja2V0cy5Eb250U3RyaXAoKTsKKyNpZmRlZiBNU0xHVVNJCisjaWZuZGVmIFNGSU9HVVNJCisJR1VTSVNldHVwTVNMU0lPVVgoKTsKKyNlbmRpZgorI2VuZGlmCit9CisKK0Jvb2xlYW4gU0lPVVhTb2NrZXREb21haW46OllvdXJzKGNvbnN0IEdVU0lGaWxlUmVmICYgcmVmLCBGaWxlU29ja2V0RG9tYWluOjpSZXF1ZXN0IHJlcXVlc3QpCit7CisJaWYgKHJlZi5zcGVjIHx8IChyZXF1ZXN0ICE9IHdpbGxPcGVuICYmIHJlcXVlc3QgIT0gd2lsbFN0YXQpKQorCQlyZXR1cm4gZmFsc2U7CisJCisJc3dpdGNoIChyZWYubmFtZVs0XSB8IDB4MjApIHsKKwljYXNlICdzJzoKKwkJaWYgKChyZWYubmFtZVs1XSB8IDB4MjApICE9ICd0JyB8fCAocmVmLm5hbWVbNl0gfCAweDIwKSAhPSAnZCcpCisJCQlyZXR1cm4gZmFsc2U7CisJCXN3aXRjaCAocmVmLm5hbWVbN10gfCAweDIwKSB7CisJCWNhc2UgJ2knOgorCQkJaWYgKChyZWYubmFtZVs4XSB8IDB4MjApICE9ICduJyB8fCByZWYubmFtZVs5XSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSAnbyc6CisJCQlpZiAoKHJlZi5uYW1lWzhdIHwgMHgyMCkgIT0gJ3UnIHx8IChyZWYubmFtZVs5XSB8IDB4MjApICE9ICd0JyB8fCByZWYubmFtZVsxMF0pCisJCQkJcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIHRydWU7CisJCWNhc2UgJ2UnOgorCQkJaWYgKChyZWYubmFtZVs4XSB8IDB4MjApICE9ICdyJyB8fCAocmVmLm5hbWVbOV0gfCAweDIwKSAhPSAncicgfHwgcmVmLm5hbWVbMTBdKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJY2FzZSAnYyc6CisJCWlmICgJKHJlZi5uYW1lWzVdIHwgMHgyMCkgIT0gJ28nIHx8IChyZWYubmFtZVs2XSB8IDB4MjApICE9ICduJworCQkJfHwgKHJlZi5uYW1lWzddIHwgMHgyMCkgIT0gJ3MnIHx8IChyZWYubmFtZVs4XSB8IDB4MjApICE9ICdvJworCQkJfHwgKHJlZi5uYW1lWzldIHwgMHgyMCkgIT0gJ2wnIHx8IChyZWYubmFtZVsxMF0gfCAweDIwKSAhPSAnZScpCisJCQlyZXR1cm4gZmFsc2U7CisJCXN3aXRjaCAocmVmLm5hbWVbMTFdKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworU29ja2V0ICogU0lPVVhTb2NrZXREb21haW46Om9wZW4oY29uc3QgR1VTSUZpbGVSZWYgJiwgaW50KQoreworCWlmICghc2luZ2xldG9uKQorCQlzaW5nbGV0b24gPSBuZXcgU0lPVVhTb2NrZXQoKTsKKwkrKypzaW5nbGV0b247CisJCisJcmV0dXJuIHNpbmdsZXRvbjsKK30K