LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogTW9kdWxlIE5hbWU6IFRyYWNlCiAqIC0tLQogKiBNb2R1bGUgRGVzY3JpcHRpb246IFVzZWQgdG8gcHJvdmlkZSBkZWJ1Z2dpbmcgSW5mb3JtYXRpb24KICoKICogQ29weXJpZ2h0IKkgMjAwMi0yMDA1LCBTaWxpY29uIEltYWdlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBObyBwYXJ0IG9mIHRoaXMgd29yayBtYXkgYmUgcmVwcm9kdWNlZCwgbW9kaWZpZWQsIGRpc3RyaWJ1dGVkLCB0cmFuc21pdHRlZCwKICogdHJhbnNjcmliZWQsIG9yIHRyYW5zbGF0ZWQgaW50byBhbnkgbGFuZ3VhZ2Ugb3IgY29tcHV0ZXIgZm9ybWF0LCBpbiBhbnkgZm9ybQogKiBvciBieSBhbnkgbWVhbnMgd2l0aG91dCB3cml0dGVuIHBlcm1pc3Npb24gb2Y6IFNpbGljb24gSW1hZ2UsIEluYy4sCiAqIDEwNjAgRWFzdCBBcnF1ZXMgQXZlbnVlLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEgOTQwODUKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaW5jbHVkZSAiU2lJVHJhY2UuaCIKI2luY2x1ZGUgIlNpSUdsb2IuaCIKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gTmFtZTogc2lpRXJyb3JIYW5kbGVyCiAqIEZ1bmN0aW9uIERlc2NyaXB0aW9uOiAgRmlsbCBpbiBidWZmZXIgZXJyb3Igc3RydWN0dXJlCiAqIEFjY2VwdHM6IG5vbmUKICogUmV0dXJuczogbm9uZQogKiBHbG9iYWxzOiBzdHJ1Y3R1cmUgU2lJX0luZi5FcnJvcgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQgc2lpRXJyb3JIYW5kbGVyKEJZVEUgYkVycm9yQ29kZSkKewoJaWYgKGJFcnJvckNvZGUpIHsKCQlTaUlfYkVDb2RlW1NpSV9iRUNvZGVbMF0gKyAxXSA9IGJFcnJvckNvZGU7CgkJaWYgKFNpSV9iRUNvZGVbMF0gPCBFUlJfQlVGX1NJWkUpCgkJCVNpSV9iRUNvZGVbMF0rKzsKCX0KfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBzaWlXYXJuaW5nSGFuZGxlcgogKiBGdW5jdGlvbiBEZXNjcmlwdGlvbjogIEZpbGwgaW4gYnVmZmVyIHdpdGggd2FybmluZyBtZXNzYWdlcwogKiBBY2NlcHRzOiBub25lCiAqIFJldHVybnM6IG5vbmUKICogR2xvYmFsczogU2lJX2JXQ29kZVsxNl0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkIHNpaVdhcm5pbmdIYW5kbGVyKEJZVEUgYldybkNvZGUpCnsKCWlmIChiV3JuQ29kZSkgewoJCVNpSV9iV0NvZGVbU2lJX2JXQ29kZVswXSArIDFdID0gYldybkNvZGU7CgkJaWYgKFNpSV9iV0NvZGVbMF0gPCAoV1JOX0JVRl9TSVpFIC0gMSkpCgkJCVNpSV9iV0NvZGVbMF0rKzsKCX0KfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBzaWlSZXNldEVycm9yc0FuZFdhcm5pbmdzCiAqIEZ1bmN0aW9uIERlc2NyaXB0aW9uOiAgRmlsbCBpbiBidWZmZXIgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzCiAqIEFjY2VwdHM6IG5vbmUKICogUmV0dXJuczogbm9uZQogKiBHbG9iYWxzOiBTaUlfYldDb2RlWzBdCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCBzaWlSZXNldEVycm9yc0FuZFdhcm5pbmdzKHZvaWQpCnsKCUJZVEUgaTsKCglmb3IgKGkgPSAwOyBpIDwgV1JOX0JVRl9TSVpFOyBpKyspCgkJU2lJX2JXQ29kZVtpXSA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgRVJSX0JVRl9TSVpFOyBpKyspCgkJU2lJX2JFQ29kZVtpXSA9IDA7Cgp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBzaWlHZXRFcnJvcnNXYXJuaW5ncwogKiBGdW5jdGlvbiBEZXNjcmlwdGlvbjogIEZpbGwgaW4gYnVmZmVyIGVycm9yIHN0cnVjdHVyZQogKiBBY2NlcHRzOiBub25lCiAqIFJldHVybnM6IG5vbmUKICogR2xvYmFsczogc3RydWN0dXJlIFNpSV9JbmYuRXJyb3IKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpCWVRFIHNpaUdldEVycm9yc1dhcm5pbmdzKHZvaWQpCnsKCXJldHVybiAoU2lJX2JFQ29kZVswXSA8PCA0KSB8IFNpSV9iV0NvZGVbMF07Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZ1bmN0aW9uIE5hbWU6IHNpaUdldEVycm9yc0RhdGEKICogRnVuY3Rpb24gRGVzY3JpcHRpb246CiAqIEFjY2VwdHM6ICBwYkVyckRhdGEKICogUmV0dXJuczogIG51bWJlciBvZiBlcnJvcnMKICogR2xvYmFsczogU2lJX2JXQ29kZQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCkJZVEUgc2lpR2V0RXJyb3JzRGF0YShCWVRFICpwYkVyckRhdGEpCnsKCUJZVEUgaTsKCglmb3IgKGkgPSAwOyBpIDwgU2lJX2JFQ29kZVswXTsgaSsrKQoJCXBiRXJyRGF0YVtpXSA9IFNpSV9iRUNvZGVbMSArIGldOwoKCXJldHVybiBTaUlfYkVDb2RlWzBdOwoKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gTmFtZTogc2lpR2V0V2FybmluZ0RhdGEKICogRnVuY3Rpb24gRGVzY3JpcHRpb246CiAqIEFjY2VwdHM6IHBiV3JuRGF0YQogKiBSZXR1cm5zOiBudW1iZXIgb2Ygd2FybmluZ3MKICogR2xvYmFsczogU2lJX2JFQ29kZQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgpCWVRFIHNpaUdldFdhcm5pbmdEYXRhKEJZVEUgKnBiV3JuRGF0YSkKewoJQllURSBpOwoKCWZvciAoaSA9IDA7IGkgPCBTaUlfYldDb2RlWzBdOyBpKyspCgkJcGJXcm5EYXRhW2ldID0gU2lJX2JXQ29kZVsxICsgaV07CgoJcmV0dXJuIFNpSV9iV0NvZGVbMF07Cn0KCgoK