LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZwpmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucwpkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCnRoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQpleGVjdXRhYmxlLikKCkxpYmdmb3J0cmFuIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFsb25nIHdpdGggbGliZ2ZvcnRyYW47IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LAp3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLApCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgImxpYmdmb3J0cmFuLmgiCgojaWYgZGVmaW5lZCAoSEFWRV9HRkNfQ09NUExFWF8xMCkKCmV4dGVybiB2b2lkIHRyYW5zcG9zZV9jMTAgKGdmY19hcnJheV9jMTAgKiBjb25zdCByZXN0cmljdCByZXQsIAoJZ2ZjX2FycmF5X2MxMCAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSk7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2VfYzEwKTsKCnZvaWQKdHJhbnNwb3NlX2MxMCAoZ2ZjX2FycmF5X2MxMCAqIGNvbnN0IHJlc3RyaWN0IHJldCwgCglnZmNfYXJyYXlfYzEwICogY29uc3QgcmVzdHJpY3Qgc291cmNlKQp7CiAgLyogci4qIGluZGljYXRlcyB0aGUgcmV0dXJuIGFycmF5LiAgKi8KICBpbmRleF90eXBlIHJ4c3RyaWRlLCByeXN0cmlkZTsKICBHRkNfQ09NUExFWF8xMCAqcnB0cjsKICAvKiBzLiogaW5kaWNhdGVzIHRoZSBzb3VyY2UgYXJyYXkuICAqLwogIGluZGV4X3R5cGUgc3hzdHJpZGUsIHN5c3RyaWRlOwogIGNvbnN0IEdGQ19DT01QTEVYXzEwICpzcHRyOwoKICBpbmRleF90eXBlIHhjb3VudCwgeWNvdW50OwogIGluZGV4X3R5cGUgeCwgeTsKCiAgYXNzZXJ0IChHRkNfREVTQ1JJUFRPUl9SQU5LIChzb3VyY2UpID09IDIpOwoKICBpZiAocmV0LT5kYXRhID09IE5VTEwpCiAgICB7CiAgICAgIGFzc2VydCAoR0ZDX0RFU0NSSVBUT1JfUkFOSyAocmV0KSA9PSAyKTsKICAgICAgYXNzZXJ0IChyZXQtPmR0eXBlID09IHNvdXJjZS0+ZHR5cGUpOwoKICAgICAgcmV0LT5kaW1bMF0ubGJvdW5kID0gMDsKICAgICAgcmV0LT5kaW1bMF0udWJvdW5kID0gc291cmNlLT5kaW1bMV0udWJvdW5kIC0gc291cmNlLT5kaW1bMV0ubGJvdW5kOwogICAgICByZXQtPmRpbVswXS5zdHJpZGUgPSAxOwoKICAgICAgcmV0LT5kaW1bMV0ubGJvdW5kID0gMDsKICAgICAgcmV0LT5kaW1bMV0udWJvdW5kID0gc291cmNlLT5kaW1bMF0udWJvdW5kIC0gc291cmNlLT5kaW1bMF0ubGJvdW5kOwogICAgICByZXQtPmRpbVsxXS5zdHJpZGUgPSByZXQtPmRpbVswXS51Ym91bmQrMTsKCiAgICAgIHJldC0+ZGF0YSA9IGludGVybmFsX21hbGxvY19zaXplIChzaXplb2YgKEdGQ19DT01QTEVYXzEwKSAqIHNpemUwICgoYXJyYXlfdCAqKSByZXQpKTsKICAgICAgcmV0LT5vZmZzZXQgPSAwOwogICAgfQoKICBzeHN0cmlkZSA9IHNvdXJjZS0+ZGltWzBdLnN0cmlkZTsKICBzeXN0cmlkZSA9IHNvdXJjZS0+ZGltWzFdLnN0cmlkZTsKICB4Y291bnQgPSBzb3VyY2UtPmRpbVswXS51Ym91bmQgKyAxIC0gc291cmNlLT5kaW1bMF0ubGJvdW5kOwogIHljb3VudCA9IHNvdXJjZS0+ZGltWzFdLnVib3VuZCArIDEgLSBzb3VyY2UtPmRpbVsxXS5sYm91bmQ7CgogIHJ4c3RyaWRlID0gcmV0LT5kaW1bMF0uc3RyaWRlOwogIHJ5c3RyaWRlID0gcmV0LT5kaW1bMV0uc3RyaWRlOwoKICBycHRyID0gcmV0LT5kYXRhOwogIHNwdHIgPSBzb3VyY2UtPmRhdGE7CgogIGZvciAoeT0wOyB5IDwgeWNvdW50OyB5KyspCiAgICB7CiAgICAgIGZvciAoeD0wOyB4IDwgeGNvdW50OyB4KyspCiAgICAgICAgewogICAgICAgICAgKnJwdHIgPSAqc3B0cjsKCiAgICAgICAgICBzcHRyICs9IHN4c3RyaWRlOwogICAgICAgICAgcnB0ciArPSByeXN0cmlkZTsKICAgICAgICB9CiAgICAgICAgc3B0ciArPSBzeXN0cmlkZSAtIChzeHN0cmlkZSAqIHhjb3VudCk7CiAgICAgICAgcnB0ciArPSByeHN0cmlkZSAtIChyeXN0cmlkZSAqIHhjb3VudCk7CiAgICB9Cn0KCiNlbmRpZgo=