ZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvcy5jIGIvbGlibS9zcmMvZV9hY29zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhNjcyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYWNvcy5jCkBAIC0wLDAgKzEsMTA0IEBACisKKy8qIEAoIyllX2Fjb3MuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zLmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYWNvcyh4KQorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqCWFjb3MoeCkgID0gcGkvMiAtIGFzaW4oeCkKKyAqCWFjb3MoLXgpID0gcGkvMiArIGFzaW4oeCkKKyAqIEZvciB8eHw8PTAuNQorICoJYWNvcyh4KSA9IHBpLzIgLSAoeCArIHgqeF4yKlIoeF4yKSkJKHNlZSBhc2luLmMpCisgKiBGb3IgeD4wLjUKKyAqIAlhY29zKHgpID0gcGkvMiAtIChwaS8yIC0gMmFzaW4oc3FydCgoMS14KS8yKSkpCisgKgkJPSAyYXNpbihzcXJ0KCgxLXgpLzIpKSAgCisgKgkJPSAycyArIDJzKnoqUih6KSAJLi4uej0oMS14KS8yLCBzPXNxcnQoeikKKyAqCQk9IDJmICsgKDJjICsgMnMqeipSKHopKQorICogICAgIHdoZXJlIGY9aGkgcGFydCBvZiBzLCBhbmQgYyA9ICh6LWYqZikvKHMrZikgaXMgdGhlIGNvcnJlY3Rpb24gdGVybQorICogICAgIGZvciBmIHNvIHRoYXQgZitjIH4gc3FydCh6KS4KKyAqIEZvciB4PC0wLjUKKyAqCWFjb3MoeCkgPSBwaSAtIDJhc2luKHNxcnQoKDEtfHh8KS8yKSkKKyAqCQk9IHBpIC0gMC41KihzK3MqeipSKHopKSwgd2hlcmUgej0oMS18eHwpLzIscz1zcXJ0KHopCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWlmIHggaXMgTmFOLCByZXR1cm4geCBpdHNlbGY7CisgKglpZiB8eHw+MSwgcmV0dXJuIE5hTiB3aXRoIGludmFsaWQgc2lnbmFsLgorICoKKyAqIEZ1bmN0aW9uIG5lZWRlZDogc3FydAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZT0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitwaSA9ICAzLjE0MTU5MjY1MzU4OTc5MzExNjAwZSswMCwgLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlvMl9oaSA9ICAxLjU3MDc5NjMyNjc5NDg5NjU1ODAwZSswMCwgLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlvMl9sbyA9ICA2LjEyMzIzMzk5NTczNjc2NjAzNTg3ZS0xNywgLyogMHgzQzkxQTYyNiwgMHgzMzE0NUMwNyAqLworcFMwID0gIDEuNjY2NjY2NjY2NjY2NjY2NTc0MTVlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTU1ICovCitwUzEgPSAtMy4yNTU2NTgxODYyMjQwMDkxNTQwNWUtMDEsIC8qIDB4QkZENEQ2MTIsIDB4MDNFQjZGN0QgKi8KK3BTMiA9ICAyLjAxMjEyNTMyMTM0ODYyOTI1ODgxZS0wMSwgLyogMHgzRkM5QzE1NSwgMHgwRTg4NDQ1NSAqLworcFMzID0gLTQuMDA1NTUzNDUwMDY3OTQxMTQwMjdlLTAyLCAvKiAweEJGQTQ4MjI4LCAweEI1Njg4RjNCICovCitwUzQgPSAgNy45MTUzNDk5NDI4OTgxNDUzMjE3NmUtMDQsIC8qIDB4M0Y0OUVGRTAsIDB4NzUwMUIyODggKi8KK3BTNSA9ICAzLjQ3OTMzMTA3NTk2MDIxMTY3NTcwZS0wNSwgLyogMHgzRjAyM0RFMSwgMHgwREZERjcwOSAqLworcVMxID0gLTIuNDAzMzk0OTExNzM0NDE0MjE4NzhlKzAwLCAvKiAweEMwMDMzQTI3LCAweDFDOEEyRDRCICovCitxUzIgPSAgMi4wMjA5NDU3NjAyMzM1MDU2OTQ3MWUrMDAsIC8qIDB4NDAwMDJBRTUsIDB4OUM1OThBQzggKi8KK3FTMyA9IC02Ljg4MjgzOTcxNjA1NDUzMjkzMDMwZS0wMSwgLyogMHhCRkU2MDY2QywgMHgxQjhEMDE1OSAqLworcVM0ID0gIDcuNzAzODE1MDU1NTkwMTkzNTI3OTFlLTAyOyAvKiAweDNGQjNCOEM1LCAweEIxMkU5MjgyICovCisKK2RvdWJsZQorX19pZWVlNzU0X2Fjb3MoZG91YmxlIHgpCit7CisJZG91YmxlIHoscCxxLHIsdyxzLGMsZGY7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHgzZmYwMDAwMCkgewkvKiB8eHwgPj0gMSAqLworCSAgICB1X2ludDMyX3QgbHg7CisJICAgIEdFVF9MT1dfV09SRChseCx4KTsKKwkgICAgaWYoKChpeC0weDNmZjAwMDAwKXxseCk9PTApIHsJLyogfHh8PT0xICovCisJCWlmKGh4PjApIHJldHVybiAwLjA7CQkvKiBhY29zKDEpID0gMCAgKi8KKwkJZWxzZSByZXR1cm4gcGkrMi4wKnBpbzJfbG87CS8qIGFjb3MoLTEpPSBwaSAqLworCSAgICB9CisJICAgIHJldHVybiAoeC14KS8oeC14KTsJCS8qIGFjb3MofHh8PjEpIGlzIE5hTiAqLworCX0KKwlpZihpeDwweDNmZTAwMDAwKSB7CS8qIHx4fCA8IDAuNSAqLworCSAgICBpZihpeDw9MHgzYzYwMDAwMCkgcmV0dXJuIHBpbzJfaGkrcGlvMl9sbzsvKmlmfHh8PDIqKi01NyovCisJICAgIHogPSB4Kng7CisJICAgIHAgPSB6KihwUzAreioocFMxK3oqKHBTMit6KihwUzMreioocFM0K3oqcFM1KSkpKSk7CisJICAgIHEgPSBvbmUreioocVMxK3oqKHFTMit6KihxUzMreipxUzQpKSk7CisJICAgIHIgPSBwL3E7CisJICAgIHJldHVybiBwaW8yX2hpIC0gKHggLSAocGlvMl9sby14KnIpKTsKKwl9IGVsc2UgIGlmIChoeDwwKSB7CQkvKiB4IDwgLTAuNSAqLworCSAgICB6ID0gKG9uZSt4KSowLjU7CisJICAgIHAgPSB6KihwUzAreioocFMxK3oqKHBTMit6KihwUzMreioocFM0K3oqcFM1KSkpKSk7CisJICAgIHEgPSBvbmUreioocVMxK3oqKHFTMit6KihxUzMreipxUzQpKSk7CisJICAgIHMgPSBzcXJ0KHopOworCSAgICByID0gcC9xOworCSAgICB3ID0gcipzLXBpbzJfbG87CisJICAgIHJldHVybiBwaSAtIDIuMCoocyt3KTsKKwl9IGVsc2UgewkJCS8qIHggPiAwLjUgKi8KKwkgICAgeiA9IChvbmUteCkqMC41OworCSAgICBzID0gc3FydCh6KTsKKwkgICAgZGYgPSBzOworCSAgICBTRVRfTE9XX1dPUkQoZGYsMCk7CisJICAgIGMgID0gKHotZGYqZGYpLyhzK2RmKTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgdyA9IHIqcytjOworCSAgICByZXR1cm4gMi4wKihkZit3KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2Fjb3NmLmMgYi9saWJtL3NyYy9lX2Fjb3NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYWNvc2YuYwpAQCAtMCwwICsxLDgxIEBACisvKiBlX2Fjb3NmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2Fjb3MuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYWNvc2YuYyx2IDEuNyAyMDAyLzA1LzI4IDE3OjAzOjEyIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzRjgwMDAwMCAqLworcGkgPSAgMy4xNDE1OTI1MDI2ZSswMCwgLyogMHg0MDQ5MGZkYSAqLworcGlvMl9oaSA9ICAxLjU3MDc5NjI1MTNlKzAwLCAvKiAweDNmYzkwZmRhICovCitwaW8yX2xvID0gIDcuNTQ5Nzg5NDE1OWUtMDgsIC8qIDB4MzNhMjIxNjggKi8KK3BTMCA9ICAxLjY2NjY2NjcxNjNlLTAxLCAvKiAweDNlMmFhYWFiICovCitwUzEgPSAtMy4yNTU2NTgxNDk3ZS0wMSwgLyogMHhiZWE2YjA5MCAqLworcFMyID0gIDIuMDEyMTI1MjUzN2UtMDEsIC8qIDB4M2U0ZTBhYTggKi8KK3BTMyA9IC00LjAwNTU1MzU3MzRlLTAyLCAvKiAweGJkMjQxMTQ2ICovCitwUzQgPSAgNy45MTUzNTAxNDI5ZS0wNCwgLyogMHgzYTRmN2YwNCAqLworcFM1ID0gIDMuNDc5MzMwOTE2OWUtMDUsIC8qIDB4MzgxMWVmMDggKi8KK3FTMSA9IC0yLjQwMzM5NDkzNzVlKzAwLCAvKiAweGMwMTlkMTM5ICovCitxUzIgPSAgMi4wMjA5NDU3ODc0ZSswMCwgLyogMHg0MDAxNTcyZCAqLworcVMzID0gLTYuODgyODM5Nzk4OWUtMDEsIC8qIDB4YmYzMDMzNjEgKi8KK3FTNCA9ICA3LjcwMzgxNTQwMDZlLTAyOyAvKiAweDNkOWRjNjJlICovCisKK2Zsb2F0CitfX2llZWU3NTRfYWNvc2YoZmxvYXQgeCkKK3sKKwlmbG9hdCB6LHAscSxyLHcscyxjLGRmOworCWludDMyX3QgaHgsaXg7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4PT0weDNmODAwMDAwKSB7CQkvKiB8eHw9PTEgKi8KKwkgICAgaWYoaHg+MCkgcmV0dXJuIDAuMDsJLyogYWNvcygxKSA9IDAgICovCisJICAgIGVsc2UgcmV0dXJuIHBpKyhmbG9hdCkyLjAqcGlvMl9sbzsJLyogYWNvcygtMSk9IHBpICovCisJfSBlbHNlIGlmKGl4PjB4M2Y4MDAwMDApIHsJLyogfHh8ID49IDEgKi8KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOwkJLyogYWNvcyh8eHw+MSkgaXMgTmFOICovCisJfQorCWlmKGl4PDB4M2YwMDAwMDApIHsJLyogfHh8IDwgMC41ICovCisJICAgIGlmKGl4PD0weDIzMDAwMDAwKSByZXR1cm4gcGlvMl9oaStwaW8yX2xvOy8qaWZ8eHw8MioqLTU3Ki8KKwkgICAgeiA9IHgqeDsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgcmV0dXJuIHBpbzJfaGkgLSAoeCAtIChwaW8yX2xvLXgqcikpOworCX0gZWxzZSAgaWYgKGh4PDApIHsJCS8qIHggPCAtMC41ICovCisJICAgIHogPSAob25lK3gpKihmbG9hdCkwLjU7CisJICAgIHAgPSB6KihwUzAreioocFMxK3oqKHBTMit6KihwUzMreioocFM0K3oqcFM1KSkpKSk7CisJICAgIHEgPSBvbmUreioocVMxK3oqKHFTMit6KihxUzMreipxUzQpKSk7CisJICAgIHMgPSBfX2llZWU3NTRfc3FydGYoeik7CisJICAgIHIgPSBwL3E7CisJICAgIHcgPSByKnMtcGlvMl9sbzsKKwkgICAgcmV0dXJuIHBpIC0gKGZsb2F0KTIuMCoocyt3KTsKKwl9IGVsc2UgewkJCS8qIHggPiAwLjUgKi8KKwkgICAgaW50MzJfdCBpZGY7CisJICAgIHogPSAob25lLXgpKihmbG9hdCkwLjU7CisJICAgIHMgPSBfX2llZWU3NTRfc3FydGYoeik7CisJICAgIGRmID0gczsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaWRmLGRmKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoZGYsaWRmJjB4ZmZmZmYwMDApOworCSAgICBjICA9ICh6LWRmKmRmKS8ocytkZik7CisJICAgIHAgPSB6KihwUzAreioocFMxK3oqKHBTMit6KihwUzMreioocFM0K3oqcFM1KSkpKSk7CisJICAgIHEgPSBvbmUreioocVMxK3oqKHFTMit6KihxUzMreipxUzQpKSk7CisJICAgIHIgPSBwL3E7CisJICAgIHcgPSByKnMrYzsKKwkgICAgcmV0dXJuIChmbG9hdCkyLjAqKGRmK3cpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvc2guYyBiL2xpYm0vc3JjL2VfYWNvc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IxNTIxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zaC5jCkBAIC0wLDAgKzEsNjMgQEAKKworLyogQCgjKWVfYWNvc2guYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYWNvc2guYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2Fjb3NoKHgpCisgKiBNZXRob2QgOgorICoJQmFzZWQgb24gCisgKgkJYWNvc2goeCkgPSBsb2cgWyB4ICsgc3FydCh4KngtMSkgXQorICoJd2UgaGF2ZQorICoJCWFjb3NoKHgpIDo9IGxvZyh4KStsbjIsCWlmIHggaXMgbGFyZ2U7IGVsc2UKKyAqCQlhY29zaCh4KSA6PSBsb2coMngtMS8oc3FydCh4KngtMSkreCkpIGlmIHg+MjsgZWxzZQorICoJCWFjb3NoKHgpIDo9IGxvZzFwKHQrc3FydCgyLjAqdCt0KnQpKTsgd2hlcmUgdD14LTEuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWFjb3NoKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4PDEuCisgKglhY29zaChOYU4pIGlzIE5hTiB3aXRob3V0IHNpZ25hbC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUJPSAxLjAsCitsbjIJPSA2LjkzMTQ3MTgwNTU5OTQ1Mjg2MjI3ZS0wMTsgIC8qIDB4M0ZFNjJFNDIsIDB4RkVGQTM5RUYgKi8KKworZG91YmxlCitfX2llZWU3NTRfYWNvc2goZG91YmxlIHgpCit7CisJZG91YmxlIHQ7CisJaW50MzJfdCBoeDsKKwl1X2ludDMyX3QgbHg7CisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpZihoeDwweDNmZjAwMDAwKSB7CQkvKiB4IDwgMSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CisJfSBlbHNlIGlmKGh4ID49MHg0MWIwMDAwMCkgewkvKiB4ID4gMioqMjggKi8KKwkgICAgaWYoaHggPj0weDdmZjAwMDAwKSB7CS8qIHggaXMgaW5mIG9mIE5hTiAqLworCSAgICAgICAgcmV0dXJuIHgreDsKKwkgICAgfSBlbHNlIAorCQlyZXR1cm4gX19pZWVlNzU0X2xvZyh4KStsbjI7CS8qIGFjb3NoKGh1Z2UpPWxvZygyeCkgKi8KKwl9IGVsc2UgaWYoKChoeC0weDNmZjAwMDAwKXxseCk9PTApIHsKKwkgICAgcmV0dXJuIDAuMDsJCQkvKiBhY29zaCgxKSA9IDAgKi8KKwl9IGVsc2UgaWYgKGh4ID4gMHg0MDAwMDAwMCkgewkvKiAyKioyOCA+IHggPiAyICovCisJICAgIHQ9eCp4OworCSAgICByZXR1cm4gX19pZWVlNzU0X2xvZygyLjAqeC1vbmUvKHgrc3FydCh0LW9uZSkpKTsKKwl9IGVsc2UgewkJCS8qIDE8eDwyICovCisJICAgIHQgPSB4LW9uZTsKKwkgICAgcmV0dXJuIGxvZzFwKHQrc3FydCgyLjAqdCt0KnQpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2Fjb3NoZi5jIGIvbGlibS9zcmMvZV9hY29zaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU3OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zaGYuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBlX2Fjb3NoZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9hY29zaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zaGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE3OjAzOjEyIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitvbmUJPSAxLjAsCitsbjIJPSA2LjkzMTQ3MTgyNDZlLTAxOyAgLyogMHgzZjMxNzIxOCAqLworCitmbG9hdAorX19pZWVlNzU0X2Fjb3NoZihmbG9hdCB4KQoreworCWZsb2F0IHQ7CisJaW50MzJfdCBoeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpZihoeDwweDNmODAwMDAwKSB7CQkvKiB4IDwgMSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CisJfSBlbHNlIGlmKGh4ID49MHg0ZDgwMDAwMCkgewkvKiB4ID4gMioqMjggKi8KKwkgICAgaWYoaHggPj0weDdmODAwMDAwKSB7CS8qIHggaXMgaW5mIG9mIE5hTiAqLworCSAgICAgICAgcmV0dXJuIHgreDsKKwkgICAgfSBlbHNlCisJCXJldHVybiBfX2llZWU3NTRfbG9nZih4KStsbjI7CS8qIGFjb3NoKGh1Z2UpPWxvZygyeCkgKi8KKwl9IGVsc2UgaWYgKGh4PT0weDNmODAwMDAwKSB7CisJICAgIHJldHVybiAwLjA7CQkJLyogYWNvc2goMSkgPSAwICovCisJfSBlbHNlIGlmIChoeCA+IDB4NDAwMDAwMDApIHsJLyogMioqMjggPiB4ID4gMiAqLworCSAgICB0PXgqeDsKKwkgICAgcmV0dXJuIF9faWVlZTc1NF9sb2dmKChmbG9hdCkyLjAqeC1vbmUvKHgrX19pZWVlNzU0X3NxcnRmKHQtb25lKSkpOworCX0gZWxzZSB7CQkJLyogMTx4PDIgKi8KKwkgICAgdCA9IHgtb25lOworCSAgICByZXR1cm4gbG9nMXBmKHQrX19pZWVlNzU0X3NxcnRmKChmbG9hdCkyLjAqdCt0KnQpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2FzaW4uYyBiL2xpYm0vc3JjL2VfYXNpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTcwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2FzaW4uYwpAQCAtMCwwICsxLDExMyBAQAorCisvKiBAKCMpZV9hc2luLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXNpbi5jLHYgMS4xMSAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2FzaW4oeCkKKyAqIE1ldGhvZCA6ICAgICAgICAgICAgICAgICAgCisgKglTaW5jZSAgYXNpbih4KSA9IHggKyB4XjMvNiArIHheNSozLzQwICsgeF43KjE1LzMzNiArIC4uLgorICoJd2UgYXBwcm94aW1hdGUgYXNpbih4KSBvbiBbMCwwLjVdIGJ5CisgKgkJYXNpbih4KSA9IHggKyB4KnheMipSKHheMikKKyAqCXdoZXJlCisgKgkJUih4XjIpIGlzIGEgcmF0aW9uYWwgYXBwcm94aW1hdGlvbiBvZiAoYXNpbih4KS14KS94XjMgCisgKglhbmQgaXRzIHJlbWV6IGVycm9yIGlzIGJvdW5kZWQgYnkKKyAqCQl8KGFzaW4oeCkteCkveF4zIC0gUih4XjIpfCA8IDJeKC01OC43NSkKKyAqCisgKglGb3IgeCBpbiBbMC41LDFdCisgKgkJYXNpbih4KSA9IHBpLzItMiphc2luKHNxcnQoKDEteCkvMikpCisgKglMZXQgeSA9ICgxLXgpLCB6ID0geS8yLCBzIDo9IHNxcnQoeiksIGFuZCBwaW8yX2hpK3BpbzJfbG89cGkvMjsKKyAqCXRoZW4gZm9yIHg+MC45OAorICoJCWFzaW4oeCkgPSBwaS8yIC0gMioocytzKnoqUih6KSkKKyAqCQkJPSBwaW8yX2hpIC0gKDIqKHMrcyp6KlIoeikpIC0gcGlvMl9sbykKKyAqCUZvciB4PD0wLjk4LCBsZXQgcGlvNF9oaSA9IHBpbzJfaGkvMiwgdGhlbgorICoJCWYgPSBoaSBwYXJ0IG9mIHM7CisgKgkJYyA9IHNxcnQoeikgLSBmID0gKHotZipmKS8ocytmKSAJLi4uZitjPXNxcnQoeikKKyAqCWFuZAorICoJCWFzaW4oeCkgPSBwaS8yIC0gMioocytzKnoqUih6KSkKKyAqCQkJPSBwaW80X2hpKyhwaW80LTJzKS0oMnMqeipSKHopLXBpbzJfbG8pCisgKgkJCT0gcGlvNF9oaSsocGlvNC0yZiktKDJzKnoqUih6KS0ocGlvMl9sbysyYykpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWlmIHggaXMgTmFOLCByZXR1cm4geCBpdHNlbGY7CisgKglpZiB8eHw+MSwgcmV0dXJuIE5hTiB3aXRoIGludmFsaWQgc2lnbmFsLgorICoKKyAqLworCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworaHVnZSA9ICAxLjAwMGUrMzAwLAorcGlvMl9oaSA9ICAxLjU3MDc5NjMyNjc5NDg5NjU1ODAwZSswMCwgLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlvMl9sbyA9ICA2LjEyMzIzMzk5NTczNjc2NjAzNTg3ZS0xNywgLyogMHgzQzkxQTYyNiwgMHgzMzE0NUMwNyAqLworcGlvNF9oaSA9ICA3Ljg1Mzk4MTYzMzk3NDQ4Mjc4OTk5ZS0wMSwgLyogMHgzRkU5MjFGQiwgMHg1NDQ0MkQxOCAqLworCS8qIGNvZWZmaWNpZW50IGZvciBSKHheMikgKi8KK3BTMCA9ICAxLjY2NjY2NjY2NjY2NjY2NjU3NDE1ZS0wMSwgLyogMHgzRkM1NTU1NSwgMHg1NTU1NTU1NSAqLworcFMxID0gLTMuMjU1NjU4MTg2MjI0MDA5MTU0MDVlLTAxLCAvKiAweEJGRDRENjEyLCAweDAzRUI2RjdEICovCitwUzIgPSAgMi4wMTIxMjUzMjEzNDg2MjkyNTg4MWUtMDEsIC8qIDB4M0ZDOUMxNTUsIDB4MEU4ODQ0NTUgKi8KK3BTMyA9IC00LjAwNTU1MzQ1MDA2Nzk0MTE0MDI3ZS0wMiwgLyogMHhCRkE0ODIyOCwgMHhCNTY4OEYzQiAqLworcFM0ID0gIDcuOTE1MzQ5OTQyODk4MTQ1MzIxNzZlLTA0LCAvKiAweDNGNDlFRkUwLCAweDc1MDFCMjg4ICovCitwUzUgPSAgMy40NzkzMzEwNzU5NjAyMTE2NzU3MGUtMDUsIC8qIDB4M0YwMjNERTEsIDB4MERGREY3MDkgKi8KK3FTMSA9IC0yLjQwMzM5NDkxMTczNDQxNDIxODc4ZSswMCwgLyogMHhDMDAzM0EyNywgMHgxQzhBMkQ0QiAqLworcVMyID0gIDIuMDIwOTQ1NzYwMjMzNTA1Njk0NzFlKzAwLCAvKiAweDQwMDAyQUU1LCAweDlDNTk4QUM4ICovCitxUzMgPSAtNi44ODI4Mzk3MTYwNTQ1MzI5MzAzMGUtMDEsIC8qIDB4QkZFNjA2NkMsIDB4MUI4RDAxNTkgKi8KK3FTNCA9ICA3LjcwMzgxNTA1NTU5MDE5MzUyNzkxZS0wMjsgLyogMHgzRkIzQjhDNSwgMHhCMTJFOTI4MiAqLworCitkb3VibGUKK19faWVlZTc1NF9hc2luKGRvdWJsZSB4KQoreworCWRvdWJsZSB0PTAuMCx3LHAscSxjLHIsczsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0gMHgzZmYwMDAwMCkgewkJLyogfHh8Pj0gMSAqLworCSAgICB1X2ludDMyX3QgbHg7CisJICAgIEdFVF9MT1dfV09SRChseCx4KTsKKwkgICAgaWYoKChpeC0weDNmZjAwMDAwKXxseCk9PTApCisJCSAgICAvKiBhc2luKDEpPSstcGkvMiB3aXRoIGluZXhhY3QgKi8KKwkJcmV0dXJuIHgqcGlvMl9oaSt4KnBpbzJfbG87CQorCSAgICByZXR1cm4gKHgteCkvKHgteCk7CQkvKiBhc2luKHx4fD4xKSBpcyBOYU4gKi8gICAKKwl9IGVsc2UgaWYgKGl4PDB4M2ZlMDAwMDApIHsJLyogfHh8PDAuNSAqLworCSAgICBpZihpeDwweDNlNDAwMDAwKSB7CQkvKiBpZiB8eHwgPCAyKiotMjcgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7LyogcmV0dXJuIHggd2l0aCBpbmV4YWN0IGlmIHghPTAqLworCSAgICB9IGVsc2UgCisJCXQgPSB4Kng7CisJCXAgPSB0KihwUzArdCoocFMxK3QqKHBTMit0KihwUzMrdCoocFM0K3QqcFM1KSkpKSk7CisJCXEgPSBvbmUrdCoocVMxK3QqKHFTMit0KihxUzMrdCpxUzQpKSk7CisJCXcgPSBwL3E7CisJCXJldHVybiB4K3gqdzsKKwl9CisJLyogMT4gfHh8Pj0gMC41ICovCisJdyA9IG9uZS1mYWJzKHgpOworCXQgPSB3KjAuNTsKKwlwID0gdCoocFMwK3QqKHBTMSt0KihwUzIrdCoocFMzK3QqKHBTNCt0KnBTNSkpKSkpOworCXEgPSBvbmUrdCoocVMxK3QqKHFTMit0KihxUzMrdCpxUzQpKSk7CisJcyA9IHNxcnQodCk7CisJaWYoaXg+PTB4M0ZFRjMzMzMpIHsgCS8qIGlmIHx4fCA+IDAuOTc1ICovCisJICAgIHcgPSBwL3E7CisJICAgIHQgPSBwaW8yX2hpLSgyLjAqKHMrcyp3KS1waW8yX2xvKTsKKwl9IGVsc2UgeworCSAgICB3ICA9IHM7CisJICAgIFNFVF9MT1dfV09SRCh3LDApOworCSAgICBjICA9ICh0LXcqdykvKHMrdyk7CisJICAgIHIgID0gcC9xOworCSAgICBwICA9IDIuMCpzKnItKHBpbzJfbG8tMi4wKmMpOworCSAgICBxICA9IHBpbzRfaGktMi4wKnc7CisJICAgIHQgID0gcGlvNF9oaS0ocC1xKTsKKwl9ICAgIAorCWlmKGh4PjApIHJldHVybiB0OyBlbHNlIHJldHVybiAtdDsgICAgCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2FzaW5mLmMgYi9saWJtL3NyYy9lX2FzaW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwNWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYXNpbmYuYwpAQCAtMCwwICsxLDg0IEBACisvKiBlX2FzaW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2FzaW4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXNpbmYuYyx2IDEuOSAyMDA1LzEyLzA0IDEzOjUyOjQ2IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzRjgwMDAwMCAqLworaHVnZSA9ICAxLjAwMGUrMzAsCitwaW8yX2hpID0gIDEuNTcwNzk2MjUxM2UrMDAsIC8qIDB4M2ZjOTBmZGEgKi8KK3BpbzJfbG8gPSAgNy41NDk3ODk0MTU5ZS0wOCwgLyogMHgzM2EyMjE2OCAqLworcGlvNF9oaSA9ICA3Ljg1Mzk4MTI1NjVlLTAxLCAvKiAweDNmNDkwZmRhICovCisJLyogY29lZmZpY2llbnQgZm9yIFIoeF4yKSAqLworcFMwID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK3BTMSA9IC0zLjI1NTY1ODE0OTdlLTAxLCAvKiAweGJlYTZiMDkwICovCitwUzIgPSAgMi4wMTIxMjUyNTM3ZS0wMSwgLyogMHgzZTRlMGFhOCAqLworcFMzID0gLTQuMDA1NTUzNTczNGUtMDIsIC8qIDB4YmQyNDExNDYgKi8KK3BTNCA9ICA3LjkxNTM1MDE0MjllLTA0LCAvKiAweDNhNGY3ZjA0ICovCitwUzUgPSAgMy40NzkzMzA5MTY5ZS0wNSwgLyogMHgzODExZWYwOCAqLworcVMxID0gLTIuNDAzMzk0OTM3NWUrMDAsIC8qIDB4YzAxOWQxMzkgKi8KK3FTMiA9ICAyLjAyMDk0NTc4NzRlKzAwLCAvKiAweDQwMDE1NzJkICovCitxUzMgPSAtNi44ODI4Mzk3OTg5ZS0wMSwgLyogMHhiZjMwMzM2MSAqLworcVM0ID0gIDcuNzAzODE1NDAwNmUtMDI7IC8qIDB4M2Q5ZGM2MmUgKi8KKworZmxvYXQKK19faWVlZTc1NF9hc2luZihmbG9hdCB4KQoreworCWZsb2F0IHQ9MC4wLHcscCxxLGMscixzOworCWludDMyX3QgaHgsaXg7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4PT0weDNmODAwMDAwKSB7CisJCS8qIGFzaW4oMSk9Ky1waS8yIHdpdGggaW5leGFjdCAqLworCSAgICByZXR1cm4geCpwaW8yX2hpK3gqcGlvMl9sbzsKKwl9IGVsc2UgaWYoaXg+IDB4M2Y4MDAwMDApIHsJLyogfHh8Pj0gMSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CQkvKiBhc2luKHx4fD4xKSBpcyBOYU4gKi8KKwl9IGVsc2UgaWYgKGl4PDB4M2YwMDAwMDApIHsJLyogfHh8PDAuNSAqLworCSAgICBpZihpeDwweDMyMDAwMDAwKSB7CQkvKiBpZiB8eHwgPCAyKiotMjcgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7LyogcmV0dXJuIHggd2l0aCBpbmV4YWN0IGlmIHghPTAqLworCSAgICB9IGVsc2UKKwkJdCA9IHgqeDsKKwkJcCA9IHQqKHBTMCt0KihwUzErdCoocFMyK3QqKHBTMyt0KihwUzQrdCpwUzUpKSkpKTsKKwkJcSA9IG9uZSt0KihxUzErdCoocVMyK3QqKHFTMyt0KnFTNCkpKTsKKwkJdyA9IHAvcTsKKwkJcmV0dXJuIHgreCp3OworCX0KKwkvKiAxPiB8eHw+PSAwLjUgKi8KKwl3ID0gb25lLWZhYnNmKHgpOworCXQgPSB3KihmbG9hdCkwLjU7CisJcCA9IHQqKHBTMCt0KihwUzErdCoocFMyK3QqKHBTMyt0KihwUzQrdCpwUzUpKSkpKTsKKwlxID0gb25lK3QqKHFTMSt0KihxUzIrdCoocVMzK3QqcVM0KSkpOworCXMgPSBfX2llZWU3NTRfc3FydGYodCk7CisJaWYoaXg+PTB4M0Y3OTk5OUEpIHsgCS8qIGlmIHx4fCA+IDAuOTc1ICovCisJICAgIHcgPSBwL3E7CisJICAgIHQgPSBwaW8yX2hpLSgoZmxvYXQpMi4wKihzK3MqdyktcGlvMl9sbyk7CisJfSBlbHNlIHsKKwkgICAgaW50MzJfdCBpdzsKKwkgICAgdyAgPSBzOworCSAgICBHRVRfRkxPQVRfV09SRChpdyx3KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodyxpdyYweGZmZmZmMDAwKTsKKwkgICAgYyAgPSAodC13KncpLyhzK3cpOworCSAgICByICA9IHAvcTsKKwkgICAgcCAgPSAoZmxvYXQpMi4wKnMqci0ocGlvMl9sby0oZmxvYXQpMi4wKmMpOworCSAgICBxICA9IHBpbzRfaGktKGZsb2F0KTIuMCp3OworCSAgICB0ICA9IHBpbzRfaGktKHAtcSk7CisJfQorCWlmKGh4PjApIHJldHVybiB0OyBlbHNlIHJldHVybiAtdDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXRhbjIuYyBiL2xpYm0vc3JjL2VfYXRhbjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNmODFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hdGFuMi5jCkBAIC0wLDAgKzEsMTI0IEBACisKKy8qIEAoIyllX2F0YW4yLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2F0YW4yLmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYXRhbjIoeSx4KQorICogTWV0aG9kIDoKKyAqCTEuIFJlZHVjZSB5IHRvIHBvc2l0aXZlIGJ5IGF0YW4yKHkseCk9LWF0YW4yKC15LHgpLgorICoJMi4gUmVkdWNlIHggdG8gcG9zaXRpdmUgYnkgKGlmIHggYW5kIHkgYXJlIHVuZXhjZXB0aW9uYWwpOiAKKyAqCQlBUkcgKHgraXkpID0gYXJjdGFuKHkveCkgICAJICAgLi4uIGlmIHggPiAwLAorICoJCUFSRyAoeCtpeSkgPSBwaSAtIGFyY3Rhblt5LygteCldICAgLi4uIGlmIHggPCAwLAorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgorICoJQVRBTjIoKGFueXRoaW5nKSwgTmFOICkgaXMgTmFOOworICoJQVRBTjIoTkFOICwgKGFueXRoaW5nKSApIGlzIE5hTjsKKyAqCUFUQU4yKCstMCwgKyhhbnl0aGluZyBidXQgTmFOKSkgaXMgKy0wICA7CisgKglBVEFOMigrLTAsIC0oYW55dGhpbmcgYnV0IE5hTikpIGlzICstcGkgOworICoJQVRBTjIoKy0oYW55dGhpbmcgYnV0IDAgYW5kIE5hTiksIDApIGlzICstcGkvMjsKKyAqCUFUQU4yKCstKGFueXRoaW5nIGJ1dCBJTkYgYW5kIE5hTiksICtJTkYpIGlzICstMCA7CisgKglBVEFOMigrLShhbnl0aGluZyBidXQgSU5GIGFuZCBOYU4pLCAtSU5GKSBpcyArLXBpOworICoJQVRBTjIoKy1JTkYsK0lORiApIGlzICstcGkvNCA7CisgKglBVEFOMigrLUlORiwtSU5GICkgaXMgKy0zcGkvNDsKKyAqCUFUQU4yKCstSU5GLCAoYW55dGhpbmcgYnV0LDAsTmFOLCBhbmQgSU5GKSkgaXMgKy1waS8yOworICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordGlueSAgPSAxLjBlLTMwMCwKK3plcm8gID0gMC4wLAorcGlfb180ICA9IDcuODUzOTgxNjMzOTc0NDgyNzkwMEUtMDEsIC8qIDB4M0ZFOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3BpX29fMiAgPSAxLjU3MDc5NjMyNjc5NDg5NjU1ODBFKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitwaSAgICAgID0gMy4xNDE1OTI2NTM1ODk3OTMxMTYwRSswMCwgLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlfbG8gICA9IDEuMjI0NjQ2Nzk5MTQ3MzUzMTc3MkUtMTY7IC8qIDB4M0NBMUE2MjYsIDB4MzMxNDVDMDcgKi8KKworZG91YmxlCitfX2llZWU3NTRfYXRhbjIoZG91YmxlIHksIGRvdWJsZSB4KQoreworCWRvdWJsZSB6OworCWludDMyX3QgayxtLGh4LGh5LGl4LGl5OworCXVfaW50MzJfdCBseCxseTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJaXkgPSBoeSYweDdmZmZmZmZmOworCWlmKCgoaXh8KChseHwtbHgpPj4zMSkpPjB4N2ZmMDAwMDApfHwKKwkgICAoKGl5fCgobHl8LWx5KT4+MzEpKT4weDdmZjAwMDAwKSkJLyogeCBvciB5IGlzIE5hTiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoKGh4LTB4M2ZmMDAwMDB8bHgpPT0wKSByZXR1cm4gYXRhbih5KTsgICAvKiB4PTEuMCAqLworCW0gPSAoKGh5Pj4zMSkmMSl8KChoeD4+MzApJjIpOwkvKiAyKnNpZ24oeCkrc2lnbih5KSAqLworCisgICAgLyogd2hlbiB5ID0gMCAqLworCWlmKChpeXxseSk9PTApIHsKKwkgICAgc3dpdGNoKG0pIHsKKwkJY2FzZSAwOiAKKwkJY2FzZSAxOiByZXR1cm4geTsgCS8qIGF0YW4oKy0wLCthbnl0aGluZyk9Ky0wICovCisJCWNhc2UgMjogcmV0dXJuICBwaSt0aW55Oy8qIGF0YW4oKzAsLWFueXRoaW5nKSA9IHBpICovCisJCWNhc2UgMzogcmV0dXJuIC1waS10aW55Oy8qIGF0YW4oLTAsLWFueXRoaW5nKSA9LXBpICovCisJICAgIH0KKwl9CisgICAgLyogd2hlbiB4ID0gMCAqLworCWlmKChpeHxseCk9PTApIHJldHVybiAoaHk8MCk/ICAtcGlfb18yLXRpbnk6IHBpX29fMit0aW55OworCSAgICAKKyAgICAvKiB3aGVuIHggaXMgSU5GICovCisJaWYoaXg9PTB4N2ZmMDAwMDApIHsKKwkgICAgaWYoaXk9PTB4N2ZmMDAwMDApIHsKKwkJc3dpdGNoKG0pIHsKKwkJICAgIGNhc2UgMDogcmV0dXJuICBwaV9vXzQrdGlueTsvKiBhdGFuKCtJTkYsK0lORikgKi8KKwkJICAgIGNhc2UgMTogcmV0dXJuIC1waV9vXzQtdGlueTsvKiBhdGFuKC1JTkYsK0lORikgKi8KKwkJICAgIGNhc2UgMjogcmV0dXJuICAzLjAqcGlfb180K3Rpbnk7LyphdGFuKCtJTkYsLUlORikqLworCQkgICAgY2FzZSAzOiByZXR1cm4gLTMuMCpwaV9vXzQtdGlueTsvKmF0YW4oLUlORiwtSU5GKSovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJc3dpdGNoKG0pIHsKKwkJICAgIGNhc2UgMDogcmV0dXJuICB6ZXJvICA7CS8qIGF0YW4oKy4uLiwrSU5GKSAqLworCQkgICAgY2FzZSAxOiByZXR1cm4gLXplcm8gIDsJLyogYXRhbigtLi4uLCtJTkYpICovCisJCSAgICBjYXNlIDI6IHJldHVybiAgcGkrdGlueSAgOwkvKiBhdGFuKCsuLi4sLUlORikgKi8KKwkJICAgIGNhc2UgMzogcmV0dXJuIC1waS10aW55ICA7CS8qIGF0YW4oLS4uLiwtSU5GKSAqLworCQl9CisJICAgIH0KKwl9CisgICAgLyogd2hlbiB5IGlzIElORiAqLworCWlmKGl5PT0weDdmZjAwMDAwKSByZXR1cm4gKGh5PDApPyAtcGlfb18yLXRpbnk6IHBpX29fMit0aW55OworCisgICAgLyogY29tcHV0ZSB5L3ggKi8KKwlrID0gKGl5LWl4KT4+MjA7CisJaWYoayA+IDYwKSB6PXBpX29fMiswLjUqcGlfbG87IAkvKiB8eS94fCA+ICAyKio2MCAqLworCWVsc2UgaWYoaHg8MCYmazwtNjApIHo9MC4wOyAJLyogfHl8L3ggPCAtMioqNjAgKi8KKwllbHNlIHo9YXRhbihmYWJzKHkveCkpOwkJLyogc2FmZSB0byBkbyB5L3ggKi8KKwlzd2l0Y2ggKG0pIHsKKwkgICAgY2FzZSAwOiByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKCssKykgKi8KKwkgICAgY2FzZSAxOiB7CisJICAgIAkgICAgICB1X2ludDMyX3Qgemg7CisJCSAgICAgIEdFVF9ISUdIX1dPUkQoemgseik7CisJCSAgICAgIFNFVF9ISUdIX1dPUkQoeix6aCBeIDB4ODAwMDAwMDApOworCQkgICAgfQorCQkgICAgcmV0dXJuICAgICAgIHogIDsJLyogYXRhbigtLCspICovCisJICAgIGNhc2UgMjogcmV0dXJuICBwaS0oei1waV9sbyk7LyogYXRhbigrLC0pICovCisJICAgIGRlZmF1bHQ6IC8qIGNhc2UgMyAqLworCSAgICAJICAgIHJldHVybiAgKHotcGlfbG8pLXBpOy8qIGF0YW4oLSwtKSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXRhbjJmLmMgYi9saWJtL3NyYy9lX2F0YW4yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmQ1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW4yZi5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIGVfYXRhbjJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2F0YW4yLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2F0YW4yZi5jLHYgMS43IDIwMDQvMDYvMDIgMTc6MDk6MDUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3RpbnkgID0gMS4wZS0zMCwKK3plcm8gID0gMC4wLAorcGlfb180ICA9IDcuODUzOTgxODUyNWUtMDEsIC8qIDB4M2Y0OTBmZGIgKi8KK3BpX29fMiAgPSAxLjU3MDc5NjM3MDVlKzAwLCAvKiAweDNmYzkwZmRiICovCitwaSAgICAgID0gMy4xNDE1OTI3NDEwZSswMCwgLyogMHg0MDQ5MGZkYiAqLworcGlfbG8gICA9IC04Ljc0MjI3NzY1NzNlLTA4OyAvKiAweGIzYmJiZDJlICovCisKK2Zsb2F0CitfX2llZWU3NTRfYXRhbjJmKGZsb2F0IHksIGZsb2F0IHgpCit7CisJZmxvYXQgejsKKwlpbnQzMl90IGssbSxoeCxoeSxpeCxpeTsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CisJaWYoKGl4PjB4N2Y4MDAwMDApfHwKKwkgICAoaXk+MHg3ZjgwMDAwMCkpCS8qIHggb3IgeSBpcyBOYU4gKi8KKwkgICByZXR1cm4geCt5OworCWlmKGh4PT0weDNmODAwMDAwKSByZXR1cm4gYXRhbmYoeSk7ICAgLyogeD0xLjAgKi8KKwltID0gKChoeT4+MzEpJjEpfCgoaHg+PjMwKSYyKTsJLyogMipzaWduKHgpK3NpZ24oeSkgKi8KKworICAgIC8qIHdoZW4geSA9IDAgKi8KKwlpZihpeT09MCkgeworCSAgICBzd2l0Y2gobSkgeworCQljYXNlIDA6CisJCWNhc2UgMTogcmV0dXJuIHk7IAkvKiBhdGFuKCstMCwrYW55dGhpbmcpPSstMCAqLworCQljYXNlIDI6IHJldHVybiAgcGkrdGlueTsvKiBhdGFuKCswLC1hbnl0aGluZykgPSBwaSAqLworCQljYXNlIDM6IHJldHVybiAtcGktdGlueTsvKiBhdGFuKC0wLC1hbnl0aGluZykgPS1waSAqLworCSAgICB9CisJfQorICAgIC8qIHdoZW4geCA9IDAgKi8KKwlpZihpeD09MCkgcmV0dXJuIChoeTwwKT8gIC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisKKyAgICAvKiB3aGVuIHggaXMgSU5GICovCisJaWYoaXg9PTB4N2Y4MDAwMDApIHsKKwkgICAgaWYoaXk9PTB4N2Y4MDAwMDApIHsKKwkJc3dpdGNoKG0pIHsKKwkJICAgIGNhc2UgMDogcmV0dXJuICBwaV9vXzQrdGlueTsvKiBhdGFuKCtJTkYsK0lORikgKi8KKwkJICAgIGNhc2UgMTogcmV0dXJuIC1waV9vXzQtdGlueTsvKiBhdGFuKC1JTkYsK0lORikgKi8KKwkJICAgIGNhc2UgMjogcmV0dXJuICAoZmxvYXQpMy4wKnBpX29fNCt0aW55Oy8qYXRhbigrSU5GLC1JTkYpKi8KKwkJICAgIGNhc2UgMzogcmV0dXJuIChmbG9hdCktMy4wKnBpX29fNC10aW55Oy8qYXRhbigtSU5GLC1JTkYpKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHplcm8gIDsJLyogYXRhbigrLi4uLCtJTkYpICovCisJCSAgICBjYXNlIDE6IHJldHVybiAtemVybyAgOwkvKiBhdGFuKC0uLi4sK0lORikgKi8KKwkJICAgIGNhc2UgMjogcmV0dXJuICBwaSt0aW55ICA7CS8qIGF0YW4oKy4uLiwtSU5GKSAqLworCQkgICAgY2FzZSAzOiByZXR1cm4gLXBpLXRpbnkgIDsJLyogYXRhbigtLi4uLC1JTkYpICovCisJCX0KKwkgICAgfQorCX0KKyAgICAvKiB3aGVuIHkgaXMgSU5GICovCisJaWYoaXk9PTB4N2Y4MDAwMDApIHJldHVybiAoaHk8MCk/IC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisKKyAgICAvKiBjb21wdXRlIHkveCAqLworCWsgPSAoaXktaXgpPj4yMzsKKwlpZihrID4gNjApIHo9cGlfb18yKyhmbG9hdCkwLjUqcGlfbG87IAkvKiB8eS94fCA+ICAyKio2MCAqLworCWVsc2UgaWYoaHg8MCYmazwtNjApIHo9MC4wOyAJLyogfHl8L3ggPCAtMioqNjAgKi8KKwllbHNlIHo9YXRhbmYoZmFic2YoeS94KSk7CS8qIHNhZmUgdG8gZG8geS94ICovCisJc3dpdGNoIChtKSB7CisJICAgIGNhc2UgMDogcmV0dXJuICAgICAgIHogIDsJLyogYXRhbigrLCspICovCisJICAgIGNhc2UgMTogeworCSAgICAJICAgICAgdV9pbnQzMl90IHpoOworCQkgICAgICBHRVRfRkxPQVRfV09SRCh6aCx6KTsKKwkJICAgICAgU0VUX0ZMT0FUX1dPUkQoeix6aCBeIDB4ODAwMDAwMDApOworCQkgICAgfQorCQkgICAgcmV0dXJuICAgICAgIHogIDsJLyogYXRhbigtLCspICovCisJICAgIGNhc2UgMjogcmV0dXJuICBwaS0oei1waV9sbyk7LyogYXRhbigrLC0pICovCisJICAgIGRlZmF1bHQ6IC8qIGNhc2UgMyAqLworCSAgICAJICAgIHJldHVybiAgKHotcGlfbG8pLXBpOy8qIGF0YW4oLSwtKSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXRhbmguYyBiL2xpYm0vc3JjL2VfYXRhbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ4NzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hdGFuaC5jCkBAIC0wLDAgKzEsNjMgQEAKKworLyogQCgjKWVfYXRhbmguYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXRhbmguYyx2IDEuNyAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2F0YW5oKHgpCisgKiBNZXRob2QgOgorICogICAgMS5SZWR1Y2VkIHggdG8gcG9zaXRpdmUgYnkgYXRhbmgoLXgpID0gLWF0YW5oKHgpCisgKiAgICAyLkZvciB4Pj0wLjUKKyAqICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMnggICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAqCWF0YW5oKHgpID0gLS0tICogbG9nKDEgKyAtLS0tLS0tKSA9IDAuNSAqIGxvZzFwKDIgKiAtLS0tLS0tLSkKKyAqICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAxIC0geCAgICAgICAgICAgICAgICAgICAgICAxIC0geAorICoJCisgKiAJRm9yIHg8MC41CisgKglhdGFuaCh4KSA9IDAuNSpsb2cxcCgyeCsyeCp4LygxLXgpKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglhdGFuaCh4KSBpcyBOYU4gaWYgfHh8ID4gMSB3aXRoIHNpZ25hbDsKKyAqCWF0YW5oKE5hTikgaXMgdGhhdCBOYU4gd2l0aCBubyBzaWduYWw7CisgKglhdGFuaCgrLTEpIGlzICstSU5GIHdpdGggc2lnbmFsLgorICoKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgaHVnZSA9IDFlMzAwOworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4wOworCitkb3VibGUKK19faWVlZTc1NF9hdGFuaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdDsKKwlpbnQzMl90IGh4LGl4OworCXVfaW50MzJfdCBseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZiAoKGl4fCgobHh8KC1seCkpPj4zMSkpPjB4M2ZmMDAwMDApIC8qIHx4fD4xICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsKKwlpZihpeD09MHgzZmYwMDAwMCkgCisJICAgIHJldHVybiB4L3plcm87CisJaWYoaXg8MHgzZTMwMDAwMCYmKGh1Z2UreCk+emVybykgcmV0dXJuIHg7CS8qIHg8MioqLTI4ICovCisJU0VUX0hJR0hfV09SRCh4LGl4KTsKKwlpZihpeDwweDNmZTAwMDAwKSB7CQkvKiB4IDwgMC41ICovCisJICAgIHQgPSB4K3g7CisJICAgIHQgPSAwLjUqbG9nMXAodCt0KngvKG9uZS14KSk7CisJfSBlbHNlIAorCSAgICB0ID0gMC41KmxvZzFwKCh4K3gpLyhvbmUteCkpOworCWlmKGh4Pj0wKSByZXR1cm4gdDsgZWxzZSByZXR1cm4gLXQ7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2F0YW5oZi5jIGIvbGlibS9zcmMvZV9hdGFuaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGViZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hdGFuaGYuYwpAQCAtMCwwICsxLDQ2IEBACisvKiBlX2F0YW5oZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9hdGFuaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hdGFuaGYuYyx2IDEuNiAyMDAyLzA1LzI4IDE3OjAzOjEyIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMCwgaHVnZSA9IDFlMzA7CisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvID0gMC4wOworCitmbG9hdAorX19pZWVlNzU0X2F0YW5oZihmbG9hdCB4KQoreworCWZsb2F0IHQ7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYgKGl4PjB4M2Y4MDAwMDApIAkJLyogfHh8PjEgKi8KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOworCWlmKGl4PT0weDNmODAwMDAwKQorCSAgICByZXR1cm4geC96ZXJvOworCWlmKGl4PDB4MzE4MDAwMDAmJihodWdlK3gpPnplcm8pIHJldHVybiB4OwkvKiB4PDIqKi0yOCAqLworCVNFVF9GTE9BVF9XT1JEKHgsaXgpOworCWlmKGl4PDB4M2YwMDAwMDApIHsJCS8qIHggPCAwLjUgKi8KKwkgICAgdCA9IHgreDsKKwkgICAgdCA9IChmbG9hdCkwLjUqbG9nMXBmKHQrdCp4LyhvbmUteCkpOworCX0gZWxzZQorCSAgICB0ID0gKGZsb2F0KTAuNSpsb2cxcGYoKHgreCkvKG9uZS14KSk7CisJaWYoaHg+PTApIHJldHVybiB0OyBlbHNlIHJldHVybiAtdDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfY29zaC5jIGIvbGlibS9zcmMvZV9jb3NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhOTQzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfY29zaC5jCkBAIC0wLDAgKzEsODYgQEAKKworLyogQCgjKWVfY29zaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2Nvc2guYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2Nvc2goeCkKKyAqIE1ldGhvZCA6IAorICogbWF0aGVtYXRpY2FsbHkgY29zaCh4KSBpZiBkZWZpbmVkIHRvIGJlIChleHAoeCkrZXhwKC14KSkvMgorICoJMS4gUmVwbGFjZSB4IGJ5IHx4fCAoY29zaCh4KSA9IGNvc2goLXgpKS4gCisgKgkyLiAKKyAqCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBleHAoeCkgLSAxIF1eMiAKKyAqCSAgICAwICAgICAgICA8PSB4IDw9IGxuMi8yICA6ICBjb3NoKHgpIDo9IDEgKyAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkJCSAgICAgICAJCQkgICAgICAgICAgIDIqZXhwKHgpCisgKgorICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAoeCkgKyAgMS9leHAoeCkKKyAqCSAgICBsbjIvMiAgICA8PSB4IDw9IDIyICAgICA6ICBjb3NoKHgpIDo9IC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkJICAgICAgIAkJCSAgICAgICAgICAyCisgKgkgICAgMjIgICAgICAgPD0geCA8PSBsbm92ZnQgOiAgY29zaCh4KSA6PSBleHAoeCkvMiAKKyAqCSAgICBsbm92ZnQgICA8PSB4IDw9IGxuMm92ZnQ6ICBjb3NoKHgpIDo9IGV4cCh4LzIpLzIgKiBleHAoeC8yKQorICoJICAgIGxuMm92ZnQgIDwgIHgJICAgIDogIGNvc2goeCkgOj0gaHVnZSpodWdlIChvdmVyZmxvdykKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJY29zaCh4KSBpcyB8eHwgaWYgeCBpcyArSU5GLCAtSU5GLCBvciBOYU4uCisgKglvbmx5IGNvc2goMCk9MSBpcyBleGFjdCBmb3IgZmluaXRlIHguCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmUgPSAxLjAsIGhhbGY9MC41LCBodWdlID0gMS4wZTMwMDsKKworZG91YmxlCitfX2llZWU3NTRfY29zaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx3OworCWludDMyX3QgaXg7CisJdV9pbnQzMl90IGx4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHx4fC4gKi8KKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgqeDsJCisKKyAgICAvKiB8eHwgaW4gWzAsMC41KmxuMl0sIHJldHVybiAxK2V4cG0xKHx4fCleMi8oMipleHAofHh8KSkgKi8KKwlpZihpeDwweDNmZDYyZTQzKSB7CisJICAgIHQgPSBleHBtMShmYWJzKHgpKTsKKwkgICAgdyA9IG9uZSt0OworCSAgICBpZiAoaXg8MHgzYzgwMDAwMCkgcmV0dXJuIHc7CS8qIGNvc2godGlueSkgPSAxICovCisJICAgIHJldHVybiBvbmUrKHQqdCkvKHcrdyk7CisJfQorCisgICAgLyogfHh8IGluIFswLjUqbG4yLDIyXSwgcmV0dXJuIChleHAofHh8KSsxL2V4cCh8eHwpLzI7ICovCisJaWYgKGl4IDwgMHg0MDM2MDAwMCkgeworCQl0ID0gX19pZWVlNzU0X2V4cChmYWJzKHgpKTsKKwkJcmV0dXJuIGhhbGYqdCtoYWxmL3Q7CisJfQorCisgICAgLyogfHh8IGluIFsyMiwgbG9nKG1heGRvdWJsZSldIHJldHVybiBoYWxmKmV4cCh8eHwpICovCisJaWYgKGl4IDwgMHg0MDg2MkU0MikgIHJldHVybiBoYWxmKl9faWVlZTc1NF9leHAoZmFicyh4KSk7CisKKyAgICAvKiB8eHwgaW4gW2xvZyhtYXhkb3VibGUpLCBvdmVyZmxvd3RocmVzb2xkXSAqLworCUdFVF9MT1dfV09SRChseCx4KTsKKwlpZiAoaXg8MHg0MDg2MzNDRSB8fAorCSAgICAgICgoaXg9PTB4NDA4NjMzY2UpJiYobHg8PSh1X2ludDMyX3QpMHg4ZmI5Zjg3ZCkpKSB7CisJICAgIHcgPSBfX2llZWU3NTRfZXhwKGhhbGYqZmFicyh4KSk7CisJICAgIHQgPSBoYWxmKnc7CisJICAgIHJldHVybiB0Knc7CisJfQorCisgICAgLyogfHh8ID4gb3ZlcmZsb3d0aHJlc29sZCwgY29zaCh4KSBvdmVyZmxvdyAqLworCXJldHVybiBodWdlKmh1Z2U7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2Nvc2hmLmMgYi9saWJtL3NyYy9lX2Nvc2hmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkZjliMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfY29zaGYuYwpAQCAtMCwwICsxLDYzIEBACisvKiBlX2Nvc2hmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2Nvc2guYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfY29zaGYuYyx2IDEuNyAyMDA1LzExLzEzIDAwOjA4OjIzIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMCwgaGFsZj0wLjUsIGh1Z2UgPSAxLjBlMzA7CisKK2Zsb2F0CitfX2llZWU3NTRfY29zaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHc7CisJaW50MzJfdCBpeDsKKworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgqeDsKKworICAgIC8qIHx4fCBpbiBbMCwwLjUqbG4yXSwgcmV0dXJuIDErZXhwbTEofHh8KV4yLygyKmV4cCh8eHwpKSAqLworCWlmKGl4PDB4M2ViMTcyMTgpIHsKKwkgICAgdCA9IGV4cG0xZihmYWJzZih4KSk7CisJICAgIHcgPSBvbmUrdDsKKwkgICAgaWYgKGl4PDB4Mzk4MDAwMDApIHJldHVybiBvbmU7CS8qIGNvc2godGlueSkgPSAxICovCisJICAgIHJldHVybiBvbmUrKHQqdCkvKHcrdyk7CisJfQorCisgICAgLyogfHh8IGluIFswLjUqbG4yLDldLCByZXR1cm4gKGV4cCh8eHwpKzEvZXhwKHx4fCkpLzI7ICovCisJaWYgKGl4IDwgMHg0MTEwMDAwMCkgeworCQl0ID0gX19pZWVlNzU0X2V4cGYoZmFic2YoeCkpOworCQlyZXR1cm4gaGFsZip0K2hhbGYvdDsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzksIGxvZyhtYXhmbG9hdCldIHJldHVybiBoYWxmKmV4cCh8eHwpICovCisJaWYgKGl4IDwgMHg0MmIxNzIxNykgIHJldHVybiBoYWxmKl9faWVlZTc1NF9leHBmKGZhYnNmKHgpKTsKKworICAgIC8qIHx4fCBpbiBbbG9nKG1heGZsb2F0KSwgb3ZlcmZsb3d0aHJlc29sZF0gKi8KKwlpZiAoaXg8PTB4NDJiMmQ0ZmMpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHBmKGhhbGYqZmFic2YoeCkpOworCSAgICB0ID0gaGFsZip3OworCSAgICByZXR1cm4gdCp3OworCX0KKworICAgIC8qIHx4fCA+IG92ZXJmbG93dGhyZXNvbGQsIGNvc2goeCkgb3ZlcmZsb3cgKi8KKwlyZXR1cm4gaHVnZSpodWdlOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9leHAuYyBiL2xpYm0vc3JjL2VfZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2MTg5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZXhwLmMKQEAgLTAsMCArMSwxNTkgQEAKKworLyogQCgjKWVfZXhwLmMgMS42IDA0LzA0LzIyICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9leHAuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9leHAoeCkKKyAqIFJldHVybnMgdGhlIGV4cG9uZW50aWFsIG9mIHguCisgKgorICogTWV0aG9kCisgKiAgIDEuIEFyZ3VtZW50IHJlZHVjdGlvbjoKKyAqICAgICAgUmVkdWNlIHggdG8gYW4gciBzbyB0aGF0IHxyfCA8PSAwLjUqbG4yIH4gMC4zNDY1OC4KKyAqCUdpdmVuIHgsIGZpbmQgciBhbmQgaW50ZWdlciBrIHN1Y2ggdGhhdAorICoKKyAqICAgICAgICAgICAgICAgeCA9IGsqbG4yICsgciwgIHxyfCA8PSAwLjUqbG4yLiAgCisgKgorICogICAgICBIZXJlIHIgd2lsbCBiZSByZXByZXNlbnRlZCBhcyByID0gaGktbG8gZm9yIGJldHRlciAKKyAqCWFjY3VyYWN5LgorICoKKyAqICAgMi4gQXBwcm94aW1hdGlvbiBvZiBleHAocikgYnkgYSBzcGVjaWFsIHJhdGlvbmFsIGZ1bmN0aW9uIG9uCisgKgl0aGUgaW50ZXJ2YWwgWzAsMC4zNDY1OF06CisgKglXcml0ZQorICoJICAgIFIocioqMikgPSByKihleHAocikrMSkvKGV4cChyKS0xKSA9IDIgKyByKnIvNiAtIHIqKjQvMzYwICsgLi4uCisgKiAgICAgIFdlIHVzZSBhIHNwZWNpYWwgUmVtZXMgYWxnb3JpdGhtIG9uIFswLDAuMzQ2NThdIHRvIGdlbmVyYXRlIAorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNSB0byBhcHByb3hpbWF0ZSBSLiBUaGUgbWF4aW11bSBlcnJvciAKKyAqCW9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQgYnkgMioqLTU5LiBJbgorICoJb3RoZXIgd29yZHMsCisgKgkgICAgUih6KSB+IDIuMCArIFAxKnogKyBQMip6KioyICsgUDMqeioqMyArIFA0KnoqKjQgKyBQNSp6Kio1CisgKiAgCSh3aGVyZSB6PXIqciwgYW5kIHRoZSB2YWx1ZXMgb2YgUDEgdG8gUDUgYXJlIGxpc3RlZCBiZWxvdykKKyAqCWFuZAorICoJICAgIHwgICAgICAgICAgICAgICAgICA1ICAgICAgICAgIHwgICAgIC01OQorICoJICAgIHwgMi4wK1AxKnorLi4uK1A1KnogICAtICBSKHopIHwgPD0gMiAKKyAqCSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKglUaGUgY29tcHV0YXRpb24gb2YgZXhwKHIpIHRodXMgYmVjb21lcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqcgorICoJCWV4cChyKSA9IDEgKyAtLS0tLS0tCisgKgkJICAgICAgICAgICAgICBSIC0gcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKlIxKHIpCQorICoJCSAgICAgICA9IDEgKyByICsgLS0tLS0tLS0tLS0gKGZvciBiZXR0ZXIgYWNjdXJhY3kpCisgKgkJICAgICAgICAgICAgICAgICAgMiAtIFIxKHIpCisgKgl3aGVyZQorICoJCQkgICAgICAgICAyICAgICAgIDQgICAgICAgICAgICAgMTAKKyAqCQlSMShyKSA9IHIgLSAoUDEqciAgKyBQMipyICArIC4uLiArIFA1KnIgICApLgorICoJCisgKiAgIDMuIFNjYWxlIGJhY2sgdG8gb2J0YWluIGV4cCh4KToKKyAqCUZyb20gc3RlcCAxLCB3ZSBoYXZlCisgKgkgICBleHAoeCkgPSAyXmsgKiBleHAocikKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJZXhwKElORikgaXMgSU5GLCBleHAoTmFOKSBpcyBOYU47CisgKglleHAoLUlORikgaXMgMCwgYW5kCisgKglmb3IgZmluaXRlIGFyZ3VtZW50LCBvbmx5IGV4cCgwKT0xIGlzIGV4YWN0LgorICoKKyAqIEFjY3VyYWN5OgorICoJYWNjb3JkaW5nIHRvIGFuIGVycm9yIGFuYWx5c2lzLCB0aGUgZXJyb3IgaXMgYWx3YXlzIGxlc3MgdGhhbgorICoJMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICoKKyAqIE1pc2MuIGluZm8uCisgKglGb3IgSUVFRSBkb3VibGUgCisgKgkgICAgaWYgeCA+ICA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMiB0aGVuIGV4cCh4KSBvdmVyZmxvdworICoJICAgIGlmIHggPCAtNy40NTEzMzIxOTEwMTk0MTEwODQyMGUrMDIgdGhlbiBleHAoeCkgdW5kZXJmbG93CisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZQk9IDEuMCwKK2hhbEZbMl0JPSB7MC41LC0wLjUsfSwKK2h1Z2UJPSAxLjBlKzMwMCwKK3R3b20xMDAwPSA5LjMzMjYzNjE4NTAzMjE4ODc4OTkwZS0zMDIsICAgICAvKiAyKiotMTAwMD0weDAxNzAwMDAwLDAqLworb190aHJlc2hvbGQ9ICA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMiwgIC8qIDB4NDA4NjJFNDIsIDB4RkVGQTM5RUYgKi8KK3VfdGhyZXNob2xkPSAtNy40NTEzMzIxOTEwMTk0MTEwODQyMGUrMDIsICAvKiAweGMwODc0OTEwLCAweEQ1MkQzMDUxICovCitsbjJISVsyXSAgID17IDYuOTMxNDcxODAzNjkxMjM4MTY0OTBlLTAxLCAgLyogMHgzZmU2MmU0MiwgMHhmZWUwMDAwMCAqLworCSAgICAgLTYuOTMxNDcxODAzNjkxMjM4MTY0OTBlLTAxLH0sLyogMHhiZmU2MmU0MiwgMHhmZWUwMDAwMCAqLworbG4yTE9bMl0gICA9eyAxLjkwODIxNDkyOTI3MDU4NzcwMDAyZS0xMCwgIC8qIDB4M2RlYTM5ZWYsIDB4MzU3OTNjNzYgKi8KKwkgICAgIC0xLjkwODIxNDkyOTI3MDU4NzcwMDAyZS0xMCx9LC8qIDB4YmRlYTM5ZWYsIDB4MzU3OTNjNzYgKi8KK2ludmxuMiA9ICAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwZSswMCwgLyogMHgzZmY3MTU0NywgMHg2NTJiODJmZSAqLworUDEgICA9ICAxLjY2NjY2NjY2NjY2NjY2MDE5MDM3ZS0wMSwgLyogMHgzRkM1NTU1NSwgMHg1NTU1NTUzRSAqLworUDIgICA9IC0yLjc3Nzc3Nzc3NzcwMTU1OTMzODQyZS0wMywgLyogMHhCRjY2QzE2QywgMHgxNkJFQkQ5MyAqLworUDMgICA9ICA2LjYxMzc1NjMyMTQzNzkzNDM2MTE3ZS0wNSwgLyogMHgzRjExNTY2QSwgMHhBRjI1REUyQyAqLworUDQgICA9IC0xLjY1MzM5MDIyMDU0NjUyNTE1MzkwZS0wNiwgLyogMHhCRUJCQkQ0MSwgMHhDNUQyNkJGMSAqLworUDUgICA9ICA0LjEzODEzNjc5NzA1NzIzODQ2MDM5ZS0wODsgLyogMHgzRTY2Mzc2OSwgMHg3MkJFQTREMCAqLworCisKK2RvdWJsZQorX19pZWVlNzU0X2V4cChkb3VibGUgeCkJLyogZGVmYXVsdCBJRUVFIGRvdWJsZSBleHAgKi8KK3sKKwlkb3VibGUgeSxoaT0wLjAsbG89MC4wLGMsdDsKKwlpbnQzMl90IGs9MCx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwl4c2IgPSAoaHg+PjMxKSYxOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQwODYyRTQyKSB7CQkJLyogaWYgfHh8Pj03MDkuNzguLi4gKi8KKyAgICAgICAgICAgIGlmKGh4Pj0weDdmZjAwMDAwKSB7CisJICAgICAgICB1X2ludDMyX3QgbHg7CisJCUdFVF9MT1dfV09SRChseCx4KTsKKwkJaWYoKChoeCYweGZmZmZmKXxseCkhPTApCisJCSAgICAgcmV0dXJuIHgreDsgCQkvKiBOYU4gKi8KKwkJZWxzZSByZXR1cm4gKHhzYj09MCk/IHg6MC4wOwkvKiBleHAoKy1pbmYpPXtpbmYsMH0gKi8KKwkgICAgfQorCSAgICBpZih4ID4gb190aHJlc2hvbGQpIHJldHVybiBodWdlKmh1Z2U7IC8qIG92ZXJmbG93ICovCisJICAgIGlmKHggPCB1X3RocmVzaG9sZCkgcmV0dXJuIHR3b20xMDAwKnR3b20xMDAwOyAvKiB1bmRlcmZsb3cgKi8KKwl9CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwlpZihoeCA+IDB4M2ZkNjJlNDIpIHsJCS8qIGlmICB8eHwgPiAwLjUgbG4yICovIAorCSAgICBpZihoeCA8IDB4M0ZGMEEyQjIpIHsJLyogYW5kIHx4fCA8IDEuNSBsbjIgKi8KKwkJaGkgPSB4LWxuMkhJW3hzYl07IGxvPWxuMkxPW3hzYl07IGsgPSAxLXhzYi14c2I7CisJICAgIH0gZWxzZSB7CisJCWsgID0gKGludCkoaW52bG4yKngraGFsRlt4c2JdKTsKKwkJdCAgPSBrOworCQloaSA9IHggLSB0KmxuMkhJWzBdOwkvKiB0KmxuMkhJIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMkxPWzBdOworCSAgICB9CisJICAgIHggID0gaGkgLSBsbzsKKwl9IAorCWVsc2UgaWYoaHggPCAweDNlMzAwMDAwKSAgewkvKiB3aGVuIHx4fDwyKiotMjggKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIG9uZSt4Oy8qIHRyaWdnZXIgaW5leGFjdCAqLworCX0KKwllbHNlIGsgPSAwOworCisgICAgLyogeCBpcyBub3cgaW4gcHJpbWFyeSByYW5nZSAqLworCXQgID0geCp4OworCWMgID0geCAtIHQqKFAxK3QqKFAyK3QqKFAzK3QqKFA0K3QqUDUpKSkpOworCWlmKGs9PTApIAlyZXR1cm4gb25lLSgoeCpjKS8oYy0yLjApLXgpOyAKKwllbHNlIAkJeSA9IG9uZS0oKGxvLSh4KmMpLygyLjAtYykpLWhpKTsKKwlpZihrID49IC0xMDIxKSB7CisJICAgIHVfaW50MzJfdCBoeTsKKwkgICAgR0VUX0hJR0hfV09SRChoeSx5KTsKKwkgICAgU0VUX0hJR0hfV09SRCh5LGh5KyhrPDwyMCkpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgcmV0dXJuIHk7CisJfSBlbHNlIHsKKwkgICAgdV9pbnQzMl90IGh5OworCSAgICBHRVRfSElHSF9XT1JEKGh5LHkpOworCSAgICBTRVRfSElHSF9XT1JEKHksaHkrKChrKzEwMDApPDwyMCkpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgcmV0dXJuIHkqdHdvbTEwMDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9leHBmLmMgYi9saWJtL3NyYy9lX2V4cGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA2NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9leHBmLmMKQEAgLTAsMCArMSw5NSBAQAorLyogZV9leHBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2V4cC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9leHBmLmMsdiAxLjEwIDIwMDUvMTEvMzAgMDQ6NTY6NDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZQk9IDEuMCwKK2hhbEZbMl0JPSB7MC41LC0wLjUsfSwKK2h1Z2UJPSAxLjBlKzMwLAordHdvbTEwMCA9IDcuODg4NjA5MDUyMmUtMzEsICAgICAgLyogMioqLTEwMD0weDBkODAwMDAwICovCitvX3RocmVzaG9sZD0gIDguODcyMTY3OTY4OGUrMDEsICAvKiAweDQyYjE3MTgwICovCit1X3RocmVzaG9sZD0gLTEuMDM5NzIwODQwNWUrMDIsICAvKiAweGMyY2ZmMWI1ICovCitsbjJISVsyXSAgID17IDYuOTMxNDU3NTE5NWUtMDEsCQkvKiAweDNmMzE3MjAwICovCisJICAgICAtNi45MzE0NTc1MTk1ZS0wMSx9LAkvKiAweGJmMzE3MjAwICovCitsbjJMT1syXSAgID17IDEuNDI4NjA2NzY1M2UtMDYsICAJLyogMHgzNWJmYmU4ZSAqLworCSAgICAgLTEuNDI4NjA2NzY1M2UtMDYsfSwJLyogMHhiNWJmYmU4ZSAqLworaW52bG4yID0gIDEuNDQyNjk1MDIxNmUrMDAsIAkJLyogMHgzZmI4YWEzYiAqLworUDEgICA9ICAxLjY2NjY2NjcxNjNlLTAxLCAvKiAweDNlMmFhYWFiICovCitQMiAgID0gLTIuNzc3Nzc3ODQ1MGUtMDMsIC8qIDB4YmIzNjBiNjEgKi8KK1AzICAgPSAgNi42MTM3NTU5NzcwZS0wNSwgLyogMHgzODhhYjM1NSAqLworUDQgICA9IC0xLjY1MzM5MDE5OTllLTA2LCAvKiAweGI1ZGRlYTBlICovCitQNSAgID0gIDQuMTM4MTM2OTQ0MmUtMDg7IC8qIDB4MzMzMWJiNGMgKi8KKworZmxvYXQKK19faWVlZTc1NF9leHBmKGZsb2F0IHgpCS8qIGRlZmF1bHQgSUVFRSBkb3VibGUgZXhwICovCit7CisJZmxvYXQgeSxoaT0wLjAsbG89MC4wLGMsdDsKKwlpbnQzMl90IGs9MCx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJeHNiID0gKGh4Pj4zMSkmMTsJCS8qIHNpZ24gYml0IG9mIHggKi8KKwloeCAmPSAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCisgICAgLyogZmlsdGVyIG91dCBub24tZmluaXRlIGFyZ3VtZW50ICovCisJaWYoaHggPj0gMHg0MmIxNzIxOCkgewkJCS8qIGlmIHx4fD49ODguNzIxLi4uICovCisJICAgIGlmKGh4PjB4N2Y4MDAwMDApCisJCSByZXR1cm4geCt4OwkgCQkvKiBOYU4gKi8KKyAgICAgICAgICAgIGlmKGh4PT0weDdmODAwMDAwKQorCQlyZXR1cm4gKHhzYj09MCk/IHg6MC4wOwkJLyogZXhwKCstaW5mKT17aW5mLDB9ICovCisJICAgIGlmKHggPiBvX3RocmVzaG9sZCkgcmV0dXJuIGh1Z2UqaHVnZTsgLyogb3ZlcmZsb3cgKi8KKwkgICAgaWYoeCA8IHVfdGhyZXNob2xkKSByZXR1cm4gdHdvbTEwMCp0d29tMTAwOyAvKiB1bmRlcmZsb3cgKi8KKwl9CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwlpZihoeCA+IDB4M2ViMTcyMTgpIHsJCS8qIGlmICB8eHwgPiAwLjUgbG4yICovCisJICAgIGlmKGh4IDwgMHgzRjg1MTU5MikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQloaSA9IHgtbG4ySElbeHNiXTsgbG89bG4yTE9beHNiXTsgayA9IDEteHNiLXhzYjsKKwkgICAgfSBlbHNlIHsKKwkJayAgPSBpbnZsbjIqeCtoYWxGW3hzYl07CisJCXQgID0gazsKKwkJaGkgPSB4IC0gdCpsbjJISVswXTsJLyogdCpsbjJISSBpcyBleGFjdCBoZXJlICovCisJCWxvID0gdCpsbjJMT1swXTsKKwkgICAgfQorCSAgICB4ICA9IGhpIC0gbG87CisJfQorCWVsc2UgaWYoaHggPCAweDMxODAwMDAwKSAgewkvKiB3aGVuIHx4fDwyKiotMjggKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIG9uZSt4Oy8qIHRyaWdnZXIgaW5leGFjdCAqLworCX0KKwllbHNlIGsgPSAwOworCisgICAgLyogeCBpcyBub3cgaW4gcHJpbWFyeSByYW5nZSAqLworCXQgID0geCp4OworCWMgID0geCAtIHQqKFAxK3QqKFAyK3QqKFAzK3QqKFA0K3QqUDUpKSkpOworCWlmKGs9PTApIAlyZXR1cm4gb25lLSgoeCpjKS8oYy0oZmxvYXQpMi4wKS14KTsKKwllbHNlIAkJeSA9IG9uZS0oKGxvLSh4KmMpLygoZmxvYXQpMi4wLWMpKS1oaSk7CisJaWYoayA+PSAtMTI1KSB7CisJICAgIHVfaW50MzJfdCBoeTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHksaHkrKGs8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geTsKKwl9IGVsc2UgeworCSAgICB1X2ludDMyX3QgaHk7CisJICAgIEdFVF9GTE9BVF9XT1JEKGh5LHkpOworCSAgICBTRVRfRkxPQVRfV09SRCh5LGh5KygoaysxMDApPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgcmV0dXJuIHkqdHdvbTEwMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2Ztb2QuYyBiL2xpYm0vc3JjL2VfZm1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiM2MxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Ztb2QuYwpAQCAtMCwwICsxLDEzMyBAQAorCisvKiBAKCMpZV9mbW9kLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZm1vZC5jLHYgMS45IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiAKKyAqIF9faWVlZTc1NF9mbW9kKHgseSkKKyAqIFJldHVybiB4IG1vZCB5IGluIGV4YWN0IGFyaXRobWV0aWMKKyAqIE1ldGhvZDogc2hpZnQgYW5kIHN1YnRyYWN0CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmUgPSAxLjAsIFplcm9bXSA9IHswLjAsIC0wLjAsfTsKKworZG91YmxlCitfX2llZWU3NTRfZm1vZChkb3VibGUgeCwgZG91YmxlIHkpCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisJdV9pbnQzMl90IGx4LGx5LGx6OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlFWFRSQUNUX1dPUkRTKGh5LGx5LHkpOworCXN4ID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gb2YgeCAqLworCWh4IF49c3g7CQkvKiB8eHwgKi8KKwloeSAmPSAweDdmZmZmZmZmOwkvKiB8eXwgKi8KKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoKGh5fGx5KT09MHx8KGh4Pj0weDdmZjAwMDAwKXx8CS8qIHk9MCxvciB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHl8KChseXwtbHkpPj4zMSkpPjB4N2ZmMDAwMDApKQkvKiBvciB5IGlzIE5hTiAqLworCSAgICByZXR1cm4gKHgqeSkvKHgqeSk7CisJaWYoaHg8PWh5KSB7CisJICAgIGlmKChoeDxoeSl8fChseDxseSkpIHJldHVybiB4OwkvKiB8eHw8fHl8IHJldHVybiB4ICovCisJICAgIGlmKGx4PT1seSkgCisJCXJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsJLyogfHh8PXx5fCByZXR1cm4geCowKi8KKwl9CisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDAxMDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgaWYoaHg9PTApIHsKKwkJZm9yIChpeCA9IC0xMDQzLCBpPWx4OyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJICAgIH0gZWxzZSB7CisJCWZvciAoaXggPSAtMTAyMixpPShoeDw8MTEpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJICAgIH0KKwl9IGVsc2UgaXggPSAoaHg+PjIwKS0xMDIzOworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwMTAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGlmKGh5PT0wKSB7CisJCWZvciAoaXkgPSAtMTA0MywgaT1seTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCSAgICB9IGVsc2UgeworCQlmb3IgKGl5ID0gLTEwMjIsaT0oaHk8PDExKTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCSAgICB9CisJfSBlbHNlIGl5ID0gKGh5Pj4yMCktMTAyMzsKKworICAgIC8qIHNldCB1cCB7aHgsbHh9LCB7aHksbHl9IGFuZCBhbGlnbiB5IHRvIHggKi8KKwlpZihpeCA+PSAtMTAyMikgCisJICAgIGh4ID0gMHgwMDEwMDAwMHwoMHgwMDBmZmZmZiZoeCk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeCwgc2hpZnQgeCB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMDIyLWl4OworCSAgICBpZihuPD0zMSkgeworCSAgICAgICAgaHggPSAoaHg8PG4pfChseD4+KDMyLW4pKTsKKwkgICAgICAgIGx4IDw8PSBuOworCSAgICB9IGVsc2UgeworCQloeCA9IGx4PDwobi0zMik7CisJCWx4ID0gMDsKKwkgICAgfQorCX0KKwlpZihpeSA+PSAtMTAyMikgCisJICAgIGh5ID0gMHgwMDEwMDAwMHwoMHgwMDBmZmZmZiZoeSk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeSwgc2hpZnQgeSB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMDIyLWl5OworCSAgICBpZihuPD0zMSkgeworCSAgICAgICAgaHkgPSAoaHk8PG4pfChseT4+KDMyLW4pKTsKKwkgICAgICAgIGx5IDw8PSBuOworCSAgICB9IGVsc2UgeworCQloeSA9IGx5PDwobi0zMik7CisJCWx5ID0gMDsKKwkgICAgfQorCX0KKworICAgIC8qIGZpeCBwb2ludCBmbW9kICovCisJbiA9IGl4IC0gaXk7CisJd2hpbGUobi0tKSB7CisJICAgIGh6PWh4LWh5O2x6PWx4LWx5OyBpZihseDxseSkgaHogLT0gMTsKKwkgICAgaWYoaHo8MCl7aHggPSBoeCtoeCsobHg+PjMxKTsgbHggPSBseCtseDt9CisJICAgIGVsc2UgeworCSAgICAJaWYoKGh6fGx6KT09MCkgCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJICAgIAloeCA9IGh6K2h6Kyhsej4+MzEpOyBseCA9IGx6K2x6OworCSAgICB9CisJfQorCWh6PWh4LWh5O2x6PWx4LWx5OyBpZihseDxseSkgaHogLT0gMTsKKwlpZihoej49MCkge2h4PWh6O2x4PWx6O30KKworICAgIC8qIGNvbnZlcnQgYmFjayB0byBmbG9hdGluZyB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgc2lnbiAqLworCWlmKChoeHxseCk9PTApIAkJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCXdoaWxlKGh4PDB4MDAxMDAwMDApIHsJCS8qIG5vcm1hbGl6ZSB4ICovCisJICAgIGh4ID0gaHgraHgrKGx4Pj4zMSk7IGx4ID0gbHgrbHg7CisJICAgIGl5IC09IDE7CisJfQorCWlmKGl5Pj0gLTEwMjIpIHsJLyogbm9ybWFsaXplIG91dHB1dCAqLworCSAgICBoeCA9ICgoaHgtMHgwMDEwMDAwMCl8KChpeSsxMDIzKTw8MjApKTsKKwkgICAgSU5TRVJUX1dPUkRTKHgsaHh8c3gsbHgpOworCX0gZWxzZSB7CQkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJICAgIG4gPSAtMTAyMiAtIGl5OworCSAgICBpZihuPD0yMCkgeworCQlseCA9IChseD4+bil8KCh1X2ludDMyX3QpaHg8PCgzMi1uKSk7CisJCWh4ID4+PSBuOworCSAgICB9IGVsc2UgaWYgKG48PTMxKSB7CisJCWx4ID0gKGh4PDwoMzItbikpfChseD4+bik7IGh4ID0gc3g7CisJICAgIH0gZWxzZSB7CisJCWx4ID0gaHg+PihuLTMyKTsgaHggPSBzeDsKKwkgICAgfQorCSAgICBJTlNFUlRfV09SRFMoeCxoeHxzeCxseCk7CisJICAgIHggKj0gb25lOwkJLyogY3JlYXRlIG5lY2Vzc2FyeSBzaWduYWwgKi8KKwl9CisJcmV0dXJuIHg7CQkvKiBleGFjdCBvdXRwdXQgKi8KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfZm1vZGYuYyBiL2xpYm0vc3JjL2VfZm1vZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ4N2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9mbW9kZi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiBlX2Ztb2RmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2Ztb2QuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZm1vZGYuYyx2IDEuNiAyMDAyLzA1LzI4IDE3OjAzOjEyIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9faWVlZTc1NF9mbW9kZih4LHkpCisgKiBSZXR1cm4geCBtb2QgeSBpbiBleGFjdCBhcml0aG1ldGljCisgKiBNZXRob2Q6IHNoaWZ0IGFuZCBzdWJ0cmFjdAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBvbmUgPSAxLjAsIFplcm9bXSA9IHswLjAsIC0wLjAsfTsKKworZmxvYXQKK19faWVlZTc1NF9mbW9kZihmbG9hdCB4LCBmbG9hdCB5KQoreworCWludDMyX3QgbixoeCxoeSxoeixpeCxpeSxzeCxpOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJc3ggPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBvZiB4ICovCisJaHggXj1zeDsJCS8qIHx4fCAqLworCWh5ICY9IDB4N2ZmZmZmZmY7CS8qIHx5fCAqLworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZihoeT09MHx8KGh4Pj0weDdmODAwMDAwKXx8CQkvKiB5PTAsb3IgeCBub3QgZmluaXRlICovCisJICAgKGh5PjB4N2Y4MDAwMDApKQkJCS8qIG9yIHkgaXMgTmFOICovCisJICAgIHJldHVybiAoeCp5KS8oeCp5KTsKKwlpZihoeDxoeSkgcmV0dXJuIHg7CQkJLyogfHh8PHx5fCByZXR1cm4geCAqLworCWlmKGh4PT1oeSkKKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCisgICAgLyogZGV0ZXJtaW5lIGl4ID0gaWxvZ2IoeCkgKi8KKwlpZihoeDwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIGZvciAoaXggPSAtMTI2LGk9KGh4PDw4KTsgaT4wOyBpPDw9MSkgaXggLT0xOworCX0gZWxzZSBpeCA9IChoeD4+MjMpLTEyNzsKKworICAgIC8qIGRldGVybWluZSBpeSA9IGlsb2diKHkpICovCisJaWYoaHk8MHgwMDgwMDAwMCkgewkvKiBzdWJub3JtYWwgeSAqLworCSAgICBmb3IgKGl5ID0gLTEyNixpPShoeTw8OCk7IGk+PTA7IGk8PD0xKSBpeSAtPTE7CisJfSBlbHNlIGl5ID0gKGh5Pj4yMyktMTI3OworCisgICAgLyogc2V0IHVwIHtoeCxseH0sIHtoeSxseX0gYW5kIGFsaWduIHkgdG8geCAqLworCWlmKGl4ID49IC0xMjYpCisJICAgIGh4ID0gMHgwMDgwMDAwMHwoMHgwMDdmZmZmZiZoeCk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeCwgc2hpZnQgeCB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMjYtaXg7CisJICAgIGh4ID0gaHg8PG47CisJfQorCWlmKGl5ID49IC0xMjYpCisJICAgIGh5ID0gMHgwMDgwMDAwMHwoMHgwMDdmZmZmZiZoeSk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeSwgc2hpZnQgeSB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMjYtaXk7CisJICAgIGh5ID0gaHk8PG47CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7CisJICAgIGlmKGh6PDApe2h4ID0gaHgraHg7fQorCSAgICBlbHNlIHsKKwkgICAgCWlmKGh6PT0wKSAJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwkgICAgCWh4ID0gaHoraHo7CisJICAgIH0KKwl9CisJaHo9aHgtaHk7CisJaWYoaHo+PTApIHtoeD1oejt9CisKKyAgICAvKiBjb252ZXJ0IGJhY2sgdG8gZmxvYXRpbmcgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHNpZ24gKi8KKwlpZihoeD09MCkgCQkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJd2hpbGUoaHg8MHgwMDgwMDAwMCkgewkJLyogbm9ybWFsaXplIHggKi8KKwkgICAgaHggPSBoeCtoeDsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTI2KSB7CQkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwODAwMDAwKXwoKGl5KzEyNyk8PDIzKSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHgsaHh8c3gpOworCX0gZWxzZSB7CQkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJICAgIG4gPSAtMTI2IC0gaXk7CisJICAgIGh4ID4+PSBuOworCSAgICBTRVRfRkxPQVRfV09SRCh4LGh4fHN4KTsKKwkgICAgeCAqPSBvbmU7CQkvKiBjcmVhdGUgbmVjZXNzYXJ5IHNpZ25hbCAqLworCX0KKwlyZXR1cm4geDsJCS8qIGV4YWN0IG91dHB1dCAqLworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9nYW1tYS5jIGIvbGlibS9zcmMvZV9nYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmZmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hLmMKQEAgLTAsMCArMSwzNCBAQAorCisvKiBAKCMpZV9nYW1tYS5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9nYW1tYS5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfZ2FtbWEoeCkKKyAqIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBHYW1tYSBmdW5jdGlvbiBvZiB4LgorICoKKyAqIE1ldGhvZDogY2FsbCBfX2llZWU3NTRfZ2FtbWFfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2V4dGVybiBpbnQgc2lnbmdhbTsKKworZG91YmxlCitfX2llZWU3NTRfZ2FtbWEoZG91YmxlIHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9nYW1tYV9yKHgsJnNpZ25nYW0pOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9nYW1tYV9yLmMgYi9saWJtL3NyYy9lX2dhbW1hX3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgzMzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9nYW1tYV9yLmMKQEAgLTAsMCArMSwzMyBAQAorCisvKiBAKCMpZV9nYW1tYV9yLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hX3IuYyx2IDEuNyAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2dhbW1hX3IoeCwgc2lnbmdhbXApCisgKiBSZWVudHJhbnQgdmVyc2lvbiBvZiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBHYW1tYSBmdW5jdGlvbiAKKyAqIHdpdGggdXNlciBwcm92aWRlIHBvaW50ZXIgZm9yIHRoZSBzaWduIG9mIEdhbW1hKHgpLiAKKyAqCisgKiBNZXRob2Q6IFNlZSBfX2llZWU3NTRfbGdhbW1hX3IKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK19faWVlZTc1NF9nYW1tYV9yKGRvdWJsZSB4LCBpbnQgKnNpZ25nYW1wKQoreworCXJldHVybiBfX2llZWU3NTRfbGdhbW1hX3IoeCxzaWduZ2FtcCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hZi5jIGIvbGlibS9zcmMvZV9nYW1tYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWMyZWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9nYW1tYWYuYwpAQCAtMCwwICsxLDM1IEBACisvKiBlX2dhbW1hZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9nYW1tYS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9nYW1tYWYuYyx2IDEuNiAyMDAyLzA1LzI4IDE3OjAzOjEyIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2dhbW1hZih4KQorICogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9mIHguCisgKgorICogTWV0aG9kOiBjYWxsIF9faWVlZTc1NF9nYW1tYWZfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2V4dGVybiBpbnQgc2lnbmdhbTsKKworZmxvYXQKK19faWVlZTc1NF9nYW1tYWYoZmxvYXQgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X2dhbW1hZl9yKHgsJnNpZ25nYW0pOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9nYW1tYWZfci5jIGIvbGlibS9zcmMvZV9nYW1tYWZfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzAwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hZl9yLmMKQEAgLTAsMCArMSwzNCBAQAorLyogZV9nYW1tYWZfci5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9nYW1tYV9yLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hZl9yLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowMyBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9nYW1tYWZfcih4LCBzaWduZ2FtcCkKKyAqIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uCisgKiB3aXRoIHVzZXIgcHJvdmlkZSBwb2ludGVyIGZvciB0aGUgc2lnbiBvZiBHYW1tYSh4KS4KKyAqCisgKiBNZXRob2Q6IFNlZSBfX2llZWU3NTRfbGdhbW1hZl9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK19faWVlZTc1NF9nYW1tYWZfcihmbG9hdCB4LCBpbnQgKnNpZ25nYW1wKQoreworCXJldHVybiBfX2llZWU3NTRfbGdhbW1hZl9yKHgsc2lnbmdhbXApOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9oeXBvdC5jIGIvbGlibS9zcmMvZV9oeXBvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzg1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2h5cG90LmMKQEAgLTAsMCArMSwxMjUgQEAKKworLyogQCgjKWVfaHlwb3QuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9oeXBvdC5jLHYgMS45IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfaHlwb3QoeCx5KQorICoKKyAqIE1ldGhvZCA6ICAgICAgICAgICAgICAgICAgCisgKglJZiAoYXNzdW1lIHJvdW5kLXRvLW5lYXJlc3QpIHo9eCp4K3kqeSAKKyAqCWhhcyBlcnJvciBsZXNzIHRoYW4gc3FydCgyKS8yIHVscCwgdGhhbiAKKyAqCXNxcnQoeikgaGFzIGVycm9yIGxlc3MgdGhhbiAxIHVscCAoZXhlcmNpc2UpLgorICoKKyAqCVNvLCBjb21wdXRlIHNxcnQoeCp4K3kqeSkgd2l0aCBzb21lIGNhcmUgYXMgCisgKglmb2xsb3dzIHRvIGdldCB0aGUgZXJyb3IgYmVsb3cgMSB1bHA6CisgKgorICoJQXNzdW1lIHg+eT4wOworICoJKGlmIHBvc3NpYmxlLCBzZXQgcm91bmRpbmcgdG8gcm91bmQtdG8tbmVhcmVzdCkKKyAqCTEuIGlmIHggPiAyeSAgdXNlCisgKgkJeDEqeDErKHkqeSsoeDIqKHgreDEpKSkgZm9yIHgqeCt5KnkKKyAqCXdoZXJlIHgxID0geCB3aXRoIGxvd2VyIDMyIGJpdHMgY2xlYXJlZCwgeDIgPSB4LXgxOyBlbHNlCisgKgkyLiBpZiB4IDw9IDJ5IHVzZQorICoJCXQxKnkxKygoeC15KSooeC15KSsodDEqeTIrdDIqeSkpCisgKgl3aGVyZSB0MSA9IDJ4IHdpdGggbG93ZXIgMzIgYml0cyBjbGVhcmVkLCB0MiA9IDJ4LXQxLCAKKyAqCXkxPSB5IHdpdGggbG93ZXIgMzIgYml0cyBjaG9wcGVkLCB5MiA9IHkteTEuCisgKgkJCisgKglOT1RFOiBzY2FsaW5nIG1heSBiZSBuZWNlc3NhcnkgaWYgc29tZSBhcmd1bWVudCBpcyB0b28gCisgKgkgICAgICBsYXJnZSBvciB0b28gdGlueQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgloeXBvdCh4LHkpIGlzIElORiBpZiB4IG9yIHkgaXMgK0lORiBvciAtSU5GOyBlbHNlCisgKgloeXBvdCh4LHkpIGlzIE5BTiBpZiB4IG9yIHkgaXMgTkFOLgorICoKKyAqIEFjY3VyYWN5OgorICogCWh5cG90KHgseSkgcmV0dXJucyBzcXJ0KHheMit5XjIpIHdpdGggZXJyb3IgbGVzcyAKKyAqIAl0aGFuIDEgdWxwcyAodW5pdHMgaW4gdGhlIGxhc3QgcGxhY2UpIAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorX19pZWVlNzU0X2h5cG90KGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlkb3VibGUgYT14LGI9eSx0MSx0Mix5MSx5Mix3OworCWludDMyX3QgaixrLGhhLGhiOworCisJR0VUX0hJR0hfV09SRChoYSx4KTsKKwloYSAmPSAweDdmZmZmZmZmOworCUdFVF9ISUdIX1dPUkQoaGIseSk7CisJaGIgJj0gMHg3ZmZmZmZmZjsKKwlpZihoYiA+IGhhKSB7YT15O2I9eDtqPWhhOyBoYT1oYjtoYj1qO30gZWxzZSB7YT14O2I9eTt9CisJU0VUX0hJR0hfV09SRChhLGhhKTsJLyogYSA8LSB8YXwgKi8KKwlTRVRfSElHSF9XT1JEKGIsaGIpOwkvKiBiIDwtIHxifCAqLworCWlmKChoYS1oYik+MHgzYzAwMDAwKSB7cmV0dXJuIGErYjt9IC8qIHgveSA+IDIqKjYwICovCisJaz0wOworCWlmKGhhID4gMHg1ZjMwMDAwMCkgewkvKiBhPjIqKjUwMCAqLworCSAgIGlmKGhhID49IDB4N2ZmMDAwMDApIHsJLyogSW5mIG9yIE5hTiAqLworCSAgICAgICB1X2ludDMyX3QgbG93OworCSAgICAgICB3ID0gYStiOwkJCS8qIGZvciBzTmFOICovCisJICAgICAgIEdFVF9MT1dfV09SRChsb3csYSk7CisJICAgICAgIGlmKCgoaGEmMHhmZmZmZil8bG93KT09MCkgdyA9IGE7CisJICAgICAgIEdFVF9MT1dfV09SRChsb3csYik7CisJICAgICAgIGlmKCgoaGJeMHg3ZmYwMDAwMCl8bG93KT09MCkgdyA9IGI7CisJICAgICAgIHJldHVybiB3OworCSAgIH0KKwkgICAvKiBzY2FsZSBhIGFuZCBiIGJ5IDIqKi02MDAgKi8KKwkgICBoYSAtPSAweDI1ODAwMDAwOyBoYiAtPSAweDI1ODAwMDAwOwlrICs9IDYwMDsKKwkgICBTRVRfSElHSF9XT1JEKGEsaGEpOworCSAgIFNFVF9ISUdIX1dPUkQoYixoYik7CisJfQorCWlmKGhiIDwgMHgyMGIwMDAwMCkgewkvKiBiIDwgMioqLTUwMCAqLworCSAgICBpZihoYiA8PSAweDAwMGZmZmZmKSB7CS8qIHN1Ym5vcm1hbCBiIG9yIDAgKi8KKwkgICAgICAgIHVfaW50MzJfdCBsb3c7CisJCUdFVF9MT1dfV09SRChsb3csYik7CisJCWlmKChoYnxsb3cpPT0wKSByZXR1cm4gYTsKKwkJdDE9MDsKKwkJU0VUX0hJR0hfV09SRCh0MSwweDdmZDAwMDAwKTsJLyogdDE9Ml4xMDIyICovCisJCWIgKj0gdDE7CisJCWEgKj0gdDE7CisJCWsgLT0gMTAyMjsKKwkgICAgfSBlbHNlIHsJCS8qIHNjYWxlIGEgYW5kIGIgYnkgMl42MDAgKi8KKwkgICAgICAgIGhhICs9IDB4MjU4MDAwMDA7IAkvKiBhICo9IDJeNjAwICovCisJCWhiICs9IDB4MjU4MDAwMDA7CS8qIGIgKj0gMl42MDAgKi8KKwkJayAtPSA2MDA7CisJCVNFVF9ISUdIX1dPUkQoYSxoYSk7CisJCVNFVF9ISUdIX1dPUkQoYixoYik7CisJICAgIH0KKwl9CisgICAgLyogbWVkaXVtIHNpemUgYSBhbmQgYiAqLworCXcgPSBhLWI7CisJaWYgKHc+YikgeworCSAgICB0MSA9IDA7CisJICAgIFNFVF9ISUdIX1dPUkQodDEsaGEpOworCSAgICB0MiA9IGEtdDE7CisJICAgIHcgID0gc3FydCh0MSp0MS0oYiooLWIpLXQyKihhK3QxKSkpOworCX0gZWxzZSB7CisJICAgIGEgID0gYSthOworCSAgICB5MSA9IDA7CisJICAgIFNFVF9ISUdIX1dPUkQoeTEsaGIpOworCSAgICB5MiA9IGIgLSB5MTsKKwkgICAgdDEgPSAwOworCSAgICBTRVRfSElHSF9XT1JEKHQxLGhhKzB4MDAxMDAwMDApOworCSAgICB0MiA9IGEgLSB0MTsKKwkgICAgdyAgPSBzcXJ0KHQxKnkxLSh3KigtdyktKHQxKnkyK3QyKmIpKSk7CisJfQorCWlmKGshPTApIHsKKwkgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgIHQxID0gMS4wOworCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gsdDEpOworCSAgICBTRVRfSElHSF9XT1JEKHQxLGhpZ2grKGs8PDIwKSk7CisJICAgIHJldHVybiB0MSp3OworCX0gZWxzZSByZXR1cm4gdzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfaHlwb3RmLmMgYi9saWJtL3NyYy9lX2h5cG90Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDA3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2h5cG90Zi5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIGVfaHlwb3RmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2h5cG90LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2h5cG90Zi5jLHYgMS45IDIwMDIvMDUvMjggMTg6MTU6MDMgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorX19pZWVlNzU0X2h5cG90ZihmbG9hdCB4LCBmbG9hdCB5KQoreworCWZsb2F0IGE9eCxiPXksdDEsdDIseTEseTIsdzsKKwlpbnQzMl90IGosayxoYSxoYjsKKworCUdFVF9GTE9BVF9XT1JEKGhhLHgpOworCWhhICY9IDB4N2ZmZmZmZmY7CisJR0VUX0ZMT0FUX1dPUkQoaGIseSk7CisJaGIgJj0gMHg3ZmZmZmZmZjsKKwlpZihoYiA+IGhhKSB7YT15O2I9eDtqPWhhOyBoYT1oYjtoYj1qO30gZWxzZSB7YT14O2I9eTt9CisJU0VUX0ZMT0FUX1dPUkQoYSxoYSk7CS8qIGEgPC0gfGF8ICovCisJU0VUX0ZMT0FUX1dPUkQoYixoYik7CS8qIGIgPC0gfGJ8ICovCisJaWYoKGhhLWhiKT4weGYwMDAwMDApIHtyZXR1cm4gYStiO30gLyogeC95ID4gMioqMzAgKi8KKwlrPTA7CisJaWYoaGEgPiAweDU4ODAwMDAwKSB7CS8qIGE+MioqNTAgKi8KKwkgICBpZihoYSA+PSAweDdmODAwMDAwKSB7CS8qIEluZiBvciBOYU4gKi8KKwkgICAgICAgdyA9IGErYjsJCQkvKiBmb3Igc05hTiAqLworCSAgICAgICBpZihoYSA9PSAweDdmODAwMDAwKSB3ID0gYTsKKwkgICAgICAgaWYoaGIgPT0gMHg3ZjgwMDAwMCkgdyA9IGI7CisJICAgICAgIHJldHVybiB3OworCSAgIH0KKwkgICAvKiBzY2FsZSBhIGFuZCBiIGJ5IDIqKi02OCAqLworCSAgIGhhIC09IDB4MjIwMDAwMDA7IGhiIC09IDB4MjIwMDAwMDA7CWsgKz0gNjg7CisJICAgU0VUX0ZMT0FUX1dPUkQoYSxoYSk7CisJICAgU0VUX0ZMT0FUX1dPUkQoYixoYik7CisJfQorCWlmKGhiIDwgMHgyNjgwMDAwMCkgewkvKiBiIDwgMioqLTUwICovCisJICAgIGlmKGhiIDw9IDB4MDA3ZmZmZmYpIHsJLyogc3Vibm9ybWFsIGIgb3IgMCAqLworCSAgICAgICAgaWYoaGI9PTApIHJldHVybiBhOworCQlTRVRfRkxPQVRfV09SRCh0MSwweDdlODAwMDAwKTsJLyogdDE9Ml4xMjYgKi8KKwkJYiAqPSB0MTsKKwkJYSAqPSB0MTsKKwkJayAtPSAxMjY7CisJICAgIH0gZWxzZSB7CQkvKiBzY2FsZSBhIGFuZCBiIGJ5IDJeNjggKi8KKwkgICAgICAgIGhhICs9IDB4MjIwMDAwMDA7IAkvKiBhICo9IDJeNjggKi8KKwkJaGIgKz0gMHgyMjAwMDAwMDsJLyogYiAqPSAyXjY4ICovCisJCWsgLT0gNjg7CisJCVNFVF9GTE9BVF9XT1JEKGEsaGEpOworCQlTRVRfRkxPQVRfV09SRChiLGhiKTsKKwkgICAgfQorCX0KKyAgICAvKiBtZWRpdW0gc2l6ZSBhIGFuZCBiICovCisJdyA9IGEtYjsKKwlpZiAodz5iKSB7CisJICAgIFNFVF9GTE9BVF9XT1JEKHQxLGhhJjB4ZmZmZmYwMDApOworCSAgICB0MiA9IGEtdDE7CisJICAgIHcgID0gX19pZWVlNzU0X3NxcnRmKHQxKnQxLShiKigtYiktdDIqKGErdDEpKSk7CisJfSBlbHNlIHsKKwkgICAgYSAgPSBhK2E7CisJICAgIFNFVF9GTE9BVF9XT1JEKHkxLGhiJjB4ZmZmZmYwMDApOworCSAgICB5MiA9IGIgLSB5MTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaGErMHgwMDgwMDAwMCk7CisJICAgIHQyID0gYSAtIHQxOworCSAgICB3ICA9IF9faWVlZTc1NF9zcXJ0Zih0MSp5MS0odyooLXcpLSh0MSp5Mit0MipiKSkpOworCX0KKwlpZihrIT0wKSB7CisJICAgIFNFVF9GTE9BVF9XT1JEKHQxLDB4M2Y4MDAwMDArKGs8PDIzKSk7CisJICAgIHJldHVybiB0MSp3OworCX0gZWxzZSByZXR1cm4gdzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfajAuYyBiL2xpYm0vc3JjL2VfajAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTliZjExCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qMC5jCkBAIC0wLDAgKzEsMzgyIEBACisKKy8qIEAoIyllX2owLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfajAuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2owKHgpLCBfX2llZWU3NTRfeTAoeCkKKyAqIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBraW5kcyBvZiBvcmRlciB6ZXJvLgorICogTWV0aG9kIC0tIGowKHgpOgorICoJMS4gRm9yIHRpbnkgeCwgd2UgdXNlIGowKHgpID0gMSAtIHheMi80ICsgeF40LzY0IC0gLi4uCisgKgkyLiBSZWR1Y2UgeCB0byB8eHwgc2luY2UgajAoeCk9ajAoLXgpLCAgYW5kCisgKgkgICBmb3IgeCBpbiAoMCwyKQorICoJCWowKHgpID0gMS16LzQrIHpeMipSMC9TMCwgIHdoZXJlIHogPSB4Kng7CisgKgkgICAocHJlY2lzaW9uOiAgfGowLTErei80LXpeMlIwL1MwIHw8MioqLTYzLjY3ICkKKyAqCSAgIGZvciB4IGluICgyLGluZikKKyAqIAkJajAoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDAoeCkqY29zKHgwKS1xMCh4KSpzaW4oeDApKQorICogCSAgIHdoZXJlIHgwID0geC1waS80LiBJdCBpcyBiZXR0ZXIgdG8gY29tcHV0ZSBzaW4oeDApLGNvcyh4MCkKKyAqCSAgIGFzIGZvbGxvdzoKKyAqCQljb3MoeDApID0gY29zKHgpY29zKHBpLzQpK3Npbih4KXNpbihwaS80KQorICoJCQk9IDEvc3FydCgyKSAqIChjb3MoeCkgKyBzaW4oeCkpCisgKgkJc2luKHgwKSA9IHNpbih4KWNvcyhwaS80KS1jb3MoeClzaW4ocGkvNCkKKyAqCQkJPSAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICogCSAgIChUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICoJCXNpbih4KSArLSBjb3MoeCkgPSAtY29zKDJ4KS8oc2luKHgpIC0rIGNvcyh4KSkKKyAqIAkgICAgdG8gY29tcHV0ZSB0aGUgd29yc2Ugb25lLikKKyAqCSAgIAorICoJMyBTcGVjaWFsIGNhc2VzCisgKgkJajAobmFuKT0gbmFuCisgKgkJajAoMCkgPSAxCisgKgkJajAoaW5mKSA9IDAKKyAqCQkKKyAqIE1ldGhvZCAtLSB5MCh4KToKKyAqCTEuIEZvciB4PDIuCisgKgkgICBTaW5jZSAKKyAqCQl5MCh4KSA9IDIvcGkqKGowKHgpKihsbih4LzIpK0V1bGVyKSArIHheMi80IC0gLi4uKQorICoJICAgdGhlcmVmb3JlIHkwKHgpLTIvcGkqajAoeCkqbG4oeCkgaXMgYW4gZXZlbiBmdW5jdGlvbi4KKyAqCSAgIFdlIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIGFwcHJveGltYXRlIHkwLAorICoJCXkwKHgpID0gVSh6KS9WKHopICsgKDIvcGkpKihqMCh4KSpsbih4KSksIHo9IHheMgorICoJICAgd2hlcmUgCisgKgkJVSh6KSA9IHUwMCArIHUwMSp6ICsgLi4uICsgdTA2KnpeNgorICoJCVYoeikgPSAxICArIHYwMSp6ICsgLi4uICsgdjA0KnpeNAorICoJICAgd2l0aCBhYnNvbHV0ZSBhcHByb3hpbWF0aW9uIGVycm9yIGJvdW5kZWQgYnkgMioqLTcyLgorICoJICAgTm90ZTogRm9yIHRpbnkgeCwgVS9WID0gdTAgYW5kIGowKHgpfjEsIGhlbmNlCisgKgkJeTAodGlueSkgPSB1MCArICgyL3BpKSpsbih0aW55KSwgKGNob29zZSB0aW55PDIqKi0yNykKKyAqCTIuIEZvciB4Pj0yLgorICogCQl5MCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpjb3MoeDApK3EwKHgpKnNpbih4MCkpCisgKiAJICAgd2hlcmUgeDAgPSB4LXBpLzQuIEl0IGlzIGJldHRlciB0byBjb21wdXRlIHNpbih4MCksY29zKHgwKQorICoJICAgYnkgdGhlIG1ldGhvZCBtZW50aW9uZWQgYWJvdmUuCisgKgkzLiBTcGVjaWFsIGNhc2VzOiB5MCgwKT0taW5mLCB5MCh4PDApPU5hTiwgeTAoaW5mKT0wLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBkb3VibGUgcHplcm8oZG91YmxlKSwgcXplcm8oZG91YmxlKTsKKworc3RhdGljIGNvbnN0IGRvdWJsZQoraHVnZSAJPSAxZTMwMCwKK29uZQk9IDEuMCwKK2ludnNxcnRwaT0gIDUuNjQxODk1ODM1NDc3NTYyNzkyODBlLTAxLCAvKiAweDNGRTIwREQ3LCAweDUwNDI5QjZEICovCit0cGkgICAgICA9ICA2LjM2NjE5NzcyMzY3NTgxMzgyNDMzZS0wMSwgLyogMHgzRkU0NUYzMCwgMHg2REM5Qzg4MyAqLworIAkJLyogUjAvUzAgb24gWzAsIDIuMDBdICovCitSMDIgID0gIDEuNTYyNDk5OTk5OTk5OTk5NDc5NThlLTAyLCAvKiAweDNGOEZGRkZGLCAweEZGRkZGRkZEICovCitSMDMgID0gLTEuODk5NzkyOTQyMzg4NTQ3MjE3NTFlLTA0LCAvKiAweEJGMjhFNkE1LCAweEI2MUFDNkU5ICovCitSMDQgID0gIDEuODI5NTQwNDk1MzI3MDA2NjU2NzBlLTA2LCAvKiAweDNFQkVCMUQxLCAweDBDNTAzOTE5ICovCitSMDUgID0gLTQuNjE4MzI2ODg1MzIxMDMxODkxOTllLTA5LCAvKiAweEJFMzNENUU3LCAweDczRDYzRkNFICovCitTMDEgID0gIDEuNTYxOTEwMjk0NjQ4OTAwMTA0OTJlLTAyLCAvKiAweDNGOEZGQ0U4LCAweDgyQzhDMkE0ICovCitTMDIgID0gIDEuMTY5MjY3ODQ2NjMzMzc0NTAyNjBlLTA0LCAvKiAweDNGMUVBNkQyLCAweERENTdEQkY0ICovCitTMDMgID0gIDUuMTM1NDY1NTAyMDczMTgxMTE0NDZlLTA3LCAvKiAweDNFQTEzQjU0LCAweENFODRENUE5ICovCitTMDQgID0gIDEuMTY2MTQwMDMzMzM3OTAwMDAyMDVlLTA5OyAvKiAweDNFMTQwOEJDLCAweEY0NzQ1RDhGICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuMDsKKworZG91YmxlCitfX2llZWU3NTRfajAoZG91YmxlIHgpCit7CisJZG91YmxlIHosIHMsYyxzcyxjYyxyLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiBvbmUvKHgqeCk7CisJeCA9IGZhYnMoeCk7CisJaWYoaXggPj0gMHg0MDAwMDAwMCkgewkvKiB8eHwgPj0gMi4wICovCisJCXMgPSBzaW4oeCk7CisJCWMgPSBjb3MoeCk7CisJCXNzID0gcy1jOworCQljYyA9IHMrYzsKKwkJaWYoaXg8MHg3ZmUwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSAtY29zKHgreCk7CisJCSAgICBpZiAoKHMqYyk8emVybykgY2MgPSB6L3NzOworCQkgICAgZWxzZSAJICAgIHNzID0gei9jYzsKKwkJfQorCS8qCisJICogajAoeCkgPSAxL3NxcnQocGkpICogKFAoMCx4KSpjYyAtIFEoMCx4KSpzcykgLyBzcXJ0KHgpCisJICogeTAoeCkgPSAxL3NxcnQocGkpICogKFAoMCx4KSpzcyArIFEoMCx4KSpjYykgLyBzcXJ0KHgpCisJICovCisJCWlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKmNjKS9zcXJ0KHgpOworCQllbHNlIHsKKwkJICAgIHUgPSBwemVybyh4KTsgdiA9IHF6ZXJvKHgpOworCQkgICAgeiA9IGludnNxcnRwaSoodSpjYy12KnNzKS9zcXJ0KHgpOworCQl9CisJCXJldHVybiB6OworCX0KKwlpZihpeDwweDNmMjAwMDAwKSB7CS8qIHx4fCA8IDIqKi0xMyAqLworCSAgICBpZihodWdlK3g+b25lKSB7CS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJICAgICAgICBpZihpeDwweDNlNDAwMDAwKSByZXR1cm4gb25lOwkvKiB8eHw8MioqLTI3ICovCisJICAgICAgICBlbHNlIAkgICAgICByZXR1cm4gb25lIC0gMC4yNSp4Kng7CisJICAgIH0KKwl9CisJeiA9IHgqeDsKKwlyID0gIHoqKFIwMit6KihSMDMreiooUjA0K3oqUjA1KSkpOworCXMgPSAgb25lK3oqKFMwMSt6KihTMDIreiooUzAzK3oqUzA0KSkpOworCWlmKGl4IDwgMHgzRkYwMDAwMCkgewkvKiB8eHwgPCAxLjAwICovCisJICAgIHJldHVybiBvbmUgKyB6KigtMC4yNSsoci9zKSk7CisJfSBlbHNlIHsKKwkgICAgdSA9IDAuNSp4OworCSAgICByZXR1cm4oKG9uZSt1KSoob25lLXUpK3oqKHIvcykpOworCX0KK30KKworc3RhdGljIGNvbnN0IGRvdWJsZQordTAwICA9IC03LjM4MDQyOTUxMDg2ODcyMzE3NTIzZS0wMiwgLyogMHhCRkIyRTRENiwgMHg5OUNCRDAxRiAqLwordTAxICA9ICAxLjc2NjY2NDUyNTA5MTgxMTE1NTM4ZS0wMSwgLyogMHgzRkM2OUQwMSwgMHg5REU5RTNGQyAqLwordTAyICA9IC0xLjM4MTg1NjcxOTQ1NTk2ODk4ODk2ZS0wMiwgLyogMHhCRjhDNENFOCwgMHhCMTZDRkE5NyAqLwordTAzICA9ICAzLjQ3NDUzNDMyMDkzNjgzNjUwMjM4ZS0wNCwgLyogMHgzRjM2QzU0RCwgMHgyMEIyOUI2QiAqLwordTA0ICA9IC0zLjgxNDA3MDUzNzI0MzY0MTYxMTI1ZS0wNiwgLyogMHhCRUNGRkVBNywgMHg3M0QyNUNBRCAqLwordTA1ICA9ICAxLjk1NTkwMTM3MDM1MDIyOTIwMjA2ZS0wOCwgLyogMHgzRTU1MDA1NywgMHgzQjRFQUJENCAqLwordTA2ICA9IC0zLjk4MjA1MTk0MTMyMTAzMzk4NDUzZS0xMSwgLyogMHhCREM1RTQzRCwgMHg2OTNGQjNDOCAqLwordjAxICA9ICAxLjI3MzA0ODM0ODM0MTIzNjk5MzI4ZS0wMiwgLyogMHgzRjhBMTI3MCwgMHg5MUM5QzcxQSAqLwordjAyICA9ICA3LjYwMDY4NjI3MzUwMzUzMjUzNzAyZS0wNSwgLyogMHgzRjEzRUNCQiwgMHhGNTc4QzZDMSAqLwordjAzICA9ICAyLjU5MTUwODUxODQwNDU3ODA1NDY3ZS0wNywgLyogMHgzRTkxNjQyRCwgMHg3RkYyMDJGRCAqLwordjA0ICA9ICA0LjQxMTEwMzExMzMyNjc1NDY3NDAzZS0xMDsgLyogMHgzREZFNTAxOCwgMHgzQkQ2RDlFRiAqLworCitkb3VibGUKK19faWVlZTc1NF95MChkb3VibGUgeCkKK3sKKwlkb3VibGUgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4LGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKyAgICAgICAgaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIFkwKE5hTikgaXMgTmFOLCB5MCgtaW5mKSBpcyBOYW4sIHkwKGluZikgaXMgMCAgKi8KKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuICBvbmUvKHgreCp4KTsgCisgICAgICAgIGlmKChpeHxseCk9PTApIHJldHVybiAtb25lL3plcm87CisgICAgICAgIGlmKGh4PDApIHJldHVybiB6ZXJvL3plcm87CisgICAgICAgIGlmKGl4ID49IDB4NDAwMDAwMDApIHsgIC8qIHx4fCA+PSAyLjAgKi8KKyAgICAgICAgLyogeTAoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDAoeCkqc2luKHgwKStxMCh4KSpjb3MoeDApKQorICAgICAgICAgKiB3aGVyZSB4MCA9IHgtcGkvNAorICAgICAgICAgKiAgICAgIEJldHRlciBmb3JtdWxhOgorICAgICAgICAgKiAgICAgICAgICAgICAgY29zKHgwKSA9IGNvcyh4KWNvcyhwaS80KStzaW4oeClzaW4ocGkvNCkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAgMS9zcXJ0KDIpICogKHNpbih4KSArIGNvcyh4KSkKKyAgICAgICAgICogICAgICAgICAgICAgIHNpbih4MCkgPSBzaW4oeCljb3MoM3BpLzQpLWNvcyh4KXNpbigzcGkvNCkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAgMS9zcXJ0KDIpICogKHNpbih4KSAtIGNvcyh4KSkKKyAgICAgICAgICogVG8gYXZvaWQgY2FuY2VsbGF0aW9uLCB1c2UKKyAgICAgICAgICogICAgICAgICAgICAgIHNpbih4KSArLSBjb3MoeCkgPSAtY29zKDJ4KS8oc2luKHgpIC0rIGNvcyh4KSkKKyAgICAgICAgICogdG8gY29tcHV0ZSB0aGUgd29yc2Ugb25lLgorICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzID0gc2luKHgpOworICAgICAgICAgICAgICAgIGMgPSBjb3MoeCk7CisgICAgICAgICAgICAgICAgc3MgPSBzLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzK2M7CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKyAgICAgICAgICAgICAgICBpZihpeDwweDdmZTAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICB6ID0gLWNvcyh4K3gpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHMqYyk8emVybykgY2MgPSB6L3NzOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgc3MgPSB6L2NjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihpeD4weDQ4MDAwMDAwKSB6ID0gKGludnNxcnRwaSpzcykvc3FydCh4KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHB6ZXJvKHgpOyB2ID0gcXplcm8oeCk7CisgICAgICAgICAgICAgICAgICAgIHogPSBpbnZzcXJ0cGkqKHUqc3MrdipjYykvc3FydCh4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisJfQorCWlmKGl4PD0weDNlNDAwMDAwKSB7CS8qIHggPCAyKiotMjcgKi8KKwkgICAgcmV0dXJuKHUwMCArIHRwaSpfX2llZWU3NTRfbG9nKHgpKTsKKwl9CisJeiA9IHgqeDsKKwl1ID0gdTAwK3oqKHUwMSt6Kih1MDIreioodTAzK3oqKHUwNCt6Kih1MDUreip1MDYpKSkpKTsKKwl2ID0gb25lK3oqKHYwMSt6Kih2MDIreioodjAzK3oqdjA0KSkpOworCXJldHVybih1L3YgKyB0cGkqKF9faWVlZTc1NF9qMCh4KSpfX2llZWU3NTRfbG9nKHgpKSk7Cit9CisKKy8qIFRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcHplcm8gaXMKKyAqCTEgLSA5LzEyOCBzXjIgKyAxMTAyNS85ODMwNCBzXjQgLSAuLi4sCXdoZXJlIHMgPSAxL3guCisgKiBGb3IgeCA+PSAyLCBXZSBhcHByb3hpbWF0ZSBwemVybyBieQorICogCXB6ZXJvKHgpID0gMSArIChSL1MpCisgKiB3aGVyZSAgUiA9IHBSMCArIHBSMSpzXjIgKyBwUjIqc140ICsgLi4uICsgcFI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcFMwKnNeMiArIC4uLiArIHBTNCpzXjEwCisgKiBhbmQKKyAqCXwgcHplcm8oeCktMS1SL1MgfCA8PSAyICAqKiAoIC02MC4yNikKKyAqLworc3RhdGljIGNvbnN0IGRvdWJsZSBwUjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCisgLTcuMDMxMjQ5OTk5OTk5MDAzNTc0ODRlLTAyLCAvKiAweEJGQjFGRkZGLCAweEZGRkZGRDMyICovCisgLTguMDgxNjcwNDEyNzUzNDk3OTU2MjZlKzAwLCAvKiAweEMwMjAyOUQwLCAweEI0NEZBNzc5ICovCisgLTIuNTcwNjMxMDU2Nzk3MDQ4NDcyNjJlKzAyLCAvKiAweEMwNzAxMTAyLCAweDdCMTlFODYzICovCisgLTIuNDg1MjE2NDEwMDk0Mjg4MjIxNDRlKzAzLCAvKiAweEMwQTM2QTZFLCAweENENERDQUZDICovCisgLTUuMjUzMDQzODA0OTA3Mjk1NDUyNzJlKzAzLCAvKiAweEMwQjQ4NTBCLCAweDM2Q0M2NDNEICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwUzhbNV0gPSB7CisgIDEuMTY1MzQzNjQ2MTk2NjgxODE3MTdlKzAyLCAvKiAweDQwNUQyMjMzLCAweDA3QTk2NzUxICovCisgIDMuODMzNzQ0NzUzNjQxMjE4MjY3MTVlKzAzLCAvKiAweDQwQURGMzdELCAweDUwNTk2OTM4ICovCisgIDQuMDU5Nzg1NzI2NDg0NzI1NDU1NTJlKzA0LCAvKiAweDQwRTNEMkJCLCAweDZFQjZCMDVGICovCisgIDEuMTY3NTI5NzI1NjQzNzU5MTU2ODFlKzA1LCAvKiAweDQwRkM4MTBGLCAweDhGOUZBOUJEICovCisgIDQuNzYyNzcyODQxNDY3MzA5NjI2NzVlKzA0LCAvKiAweDQwRTc0MTc3LCAweDRGMkM0OURDICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHBSNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworIC0xLjE0MTI1NDY0NjkxODk0NTAyNTg0ZS0xMSwgLyogMHhCREE5MThCMSwgMHg0N0U0OTVDQyAqLworIC03LjAzMTI0OTQwODczNTk5MjgwMDc4ZS0wMiwgLyogMHhCRkIxRkZGRiwgMHhFNjlBRkJDNiAqLworIC00LjE1OTYxMDY0NDcwNTg3NzgyNDM4ZSswMCwgLyogMHhDMDEwQTM3MCwgMHhGOTBDNkJCRiAqLworIC02Ljc2NzQ3NjUyMjY1MTY3MjYxMDIxZSswMSwgLyogMHhDMDUwRUIyRiwgMHg1QTdEMTc4MyAqLworIC0zLjMxMjMxMjk5NjQ5MTcyOTY3NzQ3ZSswMiwgLyogMHhDMDc0QjNCMywgMHg2NzQyQ0M2MyAqLworIC0zLjQ2NDMzMzg4MzY1NjA0OTEyNDUxZSswMiwgLyogMHhDMDc1QTZFRiwgMHgyOEEzOEJENyAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcFM1WzVdID0geworICA2LjA3NTM5MzgyNjkyMzAwMzM1OTc1ZSswMSwgLyogMHg0MDRFNjA4MSwgMHgwQzk4QzVERSAqLworICAxLjA1MTI1MjMwNTk1NzA0NTc5MTczZSswMywgLyogMHg0MDkwNkQwMiwgMHg1QzdFMjg2NCAqLworICA1Ljk3ODk3MDk0MzMzODU1Nzg0NDk4ZSswMywgLyogMHg0MEI3NUFGOCwgMHg4RkJFMUQ2MCAqLworICA5LjYyNTQ0NTE0MzU3Nzc0NDYwMjIzZSswMywgLyogMHg0MEMyQ0NCOCwgMHhGQTc2RkEzOCAqLworICAyLjQwNjA1ODE1OTIyOTM5MTA5NDQxZSswMywgLyogMHg0MEEyQ0MxRCwgMHhDNzBCRTg2NCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBwUjNbNl0gPSB7LyogZm9yIHggaW4gWzQuNTQ3LDIuODU3MV09MS9bMC4yMTk5LDAuMzUwMDFdICovCisgLTIuNTQ3MDQ2MDE3NzE5NTE5MTU2MjBlLTA5LCAvKiAweEJFMjVFMTAzLCAweDZGRTFBQTg2ICovCisgLTcuMDMxMTk2MTYzODE0ODE2NTQ2NTRlLTAyLCAvKiAweEJGQjFGRkY2LCAweEY3QzBFMjRCICovCisgLTIuNDA5MDMyMjE1NDk1Mjk2MTE0MjNlKzAwLCAvKiAweEMwMDM0NUIyLCAweEFFQTQ4MDc0ICovCisgLTIuMTk2NTk3NzQ3MzQ4ODMwODY0NjdlKzAxLCAvKiAweEMwMzVGNzRBLCAweDRDQjk0RTE0ICovCisgLTUuODA3OTE3MDQ3MDE3Mzc1NzIyMzZlKzAxLCAvKiAweEMwNEQwQTIyLCAweDQyMEExQTQ1ICovCisgLTMuMTQ0Nzk0NzA1OTQ4ODg1MDM4NTRlKzAxLCAvKiAweEMwM0Y3MkFDLCAweEE4OTJEODBGICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwUzNbNV0gPSB7CisgIDMuNTg1NjAzMzgwNTUyMDk3MjYzNDllKzAxLCAvKiAweDQwNDFFRDkyLCAweDg0MDc3REQzICovCisgIDMuNjE1MTM5ODMwNTAzMDM4NjM4MjBlKzAyLCAvKiAweDQwNzY5ODM5LCAweDQ2NEE3QzBFICovCisgIDEuMTkzNjA3ODM3OTIxMTE1MzMzMzBlKzAzLCAvKiAweDQwOTJBNjZFLCAweDZEMTA2MUQ2ICovCisgIDEuMTI3OTk2Nzk4NTY5MDc0MTQ0MzJlKzAzLCAvKiAweDQwOTE5RkZDLCAweEI4QzM5QjdFICovCisgIDEuNzM1ODA5MzA4MTMzMzU3NTQ2OTJlKzAyLCAvKiAweDQwNjVCMjk2LCAweEZDMzc5MDgxICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHBSMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTguODc1MzQzMzMwMzI1MjY0MTEyNTRlLTA4LCAvKiAweEJFNzdEMzE2LCAweEU5MjcwMjZEICovCisgLTcuMDMwMzA5OTU0ODM2MjQ3NDMyNDdlLTAyLCAvKiAweEJGQjFGRjYyLCAweDQ5NUUxRTQyICovCisgLTEuNDUwNzM4NDY3ODA5NTI5ODYzNTdlKzAwLCAvKiAweEJGRjczNjM5LCAweDhBMjRBODQzICovCisgLTcuNjM1Njk2MTM4MjM1Mjc3NzA3OTFlKzAwLCAvKiAweEMwMUU4QUYzLCAweEVEQUZBN0YzICovCisgLTEuMTE5MzE2Njg4NjAzNTY3NDc3ODZlKzAxLCAvKiAweEMwMjY2MkU2LCAweEM1MjQ2MzAzICovCisgLTMuMjMzNjQ1NzkzNTEzMzUzMzUwMzNlKzAwLCAvKiAweEMwMDlERTgxLCAweEFGOEZFNzBGICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwUzJbNV0gPSB7CisgIDIuMjIyMDI5OTc1MzIwODg4MDg0NDFlKzAxLCAvKiAweDQwMzYzODY1LCAweDkwOEI1OTU5ICovCisgIDEuMzYyMDY3OTQyMTgyMTUyMDgwNDhlKzAyLCAvKiAweDQwNjEwNjlFLCAweDBFRTg4NzhGICovCisgIDIuNzA0NzAyNzg2NTgwODM0ODY3ODllKzAyLCAvKiAweDQwNzBFNzg2LCAweDQyRUEwNzlCICovCisgIDEuNTM4NzUzOTQyMDgzMjAzMjk4ODFlKzAyLCAvKiAweDQwNjMzQzAzLCAweDNBQjZGQUZGICovCisgIDEuNDY1NzYxNzY5NDgyNTYxOTM4MTBlKzAxLCAvKiAweDQwMkQ1MEIzLCAweDQ0MzkxODA5ICovCit9OworCisJc3RhdGljIGRvdWJsZSBwemVybyhkb3VibGUgeCkKK3sKKwljb25zdCBkb3VibGUgKnAsKnE7CisJZG91YmxlIHoscixzOworCWludDMyX3QgaXg7CisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQwMjAwMDAwKSAgICAge3AgPSBwUjg7IHE9IHBTODt9CisJZWxzZSBpZihpeD49MHg0MDEyMkU4Qil7cCA9IHBSNTsgcT0gcFM1O30KKwllbHNlIGlmKGl4Pj0weDQwMDZEQjZEKXtwID0gcFIzOyBxPSBwUzM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBwUjI7IHE9IHBTMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqcVs0XSkpKSk7CisJcmV0dXJuIG9uZSsgci9zOworfQorCQkKKworLyogRm9yIHggPj0gOCwgdGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBxemVybyBpcworICoJLTEvOCBzICsgNzUvMTAyNCBzXjMgLSAuLi4sIHdoZXJlIHMgPSAxL3guCisgKiBXZSBhcHByb3hpbWF0ZSBwemVybyBieQorICogCXF6ZXJvKHgpID0gcyooLTEuMjUgKyAoUi9TKSkKKyAqIHdoZXJlICBSID0gcVIwICsgcVIxKnNeMiArIHFSMipzXjQgKyAuLi4gKyBxUjUqc14xMAorICogCSAgUyA9IDEgKyBxUzAqc14yICsgLi4uICsgcVM1KnNeMTIKKyAqIGFuZAorICoJfCBxemVybyh4KS9zICsxLjI1LVIvUyB8IDw9IDIgICoqICggLTYxLjIyKQorICovCitzdGF0aWMgY29uc3QgZG91YmxlIHFSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KKyAgNy4zMjQyMTg3NDk5OTkzNTA1MTk1M2UtMDIsIC8qIDB4M0ZCMkJGRkYsIDB4RkZGRkZFMkMgKi8KKyAgMS4xNzY4MjA2NDY4MjI1MjY5Mzg5OWUrMDEsIC8qIDB4NDAyNzg5NTIsIDB4NUJCMzM0RDYgKi8KKyAgNS41NzY3MzM4MDI1NjQwMTg1NjA1OWUrMDIsIC8qIDB4NDA4MTZENjMsIDB4MTUzMDE4MjUgKi8KKyAgOC44NTkxOTcyMDc1NjQ2ODYzMjMxN2UrMDMsIC8qIDB4NDBDMTREOTksIDB4M0UxOEY0NkQgKi8KKyAgMy43MDE0NjI2Nzc3Njg4NzgzNDc3MWUrMDQsIC8qIDB4NDBFMjEyRDQsIDB4MEU5MDE1NjYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFTOFs2XSA9IHsKKyAgMS42Mzc3NjAyNjg5NTY4OTgyNDQxNGUrMDIsIC8qIDB4NDA2NDc4RDUsIDB4MzY1QjM5QkMgKi8KKyAgOC4wOTgzNDQ5NDY1NjQ0OTgwNTkxNmUrMDMsIC8qIDB4NDBCRkEyNTgsIDB4NEU2QjA1NjMgKi8KKyAgMS40MjUzODI5MTQxOTEyMDQ3NjM0OGUrMDUsIC8qIDB4NDEwMTY2NTIsIDB4NTREMzhDM0YgKi8KKyAgOC4wMzMwOTI1NzExOTUxNDM5NzM0NWUrMDUsIC8qIDB4NDEyODgzREEsIDB4ODNBNTJCNDMgKi8KKyAgOC40MDUwMTU3OTgxOTA2MDUxMjgxOGUrMDUsIC8qIDB4NDEyOUE2NkIsIDB4MjhERTBCM0QgKi8KKyAtMy40Mzg5OTI5MzUzNzg2NjYxNTIyNWUrMDUsIC8qIDB4QzExNEZENkQsIDB4MkM5NTMwQzUgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcVI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgIDEuODQwODU5NjM1OTQ1MTU1MzEzODFlLTExLCAvKiAweDNEQjQzRDhGLCAweDI5Q0M4Q0Q5ICovCisgIDcuMzI0MjE3NjY2MTI2ODQ3NjU4OTZlLTAyLCAvKiAweDNGQjJCRkZGLCAweEQxNzJCMDRDICovCisgIDUuODM1NjM1MDg5NjIwNTY5NTM3NzdlKzAwLCAvKiAweDQwMTc1N0IwLCAweEI5OTUzREQzICovCisgIDEuMzUxMTE1NzcyODY0NDk4Mjk2NzFlKzAyLCAvKiAweDQwNjBFMzkyLCAweDBBODc4OEU5ICovCisgIDEuMDI3MjQzNzY1OTYxNjQwOTc0NjRlKzAzLCAvKiAweDQwOTAwQ0Y5LCAweDlEQzhDNDgxICovCisgIDEuOTg5OTc3ODU4NjQ2MDUzODQ2MzFlKzAzLCAvKiAweDQwOUYxN0U5LCAweDUzQzZFM0E2ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxUzVbNl0gPSB7CisgIDguMjc3NjYxMDIyMzY1Mzc3NjE4ODNlKzAxLCAvKiAweDQwNTRCMUIzLCAweEZCNUUxNTQzICovCisgIDIuMDc3ODE0MTY0MjEzOTI5ODcxMDRlKzAzLCAvKiAweDQwQTAzQkEwLCAweERBMjFDMENFICovCisgIDEuODg0NzI4ODc3ODU3MTgwODUwNzBlKzA0LCAvKiAweDQwRDI2N0QyLCAweDdCNTkxRTZEICovCisgIDUuNjc1MTExMjI4OTQ5NDczMjk3NjllKzA0LCAvKiAweDQwRUJCNUUzLCAweDk3RTAyMzcyICovCisgIDMuNTk3Njc1Mzg0MjUxMTQ0NzE0NjVlKzA0LCAvKiAweDQwRTE5MTE4LCAweDFGN0E1NEEwICovCisgLTUuMzU0MzQyNzU2MDE5NDQ3NzMzNzFlKzAzLCAvKiAweEMwQjRFQTU3LCAweEJFREJDNjA5ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHFSM1s2XSA9IHsvKiBmb3IgeCBpbiBbNC41NDcsMi44NTcxXT0xL1swLjIxOTksMC4zNTAwMV0gKi8KKyAgNC4zNzc0MTAxNDA4OTczODYyMDkwNmUtMDksIC8qIDB4M0UzMkNEMDMsIDB4NkFERUNCODIgKi8KKyAgNy4zMjQxMTE4MDA0MjkxMTQ0NzE2M2UtMDIsIC8qIDB4M0ZCMkJGRUUsIDB4MEU4RDA4NDIgKi8KKyAgMy4zNDQyMzEzNzUxNjE3MDcyMDkyOWUrMDAsIC8qIDB4NDAwQUMwRkMsIDB4NjExNDlDRjUgKi8KKyAgNC4yNjIxODQ0MDc0NTQxMjY1MDAxN2UrMDEsIC8qIDB4NDA0NTRGOTgsIDB4OTYyREFFREQgKi8KKyAgMS43MDgwODA5MTM0MDU2NTU5NjI4M2UrMDIsIC8qIDB4NDA2NTU5REIsIDB4RTI1RUZEMUYgKi8KKyAgMS42NjczMzk0ODY5NjY1MTE2ODU3NWUrMDIsIC8qIDB4NDA2NEQ3N0MsIDB4ODFGQTIxRTAgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFTM1s2XSA9IHsKKyAgNC44NzU4ODcyOTcyNDU4NzE4MjA5MWUrMDEsIC8qIDB4NDA0ODYxMjIsIDB4QkZFMzQzQTYgKi8KKyAgNy4wOTY4OTIyMTA1NjYwNjAxNTczNmUrMDIsIC8qIDB4NDA4NjJEODMsIDB4ODY1NDRFQjMgKi8KKyAgMy43MDQxNDgyMjYyMDExMTM2Mjk5NGUrMDMsIC8qIDB4NDBBQ0YwNEIsIDB4RTQ0REZDNjMgKi8KKyAgNi40NjA0MjUxNjc1MjU2ODkxNzU4MmUrMDMsIC8qIDB4NDBCOTNDNkMsIDB4RDdDNzZBMjggKi8KKyAgMi41MTYzMzM2ODkyMDM2ODk1NzMzM2UrMDMsIC8qIDB4NDBBM0E4QUEsIDB4RDk0RkIxQzAgKi8KKyAtMS40OTI0NzQ1MTgzNjE1NjM4NjY2MmUrMDIsIC8qIDB4QzA2MkE3RUIsIDB4MjAxQ0Y0MEYgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcVIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAgMS41MDQ0NDQ0NDg4Njk4MzI3MjM3OWUtMDcsIC8qIDB4M0U4NDMxM0IsIDB4NTRGNzZCREIgKi8KKyAgNy4zMjIzNDI2NTk2MzA3OTI3ODI3MmUtMDIsIC8qIDB4M0ZCMkJFQzUsIDB4M0U4ODNFMzQgKi8KKyAgMS45OTgxOTE3NDA5MzgxNTk5ODgxNmUrMDAsIC8qIDB4M0ZGRkY4OTcsIDB4RTcyNzc3OUMgKi8KKyAgMS40NDk1NjAyOTM0Nzg4NTczNTM0OGUrMDEsIC8qIDB4NDAyQ0ZEQkYsIDB4QUFGOTZGRTUgKi8KKyAgMy4xNjY2MjMxNzUwNDc4MTU0MDgzM2UrMDEsIC8qIDB4NDAzRkFBOEUsIDB4MjlGQkRDNEEgKi8KKyAgMS42MjUyNzA3NTcxMDkyOTI2NzQxNmUrMDEsIC8qIDB4NDAzMDQwQjEsIDB4NzE4MTRCQjQgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFTMls2XSA9IHsKKyAgMy4wMzY1NTg0ODM1NTIxOTE4NDQ5OGUrMDEsIC8qIDB4NDAzRTVEOTYsIDB4RjdDMDdBRUQgKi8KKyAgMi42OTM0ODExODYwODA0OTg0NDYyNGUrMDIsIC8qIDB4NDA3MEQ1OTEsIDB4RTREMTRCNDAgKi8KKyAgOC40NDc4Mzc1NzU5NTMyMDEzOTQ0NGUrMDIsIC8qIDB4NDA4QTY2NDUsIDB4MjJCM0JGMjIgKi8KKyAgOC44MjkzNTg0NTExMjQ4ODU1MDUxMmUrMDIsIC8qIDB4NDA4Qjk3N0MsIDB4OUM1Q0MyMTQgKi8KKyAgMi4xMjY2NjM4ODUxMTc5ODgyODYzMWUrMDIsIC8qIDB4NDA2QTk1NTMsIDB4MEUwMDEzNjUgKi8KKyAtNS4zMTA5NTQ5Mzg4MjY2Njk0NjkxN2UrMDAsIC8qIDB4QzAxNTNFNkEsIDB4RjhCMzI5MzEgKi8KK307CisKKwlzdGF0aWMgZG91YmxlIHF6ZXJvKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgcyxyLHo7CisJaW50MzJfdCBpeDsKKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDAyMDAwMDApICAgICB7cCA9IHFSODsgcT0gcVM4O30KKwllbHNlIGlmKGl4Pj0weDQwMTIyRThCKXtwID0gcVI1OyBxPSBxUzU7fQorCWVsc2UgaWYoaXg+PTB4NDAwNkRCNkQpe3AgPSBxUjM7IHE9IHFTMzt9CisJZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHFSMjsgcT0gcVMyO30KKwl6ID0gb25lLyh4KngpOworCXIgPSBwWzBdK3oqKHBbMV0reioocFsyXSt6KihwWzNdK3oqKHBbNF0reipwWzVdKSkpKTsKKwlzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reioocVs0XSt6KnFbNV0pKSkpKTsKKwlyZXR1cm4gKC0uMTI1ICsgci9zKS94OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9qMGYuYyBiL2xpYm0vc3JjL2VfajBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3MjQwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfajBmLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qIGVfajBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2owLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2owZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDMgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgZmxvYXQgcHplcm9mKGZsb2F0KSwgcXplcm9mKGZsb2F0KTsKKworc3RhdGljIGNvbnN0IGZsb2F0CitodWdlIAk9IDFlMzAsCitvbmUJPSAxLjAsCitpbnZzcXJ0cGk9ICA1LjY0MTg5NjEyODdlLTAxLCAvKiAweDNmMTA2ZWJiICovCit0cGkgICAgICA9ICA2LjM2NjE5NzQ2NjllLTAxLCAvKiAweDNmMjJmOTgzICovCisgCQkvKiBSMC9TMCBvbiBbMCwgMi4wMF0gKi8KK1IwMiAgPSAgMS41NjI1MDAwMDAwZS0wMiwgLyogMHgzYzgwMDAwMCAqLworUjAzICA9IC0xLjg5OTc5Mjk4NzRlLTA0LCAvKiAweGI5NDczNTJlICovCitSMDQgID0gIDEuODI5NTQwNDUxNmUtMDYsIC8qIDB4MzVmNThlODggKi8KK1IwNSAgPSAtNC42MTgzMjcwNTQxZS0wOSwgLyogMHhiMTllYWYzYyAqLworUzAxICA9ICAxLjU2MTkxMDI4NjVlLTAyLCAvKiAweDNjN2ZlNzQ0ICovCitTMDIgID0gIDEuMTY5MjY3ODUyN2UtMDQsIC8qIDB4MzhmNTM2OTcgKi8KK1MwMyAgPSAgNS4xMzU0NjUyNDQyZS0wNywgLyogMHgzNTA5ZGFhNiAqLworUzA0ICA9ICAxLjE2NjE0MDA3MzRlLTA5OyAvKiAweDMwYTA0NWU4ICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvID0gMC4wOworCitmbG9hdAorX19pZWVlNzU0X2owZihmbG9hdCB4KQoreworCWZsb2F0IHosIHMsYyxzcyxjYyxyLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4gb25lLyh4KngpOworCXggPSBmYWJzZih4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbmYoeCk7CisJCWMgPSBjb3NmKHgpOworCQlzcyA9IHMtYzsKKwkJY2MgPSBzK2M7CisJCWlmKGl4PDB4N2YwMDAwMDApIHsgIC8qIG1ha2Ugc3VyZSB4K3ggbm90IG92ZXJmbG93ICovCisJCSAgICB6ID0gLWNvc2YoeCt4KTsKKwkJICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg4MDAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnRmKHgpOworCQllbHNlIHsKKwkJICAgIHUgPSBwemVyb2YoeCk7IHYgPSBxemVyb2YoeCk7CisJCSAgICB6ID0gaW52c3FydHBpKih1KmNjLXYqc3MpL3NxcnRmKHgpOworCQl9CisJCXJldHVybiB6OworCX0KKwlpZihpeDwweDM5MDAwMDAwKSB7CS8qIHx4fCA8IDIqKi0xMyAqLworCSAgICBpZihodWdlK3g+b25lKSB7CS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJICAgICAgICBpZihpeDwweDMyMDAwMDAwKSByZXR1cm4gb25lOwkvKiB8eHw8MioqLTI3ICovCisJICAgICAgICBlbHNlIAkgICAgICByZXR1cm4gb25lIC0gKGZsb2F0KTAuMjUqeCp4OworCSAgICB9CisJfQorCXogPSB4Kng7CisJciA9ICB6KihSMDIreiooUjAzK3oqKFIwNCt6KlIwNSkpKTsKKwlzID0gIG9uZSt6KihTMDEreiooUzAyK3oqKFMwMyt6KlMwNCkpKTsKKwlpZihpeCA8IDB4M0Y4MDAwMDApIHsJLyogfHh8IDwgMS4wMCAqLworCSAgICByZXR1cm4gb25lICsgeiooKGZsb2F0KS0wLjI1KyhyL3MpKTsKKwl9IGVsc2UgeworCSAgICB1ID0gKGZsb2F0KTAuNSp4OworCSAgICByZXR1cm4oKG9uZSt1KSoob25lLXUpK3oqKHIvcykpOworCX0KK30KKworc3RhdGljIGNvbnN0IGZsb2F0Cit1MDAgID0gLTcuMzgwNDI5NjU1M2UtMDIsIC8qIDB4YmQ5NzI2YjUgKi8KK3UwMSAgPSAgMS43NjY2NjQ1MzQ4ZS0wMSwgLyogMHgzZTM0ZTgwZCAqLwordTAyICA9IC0xLjM4MTg1Njc2MTllLTAyLCAvKiAweGJjNjI2NzQ2ICovCit1MDMgID0gIDMuNDc0NTM0MzE0NmUtMDQsIC8qIDB4MzliNjJhNjkgKi8KK3UwNCAgPSAtMy44MTQwNzA2MjM4ZS0wNiwgLyogMHhiNjdmZjUzYyAqLwordTA1ICA9ICAxLjk1NTkwMTM5NjRlLTA4LCAvKiAweDMyYTgwMmJhICovCit1MDYgID0gLTMuOTgyMDUxODQxMGUtMTEsIC8qIDB4YWUyZjIxZWIgKi8KK3YwMSAgPSAgMS4yNzMwNDgzODk3ZS0wMiwgLyogMHgzYzUwOTM4NSAqLwordjAyICA9ICA3LjYwMDY4NjUxMjllLTA1LCAvKiAweDM4OWY2NWUwICovCit2MDMgID0gIDIuNTkxNTA4NTE4OWUtMDcsIC8qIDB4MzQ4YjIxNmMgKi8KK3YwNCAgPSAgNC40MTExMDMxNDk0ZS0xMDsgLyogMHgyZmYyODBjMiAqLworCitmbG9hdAorX19pZWVlNzU0X3kwZihmbG9hdCB4KQoreworCWZsb2F0IHosIHMsYyxzcyxjYyx1LHY7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogWTAoTmFOKSBpcyBOYU4sIHkwKC1pbmYpIGlzIE5hbiwgeTAoaW5mKSBpcyAwICAqLworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4gIG9uZS8oeCt4KngpOworICAgICAgICBpZihpeD09MCkgcmV0dXJuIC1vbmUvemVybzsKKyAgICAgICAgaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKyAgICAgICAgaWYoaXggPj0gMHg0MDAwMDAwMCkgeyAgLyogfHh8ID49IDIuMCAqLworICAgICAgICAvKiB5MCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpzaW4oeDApK3EwKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC1waS80CisgICAgICAgICAqICAgICAgQmV0dGVyIGZvcm11bGE6CisgICAgICAgICAqICAgICAgICAgICAgICBjb3MoeDApID0gY29zKHgpY29zKHBpLzQpK3Npbih4KXNpbihwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpICsgY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMgPSBzaW5mKHgpOworICAgICAgICAgICAgICAgIGMgPSBjb3NmKHgpOworICAgICAgICAgICAgICAgIHNzID0gcy1jOworICAgICAgICAgICAgICAgIGNjID0gcytjOworCS8qCisJICogajAoeCkgPSAxL3NxcnQocGkpICogKFAoMCx4KSpjYyAtIFEoMCx4KSpzcykgLyBzcXJ0KHgpCisJICogeTAoeCkgPSAxL3NxcnQocGkpICogKFAoMCx4KSpzcyArIFEoMCx4KSpjYykgLyBzcXJ0KHgpCisJICovCisgICAgICAgICAgICAgICAgaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeiA9IC1jb3NmKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGl4PjB4ODAwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0Zih4KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHB6ZXJvZih4KTsgdiA9IHF6ZXJvZih4KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IGludnNxcnRwaSoodSpzcyt2KmNjKS9zcXJ0Zih4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisJfQorCWlmKGl4PD0weDMyMDAwMDAwKSB7CS8qIHggPCAyKiotMjcgKi8KKwkgICAgcmV0dXJuKHUwMCArIHRwaSpfX2llZWU3NTRfbG9nZih4KSk7CisJfQorCXogPSB4Kng7CisJdSA9IHUwMCt6Kih1MDEreioodTAyK3oqKHUwMyt6Kih1MDQreioodTA1K3oqdTA2KSkpKSk7CisJdiA9IG9uZSt6Kih2MDEreioodjAyK3oqKHYwMyt6KnYwNCkpKTsKKwlyZXR1cm4odS92ICsgdHBpKihfX2llZWU3NTRfajBmKHgpKl9faWVlZTc1NF9sb2dmKHgpKSk7Cit9CisKKy8qIFRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcHplcm8gaXMKKyAqCTEgLSA5LzEyOCBzXjIgKyAxMTAyNS85ODMwNCBzXjQgLSAuLi4sCXdoZXJlIHMgPSAxL3guCisgKiBGb3IgeCA+PSAyLCBXZSBhcHByb3hpbWF0ZSBwemVybyBieQorICogCXB6ZXJvKHgpID0gMSArIChSL1MpCisgKiB3aGVyZSAgUiA9IHBSMCArIHBSMSpzXjIgKyBwUjIqc140ICsgLi4uICsgcFI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcFMwKnNeMiArIC4uLiArIHBTNCpzXjEwCisgKiBhbmQKKyAqCXwgcHplcm8oeCktMS1SL1MgfCA8PSAyICAqKiAoIC02MC4yNikKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHBSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCAqLworIC03LjAzMTI1MDAwMDBlLTAyLCAvKiAweGJkOTAwMDAwICovCisgLTguMDgxNjcwNzYxMWUrMDAsIC8qIDB4YzEwMTRlODYgKi8KKyAtMi41NzA2MzExMDM1ZSswMiwgLyogMHhjMzgwODgxNCAqLworIC0yLjQ4NTIxNjMwODZlKzAzLCAvKiAweGM1MWI1Mzc2ICovCisgLTUuMjUzMDQzOTQ1M2UrMDMsIC8qIDB4YzVhNDI4NWEgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFM4WzVdID0geworICAxLjE2NTM0MzYyNzllKzAyLCAvKiAweDQyZTkxMTk4ICovCisgIDMuODMzNzQ0ODczMGUrMDMsIC8qIDB4NDU2ZjliZWIgKi8KKyAgNC4wNTk3ODU1NDY5ZSswNCwgLyogMHg0NzFlOTVkYiAqLworICAxLjE2NzUyOTY4NzVlKzA1LCAvKiAweDQ3ZTQwODdjICovCisgIDQuNzYyNzcyNjU2MmUrMDQsIC8qIDB4NDczYTBiYmEgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgLTEuMTQxMjU0NjI1NWUtMTEsIC8qIDB4YWQ0OGM1OGEgKi8KKyAtNy4wMzEyNDkyNTQ5ZS0wMiwgLyogMHhiZDhmZmZmZiAqLworIC00LjE1OTYxMDc0ODNlKzAwLCAvKiAweGMwODUxYjg4ICovCisgLTYuNzY3NDc2NjU0MWUrMDEsIC8qIDB4YzI4NzU5N2IgKi8KKyAtMy4zMTIzMTI5MjcyZSswMiwgLyogMHhjM2E1OWQ5YiAqLworIC0zLjQ2NDMzMzgwMTNlKzAyLCAvKiAweGMzYWQzNzc5ICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBTNVs1XSA9IHsKKyAgNi4wNzUzOTM2NzY4ZSswMSwgLyogMHg0MjczMDQwOCAqLworICAxLjA1MTI1MjMxOTNlKzAzLCAvKiAweDQ0ODM2ODEzICovCisgIDUuOTc4OTcwNzAzMWUrMDMsIC8qIDB4NDViYWQ3YzQgKi8KKyAgOS42MjU0NDUzMTI1ZSswMywgLyogMHg0NjE2NjVjOCAqLworICAyLjQwNjA1ODEwNTVlKzAzLCAvKiAweDQ1MTY2MGVlICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcFIzWzZdID0gey8qIGZvciB4IGluIFs0LjU0NywyLjg1NzFdPTEvWzAuMjE5OSwwLjM1MDAxXSAqLworIC0yLjU0NzA0NTkwNzVlLTA5LCAvKiAweGIxMmYwODFiICovCisgLTcuMDMxMTk2MzU1OGUtMDIsIC8qIDB4YmQ4ZmZmYjggKi8KKyAtMi40MDkwMzIxMDY0ZSswMCwgLyogMHhjMDFhMmQ5NSAqLworIC0yLjE5NjU5NzY3MTVlKzAxLCAvKiAweGMxYWZiYTUyICovCisgLTUuODA3OTE3MDIyN2UrMDEsIC8qIDB4YzI2ODUxMTIgKi8KKyAtMy4xNDQ3OTQ2NTQ4ZSswMSwgLyogMHhjMWZiOTU2NSAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwUzNbNV0gPSB7CisgIDMuNTg1NjAzMzMyNWUrMDEsIC8qIDB4NDIwZjZjOTQgKi8KKyAgMy42MTUxMzk3NzA1ZSswMiwgLyogMHg0M2I0YzFjYSAqLworICAxLjE5MzYwNzc4ODFlKzAzLCAvKiAweDQ0OTUzMzczICovCisgIDEuMTI3OTk2ODI2MmUrMDMsIC8qIDB4NDQ4Y2ZmZTYgKi8KKyAgMS43MzU4MDkzMjYyZSswMiwgLyogMHg0MzJkOTRiOCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHBSMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTguODc1MzQzMTI3MWUtMDgsIC8qIDB4YjNiZTk4YjcgKi8KKyAtNy4wMzAzMDk3MzY3ZS0wMiwgLyogMHhiZDhmZmIxMiAqLworIC0xLjQ1MDczODQzMDBlKzAwLCAvKiAweGJmYjliMWNjICovCisgLTcuNjM1Njk1OTM0M2UrMDAsIC8qIDB4YzBmNDU3OWYgKi8KKyAtMS4xMTkzMTY2NzMzZSswMSwgLyogMHhjMTMzMTczNiAqLworIC0zLjIzMzY0NTY3NzZlKzAwLCAvKiAweGMwNGVmNDBkICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBTMls1XSA9IHsKKyAgMi4yMjIwMzAwNjc0ZSswMSwgLyogMHg0MWIxYzMyZCAqLworICAxLjM2MjA2Nzg3MTFlKzAyLCAvKiAweDQzMDgzNGYwICovCisgIDIuNzA0NzAyNzU4OGUrMDIsIC8qIDB4NDM4NzNjMzIgKi8KKyAgMS41Mzg3NTM5NjczZSswMiwgLyogMHg0MzE5ZTAxYSAqLworICAxLjQ2NTc2MTc1NjllKzAxLCAvKiAweDQxNmE4NTlhICovCit9OworCisJc3RhdGljIGZsb2F0IHB6ZXJvZihmbG9hdCB4KQoreworCWNvbnN0IGZsb2F0ICpwLCpxOworCWZsb2F0IHoscixzOworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0MTAwMDAwMCkgICAgIHtwID0gcFI4OyBxPSBwUzg7fQorCWVsc2UgaWYoaXg+PTB4NDBmNzFjNTgpe3AgPSBwUjU7IHE9IHBTNTt9CisJZWxzZSBpZihpeD49MHg0MDM2ZGI2OCl7cCA9IHBSMzsgcT0gcFMzO30KKwllbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcFIyOyBxPSBwUzI7fQorCXogPSBvbmUvKHgqeCk7CisJciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworCXMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KnFbNF0pKSkpOworCXJldHVybiBvbmUrIHIvczsKK30KKworCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHF6ZXJvIGlzCisgKgktMS84IHMgKyA3NS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcXplcm8oeCkgPSBzKigtMS4yNSArIChSL1MpKQorICogd2hlcmUgIFIgPSBxUjAgKyBxUjEqc14yICsgcVIyKnNeNCArIC4uLiArIHFSNSpzXjEwCisgKiAJICBTID0gMSArIHFTMCpzXjIgKyAuLi4gKyBxUzUqc14xMgorICogYW5kCisgKgl8IHF6ZXJvKHgpL3MgKzEuMjUtUi9TIHwgPD0gMiAgKiogKCAtNjEuMjIpCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBxUjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAgKi8KKyAgNy4zMjQyMTg3NTAwZS0wMiwgLyogMHgzZDk2MDAwMCAqLworICAxLjE3NjgyMDY1OTZlKzAxLCAvKiAweDQxM2M0YTkzICovCisgIDUuNTc2NzM0MDA4OGUrMDIsIC8qIDB4NDQwYjZiMTkgKi8KKyAgOC44NTkxOTcyNjU2ZSswMywgLyogMHg0NjBhNmNjYSAqLworICAzLjcwMTQ2MjUwMDBlKzA0LCAvKiAweDQ3MTA5NmEwICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFTOFs2XSA9IHsKKyAgMS42Mzc3NjAzMTQ5ZSswMiwgLyogMHg0MzIzYzZhYSAqLworICA4LjA5ODM0NDcyNjZlKzAzLCAvKiAweDQ1ZmQxMmMyICovCisgIDEuNDI1MzgyOTY4OGUrMDUsIC8qIDB4NDgwYjMyOTMgKi8KKyAgOC4wMzMwOTI1MDAwZSswNSwgLyogMHg0OTQ0MWVkNCAqLworICA4LjQwNTAxNTYyNTBlKzA1LCAvKiAweDQ5NGQzMzU5ICovCisgLTMuNDM4OTkyODEyNWUrMDUsIC8qIDB4YzhhN2ViNjkgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBxUjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS44NDA4NTk1ODI4ZS0xMSwgLyogMHgyZGExZWM3OSAqLworICA3LjMyNDIxODAwNDllLTAyLCAvKiAweDNkOTVmZmZmICovCisgIDUuODM1NjM1MTg1MmUrMDAsIC8qIDB4NDBiYWJkODYgKi8KKyAgMS4zNTExMTU3MjI3ZSswMiwgLyogMHg0MzA3MWM5MCAqLworICAxLjAyNzI0Mzc3NDRlKzAzLCAvKiAweDQ0ODA2N2NkICovCisgIDEuOTg5OTc3OTA1M2UrMDMsIC8qIDB4NDRmOGJmNGIgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVM1WzZdID0geworICA4LjI3NzY2MTEzMjhlKzAxLCAvKiAweDQyYTU4ZGEwICovCisgIDIuMDc3ODE0MjA5MGUrMDMsIC8qIDB4NDUwMWRkMDcgKi8KKyAgMS44ODQ3Mjg5MDYyZSswNCwgLyogMHg0NjkzM2U5NCAqLworICA1LjY3NTExMTMyODFlKzA0LCAvKiAweDQ3NWRhZjFkICovCisgIDMuNTk3Njc1MzkwNmUrMDQsIC8qIDB4NDcwYzg4YzEgKi8KKyAtNS4zNTQzNDI3NzM0ZSswMywgLyogMHhjNWE3NTJiZSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFSM1s2XSA9IHsvKiBmb3IgeCBpbiBbNC41NDcsMi44NTcxXT0xL1swLjIxOTksMC4zNTAwMV0gKi8KKyAgNC4zNzc0MDk5OTAwZS0wOSwgLyogMHgzMTk2NjgxYiAqLworICA3LjMyNDExMTQ2MTZlLTAyLCAvKiAweDNkOTVmZjcwICovCisgIDMuMzQ0MjMxMzY3MWUrMDAsIC8qIDB4NDA1NjA3ZTMgKi8KKyAgNC4yNjIxODQ1MjQ1ZSswMSwgLyogMHg0MjJhN2NjNSAqLworICAxLjcwODA4MDkwMjFlKzAyLCAvKiAweDQzMmFjZWRmICovCisgIDEuNjY3MzM5NDc3NWUrMDIsIC8qIDB4NDMyNmJiZTQgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVMzWzZdID0geworICA0Ljg3NTg4NzI5ODZlKzAxLCAvKiAweDQyNDMwOTE2ICovCisgIDcuMDk2ODkyMDg5OGUrMDIsIC8qIDB4NDQzMTZjMWMgKi8KKyAgMy43MDQxNDgxOTM0ZSswMywgLyogMHg0NTY3ODI1ZiAqLworICA2LjQ2MDQyNTI5MzBlKzAzLCAvKiAweDQ1YzllMzY3ICovCisgIDIuNTE2MzMzNzQwMmUrMDMsIC8qIDB4NDUxZDQ1NTcgKi8KKyAtMS40OTI0NzQ1MTc4ZSswMiwgLyogMHhjMzE1M2Y1OSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFSMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgIDEuNTA0NDQ0NDk3OWUtMDcsIC8qIDB4MzQyMTg5ZGIgKi8KKyAgNy4zMjIzNDI2OTM4ZS0wMiwgLyogMHgzZDk1ZjYyYSAqLworICAxLjk5ODE5MTcxNDNlKzAwLCAvKiAweDNmZmZjNGJmICovCisgIDEuNDQ5NTYwMjYwOGUrMDEsIC8qIDB4NDE2N2VkZmQgKi8KKyAgMy4xNjY2MjMxMTU1ZSswMSwgLyogMHg0MWZkNTQ3MSAqLworICAxLjYyNTI3MDg0MzVlKzAxLCAvKiAweDQxODIwNThjICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFTMls2XSA9IHsKKyAgMy4wMzY1NTg1MzI3ZSswMSwgLyogMHg0MWYyZWNiOCAqLworICAyLjY5MzQ4MTE0MDFlKzAyLCAvKiAweDQzODZhYzhmICovCisgIDguNDQ3ODM3NTI0NGUrMDIsIC8qIDB4NDQ1MzMyMjkgKi8KKyAgOC44MjkzNTg1MjA1ZSswMiwgLyogMHg0NDVjYmJlNSAqLworICAyLjEyNjY2MzgxODRlKzAyLCAvKiAweDQzNTRhYTk4ICovCisgLTUuMzEwOTU1MDQ3NmUrMDAsIC8qIDB4YzBhOWYzNTggKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcXplcm9mKGZsb2F0IHgpCit7CisJY29uc3QgZmxvYXQgKnAsKnE7CisJZmxvYXQgcyxyLHo7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQxMDAwMDAwKSAgICAge3AgPSBxUjg7IHE9IHFTODt9CisJZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHFSNTsgcT0gcVM1O30KKwllbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcVIzOyBxPSBxUzM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBxUjI7IHE9IHFTMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqKHFbNF0reipxWzVdKSkpKSk7CisJcmV0dXJuICgtKGZsb2F0KS4xMjUgKyByL3MpL3g7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2oxLmMgYi9saWJtL3NyYy9lX2oxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiZjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfajEuYwpAQCAtMCwwICsxLDM3NyBAQAorCisvKiBAKCMpZV9qMS5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2oxLmMsdiAxLjggMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9qMSh4KSwgX19pZWVlNzU0X3kxKHgpCisgKiBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQga2luZHMgb2Ygb3JkZXIgemVyby4KKyAqIE1ldGhvZCAtLSBqMSh4KToKKyAqCTEuIEZvciB0aW55IHgsIHdlIHVzZSBqMSh4KSA9IHgvMiAtIHheMy8xNiArIHheNS8zODQgLSAuLi4KKyAqCTIuIFJlZHVjZSB4IHRvIHx4fCBzaW5jZSBqMSh4KT0tajEoLXgpLCAgYW5kCisgKgkgICBmb3IgeCBpbiAoMCwyKQorICoJCWoxKHgpID0geC8yICsgeCp6KlIwL1MwLCAgd2hlcmUgeiA9IHgqeDsKKyAqCSAgIChwcmVjaXNpb246ICB8ajEveCAtIDEvMiAtIFIwL1MwIHw8MioqLTYxLjUxICkKKyAqCSAgIGZvciB4IGluICgyLGluZikKKyAqIAkJajEoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDEoeCkqY29zKHgxKS1xMSh4KSpzaW4oeDEpKQorICogCQl5MSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpzaW4oeDEpK3ExKHgpKmNvcyh4MSkpCisgKiAJICAgd2hlcmUgeDEgPSB4LTMqcGkvNC4gSXQgaXMgYmV0dGVyIHRvIGNvbXB1dGUgc2luKHgxKSxjb3MoeDEpCisgKgkgICBhcyBmb2xsb3c6CisgKgkJY29zKHgxKSA9ICBjb3MoeCljb3MoM3BpLzQpK3Npbih4KXNpbigzcGkvNCkKKyAqCQkJPSAgMS9zcXJ0KDIpICogKHNpbih4KSAtIGNvcyh4KSkKKyAqCQlzaW4oeDEpID0gIHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICoJCQk9IC0xL3NxcnQoMikgKiAoc2luKHgpICsgY29zKHgpKQorICogCSAgIChUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICoJCXNpbih4KSArLSBjb3MoeCkgPSAtY29zKDJ4KS8oc2luKHgpIC0rIGNvcyh4KSkKKyAqIAkgICAgdG8gY29tcHV0ZSB0aGUgd29yc2Ugb25lLikKKyAqCSAgIAorICoJMyBTcGVjaWFsIGNhc2VzCisgKgkJajEobmFuKT0gbmFuCisgKgkJajEoMCkgPSAwCisgKgkJajEoaW5mKSA9IDAKKyAqCQkKKyAqIE1ldGhvZCAtLSB5MSh4KToKKyAqCTEuIHNjcmVlbiBvdXQgeDw9MCBjYXNlczogeTEoMCk9LWluZiwgeTEoeDwwKT1OYU4gCisgKgkyLiBGb3IgeDwyLgorICoJICAgU2luY2UgCisgKgkJeTEoeCkgPSAyL3BpKihqMSh4KSoobG4oeC8yKStFdWxlciktMS94LXgvMis1LzY0KnheMy0uLi4pCisgKgkgICB0aGVyZWZvcmUgeTEoeCktMi9waSpqMSh4KSpsbih4KS0xL3ggaXMgYW4gb2RkIGZ1bmN0aW9uLgorICoJICAgV2UgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gYXBwcm94aW1hdGUgeTEsCisgKgkJeTEoeCkgPSB4KlUoeikvVih6KSArICgyL3BpKSooajEoeCkqbG4oeCktMS94KSwgej0geF4yCisgKgkgICB3aGVyZSBmb3IgeCBpbiBbMCwyXSAoYWJzIGVyciBsZXNzIHRoYW4gMioqLTY1Ljg5KQorICoJCVUoeikgPSBVMFswXSArIFUwWzFdKnogKyAuLi4gKyBVMFs0XSp6XjQKKyAqCQlWKHopID0gMSAgKyB2MFswXSp6ICsgLi4uICsgdjBbNF0qel41CisgKgkgICBOb3RlOiBGb3IgdGlueSB4LCAxL3ggZG9taW5hdGUgeTEgYW5kIGhlbmNlCisgKgkJeTEodGlueSkgPSAtMi9waS90aW55LCAoY2hvb3NlIHRpbnk8MioqLTU0KQorICoJMy4gRm9yIHg+PTIuCisgKiAJCXkxKHgpID0gc3FydCgyLyhwaSp4KSkqKHAxKHgpKnNpbih4MSkrcTEoeCkqY29zKHgxKSkKKyAqIAkgICB3aGVyZSB4MSA9IHgtMypwaS80LiBJdCBpcyBiZXR0ZXIgdG8gY29tcHV0ZSBzaW4oeDEpLGNvcyh4MSkKKyAqCSAgIGJ5IG1ldGhvZCBtZW50aW9uZWQgYWJvdmUuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGRvdWJsZSBwb25lKGRvdWJsZSksIHFvbmUoZG91YmxlKTsKKworc3RhdGljIGNvbnN0IGRvdWJsZQoraHVnZSAgICA9IDFlMzAwLAorb25lCT0gMS4wLAoraW52c3FydHBpPSAgNS42NDE4OTU4MzU0Nzc1NjI3OTI4MGUtMDEsIC8qIDB4M0ZFMjBERDcsIDB4NTA0MjlCNkQgKi8KK3RwaSAgICAgID0gIDYuMzY2MTk3NzIzNjc1ODEzODI0MzNlLTAxLCAvKiAweDNGRTQ1RjMwLCAweDZEQzlDODgzICovCisJLyogUjAvUzAgb24gWzAsMl0gKi8KK3IwMCAgPSAtNi4yNTAwMDAwMDAwMDAwMDAwMDAwMGUtMDIsIC8qIDB4QkZCMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3IwMSAgPSAgMS40MDcwNTY2Njk1NTE4OTcwNjA0OGUtMDMsIC8qIDB4M0Y1NzBEOUYsIDB4OTg0NzJDNjEgKi8KK3IwMiAgPSAtMS41OTk1NTYzMTA4NDAzNTU5NzUyMGUtMDUsIC8qIDB4QkVGMEM1QzYsIDB4QkExNjk2NjggKi8KK3IwMyAgPSAgNC45NjcyNzk5OTYwOTU4NDQ0ODQxMmUtMDgsIC8qIDB4M0U2QUFBRkEsIDB4NDZDQTBCRDkgKi8KK3MwMSAgPSAgMS45MTUzNzU5OTUzODM2MzQ2MDgwNWUtMDIsIC8qIDB4M0Y5MzlEMEIsIDB4MTI2MzdFNTMgKi8KK3MwMiAgPSAgMS44NTk0Njc4NTU4ODYzMDkxNTU2MGUtMDQsIC8qIDB4M0YyODVGNTYsIDB4QjlDREY2NjQgKi8KK3MwMyAgPSAgMS4xNzcxODQ2NDA0MjYyMzY4MzI2M2UtMDYsIC8qIDB4M0VCM0JGRjgsIDB4MzMzRjg0OTggKi8KK3MwNCAgPSAgNS4wNDYzNjI1NzA3NjIxNzA0MjcxNWUtMDksIC8qIDB4M0UzNUFDODgsIDB4Qzk3REZGMkMgKi8KK3MwNSAgPSAgMS4yMzU0MjI3NDQyNjEzNzkxMzkwOGUtMTE7IC8qIDB4M0RBQjJBQ0YsIDB4Q0ZCOTdFRDggKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvICAgID0gMC4wOworCitkb3VibGUKK19faWVlZTc1NF9qMShkb3VibGUgeCkKK3sKKwlkb3VibGUgeiwgcyxjLHNzLGNjLHIsdSx2LHk7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4gb25lL3g7CisJeSA9IGZhYnMoeCk7CisJaWYoaXggPj0gMHg0MDAwMDAwMCkgewkvKiB8eHwgPj0gMi4wICovCisJCXMgPSBzaW4oeSk7CisJCWMgPSBjb3MoeSk7CisJCXNzID0gLXMtYzsKKwkJY2MgPSBzLWM7CisJCWlmKGl4PDB4N2ZlMDAwMDApIHsgIC8qIG1ha2Ugc3VyZSB5K3kgbm90IG92ZXJmbG93ICovCisJCSAgICB6ID0gY29zKHkreSk7CisJCSAgICBpZiAoKHMqYyk+emVybykgY2MgPSB6L3NzOworCQkgICAgZWxzZSAJICAgIHNzID0gei9jYzsKKwkJfQorCS8qCisJICogajEoeCkgPSAxL3NxcnQocGkpICogKFAoMSx4KSpjYyAtIFEoMSx4KSpzcykgLyBzcXJ0KHgpCisJICogeTEoeCkgPSAxL3NxcnQocGkpICogKFAoMSx4KSpzcyArIFEoMSx4KSpjYykgLyBzcXJ0KHgpCisJICovCisJCWlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKmNjKS9zcXJ0KHkpOworCQllbHNlIHsKKwkJICAgIHUgPSBwb25lKHkpOyB2ID0gcW9uZSh5KTsKKwkJICAgIHogPSBpbnZzcXJ0cGkqKHUqY2Mtdipzcykvc3FydCh5KTsKKwkJfQorCQlpZihoeDwwKSByZXR1cm4gLXo7CisJCWVsc2UgIAkgcmV0dXJuICB6OworCX0KKwlpZihpeDwweDNlNDAwMDAwKSB7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIDAuNSp4Oy8qIGluZXhhY3QgaWYgeCE9MCBuZWNlc3NhcnkgKi8KKwl9CisJeiA9IHgqeDsKKwlyID0gIHoqKHIwMCt6KihyMDEreioocjAyK3oqcjAzKSkpOworCXMgPSAgb25lK3oqKHMwMSt6KihzMDIreiooczAzK3oqKHMwNCt6KnMwNSkpKSk7CisJciAqPSB4OworCXJldHVybih4KjAuNStyL3MpOworfQorCitzdGF0aWMgY29uc3QgZG91YmxlIFUwWzVdID0geworIC0xLjk2MDU3MDkwNjQ2MjM4OTQwNjY4ZS0wMSwgLyogMHhCRkM5MTg2NiwgMHgxNDNDQkM4QSAqLworICA1LjA0NDM4NzE2NjM5ODExMjgyNjE2ZS0wMiwgLyogMHgzRkE5RDNDNywgMHg3NjI5MkNEMSAqLworIC0xLjkxMjU2ODk1ODc1NzYzNTQ3Mjk4ZS0wMywgLyogMHhCRjVGNTVFNSwgMHg0ODQ0RjUwRiAqLworICAyLjM1MjUyNjAwNTYxNjEwNDk1OTI4ZS0wNSwgLyogMHgzRUY4QUIwMywgMHg4RkE2Qjg4RSAqLworIC05LjE5MDk5MTU4MDM5ODc4ODc0NTA0ZS0wOCwgLyogMHhCRTc4QUMwMCwgMHg1NjkxMDVCOCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgVjBbNV0gPSB7CisgIDEuOTkxNjczMTgyMzY2NDk5MDM5NzNlLTAyLCAvKiAweDNGOTQ2NTBELCAweDNGNERBOUYwICovCisgIDIuMDI1NTI1ODEwMjUxMzUxNzE0OTZlLTA0LCAvKiAweDNGMkE4Qzg5LCAweDZDMjU3NzY0ICovCisgIDEuMzU2MDg4MDEwOTc1MTYyMjk0MDRlLTA2LCAvKiAweDNFQjZDMDVBLCAweDg5NEU4Q0E2ICovCisgIDYuMjI3NDE0NTIzNjQ2MjE1MDEyOTVlLTA5LCAvKiAweDNFM0FCRjFELCAweDVCQTY5QTg2ICovCisgIDEuNjY1NTkyNDYyMDc5OTIwNzkxMTRlLTExLCAvKiAweDNEQjI1MDM5LCAweERBQ0E3NzJBICovCit9OworCitkb3VibGUKK19faWVlZTc1NF95MShkb3VibGUgeCkKK3sKKwlkb3VibGUgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4LGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKyAgICAgICAgaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIFkxKE5hTikgaXMgTmFOLCBZMSgtaW5mKSBpcyBOYU4sIFkxKGluZikgaXMgMCAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4gIG9uZS8oeCt4KngpOyAKKyAgICAgICAgaWYoKGl4fGx4KT09MCkgcmV0dXJuIC1vbmUvemVybzsKKyAgICAgICAgaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKyAgICAgICAgaWYoaXggPj0gMHg0MDAwMDAwMCkgeyAgLyogfHh8ID49IDIuMCAqLworICAgICAgICAgICAgICAgIHMgPSBzaW4oeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvcyh4KTsKKyAgICAgICAgICAgICAgICBzcyA9IC1zLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzLWM7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg3ZmUwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeiA9IGNvcyh4K3gpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHMqYyk+emVybykgY2MgPSB6L3NzOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgc3MgPSB6L2NjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLyogeTEoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDEoeCkqc2luKHgwKStxMSh4KSpjb3MoeDApKQorICAgICAgICAgKiB3aGVyZSB4MCA9IHgtM3BpLzQKKyAgICAgICAgICogICAgICBCZXR0ZXIgZm9ybXVsYToKKyAgICAgICAgICogICAgICAgICAgICAgIGNvcyh4MCkgPSBjb3MoeCljb3MoM3BpLzQpK3Npbih4KXNpbigzcGkvNCkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAgMS9zcXJ0KDIpICogKHNpbih4KSAtIGNvcyh4KSkKKyAgICAgICAgICogICAgICAgICAgICAgIHNpbih4MCkgPSBzaW4oeCljb3MoM3BpLzQpLWNvcyh4KXNpbigzcGkvNCkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAtMS9zcXJ0KDIpICogKGNvcyh4KSArIHNpbih4KSkKKyAgICAgICAgICogVG8gYXZvaWQgY2FuY2VsbGF0aW9uLCB1c2UKKyAgICAgICAgICogICAgICAgICAgICAgIHNpbih4KSArLSBjb3MoeCkgPSAtY29zKDJ4KS8oc2luKHgpIC0rIGNvcyh4KSkKKyAgICAgICAgICogdG8gY29tcHV0ZSB0aGUgd29yc2Ugb25lLgorICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihpeD4weDQ4MDAwMDAwKSB6ID0gKGludnNxcnRwaSpzcykvc3FydCh4KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHBvbmUoeCk7IHYgPSBxb25lKHgpOworICAgICAgICAgICAgICAgICAgICB6ID0gaW52c3FydHBpKih1KnNzK3YqY2MpL3NxcnQoeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICB9IAorICAgICAgICBpZihpeDw9MHgzYzkwMDAwMCkgeyAgICAvKiB4IDwgMioqLTU0ICovCisgICAgICAgICAgICByZXR1cm4oLXRwaS94KTsKKyAgICAgICAgfSAKKyAgICAgICAgeiA9IHgqeDsKKyAgICAgICAgdSA9IFUwWzBdK3oqKFUwWzFdK3oqKFUwWzJdK3oqKFUwWzNdK3oqVTBbNF0pKSk7CisgICAgICAgIHYgPSBvbmUreiooVjBbMF0reiooVjBbMV0reiooVjBbMl0reiooVjBbM10reipWMFs0XSkpKSk7CisgICAgICAgIHJldHVybih4Kih1L3YpICsgdHBpKihfX2llZWU3NTRfajEoeCkqX19pZWVlNzU0X2xvZyh4KS1vbmUveCkpOworfQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHBvbmUgaXMKKyAqCTEgKyAxNS8xMjggc14yIC0gNDcyNS8yXjE1IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHBvbmUgYnkKKyAqIAlwb25lKHgpID0gMSArIChSL1MpCisgKiB3aGVyZSAgUiA9IHByMCArIHByMSpzXjIgKyBwcjIqc140ICsgLi4uICsgcHI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcHMwKnNeMiArIC4uLiArIHBzNCpzXjEwCisgKiBhbmQKKyAqCXwgcG9uZSh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjA2KQorICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgcHI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworICAxLjE3MTg3NDk5OTk5OTg4NjQ3OTcwZS0wMSwgLyogMHgzRkJERkZGRiwgMHhGRkZGRkNDRSAqLworICAxLjMyMzk0ODA2NTkzMDczNTc1MTI5ZSswMSwgLyogMHg0MDJBN0E5RCwgMHgzNTdGN0ZDRSAqLworICA0LjEyMDUxODU0MzA3Mzc4NTYyMjI1ZSswMiwgLyogMHg0MDc5QzBENCwgMHg2NTJFQTU5MCAqLworICAzLjg3NDc0NTM4OTEzOTYwNTMyMjI3ZSswMywgLyogMHg0MEFFNDU3RCwgMHhBM0E1MzJDQyAqLworICA3LjkxNDQ3OTU0MDMxODkxNzMxNTc0ZSswMywgLyogMHg0MEJFRUE3QSwgMHhDMzI3ODJERCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHM4WzVdID0geworICAxLjE0MjA3MzcwMzc1Njc4NDA4NDM2ZSswMiwgLyogMHg0MDVDOEQ0NSwgMHg4RTY1NkNBQyAqLworICAzLjY1MDkzMDgzNDIwODUzNDYzMzk0ZSswMywgLyogMHg0MEFDODVEQywgMHg5NjREMjc0RiAqLworICAzLjY5NTYyMDYwMjY5MDMzNDYzNTU1ZSswNCwgLyogMHg0MEUyMEI4NiwgMHg5N0M1QkI3RiAqLworICA5Ljc2MDI3OTM1OTM0OTUwODAxMzExZSswNCwgLyogMHg0MEY3RDQyQywgMHhCMjhGMTdCQiAqLworICAzLjA4MDQyNzIwNjI3ODg4ODExNTc4ZSswNCwgLyogMHg0MERFMTUxMSwgMHg2OTdBMEIyRCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS4zMTk5MDUxOTU1NjI0MzUyMjc0OWUtMTEsIC8qIDB4M0RBRDA2NjcsIDB4REFFMUNBN0QgKi8KKyAgMS4xNzE4NzQ5MzE5MDYxNDA5NzYzOGUtMDEsIC8qIDB4M0ZCREZGRkYsIDB4RTJDMTAwNDMgKi8KKyAgNi44MDI3NTEyNzg2ODQzMjg3MTczNmUrMDAsIC8qIDB4NDAxQjM2MDQsIDB4NkU2MzE1RTMgKi8KKyAgMS4wODMwODE4Mjk5MDE4OTEwOTc3M2UrMDIsIC8qIDB4NDA1QjEzQjksIDB4NDUyNjAyRUQgKi8KKyAgNS4xNzYzNjEzOTUzMzE5OTc1MjgwNWUrMDIsIC8qIDB4NDA4MDJEMTYsIDB4RDA1MkQ2NDkgKi8KKyAgNS4yODcxNTIwMTM2MzMzNzU0MTgwN2UrMDIsIC8qIDB4NDA4MDg1QjgsIDB4QkI3RTBDQjcgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBzNVs1XSA9IHsKKyAgNS45MjgwNTk4NzIyMTEzMTMzMTkyMWUrMDEsIC8qIDB4NDA0REEzRUEsIDB4QThBRjYzM0QgKi8KKyAgOS45MTQwMTQxODczMzYxNDM3Nzc0M2UrMDIsIC8qIDB4NDA4RUZCMzYsIDB4MUIwNjY3MDEgKi8KKyAgNS4zNTMyNjY5NTI5MTQ4Nzk3NjY0N2UrMDMsIC8qIDB4NDBCNEU5NDQsIDB4NTcwNkI2RkIgKi8KKyAgNy44NDQ2OTAzMTc0OTU1MTIzMTc2OWUrMDMsIC8qIDB4NDBCRUE0QjAsIDB4QjhBNUJCMTUgKi8KKyAgMS41MDQwNDY4ODgxMDM2MTA2MjY3OWUrMDMsIC8qIDB4NDA5NzgwMzAsIDB4MDM2RjVFNTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcHIzWzZdID0geworICAzLjAyNTAzOTE2MTM3MzczNjE4MDI0ZS0wOSwgLyogMHgzRTI5RkMyMSwgMHhBN0FEOUVERCAqLworICAxLjE3MTg2ODY1NTY3MjUzNTkyNDkxZS0wMSwgLyogMHgzRkJERkZGNSwgMHg1QjIxRDE3QiAqLworICAzLjkzMjk3NzUwMDMzMzE1NjQwNjUwZSswMCwgLyogMHg0MDBGNzZCQywgMHhFODVFQUQ4QSAqLworICAzLjUxMTk0MDM1NTkxNjM2OTMyNzM2ZSswMSwgLyogMHg0MDQxOEY0OCwgMHg5REE2RDEyOSAqLworICA5LjEwNTUwMTEwNzUwNzgxMjcxOTE4ZSswMSwgLyogMHg0MDU2QzM4NSwgMHg0RDJDMTgzNyAqLworICA0Ljg1NTkwNjg1MTk3MzY0OTE5NjQ1ZSswMSwgLyogMHg0MDQ4NDc4RiwgMHg4RUE4M0VFNSAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHMzWzVdID0geworICAzLjQ3OTEzMDk1MDAxMjUxNTE5OTg5ZSswMSwgLyogMHg0MDQxNjU0OSwgMHhBMTM0MDY5QyAqLworICAzLjM2NzYyNDU4NzQ3ODI1NzQ2NzQxZSswMiwgLyogMHg0MDc1MEMzMywgMHgwN0YxQTc1RiAqLworICAxLjA0Njg3MTM5OTc1Nzc1MTMwNTUxZSswMywgLyogMHg0MDkwNUI3QywgMHg1MDM3RDUyMyAqLworICA4LjkwODExMzQ2Mzk4MjU2NDMyNjIyZSswMiwgLyogMHg0MDhCRDY3RCwgMHhBMzJFMzFFOSAqLworICAxLjAzNzg3OTMyNDM5NjM5Mjc3NTA0ZSswMiwgLyogMHg0MDU5RjI2RCwgMHg3QzJFRUQ1MyAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjJbNl0gPSB7LyogZm9yIHggaW4gWzIuODU3MCwyXT0xL1swLjM0OTksMC41XSAqLworICAxLjA3NzEwODMwMTA2ODczNzQzMDgyZS0wNywgLyogMHgzRTdDRTlENCwgMHhGNjU1NDRGNCAqLworICAxLjE3MTc2MjE5NDYyNjgzMzQ4MDk0ZS0wMSwgLyogMHgzRkJERkY0MiwgMHhCRTc2MEQ4MyAqLworICAyLjM2ODUxNDk2NjY3NjA4Nzg1MTc0ZSswMCwgLyogMHg0MDAyRjJCNywgMHhGOThGQUVDMCAqLworICAxLjIyNDI2MTA5MTQ4MjYxMjMyOTE3ZSswMSwgLyogMHg0MDI4N0MzNywgMHg3RjcxQTk2NCAqLworICAxLjc2OTM5NzExMjcxNjg3NzI3MzkwZSswMSwgLyogMHg0MDMxQjFBOCwgMHgxNzdGOEVFMiAqLworICA1LjA3MzUyMzEyNTg4ODE4NDk5MjUwZSswMCwgLyogMHg0MDE0NEI0OSwgMHhBNTc0QzFGRSAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHMyWzVdID0geworICAyLjE0MzY0ODU5MzYzODIxNDA5NDg4ZSswMSwgLyogMHg0MDM1NkZCRCwgMHg4QUQ1RUNEQyAqLworICAxLjI1MjkwMjI3MTY4NDAyNzUxMDkwZSswMiwgLyogMHg0MDVGNTI5MywgMHgxNEY5MkNENSAqLworICAyLjMyMjc2NDY5MDU3MTYyODEzNjY5ZSswMiwgLyogMHg0MDZEMDhEOCwgMHhENUEyREJEOSAqLworICAxLjE3Njc5MzczMjg3MTQ3MTAwNzY4ZSswMiwgLyogMHg0MDVENkI3QSwgMHhEQTE4ODRBOSAqLworICA4LjM2NDYzODkzMzcxNjE4MjgzMzY4ZSswMCwgLyogMHg0MDIwQkFCMSwgMHhGNDRFNTE5MiAqLworfTsKKworCXN0YXRpYyBkb3VibGUgcG9uZShkb3VibGUgeCkKK3sKKwljb25zdCBkb3VibGUgKnAsKnE7CisJZG91YmxlIHoscixzOworICAgICAgICBpbnQzMl90IGl4OworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKyAgICAgICAgaWYoaXg+PTB4NDAyMDAwMDApICAgICB7cCA9IHByODsgcT0gcHM4O30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MDEyMkU4Qil7cCA9IHByNTsgcT0gcHM1O30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MDA2REI2RCl7cCA9IHByMzsgcT0gcHMzO30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHByMjsgcT0gcHMyO30KKyAgICAgICAgeiA9IG9uZS8oeCp4KTsKKyAgICAgICAgciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworICAgICAgICBzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reipxWzRdKSkpKTsKKyAgICAgICAgcmV0dXJuIG9uZSsgci9zOworfQorCQkKKworLyogRm9yIHggPj0gOCwgdGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBxb25lIGlzCisgKgkzLzggcyAtIDEwNS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHBvbmUgYnkKKyAqIAlxb25lKHgpID0gcyooMC4zNzUgKyAoUi9TKSkKKyAqIHdoZXJlICBSID0gcXIxKnNeMiArIHFyMipzXjQgKyAuLi4gKyBxcjUqc14xMAorICogCSAgUyA9IDEgKyBxczEqc14yICsgLi4uICsgcXM2KnNeMTIKKyAqIGFuZAorICoJfCBxb25lKHgpL3MgLTAuMzc1LVIvUyB8IDw9IDIgICoqICggLTYxLjEzKQorICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgcXI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworIC0xLjAyNTM5MDYyNDk5OTkyNzE0MTYxZS0wMSwgLyogMHhCRkJBM0ZGRiwgMHhGRkZGRkRGMyAqLworIC0xLjYyNzE3NTM0NTQ0NTg5OTg3ODg4ZSswMSwgLyogMHhDMDMwNDU5MSwgMHhBMjY3NzlGNyAqLworIC03LjU5NjAxNzIyNTEzOTUwMTA3ODk2ZSswMiwgLyogMHhDMDg3QkNEMCwgMHg1M0U0QjU3NiAqLworIC0xLjE4NDk4MDY2NzAyNDI5NTg3MTY3ZSswNCwgLyogMHhDMEM3MjRFNywgMHg0MEY4NzQxNSAqLworIC00Ljg0Mzg1MTI0Mjg1NzUwMzUzMDEwZSswNCwgLyogMHhDMEU3QTZEMCwgMHg2NUQwOUM2QSAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcXM4WzZdID0geworICAxLjYxMzk1MzY5NzAwNzIyOTA5NTU2ZSswMiwgLyogMHg0MDY0MkNBNiwgMHhERTVCQ0RFNSAqLworICA3LjgyNTM4NTk5OTIzMzQ4NDY1MzgxZSswMywgLyogMHg0MEJFOTE2MiwgMHhEMEQ4ODQxOSAqLworICAxLjMzODc1MzM2Mjg3MjQ5NTc4MTYzZSswNSwgLyogMHg0MTAwNTc5QSwgMHhCMEI3NUU5OCAqLworICA3LjE5NjU3NzIzNjgzMjQwOTM5ODYzZSswNSwgLyogMHg0MTI1RjY1MywgMHg3Mjg2OUMxOSAqLworICA2LjY2NjAxMjMyNjE3Nzc2Mzc1MjY0ZSswNSwgLyogMHg0MTI0NTdEMiwgMHg3NzE5QUQ1QyAqLworIC0yLjk0NDkwMjY0MzAzODM0NjQzMjE1ZSswNSwgLyogMHhDMTExRjk2OSwgMHgwRUE1QUExOCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAtMi4wODk3OTkzMTE0MTc2NDEwNDI5N2UtMTEsIC8qIDB4QkRCNkZBNDMsIDB4MUFBMUEwOTggKi8KKyAtMS4wMjUzOTA1MDI0MTM3NTQyNjIzMWUtMDEsIC8qIDB4QkZCQTNGRkYsIDB4Q0I1OTdGRUYgKi8KKyAtOC4wNTY0NDgyODEyMzkzNjAyOTg0MGUrMDAsIC8qIDB4QzAyMDFDRTYsIDB4Q0EwM0FENEIgKi8KKyAtMS44MzY2OTYwNzQ3NDg4ODM4MDIzOWUrMDIsIC8qIDB4QzA2NkY1NkQsIDB4NkNBN0I5QjAgKi8KKyAtMS4zNzMxOTM3NjA2NTUwODE2MzI2NWUrMDMsIC8qIDB4QzA5NTc0QzYsIDB4NjkzMTczNEYgKi8KKyAtMi42MTI0NDQ0MDQ1MzIxNTY1NjgxN2UrMDMsIC8qIDB4QzBBNDY4RTMsIDB4ODhGREE3OUQgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFzNVs2XSA9IHsKKyAgOC4xMjc2NTUwMTM4NDMzNTc3Nzg1N2UrMDEsIC8qIDB4NDA1NDUxQjIsIDB4RkY1QTExQjIgKi8KKyAgMS45OTE3OTg3MzQ2MDQ4NTk2NDY0MmUrMDMsIC8qIDB4NDA5RjFGMzEsIDB4RTc3QkY4MzkgKi8KKyAgMS43NDY4NDg1MTkyNDkwODkwNzY3N2UrMDQsIC8qIDB4NDBEMTBGMUYsIDB4MEQ2NENFMjkgKi8KKyAgNC45ODUxNDI3MDkxMDM1MjI3OTMxNmUrMDQsIC8qIDB4NDBFODU3NkQsIDB4QUFCQUQxOTcgKi8KKyAgMi43OTQ4MDc1MTYzODkxODExODI2MGUrMDQsIC8qIDB4NDBEQjRCMDQsIDB4Q0Y3QzM2NEIgKi8KKyAtNC43MTkxODM1NDc5NTEyODQ3MDg2OWUrMDMsIC8qIDB4QzBCMjZGMkUsIDB4RkNGRkEwMDQgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcXIzWzZdID0geworIC01LjA3ODMxMjI2NDYxNzY2NTYxMzY5ZS0wOSwgLyogMHhCRTM1Q0ZBOSwgMHhEMzhGQzg0RiAqLworIC0xLjAyNTM3ODI5ODIwODM3MDg5NzQ1ZS0wMSwgLyogMHhCRkJBM0ZFQiwgMHg1MUFFRUQ1NCAqLworIC00LjYxMDExNTgxMTM5NDczNDAzMTEzZSswMCwgLyogMHhDMDEyNzBDMiwgMHgzMzAyRDlGRiAqLworIC01Ljc4NDcyMjE2NTYyNzgzNjQzMjEyZSswMSwgLyogMHhDMDRDRUM3MSwgMHhDMjVEMTZEQSAqLworIC0yLjI4MjQ0NTQwNzM3NjMxNjk1MDM4ZSswMiwgLyogMHhDMDZDODdEMywgMHg0NzE4RDU1RiAqLworIC0yLjE5MjEwMTI4NDc4OTA5MzI1NjIyZSswMiwgLyogMHhDMDZCNjZCOSwgMHg1RjVDMUJGNiAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcXMzWzZdID0geworICA0Ljc2NjUxNTUwMzIzNzI5NTA5MjczZSswMSwgLyogMHg0MDQ3RDUyMywgMHhDQ0QzNjdFNCAqLworICA2LjczODY1MTEyNjc2Njk5NzA5NDgyZSswMiwgLyogMHg0MDg1MEVFQiwgMHhDMDMxRUUzRSAqLworICAzLjM4MDE1Mjg2Njc5NTI2MzQzNTA1ZSswMywgLyogMHg0MEFBNjg0RSwgMHg0NDhFN0M5QSAqLworICA1LjU0NzcyOTA5NzIwNzIyNzgyMzY3ZSswMywgLyogMHg0MEI1QUJCQSwgMHhBNjFENTRBNiAqLworICAxLjkwMzExOTE5MzM4ODEwNzk4NzYzZSswMywgLyogMHg0MDlEQkM3QSwgMHgwREQ0REY0QiAqLworIC0xLjM1MjAxMTkxNDQ0MzA3MzQwODE3ZSswMiwgLyogMHhDMDYwRTY3MCwgMHgyOTBBMzExRiAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjJbNl0gPSB7LyogZm9yIHggaW4gWzIuODU3MCwyXT0xL1swLjM0OTksMC41XSAqLworIC0xLjc4MzgxNzI3NTEwOTU4ODY1NTcyZS0wNywgLyogMHhCRTg3RjEyNiwgMHg0NEM2MjZEMiAqLworIC0xLjAyNTE3MDQyNjA3OTg1NTUzNDYwZS0wMSwgLyogMHhCRkJBM0U4RSwgMHg5MTQ4QjAxMCAqLworIC0yLjc1MjIwNTY4Mjc4MTg3NDYwNzIwZSswMCwgLyogMHhDMDA2MDQ4NCwgMHg2OUJCNEVEQSAqLworIC0xLjk2NjM2MTYyNjQzNzAzNzIwMjIxZSswMSwgLyogMHhDMDMzQTlFMiwgMHhDMTY4OTA3RiAqLworIC00LjIzMjUzMTMzMzcyODMwNDkwMDg5ZSswMSwgLyogMHhDMDQ1MjlBMywgMHhERTEwNEFBQSAqLworIC0yLjEzNzE5MjExNzAzNzA0MDYxNzMzZSswMSwgLyogMHhDMDM1NUYzNiwgMHgzOUNGNkU1MiAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcXMyWzZdID0geworICAyLjk1MzMzNjI5MDYwNTIzODU0NTQ4ZSswMSwgLyogMHg0MDNEODg4QSwgMHg3OEFFNjRGRiAqLworICAyLjUyOTgxNTQ5OTgyMTkwNTI5MTM2ZSswMiwgLyogMHg0MDZGOUY2OCwgMHhEQjgyMUNCQSAqLworICA3LjU3NTAyODM0ODY4NjQ1NDM2NDcyZSswMiwgLyogMHg0MDg3QUMwNSwgMHhDRTQ5QTBGNyAqLworICA3LjM5MzkzMjA1MzIwNDY3MjQ1NjU2ZSswMiwgLyogMHg0MDg3MUIyNSwgMHg0OEQ0QzAyOSAqLworICAxLjU1OTQ5MDAzMzM2NjY2MTIzNjg3ZSswMiwgLyogMHg0MDYzN0U1RSwgMHgzQzNFRDhENCAqLworIC00Ljk1OTQ5ODk4ODIyNjI4MjEwMTI3ZSswMCwgLyogMHhDMDEzRDY4NiwgMHhFNzFCRTg2QiAqLworfTsKKworCXN0YXRpYyBkb3VibGUgcW9uZShkb3VibGUgeCkKK3sKKwljb25zdCBkb3VibGUgKnAsKnE7CisJZG91YmxlICBzLHIsejsKKwlpbnQzMl90IGl4OworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcXI4OyBxPSBxczg7fQorCWVsc2UgaWYoaXg+PTB4NDAxMjJFOEIpe3AgPSBxcjU7IHE9IHFzNTt9CisJZWxzZSBpZihpeD49MHg0MDA2REI2RCl7cCA9IHFyMzsgcT0gcXMzO30KKwllbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcXIyOyBxPSBxczI7fQorCXogPSBvbmUvKHgqeCk7CisJciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworCXMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KihxWzRdK3oqcVs1XSkpKSkpOworCXJldHVybiAoLjM3NSArIHIvcykveDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfajFmLmMgYi9saWJtL3NyYy9lX2oxZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTM5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2oxZi5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBlX2oxZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9qMS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9qMWYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGZsb2F0IHBvbmVmKGZsb2F0KSwgcW9uZWYoZmxvYXQpOworCitzdGF0aWMgY29uc3QgZmxvYXQKK2h1Z2UgICAgPSAxZTMwLAorb25lCT0gMS4wLAoraW52c3FydHBpPSAgNS42NDE4OTYxMjg3ZS0wMSwgLyogMHgzZjEwNmViYiAqLwordHBpICAgICAgPSAgNi4zNjYxOTc0NjY5ZS0wMSwgLyogMHgzZjIyZjk4MyAqLworCS8qIFIwL1MwIG9uIFswLDJdICovCityMDAgID0gLTYuMjUwMDAwMDAwMGUtMDIsIC8qIDB4YmQ4MDAwMDAgKi8KK3IwMSAgPSAgMS40MDcwNTY2OTc2ZS0wMywgLyogMHgzYWI4NmNmZCAqLworcjAyICA9IC0xLjU5OTU1NjM0NDRlLTA1LCAvKiAweGI3ODYyZTM2ICovCityMDMgID0gIDQuOTY3Mjc5OTIwN2UtMDgsIC8qIDB4MzM1NTU3ZDIgKi8KK3MwMSAgPSAgMS45MTUzNzYwNzQ2ZS0wMiwgLyogMHgzYzljZTg1OSAqLworczAyICA9ICAxLjg1OTQ2Nzg4NDFlLTA0LCAvKiAweDM5NDJmYWI2ICovCitzMDMgID0gIDEuMTc3MTg0Njg1N2UtMDYsIC8qIDB4MzU5ZGZmYzIgKi8KK3MwNCAgPSAgNS4wNDYzNjI0MzkwZS0wOSwgLyogMHgzMWFkNjQ0NiAqLworczA1ICA9ICAxLjIzNTQyMjcwMTZlLTExOyAvKiAweDJkNTk1NjdlICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICAgID0gMC4wOworCitmbG9hdAorX19pZWVlNzU0X2oxZihmbG9hdCB4KQoreworCWZsb2F0IHosIHMsYyxzcyxjYyxyLHUsdix5OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiBvbmUveDsKKwl5ID0gZmFic2YoeCk7CisJaWYoaXggPj0gMHg0MDAwMDAwMCkgewkvKiB8eHwgPj0gMi4wICovCisJCXMgPSBzaW5mKHkpOworCQljID0gY29zZih5KTsKKwkJc3MgPSAtcy1jOworCQljYyA9IHMtYzsKKwkJaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHkreSBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSBjb3NmKHkreSk7CisJCSAgICBpZiAoKHMqYyk+emVybykgY2MgPSB6L3NzOworCQkgICAgZWxzZSAJICAgIHNzID0gei9jYzsKKwkJfQorCS8qCisJICogajEoeCkgPSAxL3NxcnQocGkpICogKFAoMSx4KSpjYyAtIFEoMSx4KSpzcykgLyBzcXJ0KHgpCisJICogeTEoeCkgPSAxL3NxcnQocGkpICogKFAoMSx4KSpzcyArIFEoMSx4KSpjYykgLyBzcXJ0KHgpCisJICovCisJCWlmKGl4PjB4ODAwMDAwMDApIHogPSAoaW52c3FydHBpKmNjKS9zcXJ0Zih5KTsKKwkJZWxzZSB7CisJCSAgICB1ID0gcG9uZWYoeSk7IHYgPSBxb25lZih5KTsKKwkJICAgIHogPSBpbnZzcXJ0cGkqKHUqY2Mtdipzcykvc3FydGYoeSk7CisJCX0KKwkJaWYoaHg8MCkgcmV0dXJuIC16OworCQllbHNlICAJIHJldHVybiAgejsKKwl9CisJaWYoaXg8MHgzMjAwMDAwMCkgewkvKiB8eHw8MioqLTI3ICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHJldHVybiAoZmxvYXQpMC41Kng7LyogaW5leGFjdCBpZiB4IT0wIG5lY2Vzc2FyeSAqLworCX0KKwl6ID0geCp4OworCXIgPSAgeioocjAwK3oqKHIwMSt6KihyMDIreipyMDMpKSk7CisJcyA9ICBvbmUreiooczAxK3oqKHMwMit6KihzMDMreiooczA0K3oqczA1KSkpKTsKKwlyICo9IHg7CisJcmV0dXJuKHgqKGZsb2F0KTAuNStyL3MpOworfQorCitzdGF0aWMgY29uc3QgZmxvYXQgVTBbNV0gPSB7CisgLTEuOTYwNTcwOTYxMmUtMDEsIC8qIDB4YmU0OGMzMzEgKi8KKyAgNS4wNDQzODcyODA5ZS0wMiwgLyogMHgzZDRlOWUzYyAqLworIC0xLjkxMjU2ODkyODdlLTAzLCAvKiAweGJhZmFhZjJhICovCisgIDIuMzUyNTI1OTE2NmUtMDUsIC8qIDB4MzdjNTU4MWMgKi8KKyAtOS4xOTA5OTE3ODk5ZS0wOCwgLyogMHhiM2M1NjAwMyAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBWMFs1XSA9IHsKKyAgMS45OTE2NzMxODY0ZS0wMiwgLyogMHgzY2EzMjg2YSAqLworICAyLjAyNTUyNTc1NTBlLTA0LCAvKiAweDM5NTQ2NDRiICovCisgIDEuMzU2MDg3OTc3OWUtMDYsIC8qIDB4MzViNjAyZDQgKi8KKyAgNi4yMjc0MTQ1ODQwZS0wOSwgLyogMHgzMWQ1ZjhlYiAqLworICAxLjY2NTU5MjQ5MDNlLTExLCAvKiAweDJkOTI4MWNmICovCit9OworCitmbG9hdAorX19pZWVlNzU0X3kxZihmbG9hdCB4KQoreworCWZsb2F0IHosIHMsYyxzcyxjYyx1LHY7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWTEoTmFOKSBpcyBOYU4sIFkxKC1pbmYpIGlzIE5hTiwgWTEoaW5mKSBpcyAwICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiAgb25lLyh4K3gqeCk7CisgICAgICAgIGlmKGl4PT0wKSByZXR1cm4gLW9uZS96ZXJvOworICAgICAgICBpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworICAgICAgICBpZihpeCA+PSAweDQwMDAwMDAwKSB7ICAvKiB8eHwgPj0gMi4wICovCisgICAgICAgICAgICAgICAgcyA9IHNpbmYoeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvc2YoeCk7CisgICAgICAgICAgICAgICAgc3MgPSAtcy1jOworICAgICAgICAgICAgICAgIGNjID0gcy1jOworICAgICAgICAgICAgICAgIGlmKGl4PDB4N2YwMDAwMDApIHsgIC8qIG1ha2Ugc3VyZSB4K3ggbm90IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIHogPSBjb3NmKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAvKiB5MSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpzaW4oeDApK3ExKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC0zcGkvNAorICAgICAgICAgKiAgICAgIEJldHRlciBmb3JtdWxhOgorICAgICAgICAgKiAgICAgICAgICAgICAgY29zKHgwKSA9IGNvcyh4KWNvcygzcGkvNCkrc2luKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IC0xL3NxcnQoMikgKiAoY29zKHgpICsgc2luKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0Zih4KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHBvbmVmKHgpOyB2ID0gcW9uZWYoeCk7CisgICAgICAgICAgICAgICAgICAgIHogPSBpbnZzcXJ0cGkqKHUqc3MrdipjYykvc3FydGYoeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICB9CisgICAgICAgIGlmKGl4PD0weDI0ODAwMDAwKSB7ICAgIC8qIHggPCAyKiotNTQgKi8KKyAgICAgICAgICAgIHJldHVybigtdHBpL3gpOworICAgICAgICB9CisgICAgICAgIHogPSB4Kng7CisgICAgICAgIHUgPSBVMFswXSt6KihVMFsxXSt6KihVMFsyXSt6KihVMFszXSt6KlUwWzRdKSkpOworICAgICAgICB2ID0gb25lK3oqKFYwWzBdK3oqKFYwWzFdK3oqKFYwWzJdK3oqKFYwWzNdK3oqVjBbNF0pKSkpOworICAgICAgICByZXR1cm4oeCoodS92KSArIHRwaSooX19pZWVlNzU0X2oxZih4KSpfX2llZWU3NTRfbG9nZih4KS1vbmUveCkpOworfQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHBvbmUgaXMKKyAqCTEgKyAxNS8xMjggc14yIC0gNDcyNS8yXjE1IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHBvbmUgYnkKKyAqIAlwb25lKHgpID0gMSArIChSL1MpCisgKiB3aGVyZSAgUiA9IHByMCArIHByMSpzXjIgKyBwcjIqc140ICsgLi4uICsgcHI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcHMwKnNeMiArIC4uLiArIHBzNCpzXjEwCisgKiBhbmQKKyAqCXwgcG9uZSh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjA2KQorICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBwcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAgKi8KKyAgMS4xNzE4NzUwMDAwZS0wMSwgLyogMHgzZGYwMDAwMCAqLworICAxLjMyMzk0ODA5NzJlKzAxLCAvKiAweDQxNTNkNGVhICovCisgIDQuMTIwNTE4NDkzN2UrMDIsIC8qIDB4NDNjZTA2YTMgKi8KKyAgMy44NzQ3NDUzNjEzZSswMywgLyogMHg0NTcyMmJlZCAqLworICA3LjkxNDQ3OTQ5MjJlKzAzLCAvKiAweDQ1Zjc1M2Q2ICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBzOFs1XSA9IHsKKyAgMS4xNDIwNzM2Njk0ZSswMiwgLyogMHg0MmU0NmEyYyAqLworICAzLjY1MDkzMDkwODJlKzAzLCAvKiAweDQ1NjQyZWU1ICovCisgIDMuNjk1NjIwNzAzMWUrMDQsIC8qIDB4NDcxMDVjMzUgKi8KKyAgOS43NjAyNzk2ODc1ZSswNCwgLyogMHg0N2JlYTE2NiAqLworICAzLjA4MDQyNzE0ODRlKzA0LCAvKiAweDQ2ZjBhODhiICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcHI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgIDEuMzE5OTA1MjA5NGUtMTEsIC8qIDB4MmQ2ODMzM2YgKi8KKyAgMS4xNzE4NzQ5MjU1ZS0wMSwgLyogMHgzZGVmZmZmZiAqLworICA2LjgwMjc1MTA2NDNlKzAwLCAvKiAweDQwZDliMDIzICovCisgIDEuMDgzMDgxODE3NmUrMDIsIC8qIDB4NDJkODlkY2EgKi8KKyAgNS4xNzYzNjE2OTQzZSswMiwgLyogMHg0NDAxNjhiNyAqLworICA1LjI4NzE1MjA5OTZlKzAyLCAvKiAweDQ0MDQyZGM2ICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBzNVs1XSA9IHsKKyAgNS45MjgwNTk3Njg3ZSswMSwgLyogMHg0MjZkMWY1NSAqLworICA5LjkxNDAxNDI4MjJlKzAyLCAvKiAweDQ0NzdkOWIxICovCisgIDUuMzUzMjY3MDg5OGUrMDMsIC8qIDB4NDVhNzRhMjMgKi8KKyAgNy44NDQ2OTA0Mjk3ZSswMywgLyogMHg0NWY1MjU4NiAqLworICAxLjUwNDA0Njg3NTBlKzAzLCAvKiAweDQ0YmMwMTgwICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcHIzWzZdID0geworICAzLjAyNTAzOTEwODFlLTA5LCAvKiAweDMxNGZlMTBkICovCisgIDEuMTcxODY4NjY3MGUtMDEsIC8qIDB4M2RlZmZmYWIgKi8KKyAgMy45MzI5Nzc0MzgwZSswMCwgLyogMHg0MDdiYjVlNyAqLworICAzLjUxMTk0MDM4MzllKzAxLCAvKiAweDQyMGM3YTQ1ICovCisgIDkuMTA1NTAwNzkzNWUrMDEsIC8qIDB4NDJiNjFjMmEgKi8KKyAgNC44NTU5MDY2NzcyZSswMSwgLyogMHg0MjQyM2M3YyAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwczNbNV0gPSB7CisgIDMuNDc5MTMwOTM1N2UrMDEsIC8qIDB4NDIwYjJhNGQgKi8KKyAgMy4zNjc2MjQ1MTE3ZSswMiwgLyogMHg0M2E4NjE5OCAqLworICAxLjA0Njg3MTQ2MDBlKzAzLCAvKiAweDQ0ODJkYmUzICovCisgIDguOTA4MTEzNDAzM2UrMDIsIC8qIDB4NDQ1ZWIzZWQgKi8KKyAgMS4wMzc4NzkzMzM1ZSswMiwgLyogMHg0MmNmOTM2YyAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHByMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgIDEuMDc3MTA4MzIyNWUtMDcsIC8qIDB4MzNlNzRlYTggKi8KKyAgMS4xNzE3NjIxOTgyZS0wMSwgLyogMHgzZGVmZmExNiAqLworICAyLjM2ODUxNTAxNDZlKzAwLCAvKiAweDQwMTc5NWMwICovCisgIDEuMjI0MjYxMDkzMWUrMDEsIC8qIDB4NDE0M2UxYmMgKi8KKyAgMS43NjkzOTcxNjM0ZSswMSwgLyogMHg0MThkOGQ0MSAqLworICA1LjA3MzUyMzA0NDZlKzAwLCAvKiAweDQwYTI1YTRkICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBzMls1XSA9IHsKKyAgMi4xNDM2NDg1MjkxZSswMSwgLyogMHg0MWFiN2RlYyAqLworICAxLjI1MjkwMjI5ODBlKzAyLCAvKiAweDQyZmE5NDk5ICovCisgIDIuMzIyNzY0NzQwMGUrMDIsIC8qIDB4NDM2ODQ2YzcgKi8KKyAgMS4xNzY3OTM3NDY5ZSswMiwgLyogMHg0MmViNWJkNyAqLworICA4LjM2NDYzOTI4MjJlKzAwLCAvKiAweDQxMDVkNTkwICovCit9OworCisJc3RhdGljIGZsb2F0IHBvbmVmKGZsb2F0IHgpCit7CisJY29uc3QgZmxvYXQgKnAsKnE7CisJZmxvYXQgeixyLHM7CisgICAgICAgIGludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKyAgICAgICAgaWYoaXg+PTB4NDEwMDAwMDApICAgICB7cCA9IHByODsgcT0gcHM4O30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHByNTsgcT0gcHM1O30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MDM2ZGI2OCl7cCA9IHByMzsgcT0gcHMzO30KKyAgICAgICAgZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHByMjsgcT0gcHMyO30KKyAgICAgICAgeiA9IG9uZS8oeCp4KTsKKyAgICAgICAgciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworICAgICAgICBzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reipxWzRdKSkpKTsKKyAgICAgICAgcmV0dXJuIG9uZSsgci9zOworfQorCisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcW9uZSBpcworICoJMy84IHMgLSAxMDUvMTAyNCBzXjMgLSAuLi4sIHdoZXJlIHMgPSAxL3guCisgKiBXZSBhcHByb3hpbWF0ZSBwb25lIGJ5CisgKiAJcW9uZSh4KSA9IHMqKDAuMzc1ICsgKFIvUykpCisgKiB3aGVyZSAgUiA9IHFyMSpzXjIgKyBxcjIqc140ICsgLi4uICsgcXI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcXMxKnNeMiArIC4uLiArIHFzNipzXjEyCisgKiBhbmQKKyAqCXwgcW9uZSh4KS9zIC0wLjM3NS1SL1MgfCA8PSAyICAqKiAoIC02MS4xMykKKyAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgcXI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwICovCisgLTEuMDI1MzkwNjI1MGUtMDEsIC8qIDB4YmRkMjAwMDAgKi8KKyAtMS42MjcxNzUzMzExZSswMSwgLyogMHhjMTgyMmM4ZCAqLworIC03LjU5NjAxNzQ1NjFlKzAyLCAvKiAweGM0M2RlNjgzICovCisgLTEuMTg0OTgwNjY0MWUrMDQsIC8qIDB4YzYzOTI3M2EgKi8KKyAtNC44NDM4NTExNzE5ZSswNCwgLyogMHhjNzNkMzY4MyAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxczhbNl0gPSB7CisgIDEuNjEzOTUzNzA0OGUrMDIsIC8qIDB4NDMyMTY1MzcgKi8KKyAgNy44MjUzODYyMzA1ZSswMywgLyogMHg0NWY0OGIxNyAqLworICAxLjMzODc1MzQzNzVlKzA1LCAvKiAweDQ4MDJiY2Q2ICovCisgIDcuMTk2NTc3NTAwMGUrMDUsIC8qIDB4NDkyZmIyOWMgKi8KKyAgNi42NjYwMTI1MDAwZSswNSwgLyogMHg0OTIyYmU5NCAqLworIC0yLjk0NDkwMjUwMDBlKzA1LCAvKiAweGM4OGZjYjQ4ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcXI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgLTIuMDg5Nzk5MzQwNWUtMTEsIC8qIDB4YWRiN2QyMTkgKi8KKyAtMS4wMjUzOTA0NzYwZS0wMSwgLyogMHhiZGQxZmZmZSAqLworIC04LjA1NjQ0Nzk4MjhlKzAwLCAvKiAweGMxMDBlNzM2ICovCisgLTEuODM2Njk2MDE0NGUrMDIsIC8qIDB4YzMzN2FiNmIgKi8KKyAtMS4zNzMxOTM3MjU2ZSswMywgLyogMHhjNGFiYTYzMyAqLworIC0yLjYxMjQ0NDMzNTllKzAzLCAvKiAweGM1MjM0NzFjICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzNVs2XSA9IHsKKyAgOC4xMjc2NTUwMjkzZSswMSwgLyogMHg0MmEyOGQ5OCAqLworICAxLjk5MTc5ODcwNjFlKzAzLCAvKiAweDQ0ZjhmOThmICovCisgIDEuNzQ2ODQ4NDM3NWUrMDQsIC8qIDB4NDY4ODc4ZjggKi8KKyAgNC45ODUxNDI1NzgxZSswNCwgLyogMHg0NzQyYmI2ZCAqLworICAyLjc5NDgwNzQyMTllKzA0LCAvKiAweDQ2ZGE1ODI2ICovCisgLTQuNzE5MTgzNTkzOGUrMDMsIC8qIDB4YzU5Mzc5NzggKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjNbNl0gPSB7CisgLTUuMDc4MzEyNDM3MmUtMDksIC8qIDB4YjFhZTdkNGYgKi8KKyAtMS4wMjUzNzgzMzE1ZS0wMSwgLyogMHhiZGQxZmY1YiAqLworIC00LjYxMDExNjAwNDllKzAwLCAvKiAweGMwOTM4NjEyICovCisgLTUuNzg0NzIyMTM3NWUrMDEsIC8qIDB4YzI2NzYzOGUgKi8KKyAtMi4yODI0NDUzNzM1ZSswMiwgLyogMHhjMzY0M2U5YSAqLworIC0yLjE5MjEwMTI4NzhlKzAyLCAvKiAweGMzNWIzNWNiICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzM1s2XSA9IHsKKyAgNC43NjY1MTUzNTAzZSswMSwgLyogMHg0MjNlYTkxZSAqLworICA2LjczODY1MTEyMzBlKzAyLCAvKiAweDQ0Mjg3NzVlICovCisgIDMuMzgwMTUyODMyMGUrMDMsIC8qIDB4NDU1MzQyNzIgKi8KKyAgNS41NDc3MjkwMDM5ZSswMywgLyogMHg0NWFkNWRkNSAqLworICAxLjkwMzExOTE0MDZlKzAzLCAvKiAweDQ0ZWRlM2QwICovCisgLTEuMzUyMDExODcxM2UrMDIsIC8qIDB4YzMwNzMzODEgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjJbNl0gPSB7LyogZm9yIHggaW4gWzIuODU3MCwyXT0xL1swLjM0OTksMC41XSAqLworIC0xLjc4MzgxNzI1MzllLTA3LCAvKiAweGI0M2Y4OTMyICovCisgLTEuMDI1MTcwNDYwM2UtMDEsIC8qIDB4YmRkMWY0NzUgKi8KKyAtMi43NTIyMDU2MTAzZSswMCwgLyogMHhjMDMwMjQyMyAqLworIC0xLjk2NjM2MTYxODBlKzAxLCAvKiAweGMxOWQ0ZjE2ICovCisgLTQuMjMyNTMxMzU2OGUrMDEsIC8qIDB4YzIyOTRkMWYgKi8KKyAtMi4xMzcxOTIxNTM5ZSswMSwgLyogMHhjMWFhZjliMiAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxczJbNl0gPSB7CisgIDIuOTUzMzM2MzM0MmUrMDEsIC8qIDB4NDFlYzQ0NTQgKi8KKyAgMi41Mjk4MTU1MjEyZSswMiwgLyogMHg0MzdjZmI0NyAqLworICA3LjU3NTAyODA3NjJlKzAyLCAvKiAweDQ0M2Q2MDJlICovCisgIDcuMzkzOTMxODg0OGUrMDIsIC8qIDB4NDQzOGQ5MmEgKi8KKyAgMS41NTk0OTAwNTEzZSswMiwgLyogMHg0MzFiZjJmMiAqLworIC00Ljk1OTQ5ODg4MjNlKzAwLCAvKiAweGMwOWViNDM3ICovCit9OworCisJc3RhdGljIGZsb2F0IHFvbmVmKGZsb2F0IHgpCit7CisJY29uc3QgZmxvYXQgKnAsKnE7CisJZmxvYXQgIHMscix6OworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcXI4OyBxPSBxczg7fQorCWVsc2UgaWYoaXg+PTB4NDBmNzFjNTgpe3AgPSBxcjU7IHE9IHFzNTt9CisJZWxzZSBpZihpeD49MHg0MDM2ZGI2OCl7cCA9IHFyMzsgcT0gcXMzO30KKwllbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcXIyOyBxPSBxczI7fQorCXogPSBvbmUvKHgqeCk7CisJciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworCXMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KihxWzRdK3oqcVs1XSkpKSkpOworCXJldHVybiAoKGZsb2F0KS4zNzUgKyByL3MpL3g7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2puLmMgYi9saWJtL3NyYy9lX2puLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzYjIyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfam4uYwpAQCAtMCwwICsxLDI2NiBAQAorCisvKiBAKCMpZV9qbi5jIDEuNCA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2puLmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBfX2llZWU3NTRfam4obiwgeCksIF9faWVlZTc1NF95bihuLCB4KQorICogZmxvYXRpbmcgcG9pbnQgQmVzc2VsJ3MgZnVuY3Rpb24gb2YgdGhlIDFzdCBhbmQgMm5kIGtpbmQKKyAqIG9mIG9yZGVyIG4KKyAqICAgICAgICAgIAorICogU3BlY2lhbCBjYXNlczoKKyAqCXkwKDApPXkxKDApPXluKG4sMCkgPSAtaW5mIHdpdGggZGl2aXNpb24gYnkgemVybyBzaWduYWw7CisgKgl5MCgtdmUpPXkxKC12ZSk9eW4obiwtdmUpIGFyZSBOYU4gd2l0aCBpbnZhbGlkIHNpZ25hbC4KKyAqIE5vdGUgMi4gQWJvdXQgam4obix4KSwgeW4obix4KQorICoJRm9yIG49MCwgajAoeCkgaXMgY2FsbGVkLAorICoJZm9yIG49MSwgajEoeCkgaXMgY2FsbGVkLAorICoJZm9yIG48eCwgZm9yd2FyZCByZWN1cnNpb24gdXMgdXNlZCBzdGFydGluZworICoJZnJvbSB2YWx1ZXMgb2YgajAoeCkgYW5kIGoxKHgpLgorICoJZm9yIG4+eCwgYSBjb250aW51ZWQgZnJhY3Rpb24gYXBwcm94aW1hdGlvbiB0bworICoJaihuLHgpL2oobi0xLHgpIGlzIGV2YWx1YXRlZCBhbmQgdGhlbiBiYWNrd2FyZAorICoJcmVjdXJzaW9uIGlzIHVzZWQgc3RhcnRpbmcgZnJvbSBhIHN1cHBvc2VkIHZhbHVlCisgKglmb3IgaihuLHgpLiBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIGooMCx4KSBpcworICoJY29tcGFyZWQgd2l0aCB0aGUgYWN0dWFsIHZhbHVlIHRvIGNvcnJlY3QgdGhlCisgKglzdXBwb3NlZCB2YWx1ZSBvZiBqKG4seCkuCisgKgorICoJeW4obix4KSBpcyBzaW1pbGFyIGluIGFsbCByZXNwZWN0cywgZXhjZXB0CisgKgl0aGF0IGZvcndhcmQgcmVjdXJzaW9uIGlzIHVzZWQgZm9yIGFsbAorICoJdmFsdWVzIG9mIG4+MS4KKyAqCQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2ludnNxcnRwaT0gIDUuNjQxODk1ODM1NDc3NTYyNzkyODBlLTAxLCAvKiAweDNGRTIwREQ3LCAweDUwNDI5QjZEICovCit0d28gICA9ICAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCAqLworb25lICAgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDA7IC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvICA9ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMDsKKworZG91YmxlCitfX2llZWU3NTRfam4oaW50IG4sIGRvdWJsZSB4KQoreworCWludDMyX3QgaSxoeCxpeCxseCwgc2duOworCWRvdWJsZSBhLCBiLCB0ZW1wLCBkaTsKKwlkb3VibGUgeiwgdzsKKworICAgIC8qIEooLW4seCkgPSAoLTEpXm4gKiBKKG4sIHgpLCBKKG4sIC14KSA9ICgtMSlebiAqIEoobiwgeCkKKyAgICAgKiBUaHVzLCBKKC1uLHgpID0gSihuLC14KQorICAgICAqLworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIEoobixOYU4pIGlzIE5hTiAqLworCWlmKChpeHwoKHVfaW50MzJfdCkobHh8LWx4KSk+PjMxKT4weDdmZjAwMDAwKSByZXR1cm4geCt4OworCWlmKG48MCl7CQkKKwkJbiA9IC1uOworCQl4ID0gLXg7CisJCWh4IF49IDB4ODAwMDAwMDA7CisJfQorCWlmKG49PTApIHJldHVybihfX2llZWU3NTRfajAoeCkpOworCWlmKG49PTEpIHJldHVybihfX2llZWU3NTRfajEoeCkpOworCXNnbiA9IChuJjEpJihoeD4+MzEpOwkvKiBldmVuIG4gLS0gMCwgb2RkIG4gLS0gc2lnbih4KSAqLworCXggPSBmYWJzKHgpOworCWlmKChpeHxseCk9PTB8fGl4Pj0weDdmZjAwMDAwKSAJLyogaWYgeCBpcyAwIG9yIGluZiAqLworCSAgICBiID0gemVybzsKKwllbHNlIGlmKChkb3VibGUpbjw9eCkgeyAgIAorCQkvKiBTYWZlIHRvIHVzZSBKKG4rMSx4KT0ybi94ICpKKG4seCktSihuLTEseCkgKi8KKwkgICAgaWYoaXg+PTB4NTJEMDAwMDApIHsgLyogeCA+IDIqKjMwMiAqLworICAgIC8qICh4ID4+IG4qKjIpIAorICAgICAqCSAgICBKbih4KSA9IGNvcyh4LSgybisxKSpwaS80KSpzcXJ0KDIveCpwaSkKKyAgICAgKgkgICAgWW4oeCkgPSBzaW4oeC0oMm4rMSkqcGkvNCkqc3FydCgyL3gqcGkpCisgICAgICoJICAgIExldCBzPXNpbih4KSwgYz1jb3MoeCksIAorICAgICAqCQl4bj14LSgybisxKSpwaS80LCBzcXQyID0gc3FydCgyKSx0aGVuCisgICAgICoKKyAgICAgKgkJICAgbglzaW4oeG4pKnNxdDIJY29zKHhuKSpzcXQyCisgICAgICoJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKgkJICAgMAkgcy1jCQkgYytzCisgICAgICoJCSAgIDEJLXMtYyAJCS1jK3MKKyAgICAgKgkJICAgMgktcytjCQktYy1zCisgICAgICoJCSAgIDMJIHMrYwkJIGMtcworICAgICAqLworCQlzd2l0Y2gobiYzKSB7CisJCSAgICBjYXNlIDA6IHRlbXAgPSAgY29zKHgpK3Npbih4KTsgYnJlYWs7CisJCSAgICBjYXNlIDE6IHRlbXAgPSAtY29zKHgpK3Npbih4KTsgYnJlYWs7CisJCSAgICBjYXNlIDI6IHRlbXAgPSAtY29zKHgpLXNpbih4KTsgYnJlYWs7CisJCSAgICBjYXNlIDM6IHRlbXAgPSAgY29zKHgpLXNpbih4KTsgYnJlYWs7CisJCX0KKwkJYiA9IGludnNxcnRwaSp0ZW1wL3NxcnQoeCk7CisJICAgIH0gZWxzZSB7CQorCSAgICAgICAgYSA9IF9faWVlZTc1NF9qMCh4KTsKKwkgICAgICAgIGIgPSBfX2llZWU3NTRfajEoeCk7CisJICAgICAgICBmb3IoaT0xO2k8bjtpKyspeworCQkgICAgdGVtcCA9IGI7CisJCSAgICBiID0gYiooKGRvdWJsZSkoaStpKS94KSAtIGE7IC8qIGF2b2lkIHVuZGVyZmxvdyAqLworCQkgICAgYSA9IHRlbXA7CisJICAgICAgICB9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihpeDwweDNlMTAwMDAwKSB7CS8qIHggPCAyKiotMjkgKi8KKyAgICAvKiB4IGlzIHRpbnksIHJldHVybiB0aGUgZmlyc3QgVGF5bG9yIGV4cGFuc2lvbiBvZiBKKG4seCkgCisgICAgICogSihuLHgpID0gMS9uISooeC8yKV5uICAtIC4uLgorICAgICAqLworCQlpZihuPjMzKQkvKiB1bmRlcmZsb3cgKi8KKwkJICAgIGIgPSB6ZXJvOworCQllbHNlIHsKKwkJICAgIHRlbXAgPSB4KjAuNTsgYiA9IHRlbXA7CisJCSAgICBmb3IgKGE9b25lLGk9MjtpPD1uO2krKykgeworCQkJYSAqPSAoZG91YmxlKWk7CQkvKiBhID0gbiEgKi8KKwkJCWIgKj0gdGVtcDsJCS8qIGIgPSAoeC8yKV5uICovCisJCSAgICB9CisJCSAgICBiID0gYi9hOworCQl9CisJICAgIH0gZWxzZSB7CisJCS8qIHVzZSBiYWNrd2FyZCByZWN1cnJlbmNlICovCisJCS8qIAkJCXggICAgICB4XjIgICAgICB4XjIgICAgICAgCisJCSAqICBKKG4seCkvSihuLTEseCkgPSAgLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC4uLi4uCisJCSAqCQkJMm4gIC0gMihuKzEpIC0gMihuKzIpCisJCSAqCisJCSAqIAkJCTEgICAgICAxICAgICAgICAxICAgICAgIAorCQkgKiAgKGZvciBsYXJnZSB4KSAgID0gIC0tLS0gIC0tLS0tLSAgIC0tLS0tLSAgIC4uLi4uCisJCSAqCQkJMm4gICAyKG4rMSkgICAyKG4rMikKKwkJICoJCQktLSAtIC0tLS0tLSAtIC0tLS0tLSAtIAorCQkgKgkJCSB4ICAgICB4ICAgICAgICAgeAorCQkgKgorCQkgKiBMZXQgdyA9IDJuL3ggYW5kIGg9Mi94LCB0aGVuIHRoZSBhYm92ZSBxdW90aWVudAorCQkgKiBpcyBlcXVhbCB0byB0aGUgY29udGludWVkIGZyYWN0aW9uOgorCQkgKgkJICAgIDEKKwkJICoJPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKgkJICAgICAgIDEKKwkJICoJICAgdyAtIC0tLS0tLS0tLS0tLS0tLS0tCisJCSAqCQkJICAxCisJCSAqIAkgICAgICAgIHcraCAtIC0tLS0tLS0tLQorCQkgKgkJICAgICAgIHcrMmggLSAuLi4KKwkJICoKKwkJICogVG8gZGV0ZXJtaW5lIGhvdyBtYW55IHRlcm1zIG5lZWRlZCwgbGV0CisJCSAqIFEoMCkgPSB3LCBRKDEpID0gdyh3K2gpIC0gMSwKKwkJICogUShrKSA9ICh3K2sqaCkqUShrLTEpIC0gUShrLTIpLAorCQkgKiBXaGVuIFEoaykgPiAxZTQJZ29vZCBmb3Igc2luZ2xlIAorCQkgKiBXaGVuIFEoaykgPiAxZTkJZ29vZCBmb3IgZG91YmxlIAorCQkgKiBXaGVuIFEoaykgPiAxZTE3CWdvb2QgZm9yIHF1YWRydXBsZSAKKwkJICovCisJICAgIC8qIGRldGVybWluZSBrICovCisJCWRvdWJsZSB0LHY7CisJCWRvdWJsZSBxMCxxMSxoLHRtcDsgaW50MzJfdCBrLG07CisJCXcgID0gKG4rbikvKGRvdWJsZSl4OyBoID0gMi4wLyhkb3VibGUpeDsKKwkJcTAgPSB3OyAgeiA9IHcraDsgcTEgPSB3KnogLSAxLjA7IGs9MTsKKwkJd2hpbGUocTE8MS4wZTkpIHsKKwkJCWsgKz0gMTsgeiArPSBoOworCQkJdG1wID0geipxMSAtIHEwOworCQkJcTAgPSBxMTsKKwkJCXExID0gdG1wOworCQl9CisJCW0gPSBuK247CisJCWZvcih0PXplcm8sIGkgPSAyKihuK2spOyBpPj1tOyBpIC09IDIpIHQgPSBvbmUvKGkveC10KTsKKwkJYSA9IHQ7CisJCWIgPSBvbmU7CisJCS8qICBlc3RpbWF0ZSBsb2coKDIveClebipuISkgPSBuKmxvZygyL3gpK24qbG4obikKKwkJICogIEhlbmNlLCBpZiBuKihsb2coMm4veCkpID4gLi4uCisJCSAqICBzaW5nbGUgOC44NzIyODM5MzU1ZSswMQorCQkgKiAgZG91YmxlIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyCisJCSAqICBsb25nIGRvdWJsZSAxLjEzNTY1MjM0MDYyOTQxNDM5NDk0OTE5MzEwNzc5NzA3NjUwMDYxNzBlKzA0CisJCSAqICB0aGVuIHJlY3VycmVudCB2YWx1ZSBtYXkgb3ZlcmZsb3cgYW5kIHRoZSByZXN1bHQgaXMKKwkJICogIGxpa2VseSB1bmRlcmZsb3cgdG8gemVybworCQkgKi8KKwkJdG1wID0gbjsKKwkJdiA9IHR3by94OworCQl0bXAgPSB0bXAqX19pZWVlNzU0X2xvZyhmYWJzKHYqdG1wKSk7CisJCWlmKHRtcDw3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMikgeworCSAgICAJICAgIGZvcihpPW4tMSxkaT0oZG91YmxlKShpK2kpO2k+MDtpLS0peworCQkgICAgICAgIHRlbXAgPSBiOworCQkJYiAqPSBkaTsKKwkJCWIgID0gYi94IC0gYTsKKwkJICAgICAgICBhID0gdGVtcDsKKwkJCWRpIC09IHR3bzsKKwkgICAgIAkgICAgfQorCQl9IGVsc2UgeworCSAgICAJICAgIGZvcihpPW4tMSxkaT0oZG91YmxlKShpK2kpO2k+MDtpLS0peworCQkgICAgICAgIHRlbXAgPSBiOworCQkJYiAqPSBkaTsKKwkJCWIgID0gYi94IC0gYTsKKwkJICAgICAgICBhID0gdGVtcDsKKwkJCWRpIC09IHR3bzsKKwkJICAgIC8qIHNjYWxlIGIgdG8gYXZvaWQgc3B1cmlvdXMgb3ZlcmZsb3cgKi8KKwkJCWlmKGI+MWUxMDApIHsKKwkJCSAgICBhIC89IGI7CisJCQkgICAgdCAvPSBiOworCQkJICAgIGIgID0gb25lOworCQkJfQorCSAgICAgCSAgICB9CisJCX0KKwkgICAgCWIgPSAodCpfX2llZWU3NTRfajAoeCkvYik7CisJICAgIH0KKwl9CisJaWYoc2duPT0xKSByZXR1cm4gLWI7IGVsc2UgcmV0dXJuIGI7Cit9CisKK2RvdWJsZQorX19pZWVlNzU0X3luKGludCBuLCBkb3VibGUgeCkKK3sKKwlpbnQzMl90IGksaHgsaXgsbHg7CisJaW50MzJfdCBzaWduOworCWRvdWJsZSBhLCBiLCB0ZW1wOworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWShuLE5hTikgaXMgTmFOICovCisJaWYoKGl4fCgodV9pbnQzMl90KShseHwtbHgpKT4+MzEpPjB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJaWYoKGl4fGx4KT09MCkgcmV0dXJuIC1vbmUvemVybzsKKwlpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworCXNpZ24gPSAxOworCWlmKG48MCl7CisJCW4gPSAtbjsKKwkJc2lnbiA9IDEgLSAoKG4mMSk8PDEpOworCX0KKwlpZihuPT0wKSByZXR1cm4oX19pZWVlNzU0X3kwKHgpKTsKKwlpZihuPT0xKSByZXR1cm4oc2lnbipfX2llZWU3NTRfeTEoeCkpOworCWlmKGl4PT0weDdmZjAwMDAwKSByZXR1cm4gemVybzsKKwlpZihpeD49MHg1MkQwMDAwMCkgeyAvKiB4ID4gMioqMzAyICovCisgICAgLyogKHggPj4gbioqMikgCisgICAgICoJICAgIEpuKHgpID0gY29zKHgtKDJuKzEpKnBpLzQpKnNxcnQoMi94KnBpKQorICAgICAqCSAgICBZbih4KSA9IHNpbih4LSgybisxKSpwaS80KSpzcXJ0KDIveCpwaSkKKyAgICAgKgkgICAgTGV0IHM9c2luKHgpLCBjPWNvcyh4KSwgCisgICAgICoJCXhuPXgtKDJuKzEpKnBpLzQsIHNxdDIgPSBzcXJ0KDIpLHRoZW4KKyAgICAgKgorICAgICAqCQkgICBuCXNpbih4bikqc3F0Mgljb3MoeG4pKnNxdDIKKyAgICAgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqCQkgICAwCSBzLWMJCSBjK3MKKyAgICAgKgkJICAgMQktcy1jIAkJLWMrcworICAgICAqCQkgICAyCS1zK2MJCS1jLXMKKyAgICAgKgkJICAgMwkgcytjCQkgYy1zCisgICAgICovCisJCXN3aXRjaChuJjMpIHsKKwkJICAgIGNhc2UgMDogdGVtcCA9ICBzaW4oeCktY29zKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMTogdGVtcCA9IC1zaW4oeCktY29zKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMjogdGVtcCA9IC1zaW4oeCkrY29zKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMzogdGVtcCA9ICBzaW4oeCkrY29zKHgpOyBicmVhazsKKwkJfQorCQliID0gaW52c3FydHBpKnRlbXAvc3FydCh4KTsKKwl9IGVsc2UgeworCSAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgYSA9IF9faWVlZTc1NF95MCh4KTsKKwkgICAgYiA9IF9faWVlZTc1NF95MSh4KTsKKwkvKiBxdWl0IGlmIGIgaXMgLWluZiAqLworCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gsYik7CisJICAgIGZvcihpPTE7aTxuJiZoaWdoIT0weGZmZjAwMDAwO2krKyl7CisJCXRlbXAgPSBiOworCQliID0gKChkb3VibGUpKGkraSkveCkqYiAtIGE7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCxiKTsKKwkJYSA9IHRlbXA7CisJICAgIH0KKwl9CisJaWYoc2lnbj4wKSByZXR1cm4gYjsgZWxzZSByZXR1cm4gLWI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2puZi5jIGIvbGlibS9zcmMvZV9qbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qbmYuYwpAQCAtMCwwICsxLDE5NiBAQAorLyogZV9qbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfam4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfam5mLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAoraW52c3FydHBpPSAgNS42NDE4OTYxMjg3ZS0wMSwgLyogMHgzZjEwNmViYiAqLwordHdvICAgPSAgMi4wMDAwMDAwMDAwZSswMCwgLyogMHg0MDAwMDAwMCAqLworb25lICAgPSAgMS4wMDAwMDAwMDAwZSswMDsgLyogMHgzRjgwMDAwMCAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgemVybyAgPSAgMC4wMDAwMDAwMDAwZSswMDsKKworZmxvYXQKK19faWVlZTc1NF9qbmYoaW50IG4sIGZsb2F0IHgpCit7CisJaW50MzJfdCBpLGh4LGl4LCBzZ247CisJZmxvYXQgYSwgYiwgdGVtcCwgZGk7CisJZmxvYXQgeiwgdzsKKworICAgIC8qIEooLW4seCkgPSAoLTEpXm4gKiBKKG4sIHgpLCBKKG4sIC14KSA9ICgtMSlebiAqIEoobiwgeCkKKyAgICAgKiBUaHVzLCBKKC1uLHgpID0gSihuLC14KQorICAgICAqLworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBpZiBKKG4sTmFOKSBpcyBOYU4gKi8KKwlpZihpeD4weDdmODAwMDAwKSByZXR1cm4geCt4OworCWlmKG48MCl7CisJCW4gPSAtbjsKKwkJeCA9IC14OworCQloeCBePSAweDgwMDAwMDAwOworCX0KKwlpZihuPT0wKSByZXR1cm4oX19pZWVlNzU0X2owZih4KSk7CisJaWYobj09MSkgcmV0dXJuKF9faWVlZTc1NF9qMWYoeCkpOworCXNnbiA9IChuJjEpJihoeD4+MzEpOwkvKiBldmVuIG4gLS0gMCwgb2RkIG4gLS0gc2lnbih4KSAqLworCXggPSBmYWJzZih4KTsKKwlpZihpeD09MHx8aXg+PTB4N2Y4MDAwMDApIAkvKiBpZiB4IGlzIDAgb3IgaW5mICovCisJICAgIGIgPSB6ZXJvOworCWVsc2UgaWYoKGZsb2F0KW48PXgpIHsKKwkJLyogU2FmZSB0byB1c2UgSihuKzEseCk9Mm4veCAqSihuLHgpLUoobi0xLHgpICovCisJICAgIGEgPSBfX2llZWU3NTRfajBmKHgpOworCSAgICBiID0gX19pZWVlNzU0X2oxZih4KTsKKwkgICAgZm9yKGk9MTtpPG47aSsrKXsKKwkJdGVtcCA9IGI7CisJCWIgPSBiKigoZmxvYXQpKGkraSkveCkgLSBhOyAvKiBhdm9pZCB1bmRlcmZsb3cgKi8KKwkJYSA9IHRlbXA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihpeDwweDMwODAwMDAwKSB7CS8qIHggPCAyKiotMjkgKi8KKyAgICAvKiB4IGlzIHRpbnksIHJldHVybiB0aGUgZmlyc3QgVGF5bG9yIGV4cGFuc2lvbiBvZiBKKG4seCkKKyAgICAgKiBKKG4seCkgPSAxL24hKih4LzIpXm4gIC0gLi4uCisgICAgICovCisJCWlmKG4+MzMpCS8qIHVuZGVyZmxvdyAqLworCQkgICAgYiA9IHplcm87CisJCWVsc2UgeworCQkgICAgdGVtcCA9IHgqKGZsb2F0KTAuNTsgYiA9IHRlbXA7CisJCSAgICBmb3IgKGE9b25lLGk9MjtpPD1uO2krKykgeworCQkJYSAqPSAoZmxvYXQpaTsJCS8qIGEgPSBuISAqLworCQkJYiAqPSB0ZW1wOwkJLyogYiA9ICh4LzIpXm4gKi8KKwkJICAgIH0KKwkJICAgIGIgPSBiL2E7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJLyogdXNlIGJhY2t3YXJkIHJlY3VycmVuY2UgKi8KKwkJLyogCQkJeCAgICAgIHheMiAgICAgIHheMgorCQkgKiAgSihuLHgpL0oobi0xLHgpID0gIC0tLS0gICAtLS0tLS0gICAtLS0tLS0gICAuLi4uLgorCQkgKgkJCTJuICAtIDIobisxKSAtIDIobisyKQorCQkgKgorCQkgKiAJCQkxICAgICAgMSAgICAgICAgMQorCQkgKiAgKGZvciBsYXJnZSB4KSAgID0gIC0tLS0gIC0tLS0tLSAgIC0tLS0tLSAgIC4uLi4uCisJCSAqCQkJMm4gICAyKG4rMSkgICAyKG4rMikKKwkJICoJCQktLSAtIC0tLS0tLSAtIC0tLS0tLSAtCisJCSAqCQkJIHggICAgIHggICAgICAgICB4CisJCSAqCisJCSAqIExldCB3ID0gMm4veCBhbmQgaD0yL3gsIHRoZW4gdGhlIGFib3ZlIHF1b3RpZW50CisJCSAqIGlzIGVxdWFsIHRvIHRoZSBjb250aW51ZWQgZnJhY3Rpb246CisJCSAqCQkgICAgMQorCQkgKgk9IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqCQkgICAgICAgMQorCQkgKgkgICB3IC0gLS0tLS0tLS0tLS0tLS0tLS0KKwkJICoJCQkgIDEKKwkJICogCSAgICAgICAgdytoIC0gLS0tLS0tLS0tCisJCSAqCQkgICAgICAgdysyaCAtIC4uLgorCQkgKgorCQkgKiBUbyBkZXRlcm1pbmUgaG93IG1hbnkgdGVybXMgbmVlZGVkLCBsZXQKKwkJICogUSgwKSA9IHcsIFEoMSkgPSB3KHcraCkgLSAxLAorCQkgKiBRKGspID0gKHcraypoKSpRKGstMSkgLSBRKGstMiksCisJCSAqIFdoZW4gUShrKSA+IDFlNAlnb29kIGZvciBzaW5nbGUKKwkJICogV2hlbiBRKGspID4gMWU5CWdvb2QgZm9yIGRvdWJsZQorCQkgKiBXaGVuIFEoaykgPiAxZTE3CWdvb2QgZm9yIHF1YWRydXBsZQorCQkgKi8KKwkgICAgLyogZGV0ZXJtaW5lIGsgKi8KKwkJZmxvYXQgdCx2OworCQlmbG9hdCBxMCxxMSxoLHRtcDsgaW50MzJfdCBrLG07CisJCXcgID0gKG4rbikvKGZsb2F0KXg7IGggPSAoZmxvYXQpMi4wLyhmbG9hdCl4OworCQlxMCA9IHc7ICB6ID0gdytoOyBxMSA9IHcqeiAtIChmbG9hdCkxLjA7IGs9MTsKKwkJd2hpbGUocTE8KGZsb2F0KTEuMGU5KSB7CisJCQlrICs9IDE7IHogKz0gaDsKKwkJCXRtcCA9IHoqcTEgLSBxMDsKKwkJCXEwID0gcTE7CisJCQlxMSA9IHRtcDsKKwkJfQorCQltID0gbituOworCQlmb3IodD16ZXJvLCBpID0gMioobitrKTsgaT49bTsgaSAtPSAyKSB0ID0gb25lLyhpL3gtdCk7CisJCWEgPSB0OworCQliID0gb25lOworCQkvKiAgZXN0aW1hdGUgbG9nKCgyL3gpXm4qbiEpID0gbipsb2coMi94KStuKmxuKG4pCisJCSAqICBIZW5jZSwgaWYgbioobG9nKDJuL3gpKSA+IC4uLgorCQkgKiAgc2luZ2xlIDguODcyMjgzOTM1NWUrMDEKKwkJICogIGRvdWJsZSA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMgorCQkgKiAgbG9uZyBkb3VibGUgMS4xMzU2NTIzNDA2Mjk0MTQzOTQ5NDkxOTMxMDc3OTcwNzY1MDA2MTcwZSswNAorCQkgKiAgdGhlbiByZWN1cnJlbnQgdmFsdWUgbWF5IG92ZXJmbG93IGFuZCB0aGUgcmVzdWx0IGlzCisJCSAqICBsaWtlbHkgdW5kZXJmbG93IHRvIHplcm8KKwkJICovCisJCXRtcCA9IG47CisJCXYgPSB0d28veDsKKwkJdG1wID0gdG1wKl9faWVlZTc1NF9sb2dmKGZhYnNmKHYqdG1wKSk7CisJCWlmKHRtcDwoZmxvYXQpOC44NzIxNjc5Njg4ZSswMSkgeworCSAgICAJICAgIGZvcihpPW4tMSxkaT0oZmxvYXQpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCSAgICAgCSAgICB9CisJCX0gZWxzZSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShmbG9hdCkoaStpKTtpPjA7aS0tKXsKKwkJICAgICAgICB0ZW1wID0gYjsKKwkJCWIgKj0gZGk7CisJCQliICA9IGIveCAtIGE7CisJCSAgICAgICAgYSA9IHRlbXA7CisJCQlkaSAtPSB0d287CisJCSAgICAvKiBzY2FsZSBiIHRvIGF2b2lkIHNwdXJpb3VzIG92ZXJmbG93ICovCisJCQlpZihiPihmbG9hdCkxZTEwKSB7CisJCQkgICAgYSAvPSBiOworCQkJICAgIHQgLz0gYjsKKwkJCSAgICBiICA9IG9uZTsKKwkJCX0KKwkgICAgIAkgICAgfQorCQl9CisJICAgIAliID0gKHQqX19pZWVlNzU0X2owZih4KS9iKTsKKwkgICAgfQorCX0KKwlpZihzZ249PTEpIHJldHVybiAtYjsgZWxzZSByZXR1cm4gYjsKK30KKworZmxvYXQKK19faWVlZTc1NF95bmYoaW50IG4sIGZsb2F0IHgpCit7CisJaW50MzJfdCBpLGh4LGl4LGliOworCWludDMyX3Qgc2lnbjsKKwlmbG9hdCBhLCBiLCB0ZW1wOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIFkobixOYU4pIGlzIE5hTiAqLworCWlmKGl4PjB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJaWYoaXg9PTApIHJldHVybiAtb25lL3plcm87CisJaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKwlzaWduID0gMTsKKwlpZihuPDApeworCQluID0gLW47CisJCXNpZ24gPSAxIC0gKChuJjEpPDwxKTsKKwl9CisJaWYobj09MCkgcmV0dXJuKF9faWVlZTc1NF95MGYoeCkpOworCWlmKG49PTEpIHJldHVybihzaWduKl9faWVlZTc1NF95MWYoeCkpOworCWlmKGl4PT0weDdmODAwMDAwKSByZXR1cm4gemVybzsKKworCWEgPSBfX2llZWU3NTRfeTBmKHgpOworCWIgPSBfX2llZWU3NTRfeTFmKHgpOworCS8qIHF1aXQgaWYgYiBpcyAtaW5mICovCisJR0VUX0ZMT0FUX1dPUkQoaWIsYik7CisJZm9yKGk9MTtpPG4mJmliIT0weGZmODAwMDAwO2krKyl7CisJICAgIHRlbXAgPSBiOworCSAgICBiID0gKChmbG9hdCkoaStpKS94KSpiIC0gYTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaWIsYik7CisJICAgIGEgPSB0ZW1wOworCX0KKwlpZihzaWduPjApIHJldHVybiBiOyBlbHNlIHJldHVybiAtYjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGRleHBmLmMgYi9saWJtL3NyYy9lX2xkZXhwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Mjk3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xkZXhwZi5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIGVfc2NhbGJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3NjYWxiLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorX19pZWVlNzU0X2xkZXhwZihmbG9hdCB4LCBpbnQgZm4pCit7CisgICAgcmV0dXJuIF9faWVlZTc1NF9zY2FsYmYoeCxmbik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xnYW1tYS5jIGIvbGlibS9zcmMvZV9sZ2FtbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FkNDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWEuYwpAQCAtMCwwICsxLDM0IEBACisKKy8qIEAoIyllX2xnYW1tYS5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sZ2FtbWEuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xnYW1tYSh4KQorICogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9mIHguCisgKgorICogTWV0aG9kOiBjYWxsIF9faWVlZTc1NF9sZ2FtbWFfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2V4dGVybiBpbnQgc2lnbmdhbTsKKworZG91YmxlCitfX2llZWU3NTRfbGdhbW1hKGRvdWJsZSB4KQoreworCXJldHVybiBfX2llZWU3NTRfbGdhbW1hX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xnYW1tYV9yLmMgYi9saWJtL3NyYy9lX2xnYW1tYV9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYmZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbGdhbW1hX3IuYwpAQCAtMCwwICsxLDI5NyBAQAorCisvKiBAKCMpZV9sZ2FtbWFfci5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sZ2FtbWFfci5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbGdhbW1hX3IoeCwgc2lnbmdhbXApCisgKiBSZWVudHJhbnQgdmVyc2lvbiBvZiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBHYW1tYSBmdW5jdGlvbiAKKyAqIHdpdGggdXNlciBwcm92aWRlIHBvaW50ZXIgZm9yIHRoZSBzaWduIG9mIEdhbW1hKHgpLiAKKyAqCisgKiBNZXRob2Q6CisgKiAgIDEuIEFyZ3VtZW50IFJlZHVjdGlvbiBmb3IgMCA8IHggPD0gOAorICogCVNpbmNlIGdhbW1hKDErcyk9cypnYW1tYShzKSwgZm9yIHggaW4gWzAsOF0sIHdlIG1heSAKKyAqIAlyZWR1Y2UgeCB0byBhIG51bWJlciBpbiBbMS41LDIuNV0gYnkKKyAqIAkJbGdhbW1hKDErcykgPSBsb2cocykgKyBsZ2FtbWEocykKKyAqCWZvciBleGFtcGxlLAorICoJCWxnYW1tYSg3LjMpID0gbG9nKDYuMykgKyBsZ2FtbWEoNi4zKQorICoJCQkgICAgPSBsb2coNi4zKjUuMykgKyBsZ2FtbWEoNS4zKQorICoJCQkgICAgPSBsb2coNi4zKjUuMyo0LjMqMy4zKjIuMykgKyBsZ2FtbWEoMi4zKQorICogICAyLiBQb2x5bm9taWFsIGFwcHJveGltYXRpb24gb2YgbGdhbW1hIGFyb3VuZCBpdHMKKyAqCW1pbmltdW4geW1pbj0xLjQ2MTYzMjE0NDk2ODM2MjI0NSB0byBtYWludGFpbiBtb25vdG9uaWNpdHkuCisgKglPbiBbeW1pbi0wLjIzLCB5bWluKzAuMjddIChpLmUuLCBbMS4yMzE2NCwxLjczMTYzXSksIHVzZQorICoJCUxldCB6ID0geC15bWluOworICoJCWxnYW1tYSh4KSA9IC0xLjIxNDg2MjkwNTM1ODQ5NjA3ODIxOCArIHpeMipwb2x5KHopCisgKgl3aGVyZQorICoJCXBvbHkoeikgaXMgYSAxNCBkZWdyZWUgcG9seW5vbWlhbC4KKyAqICAgMi4gUmF0aW9uYWwgYXBwcm94aW1hdGlvbiBpbiB0aGUgcHJpbWFyeSBpbnRlcnZhbCBbMiwzXQorICoJV2UgdXNlIHRoZSBmb2xsb3dpbmcgYXBwcm94aW1hdGlvbjoKKyAqCQlzID0geC0yLjA7CisgKgkJbGdhbW1hKHgpID0gMC41KnMgKyBzKlAocykvUShzKQorICoJd2l0aCBhY2N1cmFjeQorICoJCXxQL1EgLSAobGdhbW1hKHgpLTAuNXMpfCA8IDIqKi02MS43MQorICoJT3VyIGFsZ29yaXRobXMgYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgb2JzZXJ2YXRpb24KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemV0YSgyKS0xICAgIDIgICAgemV0YSgzKS0xICAgIDMKKyAqIGxnYW1tYSgyK3MpID0gcyooMS1FdWxlcikgKyAtLS0tLS0tLS0gKiBzICAtICAtLS0tLS0tLS0gKiBzICArIC4uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAzCisgKgorICoJd2hlcmUgRXVsZXIgPSAwLjU3NzEuLi4gaXMgdGhlIEV1bGVyIGNvbnN0YW50LCB3aGljaCBpcyB2ZXJ5CisgKgljbG9zZSB0byAwLjUuCisgKgorICogICAzLiBGb3IgeD49OCwgd2UgaGF2ZQorICoJbGdhbW1hKHgpfih4LTAuNSlsb2coeCkteCswLjUqbG9nKDJwaSkrMS8oMTJ4KS0xLygzNjB4KiozKSsuLi4uCisgKgkoYmV0dGVyIGZvcm11bGE6CisgKgkgICBsZ2FtbWEoeCl+KHgtMC41KSoobG9nKHgpLTEpLS41Kihsb2coMnBpKS0xKSArIC4uLikKKyAqCUxldCB6ID0gMS94LCB0aGVuIHdlIGFwcHJveGltYXRpb24KKyAqCQlmKHopID0gbGdhbW1hKHgpIC0gKHgtMC41KShsb2coeCktMSkKKyAqCWJ5CisgKgkgIAkJCSAgICAzICAgICAgIDUgICAgICAgICAgICAgMTEKKyAqCQl3ID0gdzAgKyB3MSp6ICsgdzIqeiAgKyB3Myp6ICArIC4uLiArIHc2KnoKKyAqCXdoZXJlIAorICoJCXx3IC0gZih6KXwgPCAyKiotNTguNzQKKyAqCQkKKyAqICAgNC4gRm9yIG5lZ2F0aXZlIHgsIHNpbmNlIChHIGlzIGdhbW1hIGZ1bmN0aW9uKQorICoJCS14KkcoLXgpKkcoeCkgPSBwaS9zaW4ocGkqeCksCisgKiAJd2UgaGF2ZQorICogCQlHKHgpID0gcGkvKHNpbihwaSp4KSooLXgpKkcoLXgpKQorICoJc2luY2UgRygteCkgaXMgcG9zaXRpdmUsIHNpZ24oRyh4KSkgPSBzaWduKHNpbihwaSp4KSkgZm9yIHg8MAorICoJSGVuY2UsIGZvciB4PDAsIHNpZ25nYW0gPSBzaWduKHNpbihwaSp4KSkgYW5kIAorICoJCWxnYW1tYSh4KSA9IGxvZyh8R2FtbWEoeCl8KQorICoJCQkgID0gbG9nKHBpLyh8eCpzaW4ocGkqeCl8KSkgLSBsZ2FtbWEoLXgpOworICoJTm90ZTogb25lIHNob3VsZCBhdm9pZCBjb21wdXRlIHBpKigteCkgZGlyZWN0bHkgaW4gdGhlIAorICoJICAgICAgY29tcHV0YXRpb24gb2Ygc2luKHBpKigteCkpLgorICoJCQorICogICA1LiBTcGVjaWFsIENhc2VzCisgKgkJbGdhbW1hKDIrcykgfiBzKigxLUV1bGVyKSBmb3IgdGlueSBzCisgKgkJbGdhbW1hKDEpPWxnYW1tYSgyKT0wCisgKgkJbGdhbW1hKHgpIH4gLWxvZyh4KSBmb3IgdGlueSB4CisgKgkJbGdhbW1hKDApID0gbGdhbW1hKGluZikgPSBpbmYKKyAqCSAJbGdhbW1hKC1pbnRlZ2VyKSA9ICstaW5mCisgKgkKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281Mj0gIDQuNTAzNTk5NjI3MzcwNDk2MDAwMDBlKzE1LCAvKiAweDQzMzAwMDAwLCAweDAwMDAwMDAwICovCitoYWxmPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworcGkgID0gIDMuMTQxNTkyNjUzNTg5NzkzMTE2MDBlKzAwLCAvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCithMCAgPSAgNy43MjE1NjY0OTAxNTMyODY1NTQ5NGUtMDIsIC8qIDB4M0ZCM0M0NjcsIDB4RTM3REIwQzggKi8KK2ExICA9ICAzLjIyNDY3MDMzNDI0MTEzNTkxNjExZS0wMSwgLyogMHgzRkQ0QTM0QywgMHhDNEE2MEZBRCAqLworYTIgID0gIDYuNzM1MjMwMTA1MzEyOTI2ODE4MjRlLTAyLCAvKiAweDNGQjEzRTAwLCAweDFBNTU2MkE3ICovCithMyAgPSAgMi4wNTgwODA4NDMyNTE2NzMzMjgwNmUtMDIsIC8qIDB4M0Y5NTEzMjIsIDB4QUM5MjU0N0IgKi8KK2E0ICA9ICA3LjM4NTU1MDg2MDgxNDAyODgzOTU3ZS0wMywgLyogMHgzRjdFNDA0RiwgMHhCNjhGRUZFOCAqLworYTUgID0gIDIuODkwNTEzODM2NzM0MTU2MjkwOTFlLTAzLCAvKiAweDNGNjdBREQ4LCAweENDQjc5MjZCICovCithNiAgPSAgMS4xOTI3MDc2MzE4MzM2MjA2Nzg0NWUtMDMsIC8qIDB4M0Y1MzhBOTQsIDB4MTE2RjNGNUQgKi8KK2E3ICA9ICA1LjEwMDY5NzkyMTUzNTExMzM2NjA4ZS0wNCwgLyogMHgzRjQwQjZDNiwgMHg4OUI5OUMwMCAqLworYTggID0gIDIuMjA4NjI3OTA3MTM5MDgzODU1NTdlLTA0LCAvKiAweDNGMkNGMkVDLCAweEVEMTBFNTREICovCithOSAgPSAgMS4wODAxMTU2NzI0NzU4MzkzOTk1NGUtMDQsIC8qIDB4M0YxQzUwODgsIDB4OTg3REZCMDcgKi8KK2ExMCA9ICAyLjUyMTQ0NTY1NDUxMjU3MzI2OTM5ZS0wNSwgLyogMHgzRUZBNzA3NCwgMHg0MjhDRkE1MiAqLworYTExID0gIDQuNDg2NDA5NDk2MTg5MTUxNjAxNTBlLTA1LCAvKiAweDNGMDc4NThFLCAweDkwQTQ1ODM3ICovCit0YyAgPSAgMS40NjE2MzIxNDQ5NjgzNjIyNDU3NmUrMDAsIC8qIDB4M0ZGNzYyRDgsIDB4NjM1NkJFM0YgKi8KK3RmICA9IC0xLjIxNDg2MjkwNTM1ODQ5NjExNDYxZS0wMSwgLyogMHhCRkJGMTlCOSwgMHhCQ0MzOEE0MiAqLworLyogdHQgPSAtKHRhaWwgb2YgdGYpICovCit0dCAgPSAtMy42Mzg2NzY5OTcwMzk1MDUzNjU0MWUtMTgsIC8qIDB4QkM1MEM3Q0EsIDB4QTQ4QTk3MUYgKi8KK3QwICA9ICA0LjgzODM2MTIyNzIzODEwMDQ3MDQyZS0wMSwgLyogMHgzRkRFRjcyQiwgMHhDOEVFMzhBMiAqLwordDEgID0gLTEuNDc1ODc3MjI5OTQ1OTM5MTE3NTJlLTAxLCAvKiAweEJGQzJFNDI3LCAweDhEQzZDNTA5ICovCit0MiAgPSAgNi40NjI0OTQwMjM5MTMzMzg1NDc3OGUtMDIsIC8qIDB4M0ZCMDhCNDIsIDB4OTRENTQxOUIgKi8KK3QzICA9IC0zLjI3ODg1NDEwNzU5ODU5NjQ5NTY1ZS0wMiwgLyogMHhCRkEwQzlBOCwgMHhERjM1QjcxMyAqLwordDQgID0gIDEuNzk3MDY3NTA4MTE4MjAzODcxMjZlLTAyLCAvKiAweDNGOTI2NkU3LCAweDk3MEFGOUVDICovCit0NSAgPSAtMS4wMzE0MjI0MTI5ODM0MTQzNzQ1MGUtMDIsIC8qIDB4QkY4NTFGOUYsIDB4QkE5MUVDNkEgKi8KK3Q2ICA9ICA2LjEwMDUzODcwMjQ2MjkxMzMyNjM1ZS0wMywgLyogMHgzRjc4RkNFMCwgMHhFMzcwRTM0NCAqLwordDcgID0gLTMuNjg0NTIwMTY3ODExMzgyNTY3NjBlLTAzLCAvKiAweEJGNkUyRUZGLCAweEIzRTkxNEQ3ICovCit0OCAgPSAgMi4yNTk2NDc4MDkwMDYxMjQ3MjI1MGUtMDMsIC8qIDB4M0Y2MjgyRDMsIDB4MkUxNUM5MTUgKi8KK3Q5ICA9IC0xLjQwMzQ2NDY5OTg5MjMyODQzODEzZS0wMywgLyogMHhCRjU2RkU4RSwgMHhCRjJEMUFGMSAqLwordDEwID0gIDguODEwODE4ODI0Mzc2NTQwMTEzODJlLTA0LCAvKiAweDNGNENERjBDLCAweEVGNjFBOEU5ICovCit0MTEgPSAtNS4zODU5NTMwNTM1Njc0MDU0NjcxNWUtMDQsIC8qIDB4QkY0MUE2MTAsIDB4OUM3M0UwRUMgKi8KK3QxMiA9ICAzLjE1NjMyMDcwOTAzNjI1OTUwMzYxZS0wNCwgLyogMHgzRjM0QUY2RCwgMHg2QzBFQkJGNyAqLwordDEzID0gLTMuMTI3NTQxNjgzNzUxMjA4NjA1MThlLTA0LCAvKiAweEJGMzQ3RjI0LCAweEVDQzM4QzM4ICovCit0MTQgPSAgMy4zNTUyOTE5MjYzNTUxOTA3MzU0M2UtMDQsIC8qIDB4M0YzNUZEM0UsIDB4RThDMkQzRjQgKi8KK3UwICA9IC03LjcyMTU2NjQ5MDE1MzI4NjU1NDk0ZS0wMiwgLyogMHhCRkIzQzQ2NywgMHhFMzdEQjBDOCAqLwordTEgID0gIDYuMzI4MjcwNjQwMjUwOTMzNjY1MTdlLTAxLCAvKiAweDNGRTQ0MDFFLCAweDhCMDA1REZGICovCit1MiAgPSAgMS40NTQ5MjI1MDEzNzIzNDc2ODczN2UrMDAsIC8qIDB4M0ZGNzQ3NUMsIDB4RDExOUJENkYgKi8KK3UzICA9ICA5Ljc3NzE3NTI3OTYzMzcyNzQ1NjAzZS0wMSwgLyogMHgzRkVGNDk3NiwgMHg0NEVBODQ1MCAqLwordTQgID0gIDIuMjg5NjM3MjgwNjQ2OTI0NTEwOTJlLTAxLCAvKiAweDNGQ0Q0RUFFLCAweEY2MDEwOTI0ICovCit1NSAgPSAgMS4zMzgxMDkxODUzNjc4NzY2MDM3N2UtMDIsIC8qIDB4M0Y4QjY3OEIsIDB4QkYyQkFCMDkgKi8KK3YxICA9ICAyLjQ1NTk3NzkzNzEzMDQxMTM0ODIyZSswMCwgLyogMHg0MDAzQTVENywgMHhDMkJENjE5QyAqLwordjIgID0gIDIuMTI4NDg5NzYzNzk4OTMzOTUzNjFlKzAwLCAvKiAweDQwMDEwNzI1LCAweEE0MkIxOEY1ICovCit2MyAgPSAgNy42OTI4NTE1MDQ1NjY3Mjc4MzgyNWUtMDEsIC8qIDB4M0ZFODlERkIsIDB4RTQ1MDUwQUYgKi8KK3Y0ICA9ICAxLjA0MjIyNjQ1NTkzMzY5MTM0MjU0ZS0wMSwgLyogMHgzRkJBQUU1NSwgMHhENjUzN0M4OCAqLwordjUgID0gIDMuMjE3MDkyNDIyODI0MjM5MTE4MTBlLTAzLCAvKiAweDNGNkE1QUJCLCAweDU3RDBDRjYxICovCitzMCAgPSAtNy43MjE1NjY0OTAxNTMyODY1NTQ5NGUtMDIsIC8qIDB4QkZCM0M0NjcsIDB4RTM3REIwQzggKi8KK3MxICA9ICAyLjE0OTgyNDE1OTYwNjA4ODUyNTAxZS0wMSwgLyogMHgzRkNCODQ4QiwgMHgzNkUyMDg3OCAqLworczIgID0gIDMuMjU3Nzg3OTY0MDg5MzA5ODE3ODdlLTAxLCAvKiAweDNGRDREOThGLCAweDRGMTM5RjU5ICovCitzMyAgPSAgMS40NjM1MDQ3MjY1MjQ2NDQ1MjgwNWUtMDEsIC8qIDB4M0ZDMkJCOUMsIDB4QkVFNUYyRjcgKi8KK3M0ICA9ICAyLjY2NDIyNzAzMDMzNjM4NjA5NTYwZS0wMiwgLyogMHgzRjlCNDgxQywgMHg3RTkzOTk2MSAqLworczUgID0gIDEuODQwMjg0NTE0MDczMzc3MTU2NTJlLTAzLCAvKiAweDNGNUUyNkI2LCAweDczNjhGMjM5ICovCitzNiAgPSAgMy4xOTQ3NTMyNjU4NDEwMDg2NzYxN2UtMDUsIC8qIDB4M0YwMEJGRUMsIDB4REQxN0U5NDUgKi8KK3IxICA9ICAxLjM5MjAwNTMzNDY3NjIxMDQ1OTU4ZSswMCwgLyogMHgzRkY2NDVBNywgMHg2MkM0QUI3NCAqLworcjIgID0gIDcuMjE5MzU1NDc1NjcxMzgwNjk1MjVlLTAxLCAvKiAweDNGRTcxQTE4LCAweDkzRDNEQ0RDICovCityMyAgPSAgMS43MTkzMzg2NTYzMjgwMzA3ODk5M2UtMDEsIC8qIDB4M0ZDNjAxRUQsIDB4Q0NGQkRGMjcgKi8KK3I0ICA9ICAxLjg2NDU5MTkxNzE1NjUyOTAxMzQ0ZS0wMiwgLyogMHgzRjkzMTdFQSwgMHg3NDJFRDQ3NSAqLworcjUgID0gIDcuNzc5NDI0OTYzODE4OTM1OTY0MzRlLTA0LCAvKiAweDNGNDk3RERBLCAweENBNDFBOTVCICovCityNiAgPSAgNy4zMjY2ODQzMDc0NDYyNTYzNjE4OWUtMDYsIC8qIDB4M0VERUJBRjcsIDB4QTVCMzgxNDAgKi8KK3cwICA9ICA0LjE4OTM4NTMzMjA0NjcyNzI1MDUyZS0wMSwgLyogMHgzRkRBQ0ZFMywgMHg5MEM5N0Q2OSAqLwordzEgID0gIDguMzMzMzMzMzMzMzMzMjk2Nzg4NDllLTAyLCAvKiAweDNGQjU1NTU1LCAweDU1NTU1NTNCICovCit3MiAgPSAtMi43Nzc3Nzc3NzcyODc3NTUzNjQ3MGUtMDMsIC8qIDB4QkY2NkMxNkMsIDB4MTZCMDJFNUMgKi8KK3czICA9ICA3LjkzNjUwNTU4NjQzMDE5NTU4NTAwZS0wNCwgLyogMHgzRjRBMDE5RiwgMHg5OENGMzhCNiAqLwordzQgID0gLTUuOTUxODc1NTc0NTAzMzk5NjMxMzVlLTA0LCAvKiAweEJGNDM4MENCLCAweDhDMEZFNzQxICovCit3NSAgPSAgOC4zNjMzOTkxODk5NjI4MjEzOTEyNmUtMDQsIC8qIDB4M0Y0QjY3QkEsIDB4NENEQUQ1RDEgKi8KK3c2ICA9IC0xLjYzMDkyOTM0MDk2NTc1MjczOTg5ZS0wMzsgLyogMHhCRjVBQjg5RCwgMHgwQjlFNDNFNCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm89ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMDsKKworCXN0YXRpYyBkb3VibGUgc2luX3BpKGRvdWJsZSB4KQoreworCWRvdWJsZSB5LHo7CisJaW50IG4saXg7CisKKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisKKwlpZihpeDwweDNmZDAwMDAwKSByZXR1cm4gX19rZXJuZWxfc2luKHBpKngsemVybywwKTsKKwl5ID0gLXg7CQkvKiB4IGlzIGFzc3VtZSBuZWdhdGl2ZSAqLworCisgICAgLyoKKyAgICAgKiBhcmd1bWVudCByZWR1Y3Rpb24sIG1ha2Ugc3VyZSBpbmV4YWN0IGZsYWcgbm90IHJhaXNlZCBpZiBpbnB1dAorICAgICAqIGlzIGFuIGludGVnZXIKKyAgICAgKi8KKwl6ID0gZmxvb3IoeSk7CisJaWYoeiE9eSkgewkJCQkvKiBpbmV4YWN0IGFueXdheSAqLworCSAgICB5ICAqPSAwLjU7CisJICAgIHkgICA9IDIuMCooeSAtIGZsb29yKHkpKTsJCS8qIHkgPSB8eHwgbW9kIDIuMCAqLworCSAgICBuICAgPSAoaW50KSAoeSo0LjApOworCX0gZWxzZSB7CisgICAgICAgICAgICBpZihpeD49MHg0MzQwMDAwMCkgeworICAgICAgICAgICAgICAgIHkgPSB6ZXJvOyBuID0gMDsgICAgICAgICAgICAgICAgIC8qIHkgbXVzdCBiZSBldmVuICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKGl4PDB4NDMzMDAwMDApIHogPSB5K3R3bzUyOwkvKiBleGFjdCAqLworCQlHRVRfTE9XX1dPUkQobix6KTsKKwkJbiAmPSAxOworICAgICAgICAgICAgICAgIHkgID0gbjsKKyAgICAgICAgICAgICAgICBuPDw9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKG4pIHsKKwkgICAgY2FzZSAwOiAgIHkgPSAgX19rZXJuZWxfc2luKHBpKnksemVybywwKTsgYnJlYWs7CisJICAgIGNhc2UgMTogICAKKwkgICAgY2FzZSAyOiAgIHkgPSAgX19rZXJuZWxfY29zKHBpKigwLjUteSksemVybyk7IGJyZWFrOworCSAgICBjYXNlIDM6ICAKKwkgICAgY2FzZSA0OiAgIHkgPSAgX19rZXJuZWxfc2luKHBpKihvbmUteSksemVybywwKTsgYnJlYWs7CisJICAgIGNhc2UgNToKKwkgICAgY2FzZSA2OiAgIHkgPSAtX19rZXJuZWxfY29zKHBpKih5LTEuNSksemVybyk7IGJyZWFrOworCSAgICBkZWZhdWx0OiAgeSA9ICBfX2tlcm5lbF9zaW4ocGkqKHktMi4wKSx6ZXJvLDApOyBicmVhazsKKwkgICAgfQorCXJldHVybiAteTsKK30KKworCitkb3VibGUKK19faWVlZTc1NF9sZ2FtbWFfcihkb3VibGUgeCwgaW50ICpzaWduZ2FtcCkKK3sKKwlkb3VibGUgdCx5LHosbmFkaixwLHAxLHAyLHAzLHEscix3OworCWludCBpLGh4LGx4LGl4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKworICAgIC8qIHB1cmdlIG9mZiArLWluZiwgTmFOLCArLTAsIGFuZCBuZWdhdGl2ZSBhcmd1bWVudHMgKi8KKwkqc2lnbmdhbXAgPSAxOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgqeDsKKwlpZigoaXh8bHgpPT0wKSByZXR1cm4gb25lL3plcm87CisJaWYoaXg8MHgzYjkwMDAwMCkgewkvKiB8eHw8MioqLTcwLCByZXR1cm4gLWxvZyh8eHwpICovCisJICAgIGlmKGh4PDApIHsKKwkgICAgICAgICpzaWduZ2FtcCA9IC0xOworCSAgICAgICAgcmV0dXJuIC1fX2llZWU3NTRfbG9nKC14KTsKKwkgICAgfSBlbHNlIHJldHVybiAtX19pZWVlNzU0X2xvZyh4KTsKKwl9CisJaWYoaHg8MCkgeworCSAgICBpZihpeD49MHg0MzMwMDAwMCkgCS8qIHx4fD49MioqNTIsIG11c3QgYmUgLWludGVnZXIgKi8KKwkJcmV0dXJuIG9uZS96ZXJvOworCSAgICB0ID0gc2luX3BpKHgpOworCSAgICBpZih0PT16ZXJvKSByZXR1cm4gb25lL3plcm87IC8qIC1pbnRlZ2VyICovCisJICAgIG5hZGogPSBfX2llZWU3NTRfbG9nKHBpL2ZhYnModCp4KSk7CisJICAgIGlmKHQ8emVybykgKnNpZ25nYW1wID0gLTE7CisJICAgIHggPSAteDsKKwl9CisKKyAgICAvKiBwdXJnZSBvZmYgMSBhbmQgMiAqLworCWlmKCgoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCl8fCgoKGl4LTB4NDAwMDAwMDApfGx4KT09MCkpIHIgPSAwOworICAgIC8qIGZvciB4IDwgMi4wICovCisJZWxzZSBpZihpeDwweDQwMDAwMDAwKSB7CisJICAgIGlmKGl4PD0weDNmZWNjY2NjKSB7IAkvKiBsZ2FtbWEoeCkgPSBsZ2FtbWEoeCsxKS1sb2coeCkgKi8KKwkJciA9IC1fX2llZWU3NTRfbG9nKHgpOworCQlpZihpeD49MHgzRkU3Njk0NCkge3kgPSBvbmUteDsgaT0gMDt9CisJCWVsc2UgaWYoaXg+PTB4M0ZDREE2NjEpIHt5PSB4LSh0Yy1vbmUpOyBpPTE7fQorCSAgCWVsc2Uge3kgPSB4OyBpPTI7fQorCSAgICB9IGVsc2UgeworCSAgCXIgPSB6ZXJvOworCSAgICAgICAgaWYoaXg+PTB4M0ZGQkI0QzMpIHt5PTIuMC14O2k9MDt9IC8qIFsxLjczMTYsMl0gKi8KKwkgICAgICAgIGVsc2UgaWYoaXg+PTB4M0ZGM0I0QzQpIHt5PXgtdGM7aT0xO30gLyogWzEuMjMsMS43M10gKi8KKwkJZWxzZSB7eT14LW9uZTtpPTI7fQorCSAgICB9CisJICAgIHN3aXRjaChpKSB7CisJICAgICAgY2FzZSAwOgorCQl6ID0geSp5OworCQlwMSA9IGEwK3oqKGEyK3oqKGE0K3oqKGE2K3oqKGE4K3oqYTEwKSkpKTsKKwkJcDIgPSB6KihhMSt6KihhMyt6KihhNSt6KihhNyt6KihhOSt6KmExMSkpKSkpOworCQlwICA9IHkqcDErcDI7CisJCXIgICs9IChwLTAuNSp5KTsgYnJlYWs7CisJICAgICAgY2FzZSAxOgorCQl6ID0geSp5OworCQl3ID0geip5OworCQlwMSA9IHQwK3cqKHQzK3cqKHQ2K3cqKHQ5ICt3KnQxMikpKTsJLyogcGFyYWxsZWwgY29tcCAqLworCQlwMiA9IHQxK3cqKHQ0K3cqKHQ3K3cqKHQxMCt3KnQxMykpKTsKKwkJcDMgPSB0Mit3Kih0NSt3Kih0OCt3Kih0MTErdyp0MTQpKSk7CisJCXAgID0geipwMS0odHQtdyoocDIreSpwMykpOworCQlyICs9ICh0ZiArIHApOyBicmVhazsKKwkgICAgICBjYXNlIDI6CQorCQlwMSA9IHkqKHUwK3kqKHUxK3kqKHUyK3kqKHUzK3kqKHU0K3kqdTUpKSkpKTsKKwkJcDIgPSBvbmUreSoodjEreSoodjIreSoodjMreSoodjQreSp2NSkpKSk7CisJCXIgKz0gKC0wLjUqeSArIHAxL3AyKTsKKwkgICAgfQorCX0KKwllbHNlIGlmKGl4PDB4NDAyMDAwMDApIHsgCQkJLyogeCA8IDguMCAqLworCSAgICBpID0gKGludCl4OworCSAgICB0ID0gemVybzsKKwkgICAgeSA9IHgtKGRvdWJsZSlpOworCSAgICBwID0geSooczAreSooczEreSooczIreSooczMreSooczQreSooczUreSpzNikpKSkpKTsKKwkgICAgcSA9IG9uZSt5KihyMSt5KihyMit5KihyMyt5KihyNCt5KihyNSt5KnI2KSkpKSk7CisJICAgIHIgPSBoYWxmKnkrcC9xOworCSAgICB6ID0gb25lOwkvKiBsZ2FtbWEoMStzKSA9IGxvZyhzKSArIGxnYW1tYShzKSAqLworCSAgICBzd2l0Y2goaSkgeworCSAgICBjYXNlIDc6IHogKj0gKHkrNi4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA2OiB6ICo9ICh5KzUuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNTogeiAqPSAoeSs0LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDQ6IHogKj0gKHkrMy4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSAzOiB6ICo9ICh5KzIuMCk7CS8qIEZBTExUSFJVICovCisJCSAgICByICs9IF9faWVlZTc1NF9sb2coeik7IGJyZWFrOworCSAgICB9CisgICAgLyogOC4wIDw9IHggPCAyKio1OCAqLworCX0gZWxzZSBpZiAoaXggPCAweDQzOTAwMDAwKSB7CisJICAgIHQgPSBfX2llZWU3NTRfbG9nKHgpOworCSAgICB6ID0gb25lL3g7CisJICAgIHkgPSB6Kno7CisJICAgIHcgPSB3MCt6Kih3MSt5Kih3Mit5Kih3Myt5Kih3NCt5Kih3NSt5Knc2KSkpKSk7CisJICAgIHIgPSAoeC1oYWxmKSoodC1vbmUpK3c7CisJfSBlbHNlIAorICAgIC8qIDIqKjU4IDw9IHggPD0gaW5mICovCisJICAgIHIgPSAgeCooX19pZWVlNzU0X2xvZyh4KS1vbmUpOworCWlmKGh4PDApIHIgPSBuYWRqIC0gcjsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hZi5jIGIvbGlibS9zcmMvZV9sZ2FtbWFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmNDhkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbGdhbW1hZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGVfbGdhbW1hZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sZ2FtbWEuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbGdhbW1hZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbGdhbW1hZih4KQorICogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9mIHguCisgKgorICogTWV0aG9kOiBjYWxsIF9faWVlZTc1NF9sZ2FtbWFmX3IKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitleHRlcm4gaW50IHNpZ25nYW07CisKK2Zsb2F0CitfX2llZWU3NTRfbGdhbW1hZihmbG9hdCB4KQoreworCXJldHVybiBfX2llZWU3NTRfbGdhbW1hZl9yKHgsJnNpZ25nYW0pOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZ2FtbWFmX3IuYyBiL2xpYm0vc3JjL2VfbGdhbW1hZl9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbGdhbW1hZl9yLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qIGVfbGdhbW1hZl9yLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2xnYW1tYV9yLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYWZfci5jLHYgMS45IDIwMDUvMTEvMjggMDg6MzI6MTUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzIzPSAgOC4zODg2MDgwMDAwZSswNiwgLyogMHg0YjAwMDAwMCAqLworaGFsZj0gIDUuMDAwMDAwMDAwMGUtMDEsIC8qIDB4M2YwMDAwMDAgKi8KK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNmODAwMDAwICovCitwaSAgPSAgMy4xNDE1OTI3NDEwZSswMCwgLyogMHg0MDQ5MGZkYiAqLworYTAgID0gIDcuNzIxNTY2NDA4OWUtMDIsIC8qIDB4M2Q5ZTIzM2YgKi8KK2ExICA9ICAzLjIyNDY3MDI5MDllLTAxLCAvKiAweDNlYTUxYTY2ICovCithMiAgPSAgNi43MzUyMzAyMzcyZS0wMiwgLyogMHgzZDg5ZjAwMSAqLworYTMgID0gIDIuMDU4MDgwNzcwMWUtMDIsIC8qIDB4M2NhODk5MTUgKi8KK2E0ICA9ICA3LjM4NTU1MDk5ODJlLTAzLCAvKiAweDNiZjIwMjdlICovCithNSAgPSAgMi44OTA1MTM3NDQyZS0wMywgLyogMHgzYjNkNmVjNiAqLworYTYgID0gIDEuMTkyNzA3Njg0OGUtMDMsIC8qIDB4M2E5YzU0YTEgKi8KK2E3ICA9ICA1LjEwMDY5Nzc0NDZlLTA0LCAvKiAweDNhMDViNjM0ICovCithOCAgPSAgMi4yMDg2Mjc4NDc3ZS0wNCwgLyogMHgzOTY3OTc2NyAqLworYTkgID0gIDEuMDgwMTE1Njg5NWUtMDQsIC8qIDB4MzhlMjg0NDUgKi8KK2ExMCA9ICAyLjUyMTQ0NTY0MDBlLTA1LCAvKiAweDM3ZDM4M2EyICovCithMTEgPSAgNC40ODY0MDk2NzA4ZS0wNSwgLyogMHgzODNjMmM3NSAqLwordGMgID0gIDEuNDYxNjMyMTMyNWUrMDAsIC8qIDB4M2ZiYjE2YzMgKi8KK3RmICA9IC0xLjIxNDg2MjgzODRlLTAxLCAvKiAweGJkZjhjZGNkICovCisvKiB0dCA9IC0odGFpbCBvZiB0ZikgKi8KK3R0ICA9ICA2LjY5NzEwMDY1MThlLTA5LCAvKiAweDMxZTYxYzUyICovCit0MCAgPSAgNC44MzgzNjExNDQxZS0wMSwgLyogMHgzZWY3Yjk1ZSAqLwordDEgID0gLTEuNDc1ODc3MTY1OGUtMDEsIC8qIDB4YmUxNzIxM2MgKi8KK3QyICA9ICA2LjQ2MjQ5NDI4MzllLTAyLCAvKiAweDNkODQ1YTE1ICovCit0MyAgPSAtMy4yNzg4NTQxMTY4ZS0wMiwgLyogMHhiZDA2NGQ0NyAqLwordDQgID0gIDEuNzk3MDY3NTYwM2UtMDIsIC8qIDB4M2M5MzM3M2QgKi8KK3Q1ICA9IC0xLjAzMTQyMjQyODhlLTAyLCAvKiAweGJjMjhmY2ZlICovCit0NiAgPSAgNi4xMDA1Mzg2NTI0ZS0wMywgLyogMHgzYmM3ZTcwNyAqLwordDcgID0gLTMuNjg0NTIwMjU1OGUtMDMsIC8qIDB4YmI3MTc3ZmUgKi8KK3Q4ICA9ICAyLjI1OTY0NzcwNjVlLTAzLCAvKiAweDNiMTQxNjk5ICovCit0OSAgPSAtMS40MDM0NjQ3MDI5ZS0wMywgLyogMHhiYWI3ZjQ3NiAqLwordDEwID0gIDguODEwODE4NTQ0NmUtMDQsIC8qIDB4M2E2NmY4NjcgKi8KK3QxMSA9IC01LjM4NTk1MzExODFlLTA0LCAvKiAweGJhMGQzMDg1ICovCit0MTIgPSAgMy4xNTYzMjA1OTk0ZS0wNCwgLyogMHgzOWE1N2I2YiAqLwordDEzID0gLTMuMTI3NTQxNTY3N2UtMDQsIC8qIDB4YjlhM2Y5MjcgKi8KK3QxNCA9ICAzLjM1NTI5MTg0NjdlLTA0LCAvKiAweDM5YWZlOWY3ICovCit1MCAgPSAtNy43MjE1NjY0MDg5ZS0wMiwgLyogMHhiZDllMjMzZiAqLwordTEgID0gIDYuMzI4MjcwNDM1M2UtMDEsIC8qIDB4M2YyMjAwZjQgKi8KK3UyICA9ICAxLjQ1NDkyMjU1NjllKzAwLCAvKiAweDNmYmEzYWU3ICovCit1MyAgPSAgOS43NzcxNzUxODgxZS0wMSwgLyogMHgzZjdhNGJiMiAqLwordTQgID0gIDIuMjg5NjM3MzI3MmUtMDEsIC8qIDB4M2U2YTc1NzggKi8KK3U1ICA9ICAxLjMzODEwOTE4NzhlLTAyLCAvKiAweDNjNWIzYzVlICovCit2MSAgPSAgMi40NTU5Nzc5MTY3ZSswMCwgLyogMHg0MDFkMmViZSAqLwordjIgID0gIDIuMTI4NDg5NzMyN2UrMDAsIC8qIDB4NDAwODM5MmQgKi8KK3YzICA9ICA3LjY5Mjg1MTQyNDJlLTAxLCAvKiAweDNmNDRlZmRmICovCit2NCAgPSAgMS4wNDIyMjY0Nzg1ZS0wMSwgLyogMHgzZGQ1NzJhZiAqLwordjUgID0gIDMuMjE3MDkyNDgyNGUtMDMsIC8qIDB4M2I1MmQ1ZGIgKi8KK3MwICA9IC03LjcyMTU2NjQwODllLTAyLCAvKiAweGJkOWUyMzNmICovCitzMSAgPSAgMi4xNDk4MjQyMDIxZS0wMSwgLyogMHgzZTVjMjQ1YSAqLworczIgID0gIDMuMjU3Nzg3ODIzN2UtMDEsIC8qIDB4M2VhNmNjN2EgKi8KK3MzICA9ICAxLjQ2MzUwNDczMTdlLTAxLCAvKiAweDNlMTVkY2U2ICovCitzNCAgPSAgMi42NjQyMjcwMzg2ZS0wMiwgLyogMHgzY2RhNDBlNCAqLworczUgID0gIDEuODQwMjg0NTU5OWUtMDMsIC8qIDB4M2FmMTM1YjQgKi8KK3M2ICA9ICAzLjE5NDc1MzI5ODllLTA1LCAvKiAweDM4MDVmZjY3ICovCityMSAgPSAgMS4zOTIwMDUzMjQ0ZSswMCwgLyogMHgzZmIyMmQzYiAqLworcjIgID0gIDcuMjE5MzU1NzAyNGUtMDEsIC8qIDB4M2YzOGQwYzUgKi8KK3IzICA9ICAxLjcxOTMzODU5NTllLTAxLCAvKiAweDNlMzAwZjZlICovCityNCAgPSAgMS44NjQ1OTE5ODU5ZS0wMiwgLyogMHgzYzk4YmY1NCAqLworcjUgID0gIDcuNzc5NDI0Nzc3M2UtMDQsIC8qIDB4M2E0YmVlZDYgKi8KK3I2ICA9ICA3LjMyNjY4NDIyNjRlLTA2LCAvKiAweDM2ZjVkN2JkICovCit3MCAgPSAgNC4xODkzODU0NzM3ZS0wMSwgLyogMHgzZWQ2N2YxZCAqLwordzEgID0gIDguMzMzMzMzNTgxN2UtMDIsIC8qIDB4M2RhYWFhYWIgKi8KK3cyICA9IC0yLjc3Nzc3Nzg0NTBlLTAzLCAvKiAweGJiMzYwYjYxICovCit3MyAgPSAgNy45MzY1MDU3MTcyZS0wNCwgLyogMHgzYTUwMGNmZCAqLwordzQgID0gLTUuOTUxODc1MzU1MWUtMDQsIC8qIDB4YmExYzA2NWMgKi8KK3c1ICA9ICA4LjM2MzM5ODk1NjFlLTA0LCAvKiAweDNhNWIzZGQyICovCit3NiAgPSAtMS42MzA5MjkyOTg3ZS0wMzsgLyogMHhiYWQ1YzRlOCAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgemVybz0gIDAuMDAwMDAwMDAwMGUrMDA7CisKKwlzdGF0aWMgZmxvYXQgc2luX3BpZihmbG9hdCB4KQoreworCWZsb2F0IHksejsKKwlpbnQgbixpeDsKKworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisKKwlpZihpeDwweDNlODAwMDAwKSByZXR1cm4gX19rZXJuZWxfc2luZGYocGkqeCk7CisJeSA9IC14OwkJLyogeCBpcyBhc3N1bWUgbmVnYXRpdmUgKi8KKworICAgIC8qCisgICAgICogYXJndW1lbnQgcmVkdWN0aW9uLCBtYWtlIHN1cmUgaW5leGFjdCBmbGFnIG5vdCByYWlzZWQgaWYgaW5wdXQKKyAgICAgKiBpcyBhbiBpbnRlZ2VyCisgICAgICovCisJeiA9IGZsb29yZih5KTsKKwlpZih6IT15KSB7CQkJCS8qIGluZXhhY3QgYW55d2F5ICovCisJICAgIHkgICo9IChmbG9hdCkwLjU7CisJICAgIHkgICA9IChmbG9hdCkyLjAqKHkgLSBmbG9vcmYoeSkpOwkvKiB5ID0gfHh8IG1vZCAyLjAgKi8KKwkgICAgbiAgID0gKGludCkgKHkqKGZsb2F0KTQuMCk7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGl4Pj0weDRiODAwMDAwKSB7CisgICAgICAgICAgICAgICAgeSA9IHplcm87IG4gPSAwOyAgICAgICAgICAgICAgICAgLyogeSBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg0YjAwMDAwMCkgeiA9IHkrdHdvMjM7CS8qIGV4YWN0ICovCisJCUdFVF9GTE9BVF9XT1JEKG4seik7CisJCW4gJj0gMTsKKyAgICAgICAgICAgICAgICB5ICA9IG47CisgICAgICAgICAgICAgICAgbjw8PSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChuKSB7CisJICAgIGNhc2UgMDogICB5ID0gIF9fa2VybmVsX3NpbmRmKHBpKnkpOyBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICBjYXNlIDI6ICAgeSA9ICBfX2tlcm5lbF9jb3NkZihwaSooKGZsb2F0KTAuNS15KSk7IGJyZWFrOworCSAgICBjYXNlIDM6CisJICAgIGNhc2UgNDogICB5ID0gIF9fa2VybmVsX3NpbmRmKHBpKihvbmUteSkpOyBicmVhazsKKwkgICAgY2FzZSA1OgorCSAgICBjYXNlIDY6ICAgeSA9IC1fX2tlcm5lbF9jb3NkZihwaSooeS0oZmxvYXQpMS41KSk7IGJyZWFrOworCSAgICBkZWZhdWx0OiAgeSA9ICBfX2tlcm5lbF9zaW5kZihwaSooeS0oZmxvYXQpMi4wKSk7IGJyZWFrOworCSAgICB9CisJcmV0dXJuIC15OworfQorCisKK2Zsb2F0CitfX2llZWU3NTRfbGdhbW1hZl9yKGZsb2F0IHgsIGludCAqc2lnbmdhbXApCit7CisJZmxvYXQgdCx5LHosbmFkaixwLHAxLHAyLHAzLHEscix3OworCWludCBpLGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisKKyAgICAvKiBwdXJnZSBvZmYgKy1pbmYsIE5hTiwgKy0wLCBhbmQgbmVnYXRpdmUgYXJndW1lbnRzICovCisJKnNpZ25nYW1wID0gMTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4Kng7CisJaWYoaXg9PTApIHJldHVybiBvbmUvemVybzsKKwlpZihpeDwweDM1MDAwMDAwKSB7CS8qIHx4fDwyKiotMjEsIHJldHVybiAtbG9nKHx4fCkgKi8KKwkgICAgaWYoaHg8MCkgeworCSAgICAgICAgKnNpZ25nYW1wID0gLTE7CisJICAgICAgICByZXR1cm4gLV9faWVlZTc1NF9sb2dmKC14KTsKKwkgICAgfSBlbHNlIHJldHVybiAtX19pZWVlNzU0X2xvZ2YoeCk7CisJfQorCWlmKGh4PDApIHsKKwkgICAgaWYoaXg+PTB4NGIwMDAwMDApIAkvKiB8eHw+PTIqKjIzLCBtdXN0IGJlIC1pbnRlZ2VyICovCisJCXJldHVybiBvbmUvemVybzsKKwkgICAgdCA9IHNpbl9waWYoeCk7CisJICAgIGlmKHQ9PXplcm8pIHJldHVybiBvbmUvemVybzsgLyogLWludGVnZXIgKi8KKwkgICAgbmFkaiA9IF9faWVlZTc1NF9sb2dmKHBpL2ZhYnNmKHQqeCkpOworCSAgICBpZih0PHplcm8pICpzaWduZ2FtcCA9IC0xOworCSAgICB4ID0gLXg7CisJfQorCisgICAgLyogcHVyZ2Ugb2ZmIDEgYW5kIDIgKi8KKwlpZiAoaXg9PTB4M2Y4MDAwMDB8fGl4PT0weDQwMDAwMDAwKSByID0gMDsKKyAgICAvKiBmb3IgeCA8IDIuMCAqLworCWVsc2UgaWYoaXg8MHg0MDAwMDAwMCkgeworCSAgICBpZihpeDw9MHgzZjY2NjY2NikgeyAJLyogbGdhbW1hKHgpID0gbGdhbW1hKHgrMSktbG9nKHgpICovCisJCXIgPSAtX19pZWVlNzU0X2xvZ2YoeCk7CisJCWlmKGl4Pj0weDNmM2I0YTIwKSB7eSA9IG9uZS14OyBpPSAwO30KKwkJZWxzZSBpZihpeD49MHgzZTZkMzMwOCkge3k9IHgtKHRjLW9uZSk7IGk9MTt9CisJICAJZWxzZSB7eSA9IHg7IGk9Mjt9CisJICAgIH0gZWxzZSB7CisJICAJciA9IHplcm87CisJICAgICAgICBpZihpeD49MHgzZmRkYTYxOCkge3k9KGZsb2F0KTIuMC14O2k9MDt9IC8qIFsxLjczMTYsMl0gKi8KKwkgICAgICAgIGVsc2UgaWYoaXg+PTB4M0Y5ZGE2MjApIHt5PXgtdGM7aT0xO30gLyogWzEuMjMsMS43M10gKi8KKwkJZWxzZSB7eT14LW9uZTtpPTI7fQorCSAgICB9CisJICAgIHN3aXRjaChpKSB7CisJICAgICAgY2FzZSAwOgorCQl6ID0geSp5OworCQlwMSA9IGEwK3oqKGEyK3oqKGE0K3oqKGE2K3oqKGE4K3oqYTEwKSkpKTsKKwkJcDIgPSB6KihhMSt6KihhMyt6KihhNSt6KihhNyt6KihhOSt6KmExMSkpKSkpOworCQlwICA9IHkqcDErcDI7CisJCXIgICs9IChwLShmbG9hdCkwLjUqeSk7IGJyZWFrOworCSAgICAgIGNhc2UgMToKKwkJeiA9IHkqeTsKKwkJdyA9IHoqeTsKKwkJcDEgPSB0MCt3Kih0Myt3Kih0Nit3Kih0OSArdyp0MTIpKSk7CS8qIHBhcmFsbGVsIGNvbXAgKi8KKwkJcDIgPSB0MSt3Kih0NCt3Kih0Nyt3Kih0MTArdyp0MTMpKSk7CisJCXAzID0gdDIrdyoodDUrdyoodDgrdyoodDExK3cqdDE0KSkpOworCQlwICA9IHoqcDEtKHR0LXcqKHAyK3kqcDMpKTsKKwkJciArPSAodGYgKyBwKTsgYnJlYWs7CisJICAgICAgY2FzZSAyOgorCQlwMSA9IHkqKHUwK3kqKHUxK3kqKHUyK3kqKHUzK3kqKHU0K3kqdTUpKSkpKTsKKwkJcDIgPSBvbmUreSoodjEreSoodjIreSoodjMreSoodjQreSp2NSkpKSk7CisJCXIgKz0gKC0oZmxvYXQpMC41KnkgKyBwMS9wMik7CisJICAgIH0KKwl9CisJZWxzZSBpZihpeDwweDQxMDAwMDAwKSB7IAkJCS8qIHggPCA4LjAgKi8KKwkgICAgaSA9IChpbnQpeDsKKwkgICAgdCA9IHplcm87CisJICAgIHkgPSB4LShmbG9hdClpOworCSAgICBwID0geSooczAreSooczEreSooczIreSooczMreSooczQreSooczUreSpzNikpKSkpKTsKKwkgICAgcSA9IG9uZSt5KihyMSt5KihyMit5KihyMyt5KihyNCt5KihyNSt5KnI2KSkpKSk7CisJICAgIHIgPSBoYWxmKnkrcC9xOworCSAgICB6ID0gb25lOwkvKiBsZ2FtbWEoMStzKSA9IGxvZyhzKSArIGxnYW1tYShzKSAqLworCSAgICBzd2l0Y2goaSkgeworCSAgICBjYXNlIDc6IHogKj0gKHkrKGZsb2F0KTYuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNjogeiAqPSAoeSsoZmxvYXQpNS4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA1OiB6ICo9ICh5KyhmbG9hdCk0LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDQ6IHogKj0gKHkrKGZsb2F0KTMuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgMzogeiAqPSAoeSsoZmxvYXQpMi4wKTsJLyogRkFMTFRIUlUgKi8KKwkJICAgIHIgKz0gX19pZWVlNzU0X2xvZ2Yoeik7IGJyZWFrOworCSAgICB9CisgICAgLyogOC4wIDw9IHggPCAyKio1OCAqLworCX0gZWxzZSBpZiAoaXggPCAweDVjODAwMDAwKSB7CisJICAgIHQgPSBfX2llZWU3NTRfbG9nZih4KTsKKwkgICAgeiA9IG9uZS94OworCSAgICB5ID0geip6OworCSAgICB3ID0gdzAreioodzEreSoodzIreSoodzMreSoodzQreSoodzUreSp3NikpKSkpOworCSAgICByID0gKHgtaGFsZikqKHQtb25lKSt3OworCX0gZWxzZQorICAgIC8qIDIqKjU4IDw9IHggPD0gaW5mICovCisJICAgIHIgPSAgeCooX19pZWVlNzU0X2xvZ2YoeCktb25lKTsKKwlpZihoeDwwKSByID0gbmFkaiAtIHI7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xvZy5jIGIvbGlibS9zcmMvZV9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGJmMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sb2cuYwpAQCAtMCwwICsxLDEzNSBAQAorCisvKiBAKCMpZV9sb2cuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sb2cuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sb2coeCkKKyAqIFJldHVybiB0aGUgbG9ncml0aG0gb2YgeAorICoKKyAqIE1ldGhvZCA6ICAgICAgICAgICAgICAgICAgCisgKiAgIDEuIEFyZ3VtZW50IFJlZHVjdGlvbjogZmluZCBrIGFuZCBmIHN1Y2ggdGhhdCAKKyAqCQkJeCA9IDJeayAqICgxK2YpLCAKKyAqCSAgIHdoZXJlICBzcXJ0KDIpLzIgPCAxK2YgPCBzcXJ0KDIpIC4KKyAqCisgKiAgIDIuIEFwcHJveGltYXRpb24gb2YgbG9nKDErZikuCisgKglMZXQgcyA9IGYvKDIrZikgOyBiYXNlZCBvbiBsb2coMStmKSA9IGxvZygxK3MpIC0gbG9nKDEtcykKKyAqCQkgPSAycyArIDIvMyBzKiozICsgMi81IHMqKjUgKyAuLi4uLiwKKyAqCSAgICAgCSA9IDJzICsgcypSCisgKiAgICAgIFdlIHVzZSBhIHNwZWNpYWwgUmVtZSBhbGdvcml0aG0gb24gWzAsMC4xNzE2XSB0byBnZW5lcmF0ZSAKKyAqIAlhIHBvbHlub21pYWwgb2YgZGVncmVlIDE0IHRvIGFwcHJveGltYXRlIFIgVGhlIG1heGltdW0gZXJyb3IgCisgKglvZiB0aGlzIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBpcyBib3VuZGVkIGJ5IDIqKi01OC40NS4gSW4KKyAqCW90aGVyIHdvcmRzLAorICoJCSAgICAgICAgMiAgICAgIDQgICAgICA2ICAgICAgOCAgICAgIDEwICAgICAgMTIgICAgICAxNAorICoJICAgIFIoeikgfiBMZzEqcyArTGcyKnMgK0xnMypzICtMZzQqcyArTGc1KnMgICtMZzYqcyAgK0xnNypzCisgKiAgCSh0aGUgdmFsdWVzIG9mIExnMSB0byBMZzcgYXJlIGxpc3RlZCBpbiB0aGUgcHJvZ3JhbSkKKyAqCWFuZAorICoJICAgIHwgICAgICAyICAgICAgICAgIDE0ICAgICAgICAgIHwgICAgIC01OC40NQorICoJICAgIHwgTGcxKnMgKy4uLitMZzcqcyAgICAtICBSKHopIHwgPD0gMiAKKyAqCSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKglOb3RlIHRoYXQgMnMgPSBmIC0gcypmID0gZiAtIGhmc3EgKyBzKmhmc3EsIHdoZXJlIGhmc3EgPSBmKmYvMi4KKyAqCUluIG9yZGVyIHRvIGd1YXJhbnRlZSBlcnJvciBpbiBsb2cgYmVsb3cgMXVscCwgd2UgY29tcHV0ZSBsb2cKKyAqCWJ5CisgKgkJbG9nKDErZikgPSBmIC0gcyooZiAtIFIpCShpZiBmIGlzIG5vdCB0b28gbGFyZ2UpCisgKgkJbG9nKDErZikgPSBmIC0gKGhmc3EgLSBzKihoZnNxK1IpKS4JKGJldHRlciBhY2N1cmFjeSkKKyAqCQorICoJMy4gRmluYWxseSwgIGxvZyh4KSA9IGsqbG4yICsgbG9nKDErZikuICAKKyAqCQkJICAgID0gaypsbjJfaGkrKGYtKGhmc3EtKHMqKGhmc3ErUikraypsbjJfbG8pKSkKKyAqCSAgIEhlcmUgbG4yIGlzIHNwbGl0IGludG8gdHdvIGZsb2F0aW5nIHBvaW50IG51bWJlcjogCisgKgkJCWxuMl9oaSArIGxuMl9sbywKKyAqCSAgIHdoZXJlIG4qbG4yX2hpIGlzIGFsd2F5cyBleGFjdCBmb3IgfG58IDwgMjAwMC4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJbG9nKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4IDwgMCAoaW5jbHVkaW5nIC1JTkYpIDsgCisgKglsb2coK0lORikgaXMgK0lORjsgbG9nKDApIGlzIC1JTkYgd2l0aCBzaWduYWw7CisgKglsb2coTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbC4KKyAqCisgKiBBY2N1cmFjeToKKyAqCWFjY29yZGluZyB0byBhbiBlcnJvciBhbmFseXNpcywgdGhlIGVycm9yIGlzIGFsd2F5cyBsZXNzIHRoYW4KKyAqCTEgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4KKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyAKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSAKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoIAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2xuMl9oaSAgPSAgNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsCS8qIDNmZTYyZTQyIGZlZTAwMDAwICovCitsbjJfbG8gID0gIDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLAkvKiAzZGVhMzllZiAzNTc5M2M3NiAqLwordHdvNTQgICA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNiwgIC8qIDQzNTAwMDAwIDAwMDAwMDAwICovCitMZzEgPSA2LjY2NjY2NjY2NjY2NjczNTEzMGUtMDEsICAvKiAzRkU1NTU1NSA1NTU1NTU5MyAqLworTGcyID0gMy45OTk5OTk5OTk5NDA5NDE5MDhlLTAxLCAgLyogM0ZEOTk5OTkgOTk5N0ZBMDQgKi8KK0xnMyA9IDIuODU3MTQyODc0MzY2MjM5MTQ5ZS0wMSwgIC8qIDNGRDI0OTI0IDk0MjI5MzU5ICovCitMZzQgPSAyLjIyMjIxOTg0MzIxNDk3ODM5NmUtMDEsICAvKiAzRkNDNzFDNSAxRDhFNzhBRiAqLworTGc1ID0gMS44MTgzNTcyMTYxNjE4MDUwMTJlLTAxLCAgLyogM0ZDNzQ2NjQgOTZDQjAzREUgKi8KK0xnNiA9IDEuNTMxMzgzNzY5OTIwOTM3MzMyZS0wMSwgIC8qIDNGQzM5QTA5IEQwNzhDNjlGICovCitMZzcgPSAxLjQ3OTgxOTg2MDUxMTY1ODU5MWUtMDE7ICAvKiAzRkMyRjExMiBERjNFNTI0NCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gICA9ICAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2xvZyhkb3VibGUgeCkKK3sKKwlkb3VibGUgaGZzcSxmLHMseixSLHcsdDEsdDIsZGs7CisJaW50MzJfdCBrLGh4LGksajsKKwl1X2ludDMyX3QgbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCisJaz0wOworCWlmIChoeCA8IDB4MDAxMDAwMDApIHsJCQkvKiB4IDwgMioqLTEwMjIgICovCisJICAgIGlmICgoKGh4JjB4N2ZmZmZmZmYpfGx4KT09MCkgCisJCXJldHVybiAtdHdvNTQvemVybzsJCS8qIGxvZygrLTApPS1pbmYgKi8KKwkgICAgaWYgKGh4PDApIHJldHVybiAoeC14KS96ZXJvOwkvKiBsb2coLSMpID0gTmFOICovCisJICAgIGsgLT0gNTQ7IHggKj0gdHdvNTQ7IC8qIHN1Ym5vcm1hbCBudW1iZXIsIHNjYWxlIHVwIHggKi8KKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKwl9IAorCWlmIChoeCA+PSAweDdmZjAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGh4Pj4yMCktMTAyMzsKKwloeCAmPSAweDAwMGZmZmZmOworCWkgPSAoaHgrMHg5NWY2NCkmMHgxMDAwMDA7CisJU0VUX0hJR0hfV09SRCh4LGh4fChpXjB4M2ZmMDAwMDApKTsJLyogbm9ybWFsaXplIHggb3IgeC8yICovCisJayArPSAoaT4+MjApOworCWYgPSB4LTEuMDsKKwlpZigoMHgwMDBmZmZmZiYoMitoeCkpPDMpIHsJLyogfGZ8IDwgMioqLTIwICovCisJICAgIGlmKGY9PXplcm8pIGlmKGs9PTApIHJldHVybiB6ZXJvOyAgZWxzZSB7ZGs9KGRvdWJsZSlrOworCQkJCSByZXR1cm4gZGsqbG4yX2hpK2RrKmxuMl9sbzt9CisJICAgIFIgPSBmKmYqKDAuNS0wLjMzMzMzMzMzMzMzMzMzMzMzKmYpOworCSAgICBpZihrPT0wKSByZXR1cm4gZi1SOyBlbHNlIHtkaz0oZG91YmxlKWs7CisJICAgIAkgICAgIHJldHVybiBkaypsbjJfaGktKChSLWRrKmxuMl9sbyktZik7fQorCX0KKyAJcyA9IGYvKDIuMCtmKTsgCisJZGsgPSAoZG91YmxlKWs7CisJeiA9IHMqczsKKwlpID0gaHgtMHg2MTQ3YTsKKwl3ID0geip6OworCWogPSAweDZiODUxLWh4OworCXQxPSB3KihMZzIrdyooTGc0K3cqTGc2KSk7IAorCXQyPSB6KihMZzErdyooTGczK3cqKExnNSt3KkxnNykpKTsgCisJaSB8PSBqOworCVIgPSB0Mit0MTsKKwlpZihpPjApIHsKKwkgICAgaGZzcT0wLjUqZipmOworCSAgICBpZihrPT0wKSByZXR1cm4gZi0oaGZzcS1zKihoZnNxK1IpKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChoZnNxLShzKihoZnNxK1IpK2RrKmxuMl9sbykpLWYpOworCX0gZWxzZSB7CisJICAgIGlmKGs9PTApIHJldHVybiBmLXMqKGYtUik7IGVsc2UKKwkJICAgICByZXR1cm4gZGsqbG4yX2hpLSgocyooZi1SKS1kaypsbjJfbG8pLWYpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nMTAuYyBiL2xpYm0vc3JjL2VfbG9nMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRjMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sb2cxMC5jCkBAIC0wLDAgKzEsODcgQEAKKworLyogQCgjKWVfbG9nMTAuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sb2cxMC5jLHYgMS4xMSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xvZzEwKHgpCisgKiBSZXR1cm4gdGhlIGJhc2UgMTAgbG9nYXJpdGhtIG9mIHgKKyAqIAorICogTWV0aG9kIDoKKyAqCUxldCBsb2cxMF8yaGkgPSBsZWFkaW5nIDQwIGJpdHMgb2YgbG9nMTAoMikgYW5kCisgKgkgICAgbG9nMTBfMmxvID0gbG9nMTAoMikgLSBsb2cxMF8yaGksCisgKgkgICAgaXZsbjEwICAgPSAxL2xvZygxMCkgcm91bmRlZC4KKyAqCVRoZW4KKyAqCQluID0gaWxvZ2IoeCksIAorICoJCWlmKG48MCkgIG4gPSBuKzE7CisgKgkJeCA9IHNjYWxibih4LC1uKTsKKyAqCQlsb2cxMCh4KSA6PSBuKmxvZzEwXzJoaSArIChuKmxvZzEwXzJsbyArIGl2bG4xMCpsb2coeCkpCisgKgorICogTm90ZSAxOgorICoJVG8gZ3VhcmFudGVlIGxvZzEwKDEwKipuKT1uLCB3aGVyZSAxMCoqbiBpcyBub3JtYWwsIHRoZSByb3VuZGluZyAKKyAqCW1vZGUgbXVzdCBzZXQgdG8gUm91bmQtdG8tTmVhcmVzdC4KKyAqIE5vdGUgMjoKKyAqCVsxL2xvZygxMCldIHJvdW5kZWQgdG8gNTMgYml0cyBoYXMgZXJyb3IgIC4xOTggICB1bHBzOworICoJbG9nMTAgaXMgbW9ub3RvbmljIGF0IGFsbCBiaW5hcnkgYnJlYWsgcG9pbnRzLgorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglsb2cxMCh4KSBpcyBOYU4gd2l0aCBzaWduYWwgaWYgeCA8IDA7IAorICoJbG9nMTAoK0lORikgaXMgK0lORiB3aXRoIG5vIHNpZ25hbDsgbG9nMTAoMCkgaXMgLUlORiB3aXRoIHNpZ25hbDsKKyAqCWxvZzEwKE5hTikgaXMgdGhhdCBOYU4gd2l0aCBubyBzaWduYWw7CisgKglsb2cxMCgxMCoqTikgPSBOICBmb3IgTj0wLDEsLi4uLDIyLgorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIGNvbnN0YW50cy4KKyAqIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0CisgKiBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcworICogc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgICAgICA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNiwgLyogMHg0MzUwMDAwMCwgMHgwMDAwMDAwMCAqLworaXZsbjEwICAgICA9ICA0LjM0Mjk0NDgxOTAzMjUxODE2NjY4ZS0wMSwgLyogMHgzRkRCQ0I3QiwgMHgxNTI2RTUwRSAqLworbG9nMTBfMmhpICA9ICAzLjAxMDI5OTk1NjYzNjExNzcxMzA2ZS0wMSwgLyogMHgzRkQzNDQxMywgMHg1MDlGNjAwMCAqLworbG9nMTBfMmxvICA9ICAzLjY5NDIzOTA3NzE1ODkzMDc4NjE2ZS0xMzsgLyogMHgzRDU5RkVGMywgMHgxMUYxMkIzNiAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gICA9ICAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2xvZzEwKGRvdWJsZSB4KQoreworCWRvdWJsZSB5LHo7CisJaW50MzJfdCBpLGssaHg7CisJdV9pbnQzMl90IGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKworICAgICAgICBrPTA7CisgICAgICAgIGlmIChoeCA8IDB4MDAxMDAwMDApIHsgICAgICAgICAgICAgICAgICAvKiB4IDwgMioqLTEwMjIgICovCisgICAgICAgICAgICBpZiAoKChoeCYweDdmZmZmZmZmKXxseCk9PTApCisgICAgICAgICAgICAgICAgcmV0dXJuIC10d281NC96ZXJvOyAgICAgICAgICAgICAvKiBsb2coKy0wKT0taW5mICovCisgICAgICAgICAgICBpZiAoaHg8MCkgcmV0dXJuICh4LXgpL3plcm87ICAgICAgICAvKiBsb2coLSMpID0gTmFOICovCisgICAgICAgICAgICBrIC09IDU0OyB4ICo9IHR3bzU0OyAvKiBzdWJub3JtYWwgbnVtYmVyLCBzY2FsZSB1cCB4ICovCisJICAgIEdFVF9ISUdIX1dPUkQoaHgseCk7CisgICAgICAgIH0KKwlpZiAoaHggPj0gMHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlrICs9IChoeD4+MjApLTEwMjM7CisJaSAgPSAoKHVfaW50MzJfdClrJjB4ODAwMDAwMDApPj4zMTsKKyAgICAgICAgaHggPSAoaHgmMHgwMDBmZmZmZil8KCgweDNmZi1pKTw8MjApOworICAgICAgICB5ICA9IChkb3VibGUpKGsraSk7CisJU0VUX0hJR0hfV09SRCh4LGh4KTsKKwl6ICA9IHkqbG9nMTBfMmxvICsgaXZsbjEwKl9faWVlZTc1NF9sb2coeCk7CisJcmV0dXJuICB6K3kqbG9nMTBfMmhpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sb2cxMGYuYyBiL2xpYm0vc3JjL2VfbG9nMTBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MzA4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbG9nMTBmLmMKQEAgLTAsMCArMSw1NSBAQAorLyogZV9sb2cxMGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfbG9nMTAuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbG9nMTBmLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjUgICAgICA9ICAzLjM1NTQ0MzIwMDBlKzA3LCAvKiAweDRjMDAwMDAwICovCitpdmxuMTAgICAgID0gIDQuMzQyOTQ0OTIwMWUtMDEsIC8qIDB4M2VkZTViZDkgKi8KK2xvZzEwXzJoaSAgPSAgMy4wMTAyOTIwNTMyZS0wMSwgLyogMHgzZTlhMjA4MCAqLworbG9nMTBfMmxvICA9ICA3LjkwMzQxNTE2NjhlLTA3OyAvKiAweDM1NTQyN2RiICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICAgPSAgMC4wOworCitmbG9hdAorX19pZWVlNzU0X2xvZzEwZihmbG9hdCB4KQoreworCWZsb2F0IHksejsKKwlpbnQzMl90IGksayxoeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCisgICAgICAgIGs9MDsKKyAgICAgICAgaWYgKGh4IDwgMHgwMDgwMDAwMCkgeyAgICAgICAgICAgICAgICAgIC8qIHggPCAyKiotMTI2ICAqLworICAgICAgICAgICAgaWYgKChoeCYweDdmZmZmZmZmKT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLXR3bzI1L3plcm87ICAgICAgICAgICAgIC8qIGxvZygrLTApPS1pbmYgKi8KKyAgICAgICAgICAgIGlmIChoeDwwKSByZXR1cm4gKHgteCkvemVybzsgICAgICAgIC8qIGxvZygtIykgPSBOYU4gKi8KKyAgICAgICAgICAgIGsgLT0gMjU7IHggKj0gdHdvMjU7IC8qIHN1Ym5vcm1hbCBudW1iZXIsIHNjYWxlIHVwIHggKi8KKwkgICAgR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisgICAgICAgIH0KKwlpZiAoaHggPj0gMHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlrICs9IChoeD4+MjMpLTEyNzsKKwlpICA9ICgodV9pbnQzMl90KWsmMHg4MDAwMDAwMCk+PjMxOworICAgICAgICBoeCA9IChoeCYweDAwN2ZmZmZmKXwoKDB4N2YtaSk8PDIzKTsKKyAgICAgICAgeSAgPSAoZmxvYXQpKGsraSk7CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJeiAgPSB5KmxvZzEwXzJsbyArIGl2bG4xMCpfX2llZWU3NTRfbG9nZih4KTsKKwlyZXR1cm4gIHoreSpsb2cxMF8yaGk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xvZ2YuYyBiL2xpYm0vc3JjL2VfbG9nZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZWUyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZ2YuYwpAQCAtMCwwICsxLDgzIEBACisvKiBlX2xvZ2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfbG9nLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZ2YuYyx2IDEuOCAyMDA1LzExLzEyIDE4OjIwOjA5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitsbjJfaGkgPSAgIDYuOTMxMzgxMjI1NmUtMDEsCS8qIDB4M2YzMTcxODAgKi8KK2xuMl9sbyA9ICAgOS4wNTgwMDA2MTQ1ZS0wNiwJLyogMHgzNzE3ZjdkMSAqLwordHdvMjUgPSAgICAzLjM1NTQ0MzIwMGUrMDcsCS8qIDB4NGMwMDAwMDAgKi8KKy8qIHwobG9nKDErcyktbG9nKDEtcykpL3MgLSBMZyhzKXwgPCAyKiotMzQuMjQgKH5bLTQuOTVlLTExLCA0Ljk3ZS0xMV0pLiAqLworTGcxID0gICAgICAweGFhYWFhYS4wcC0yNCwJLyogMC42NjY2NjY2MjY5MyAqLworTGcyID0gICAgICAweGNjY2UxMy4wcC0yNSwJLyogMC40MDAwMDk3MjE1MiAqLworTGczID0gICAgICAweDkxZTllZS4wcC0yNSwJLyogMC4yODQ5ODc4NjY4OCAqLworTGc0ID0gICAgICAweGY4OWUyNi4wcC0yNjsJLyogMC4yNDI3OTA3ODg0MSAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgemVybyAgID0gIDAuMDsKKworZmxvYXQKK19faWVlZTc1NF9sb2dmKGZsb2F0IHgpCit7CisJZmxvYXQgaGZzcSxmLHMseixSLHcsdDEsdDIsZGs7CisJaW50MzJfdCBrLGl4LGksajsKKworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCisJaz0wOworCWlmIChpeCA8IDB4MDA4MDAwMDApIHsJCQkvKiB4IDwgMioqLTEyNiAgKi8KKwkgICAgaWYgKChpeCYweDdmZmZmZmZmKT09MCkKKwkJcmV0dXJuIC10d28yNS96ZXJvOwkJLyogbG9nKCstMCk9LWluZiAqLworCSAgICBpZiAoaXg8MCkgcmV0dXJuICh4LXgpL3plcm87CS8qIGxvZygtIykgPSBOYU4gKi8KKwkgICAgayAtPSAyNTsgeCAqPSB0d28yNTsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwl9CisJaWYgKGl4ID49IDB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJayArPSAoaXg+PjIzKS0xMjc7CisJaXggJj0gMHgwMDdmZmZmZjsKKwlpID0gKGl4KygweDk1ZjY0PDwzKSkmMHg4MDAwMDA7CisJU0VUX0ZMT0FUX1dPUkQoeCxpeHwoaV4weDNmODAwMDAwKSk7CS8qIG5vcm1hbGl6ZSB4IG9yIHgvMiAqLworCWsgKz0gKGk+PjIzKTsKKwlmID0geC0oZmxvYXQpMS4wOworCWlmKCgweDAwN2ZmZmZmJigxNStpeCkpPDE2KSB7CS8qIHxmfCA8IDIqKi0yMCAqLworCSAgICBpZihmPT16ZXJvKSBpZihrPT0wKSByZXR1cm4gemVybzsgIGVsc2Uge2RrPShmbG9hdClrOworCQkJCSByZXR1cm4gZGsqbG4yX2hpK2RrKmxuMl9sbzt9CisJICAgIFIgPSBmKmYqKChmbG9hdCkwLjUtKGZsb2F0KTAuMzMzMzMzMzMzMzMzMzMzMzMqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2Uge2RrPShmbG9hdClrOworCSAgICAJICAgICByZXR1cm4gZGsqbG4yX2hpLSgoUi1kaypsbjJfbG8pLWYpO30KKwl9CisgCXMgPSBmLygoZmxvYXQpMi4wK2YpOworCWRrID0gKGZsb2F0KWs7CisJeiA9IHMqczsKKwlpID0gaXgtKDB4NjE0N2E8PDMpOworCXcgPSB6Kno7CisJaiA9ICgweDZiODUxPDwzKS1peDsKKwl0MT0gdyooTGcyK3cqTGc0KTsKKwl0Mj0geiooTGcxK3cqTGczKTsKKwlpIHw9IGo7CisJUiA9IHQyK3QxOworCWlmKGk+MCkgeworCSAgICBoZnNxPShmbG9hdCkwLjUqZipmOworCSAgICBpZihrPT0wKSByZXR1cm4gZi0oaGZzcS1zKihoZnNxK1IpKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChoZnNxLShzKihoZnNxK1IpK2RrKmxuMl9sbykpLWYpOworCX0gZWxzZSB7CisJICAgIGlmKGs9PTApIHJldHVybiBmLXMqKGYtUik7IGVsc2UKKwkJICAgICByZXR1cm4gZGsqbG4yX2hpLSgocyooZi1SKS1kaypsbjJfbG8pLWYpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcG93LmMgYi9saWJtL3NyYy9lX3Bvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTMxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3Bvdy5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBAKCMpZV9wb3cuYyAxLjUgMDQvMDQvMjIgU01JICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9wb3cuYyx2IDEuMTEgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9wb3coeCx5KSByZXR1cm4geCoqeQorICoKKyAqCQkgICAgICBuCisgKiBNZXRob2Q6ICBMZXQgeCA9ICAyICAgKiAoMStmKQorICoJMS4gQ29tcHV0ZSBhbmQgcmV0dXJuIGxvZzIoeCkgaW4gdHdvIHBpZWNlczoKKyAqCQlsb2cyKHgpID0gdzEgKyB3MiwKKyAqCSAgIHdoZXJlIHcxIGhhcyA1My0yNCA9IDI5IGJpdCB0cmFpbGluZyB6ZXJvcy4KKyAqCTIuIFBlcmZvcm0geSpsb2cyKHgpID0gbit5JyBieSBzaW11bGF0aW5nIG11dGktcHJlY2lzaW9uIAorICoJICAgYXJpdGhtZXRpYywgd2hlcmUgfHknfDw9MC41LgorICoJMy4gUmV0dXJuIHgqKnkgPSAyKipuKmV4cCh5Jypsb2cyKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgkxLiAgKGFueXRoaW5nKSAqKiAwICBpcyAxCisgKgkyLiAgKGFueXRoaW5nKSAqKiAxICBpcyBpdHNlbGYKKyAqCTMuICAoYW55dGhpbmcpICoqIE5BTiBpcyBOQU4KKyAqCTQuICBOQU4gKiogKGFueXRoaW5nIGV4Y2VwdCAwKSBpcyBOQU4KKyAqCTUuICArLSh8eHwgPiAxKSAqKiAgK0lORiBpcyArSU5GCisgKgk2LiAgKy0ofHh8ID4gMSkgKiogIC1JTkYgaXMgKzAKKyAqCTcuICArLSh8eHwgPCAxKSAqKiAgK0lORiBpcyArMAorICoJOC4gICstKHx4fCA8IDEpICoqICAtSU5GIGlzICtJTkYKKyAqCTkuICArLTEgICAgICAgICAqKiArLUlORiBpcyBOQU4KKyAqCTEwLiArMCAqKiAoK2FueXRoaW5nIGV4Y2VwdCAwLCBOQU4pICAgICAgICAgICAgICAgaXMgKzAKKyAqCTExLiAtMCAqKiAoK2FueXRoaW5nIGV4Y2VwdCAwLCBOQU4sIG9kZCBpbnRlZ2VyKSAgaXMgKzAKKyAqCTEyLiArMCAqKiAoLWFueXRoaW5nIGV4Y2VwdCAwLCBOQU4pICAgICAgICAgICAgICAgaXMgK0lORgorICoJMTMuIC0wICoqICgtYW55dGhpbmcgZXhjZXB0IDAsIE5BTiwgb2RkIGludGVnZXIpICBpcyArSU5GCisgKgkxNC4gLTAgKiogKG9kZCBpbnRlZ2VyKSA9IC0oICswICoqIChvZGQgaW50ZWdlcikgKQorICoJMTUuICtJTkYgKiogKCthbnl0aGluZyBleGNlcHQgMCxOQU4pIGlzICtJTkYKKyAqCTE2LiArSU5GICoqICgtYW55dGhpbmcgZXhjZXB0IDAsTkFOKSBpcyArMAorICoJMTcuIC1JTkYgKiogKGFueXRoaW5nKSAgPSAtMCAqKiAoLWFueXRoaW5nKQorICoJMTguICgtYW55dGhpbmcpICoqIChpbnRlZ2VyKSBpcyAoLTEpKiooaW50ZWdlcikqKCthbnl0aGluZyoqaW50ZWdlcikKKyAqCTE5LiAoLWFueXRoaW5nIGV4Y2VwdCAwIGFuZCBpbmYpICoqIChub24taW50ZWdlcikgaXMgTkFOCisgKgorICogQWNjdXJhY3k6CisgKglwb3coeCx5KSByZXR1cm5zIHgqKnkgbmVhcmx5IHJvdW5kZWQuIEluIHBhcnRpY3VsYXIKKyAqCQkJcG93KGludGVnZXIsaW50ZWdlcikKKyAqCWFsd2F5cyByZXR1cm5zIHRoZSBjb3JyZWN0IGludGVnZXIgcHJvdmlkZWQgaXQgaXMgCisgKglyZXByZXNlbnRhYmxlLgorICoKKyAqIENvbnN0YW50cyA6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyAKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSAKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoIAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2JwW10gPSB7MS4wLCAxLjUsfSwKK2RwX2hbXSA9IHsgMC4wLCA1Ljg0OTYyNDg3MjIwNzY0MTYwMTU2ZS0wMSx9LCAvKiAweDNGRTJCODAzLCAweDQwMDAwMDAwICovCitkcF9sW10gPSB7IDAuMCwgMS4zNTAwMzkyMDIxMjk3NDg5NzEyOGUtMDgsfSwgLyogMHgzRTRDRkRFQiwgMHg0M0NGRDAwNiAqLworemVybyAgICA9ICAwLjAsCitvbmUJPSAgMS4wLAordHdvCT0gIDIuMCwKK3R3bzUzCT0gIDkwMDcxOTkyNTQ3NDA5OTIuMCwJLyogMHg0MzQwMDAwMCwgMHgwMDAwMDAwMCAqLworaHVnZQk9ICAxLjBlMzAwLAordGlueSAgICA9ICAxLjBlLTMwMCwKKwkvKiBwb2x5IGNvZWZzIGZvciAoMy8yKSoobG9nKHgpLTJzLTIvMypzKiozICovCitMMSAgPSAgNS45OTk5OTk5OTk5OTk5NDY0ODcyNWUtMDEsIC8qIDB4M0ZFMzMzMzMsIDB4MzMzMzMzMDMgKi8KK0wyICA9ICA0LjI4NTcxNDI4NTc4NTUwMTg0MjUyZS0wMSwgLyogMHgzRkRCNkRCNiwgMHhEQjZGQUJGRiAqLworTDMgID0gIDMuMzMzMzMzMjk4MTgzNzc0MzI5MThlLTAxLCAvKiAweDNGRDU1NTU1LCAweDUxOEYyNjREICovCitMNCAgPSAgMi43MjcyODEyMzgwODUzNDAwNjQ4OWUtMDEsIC8qIDB4M0ZEMTc0NjAsIDB4QTkxRDQxMDEgKi8KK0w1ICA9ICAyLjMwNjYwNzQ1Nzc1NTYxNzU0MDY3ZS0wMSwgLyogMHgzRkNEODY0QSwgMHg5M0M5REI2NSAqLworTDYgID0gIDIuMDY5NzUwMTc4MDAzMzg0MTc3ODRlLTAxLCAvKiAweDNGQ0E3RTI4LCAweDRBNDU0RUVGICovCitQMSAgID0gIDEuNjY2NjY2NjY2NjY2NjYwMTkwMzdlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTNFICovCitQMiAgID0gLTIuNzc3Nzc3Nzc3NzAxNTU5MzM4NDJlLTAzLCAvKiAweEJGNjZDMTZDLCAweDE2QkVCRDkzICovCitQMyAgID0gIDYuNjEzNzU2MzIxNDM3OTM0MzYxMTdlLTA1LCAvKiAweDNGMTE1NjZBLCAweEFGMjVERTJDICovCitQNCAgID0gLTEuNjUzMzkwMjIwNTQ2NTI1MTUzOTBlLTA2LCAvKiAweEJFQkJCRDQxLCAweEM1RDI2QkYxICovCitQNSAgID0gIDQuMTM4MTM2Nzk3MDU3MjM4NDYwMzllLTA4LCAvKiAweDNFNjYzNzY5LCAweDcyQkVBNEQwICovCitsZzIgID0gIDYuOTMxNDcxODA1NTk5NDUyODYyMjdlLTAxLCAvKiAweDNGRTYyRTQyLCAweEZFRkEzOUVGICovCitsZzJfaCAgPSAgNi45MzE0NzE4MjQ2NDU5OTYwOTM3NWUtMDEsIC8qIDB4M0ZFNjJFNDMsIDB4MDAwMDAwMDAgKi8KK2xnMl9sICA9IC0xLjkwNDY1NDI5OTk1Nzc2ODA0NTI1ZS0wOSwgLyogMHhCRTIwNUM2MSwgMHgwQ0E4NkMzOSAqLworb3Z0ID0gIDguMDA4NTY2MjU5NTM3Mjk0NDM3MmUtMDAxNywgLyogLSgxMDI0LWxvZzIob3ZmbCsuNXVscCkpICovCitjcCAgICA9ICA5LjYxNzk2NjkzOTI1OTc1NTU0MzI5ZS0wMSwgLyogMHgzRkVFQzcwOSwgMHhEQzNBMDNGRCA9Mi8oM2xuMikgKi8KK2NwX2ggID0gIDkuNjE3OTY3MDA5NTQ0MzcyNTU4NTllLTAxLCAvKiAweDNGRUVDNzA5LCAweEUwMDAwMDAwID0oZmxvYXQpY3AgKi8KK2NwX2wgID0gLTcuMDI4NDYxNjUwOTUyNzU4MjY1MTZlLTA5LCAvKiAweEJFM0UyRkUwLCAweDE0NUIwMUY1ID10YWlsIG9mIGNwX2gqLworaXZsbjIgICAgPSAgMS40NDI2OTUwNDA4ODg5NjMzODcwMGUrMDAsIC8qIDB4M0ZGNzE1NDcsIDB4NjUyQjgyRkUgPTEvbG4yICovCitpdmxuMl9oICA9ICAxLjQ0MjY5NTAyMTYyOTMzMzQ5NjA5ZSswMCwgLyogMHgzRkY3MTU0NywgMHg2MDAwMDAwMCA9MjRiIDEvbG4yKi8KK2l2bG4yX2wgID0gIDEuOTI1OTYyOTkxMTI2NjE3NDY4ODdlLTA4OyAvKiAweDNFNTRBRTBCLCAweEY4NURERjQ0ID0xL2xuMiB0YWlsKi8KKworZG91YmxlCitfX2llZWU3NTRfcG93KGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlkb3VibGUgeixheCx6X2gsel9sLHBfaCxwX2w7CisJZG91YmxlIHkxLHQxLHQyLHIscyx0LHUsdix3OworCWludDMyX3QgaSxqLGsseWlzaW50LG47CisJaW50MzJfdCBoeCxoeSxpeCxpeTsKKwl1X2ludDMyX3QgbHgsbHk7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJaXggPSBoeCYweDdmZmZmZmZmOyAgaXkgPSBoeSYweDdmZmZmZmZmOworCisgICAgLyogeT09emVybzogeCoqMCA9IDEgKi8KKwlpZigoaXl8bHkpPT0wKSByZXR1cm4gb25lOyAJCisKKyAgICAvKiArLU5hTiByZXR1cm4geCt5ICovCisJaWYoaXggPiAweDdmZjAwMDAwIHx8ICgoaXg9PTB4N2ZmMDAwMDApJiYobHghPTApKSB8fAorCSAgIGl5ID4gMHg3ZmYwMDAwMCB8fCAoKGl5PT0weDdmZjAwMDAwKSYmKGx5IT0wKSkpIAorCQlyZXR1cm4geCt5OwkKKworICAgIC8qIGRldGVybWluZSBpZiB5IGlzIGFuIG9kZCBpbnQgd2hlbiB4IDwgMAorICAgICAqIHlpc2ludCA9IDAJLi4uIHkgaXMgbm90IGFuIGludGVnZXIKKyAgICAgKiB5aXNpbnQgPSAxCS4uLiB5IGlzIGFuIG9kZCBpbnQKKyAgICAgKiB5aXNpbnQgPSAyCS4uLiB5IGlzIGFuIGV2ZW4gaW50CisgICAgICovCisJeWlzaW50ICA9IDA7CisJaWYoaHg8MCkgewkKKwkgICAgaWYoaXk+PTB4NDM0MDAwMDApIHlpc2ludCA9IDI7IC8qIGV2ZW4gaW50ZWdlciB5ICovCisJICAgIGVsc2UgaWYoaXk+PTB4M2ZmMDAwMDApIHsKKwkJayA9IChpeT4+MjApLTB4M2ZmOwkgICAvKiBleHBvbmVudCAqLworCQlpZihrPjIwKSB7CisJCSAgICBqID0gbHk+Pig1Mi1rKTsKKwkJICAgIGlmKChqPDwoNTItaykpPT1seSkgeWlzaW50ID0gMi0oaiYxKTsKKwkJfSBlbHNlIGlmKGx5PT0wKSB7CisJCSAgICBqID0gaXk+PigyMC1rKTsKKwkJICAgIGlmKChqPDwoMjAtaykpPT1peSkgeWlzaW50ID0gMi0oaiYxKTsKKwkJfQorCSAgICB9CQkKKwl9IAorCisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB5ICovCisJaWYobHk9PTApIHsgCQorCSAgICBpZiAoaXk9PTB4N2ZmMDAwMDApIHsJLyogeSBpcyArLWluZiAqLworCSAgICAgICAgaWYoKChpeC0weDNmZjAwMDAwKXxseCk9PTApCisJCSAgICByZXR1cm4gIHkgLSB5OwkvKiBpbmYqKistMSBpcyBOYU4gKi8KKwkgICAgICAgIGVsc2UgaWYgKGl4ID49IDB4M2ZmMDAwMDApLyogKHx4fD4xKSoqKy1pbmYgPSBpbmYsMCAqLworCQkgICAgcmV0dXJuIChoeT49MCk/IHk6IHplcm87CisJICAgICAgICBlbHNlCQkJLyogKHx4fDwxKSoqLSwraW5mID0gaW5mLDAgKi8KKwkJICAgIHJldHVybiAoaHk8MCk/LXk6IHplcm87CisJICAgIH0gCisJICAgIGlmKGl5PT0weDNmZjAwMDAwKSB7CS8qIHkgaXMgICstMSAqLworCQlpZihoeTwwKSByZXR1cm4gb25lL3g7IGVsc2UgcmV0dXJuIHg7CisJICAgIH0KKwkgICAgaWYoaHk9PTB4NDAwMDAwMDApIHJldHVybiB4Kng7IC8qIHkgaXMgIDIgKi8KKwkgICAgaWYoaHk9PTB4M2ZlMDAwMDApIHsJLyogeSBpcyAgMC41ICovCisJCWlmKGh4Pj0wKQkvKiB4ID49ICswICovCisJCXJldHVybiBzcXJ0KHgpOwkKKwkgICAgfQorCX0KKworCWF4ICAgPSBmYWJzKHgpOworICAgIC8qIHNwZWNpYWwgdmFsdWUgb2YgeCAqLworCWlmKGx4PT0wKSB7CisJICAgIGlmKGl4PT0weDdmZjAwMDAwfHxpeD09MHx8aXg9PTB4M2ZmMDAwMDApeworCQl6ID0gYXg7CQkJLyp4IGlzICstMCwrLWluZiwrLTEqLworCQlpZihoeTwwKSB6ID0gb25lL3o7CS8qIHogPSAoMS98eHwpICovCisJCWlmKGh4PDApIHsKKwkJICAgIGlmKCgoaXgtMHgzZmYwMDAwMCl8eWlzaW50KT09MCkgeworCQkJeiA9ICh6LXopLyh6LXopOyAvKiAoLTEpKipub24taW50IGlzIE5hTiAqLworCQkgICAgfSBlbHNlIGlmKHlpc2ludD09MSkgCisJCQl6ID0gLXo7CQkvKiAoeDwwKSoqb2RkID0gLSh8eHwqKm9kZCkgKi8KKwkJfQorCQlyZXR1cm4gejsKKwkgICAgfQorCX0KKyAgICAKKyAgICAvKiBDWUdOVVMgTE9DQUwgKyBmZGxpYm0tNS4zIGZpeDogVGhpcyB1c2VkIHRvIGJlCisJbiA9IChoeD4+MzEpKzE7CisgICAgICAgYnV0IEFOU0kgQyBzYXlzIGEgcmlnaHQgc2hpZnQgb2YgYSBzaWduZWQgbmVnYXRpdmUgcXVhbnRpdHkgaXMKKyAgICAgICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgKi8KKwluID0gKCh1X2ludDMyX3QpaHg+PjMxKS0xOworCisgICAgLyogKHg8MCkqKihub24taW50KSBpcyBOYU4gKi8KKwlpZigobnx5aXNpbnQpPT0wKSByZXR1cm4gKHgteCkvKHgteCk7CisKKwlzID0gb25lOyAvKiBzIChzaWduIG9mIHJlc3VsdCAtdmUqKm9kZCkgPSAtMSBlbHNlID0gMSAqLworCWlmKChufCh5aXNpbnQtMSkpPT0wKSBzID0gLW9uZTsvKiAoLXZlKSoqKG9kZCBpbnQpICovCisKKyAgICAvKiB8eXwgaXMgaHVnZSAqLworCWlmKGl5PjB4NDFlMDAwMDApIHsgLyogaWYgfHl8ID4gMioqMzEgKi8KKwkgICAgaWYoaXk+MHg0M2YwMDAwMCl7CS8qIGlmIHx5fCA+IDIqKjY0LCBtdXN0IG8vdWZsb3cgKi8KKwkJaWYoaXg8PTB4M2ZlZmZmZmYpIHJldHVybiAoaHk8MCk/IGh1Z2UqaHVnZTp0aW55KnRpbnk7CisJCWlmKGl4Pj0weDNmZjAwMDAwKSByZXR1cm4gKGh5PjApPyBodWdlKmh1Z2U6dGlueSp0aW55OworCSAgICB9CisJLyogb3Zlci91bmRlcmZsb3cgaWYgeCBpcyBub3QgY2xvc2UgdG8gb25lICovCisJICAgIGlmKGl4PDB4M2ZlZmZmZmYpIHJldHVybiAoaHk8MCk/IHMqaHVnZSpodWdlOnMqdGlueSp0aW55OworCSAgICBpZihpeD4weDNmZjAwMDAwKSByZXR1cm4gKGh5PjApPyBzKmh1Z2UqaHVnZTpzKnRpbnkqdGlueTsKKwkvKiBub3cgfDEteHwgaXMgdGlueSA8PSAyKiotMjAsIHN1ZmZpY2UgdG8gY29tcHV0ZSAKKwkgICBsb2coeCkgYnkgeC14XjIvMit4XjMvMy14XjQvNCAqLworCSAgICB0ID0gYXgtb25lOwkJLyogdCBoYXMgMjAgdHJhaWxpbmcgemVyb3MgKi8KKwkgICAgdyA9ICh0KnQpKigwLjUtdCooMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzLXQqMC4yNSkpOworCSAgICB1ID0gaXZsbjJfaCp0OwkvKiBpdmxuMl9oIGhhcyAyMSBzaWcuIGJpdHMgKi8KKwkgICAgdiA9IHQqaXZsbjJfbC13Kml2bG4yOworCSAgICB0MSA9IHUrdjsKKwkgICAgU0VUX0xPV19XT1JEKHQxLDApOworCSAgICB0MiA9IHYtKHQxLXUpOworCX0gZWxzZSB7CisJICAgIGRvdWJsZSBzcyxzMixzX2gsc19sLHRfaCx0X2w7CisJICAgIG4gPSAwOworCS8qIHRha2UgY2FyZSBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIGlmKGl4PDB4MDAxMDAwMDApCisJCXtheCAqPSB0d281MzsgbiAtPSA1MzsgR0VUX0hJR0hfV09SRChpeCxheCk7IH0KKwkgICAgbiAgKz0gKChpeCk+PjIwKS0weDNmZjsKKwkgICAgaiAgPSBpeCYweDAwMGZmZmZmOworCS8qIGRldGVybWluZSBpbnRlcnZhbCAqLworCSAgICBpeCA9IGp8MHgzZmYwMDAwMDsJCS8qIG5vcm1hbGl6ZSBpeCAqLworCSAgICBpZihqPD0weDM5ODhFKSBrPTA7CQkvKiB8eHw8c3FydCgzLzIpICovCisJICAgIGVsc2UgaWYoajwweEJCNjdBKSBrPTE7CS8qIHx4fDxzcXJ0KDMpICAgKi8KKwkgICAgZWxzZSB7az0wO24rPTE7aXggLT0gMHgwMDEwMDAwMDt9CisJICAgIFNFVF9ISUdIX1dPUkQoYXgsaXgpOworCisJLyogY29tcHV0ZSBzcyA9IHNfaCtzX2wgPSAoeC0xKS8oeCsxKSBvciAoeC0xLjUpLyh4KzEuNSkgKi8KKwkgICAgdSA9IGF4LWJwW2tdOwkJLyogYnBbMF09MS4wLCBicFsxXT0xLjUgKi8KKwkgICAgdiA9IG9uZS8oYXgrYnBba10pOworCSAgICBzcyA9IHUqdjsKKwkgICAgc19oID0gc3M7CisJICAgIFNFVF9MT1dfV09SRChzX2gsMCk7CisJLyogdF9oPWF4K2JwW2tdIEhpZ2ggKi8KKwkgICAgdF9oID0gemVybzsKKwkgICAgU0VUX0hJR0hfV09SRCh0X2gsKChpeD4+MSl8MHgyMDAwMDAwMCkrMHgwMDA4MDAwMCsoazw8MTgpKTsKKwkgICAgdF9sID0gYXggLSAodF9oLWJwW2tdKTsKKwkgICAgc19sID0gdiooKHUtc19oKnRfaCktc19oKnRfbCk7CisJLyogY29tcHV0ZSBsb2coYXgpICovCisJICAgIHMyID0gc3Mqc3M7CisJICAgIHIgPSBzMipzMiooTDErczIqKEwyK3MyKihMMytzMiooTDQrczIqKEw1K3MyKkw2KSkpKSk7CisJICAgIHIgKz0gc19sKihzX2grc3MpOworCSAgICBzMiAgPSBzX2gqc19oOworCSAgICB0X2ggPSAzLjArczIrcjsKKwkgICAgU0VUX0xPV19XT1JEKHRfaCwwKTsKKwkgICAgdF9sID0gci0oKHRfaC0zLjApLXMyKTsKKwkvKiB1K3YgPSBzcyooMSsuLi4pICovCisJICAgIHUgPSBzX2gqdF9oOworCSAgICB2ID0gc19sKnRfaCt0X2wqc3M7CisJLyogMi8oM2xvZzIpKihzcysuLi4pICovCisJICAgIHBfaCA9IHUrdjsKKwkgICAgU0VUX0xPV19XT1JEKHBfaCwwKTsKKwkgICAgcF9sID0gdi0ocF9oLXUpOworCSAgICB6X2ggPSBjcF9oKnBfaDsJCS8qIGNwX2grY3BfbCA9IDIvKDMqbG9nMikgKi8KKwkgICAgel9sID0gY3BfbCpwX2grcF9sKmNwK2RwX2xba107CisJLyogbG9nMihheCkgPSAoc3MrLi4pKjIvKDMqbG9nMikgPSBuICsgZHBfaCArIHpfaCArIHpfbCAqLworCSAgICB0ID0gKGRvdWJsZSluOworCSAgICB0MSA9ICgoKHpfaCt6X2wpK2RwX2hba10pK3QpOworCSAgICBTRVRfTE9XX1dPUkQodDEsMCk7CisJICAgIHQyID0gel9sLSgoKHQxLXQpLWRwX2hba10pLXpfaCk7CisJfQorCisgICAgLyogc3BsaXQgdXAgeSBpbnRvIHkxK3kyIGFuZCBjb21wdXRlICh5MSt5MikqKHQxK3QyKSAqLworCXkxICA9IHk7CisJU0VUX0xPV19XT1JEKHkxLDApOworCXBfbCA9ICh5LXkxKSp0MSt5KnQyOworCXBfaCA9IHkxKnQxOworCXogPSBwX2wrcF9oOworCUVYVFJBQ1RfV09SRFMoaixpLHopOworCWlmIChqPj0weDQwOTAwMDAwKSB7CQkJCS8qIHogPj0gMTAyNCAqLworCSAgICBpZigoKGotMHg0MDkwMDAwMCl8aSkhPTApCQkJLyogaWYgeiA+IDEwMjQgKi8KKwkJcmV0dXJuIHMqaHVnZSpodWdlOwkJCS8qIG92ZXJmbG93ICovCisJICAgIGVsc2UgeworCQlpZihwX2wrb3Z0PnotcF9oKSByZXR1cm4gcypodWdlKmh1Z2U7CS8qIG92ZXJmbG93ICovCisJICAgIH0KKwl9IGVsc2UgaWYoKGomMHg3ZmZmZmZmZik+PTB4NDA5MGNjMDAgKSB7CS8qIHogPD0gLTEwNzUgKi8KKwkgICAgaWYoKChqLTB4YzA5MGNjMDApfGkpIT0wKSAJCS8qIHogPCAtMTA3NSAqLworCQlyZXR1cm4gcyp0aW55KnRpbnk7CQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgZWxzZSB7CisJCWlmKHBfbDw9ei1wX2gpIHJldHVybiBzKnRpbnkqdGlueTsJLyogdW5kZXJmbG93ICovCisJICAgIH0KKwl9CisgICAgLyoKKyAgICAgKiBjb21wdXRlIDIqKihwX2grcF9sKQorICAgICAqLworCWkgPSBqJjB4N2ZmZmZmZmY7CisJayA9IChpPj4yMCktMHgzZmY7CisJbiA9IDA7CisJaWYoaT4weDNmZTAwMDAwKSB7CQkvKiBpZiB8enwgPiAwLjUsIHNldCBuID0gW3orMC41XSAqLworCSAgICBuID0gaisoMHgwMDEwMDAwMD4+KGsrMSkpOworCSAgICBrID0gKChuJjB4N2ZmZmZmZmYpPj4yMCktMHgzZmY7CS8qIG5ldyBrIGZvciBuICovCisJICAgIHQgPSB6ZXJvOworCSAgICBTRVRfSElHSF9XT1JEKHQsbiZ+KDB4MDAwZmZmZmY+PmspKTsKKwkgICAgbiA9ICgobiYweDAwMGZmZmZmKXwweDAwMTAwMDAwKT4+KDIwLWspOworCSAgICBpZihqPDApIG4gPSAtbjsKKwkgICAgcF9oIC09IHQ7CisJfSAKKwl0ID0gcF9sK3BfaDsKKwlTRVRfTE9XX1dPUkQodCwwKTsKKwl1ID0gdCpsZzJfaDsKKwl2ID0gKHBfbC0odC1wX2gpKSpsZzIrdCpsZzJfbDsKKwl6ID0gdSt2OworCXcgPSB2LSh6LXUpOworCXQgID0geip6OworCXQxICA9IHogLSB0KihQMSt0KihQMit0KihQMyt0KihQNCt0KlA1KSkpKTsKKwlyICA9ICh6KnQxKS8odDEtdHdvKS0odyt6KncpOworCXogID0gb25lLShyLXopOworCUdFVF9ISUdIX1dPUkQoaix6KTsKKwlqICs9IChuPDwyMCk7CisJaWYoKGo+PjIwKTw9MCkgeiA9IHNjYWxibih6LG4pOwkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJZWxzZSBTRVRfSElHSF9XT1JEKHosaik7CisJcmV0dXJuIHMqejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcG93Zi5jIGIvbGlibS9zcmMvZV9wb3dmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMDhkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcG93Zi5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKiBlX3Bvd2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfcG93LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3Bvd2YuYyx2IDEuMTIgMjAwNC8wNi8wMSAxOTozMzozMCBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorYnBbXSA9IHsxLjAsIDEuNSx9LAorZHBfaFtdID0geyAwLjAsIDUuODQ5NjA5MzhlLTAxLH0sIC8qIDB4M2YxNWMwMDAgKi8KK2RwX2xbXSA9IHsgMC4wLCAxLjU2MzIyMDg1ZS0wNix9LCAvKiAweDM1ZDFjZmRjICovCit6ZXJvICAgID0gIDAuMCwKK29uZQk9ICAxLjAsCit0d28JPSAgMi4wLAordHdvMjQJPSAgMTY3NzcyMTYuMCwJLyogMHg0YjgwMDAwMCAqLworaHVnZQk9ICAxLjBlMzAsCit0aW55ICAgID0gIDEuMGUtMzAsCisJLyogcG9seSBjb2VmcyBmb3IgKDMvMikqKGxvZyh4KS0ycy0yLzMqcyoqMyAqLworTDEgID0gIDYuMDAwMDAwMjM4NGUtMDEsIC8qIDB4M2YxOTk5OWEgKi8KK0wyICA9ICA0LjI4NTcxNDMyODNlLTAxLCAvKiAweDNlZGI2ZGI3ICovCitMMyAgPSAgMy4zMzMzMzM0MzI3ZS0wMSwgLyogMHgzZWFhYWFhYiAqLworTDQgID0gIDIuNzI3MjgxMTUzMmUtMDEsIC8qIDB4M2U4YmEzMDUgKi8KK0w1ICA9ICAyLjMwNjYwNzUxNDZlLTAxLCAvKiAweDNlNmMzMjU1ICovCitMNiAgPSAgMi4wNjk3NTAxMzAyZS0wMSwgLyogMHgzZTUzZjE0MiAqLworUDEgICA9ICAxLjY2NjY2NjcxNjNlLTAxLCAvKiAweDNlMmFhYWFiICovCitQMiAgID0gLTIuNzc3Nzc3ODQ1MGUtMDMsIC8qIDB4YmIzNjBiNjEgKi8KK1AzICAgPSAgNi42MTM3NTU5NzcwZS0wNSwgLyogMHgzODhhYjM1NSAqLworUDQgICA9IC0xLjY1MzM5MDE5OTllLTA2LCAvKiAweGI1ZGRlYTBlICovCitQNSAgID0gIDQuMTM4MTM2OTQ0MmUtMDgsIC8qIDB4MzMzMWJiNGMgKi8KK2xnMiAgPSAgNi45MzE0NzE4MjQ2ZS0wMSwgLyogMHgzZjMxNzIxOCAqLworbGcyX2ggID0gIDYuOTMxNDU3NTJlLTAxLCAvKiAweDNmMzE3MjAwICovCitsZzJfbCAgPSAgMS40Mjg2MDY1NGUtMDYsIC8qIDB4MzViZmJlOGMgKi8KK292dCA9ICA0LjI5OTU2NjU2OTRlLTA4LCAvKiAtKDEyOC1sb2cyKG92ZmwrLjV1bHApKSAqLworY3AgICAgPSAgOS42MTc5NjcwMDk1ZS0wMSwgLyogMHgzZjc2Mzg0ZiA9Mi8oM2xuMikgKi8KK2NwX2ggID0gIDkuNjE3OTE5OTIxOWUtMDEsIC8qIDB4M2Y3NjM4MDAgPWhlYWQgb2YgY3AgKi8KK2NwX2wgID0gIDQuNzAxNzM4MzYyMmUtMDYsIC8qIDB4MzY5ZGMzYTAgPXRhaWwgb2YgY3BfaCAqLworaXZsbjIgICAgPSAgMS40NDI2OTUwMjE2ZSswMCwgLyogMHgzZmI4YWEzYiA9MS9sbjIgKi8KK2l2bG4yX2ggID0gIDEuNDQyNjg3OTg4M2UrMDAsIC8qIDB4M2ZiOGFhMDAgPTE2YiAxL2xuMiovCitpdmxuMl9sICA9ICA3LjA1MjYwNzU0MzNlLTA2OyAvKiAweDM2ZWNhNTcwID0xL2xuMiB0YWlsKi8KKworZmxvYXQKK19faWVlZTc1NF9wb3dmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJZmxvYXQgeixheCx6X2gsel9sLHBfaCxwX2w7CisJZmxvYXQgeTEsdDEsdDIscixzLHNuLHQsdSx2LHc7CisJaW50MzJfdCBpLGosayx5aXNpbnQsbjsKKwlpbnQzMl90IGh4LGh5LGl4LGl5LGlzOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJaXggPSBoeCYweDdmZmZmZmZmOyAgaXkgPSBoeSYweDdmZmZmZmZmOworCisgICAgLyogeT09emVybzogeCoqMCA9IDEgKi8KKwlpZihpeT09MCkgcmV0dXJuIG9uZTsKKworICAgIC8qICstTmFOIHJldHVybiB4K3kgKi8KKwlpZihpeCA+IDB4N2Y4MDAwMDAgfHwKKwkgICBpeSA+IDB4N2Y4MDAwMDApCisJCXJldHVybiB4K3k7CisKKyAgICAvKiBkZXRlcm1pbmUgaWYgeSBpcyBhbiBvZGQgaW50IHdoZW4geCA8IDAKKyAgICAgKiB5aXNpbnQgPSAwCS4uLiB5IGlzIG5vdCBhbiBpbnRlZ2VyCisgICAgICogeWlzaW50ID0gMQkuLi4geSBpcyBhbiBvZGQgaW50CisgICAgICogeWlzaW50ID0gMgkuLi4geSBpcyBhbiBldmVuIGludAorICAgICAqLworCXlpc2ludCAgPSAwOworCWlmKGh4PDApIHsKKwkgICAgaWYoaXk+PTB4NGI4MDAwMDApIHlpc2ludCA9IDI7IC8qIGV2ZW4gaW50ZWdlciB5ICovCisJICAgIGVsc2UgaWYoaXk+PTB4M2Y4MDAwMDApIHsKKwkJayA9IChpeT4+MjMpLTB4N2Y7CSAgIC8qIGV4cG9uZW50ICovCisJCWogPSBpeT4+KDIzLWspOworCQlpZigoajw8KDIzLWspKT09aXkpIHlpc2ludCA9IDItKGomMSk7CisJICAgIH0KKwl9CisKKyAgICAvKiBzcGVjaWFsIHZhbHVlIG9mIHkgKi8KKwlpZiAoaXk9PTB4N2Y4MDAwMDApIHsJLyogeSBpcyArLWluZiAqLworCSAgICBpZiAoaXg9PTB4M2Y4MDAwMDApCisJICAgICAgICByZXR1cm4gIHkgLSB5OwkvKiBpbmYqKistMSBpcyBOYU4gKi8KKwkgICAgZWxzZSBpZiAoaXggPiAweDNmODAwMDAwKS8qICh8eHw+MSkqKistaW5mID0gaW5mLDAgKi8KKwkgICAgICAgIHJldHVybiAoaHk+PTApPyB5OiB6ZXJvOworCSAgICBlbHNlCQkJLyogKHx4fDwxKSoqLSwraW5mID0gaW5mLDAgKi8KKwkgICAgICAgIHJldHVybiAoaHk8MCk/LXk6IHplcm87CisJfQorCWlmKGl5PT0weDNmODAwMDAwKSB7CS8qIHkgaXMgICstMSAqLworCSAgICBpZihoeTwwKSByZXR1cm4gb25lL3g7IGVsc2UgcmV0dXJuIHg7CisJfQorCWlmKGh5PT0weDQwMDAwMDAwKSByZXR1cm4geCp4OyAvKiB5IGlzICAyICovCisJaWYoaHk9PTB4M2YwMDAwMDApIHsJLyogeSBpcyAgMC41ICovCisJICAgIGlmKGh4Pj0wKQkvKiB4ID49ICswICovCisJICAgIHJldHVybiBfX2llZWU3NTRfc3FydGYoeCk7CisJfQorCisJYXggICA9IGZhYnNmKHgpOworICAgIC8qIHNwZWNpYWwgdmFsdWUgb2YgeCAqLworCWlmKGl4PT0weDdmODAwMDAwfHxpeD09MHx8aXg9PTB4M2Y4MDAwMDApeworCSAgICB6ID0gYXg7CQkJLyp4IGlzICstMCwrLWluZiwrLTEqLworCSAgICBpZihoeTwwKSB6ID0gb25lL3o7CS8qIHogPSAoMS98eHwpICovCisJICAgIGlmKGh4PDApIHsKKwkJaWYoKChpeC0weDNmODAwMDAwKXx5aXNpbnQpPT0wKSB7CisJCSAgICB6ID0gKHoteikvKHoteik7IC8qICgtMSkqKm5vbi1pbnQgaXMgTmFOICovCisJCX0gZWxzZSBpZih5aXNpbnQ9PTEpCisJCSAgICB6ID0gLXo7CQkvKiAoeDwwKSoqb2RkID0gLSh8eHwqKm9kZCkgKi8KKwkgICAgfQorCSAgICByZXR1cm4gejsKKwl9CisKKwluID0gKCh1X2ludDMyX3QpaHg+PjMxKS0xOworCisgICAgLyogKHg8MCkqKihub24taW50KSBpcyBOYU4gKi8KKwlpZigobnx5aXNpbnQpPT0wKSByZXR1cm4gKHgteCkvKHgteCk7CisKKwlzbiA9IG9uZTsgLyogcyAoc2lnbiBvZiByZXN1bHQgLXZlKipvZGQpID0gLTEgZWxzZSA9IDEgKi8KKwlpZigobnwoeWlzaW50LTEpKT09MCkgc24gPSAtb25lOy8qICgtdmUpKioob2RkIGludCkgKi8KKworICAgIC8qIHx5fCBpcyBodWdlICovCisJaWYoaXk+MHg0ZDAwMDAwMCkgeyAvKiBpZiB8eXwgPiAyKioyNyAqLworCS8qIG92ZXIvdW5kZXJmbG93IGlmIHggaXMgbm90IGNsb3NlIHRvIG9uZSAqLworCSAgICBpZihpeDwweDNmN2ZmZmY4KSByZXR1cm4gKGh5PDApPyBzbipodWdlKmh1Z2U6c24qdGlueSp0aW55OworCSAgICBpZihpeD4weDNmODAwMDA3KSByZXR1cm4gKGh5PjApPyBzbipodWdlKmh1Z2U6c24qdGlueSp0aW55OworCS8qIG5vdyB8MS14fCBpcyB0aW55IDw9IDIqKi0yMCwgc3VmZmljZSB0byBjb21wdXRlCisJICAgbG9nKHgpIGJ5IHgteF4yLzIreF4zLzMteF40LzQgKi8KKwkgICAgdCA9IGF4LTE7CQkvKiB0IGhhcyAyMCB0cmFpbGluZyB6ZXJvcyAqLworCSAgICB3ID0gKHQqdCkqKChmbG9hdCkwLjUtdCooKGZsb2F0KTAuMzMzMzMzMzMzMzMzLXQqKGZsb2F0KTAuMjUpKTsKKwkgICAgdSA9IGl2bG4yX2gqdDsJLyogaXZsbjJfaCBoYXMgMTYgc2lnLiBiaXRzICovCisJICAgIHYgPSB0Kml2bG4yX2wtdyppdmxuMjsKKwkgICAgdDEgPSB1K3Y7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHQxKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaXMmMHhmZmZmZjAwMCk7CisJICAgIHQyID0gdi0odDEtdSk7CisJfSBlbHNlIHsKKwkgICAgZmxvYXQgczIsc19oLHNfbCx0X2gsdF9sOworCSAgICBuID0gMDsKKwkvKiB0YWtlIGNhcmUgc3Vibm9ybWFsIG51bWJlciAqLworCSAgICBpZihpeDwweDAwODAwMDAwKQorCQl7YXggKj0gdHdvMjQ7IG4gLT0gMjQ7IEdFVF9GTE9BVF9XT1JEKGl4LGF4KTsgfQorCSAgICBuICArPSAoKGl4KT4+MjMpLTB4N2Y7CisJICAgIGogID0gaXgmMHgwMDdmZmZmZjsKKwkvKiBkZXRlcm1pbmUgaW50ZXJ2YWwgKi8KKwkgICAgaXggPSBqfDB4M2Y4MDAwMDA7CQkvKiBub3JtYWxpemUgaXggKi8KKwkgICAgaWYoajw9MHgxY2M0NzEpIGs9MDsJLyogfHh8PHNxcnQoMy8yKSAqLworCSAgICBlbHNlIGlmKGo8MHg1ZGIzZDcpIGs9MTsJLyogfHh8PHNxcnQoMykgICAqLworCSAgICBlbHNlIHtrPTA7bis9MTtpeCAtPSAweDAwODAwMDAwO30KKwkgICAgU0VUX0ZMT0FUX1dPUkQoYXgsaXgpOworCisJLyogY29tcHV0ZSBzID0gc19oK3NfbCA9ICh4LTEpLyh4KzEpIG9yICh4LTEuNSkvKHgrMS41KSAqLworCSAgICB1ID0gYXgtYnBba107CQkvKiBicFswXT0xLjAsIGJwWzFdPTEuNSAqLworCSAgICB2ID0gb25lLyhheCticFtrXSk7CisJICAgIHMgPSB1KnY7CisJICAgIHNfaCA9IHM7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHNfaCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHNfaCxpcyYweGZmZmZmMDAwKTsKKwkvKiB0X2g9YXgrYnBba10gSGlnaCAqLworCSAgICBpcyA9ICgoaXg+PjEpJjB4ZmZmZmYwMDApfDB4MjAwMDAwMDA7CisJICAgIFNFVF9GTE9BVF9XT1JEKHRfaCxpcysweDAwNDAwMDAwKyhrPDwyMSkpOworCSAgICB0X2wgPSBheCAtICh0X2gtYnBba10pOworCSAgICBzX2wgPSB2KigodS1zX2gqdF9oKS1zX2gqdF9sKTsKKwkvKiBjb21wdXRlIGxvZyhheCkgKi8KKwkgICAgczIgPSBzKnM7CisJICAgIHIgPSBzMipzMiooTDErczIqKEwyK3MyKihMMytzMiooTDQrczIqKEw1K3MyKkw2KSkpKSk7CisJICAgIHIgKz0gc19sKihzX2grcyk7CisJICAgIHMyICA9IHNfaCpzX2g7CisJICAgIHRfaCA9IChmbG9hdCkzLjArczIrcjsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsdF9oKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodF9oLGlzJjB4ZmZmZmYwMDApOworCSAgICB0X2wgPSByLSgodF9oLShmbG9hdCkzLjApLXMyKTsKKwkvKiB1K3YgPSBzKigxKy4uLikgKi8KKwkgICAgdSA9IHNfaCp0X2g7CisJICAgIHYgPSBzX2wqdF9oK3RfbCpzOworCS8qIDIvKDNsb2cyKSoocysuLi4pICovCisJICAgIHBfaCA9IHUrdjsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMscF9oKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQocF9oLGlzJjB4ZmZmZmYwMDApOworCSAgICBwX2wgPSB2LShwX2gtdSk7CisJICAgIHpfaCA9IGNwX2gqcF9oOwkJLyogY3BfaCtjcF9sID0gMi8oMypsb2cyKSAqLworCSAgICB6X2wgPSBjcF9sKnBfaCtwX2wqY3ArZHBfbFtrXTsKKwkvKiBsb2cyKGF4KSA9IChzKy4uKSoyLygzKmxvZzIpID0gbiArIGRwX2ggKyB6X2ggKyB6X2wgKi8KKwkgICAgdCA9IChmbG9hdCluOworCSAgICB0MSA9ICgoKHpfaCt6X2wpK2RwX2hba10pK3QpOworCSAgICBHRVRfRkxPQVRfV09SRChpcyx0MSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHQxLGlzJjB4ZmZmZmYwMDApOworCSAgICB0MiA9IHpfbC0oKCh0MS10KS1kcF9oW2tdKS16X2gpOworCX0KKworICAgIC8qIHNwbGl0IHVwIHkgaW50byB5MSt5MiBhbmQgY29tcHV0ZSAoeTEreTIpKih0MSt0MikgKi8KKwlHRVRfRkxPQVRfV09SRChpcyx5KTsKKwlTRVRfRkxPQVRfV09SRCh5MSxpcyYweGZmZmZmMDAwKTsKKwlwX2wgPSAoeS15MSkqdDEreSp0MjsKKwlwX2ggPSB5MSp0MTsKKwl6ID0gcF9sK3BfaDsKKwlHRVRfRkxPQVRfV09SRChqLHopOworCWlmIChqPjB4NDMwMDAwMDApCQkJCS8qIGlmIHogPiAxMjggKi8KKwkgICAgcmV0dXJuIHNuKmh1Z2UqaHVnZTsJCQkvKiBvdmVyZmxvdyAqLworCWVsc2UgaWYgKGo9PTB4NDMwMDAwMDApIHsJCQkvKiBpZiB6ID09IDEyOCAqLworCSAgICBpZihwX2wrb3Z0PnotcF9oKSByZXR1cm4gc24qaHVnZSpodWdlOwkvKiBvdmVyZmxvdyAqLworCX0KKwllbHNlIGlmICgoaiYweDdmZmZmZmZmKT4weDQzMTYwMDAwKQkJLyogeiA8PSAtMTUwICovCisJICAgIHJldHVybiBzbip0aW55KnRpbnk7CQkJLyogdW5kZXJmbG93ICovCisJZWxzZSBpZiAoaj09MHhjMzE2MDAwMCl7CQkJLyogeiA9PSAtMTUwICovCisJICAgIGlmKHBfbDw9ei1wX2gpIHJldHVybiBzbip0aW55KnRpbnk7CQkvKiB1bmRlcmZsb3cgKi8KKwl9CisgICAgLyoKKyAgICAgKiBjb21wdXRlIDIqKihwX2grcF9sKQorICAgICAqLworCWkgPSBqJjB4N2ZmZmZmZmY7CisJayA9IChpPj4yMyktMHg3ZjsKKwluID0gMDsKKwlpZihpPjB4M2YwMDAwMDApIHsJCS8qIGlmIHx6fCA+IDAuNSwgc2V0IG4gPSBbeiswLjVdICovCisJICAgIG4gPSBqKygweDAwODAwMDAwPj4oaysxKSk7CisJICAgIGsgPSAoKG4mMHg3ZmZmZmZmZik+PjIzKS0weDdmOwkvKiBuZXcgayBmb3IgbiAqLworCSAgICBTRVRfRkxPQVRfV09SRCh0LG4mfigweDAwN2ZmZmZmPj5rKSk7CisJICAgIG4gPSAoKG4mMHgwMDdmZmZmZil8MHgwMDgwMDAwMCk+PigyMy1rKTsKKwkgICAgaWYoajwwKSBuID0gLW47CisJICAgIHBfaCAtPSB0OworCX0KKwl0ID0gcF9sK3BfaDsKKwlHRVRfRkxPQVRfV09SRChpcyx0KTsKKwlTRVRfRkxPQVRfV09SRCh0LGlzJjB4ZmZmZjgwMDApOworCXUgPSB0KmxnMl9oOworCXYgPSAocF9sLSh0LXBfaCkpKmxnMit0KmxnMl9sOworCXogPSB1K3Y7CisJdyA9IHYtKHotdSk7CisJdCAgPSB6Kno7CisJdDEgID0geiAtIHQqKFAxK3QqKFAyK3QqKFAzK3QqKFA0K3QqUDUpKSkpOworCXIgID0gKHoqdDEpLyh0MS10d28pLSh3K3oqdyk7CisJeiAgPSBvbmUtKHIteik7CisJR0VUX0ZMT0FUX1dPUkQoaix6KTsKKwlqICs9IChuPDwyMyk7CisJaWYoKGo+PjIzKTw9MCkgeiA9IHNjYWxibmYoeixuKTsJLyogc3Vibm9ybWFsIG91dHB1dCAqLworCWVsc2UgU0VUX0ZMT0FUX1dPUkQoeixqKTsKKwlyZXR1cm4gc24qejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcmVtX3BpbzIuYyBiL2xpYm0vc3JjL2VfcmVtX3BpbzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFiYTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9yZW1fcGlvMi5jCkBAIC0wLDAgKzEsMTY4IEBACisKKy8qIEAoIyllX3JlbV9waW8yLmMgMS40IDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3JlbV9waW8yLmMsdiAxLjggMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9yZW1fcGlvMih4LHkpCisgKiAKKyAqIHJldHVybiB0aGUgcmVtYWluZGVyIG9mIHggcmVtIHBpLzIgaW4geVswXSt5WzFdIAorICogdXNlIF9fa2VybmVsX3JlbV9waW8yKCkKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKgorICogVGFibGUgb2YgY29uc3RhbnRzIGZvciAyL3BpLCAzOTYgSGV4IGRpZ2l0cyAoNDc2IGRlY2ltYWwpIG9mIDIvcGkgCisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IHR3b19vdmVyX3BpW10gPSB7CisweEEyRjk4MywgMHg2RTRFNDQsIDB4MTUyOUZDLCAweDI3NTdEMSwgMHhGNTM0REQsIDB4QzBEQjYyLCAKKzB4OTU5OTNDLCAweDQzOTA0MSwgMHhGRTUxNjMsIDB4QUJERUJCLCAweEM1NjFCNywgMHgyNDZFM0EsIAorMHg0MjRERDIsIDB4RTAwNjQ5LCAweDJFRUEwOSwgMHhEMTkyMUMsIDB4RkUxREVCLCAweDFDQjEyOSwgCisweEE3M0VFOCwgMHg4MjM1RjUsIDB4MkVCQjQ0LCAweDg0RTk5QywgMHg3MDI2QjQsIDB4NUY3RTQxLCAKKzB4Mzk5MUQ2LCAweDM5ODM1MywgMHgzOUY0OUMsIDB4ODQ1RjhCLCAweEJERjkyOCwgMHgzQjFGRjgsIAorMHg5N0ZGREUsIDB4MDU5ODBGLCAweEVGMkYxMSwgMHg4QjVBMEEsIDB4NkQxRjZELCAweDM2N0VDRiwgCisweDI3Q0IwOSwgMHhCNzRGNDYsIDB4M0Y2NjlFLCAweDVGRUEyRCwgMHg3NTI3QkEsIDB4QzdFQkU1LCAKKzB4RjE3QjNELCAweDA3MzlGNywgMHg4QTUyOTIsIDB4RUE2QkZCLCAweDVGQjExRiwgMHg4RDVEMDgsIAorMHg1NjAzMzAsIDB4NDZGQzdCLCAweDZCQUJGMCwgMHhDRkJDMjAsIDB4OUFGNDM2LCAweDFEQTlFMywgCisweDkxNjE1RSwgMHhFNjFCMDgsIDB4NjU5OTg1LCAweDVGMTRBMCwgMHg2ODQwOEQsIDB4RkZEODgwLCAKKzB4NEQ3MzI3LCAweDMxMDYwNiwgMHgxNTU2Q0EsIDB4NzNBOEM5LCAweDYwRTI3QiwgMHhDMDhDNkIsIAorfTsKKworc3RhdGljIGNvbnN0IGludDMyX3QgbnBpbzJfaHdbXSA9IHsKKzB4M0ZGOTIxRkIsIDB4NDAwOTIxRkIsIDB4NDAxMkQ5N0MsIDB4NDAxOTIxRkIsIDB4NDAxRjZBN0EsIDB4NDAyMkQ5N0MsCisweDQwMjVGREJCLCAweDQwMjkyMUZCLCAweDQwMkM0NjNBLCAweDQwMkY2QTdBLCAweDQwMzE0NzVDLCAweDQwMzJEOTdDLAorMHg0MDM0NkI5QywgMHg0MDM1RkRCQiwgMHg0MDM3OEZEQiwgMHg0MDM5MjFGQiwgMHg0MDNBQjQxQiwgMHg0MDNDNDYzQSwKKzB4NDAzREQ4NUEsIDB4NDAzRjZBN0EsIDB4NDA0MDdFNEMsIDB4NDA0MTQ3NUMsIDB4NDA0MjEwNkMsIDB4NDA0MkQ5N0MsCisweDQwNDNBMjhDLCAweDQwNDQ2QjlDLCAweDQwNDUzNEFDLCAweDQwNDVGREJCLCAweDQwNDZDNkNCLCAweDQwNDc4RkRCLAorMHg0MDQ4NThFQiwgMHg0MDQ5MjFGQiwKK307CisKKy8qCisgKiBpbnZwaW8yOiAgNTMgYml0cyBvZiAyL3BpCisgKiBwaW8yXzE6ICAgZmlyc3QgIDMzIGJpdCBvZiBwaS8yCisgKiBwaW8yXzF0OiAgcGkvMiAtIHBpbzJfMQorICogcGlvMl8yOiAgIHNlY29uZCAzMyBiaXQgb2YgcGkvMgorICogcGlvMl8ydDogIHBpLzIgLSAocGlvMl8xK3BpbzJfMikKKyAqIHBpbzJfMzogICB0aGlyZCAgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfM3Q6ICBwaS8yIC0gKHBpbzJfMStwaW8yXzIrcGlvMl8zKQorICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3plcm8gPSAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KK2hhbGYgPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3bzI0ID0gIDEuNjc3NzIxNjAwMDAwMDAwMDAwMDBlKzA3LCAvKiAweDQxNzAwMDAwLCAweDAwMDAwMDAwICovCitpbnZwaW8yID0gIDYuMzY2MTk3NzIzNjc1ODEzODI0MzNlLTAxLCAvKiAweDNGRTQ1RjMwLCAweDZEQzlDODgzICovCitwaW8yXzEgID0gIDEuNTcwNzk2MzI2NzM0MTI1NjE0MTdlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDAwMDAwICovCitwaW8yXzF0ID0gIDYuMDc3MTAwNTA2NTA2MTkyMjQ5MzJlLTExLCAvKiAweDNERDBCNDYxLCAweDFBNjI2MzMxICovCitwaW8yXzIgID0gIDYuMDc3MTAwNTA2MzAzOTY1OTc2NjBlLTExLCAvKiAweDNERDBCNDYxLCAweDFBNjAwMDAwICovCitwaW8yXzJ0ID0gIDIuMDIyMjY2MjQ4Nzk1OTUwNjMxNTRlLTIxLCAvKiAweDNCQTMxOThBLCAweDJFMDM3MDczICovCitwaW8yXzMgID0gIDIuMDIyMjY2MjQ4NzExMTY2NDU1ODBlLTIxLCAvKiAweDNCQTMxOThBLCAweDJFMDAwMDAwICovCitwaW8yXzN0ID0gIDguNDc4NDI3NjYwMzY4ODk5NTY5OTdlLTMyOyAvKiAweDM5N0I4MzlBLCAweDI1MjA0OUMxICovCisKKwlpbnQzMl90IF9faWVlZTc1NF9yZW1fcGlvMihkb3VibGUgeCwgZG91YmxlICp5KQoreworCWRvdWJsZSB6LHcsdCxyLGZuOworCWRvdWJsZSB0eFszXTsKKwlpbnQzMl90IGUwLGksaixueCxuLGl4LGh4OworCXVfaW50MzJfdCBsb3c7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOwkJLyogaGlnaCB3b3JkIG9mIHggKi8KKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg8PTB4M2ZlOTIxZmIpICAgLyogfHh8IH48PSBwaS80ICwgbm8gbmVlZCBmb3IgcmVkdWN0aW9uICovCisJICAgIHt5WzBdID0geDsgeVsxXSA9IDA7IHJldHVybiAwO30KKwlpZihpeDwweDQwMDJkOTdjKSB7ICAvKiB8eHwgPCAzcGkvNCwgc3BlY2lhbCBjYXNlIHdpdGggbj0rLTEgKi8KKwkgICAgaWYoaHg+MCkgeyAKKwkJeiA9IHggLSBwaW8yXzE7CisJCWlmKGl4IT0weDNmZjkyMWZiKSB7IAkvKiAzMys1MyBiaXQgcGkgaXMgZ29vZCBlbm91Z2ggKi8KKwkJICAgIHlbMF0gPSB6IC0gcGlvMl8xdDsKKwkJICAgIHlbMV0gPSAoei15WzBdKS1waW8yXzF0OworCQl9IGVsc2UgewkJLyogbmVhciBwaS8yLCB1c2UgMzMrMzMrNTMgYml0IHBpICovCisJCSAgICB6IC09IHBpbzJfMjsKKwkJICAgIHlbMF0gPSB6IC0gcGlvMl8ydDsKKwkJICAgIHlbMV0gPSAoei15WzBdKS1waW8yXzJ0OworCQl9CisJCXJldHVybiAxOworCSAgICB9IGVsc2UgewkvKiBuZWdhdGl2ZSB4ICovCisJCXogPSB4ICsgcGlvMl8xOworCQlpZihpeCE9MHgzZmY5MjFmYikgeyAJLyogMzMrNTMgYml0IHBpIGlzIGdvb2QgZW5vdWdoICovCisJCSAgICB5WzBdID0geiArIHBpbzJfMXQ7CisJCSAgICB5WzFdID0gKHoteVswXSkrcGlvMl8xdDsKKwkJfSBlbHNlIHsJCS8qIG5lYXIgcGkvMiwgdXNlIDMzKzMzKzUzIGJpdCBwaSAqLworCQkgICAgeiArPSBwaW8yXzI7CisJCSAgICB5WzBdID0geiArIHBpbzJfMnQ7CisJCSAgICB5WzFdID0gKHoteVswXSkrcGlvMl8ydDsKKwkJfQorCQlyZXR1cm4gLTE7CisJICAgIH0KKwl9CisJaWYoaXg8PTB4NDEzOTIxZmIpIHsgLyogfHh8IH48PSAyXjE5KihwaS8yKSwgbWVkaXVtIHNpemUgKi8KKwkgICAgdCAgPSBmYWJzKHgpOworCSAgICBuICA9IChpbnQzMl90KSAodCppbnZwaW8yK2hhbGYpOworCSAgICBmbiA9IChkb3VibGUpbjsKKwkgICAgciAgPSB0LWZuKnBpbzJfMTsKKwkgICAgdyAgPSBmbipwaW8yXzF0OwkvKiAxc3Qgcm91bmQgZ29vZCB0byA4NSBiaXQgKi8KKwkgICAgaWYobjwzMiYmaXghPW5waW8yX2h3W24tMV0pIHsJCisJCXlbMF0gPSByLXc7CS8qIHF1aWNrIGNoZWNrIG5vIGNhbmNlbGxhdGlvbiAqLworCSAgICB9IGVsc2UgeworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgICAgICBqICA9IGl4Pj4yMDsKKwkgICAgICAgIHlbMF0gPSByLXc7IAorCQlHRVRfSElHSF9XT1JEKGhpZ2gseVswXSk7CisJICAgICAgICBpID0gai0oKGhpZ2g+PjIwKSYweDdmZik7CisJICAgICAgICBpZihpPjE2KSB7ICAvKiAybmQgaXRlcmF0aW9uIG5lZWRlZCwgZ29vZCB0byAxMTggKi8KKwkJICAgIHQgID0gcjsKKwkJICAgIHcgID0gZm4qcGlvMl8yOwkKKwkJICAgIHIgID0gdC13OworCQkgICAgdyAgPSBmbipwaW8yXzJ0LSgodC1yKS13KTsJCisJCSAgICB5WzBdID0gci13OworCQkgICAgR0VUX0hJR0hfV09SRChoaWdoLHlbMF0pOworCQkgICAgaSA9IGotKChoaWdoPj4yMCkmMHg3ZmYpOworCQkgICAgaWYoaT40OSkgIHsJLyogM3JkIGl0ZXJhdGlvbiBuZWVkLCAxNTEgYml0cyBhY2MgKi8KKwkJICAgIAl0ICA9IHI7CS8qIHdpbGwgY292ZXIgYWxsIHBvc3NpYmxlIGNhc2VzICovCisJCSAgICAJdyAgPSBmbipwaW8yXzM7CQorCQkgICAgCXIgID0gdC13OworCQkgICAgCXcgID0gZm4qcGlvMl8zdC0oKHQtciktdyk7CQorCQkgICAgCXlbMF0gPSByLXc7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICB5WzFdID0gKHIteVswXSktdzsKKwkgICAgaWYoaHg8MCkgCXt5WzBdID0gLXlbMF07IHlbMV0gPSAteVsxXTsgcmV0dXJuIC1uO30KKwkgICAgZWxzZQkgcmV0dXJuIG47CisJfQorICAgIC8qIAorICAgICAqIGFsbCBvdGhlciAobGFyZ2UpIGFyZ3VtZW50cworICAgICAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSB7CQkvKiB4IGlzIGluZiBvciBOYU4gKi8KKwkgICAgeVswXT15WzFdPXgteDsgcmV0dXJuIDA7CisJfQorICAgIC8qIHNldCB6ID0gc2NhbGJuKHx4fCxpbG9nYih4KS0yMykgKi8KKwlHRVRfTE9XX1dPUkQobG93LHgpOworCVNFVF9MT1dfV09SRCh6LGxvdyk7CisJZTAgCT0gKGl4Pj4yMCktMTA0NjsJLyogZTAgPSBpbG9nYih6KS0yMzsgKi8KKwlTRVRfSElHSF9XT1JEKHosIGl4IC0gKChpbnQzMl90KShlMDw8MjApKSk7CisJZm9yKGk9MDtpPDI7aSsrKSB7CisJCXR4W2ldID0gKGRvdWJsZSkoKGludDMyX3QpKHopKTsKKwkJeiAgICAgPSAoei10eFtpXSkqdHdvMjQ7CisJfQorCXR4WzJdID0gejsKKwlueCA9IDM7CisJd2hpbGUodHhbbngtMV09PXplcm8pIG54LS07CS8qIHNraXAgemVybyB0ZXJtICovCisJbiAgPSAgX19rZXJuZWxfcmVtX3BpbzIodHgseSxlMCxueCwyLHR3b19vdmVyX3BpKTsKKwlpZihoeDwwKSB7eVswXSA9IC15WzBdOyB5WzFdID0gLXlbMV07IHJldHVybiAtbjt9CisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3JlbV9waW8yZi5jIGIvbGlibS9zcmMvZV9yZW1fcGlvMmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMxY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9yZW1fcGlvMmYuYwpAQCAtMCwwICsxLDk4IEBACisvKiBlX3JlbV9waW8yZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9yZW1fcGlvMi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIERlYnVnZ2VkIGFuZCBvcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1fcGlvMmYuYyx2IDEuMTkgMjAwNS8xMS8yMyAwMzowMzowOSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9yZW1fcGlvMmYoeCx5KQorICoKKyAqIHJldHVybiB0aGUgcmVtYWluZGVyIG9mIHggcmVtIHBpLzIgaW4geVswXSt5WzFdCisgKiB1c2UgZG91YmxlIHByZWNpc2lvbiBpbnRlcm5hbGx5CisgKiB1c2UgX19rZXJuZWxfcmVtX3BpbzIoKSBmb3IgbGFyZ2UgeAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qCisgKiBUYWJsZSBvZiBjb25zdGFudHMgZm9yIDIvcGksIDM5NiBIZXggZGlnaXRzICg0NzYgZGVjaW1hbCkgb2YgMi9waQorICovCitzdGF0aWMgY29uc3QgaW50MzJfdCB0d29fb3Zlcl9waVtdID0geworMHhBMkY5ODMsIDB4NkU0RTQ0LCAweDE1MjlGQywgMHgyNzU3RDEsIDB4RjUzNERELCAweEMwREI2MiwgCisweDk1OTkzQywgMHg0MzkwNDEsIDB4RkU1MTYzLCAweEFCREVCQiwgMHhDNTYxQjcsIDB4MjQ2RTNBLCAKKzB4NDI0REQyLCAweEUwMDY0OSwgMHgyRUVBMDksIDB4RDE5MjFDLCAweEZFMURFQiwgMHgxQ0IxMjksIAorMHhBNzNFRTgsIDB4ODIzNUY1LCAweDJFQkI0NCwgMHg4NEU5OUMsIDB4NzAyNkI0LCAweDVGN0U0MSwgCisweDM5OTFENiwgMHgzOTgzNTMsIDB4MzlGNDlDLCAweDg0NUY4QiwgMHhCREY5MjgsIDB4M0IxRkY4LCAKKzB4OTdGRkRFLCAweDA1OTgwRiwgMHhFRjJGMTEsIDB4OEI1QTBBLCAweDZEMUY2RCwgMHgzNjdFQ0YsIAorMHgyN0NCMDksIDB4Qjc0RjQ2LCAweDNGNjY5RSwgMHg1RkVBMkQsIDB4NzUyN0JBLCAweEM3RUJFNSwgCisweEYxN0IzRCwgMHgwNzM5RjcsIDB4OEE1MjkyLCAweEVBNkJGQiwgMHg1RkIxMUYsIDB4OEQ1RDA4LCAKKzB4NTYwMzMwLCAweDQ2RkM3QiwgMHg2QkFCRjAsIDB4Q0ZCQzIwLCAweDlBRjQzNiwgMHgxREE5RTMsIAorMHg5MTYxNUUsIDB4RTYxQjA4LCAweDY1OTk4NSwgMHg1RjE0QTAsIDB4Njg0MDhELCAweEZGRDg4MCwgCisweDRENzMyNywgMHgzMTA2MDYsIDB4MTU1NkNBLCAweDczQThDOSwgMHg2MEUyN0IsIDB4QzA4QzZCLCAKK307CisKKy8qCisgKiBpbnZwaW8yOiAgNTMgYml0cyBvZiAyL3BpCisgKiBwaW8yXzE6ICAgZmlyc3QgIDMzIGJpdCBvZiBwaS8yCisgKiBwaW8yXzF0OiAgcGkvMiAtIHBpbzJfMQorICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3plcm8gPSAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KK2hhbGYgPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3bzI0ID0gIDEuNjc3NzIxNjAwMDAwMDAwMDAwMDBlKzA3LCAvKiAweDQxNzAwMDAwLCAweDAwMDAwMDAwICovCitpbnZwaW8yID0gIDYuMzY2MTk3NzIzNjc1ODEzODI0MzNlLTAxLCAvKiAweDNGRTQ1RjMwLCAweDZEQzlDODgzICovCitwaW8yXzEgID0gIDEuNTcwNzk2MzI2NzM0MTI1NjE0MTdlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDAwMDAwICovCitwaW8yXzF0ID0gIDYuMDc3MTAwNTA2NTA2MTkyMjQ5MzJlLTExOyAvKiAweDNERDBCNDYxLCAweDFBNjI2MzMxICovCisKKwlpbnQzMl90IF9faWVlZTc1NF9yZW1fcGlvMmYoZmxvYXQgeCwgZmxvYXQgKnkpCit7CisJZG91YmxlIHcsdCxyLGZuOworCWRvdWJsZSB0eFsxXSx0eVsyXTsKKwlmbG9hdCB6OworCWludDMyX3QgZTAsbixpeCxoeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKyAgICAvKiAzMys1MyBiaXQgcGkgaXMgZ29vZCBlbm91Z2ggZm9yIG1lZGl1bSBzaXplICovCisJaWYoaXg8PTB4NDk0OTBmODApIHsJCS8qIHx4fCB+PD0gMl4xOSoocGkvMiksIG1lZGl1bSBzaXplICovCisJICAgIHQgID0gZmFic2YoeCk7CisJICAgIG4gID0gKGludDMyX3QpICh0KmludnBpbzIraGFsZik7CisJICAgIGZuID0gKGRvdWJsZSluOworCSAgICByICA9IHQtZm4qcGlvMl8xOworCSAgICB3ICA9IGZuKnBpbzJfMXQ7CisJICAgIHlbMF0gPSByLXc7CisJICAgIHlbMV0gPSAoci15WzBdKS13OworCSAgICBpZihoeDwwKSAJe3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCSAgICBlbHNlCSByZXR1cm4gbjsKKwl9CisgICAgLyoKKyAgICAgKiBhbGwgb3RoZXIgKGxhcmdlKSBhcmd1bWVudHMKKyAgICAgKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgewkJLyogeCBpcyBpbmYgb3IgTmFOICovCisJICAgIHlbMF09eVsxXT14LXg7IHJldHVybiAwOworCX0KKyAgICAvKiBzZXQgeiA9IHNjYWxibih8eHwsaWxvZ2IofHh8KS0yMykgKi8KKwllMCA9IChpeD4+MjMpLTE1MDsJCS8qIGUwID0gaWxvZ2IofHh8KS0yMzsgKi8KKwlTRVRfRkxPQVRfV09SRCh6LCBpeCAtICgoaW50MzJfdCkoZTA8PDIzKSkpOworCXR4WzBdID0gejsKKwluICA9ICBfX2tlcm5lbF9yZW1fcGlvMih0eCx0eSxlMCwxLDEsdHdvX292ZXJfcGkpOworCXlbMF0gPSB0eVswXTsKKwl5WzFdID0gdHlbMF0gLSB5WzBdOworCWlmKGh4PDApIHt5WzBdID0gLXlbMF07IHlbMV0gPSAteVsxXTsgcmV0dXJuIC1uO30KKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcmVtYWluZGVyLmMgYi9saWJtL3NyYy9lX3JlbWFpbmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTMyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbWFpbmRlci5jCkBAIC0wLDAgKzEsNzMgQEAKKworLyogQCgjKWVfcmVtYWluZGVyLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcmVtYWluZGVyLmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfcmVtYWluZGVyKHgscCkKKyAqIFJldHVybiA6ICAgICAgICAgICAgICAgICAgCisgKiAJcmV0dXJucyAgeCBSRU0gcCAgPSAgeCAtIFt4L3BdKnAgYXMgaWYgaW4gaW5maW5pdGUgCisgKiAJcHJlY2lzZSBhcml0aG1ldGljLCB3aGVyZSBbeC9wXSBpcyB0aGUgKGluZmluaXRlIGJpdCkgCisgKglpbnRlZ2VyIG5lYXJlc3QgeC9wIChpbiBoYWxmIHdheSBjYXNlIGNob29zZSB0aGUgZXZlbiBvbmUpLgorICogTWV0aG9kIDogCisgKglCYXNlZCBvbiBmbW9kKCkgcmV0dXJuIHgtW3gvcF1jaG9wcGVkKnAgZXhhY3RscC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gPSAwLjA7CisKKworZG91YmxlCitfX2llZWU3NTRfcmVtYWluZGVyKGRvdWJsZSB4LCBkb3VibGUgcCkKK3sKKwlpbnQzMl90IGh4LGhwOworCXVfaW50MzJfdCBzeCxseCxscDsKKwlkb3VibGUgcF9oYWxmOworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlFWFRSQUNUX1dPUkRTKGhwLGxwLHApOworCXN4ID0gaHgmMHg4MDAwMDAwMDsKKwlocCAmPSAweDdmZmZmZmZmOworCWh4ICY9IDB4N2ZmZmZmZmY7CisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKChocHxscCk9PTApIHJldHVybiAoeCpwKS8oeCpwKTsgCS8qIHAgPSAwICovCisJaWYoKGh4Pj0weDdmZjAwMDAwKXx8CQkJLyogeCBub3QgZmluaXRlICovCisJICAoKGhwPj0weDdmZjAwMDAwKSYmCQkJLyogcCBpcyBOYU4gKi8KKwkgICgoKGhwLTB4N2ZmMDAwMDApfGxwKSE9MCkpKQorCSAgICByZXR1cm4gKHgqcCkvKHgqcCk7CisKKworCWlmIChocDw9MHg3ZmRmZmZmZikgeCA9IF9faWVlZTc1NF9mbW9kKHgscCtwKTsJLyogbm93IHggPCAycCAqLworCWlmICgoKGh4LWhwKXwobHgtbHApKT09MCkgcmV0dXJuIHplcm8qeDsKKwl4ICA9IGZhYnMoeCk7CisJcCAgPSBmYWJzKHApOworCWlmIChocDwweDAwMjAwMDAwKSB7CisJICAgIGlmKHgreD5wKSB7CisJCXgtPXA7CisJCWlmKHgreD49cCkgeCAtPSBwOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgcF9oYWxmID0gMC41KnA7CisJICAgIGlmKHg+cF9oYWxmKSB7CisJCXgtPXA7CisJCWlmKHg+PXBfaGFsZikgeCAtPSBwOworCSAgICB9CisJfQorCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJU0VUX0hJR0hfV09SRCh4LGh4XnN4KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcmVtYWluZGVyZi5jIGIvbGlibS9zcmMvZV9yZW1haW5kZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NTA4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyZi5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGVfcmVtYWluZGVyZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9yZW1haW5kZXIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcmVtYWluZGVyZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgemVybyA9IDAuMDsKKworCitmbG9hdAorX19pZWVlNzU0X3JlbWFpbmRlcmYoZmxvYXQgeCwgZmxvYXQgcCkKK3sKKwlpbnQzMl90IGh4LGhwOworCXVfaW50MzJfdCBzeDsKKwlmbG9hdCBwX2hhbGY7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChocCxwKTsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CisJaHAgJj0gMHg3ZmZmZmZmZjsKKwloeCAmPSAweDdmZmZmZmZmOworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZihocD09MCkgcmV0dXJuICh4KnApLyh4KnApOwkgCS8qIHAgPSAwICovCisJaWYoKGh4Pj0weDdmODAwMDAwKXx8CQkJLyogeCBub3QgZmluaXRlICovCisJICAoKGhwPjB4N2Y4MDAwMDApKSkJCQkvKiBwIGlzIE5hTiAqLworCSAgICByZXR1cm4gKHgqcCkvKHgqcCk7CisKKworCWlmIChocDw9MHg3ZWZmZmZmZikgeCA9IF9faWVlZTc1NF9mbW9kZih4LHArcCk7CS8qIG5vdyB4IDwgMnAgKi8KKwlpZiAoKGh4LWhwKT09MCkgcmV0dXJuIHplcm8qeDsKKwl4ICA9IGZhYnNmKHgpOworCXAgID0gZmFic2YocCk7CisJaWYgKGhwPDB4MDEwMDAwMDApIHsKKwkgICAgaWYoeCt4PnApIHsKKwkJeC09cDsKKwkJaWYoeCt4Pj1wKSB4IC09IHA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwX2hhbGYgPSAoZmxvYXQpMC41KnA7CisJICAgIGlmKHg+cF9oYWxmKSB7CisJCXgtPXA7CisJCWlmKHg+PXBfaGFsZikgeCAtPSBwOworCSAgICB9CisJfQorCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCVNFVF9GTE9BVF9XT1JEKHgsaHhec3gpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zY2FsYi5jIGIvbGlibS9zcmMvZV9zY2FsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTY2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NjYWxiLmMKQEAgLTAsMCArMSw0OCBAQAorCisvKiBAKCMpZV9zY2FsYi5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NjYWxiLmMsdiAxLjEyIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19pZWVlNzU0X3NjYWxiKHgsIGZuKSBpcyBwcm92aWRlIGZvcgorICogcGFzc2luZyB2YXJpb3VzIHN0YW5kYXJkIHRlc3Qgc3VpdGUuIE9uZSAKKyAqIHNob3VsZCB1c2Ugc2NhbGJuKCkgaW5zdGVhZC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjaWZkZWYgX1NDQUxCX0lOVAorZG91YmxlCitfX2llZWU3NTRfc2NhbGIoZG91YmxlIHgsIGludCBmbikKKyNlbHNlCitkb3VibGUKK19faWVlZTc1NF9zY2FsYihkb3VibGUgeCwgZG91YmxlIGZuKQorI2VuZGlmCit7CisjaWZkZWYgX1NDQUxCX0lOVAorCXJldHVybiBzY2FsYm4oeCxmbik7CisjZWxzZQorCWlmIChpc25hbih4KXx8aXNuYW4oZm4pKSByZXR1cm4geCpmbjsKKwlpZiAoIWZpbml0ZShmbikpIHsKKwkgICAgaWYoZm4+MC4wKSByZXR1cm4geCpmbjsKKwkgICAgZWxzZSAgICAgICByZXR1cm4geC8oLWZuKTsKKwl9CisJaWYgKHJpbnQoZm4pIT1mbikgcmV0dXJuIChmbi1mbikvKGZuLWZuKTsKKwlpZiAoIGZuID4gNjUwMDAuMCkgcmV0dXJuIHNjYWxibih4LCA2NTAwMCk7CisJaWYgKC1mbiA+IDY1MDAwLjApIHJldHVybiBzY2FsYm4oeCwtNjUwMDApOworCXJldHVybiBzY2FsYm4oeCwoaW50KWZuKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zY2FsYmYuYyBiL2xpYm0vc3JjL2Vfc2NhbGJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYzFmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc2NhbGJmLmMKQEAgLTAsMCArMSw0NiBAQAorLyogZV9zY2FsYmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfc2NhbGIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2NhbGJmLmMsdiAxLjEwIDIwMDUvMTIvMDYgMjA6MTI6Mzggb2JyaWVuIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjaWZkZWYgX1NDQUxCX0lOVAorZmxvYXQKK19faWVlZTc1NF9zY2FsYmYoZmxvYXQgeCwgaW50IGZuKQorI2Vsc2UKK2Zsb2F0CitfX2llZWU3NTRfc2NhbGJmKGZsb2F0IHgsIGZsb2F0IGZuKQorI2VuZGlmCit7CisjaWZkZWYgX1NDQUxCX0lOVAorCXJldHVybiBzY2FsYm5mKHgsZm4pOworI2Vsc2UKKwlpZiAoKGlzbmFuZikoeCl8fChpc25hbmYpKGZuKSkgcmV0dXJuIHgqZm47CisJaWYgKCFmaW5pdGVmKGZuKSkgeworCSAgICBpZihmbj4oZmxvYXQpMC4wKSByZXR1cm4geCpmbjsKKwkgICAgZWxzZSAgICAgICByZXR1cm4geC8oLWZuKTsKKwl9CisJaWYgKHJpbnRmKGZuKSE9Zm4pIHJldHVybiAoZm4tZm4pLyhmbi1mbik7CisJaWYgKCBmbiA+IChmbG9hdCk2NTAwMC4wKSByZXR1cm4gc2NhbGJuZih4LCA2NTAwMCk7CisJaWYgKC1mbiA+IChmbG9hdCk2NTAwMC4wKSByZXR1cm4gc2NhbGJuZih4LC02NTAwMCk7CisJcmV0dXJuIHNjYWxibmYoeCwoaW50KWZuKTsKKyNlbmRpZgorfQorCitfX3dlYWtfcmVmZXJlbmNlKHNjYWxiZiwgbGRleHBmKTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc2luaC5jIGIvbGlibS9zcmMvZV9zaW5oLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGIyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc2luaC5jCkBAIC0wLDAgKzEsNzkgQEAKKworLyogQCgjKWVfc2luaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NpbmguYyx2IDEuOSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3NpbmgoeCkKKyAqIE1ldGhvZCA6IAorICogbWF0aGVtYXRpY2FsbHkgc2luaCh4KSBpZiBkZWZpbmVkIHRvIGJlIChleHAoeCktZXhwKC14KSkvMgorICoJMS4gUmVwbGFjZSB4IGJ5IHx4fCAoc2luaCgteCkgPSAtc2luaCh4KSkuIAorICoJMi4gCisgKgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSArIEUvKEUrMSkKKyAqCSAgICAwICAgICAgICA8PSB4IDw9IDIyICAgICA6ICBzaW5oKHgpIDo9IC0tLS0tLS0tLS0tLS0tLCBFPWV4cG0xKHgpCisgKgkJCSAgICAgICAJCQkgICAgICAgIDIKKyAqCisgKgkgICAgMjIgICAgICAgPD0geCA8PSBsbm92ZnQgOiAgc2luaCh4KSA6PSBleHAoeCkvMiAKKyAqCSAgICBsbm92ZnQgICA8PSB4IDw9IGxuMm92ZnQ6ICBzaW5oKHgpIDo9IGV4cCh4LzIpLzIgKiBleHAoeC8yKQorICoJICAgIGxuMm92ZnQgIDwgIHgJICAgIDogIHNpbmgoeCkgOj0geCpzaHVnZSAob3ZlcmZsb3cpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCXNpbmgoeCkgaXMgfHh8IGlmIHggaXMgK0lORiwgLUlORiwgb3IgTmFOLgorICoJb25seSBzaW5oKDApPTAgaXMgZXhhY3QgZm9yIGZpbml0ZSB4LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgb25lID0gMS4wLCBzaHVnZSA9IDEuMGUzMDc7CisKK2RvdWJsZQorX19pZWVlNzU0X3NpbmgoZG91YmxlIHgpCit7CisJZG91YmxlIHQsdyxoOworCWludDMyX3QgaXgsang7CisJdV9pbnQzMl90IGx4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHx4fC4gKi8KKwlHRVRfSElHSF9XT1JEKGp4LHgpOworCWl4ID0gangmMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCt4OwkKKworCWggPSAwLjU7CisJaWYgKGp4PDApIGggPSAtaDsKKyAgICAvKiB8eHwgaW4gWzAsMjJdLCByZXR1cm4gc2lnbih4KSowLjUqKEUrRS8oRSsxKSkpICovCisJaWYgKGl4IDwgMHg0MDM2MDAwMCkgewkJLyogfHh8PDIyICovCisJICAgIGlmIChpeDwweDNlMzAwMDAwKSAJCS8qIHx4fDwyKiotMjggKi8KKwkJaWYoc2h1Z2UreD5vbmUpIHJldHVybiB4Oy8qIHNpbmgodGlueSkgPSB0aW55IHdpdGggaW5leGFjdCAqLworCSAgICB0ID0gZXhwbTEoZmFicyh4KSk7CisJICAgIGlmKGl4PDB4M2ZmMDAwMDApIHJldHVybiBoKigyLjAqdC10KnQvKHQrb25lKSk7CisJICAgIHJldHVybiBoKih0K3QvKHQrb25lKSk7CisJfQorCisgICAgLyogfHh8IGluIFsyMiwgbG9nKG1heGRvdWJsZSldIHJldHVybiAwLjUqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQwODYyRTQyKSAgcmV0dXJuIGgqX19pZWVlNzU0X2V4cChmYWJzKHgpKTsKKworICAgIC8qIHx4fCBpbiBbbG9nKG1heGRvdWJsZSksIG92ZXJmbG93dGhyZXNvbGRdICovCisJR0VUX0xPV19XT1JEKGx4LHgpOworCWlmIChpeDwweDQwODYzM0NFIHx8ICgoaXg9PTB4NDA4NjMzY2UpJiYobHg8PSh1X2ludDMyX3QpMHg4ZmI5Zjg3ZCkpKSB7CisJICAgIHcgPSBfX2llZWU3NTRfZXhwKDAuNSpmYWJzKHgpKTsKKwkgICAgdCA9IGgqdzsKKwkgICAgcmV0dXJuIHQqdzsKKwl9CisKKyAgICAvKiB8eHwgPiBvdmVyZmxvd3RocmVzb2xkLCBzaW5oKHgpIG92ZXJmbG93ICovCisJcmV0dXJuIHgqc2h1Z2U7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NpbmhmLmMgYi9saWJtL3NyYy9lX3NpbmhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlNzUzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc2luaGYuYwpAQCAtMCwwICsxLDYwIEBACisvKiBlX3NpbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3NpbmguYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2luaGYuYyx2IDEuOCAyMDA1LzExLzEzIDAwOjQxOjQ2IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMCwgc2h1Z2UgPSAxLjBlMzc7CisKK2Zsb2F0CitfX2llZWU3NTRfc2luaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHcsaDsKKwlpbnQzMl90IGl4LGp4OworCisJR0VUX0ZMT0FUX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisKKwloID0gMC41OworCWlmIChqeDwwKSBoID0gLWg7CisgICAgLyogfHh8IGluIFswLDldLCByZXR1cm4gc2lnbih4KSowLjUqKEUrRS8oRSsxKSkpICovCisJaWYgKGl4IDwgMHg0MTEwMDAwMCkgewkJLyogfHh8PDkgKi8KKwkgICAgaWYgKGl4PDB4Mzk4MDAwMDApIAkJLyogfHh8PDIqKi0xMiAqLworCQlpZihzaHVnZSt4Pm9uZSkgcmV0dXJuIHg7Lyogc2luaCh0aW55KSA9IHRpbnkgd2l0aCBpbmV4YWN0ICovCisJICAgIHQgPSBleHBtMWYoZmFic2YoeCkpOworCSAgICBpZihpeDwweDNmODAwMDAwKSByZXR1cm4gaCooKGZsb2F0KTIuMCp0LXQqdC8odCtvbmUpKTsKKwkgICAgcmV0dXJuIGgqKHQrdC8odCtvbmUpKTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzksIGxvZ2YobWF4ZmxvYXQpXSByZXR1cm4gMC41KmV4cCh8eHwpICovCisJaWYgKGl4IDwgMHg0MmIxNzIxNykgIHJldHVybiBoKl9faWVlZTc1NF9leHBmKGZhYnNmKHgpKTsKKworICAgIC8qIHx4fCBpbiBbbG9nZihtYXhmbG9hdCksIG92ZXJmbG93dGhyZXNvbGRdICovCisJaWYgKGl4PD0weDQyYjJkNGZjKSB7CisJICAgIHcgPSBfX2llZWU3NTRfZXhwZigoZmxvYXQpMC41KmZhYnNmKHgpKTsKKwkgICAgdCA9IGgqdzsKKwkgICAgcmV0dXJuIHQqdzsKKwl9CisKKyAgICAvKiB8eHwgPiBvdmVyZmxvd3RocmVzb2xkLCBzaW5oKHgpIG92ZXJmbG93ICovCisJcmV0dXJuIHgqc2h1Z2U7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NxcnQuYyBiL2xpYm0vc3JjL2Vfc3FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWNiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NxcnQuYwpAQCAtMCwwICsxLDQ0NiBAQAorCisvKiBAKCMpZV9zcXJ0LmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc3FydC5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3NxcnQoeCkKKyAqIFJldHVybiBjb3JyZWN0bHkgcm91bmRlZCBzcXJ0LgorICogICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgICB8ICBVc2UgdGhlIGhhcmR3YXJlIHNxcnQgaWYgeW91IGhhdmUgb25lIHwKKyAqICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1ldGhvZDogCisgKiAgIEJpdCBieSBiaXQgbWV0aG9kIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYy4gKFNsb3csIGJ1dCBwb3J0YWJsZSkgCisgKiAgIDEuIE5vcm1hbGl6YXRpb24KKyAqCVNjYWxlIHggdG8geSBpbiBbMSw0KSB3aXRoIGV2ZW4gcG93ZXJzIG9mIDI6IAorICoJZmluZCBhbiBpbnRlZ2VyIGsgc3VjaCB0aGF0ICAxIDw9ICh5PXgqMl4oMmspKSA8IDQsIHRoZW4KKyAqCQlzcXJ0KHgpID0gMl5rICogc3FydCh5KQorICogICAyLiBCaXQgYnkgYml0IGNvbXB1dGF0aW9uCisgKglMZXQgcSAgPSBzcXJ0KHkpIHRydW5jYXRlZCB0byBpIGJpdCBhZnRlciBiaW5hcnkgcG9pbnQgKHEgPSAxKSwKKyAqCSAgICAgaQkJCQkJCQkgMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxICAgICAgICAgMgorICoJICAgIHMgID0gMipxICwgYW5kCXkgID0gIDIgICAqICggeSAtIHEgICkuCQkoMSkKKyAqCSAgICAgaSAgICAgIGkgICAgICAgICAgICBpICAgICAgICAgICAgICAgICBpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKglUbyBjb21wdXRlIHEgICAgZnJvbSBxICwgb25lIGNoZWNrcyB3aGV0aGVyIAorICoJCSAgICBpKzEgICAgICAgaSAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoJCQkgICAgICAtKGkrMSkgMgorICoJCQkocSArIDIgICAgICApIDw9IHkuCQkJKDIpCisgKiAgICAgCQkJICBpCisgKgkJCQkJCQkgICAgICAtKGkrMSkKKyAqCUlmICgyKSBpcyBmYWxzZSwgdGhlbiBxICAgPSBxIDsgb3RoZXJ3aXNlIHEgICA9IHEgICsgMiAgICAgIC4KKyAqCQkgCSAgICAgICBpKzEgICBpICAgICAgICAgICAgIGkrMSAgIGkKKyAqCisgKglXaXRoIHNvbWUgYWxnZWJyaWMgbWFuaXB1bGF0aW9uLCBpdCBpcyBub3QgZGlmZmljdWx0IHRvIHNlZQorICoJdGhhdCAoMikgaXMgZXF1aXZhbGVudCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKGkrMSkKKyAqCQkJcyAgKyAgMiAgICAgICA8PSB5CQkJKDMpCisgKgkJCSBpICAgICAgICAgICAgICAgIGkKKyAqCisgKglUaGUgYWR2YW50YWdlIG9mICgzKSBpcyB0aGF0IHMgIGFuZCB5ICBjYW4gYmUgY29tcHV0ZWQgYnkgCisgKgkJCQkgICAgICBpICAgICAgaQorICoJdGhlIGZvbGxvd2luZyByZWN1cnJlbmNlIGZvcm11bGE6CisgKgkgICAgaWYgKDMpIGlzIGZhbHNlCisgKgorICoJICAgIHMgICAgID0gIHMgICwJeSAgICA9IHkgICA7CQkJKDQpCisgKgkgICAgIGkrMSAgICAgIGkJCSBpKzEgICAgaQorICoKKyAqCSAgICBvdGhlcndpc2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtaSAgICAgICAgICAgICAgICAgICAgIC0oaSsxKQorICoJICAgIHMJICA9ICBzICArIDIgICwgIHkgICAgPSB5ICAtICBzICAtIDIgIAkJKDUpCisgKiAgICAgICAgICAgaSsxICAgICAgaSAgICAgICAgICBpKzEgICAgaSAgICAgaQorICoJCQkJCisgKglPbmUgbWF5IGVhc2lseSB1c2UgaW5kdWN0aW9uIHRvIHByb3ZlICg0KSBhbmQgKDUpLiAKKyAqCU5vdGUuIFNpbmNlIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiAoMykgY29udGFpbiBvbmx5IGkrMiBiaXRzLAorICoJICAgICAgaXQgZG9lcyBub3QgbmVjZXNzYXJ5IHRvIGRvIGEgZnVsbCAoNTMtYml0KSBjb21wYXJpc29uIAorICoJICAgICAgaW4gKDMpLgorICogICAzLiBGaW5hbCByb3VuZGluZworICoJQWZ0ZXIgZ2VuZXJhdGluZyB0aGUgNTMgYml0cyByZXN1bHQsIHdlIGNvbXB1dGUgb25lIG1vcmUgYml0LgorICoJVG9nZXRoZXIgd2l0aCB0aGUgcmVtYWluZGVyLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdGhlCisgKglyZXN1bHQgaXMgZXhhY3QsIGJpZ2dlciB0aGFuIDEvMnVscCwgb3IgbGVzcyB0aGFuIDEvMnVscAorICoJKGl0IHdpbGwgbmV2ZXIgZXF1YWwgdG8gMS8ydWxwKS4KKyAqCVRoZSByb3VuZGluZyBtb2RlIGNhbiBiZSBkZXRlY3RlZCBieSBjaGVja2luZyB3aGV0aGVyCisgKglodWdlICsgdGlueSBpcyBlcXVhbCB0byBodWdlLCBhbmQgd2hldGhlciBodWdlIC0gdGlueSBpcworICoJZXF1YWwgdG8gaHVnZSBmb3Igc29tZSBmbG9hdGluZyBwb2ludCBudW1iZXIgImh1Z2UiIGFuZCAidGlueSIuCisgKgkJCisgKiBTcGVjaWFsIGNhc2VzOgorICoJc3FydCgrLTApID0gKy0wIAkuLi4gZXhhY3QKKyAqCXNxcnQoaW5mKSA9IGluZgorICoJc3FydCgtdmUpID0gTmFOCQkuLi4gd2l0aCBpbnZhbGlkIHNpZ25hbAorICoJc3FydChOYU4pID0gTmFOCQkuLi4gd2l0aCBpbnZhbGlkIHNpZ25hbCBmb3Igc2lnbmFsaW5nIE5hTgorICoKKyAqIE90aGVyIG1ldGhvZHMgOiBzZWUgdGhlIGFwcGVuZGVkIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBiZWxvdy4KKyAqLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljCWNvbnN0IGRvdWJsZQlvbmUJPSAxLjAsIHRpbnk9MS4wZS0zMDA7CisKK2RvdWJsZQorX19pZWVlNzU0X3NxcnQoZG91YmxlIHgpCit7CisJZG91YmxlIHo7CisJaW50MzJfdCBzaWduID0gKGludCkweDgwMDAwMDAwOworCWludDMyX3QgaXgwLHMwLHEsbSx0LGk7CisJdV9pbnQzMl90IHIsdDEsczEsaXgxLHExOworCisJRVhUUkFDVF9XT1JEUyhpeDAsaXgxLHgpOworCisgICAgLyogdGFrZSBjYXJlIG9mIEluZiBhbmQgTmFOICovCisJaWYoKGl4MCYweDdmZjAwMDAwKT09MHg3ZmYwMDAwMCkgewkJCQorCSAgICByZXR1cm4geCp4K3g7CQkvKiBzcXJ0KE5hTik9TmFOLCBzcXJ0KCtpbmYpPStpbmYKKwkJCQkJICAgc3FydCgtaW5mKT1zTmFOICovCisJfSAKKyAgICAvKiB0YWtlIGNhcmUgb2YgemVybyAqLworCWlmKGl4MDw9MCkgeworCSAgICBpZigoKGl4MCYofnNpZ24pKXxpeDEpPT0wKSByZXR1cm4geDsvKiBzcXJ0KCstMCkgPSArLTAgKi8KKwkgICAgZWxzZSBpZihpeDA8MCkKKwkJcmV0dXJuICh4LXgpLyh4LXgpOwkJLyogc3FydCgtdmUpID0gc05hTiAqLworCX0KKyAgICAvKiBub3JtYWxpemUgeCAqLworCW0gPSAoaXgwPj4yMCk7CisJaWYobT09MCkgewkJCQkvKiBzdWJub3JtYWwgeCAqLworCSAgICB3aGlsZShpeDA9PTApIHsKKwkJbSAtPSAyMTsKKwkJaXgwIHw9IChpeDE+PjExKTsgaXgxIDw8PSAyMTsKKwkgICAgfQorCSAgICBmb3IoaT0wOyhpeDAmMHgwMDEwMDAwMCk9PTA7aSsrKSBpeDA8PD0xOworCSAgICBtIC09IGktMTsKKwkgICAgaXgwIHw9IChpeDE+PigzMi1pKSk7CisJICAgIGl4MSA8PD0gaTsKKwl9CisJbSAtPSAxMDIzOwkvKiB1bmJpYXMgZXhwb25lbnQgKi8KKwlpeDAgPSAoaXgwJjB4MDAwZmZmZmYpfDB4MDAxMDAwMDA7CisJaWYobSYxKXsJLyogb2RkIG0sIGRvdWJsZSB4IHRvIG1ha2UgaXQgZXZlbiAqLworCSAgICBpeDAgKz0gaXgwICsgKChpeDEmc2lnbik+PjMxKTsKKwkgICAgaXgxICs9IGl4MTsKKwl9CisJbSA+Pj0gMTsJLyogbSA9IFttLzJdICovCisKKyAgICAvKiBnZW5lcmF0ZSBzcXJ0KHgpIGJpdCBieSBiaXQgKi8KKwlpeDAgKz0gaXgwICsgKChpeDEmc2lnbik+PjMxKTsKKwlpeDEgKz0gaXgxOworCXEgPSBxMSA9IHMwID0gczEgPSAwOwkvKiBbcSxxMV0gPSBzcXJ0KHgpICovCisJciA9IDB4MDAyMDAwMDA7CQkvKiByID0gbW92aW5nIGJpdCBmcm9tIHJpZ2h0IHRvIGxlZnQgKi8KKworCXdoaWxlKHIhPTApIHsKKwkgICAgdCA9IHMwK3I7IAorCSAgICBpZih0PD1peDApIHsgCisJCXMwICAgPSB0K3I7IAorCQlpeDAgLT0gdDsgCisJCXEgICArPSByOyAKKwkgICAgfSAKKwkgICAgaXgwICs9IGl4MCArICgoaXgxJnNpZ24pPj4zMSk7CisJICAgIGl4MSArPSBpeDE7CisJICAgIHI+Pj0xOworCX0KKworCXIgPSBzaWduOworCXdoaWxlKHIhPTApIHsKKwkgICAgdDEgPSBzMStyOyAKKwkgICAgdCAgPSBzMDsKKwkgICAgaWYoKHQ8aXgwKXx8KCh0PT1peDApJiYodDE8PWl4MSkpKSB7IAorCQlzMSAgPSB0MStyOworCQlpZigoKHQxJnNpZ24pPT1zaWduKSYmKHMxJnNpZ24pPT0wKSBzMCArPSAxOworCQlpeDAgLT0gdDsKKwkJaWYgKGl4MSA8IHQxKSBpeDAgLT0gMTsKKwkJaXgxIC09IHQxOworCQlxMSAgKz0gcjsKKwkgICAgfQorCSAgICBpeDAgKz0gaXgwICsgKChpeDEmc2lnbik+PjMxKTsKKwkgICAgaXgxICs9IGl4MTsKKwkgICAgcj4+PTE7CisJfQorCisgICAgLyogdXNlIGZsb2F0aW5nIGFkZCB0byBmaW5kIG91dCByb3VuZGluZyBkaXJlY3Rpb24gKi8KKwlpZigoaXgwfGl4MSkhPTApIHsKKwkgICAgeiA9IG9uZS10aW55OyAvKiB0cmlnZ2VyIGluZXhhY3QgZmxhZyAqLworCSAgICBpZiAoej49b25lKSB7CisJICAgICAgICB6ID0gb25lK3Rpbnk7CisJICAgICAgICBpZiAocTE9PSh1X2ludDMyX3QpMHhmZmZmZmZmZikgeyBxMT0wOyBxICs9IDE7fQorCQllbHNlIGlmICh6Pm9uZSkgeworCQkgICAgaWYgKHExPT0odV9pbnQzMl90KTB4ZmZmZmZmZmUpIHErPTE7CisJCSAgICBxMSs9MjsgCisJCX0gZWxzZQorCSAgICAgICAgICAgIHExICs9IChxMSYxKTsKKwkgICAgfQorCX0KKwlpeDAgPSAocT4+MSkrMHgzZmUwMDAwMDsKKwlpeDEgPSAgcTE+PjE7CisJaWYgKChxJjEpPT0xKSBpeDEgfD0gc2lnbjsKKwlpeDAgKz0gKG0gPDwyMCk7CisJSU5TRVJUX1dPUkRTKHosaXgwLGl4MSk7CisJcmV0dXJuIHo7Cit9CisKKy8qCitPdGhlciBtZXRob2RzICAodXNlIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMpCistLS0tLS0tLS0tLS0tCisoVGhpcyBpcyBhIGNvcHkgb2YgYSBkcmFmdGVkIHBhcGVyIGJ5IFByb2YgVy4gS2FoYW4gCithbmQgSy5DLiBOZywgd3JpdHRlbiBpbiBNYXksIDE5ODYpCisKKwlUd28gYWxnb3JpdGhtcyBhcmUgZ2l2ZW4gaGVyZSB0byBpbXBsZW1lbnQgc3FydCh4KSAKKwkoSUVFRSBkb3VibGUgcHJlY2lzaW9uIGFyaXRobWV0aWMpIGluIHNvZnR3YXJlLgorCUJvdGggc3VwcGx5IHNxcnQoeCkgY29ycmVjdGx5IHJvdW5kZWQuIFRoZSBmaXJzdCBhbGdvcml0aG0gKGluCisJU2VjdGlvbiBBKSB1c2VzIG5ld3RvbiBpdGVyYXRpb25zIGFuZCBpbnZvbHZlcyBmb3VyIGRpdmlzaW9ucy4KKwlUaGUgc2Vjb25kIG9uZSB1c2VzIHJlY2lwcm9vdCBpdGVyYXRpb25zIHRvIGF2b2lkIGRpdmlzaW9uLCBidXQKKwlyZXF1aXJlcyBtb3JlIG11bHRpcGxpY2F0aW9ucy4gQm90aCBhbGdvcml0aG1zIG5lZWQgdGhlIGFiaWxpdHkKKwl0byBjaG9wIHJlc3VsdHMgb2YgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluc3RlYWQgb2Ygcm91bmQgdGhlbSwgCisJYW5kIHRoZSBJTkVYQUNUIGZsYWcgdG8gaW5kaWNhdGUgd2hlbiBhbiBhcml0aG1ldGljIG9wZXJhdGlvbgorCWlzIGV4ZWN1dGVkIGV4YWN0bHkgd2l0aCBubyByb3VuZG9mZiBlcnJvciwgYWxsIHBhcnQgb2YgdGhlIAorCXN0YW5kYXJkIChJRUVFIDc1NC0xOTg1KS4gVGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBzaGlmdCwgYWRkLAorCXN1YnRyYWN0IGFuZCBsb2dpY2FsIEFORCBvcGVyYXRpb25zIHVwb24gMzItYml0IHdvcmRzIGlzIG5lZWRlZAorCXRvbywgdGhvdWdoIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KKworQS4gIHNxcnQoeCkgYnkgTmV3dG9uIEl0ZXJhdGlvbgorCisgICAoMSkJSW5pdGlhbCBhcHByb3hpbWF0aW9uCisKKwlMZXQgeDAgYW5kIHgxIGJlIHRoZSBsZWFkaW5nIGFuZCB0aGUgdHJhaWxpbmcgMzItYml0IHdvcmRzIG9mCisJYSBmbG9hdGluZyBwb2ludCBudW1iZXIgeCAoaW4gSUVFRSBkb3VibGUgZm9ybWF0KSByZXNwZWN0aXZlbHkgCisKKwkgICAgMSAgICAxMQkJICAgICA1MgkJCQkgIC4uLndpZHRocworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXg6IHxzfAkgIGUgICAgIHwJICAgICAgZgkJCQl8CisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgICAgbXNiICAgIGxzYiAgbXNiCQkJCSAgICAgIGxzYiAuLi5vcmRlcgorCisgCisJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXgwOiAgfHN8ICAgZSAgICB8ICAgIGYxICAgICB8CSB4MTogfCAgICAgICAgICBmMiAgICAgICAgICAgfAorCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUJ5IHBlcmZvcm1pbmcgc2hpZnRzIGFuZCBzdWJ0cmFjdHMgb24geDAgYW5kIHgxIChib3RoIHJlZ2FyZGVkCisJYXMgaW50ZWdlcnMpLCB3ZSBvYnRhaW4gYW4gOC1iaXQgYXBwcm94aW1hdGlvbiBvZiBzcXJ0KHgpIGFzCisJZm9sbG93cy4KKworCQlrICA6PSAoeDA+PjEpICsgMHgxZmY4MDAwMDsKKwkJeTAgOj0gayAtIFQxWzMxJihrPj4xNSldLgkuLi4geSB+IHNxcnQoeCkgdG8gOCBiaXRzCisJSGVyZSBrIGlzIGEgMzItYml0IGludGVnZXIgYW5kIFQxW10gaXMgYW4gaW50ZWdlciBhcnJheSBjb250YWluaW5nCisJY29ycmVjdGlvbiB0ZXJtcy4gTm93IG1hZ2ljYWxseSB0aGUgZmxvYXRpbmcgdmFsdWUgb2YgeSAoeSdzCisJbGVhZGluZyAzMi1iaXQgd29yZCBpcyB5MCwgdGhlIHZhbHVlIG9mIGl0cyB0cmFpbGluZyB3b3JkIGlzIDApCisJYXBwcm94aW1hdGVzIHNxcnQoeCkgdG8gYWxtb3N0IDgtYml0LgorCisJVmFsdWUgb2YgVDE6CisJc3RhdGljIGludCBUMVszMl09IHsKKwkwLAkxMDI0LAkzMDYyLAk1NzQ2LAk5MTkzLAkxMzM0OCwJMTgxNjIsCTIzNTkyLAorCTI5NTk4LAkzNjE0NSwJNDMyMDIsCTUwNzQwLAk1ODczMywJNjcxNTgsCTc1OTkyLAk4NTIxNSwKKwk4MzU5OSwJNzEzNzgsCTYwNDI4LAk1MDY0NywJNDE5NDUsCTM0MjQ2LAkyNzQ3OCwJMjE1ODEsCisJMTY0OTksCTEyMTgzLAk4NTg4LAk1Njc0LAkzNDAzLAkxNzQyLAk2NjEsCTEzMCx9OworCisgICAgKDIpCUl0ZXJhdGl2ZSByZWZpbmVtZW50CisKKwlBcHBseSBIZXJvbidzIHJ1bGUgdGhyZWUgdGltZXMgdG8geSwgd2UgaGF2ZSB5IGFwcHJveGltYXRlcyAKKwlzcXJ0KHgpIHRvIHdpdGhpbiAxIHVscCAoVW5pdCBpbiB0aGUgTGFzdCBQbGFjZSk6CisKKwkJeSA6PSAoeSt4L3kpLzIJCS4uLiBhbG1vc3QgMTcgc2lnLiBiaXRzCisJCXkgOj0gKHkreC95KS8yCQkuLi4gYWxtb3N0IDM1IHNpZy4gYml0cworCQl5IDo9IHktKHkteC95KS8yCS4uLiB3aXRoaW4gMSB1bHAKKworCisJUmVtYXJrIDEuCisJICAgIEFub3RoZXIgd2F5IHRvIGltcHJvdmUgeSB0byB3aXRoaW4gMSB1bHAgaXM6CisKKwkJeSA6PSAoeSt4L3kpCQkuLi4gYWxtb3N0IDE3IHNpZy4gYml0cyB0byAyKnNxcnQoeCkKKwkJeSA6PSB5IC0gMHgwMDEwMDAwNgkuLi4gYWxtb3N0IDE4IHNpZy4gYml0cyB0byBzcXJ0KHgpCisKKwkJCQkyCisJCQkgICAgKHgteSApKnkKKwkJeSA6PSB5ICsgMiogLS0tLS0tLS0tLQkuLi53aXRoaW4gMSB1bHAKKwkJCSAgICAgICAyCisJCQkgICAgIDN5ICArIHgKKworCisJVGhpcyBmb3JtdWxhIGhhcyBvbmUgZGl2aXNpb24gZmV3ZXIgdGhhbiB0aGUgb25lIGFib3ZlOyBob3dldmVyLAorCWl0IHJlcXVpcmVzIG1vcmUgbXVsdGlwbGljYXRpb25zIGFuZCBhZGRpdGlvbnMuIEFsc28geCBtdXN0IGJlCisJc2NhbGVkIGluIGFkdmFuY2UgdG8gYXZvaWQgc3B1cmlvdXMgb3ZlcmZsb3cgaW4gZXZhbHVhdGluZyB0aGUKKwlleHByZXNzaW9uIDN5KnkreC4gSGVuY2UgaXQgaXMgbm90IHJlY29tbWVuZGVkIHVsZXNzIGRpdmlzaW9uCisJaXMgc2xvdy4gSWYgZGl2aXNpb24gaXMgdmVyeSBzbG93LCB0aGVuIG9uZSBzaG91bGQgdXNlIHRoZSAKKwlyZWNpcHJvb3QgYWxnb3JpdGhtIGdpdmVuIGluIHNlY3Rpb24gQi4KKworICAgICgzKSBGaW5hbCBhZGp1c3RtZW50CisKKwlCeSB0d2lkZGxpbmcgeSdzIGxhc3QgYml0IGl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIHkgdG8gYmUgCisJY29ycmVjdGx5IHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUKKwlhcyBmb2xsb3dzLiBMZXQgciBhbmQgaSBiZSBjb3BpZXMgb2YgdGhlIHJvdW5kaW5nIG1vZGUgYW5kCisJaW5leGFjdCBmbGFnIGJlZm9yZSBlbnRlcmluZyB0aGUgc3F1YXJlIHJvb3QgcHJvZ3JhbS4gQWxzbyB3ZQorCXVzZSB0aGUgZXhwcmVzc2lvbiB5Ky11bHAgZm9yIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgZmxvYXRpbmcKKwludW1iZXJzICh1cCBhbmQgZG93bikgb2YgeS4gTm90ZSB0aGF0IHkrLXVscCA9IGVpdGhlciBmaXhlZAorCXBvaW50IHkrLTEsIG9yIG11bHRpcGx5IHkgYnkgbmV4dGFmdGVyKDEsKy1pbmYpIGluIGNob3BwZWQKKwltb2RlLgorCisJCUkgOj0gRkFMU0U7CS4uLiByZXNldCBJTkVYQUNUIGZsYWcgSQorCQlSIDo9IFJaOwkuLi4gc2V0IHJvdW5kaW5nIG1vZGUgdG8gcm91bmQtdG93YXJkLXplcm8KKwkJeiA6PSB4L3k7CS4uLiBjaG9wcGVkIHF1b3RpZW50LCBwb3NzaWJseSBpbmV4YWN0CisJCUlmKG5vdCBJKSB0aGVuIHsJLi4uIGlmIHRoZSBxdW90aWVudCBpcyBleGFjdAorCQkgICAgaWYoej15KSB7CisJCSAgICAgICAgSSA6PSBpOwkgLi4uIHJlc3RvcmUgaW5leGFjdCBmbGFnCisJCSAgICAgICAgUiA6PSByOyAgLi4uIHJlc3RvcmUgcm91bmRlZCBtb2RlCisJCSAgICAgICAgcmV0dXJuIHNxcnQoeCk6PXkuCisJCSAgICB9IGVsc2UgeworCQkJeiA6PSB6IC0gdWxwOwkuLi4gc3BlY2lhbCByb3VuZGluZworCQkgICAgfQorCQl9CisJCWkgOj0gVFJVRTsJCS4uLiBzcXJ0KHgpIGlzIGluZXhhY3QKKwkJSWYgKHI9Uk4pIHRoZW4gej16K3VscAkuLi4gcm91bmRlZC10by1uZWFyZXN0CisJCUlmIChyPVJQKSB0aGVuIHsJLi4uIHJvdW5kLXRvd2FyZC0raW5mCisJCSAgICB5ID0geSt1bHA7IHo9eit1bHA7CisJCX0KKwkJeSA6PSB5K3o7CQkuLi4gY2hvcHBlZCBzdW0KKwkJeTA6PXkwLTB4MDAxMDAwMDA7CS4uLiB5IDo9IHkvMiBpcyBjb3JyZWN0bHkgcm91bmRlZC4KKwkgICAgICAgIEkgOj0gaTsJIAkJLi4uIHJlc3RvcmUgaW5leGFjdCBmbGFnCisJICAgICAgICBSIDo9IHI7ICAJCS4uLiByZXN0b3JlIHJvdW5kZWQgbW9kZQorCSAgICAgICAgcmV0dXJuIHNxcnQoeCk6PXkuCisJCSAgICAKKyAgICAoNCkJU3BlY2lhbCBjYXNlcworCisJU3F1YXJlIHJvb3Qgb2YgK2luZiwgKy0wLCBvciBOYU4gaXMgaXRzZWxmOworCVNxdWFyZSByb290IG9mIGEgbmVnYXRpdmUgbnVtYmVyIGlzIE5hTiB3aXRoIGludmFsaWQgc2lnbmFsLgorCisKK0IuICBzcXJ0KHgpIGJ5IFJlY2lwcm9vdCBJdGVyYXRpb24KKworICAgKDEpCUluaXRpYWwgYXBwcm94aW1hdGlvbgorCisJTGV0IHgwIGFuZCB4MSBiZSB0aGUgbGVhZGluZyBhbmQgdGhlIHRyYWlsaW5nIDMyLWJpdCB3b3JkcyBvZgorCWEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHggKGluIElFRUUgZG91YmxlIGZvcm1hdCkgcmVzcGVjdGl2ZWx5CisJKHNlZSBzZWN0aW9uIEEpLiBCeSBwZXJmb3JtaW5nIHNoaWZzIGFuZCBzdWJ0cmFjdHMgb24geDAgYW5kIHkwLAorCXdlIG9idGFpbiBhIDcuOC1iaXQgYXBwcm94aW1hdGlvbiBvZiAxL3NxcnQoeCkgYXMgZm9sbG93cy4KKworCSAgICBrIDo9IDB4NWZlODAwMDAgLSAoeDA+PjEpOworCSAgICB5MDo9IGsgLSBUMls2MyYoaz4+MTQpXS4JLi4uIHkgfiAxL3NxcnQoeCkgdG8gNy44IGJpdHMKKworCUhlcmUgayBpcyBhIDMyLWJpdCBpbnRlZ2VyIGFuZCBUMltdIGlzIGFuIGludGVnZXIgYXJyYXkgCisJY29udGFpbmluZyBjb3JyZWN0aW9uIHRlcm1zLiBOb3cgbWFnaWNhbGx5IHRoZSBmbG9hdGluZworCXZhbHVlIG9mIHkgKHkncyBsZWFkaW5nIDMyLWJpdCB3b3JkIGlzIHkwLCB0aGUgdmFsdWUgb2YKKwlpdHMgdHJhaWxpbmcgd29yZCB5MSBpcyBzZXQgdG8gemVybykgYXBwcm94aW1hdGVzIDEvc3FydCh4KQorCXRvIGFsbW9zdCA3LjgtYml0LgorCisJVmFsdWUgb2YgVDI6CisJc3RhdGljIGludCBUMls2NF09IHsKKwkweDE1MDAsCTB4MmVmOCwJMHg0ZDY3LAkweDZiMDIsCTB4ODdiZSwJMHhhMzk1LAkweGJlN2EsCTB4ZDg2NiwKKwkweGYxNGEsCTB4MTA5MWIsMHgxMWZjZCwweDEzNTUyLDB4MTQ5OTksMHgxNWM5OCwweDE2ZTM0LDB4MTdlNWYsCisJMHgxOGQwMywweDE5YTAxLDB4MWE1NDUsMHgxYWU4YSwweDFiNWM0LDB4MWJiMDEsMHgxYmZkZSwweDFjMjhkLAorCTB4MWMyZGUsMHgxYzBkYiwweDFiYTczLDB4MWIxMWMsMHgxYTRiNSwweDE5NTNkLDB4MTgyNjYsMHgxNmJlMCwKKwkweDE2ODNlLDB4MTc5ZDgsMHgxOGE0ZCwweDE5OTkyLDB4MWE3ODksMHgxYjQ0NSwweDFiZjYxLDB4MWM5ODksCisJMHgxZDE2ZCwweDFkNzdiLDB4MWRkZGYsMHgxZTJhZCwweDFlNWJmLDB4MWU2ZTgsMHgxZTY1NCwweDFlM2NkLAorCTB4MWRmMmEsMHgxZDYzNSwweDFjYjE2LDB4MWJlMmMsMHgxYWU0ZSwweDE5YmRlLDB4MTg2OGUsMHgxNmUyZSwKKwkweDE1MjdmLDB4MTMzNGEsMHgxMTA1MSwweGU5NTEsCTB4YmUwMSwJMHg4ZTBkLAkweDU5MjQsCTB4MWVkZCx9OworCisgICAgKDIpCUl0ZXJhdGl2ZSByZWZpbmVtZW50CisKKwlBcHBseSBSZWNpcHJvb3QgaXRlcmF0aW9uIHRocmVlIHRpbWVzIHRvIHkgYW5kIG11bHRpcGx5IHRoZQorCXJlc3VsdCBieSB4IHRvIGdldCBhbiBhcHByb3hpbWF0aW9uIHogdGhhdCBtYXRjaGVzIHNxcnQoeCkKKwl0byBhYm91dCAxIHVscC4gVG8gYmUgZXhhY3QsIHdlIHdpbGwgaGF2ZSAKKwkJLTF1bHAgPCBzcXJ0KHgpLXo8MS4wNjI1dWxwLgorCQorCS4uLiBzZXQgcm91bmRpbmcgbW9kZSB0byBSb3VuZC10by1uZWFyZXN0CisJICAgeSA6PSB5KigxLjUtMC41KngqeSp5KQkuLi4gYWxtb3N0IDE1IHNpZy4gYml0cyB0byAxL3NxcnQoeCkKKwkgICB5IDo9IHkqKCgxLjUtMl4tMzApKzAuNSp4KnkqeSkuLi4gYWJvdXQgMjkgc2lnLiBiaXRzIHRvIDEvc3FydCh4KQorCS4uLiBzcGVjaWFsIGFycmFuZ2VtZW50IGZvciBiZXR0ZXIgYWNjdXJhY3kKKwkgICB6IDo9IHgqeQkJCS4uLiAyOSBiaXRzIHRvIHNxcnQoeCksIHdpdGggeip5PDEKKwkgICB6IDo9IHogKyAwLjUqeiooMS16KnkpCS4uLiBhYm91dCAxIHVscCB0byBzcXJ0KHgpCisKKwlSZW1hcmsgMi4gVGhlIGNvbnN0YW50IDEuNS0yXi0zMCBpcyBjaG9zZW4gdG8gYmlhcyB0aGUgZXJyb3Igc28gdGhhdAorCShhKSB0aGUgdGVybSB6KnkgaW4gdGhlIGZpbmFsIGl0ZXJhdGlvbiBpcyBhbHdheXMgbGVzcyB0aGFuIDE7IAorCShiKSB0aGUgZXJyb3IgaW4gdGhlIGZpbmFsIHJlc3VsdCBpcyBiaWFzZWQgdXB3YXJkIHNvIHRoYXQKKwkJLTEgdWxwIDwgc3FydCh4KSAtIHogPCAxLjA2MjUgdWxwCisJICAgIGluc3RlYWQgb2YgfHNxcnQoeCktenw8MS4wMzEyNXVscC4KKworICAgICgzKQlGaW5hbCBhZGp1c3RtZW50CisKKwlCeSB0d2lkZGxpbmcgeSdzIGxhc3QgYml0IGl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIHkgdG8gYmUgCisJY29ycmVjdGx5IHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUKKwlhcyBmb2xsb3dzLiBMZXQgciBhbmQgaSBiZSBjb3BpZXMgb2YgdGhlIHJvdW5kaW5nIG1vZGUgYW5kCisJaW5leGFjdCBmbGFnIGJlZm9yZSBlbnRlcmluZyB0aGUgc3F1YXJlIHJvb3QgcHJvZ3JhbS4gQWxzbyB3ZQorCXVzZSB0aGUgZXhwcmVzc2lvbiB5Ky11bHAgZm9yIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgZmxvYXRpbmcKKwludW1iZXJzICh1cCBhbmQgZG93bikgb2YgeS4gTm90ZSB0aGF0IHkrLXVscCA9IGVpdGhlciBmaXhlZAorCXBvaW50IHkrLTEsIG9yIG11bHRpcGx5IHkgYnkgbmV4dGFmdGVyKDEsKy1pbmYpIGluIGNob3BwZWQKKwltb2RlLgorCisJUiA6PSBSWjsJCS4uLiBzZXQgcm91bmRpbmcgbW9kZSB0byByb3VuZC10b3dhcmQtemVybworCXN3aXRjaChyKSB7CisJICAgIGNhc2UgUk46CQkuLi4gcm91bmQtdG8tbmVhcmVzdAorCSAgICAgICBpZih4PD0geiooei11bHApLi4uY2hvcHBlZCkgeiA9IHogLSB1bHA7IGVsc2UKKwkgICAgICAgaWYoeDw9IHoqKHordWxwKS4uLmNob3BwZWQpIHogPSB6OyBlbHNlIHogPSB6K3VscDsKKwkgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlo6Y2FzZSBSTToJLi4uIHJvdW5kLXRvLXplcm8gb3Igcm91bmQtdG8tLWluZgorCSAgICAgICBSOj1SUDsJCS4uLiByZXNldCByb3VuZGluZyBtb2QgdG8gcm91bmQtdG8tK2luZgorCSAgICAgICBpZih4PHoqeiAuLi4gcm91bmRlZCB1cCkgeiA9IHogLSB1bHA7IGVsc2UKKwkgICAgICAgaWYoeD49KHordWxwKSooeit1bHApIC4uLnJvdW5kZWQgdXApIHogPSB6K3VscDsKKwkgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlA6CQkuLi4gcm91bmQtdG8tK2luZgorCSAgICAgICBpZih4Pih6K3VscCkqKHordWxwKS4uLmNob3BwZWQpIHogPSB6KzIqdWxwOyBlbHNlCisJICAgICAgIGlmKHg+eip6IC4uLmNob3BwZWQpIHogPSB6K3VscDsKKwkgICAgICAgYnJlYWs7CisJfQorCisJUmVtYXJrIDMuIFRoZSBhYm92ZSBjb21wYXJpc29ucyBjYW4gYmUgZG9uZSBpbiBmaXhlZCBwb2ludC4gRm9yCisJZXhhbXBsZSwgdG8gY29tcGFyZSB4IGFuZCB3PXoqeiBjaG9wcGVkLCBpdCBzdWZmaWNlcyB0byBjb21wYXJlCisJeDEgYW5kIHcxICh0aGUgdHJhaWxpbmcgcGFydHMgb2YgeCBhbmQgdyksIHJlZ2FyZGluZyB0aGVtIGFzCisJdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2Vycy4KKworCS4uLklzIHogYW4gZXhhY3Qgc3F1YXJlIHJvb3Q/CisJVG8gZGV0ZXJtaW5lIHdoZXRoZXIgeiBpcyBhbiBleGFjdCBzcXVhcmUgcm9vdCBvZiB4LCBsZXQgejEgYmUgdGhlCisJdHJhaWxpbmcgcGFydCBvZiB6LCBhbmQgYWxzbyBsZXQgeDAgYW5kIHgxIGJlIHRoZSBsZWFkaW5nIGFuZAorCXRyYWlsaW5nIHBhcnRzIG9mIHguCisKKwlJZiAoKHoxJjB4MDNmZmZmZmYpIT0wKQkuLi4gbm90IGV4YWN0IGlmIHRyYWlsaW5nIDI2IGJpdHMgb2YgeiE9MAorCSAgICBJIDo9IDE7CQkuLi4gUmFpc2UgSW5leGFjdCBmbGFnOiB6IGlzIG5vdCBleGFjdAorCWVsc2UgeworCSAgICBqIDo9IDEgLSBbKHgwPj4yMCkmMV0JLi4uIGogPSBsb2diKHgpIG1vZCAyCisJICAgIGsgOj0gejEgPj4gMjY7CQkuLi4gZ2V0IHoncyAyNS10aCBhbmQgMjYtdGggCisJCQkJCSAgICBmcmFjdGlvbiBiaXRzCisJICAgIEkgOj0gaSBvciAoayZqKSBvciAoKGsmKGoraisxKSkhPSh4MSYzKSk7CisJfQorCVI6PSByCQkuLi4gcmVzdG9yZSByb3VuZGVkIG1vZGUKKwlyZXR1cm4gc3FydCh4KTo9ei4KKworCUlmIG11bHRpcGxpY2F0aW9uIGlzIGNoZWFwZXIgdGhlbiB0aGUgZm9yZWdvaW5nIHJlZCB0YXBlLCB0aGUgCisJSW5leGFjdCBmbGFnIGNhbiBiZSBldmFsdWF0ZWQgYnkKKworCSAgICBJIDo9IGk7CisJICAgIEkgOj0gKHoqeiE9eCkgb3IgSS4KKworCU5vdGUgdGhhdCB6KnogY2FuIG92ZXJ3cml0ZSBJOyB0aGlzIHZhbHVlIG11c3QgYmUgc2Vuc2VkIGlmIGl0IGlzIAorCVRydWUuCisKKwlSZW1hcmsgNC4gSWYgeip6ID0geCBleGFjdGx5LCB0aGVuIGJpdCAyNSB0byBiaXQgMCBvZiB6MSBtdXN0IGJlCisJemVyby4KKworCQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJejE6IHwgICAgICAgIGYyICAgICAgICB8IAorCQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJYml0IDMxCQkgICBiaXQgMAorCisJRnVydGhlciBtb3JlLCBiaXQgMjcgYW5kIDI2IG9mIHoxLCBiaXQgMCBhbmQgMSBvZiB4MSwgYW5kIHRoZSBvZGQKKwlvciBldmVuIG9mIGxvZ2IoeCkgaGF2ZSB0aGUgZm9sbG93aW5nIHJlbGF0aW9uczoKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwliaXQgMjcsMjYgb2YgejEJCWJpdCAxLDAgb2YgeDEJbG9nYih4KQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkwMAkJCTAwCQlvZGQgYW5kIGV2ZW4KKwkwMQkJCTAxCQlldmVuCisJMTAJCQkxMAkJb2RkCisJMTAJCQkwMAkJZXZlbgorCTExCQkJMDEJCWV2ZW4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAoNCkJU3BlY2lhbCBjYXNlcyAoc2VlICg0KSBvZiBTZWN0aW9uIEEpLgkKKyAKKyAqLworIApkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zcXJ0Zi5jIGIvbGlibS9zcmMvZV9zcXJ0Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzllZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3NxcnRmLmMKQEAgLTAsMCArMSw4OSBAQAorLyogZV9zcXJ0Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9zcXJ0LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3NxcnRmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYwljb25zdCBmbG9hdAlvbmUJPSAxLjAsIHRpbnk9MS4wZS0zMDsKKworZmxvYXQKK19faWVlZTc1NF9zcXJ0ZihmbG9hdCB4KQoreworCWZsb2F0IHo7CisJaW50MzJfdCBzaWduID0gKGludCkweDgwMDAwMDAwOworCWludDMyX3QgaXgscyxxLG0sdCxpOworCXVfaW50MzJfdCByOworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisKKyAgICAvKiB0YWtlIGNhcmUgb2YgSW5mIGFuZCBOYU4gKi8KKwlpZigoaXgmMHg3ZjgwMDAwMCk9PTB4N2Y4MDAwMDApIHsKKwkgICAgcmV0dXJuIHgqeCt4OwkJLyogc3FydChOYU4pPU5hTiwgc3FydCgraW5mKT0raW5mCisJCQkJCSAgIHNxcnQoLWluZik9c05hTiAqLworCX0KKyAgICAvKiB0YWtlIGNhcmUgb2YgemVybyAqLworCWlmKGl4PD0wKSB7CisJICAgIGlmKChpeCYofnNpZ24pKT09MCkgcmV0dXJuIHg7Lyogc3FydCgrLTApID0gKy0wICovCisJICAgIGVsc2UgaWYoaXg8MCkKKwkJcmV0dXJuICh4LXgpLyh4LXgpOwkJLyogc3FydCgtdmUpID0gc05hTiAqLworCX0KKyAgICAvKiBub3JtYWxpemUgeCAqLworCW0gPSAoaXg+PjIzKTsKKwlpZihtPT0wKSB7CQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIGZvcihpPTA7KGl4JjB4MDA4MDAwMDApPT0wO2krKykgaXg8PD0xOworCSAgICBtIC09IGktMTsKKwl9CisJbSAtPSAxMjc7CS8qIHVuYmlhcyBleHBvbmVudCAqLworCWl4ID0gKGl4JjB4MDA3ZmZmZmYpfDB4MDA4MDAwMDA7CisJaWYobSYxKQkvKiBvZGQgbSwgZG91YmxlIHggdG8gbWFrZSBpdCBldmVuICovCisJICAgIGl4ICs9IGl4OworCW0gPj49IDE7CS8qIG0gPSBbbS8yXSAqLworCisgICAgLyogZ2VuZXJhdGUgc3FydCh4KSBiaXQgYnkgYml0ICovCisJaXggKz0gaXg7CisJcSA9IHMgPSAwOwkJLyogcSA9IHNxcnQoeCkgKi8KKwlyID0gMHgwMTAwMDAwMDsJCS8qIHIgPSBtb3ZpbmcgYml0IGZyb20gcmlnaHQgdG8gbGVmdCAqLworCisJd2hpbGUociE9MCkgeworCSAgICB0ID0gcytyOworCSAgICBpZih0PD1peCkgeworCQlzICAgID0gdCtyOworCQlpeCAgLT0gdDsKKwkJcSAgICs9IHI7CisJICAgIH0KKwkgICAgaXggKz0gaXg7CisJICAgIHI+Pj0xOworCX0KKworICAgIC8qIHVzZSBmbG9hdGluZyBhZGQgdG8gZmluZCBvdXQgcm91bmRpbmcgZGlyZWN0aW9uICovCisJaWYoaXghPTApIHsKKwkgICAgeiA9IG9uZS10aW55OyAvKiB0cmlnZ2VyIGluZXhhY3QgZmxhZyAqLworCSAgICBpZiAoej49b25lKSB7CisJICAgICAgICB6ID0gb25lK3Rpbnk7CisJCWlmICh6Pm9uZSkKKwkJICAgIHEgKz0gMjsKKwkJZWxzZQorCQkgICAgcSArPSAocSYxKTsKKwkgICAgfQorCX0KKwlpeCA9IChxPj4xKSsweDNmMDAwMDAwOworCWl4ICs9IChtIDw8MjMpOworCVNFVF9GTE9BVF9XT1JEKHosaXgpOworCXJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZnBtYXRoLmggYi9saWJtL3NyYy9mcG1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzliZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZnBtYXRoLmgKQEAgLTAsMCArMSw3MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWlrZSBCYXJjcm9mdCA8bWlrZUBGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvaW5jbHVkZS9mcG1hdGguaCx2IDEuMyAyMDA1LzAyLzA2IDAzOjIzOjMxIGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlICJfZnBtYXRoLmgiCisKK3VuaW9uIElFRUVmMmJpdHMgeworCWZsb2F0CWY7CisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJCXVuc2lnbmVkIGludAltYW4JOjIzOworCQl1bnNpZ25lZCBpbnQJZXhwCTo4OworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKyNlbHNlIC8qIF9CSUdfRU5ESUFOICovCisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJZXhwCTo4OworCQl1bnNpZ25lZCBpbnQJbWFuCToyMzsKKyNlbmRpZgorCX0gYml0czsKK307CisKKyNkZWZpbmUJREJMX01BTkhfU0laRQkyMAorI2RlZmluZQlEQkxfTUFOTF9TSVpFCTMyCisKK3VuaW9uIElFRUVkMmJpdHMgeworCWRvdWJsZQlkOworCXN0cnVjdCB7CisvKiAjaWZkZWYgX19BUk1FQl9fICovCisjaWYgKF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4pIHx8IChkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fVkZQX0ZQX18pKQorCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworI2VsaWYgIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gCisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisjZW5kaWYKKwl9IGJpdHM7Cit9OwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19jb3MuYyBiL2xpYm0vc3JjL2tfY29zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MTZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfY29zLmMKQEAgLTAsMCArMSw3OSBAQAorCisvKiBAKCMpa19jb3MuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19jb3MuYyx2IDEuMTAgMjAwNS8xMC8yNiAxMjozNjoxOCBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBfX2tlcm5lbF9jb3MoIHgsICB5ICkKKyAqIGtlcm5lbCBjb3MgZnVuY3Rpb24gb24gWy1waS80LCBwaS80XSwgcGkvNCB+IDAuNzg1Mzk4MTY0CisgKiBJbnB1dCB4IGlzIGFzc3VtZWQgdG8gYmUgYm91bmRlZCBieSB+cGkvNCBpbiBtYWduaXR1ZGUuCisgKiBJbnB1dCB5IGlzIHRoZSB0YWlsIG9mIHguIAorICoKKyAqIEFsZ29yaXRobQorICoJMS4gU2luY2UgY29zKC14KSA9IGNvcyh4KSwgd2UgbmVlZCBvbmx5IHRvIGNvbnNpZGVyIHBvc2l0aXZlIHguCisgKgkyLiBpZiB4IDwgMl4tMjcgKGh4PDB4M2U0MDAwMDAgMCksIHJldHVybiAxIHdpdGggaW5leGFjdCBpZiB4IT0wLgorICoJMy4gY29zKHgpIGlzIGFwcHJveGltYXRlZCBieSBhIHBvbHlub21pYWwgb2YgZGVncmVlIDE0IG9uCisgKgkgICBbMCxwaS80XQorICoJCSAgCSAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgIDE0CisgKgkgICAJY29zKHgpIH4gMSAtIHgqeC8yICsgQzEqeCArIC4uLiArIEM2KngKKyAqCSAgIHdoZXJlIHRoZSByZW1leiBlcnJvciBpcworICoJCisgKiAJfCAgICAgICAgICAgICAgMiAgICAgNCAgICAgNiAgICAgOCAgICAgMTAgICAgMTIgICAgIDE0IHwgICAgIC01OAorICogCXxjb3MoeCktKDEtLjUqeCArQzEqeCArQzIqeCArQzMqeCArQzQqeCArQzUqeCAgK0M2KnggICl8IDw9IDIKKyAqIAl8ICAgIAkJCQkJICAgICAgICAgICAgICAgfCAKKyAqIAorICogCSAgICAgICAgICAgICAgIDQgICAgIDYgICAgIDggICAgIDEwICAgIDEyICAgICAxNCAKKyAqCTQuIGxldCByID0gQzEqeCArQzIqeCArQzMqeCArQzQqeCArQzUqeCAgK0M2KnggICwgdGhlbgorICoJICAgICAgIGNvcyh4KSB+IDEgLSB4KngvMiArIHIKKyAqCSAgIHNpbmNlIGNvcyh4K3kpIH4gY29zKHgpIC0gc2luKHgpKnkgCisgKgkJCSAgfiBjb3MoeCkgLSB4KnksCisgKgkgICBhIGNvcnJlY3Rpb24gdGVybSBpcyBuZWNlc3NhcnkgaW4gY29zKHgpIGFuZCBoZW5jZQorICoJCWNvcyh4K3kpID0gMSAtICh4KngvMiAtIChyIC0geCp5KSkKKyAqCSAgIEZvciBiZXR0ZXIgYWNjdXJhY3ksIHJlYXJyYW5nZSB0bworICoJCWNvcyh4K3kpIH4gdyArICh0bXAgKyAoci14KnkpKQorICoJICAgd2hlcmUgdyA9IDEgLSB4KngvMiBhbmQgdG1wIGlzIGEgdGlueSBjb3JyZWN0aW9uIHRlcm0KKyAqCSAgICgxIC0geCp4LzIgPT0gdyArIHRtcCBleGFjdGx5IGluIGluZmluaXRlIHByZWNpc2lvbikuCisgKgkgICBUaGUgZXhhY3RuZXNzIG9mIHcgKyB0bXAgaW4gaW5maW5pdGUgcHJlY2lzaW9uIGRlcGVuZHMgb24gdworICoJICAgYW5kIHRtcCBoYXZpbmcgdGhlIHNhbWUgcHJlY2lzaW9uIGFzIHguICBJZiB0aGV5IGhhdmUgZXh0cmEKKyAqCSAgIHByZWNpc2lvbiBkdWUgdG8gY29tcGlsZXIgYnVncywgdGhlbiB0aGUgZXh0cmEgcHJlY2lzaW9uIGlzCisgKgkgICBvbmx5IGdvb2QgcHJvdmlkZWQgaXQgaXMgcmV0YWluZWQgaW4gYWxsIHRlcm1zIG9mIHRoZSBmaW5hbAorICoJICAgZXhwcmVzc2lvbiBmb3IgY29zKCkuICBSZXRlbnRpb24gaGFwcGVucyBpbiBhbGwgY2FzZXMgdGVzdGVkCisgKgkgICB1bmRlciBGcmVlQlNELCBzbyBkb24ndCBwZXNzaW1pemUgdGhpbmdzIGJ5IGZvcmNpYmx5IGNsaXBwaW5nCisgKgkgICBhbnkgZXh0cmEgcHJlY2lzaW9uIGluIHcuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitDMSAgPSAgNC4xNjY2NjY2NjY2NjY2NjAxOTAzN2UtMDIsIC8qIDB4M0ZBNTU1NTUsIDB4NTU1NTU1NEMgKi8KK0MyICA9IC0xLjM4ODg4ODg4ODg4NzQxMDk1NzQ5ZS0wMywgLyogMHhCRjU2QzE2QywgMHgxNkMxNTE3NyAqLworQzMgID0gIDIuNDgwMTU4NzI4OTQ3NjcyOTQxNzhlLTA1LCAvKiAweDNFRkEwMUEwLCAweDE5Q0IxNTkwICovCitDNCAgPSAtMi43NTU3MzE0MzUxMzkwNjYzMzAzNWUtMDcsIC8qIDB4QkU5MjdFNEYsIDB4ODA5QzUyQUQgKi8KK0M1ICA9ICAyLjA4NzU3MjMyMTI5ODE3NDgyNzkwZS0wOSwgLyogMHgzRTIxRUU5RSwgMHhCREI0QjFDNCAqLworQzYgID0gLTEuMTM1OTY0NzU1Nzc4ODE5NDgyNjVlLTExOyAvKiAweEJEQThGQUU5LCAweEJFODgzOEQ0ICovCisKK2RvdWJsZQorX19rZXJuZWxfY29zKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlkb3VibGUgaHoseixyLHc7CisKKwl6ICA9IHgqeDsKKwlyICA9IHoqKEMxK3oqKEMyK3oqKEMzK3oqKEM0K3oqKEM1K3oqQzYpKSkpKTsKKwloeiA9IChmbG9hdCkwLjUqejsKKwl3ICA9IG9uZS1oejsKKwlyZXR1cm4gdyArICgoKG9uZS13KS1oeikgKyAoeipyLXgqeSkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19jb3NmLmMgYi9saWJtL3NyYy9rX2Nvc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA4ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19jb3NmLmMKQEAgLTAsMCArMSw0NyBAQAorLyoga19jb3NmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX2Nvcy5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIERlYnVnZ2VkIGFuZCBvcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIElOTElORV9LRVJORUxfQ09TREYKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX2Nvc2YuYyx2IDEuMTUgMjAwNS8xMS8zMCAxMTo1MToxNyBiZGUgRXhwICQiOworI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogfGNvcyh4KSAtIGMoeCl8IDwgMioqLTM0LjEgKH5bLTUuMzdlLTExLCA1LjI5NWUtMTFdKS4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZSA9ICAxLjAsCitDMCAgPSAtMHgxZmZmZmZmZDBjNWU4MS4wcC01NCwJLyogLTAuNDk5OTk5OTk3MjUxMDMxMDAzMTIwICovCitDMSAgPSAgMHgxNTU1NTNlMTA1M2E0Mi4wcC01NywJLyogIDAuMDQxNjY2NjIzMzIzNzM5MDYzMTg5NCAqLworQzIgID0gLTB4MTZjMDg3ZTgwZjFlMjcuMHAtNjIsCS8qIC0wLjAwMTM4ODY3NjM3NzQ2MDk5Mjk0NjkyICovCitDMyAgPSAgMHgxOTkzNDJlMGVlNTA2OS4wcC02ODsJLyogIDAuMDAwMDI0MzkwNDQ4Nzk2Mjc3NDA5MDY1NCAqLworCisjaWZkZWYgSU5MSU5FX0tFUk5FTF9DT1NERgorZXh0ZXJuIGlubGluZQorI2VuZGlmCitmbG9hdAorX19rZXJuZWxfY29zZGYoZG91YmxlIHgpCit7CisJZG91YmxlIHIsIHcsIHo7CisKKwkvKiBUcnkgdG8gb3B0aW1pemUgZm9yIHBhcmFsbGVsIGV2YWx1YXRpb24gYXMgaW4ga190YW5mLmMuICovCisJeiA9IHgqeDsKKwl3ID0geip6OworCXIgPSBDMit6KkMzOworCXJldHVybiAoKG9uZSt6KkMwKSArIHcqQzEpICsgKHcqeikqcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfcmVtX3BpbzIuYyBiL2xpYm0vc3JjL2tfcmVtX3BpbzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE2ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19yZW1fcGlvMi5jCkBAIC0wLDAgKzEsMzA0IEBACisKKy8qIEAoIylrX3JlbV9waW8yLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfcmVtX3BpbzIuYyx2IDEuNyAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9fa2VybmVsX3JlbV9waW8yKHgseSxlMCxueCxwcmVjLGlwaW8yKQorICogZG91YmxlIHhbXSx5W107IGludCBlMCxueCxwcmVjOyBpbnQgaXBpbzJbXTsKKyAqIAorICogX19rZXJuZWxfcmVtX3BpbzIgcmV0dXJuIHRoZSBsYXN0IHRocmVlIGRpZ2l0cyBvZiBOIHdpdGggCisgKgkJeSA9IHggLSBOKnBpLzIKKyAqIHNvIHRoYXQgfHl8IDwgcGkvMi4KKyAqCisgKiBUaGUgbWV0aG9kIGlzIHRvIGNvbXB1dGUgdGhlIGludGVnZXIgKG1vZCA4KSBhbmQgZnJhY3Rpb24gcGFydHMgb2YgCisgKiAoMi9waSkqeCB3aXRob3V0IGRvaW5nIHRoZSBmdWxsIG11bHRpcGxpY2F0aW9uLiBJbiBnZW5lcmFsIHdlCisgKiBza2lwIHRoZSBwYXJ0IG9mIHRoZSBwcm9kdWN0IHRoYXQgYXJlIGtub3duIHRvIGJlIGEgaHVnZSBpbnRlZ2VyICgKKyAqIG1vcmUgYWNjdXJhdGVseSwgPSAwIG1vZCA4ICkuIFRodXMgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zIGFyZQorICogaW5kZXBlbmRlbnQgb2YgdGhlIGV4cG9uZW50IG9mIHRoZSBpbnB1dC4KKyAqCisgKiAoMi9waSkgaXMgcmVwcmVzZW50ZWQgYnkgYW4gYXJyYXkgb2YgMjQtYml0IGludGVnZXJzIGluIGlwaW8yW10uCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqIAl4W10JVGhlIGlucHV0IHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlKSBpcyBicm9rZW4gaW50byBueCAKKyAqCQlwaWVjZXMgb2YgMjQtYml0IGludGVnZXJzIGluIGRvdWJsZSBwcmVjaXNpb24gZm9ybWF0LgorICoJCXhbaV0gd2lsbCBiZSB0aGUgaS10aCAyNCBiaXQgb2YgeC4gVGhlIHNjYWxlZCBleHBvbmVudCAKKyAqCQlvZiB4WzBdIGlzIGdpdmVuIGluIGlucHV0IHBhcmFtZXRlciBlMCAoaS5lLiwgeFswXSoyXmUwIAorICoJCW1hdGNoIHgncyB1cCB0byAyNCBiaXRzLgorICoKKyAqCQlFeGFtcGxlIG9mIGJyZWFraW5nIGEgZG91YmxlIHBvc2l0aXZlIHogaW50byB4WzBdK3hbMV0reFsyXToKKyAqCQkJZTAgPSBpbG9nYih6KS0yMworICoJCQl6ICA9IHNjYWxibih6LC1lMCkKKyAqCQlmb3IgaSA9IDAsMSwyCisgKgkJCXhbaV0gPSBmbG9vcih6KQorICoJCQl6ICAgID0gKHoteFtpXSkqMioqMjQKKyAqCisgKgorICoJeVtdCW91cHV0IHJlc3VsdCBpbiBhbiBhcnJheSBvZiBkb3VibGUgcHJlY2lzaW9uIG51bWJlcnMuCisgKgkJVGhlIGRpbWVuc2lvbiBvZiB5W10gaXM6CisgKgkJCTI0LWJpdCAgcHJlY2lzaW9uCTEKKyAqCQkJNTMtYml0ICBwcmVjaXNpb24JMgorICoJCQk2NC1iaXQgIHByZWNpc2lvbgkyCisgKgkJCTExMy1iaXQgcHJlY2lzaW9uCTMKKyAqCQlUaGUgYWN0dWFsIHZhbHVlIGlzIHRoZSBzdW0gb2YgdGhlbS4gVGh1cyBmb3IgMTEzLWJpdAorICoJCXByZWNpc29uLCBvbmUgbWF5IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2U6CisgKgorICoJCWxvbmcgZG91YmxlIHQsdyxyX2hlYWQsIHJfdGFpbDsKKyAqCQl0ID0gKGxvbmcgZG91YmxlKXlbMl0gKyAobG9uZyBkb3VibGUpeVsxXTsKKyAqCQl3ID0gKGxvbmcgZG91YmxlKXlbMF07CisgKgkJcl9oZWFkID0gdCt3OworICoJCXJfdGFpbCA9IHcgLSAocl9oZWFkIC0gdCk7CisgKgorICoJZTAJVGhlIGV4cG9uZW50IG9mIHhbMF0KKyAqCisgKglueAlkaW1lbnNpb24gb2YgeFtdCisgKgorICogIAlwcmVjCWFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgcHJlY2lzaW9uOgorICoJCQkwCTI0ICBiaXRzIChzaW5nbGUpCisgKgkJCTEJNTMgIGJpdHMgKGRvdWJsZSkKKyAqCQkJMgk2NCAgYml0cyAoZXh0ZW5kZWQpCisgKgkJCTMJMTEzIGJpdHMgKHF1YWQpCisgKgorICoJaXBpbzJbXQorICoJCWludGVnZXIgYXJyYXksIGNvbnRhaW5zIHRoZSAoMjQqaSktdGggdG8gKDI0KmkrMjMpLXRoIAorICoJCWJpdCBvZiAyL3BpIGFmdGVyIGJpbmFyeSBwb2ludC4gVGhlIGNvcnJlc3BvbmRpbmcgCisgKgkJZmxvYXRpbmcgdmFsdWUgaXMKKyAqCisgKgkJCWlwaW8yW2ldICogMl4oLTI0KGkrMSkpLgorICoKKyAqIEV4dGVybmFsIGZ1bmN0aW9uOgorICoJZG91YmxlIHNjYWxibigpLCBmbG9vcigpOworICoKKyAqCisgKiBIZXJlIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBzb21lIGxvY2FsIHZhcmlhYmxlczoKKyAqCisgKiAJamsJamsrMSBpcyB0aGUgaW5pdGlhbCBudW1iZXIgb2YgdGVybXMgb2YgaXBpbzJbXSBuZWVkZWQKKyAqCQlpbiB0aGUgY29tcHV0YXRpb24uIFRoZSByZWNvbW1lbmRlZCB2YWx1ZSBpcyAyLDMsNCwKKyAqCQk2IGZvciBzaW5nbGUsIGRvdWJsZSwgZXh0ZW5kZWQsYW5kIHF1YWQuCisgKgorICogCWp6CWxvY2FsIGludGVnZXIgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIAorICoJCXRlcm1zIG9mIGlwaW8yW10gdXNlZC4gCisgKgorICoJangJbnggLSAxCisgKgorICoJanYJaW5kZXggZm9yIHBvaW50aW5nIHRvIHRoZSBzdWl0YWJsZSBpcGlvMltdIGZvciB0aGUKKyAqCQljb21wdXRhdGlvbi4gSW4gZ2VuZXJhbCwgd2Ugd2FudAorICoJCQkoIDJeZTAqeFswXSAqIGlwaW8yW2p2LTFdKjJeKC0yNGp2KSApLzgKKyAqCQlpcyBhbiBpbnRlZ2VyLiBUaHVzCisgKgkJCWUwLTMtMjQqanYgPj0gMCBvciAoZTAtMykvMjQgPj0ganYKKyAqCQlIZW5jZSBqdiA9IG1heCgwLChlMC0zKS8yNCkuCisgKgorICoJanAJanArMSBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGluIFBJbzJbXSBuZWVkZWQsIGpwID0gamsuCisgKgorICogCXFbXQlkb3VibGUgYXJyYXkgd2l0aCBpbnRlZ3JhbCB2YWx1ZSwgcmVwcmVzZW50aW5nIHRoZQorICoJCTI0LWJpdHMgY2h1bmsgb2YgdGhlIHByb2R1Y3Qgb2YgeCBhbmQgMi9waS4KKyAqCisgKglxMAl0aGUgY29ycmVzcG9uZGluZyBleHBvbmVudCBvZiBxWzBdLiBOb3RlIHRoYXQgdGhlCisgKgkJZXhwb25lbnQgZm9yIHFbaV0gd291bGQgYmUgcTAtMjQqaS4KKyAqCisgKglQSW8yW10JZG91YmxlIHByZWNpc2lvbiBhcnJheSwgb2J0YWluZWQgYnkgY3V0dGluZyBwaS8yCisgKgkJaW50byAyNCBiaXRzIGNodW5rcy4gCisgKgorICoJZltdCWlwaW8yW10gaW4gZmxvYXRpbmcgcG9pbnQgCisgKgorICoJaXFbXQlpbnRlZ2VyIGFycmF5IGJ5IGJyZWFraW5nIHVwIHFbXSBpbiAyNC1iaXRzIGNodW5rLgorICoKKyAqCWZxW10JZmluYWwgcHJvZHVjdCBvZiB4KigyL3BpKSBpbiBmcVswXSwuLixmcVtqa10KKyAqCisgKglpaAlpbnRlZ2VyLiBJZiA+MCBpdCBpbmRpY2F0ZXMgcVtdIGlzID49IDAuNSwgaGVuY2UKKyAqCQlpdCBhbHNvIGluZGljYXRlcyB0aGUgKnNpZ24qIG9mIHRoZSByZXN1bHQuCisgKgorICovCisKKworLyoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGludCBpbml0X2prW10gPSB7MiwzLDQsNn07IC8qIGluaXRpYWwgdmFsdWUgZm9yIGprICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgUElvMltdID0geworICAxLjU3MDc5NjI1MTI5Njk5NzA3MDMxZSswMCwgLyogMHgzRkY5MjFGQiwgMHg0MDAwMDAwMCAqLworICA3LjU0OTc4OTQxNTg2MTU5NjM1MzM1ZS0wOCwgLyogMHgzRTc0NDQyRCwgMHgwMDAwMDAwMCAqLworICA1LjM5MDMwMjUyOTk1Nzc2NDc2NTU0ZS0xNSwgLyogMHgzQ0Y4NDY5OCwgMHg4MDAwMDAwMCAqLworICAzLjI4MjAwMzQxNTgwNzkxMjk0MTIzZS0yMiwgLyogMHgzQjc4Q0M1MSwgMHg2MDAwMDAwMCAqLworICAxLjI3MDY1NTc1MzA4MDY3NjA3MzQ5ZS0yOSwgLyogMHgzOUYwMUI4MywgMHg4MDAwMDAwMCAqLworICAxLjIyOTMzMzA4OTgxMTExMzI4OTMyZS0zNiwgLyogMHgzODdBMjUyMCwgMHg0MDAwMDAwMCAqLworICAyLjczMzcwMDUzODE2NDY0NTU5NjI0ZS00NCwgLyogMHgzNkUzODIyMiwgMHg4MDAwMDAwMCAqLworICAyLjE2NzQxNjgzODc3ODA0ODE5NDQ0ZS01MSwgLyogMHgzNTY5RjMxRCwgMHgwMDAwMDAwMCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZQkJCQoremVybyAgID0gMC4wLAorb25lICAgID0gMS4wLAordHdvMjQgICA9ICAxLjY3NzcyMTYwMDAwMDAwMDAwMDAwZSswNywgLyogMHg0MTcwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvbjI0ICA9ICA1Ljk2MDQ2NDQ3NzUzOTA2MjUwMDAwZS0wODsgLyogMHgzRTcwMDAwMCwgMHgwMDAwMDAwMCAqLworCisJaW50IF9fa2VybmVsX3JlbV9waW8yKGRvdWJsZSAqeCwgZG91YmxlICp5LCBpbnQgZTAsIGludCBueCwgaW50IHByZWMsIGNvbnN0IGludDMyX3QgKmlwaW8yKQoreworCWludDMyX3QganosangsanYsanAsamssY2FycnksbixpcVsyMF0saSxqLGssbSxxMCxpaDsKKwlkb3VibGUgeixmdyxmWzIwXSxmcVsyMF0scVsyMF07CisKKyAgICAvKiBpbml0aWFsaXplIGprKi8KKwlqayA9IGluaXRfamtbcHJlY107CisJanAgPSBqazsKKworICAgIC8qIGRldGVybWluZSBqeCxqdixxMCwgbm90ZSB0aGF0IDM+cTAgKi8KKwlqeCA9ICBueC0xOworCWp2ID0gKGUwLTMpLzI0OyBpZihqdjwwKSBqdj0wOworCXEwID0gIGUwLTI0KihqdisxKTsKKworICAgIC8qIHNldCB1cCBmWzBdIHRvIGZbangramtdIHdoZXJlIGZbangramtdID0gaXBpbzJbanYramtdICovCisJaiA9IGp2LWp4OyBtID0gangrams7CisJZm9yKGk9MDtpPD1tO2krKyxqKyspIGZbaV0gPSAoajwwKT8gemVybyA6IChkb3VibGUpIGlwaW8yW2pdOworCisgICAgLyogY29tcHV0ZSBxWzBdLHFbMV0sLi4ucVtqa10gKi8KKwlmb3IgKGk9MDtpPD1qaztpKyspIHsKKwkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsgcVtpXSA9IGZ3OworCX0KKworCWp6ID0gams7CityZWNvbXB1dGU6CisgICAgLyogZGlzdGlsbCBxW10gaW50byBpcVtdIHJldmVyc2luZ2x5ICovCisJZm9yKGk9MCxqPWp6LHo9cVtqel07aj4wO2krKyxqLS0pIHsKKwkgICAgZncgICAgPSAgKGRvdWJsZSkoKGludDMyX3QpKHR3b24yNCogeikpOworCSAgICBpcVtpXSA9ICAoaW50MzJfdCkoei10d28yNCpmdyk7CisJICAgIHogICAgID0gIHFbai0xXStmdzsKKwl9CisKKyAgICAvKiBjb21wdXRlIG4gKi8KKwl6ICA9IHNjYWxibih6LHEwKTsJCS8qIGFjdHVhbCB2YWx1ZSBvZiB6ICovCisJeiAtPSA4LjAqZmxvb3IoeiowLjEyNSk7CQkvKiB0cmltIG9mZiBpbnRlZ2VyID49IDggKi8KKwluICA9IChpbnQzMl90KSB6OworCXogLT0gKGRvdWJsZSluOworCWloID0gMDsKKwlpZihxMD4wKSB7CS8qIG5lZWQgaXFbanotMV0gdG8gZGV0ZXJtaW5lIG4gKi8KKwkgICAgaSAgPSAoaXFbanotMV0+PigyNC1xMCkpOyBuICs9IGk7CisJICAgIGlxW2p6LTFdIC09IGk8PCgyNC1xMCk7CisJICAgIGloID0gaXFbanotMV0+PigyMy1xMCk7CisJfSAKKwllbHNlIGlmKHEwPT0wKSBpaCA9IGlxW2p6LTFdPj4yMzsKKwllbHNlIGlmKHo+PTAuNSkgaWg9MjsKKworCWlmKGloPjApIHsJLyogcSA+IDAuNSAqLworCSAgICBuICs9IDE7IGNhcnJ5ID0gMDsKKwkgICAgZm9yKGk9MDtpPGp6IDtpKyspIHsJLyogY29tcHV0ZSAxLXEgKi8KKwkJaiA9IGlxW2ldOworCQlpZihjYXJyeT09MCkgeworCQkgICAgaWYoaiE9MCkgeworCQkJY2FycnkgPSAxOyBpcVtpXSA9IDB4MTAwMDAwMC0gajsKKwkJICAgIH0KKwkJfSBlbHNlICBpcVtpXSA9IDB4ZmZmZmZmIC0gajsKKwkgICAgfQorCSAgICBpZihxMD4wKSB7CQkvKiByYXJlIGNhc2U6IGNoYW5jZSBpcyAxIGluIDEyICovCisJICAgICAgICBzd2l0Y2gocTApIHsKKwkgICAgICAgIGNhc2UgMToKKwkgICAgCSAgIGlxW2p6LTFdICY9IDB4N2ZmZmZmOyBicmVhazsKKwkgICAgCWNhc2UgMjoKKwkgICAgCSAgIGlxW2p6LTFdICY9IDB4M2ZmZmZmOyBicmVhazsKKwkgICAgICAgIH0KKwkgICAgfQorCSAgICBpZihpaD09MikgeworCQl6ID0gb25lIC0gejsKKwkJaWYoY2FycnkhPTApIHogLT0gc2NhbGJuKG9uZSxxMCk7CisJICAgIH0KKwl9CisKKyAgICAvKiBjaGVjayBpZiByZWNvbXB1dGF0aW9uIGlzIG5lZWRlZCAqLworCWlmKHo9PXplcm8pIHsKKwkgICAgaiA9IDA7CisJICAgIGZvciAoaT1qei0xO2k+PWprO2ktLSkgaiB8PSBpcVtpXTsKKwkgICAgaWYoaj09MCkgeyAvKiBuZWVkIHJlY29tcHV0YXRpb24gKi8KKwkJZm9yKGs9MTtpcVtqay1rXT09MDtrKyspOyAgIC8qIGsgPSBuby4gb2YgdGVybXMgbmVlZGVkICovCisKKwkJZm9yKGk9anorMTtpPD1qeitrO2krKykgeyAgIC8qIGFkZCBxW2p6KzFdIHRvIHFbanora10gKi8KKwkJICAgIGZbangraV0gPSAoZG91YmxlKSBpcGlvMltqditpXTsKKwkJICAgIGZvcihqPTAsZnc9MC4wO2o8PWp4O2orKykgZncgKz0geFtqXSpmW2p4K2ktal07CisJCSAgICBxW2ldID0gZnc7CisJCX0KKwkJanogKz0gazsKKwkJZ290byByZWNvbXB1dGU7CisJICAgIH0KKwl9CisKKyAgICAvKiBjaG9wIG9mZiB6ZXJvIHRlcm1zICovCisJaWYoej09MC4wKSB7CisJICAgIGp6IC09IDE7IHEwIC09IDI0OworCSAgICB3aGlsZShpcVtqel09PTApIHsganotLTsgcTAtPTI0O30KKwl9IGVsc2UgeyAvKiBicmVhayB6IGludG8gMjQtYml0IGlmIG5lY2Vzc2FyeSAqLworCSAgICB6ID0gc2NhbGJuKHosLXEwKTsKKwkgICAgaWYoej49dHdvMjQpIHsgCisJCWZ3ID0gKGRvdWJsZSkoKGludDMyX3QpKHR3b24yNCp6KSk7CisJCWlxW2p6XSA9IChpbnQzMl90KSh6LXR3bzI0KmZ3KTsKKwkJanogKz0gMTsgcTAgKz0gMjQ7CisJCWlxW2p6XSA9IChpbnQzMl90KSBmdzsKKwkgICAgfSBlbHNlIGlxW2p6XSA9IChpbnQzMl90KSB6IDsKKwl9CisKKyAgICAvKiBjb252ZXJ0IGludGVnZXIgImJpdCIgY2h1bmsgdG8gZmxvYXRpbmctcG9pbnQgdmFsdWUgKi8KKwlmdyA9IHNjYWxibihvbmUscTApOworCWZvcihpPWp6O2k+PTA7aS0tKSB7CisJICAgIHFbaV0gPSBmdyooZG91YmxlKWlxW2ldOyBmdyo9dHdvbjI0OworCX0KKworICAgIC8qIGNvbXB1dGUgUElvMlswLC4uLixqcF0qcVtqeiwuLi4sMF0gKi8KKwlmb3IoaT1qejtpPj0wO2ktLSkgeworCSAgICBmb3IoZnc9MC4wLGs9MDtrPD1qcCYmazw9anotaTtrKyspIGZ3ICs9IFBJbzJba10qcVtpK2tdOworCSAgICBmcVtqei1pXSA9IGZ3OworCX0KKworICAgIC8qIGNvbXByZXNzIGZxW10gaW50byB5W10gKi8KKwlzd2l0Y2gocHJlYykgeworCSAgICBjYXNlIDA6CisJCWZ3ID0gMC4wOworCQlmb3IgKGk9ano7aT49MDtpLS0pIGZ3ICs9IGZxW2ldOworCQl5WzBdID0gKGloPT0wKT8gZnc6IC1mdzsgCisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJICAgIGNhc2UgMjoKKwkJZncgPSAwLjA7CisJCWZvciAoaT1qejtpPj0wO2ktLSkgZncgKz0gZnFbaV07IAorCQl5WzBdID0gKGloPT0wKT8gZnc6IC1mdzsgCisJCWZ3ID0gZnFbMF0tZnc7CisJCWZvciAoaT0xO2k8PWp6O2krKykgZncgKz0gZnFbaV07CisJCXlbMV0gPSAoaWg9PTApPyBmdzogLWZ3OyAKKwkJYnJlYWs7CisJICAgIGNhc2UgMzoJLyogcGFpbmZ1bCAqLworCQlmb3IgKGk9ano7aT4wO2ktLSkgeworCQkgICAgZncgICAgICA9IGZxW2ktMV0rZnFbaV07IAorCQkgICAgZnFbaV0gICs9IGZxW2ktMV0tZnc7CisJCSAgICBmcVtpLTFdID0gZnc7CisJCX0KKwkJZm9yIChpPWp6O2k+MTtpLS0pIHsKKwkJICAgIGZ3ICAgICAgPSBmcVtpLTFdK2ZxW2ldOyAKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoZnc9MC4wLGk9ano7aT49MjtpLS0pIGZ3ICs9IGZxW2ldOyAKKwkJaWYoaWg9PTApIHsKKwkJICAgIHlbMF0gPSAgZnFbMF07IHlbMV0gPSAgZnFbMV07IHlbMl0gPSAgZnc7CisJCX0gZWxzZSB7CisJCSAgICB5WzBdID0gLWZxWzBdOyB5WzFdID0gLWZxWzFdOyB5WzJdID0gLWZ3OworCQl9CisJfQorCXJldHVybiBuJjc7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3JlbV9waW8yZi5jIGIvbGlibS9zcmMva19yZW1fcGlvMmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWMyOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19yZW1fcGlvMmYuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoga19yZW1fcGlvMmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGtfcmVtX3BpbzIuYworICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19yZW1fcGlvMmYuYyx2IDEuOCAyMDA1LzEwLzExIDA3OjU2OjA1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogSW4gdGhlIGZsb2F0IHZlcnNpb24sIHRoZSBpbnB1dCBwYXJhbWV0ZXIgeCBjb250YWlucyA4IGJpdAorICAgaW50ZWdlcnMsIG5vdCAyNCBiaXQgaW50ZWdlcnMuICAxMTMgYml0IHByZWNpc2lvbiBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KKworc3RhdGljIGNvbnN0IGludCBpbml0X2prW10gPSB7NCw3LDl9OyAvKiBpbml0aWFsIHZhbHVlIGZvciBqayAqLworCitzdGF0aWMgY29uc3QgZmxvYXQgUElvMltdID0geworICAxLjU3MDMxMjUwMDBlKzAwLCAvKiAweDNmYzkwMDAwICovCisgIDQuNTc3NjM2NzE4OGUtMDQsIC8qIDB4MzlmMDAwMDAgKi8KKyAgMi41OTg3NjI1MTIyZS0wNSwgLyogMHgzN2RhMDAwMCAqLworICA3LjU0MzcxMjg1NDRlLTA4LCAvKiAweDMzYTIwMDAwICovCisgIDYuMDAyNjY1MDMxN2UtMTEsIC8qIDB4MmU4NDAwMDAgKi8KKyAgNy4zODk2NDQ0NTE5ZS0xMywgLyogMHgyYjUwMDAwMCAqLworICA1LjM4NDU4MTY2OTRlLTE1LCAvKiAweDI3YzIwMDAwICovCisgIDUuNjM3ODUxMjk2OWUtMTgsIC8qIDB4MjJkMDAwMDAgKi8KKyAgOC4zMDA5MjI4ODMxZS0yMCwgLyogMHgxZmM0MDAwMCAqLworICAzLjI3NTYzNTIyNTdlLTIyLCAvKiAweDFiYzYwMDAwICovCisgIDYuMzMzMTAxNTY0OWUtMjUsIC8qIDB4MTc0NDAwMDAgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdAoremVybyAgID0gMC4wLAorb25lICAgID0gMS4wLAordHdvOCAgID0gIDIuNTYwMDAwMDAwMGUrMDIsIC8qIDB4NDM4MDAwMDAgKi8KK3R3b244ICA9ICAzLjkwNjI1MDAwMDBlLTAzOyAvKiAweDNiODAwMDAwICovCisKKwlpbnQgX19rZXJuZWxfcmVtX3BpbzJmKGZsb2F0ICp4LCBmbG9hdCAqeSwgaW50IGUwLCBpbnQgbngsIGludCBwcmVjLCBjb25zdCBpbnQzMl90ICppcGlvMikKK3sKKwlpbnQzMl90IGp6LGp4LGp2LGpwLGprLGNhcnJ5LG4saXFbMjBdLGksaixrLG0scTAsaWg7CisJZmxvYXQgeixmdyxmWzIwXSxmcVsyMF0scVsyMF07CisKKyAgICAvKiBpbml0aWFsaXplIGprKi8KKwlqayA9IGluaXRfamtbcHJlY107CisJanAgPSBqazsKKworICAgIC8qIGRldGVybWluZSBqeCxqdixxMCwgbm90ZSB0aGF0IDM+cTAgKi8KKwlqeCA9ICBueC0xOworCWp2ID0gKGUwLTMpLzg7IGlmKGp2PDApIGp2PTA7CisJcTAgPSAgZTAtOCooanYrMSk7CisKKyAgICAvKiBzZXQgdXAgZlswXSB0byBmW2p4K2prXSB3aGVyZSBmW2p4K2prXSA9IGlwaW8yW2p2K2prXSAqLworCWogPSBqdi1qeDsgbSA9IGp4K2prOworCWZvcihpPTA7aTw9bTtpKyssaisrKSBmW2ldID0gKGo8MCk/IHplcm8gOiAoZmxvYXQpIGlwaW8yW2pdOworCisgICAgLyogY29tcHV0ZSBxWzBdLHFbMV0sLi4ucVtqa10gKi8KKwlmb3IgKGk9MDtpPD1qaztpKyspIHsKKwkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsgcVtpXSA9IGZ3OworCX0KKworCWp6ID0gams7CityZWNvbXB1dGU6CisgICAgLyogZGlzdGlsbCBxW10gaW50byBpcVtdIHJldmVyc2luZ2x5ICovCisJZm9yKGk9MCxqPWp6LHo9cVtqel07aj4wO2krKyxqLS0pIHsKKwkgICAgZncgICAgPSAgKGZsb2F0KSgoaW50MzJfdCkodHdvbjgqIHopKTsKKwkgICAgaXFbaV0gPSAgKGludDMyX3QpKHotdHdvOCpmdyk7CisJICAgIHogICAgID0gIHFbai0xXStmdzsKKwl9CisKKyAgICAvKiBjb21wdXRlIG4gKi8KKwl6ICA9IHNjYWxibmYoeixxMCk7CQkvKiBhY3R1YWwgdmFsdWUgb2YgeiAqLworCXogLT0gKGZsb2F0KTguMCpmbG9vcmYoeiooZmxvYXQpMC4xMjUpOwkvKiB0cmltIG9mZiBpbnRlZ2VyID49IDggKi8KKwluICA9IChpbnQzMl90KSB6OworCXogLT0gKGZsb2F0KW47CisJaWggPSAwOworCWlmKHEwPjApIHsJLyogbmVlZCBpcVtqei0xXSB0byBkZXRlcm1pbmUgbiAqLworCSAgICBpICA9IChpcVtqei0xXT4+KDgtcTApKTsgbiArPSBpOworCSAgICBpcVtqei0xXSAtPSBpPDwoOC1xMCk7CisJICAgIGloID0gaXFbanotMV0+Pig3LXEwKTsKKwl9CisJZWxzZSBpZihxMD09MCkgaWggPSBpcVtqei0xXT4+NzsKKwllbHNlIGlmKHo+PShmbG9hdCkwLjUpIGloPTI7CisKKwlpZihpaD4wKSB7CS8qIHEgPiAwLjUgKi8KKwkgICAgbiArPSAxOyBjYXJyeSA9IDA7CisJICAgIGZvcihpPTA7aTxqeiA7aSsrKSB7CS8qIGNvbXB1dGUgMS1xICovCisJCWogPSBpcVtpXTsKKwkJaWYoY2Fycnk9PTApIHsKKwkJICAgIGlmKGohPTApIHsKKwkJCWNhcnJ5ID0gMTsgaXFbaV0gPSAweDEwMC0gajsKKwkJICAgIH0KKwkJfSBlbHNlICBpcVtpXSA9IDB4ZmYgLSBqOworCSAgICB9CisJICAgIGlmKHEwPjApIHsJCS8qIHJhcmUgY2FzZTogY2hhbmNlIGlzIDEgaW4gMTIgKi8KKwkgICAgICAgIHN3aXRjaChxMCkgeworCSAgICAgICAgY2FzZSAxOgorCSAgICAJICAgaXFbanotMV0gJj0gMHg3ZjsgYnJlYWs7CisJICAgIAljYXNlIDI6CisJICAgIAkgICBpcVtqei0xXSAmPSAweDNmOyBicmVhazsKKwkgICAgICAgIH0KKwkgICAgfQorCSAgICBpZihpaD09MikgeworCQl6ID0gb25lIC0gejsKKwkJaWYoY2FycnkhPTApIHogLT0gc2NhbGJuZihvbmUscTApOworCSAgICB9CisJfQorCisgICAgLyogY2hlY2sgaWYgcmVjb21wdXRhdGlvbiBpcyBuZWVkZWQgKi8KKwlpZih6PT16ZXJvKSB7CisJICAgIGogPSAwOworCSAgICBmb3IgKGk9anotMTtpPj1qaztpLS0pIGogfD0gaXFbaV07CisJICAgIGlmKGo9PTApIHsgLyogbmVlZCByZWNvbXB1dGF0aW9uICovCisJCWZvcihrPTE7aXFbamsta109PTA7aysrKTsgICAvKiBrID0gbm8uIG9mIHRlcm1zIG5lZWRlZCAqLworCisJCWZvcihpPWp6KzE7aTw9anoraztpKyspIHsgICAvKiBhZGQgcVtqeisxXSB0byBxW2p6K2tdICovCisJCSAgICBmW2p4K2ldID0gKGZsb2F0KSBpcGlvMltqditpXTsKKwkJICAgIGZvcihqPTAsZnc9MC4wO2o8PWp4O2orKykgZncgKz0geFtqXSpmW2p4K2ktal07CisJCSAgICBxW2ldID0gZnc7CisJCX0KKwkJanogKz0gazsKKwkJZ290byByZWNvbXB1dGU7CisJICAgIH0KKwl9CisKKyAgICAvKiBjaG9wIG9mZiB6ZXJvIHRlcm1zICovCisJaWYoej09KGZsb2F0KTAuMCkgeworCSAgICBqeiAtPSAxOyBxMCAtPSA4OworCSAgICB3aGlsZShpcVtqel09PTApIHsganotLTsgcTAtPTg7fQorCX0gZWxzZSB7IC8qIGJyZWFrIHogaW50byA4LWJpdCBpZiBuZWNlc3NhcnkgKi8KKwkgICAgeiA9IHNjYWxibmYoeiwtcTApOworCSAgICBpZih6Pj10d284KSB7CisJCWZ3ID0gKGZsb2F0KSgoaW50MzJfdCkodHdvbjgqeikpOworCQlpcVtqel0gPSAoaW50MzJfdCkoei10d284KmZ3KTsKKwkJanogKz0gMTsgcTAgKz0gODsKKwkJaXFbanpdID0gKGludDMyX3QpIGZ3OworCSAgICB9IGVsc2UgaXFbanpdID0gKGludDMyX3QpIHogOworCX0KKworICAgIC8qIGNvbnZlcnQgaW50ZWdlciAiYml0IiBjaHVuayB0byBmbG9hdGluZy1wb2ludCB2YWx1ZSAqLworCWZ3ID0gc2NhbGJuZihvbmUscTApOworCWZvcihpPWp6O2k+PTA7aS0tKSB7CisJICAgIHFbaV0gPSBmdyooZmxvYXQpaXFbaV07IGZ3Kj10d29uODsKKwl9CisKKyAgICAvKiBjb21wdXRlIFBJbzJbMCwuLi4sanBdKnFbanosLi4uLDBdICovCisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgZm9yKGZ3PTAuMCxrPTA7azw9anAmJms8PWp6LWk7aysrKSBmdyArPSBQSW8yW2tdKnFbaStrXTsKKwkgICAgZnFbanotaV0gPSBmdzsKKwl9CisKKyAgICAvKiBjb21wcmVzcyBmcVtdIGludG8geVtdICovCisJc3dpdGNoKHByZWMpIHsKKwkgICAgY2FzZSAwOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsKKwkJeVswXSA9IChpaD09MCk/IGZ3OiAtZnc7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJICAgIGNhc2UgMjoKKwkJZncgPSAwLjA7CisJCWZvciAoaT1qejtpPj0wO2ktLSkgZncgKz0gZnFbaV07CisJCWZ3ID0gKih2b2xhdGlsZSBmbG9hdCAqKSZmdzsJLyogY2xpcCBhbnkgZXh0cmEgcHJlY2lzaW9uICovCisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OworCQlmdyA9IGZxWzBdLWZ3OworCQlmb3IgKGk9MTtpPD1qejtpKyspIGZ3ICs9IGZxW2ldOworCQl5WzFdID0gKGloPT0wKT8gZnc6IC1mdzsKKwkJYnJlYWs7CisJICAgIGNhc2UgMzoJLyogcGFpbmZ1bCAqLworCQlmb3IgKGk9ano7aT4wO2ktLSkgeworCQkgICAgZncgICAgICA9IGZxW2ktMV0rZnFbaV07CisJCSAgICBmcVtpXSAgKz0gZnFbaS0xXS1mdzsKKwkJICAgIGZxW2ktMV0gPSBmdzsKKwkJfQorCQlmb3IgKGk9ano7aT4xO2ktLSkgeworCQkgICAgZncgICAgICA9IGZxW2ktMV0rZnFbaV07CisJCSAgICBmcVtpXSAgKz0gZnFbaS0xXS1mdzsKKwkJICAgIGZxW2ktMV0gPSBmdzsKKwkJfQorCQlmb3IgKGZ3PTAuMCxpPWp6O2k+PTI7aS0tKSBmdyArPSBmcVtpXTsKKwkJaWYoaWg9PTApIHsKKwkJICAgIHlbMF0gPSAgZnFbMF07IHlbMV0gPSAgZnFbMV07IHlbMl0gPSAgZnc7CisJCX0gZWxzZSB7CisJCSAgICB5WzBdID0gLWZxWzBdOyB5WzFdID0gLWZxWzFdOyB5WzJdID0gLWZ3OworCQl9CisJfQorCXJldHVybiBuJjc7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3Npbi5jIGIvbGlibS9zcmMva19zaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTA2YTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19zaW4uYwpAQCAtMCwwICsxLDcwIEBACisKKy8qIEAoIylrX3Npbi5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3Npbi5jLHYgMS4xMCAyMDA1LzExLzAyIDEzOjA2OjQ5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogX19rZXJuZWxfc2luKCB4LCB5LCBpeSkKKyAqIGtlcm5lbCBzaW4gZnVuY3Rpb24gb24gflstcGkvNCwgcGkvNF0gKGV4Y2VwdCBvbiAtMCksIHBpLzQgfiAwLjc4NTQKKyAqIElucHV0IHggaXMgYXNzdW1lZCB0byBiZSBib3VuZGVkIGJ5IH5waS80IGluIG1hZ25pdHVkZS4KKyAqIElucHV0IHkgaXMgdGhlIHRhaWwgb2YgeC4KKyAqIElucHV0IGl5IGluZGljYXRlcyB3aGV0aGVyIHkgaXMgMC4gKGlmIGl5PTAsIHkgYXNzdW1lIHRvIGJlIDApLiAKKyAqCisgKiBBbGdvcml0aG0KKyAqCTEuIFNpbmNlIHNpbigteCkgPSAtc2luKHgpLCB3ZSBuZWVkIG9ubHkgdG8gY29uc2lkZXIgcG9zaXRpdmUgeC4gCisgKgkyLiBDYWxsZXJzIG11c3QgcmV0dXJuIHNpbigtMCkgPSAtMCB3aXRob3V0IGNhbGxpbmcgaGVyZSBzaW5jZSBvdXIKKyAqCSAgIG9kZCBwb2x5bm9taWFsIGlzIG5vdCBldmFsdWF0ZWQgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgLTAuCisgKgkgICBDYWxsZXJzIG1heSBkbyB0aGUgb3B0aW1pemF0aW9uIHNpbih4KSB+IHggZm9yIHRpbnkgeC4KKyAqCTMuIHNpbih4KSBpcyBhcHByb3hpbWF0ZWQgYnkgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxMyBvbgorICoJICAgWzAscGkvNF0KKyAqCQkgIAkgICAgICAgICAzICAgICAgICAgICAgMTMKKyAqCSAgIAlzaW4oeCkgfiB4ICsgUzEqeCArIC4uLiArIFM2KngKKyAqCSAgIHdoZXJlCisgKgkKKyAqIAl8c2luKHgpICAgICAgICAgMiAgICAgNCAgICAgNiAgICAgOCAgICAgMTAgICAgIDEyICB8ICAgICAtNTgKKyAqIAl8LS0tLS0gLSAoMStTMSp4ICtTMip4ICtTMyp4ICtTNCp4ICtTNSp4ICArUzYqeCAgICl8IDw9IDIKKyAqIAl8ICB4IAkJCQkJICAgICAgICAgICB8IAorICogCisgKgk0LiBzaW4oeCt5KSA9IHNpbih4KSArIHNpbicoeCcpKnkKKyAqCQkgICAgfiBzaW4oeCkgKyAoMS14KngvMikqeQorICoJICAgRm9yIGJldHRlciBhY2N1cmFjeSwgbGV0IAorICoJCSAgICAgMyAgICAgIDIgICAgICAyICAgICAgMiAgICAgIDIKKyAqCQlyID0geCAqKFMyK3ggKihTMyt4ICooUzQreCAqKFM1K3ggKlM2KSkpKQorICoJICAgdGhlbiAgICAgICAgICAgICAgICAgICAzICAgIDIKKyAqCQlzaW4oeCkgPSB4ICsgKFMxKnggKyAoeCAqKHIteS8yKSt5KSkKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitoYWxmID0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCitTMSAgPSAtMS42NjY2NjY2NjY2NjY2NjMyNDM0OGUtMDEsIC8qIDB4QkZDNTU1NTUsIDB4NTU1NTU1NDkgKi8KK1MyICA9ICA4LjMzMzMzMzMzMzMyMjQ4OTQ2MTI0ZS0wMywgLyogMHgzRjgxMTExMSwgMHgxMTEwRjhBNiAqLworUzMgID0gLTEuOTg0MTI2OTgyOTg1Nzk0OTMxMzRlLTA0LCAvKiAweEJGMkEwMUEwLCAweDE5QzE2MUQ1ICovCitTNCAgPSAgMi43NTU3MzEzNzA3MDcwMDY3Njc4OWUtMDYsIC8qIDB4M0VDNzFERTMsIDB4NTdCMUZFN0QgKi8KK1M1ICA9IC0yLjUwNTA3NjAyNTM0MDY4NjM0MTk1ZS0wOCwgLyogMHhCRTVBRTVFNiwgMHg4QTJCOUNFQiAqLworUzYgID0gIDEuNTg5NjkwOTk1MjExNTUwMTAyMjFlLTEwOyAvKiAweDNERTVEOTNBLCAweDVBQ0ZENTdDICovCisKK2RvdWJsZQorX19rZXJuZWxfc2luKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50IGl5KQoreworCWRvdWJsZSB6LHIsdjsKKworCXoJPSAgeCp4OworCXYJPSAgeip4OworCXIJPSAgUzIreiooUzMreiooUzQreiooUzUreipTNikpKTsKKwlpZihpeT09MCkgcmV0dXJuIHgrdiooUzEreipyKTsKKwllbHNlICAgICAgcmV0dXJuIHgtKCh6KihoYWxmKnktdipyKS15KS12KlMxKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfc2luZi5jIGIvbGlibS9zcmMva19zaW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1ZGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfc2luZi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIGtfc2luZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Yga19zaW4uYworICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIElOTElORV9LRVJORUxfU0lOREYKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3NpbmYuYyx2IDEuMTMgMjAwNS8xMS8zMCAxMTo1MToxNyBiZGUgRXhwICQiOworI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogfHNpbih4KS94IC0gcyh4KXwgPCAyKiotMzcuNSAoflstNC44OWUtMTIsIDQuODI0ZS0xMl0pLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorUzEgPSAtMHgxNTU1NTU1NGNiYWM3Ny4wcC01NSwJLyogLTAuMTY2NjY2NjY2NDE2MjY1MjM1NTk1ICovCitTMiA9ICAweDExMTExMDg5NmVmYmIyLjBwLTU5LAkvKiAgMC4wMDgzMzMzMjkzODU4ODk0NjMxNzU2ICovCitTMyA9IC0weDFhMDBmOWUyY2FlNzc0LjBwLTY1LAkvKiAtMC4wMDAxOTgzOTMzNDgzNjA5NjYzMTczNDcgKi8KK1M0ID0gIDB4MTZjZDg3OGMzYjQ2YTcuMHAtNzE7CS8qICAwLjAwMDAwMjcxODMxMTQ5Mzk4OTgyMTkwNjQgKi8KKworI2lmZGVmIElOTElORV9LRVJORUxfU0lOREYKK2V4dGVybiBpbmxpbmUKKyNlbmRpZgorZmxvYXQKK19fa2VybmVsX3NpbmRmKGRvdWJsZSB4KQoreworCWRvdWJsZSByLCBzLCB3LCB6OworCisJLyogVHJ5IHRvIG9wdGltaXplIGZvciBwYXJhbGxlbCBldmFsdWF0aW9uIGFzIGluIGtfdGFuZi5jLiAqLworCXogPSB4Kng7CisJdyA9IHoqejsKKwlyID0gUzMreipTNDsKKwlzID0geip4OworCXJldHVybiAoeCArIHMqKFMxK3oqUzIpKSArIHMqdypyOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva190YW4uYyBiL2xpYm0vc3JjL2tfdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmZTE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfdGFuLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qIEAoIylrX3Rhbi5jIDEuNSAwNC8wNC8yMiBTTUkgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBJTkRFTlQgT0ZGICovCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva190YW4uYyx2IDEuMTIgMjAwNS8xMS8wMiAxNDowMTo0NSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIF9fa2VybmVsX3RhbiggeCwgeSwgayApCisgKiBrZXJuZWwgdGFuIGZ1bmN0aW9uIG9uIH5bLXBpLzQsIHBpLzRdIChleGNlcHQgb24gLTApLCBwaS80IH4gMC43ODU0CisgKiBJbnB1dCB4IGlzIGFzc3VtZWQgdG8gYmUgYm91bmRlZCBieSB+cGkvNCBpbiBtYWduaXR1ZGUuCisgKiBJbnB1dCB5IGlzIHRoZSB0YWlsIG9mIHguCisgKiBJbnB1dCBrIGluZGljYXRlcyB3aGV0aGVyIHRhbiAoaWYgayA9IDEpIG9yIC0xL3RhbiAoaWYgayA9IC0xKSBpcyByZXR1cm5lZC4KKyAqCisgKiBBbGdvcml0aG0KKyAqCTEuIFNpbmNlIHRhbigteCkgPSAtdGFuKHgpLCB3ZSBuZWVkIG9ubHkgdG8gY29uc2lkZXIgcG9zaXRpdmUgeC4KKyAqCTIuIENhbGxlcnMgbXVzdCByZXR1cm4gdGFuKC0wKSA9IC0wIHdpdGhvdXQgY2FsbGluZyBoZXJlIHNpbmNlIG91cgorICoJICAgb2RkIHBvbHlub21pYWwgaXMgbm90IGV2YWx1YXRlZCBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyAtMC4KKyAqCSAgIENhbGxlcnMgbWF5IGRvIHRoZSBvcHRpbWl6YXRpb24gdGFuKHgpIH4geCBmb3IgdGlueSB4LgorICoJMy4gdGFuKHgpIGlzIGFwcHJveGltYXRlZCBieSBhIG9kZCBwb2x5bm9taWFsIG9mIGRlZ3JlZSAyNyBvbgorICoJICAgWzAsMC42NzQzNF0KKyAqCQkgIAkgICAgICAgICAzICAgICAgICAgICAgIDI3CisgKgkgICAJdGFuKHgpIH4geCArIFQxKnggKyAuLi4gKyBUMTMqeAorICoJICAgd2hlcmUKKyAqCisgKiAJICAgICAgICB8dGFuKHgpICAgICAgICAgMiAgICAgNCAgICAgICAgICAgIDI2ICAgfCAgICAgLTU5LjIKKyAqIAkgICAgICAgIHwtLS0tLSAtICgxK1QxKnggK1QyKnggKy4uLi4gK1QxMyp4ICAgICl8IDw9IDIKKyAqIAkgICAgICAgIHwgIHggCQkJCQl8CisgKgorICoJICAgTm90ZTogdGFuKHgreSkgPSB0YW4oeCkgKyB0YW4nKHgpKnkKKyAqCQkgICAgICAgICAgfiB0YW4oeCkgKyAoMSt4KngpKnkKKyAqCSAgIFRoZXJlZm9yZSwgZm9yIGJldHRlciBhY2N1cmFjeSBpbiBjb21wdXRpbmcgdGFuKHgreSksIGxldAorICoJCSAgICAgMyAgICAgIDIgICAgICAyICAgICAgIDIgICAgICAgMgorICoJCXIgPSB4ICooVDIreCAqKFQzK3ggKiguLi4reCAqKFQxMit4ICpUMTMpKSkpCisgKgkgICB0aGVuCisgKgkJIAkJICAgIDMgICAgMgorICoJCXRhbih4K3kpID0geCArIChUMSp4ICsgKHggKihyK3kpK3kpKQorICoKKyAqICAgICAgNC4gRm9yIHggaW4gWzAuNjc0MzQscGkvNF0sICBsZXQgeSA9IHBpLzQgLSB4LCB0aGVuCisgKgkJdGFuKHgpID0gdGFuKHBpLzQteSkgPSAoMS10YW4oeSkpLygxK3Rhbih5KSkKKyAqCQkgICAgICAgPSAxIC0gMioodGFuKHkpIC0gKHRhbih5KV4yKS8oMSt0YW4oeSkpKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCitzdGF0aWMgY29uc3QgZG91YmxlIHh4eFtdID0geworCQkgMy4zMzMzMzMzMzMzMzMzNDA5MTk4NmUtMDEsCS8qIDNGRDU1NTU1LCA1NTU1NTU2MyAqLworCQkgMS4zMzMzMzMzMzMzMzIwMTI0MjY5OWUtMDEsCS8qIDNGQzExMTExLCAxMTEwRkU3QSAqLworCQkgNS4zOTY4MjUzOTc2MjI2MDUyMTM3N2UtMDIsCS8qIDNGQUJBMUJBLCAxQkIzNDFGRSAqLworCQkgMi4xODY5NDg4Mjk0ODU5NTQyNDU5OWUtMDIsCS8qIDNGOTY2NEY0LCA4NDA2RDYzNyAqLworCQkgOC44NjMyMzk4MjM1OTkzMDAwNTczN2UtMDMsCS8qIDNGODIyNkUzLCBFOTZFODQ5MyAqLworCQkgMy41OTIwNzkxMDc1OTEzMTIzNTM1NmUtMDMsCS8qIDNGNkQ2RDIyLCBDOTU2MDMyOCAqLworCQkgMS40NTYyMDk0NTQzMjUyOTAyNTUxNmUtMDMsCS8qIDNGNTdEQkM4LCBGRUUwODMxNSAqLworCQkgNS44ODA0MTI0MDgyMDI2NDA5Njg3NGUtMDQsCS8qIDNGNDM0NEQ4LCBGMkYyNjUwMSAqLworCQkgMi40NjQ2MzEzNDgxODQ2OTkwNjgxMmUtMDQsCS8qIDNGMzAyNkY3LCAxQThEMTA2OCAqLworCQkgNy44MTc5NDQ0MjkzOTU1NzA5MjMwMGUtMDUsCS8qIDNGMTQ3RTg4LCBBMDM3OTJBNiAqLworCQkgNy4xNDA3MjQ5MTM4MjYwODE5MDMwNWUtMDUsCS8qIDNGMTJCODBGLCAzMkYwQTdFOSAqLworCQktMS44NTU4NjM3NDg1NTI3NTQ1NjY1NGUtMDUsCS8qIEJFRjM3NUNCLCBEQjYwNTM3MyAqLworCQkgMi41OTA3MzA1MTg2MzYzMzcxMjg4NGUtMDUsCS8qIDNFRkIyQTcwLCA3NEJGN0FENCAqLworLyogb25lICovCSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwJLyogM0ZGMDAwMDAsIDAwMDAwMDAwICovCisvKiBwaW80ICovCSA3Ljg1Mzk4MTYzMzk3NDQ4Mjc4OTk5ZS0wMSwJLyogM0ZFOTIxRkIsIDU0NDQyRDE4ICovCisvKiBwaW80bG8gKi8JIDMuMDYxNjE2OTk3ODY4MzgzMDE3OTNlLTE3CS8qIDNDODFBNjI2LCAzMzE0NUMwNyAqLworfTsKKyNkZWZpbmUJb25lCXh4eFsxM10KKyNkZWZpbmUJcGlvNAl4eHhbMTRdCisjZGVmaW5lCXBpbzRsbwl4eHhbMTVdCisjZGVmaW5lCVQJeHh4CisvKiBJTkRFTlQgT04gKi8KKworZG91YmxlCitfX2tlcm5lbF90YW4oZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgaXkpIHsKKwlkb3VibGUgeiwgciwgdiwgdywgczsKKwlpbnQzMl90IGl4LCBoeDsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CQkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCWlmIChpeCA+PSAweDNGRTU5NDI4KSB7CS8qIHx4fCA+PSAwLjY3NDQgKi8KKwkJaWYgKGh4IDwgMCkgeworCQkJeCA9IC14OworCQkJeSA9IC15OworCQl9CisJCXogPSBwaW80IC0geDsKKwkJdyA9IHBpbzRsbyAtIHk7CisJCXggPSB6ICsgdzsKKwkJeSA9IDAuMDsKKwl9CisJeiA9IHggKiB4OworCXcgPSB6ICogejsKKwkvKgorCSAqIEJyZWFrIHheNSooVFsxXSt4XjIqVFsyXSsuLi4pIGludG8KKwkgKiB4XjUoVFsxXSt4XjQqVFszXSsuLi4reF4yMCpUWzExXSkgKworCSAqIHheNSh4XjIqKFRbMl0reF40KlRbNF0rLi4uK3heMjIqW1QxMl0pKQorCSAqLworCXIgPSBUWzFdICsgdyAqIChUWzNdICsgdyAqIChUWzVdICsgdyAqIChUWzddICsgdyAqIChUWzldICsKKwkJdyAqIFRbMTFdKSkpKTsKKwl2ID0geiAqIChUWzJdICsgdyAqIChUWzRdICsgdyAqIChUWzZdICsgdyAqIChUWzhdICsgdyAqIChUWzEwXSArCisJCXcgKiBUWzEyXSkpKSkpOworCXMgPSB6ICogeDsKKwlyID0geSArIHogKiAocyAqIChyICsgdikgKyB5KTsKKwlyICs9IFRbMF0gKiBzOworCXcgPSB4ICsgcjsKKwlpZiAoaXggPj0gMHgzRkU1OTQyOCkgeworCQl2ID0gKGRvdWJsZSkgaXk7CisJCXJldHVybiAoZG91YmxlKSAoMSAtICgoaHggPj4gMzApICYgMikpICoKKwkJCSh2IC0gMi4wICogKHggLSAodyAqIHcgLyAodyArIHYpIC0gcikpKTsKKwl9CisJaWYgKGl5ID09IDEpCisJCXJldHVybiB3OworCWVsc2UgeworCQkvKgorCQkgKiBpZiBhbGxvdyBlcnJvciB1cCB0byAyIHVscCwgc2ltcGx5IHJldHVybgorCQkgKiAtMS4wIC8gKHgrcikgaGVyZQorCQkgKi8KKwkJLyogY29tcHV0ZSAtMS4wIC8gKHgrcikgYWNjdXJhdGVseSAqLworCQlkb3VibGUgYSwgdDsKKwkJeiA9IHc7CisJCVNFVF9MT1dfV09SRCh6LDApOworCQl2ID0gciAtICh6IC0geCk7CS8qIHordiA9IHIreCAqLworCQl0ID0gYSA9IC0xLjAgLyB3OwkvKiBhID0gLTEuMC93ICovCisJCVNFVF9MT1dfV09SRCh0LDApOworCQlzID0gMS4wICsgdCAqIHo7CisJCXJldHVybiB0ICsgYSAqIChzICsgdCAqIHYpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfdGFuZi5jIGIvbGlibS9zcmMva190YW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3NDAzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2tfdGFuZi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGtfdGFuZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Yga190YW4uYworICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIElOTElORV9LRVJORUxfVEFOREYKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3RhbmYuYyx2IDEuMjAgMjAwNS8xMS8yOCAxMTo0NjoyMCBiZGUgRXhwICQiOworI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogfHRhbih4KS94IC0gdCh4KXwgPCAyKiotMjUuNSAoflstMmUtMDgsIDJlLTA4XSkuICovCitzdGF0aWMgY29uc3QgZG91YmxlCitUW10gPSAgeworICAweDE1NTU0ZDM0MThjOTlmLjBwLTU0LAkvKiAwLjMzMzMzMTM5NTAzMDc5MTM5OTc1OCAqLworICAweDExMTJmZDM4OTk5ZjcyLjBwLTU1LAkvKiAwLjEzMzM5MjAwMjcxMjk3Njc0MjcxOCAqLworICAweDFiNTRjOTFkODY1YWZlLjBwLTU3LAkvKiAwLjA1MzM4MTIzNzg0NDU2NzAzOTM1MjMgKi8KKyAgMHgxOTFkZjM5MDhjMzNjZS4wcC01OCwJLyogMC4wMjQ1MjgzMTgxMTY2NTQ3Mjc4ODczICovCisgIDB4MTg1ZGFkZmNlY2Y0NGUuMHAtNjEsCS8qIDAuMDAyOTc0MzU3NDMzNTk5NjczMDQ5MjcgKi8KKyAgMHgxMzYyYjliZjk3MWJjZC4wcC01OSwJLyogMC4wMDk0NjU2NDc4NDk0MzY3MzE2NjcyOCAqLworfTsKKworI2lmZGVmIElOTElORV9LRVJORUxfVEFOREYKK2V4dGVybiBpbmxpbmUKKyNlbmRpZgorZmxvYXQKK19fa2VybmVsX3RhbmRmKGRvdWJsZSB4LCBpbnQgaXkpCit7CisJZG91YmxlIHoscix3LHMsdCx1OworCisJegk9ICB4Kng7CisJLyoKKwkgKiBTcGxpdCB1cCB0aGUgcG9seW5vbWlhbCBpbnRvIHNtYWxsIGluZGVwZW5kZW50IHRlcm1zIHRvIGdpdmUKKwkgKiBvcHBvcnR1bml0aWVzIGZvciBwYXJhbGxlbCBldmFsdWF0aW9uLiAgVGhlIGNob3NlbiBzcGxpdHRpbmcgaXMKKwkgKiBtaWNyby1vcHRpbWl6ZWQgZm9yIEF0aGxvbnMgKFhQLCBYNjQpLiAgSXQgY29zdHMgMiBtdWx0aXBsaWNhdGlvbnMKKwkgKiByZWxhdGl2ZSB0byBIb3JuZXIncyBtZXRob2Qgb24gc2VxdWVudGlhbCBtYWNoaW5lcy4KKwkgKgorCSAqIFdlIGFkZCB0aGUgc21hbGwgdGVybXMgZnJvbSBsb3dlc3QgZGVncmVlIHVwIGZvciBlZmZpY2llbmN5IG9uCisJICogbm9uLXNlcXVlbnRpYWwgbWFjaGluZXMgKHRoZSBsb3dlc3QgZGVncmVlIHRlcm1zIHRlbmQgdG8gYmUgcmVhZHkKKwkgKiBlYXJsaWVyKS4gIEFwYXJ0IGZyb20gdGhpcywgd2UgZG9uJ3QgY2FyZSBhYm91dCBvcmRlciBvZgorCSAqIG9wZXJhdGlvbnMsIGFuZCBkb24ndCBuZWVkIHRvIHRvIGNhcmUgc2luY2Ugd2UgaGF2ZSBwcmVjaXNpb24gdG8KKwkgKiBzcGFyZS4gIEhvd2V2ZXIsIHRoZSBjaG9zZW4gc3BsaXR0aW5nIGlzIGdvb2QgZm9yIGFjY3VyYWN5IHRvbywKKwkgKiBhbmQgd291bGQgZ2l2ZSByZXN1bHRzIGFzIGFjY3VyYXRlIGFzIEhvcm5lcidzIG1ldGhvZCBpZiB0aGUKKwkgKiBzbWFsbCB0ZXJtcyB3ZXJlIGFkZGVkIGZyb20gaGlnaGVzdCBkZWdyZWUgZG93bi4KKwkgKi8KKwlyID0gVFs0XSt6KlRbNV07CisJdCA9IFRbMl0reipUWzNdOworCXcgPSB6Kno7CisJcyA9IHoqeDsKKwl1ID0gVFswXSt6KlRbMV07CisJciA9ICh4K3MqdSkrKHMqdykqKHQrdypyKTsKKwlpZihpeT09MSkgcmV0dXJuIHI7CisJZWxzZSByZXR1cm4gLTEuMC9yOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvbWF0aF9wcml2YXRlLmggYi9saWJtL3NyYy9tYXRoX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZlMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvbWF0aF9wcml2YXRlLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIGZyb206IEAoIylmZGxpYm0uaCA1LjEgOTMvMDkvMjQKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL21hdGhfcHJpdmF0ZS5oLHYgMS4yMCAyMDA1LzExLzI4IDA0OjU4OjU3IGJkZSBFeHAgJAorICovCisKKyNpZm5kZWYgX01BVEhfUFJJVkFURV9IXworI2RlZmluZQlfTUFUSF9QUklWQVRFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworLyoKKyAqIFRoZSBvcmlnaW5hbCBmZGxpYm0gY29kZSB1c2VkIHN0YXRlbWVudHMgbGlrZToKKyAqCW4wID0gKCgqKGludCopJm9uZSk+PjI5KV4xOwkJKiBpbmRleCBvZiBoaWdoIHdvcmQgKgorICoJaXgwID0gKihuMCsoaW50KikmeCk7CQkJKiBoaWdoIHdvcmQgb2YgeCAqCisgKglpeDEgPSAqKCgxLW4wKSsoaW50KikmeCk7CQkqIGxvdyB3b3JkIG9mIHggKgorICogdG8gZGlnIHR3byAzMiBiaXQgd29yZHMgb3V0IG9mIHRoZSA2NCBiaXQgSUVFRSBmbG9hdGluZyBwb2ludAorICogdmFsdWUuICBUaGF0IGlzIG5vbi1BTlNJLCBhbmQsIG1vcmVvdmVyLCB0aGUgZ2NjIGluc3RydWN0aW9uCisgKiBzY2hlZHVsZXIgZ2V0cyBpdCB3cm9uZy4gIFdlIGluc3RlYWQgdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zLgorICogVW5saWtlIHRoZSBvcmlnaW5hbCBjb2RlLCB3ZSBkZXRlcm1pbmUgdGhlIGVuZGlhbm5lc3MgYXQgY29tcGlsZQorICogdGltZSwgbm90IGF0IHJ1biB0aW1lOyBJIGRvbid0IHNlZSBtdWNoIGJlbmVmaXQgdG8gc2VsZWN0aW5nCisgKiBlbmRpYW5uZXNzIGF0IHJ1biB0aW1lLgorICovCisKKy8qCisgKiBBIHVuaW9uIHdoaWNoIHBlcm1pdHMgdXMgdG8gY29udmVydCBiZXR3ZWVuIGEgZG91YmxlIGFuZCB0d28gMzIgYml0CisgKiBpbnRzLgorICovCisKKyNpZiAoX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikgfHwgKGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19WRlBfRlBfXykpCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgZG91YmxlIHZhbHVlOworICBzdHJ1Y3QKKyAgeworICAgIHVfaW50MzJfdCBtc3c7CisgICAgdV9pbnQzMl90IGxzdzsKKyAgfSBwYXJ0czsKK30gaWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKKworI2VuZGlmCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICAmJiAhKGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19WRlBfRlBfXykpCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgZG91YmxlIHZhbHVlOworICBzdHJ1Y3QKKyAgeworICAgIHVfaW50MzJfdCBsc3c7CisgICAgdV9pbnQzMl90IG1zdzsKKyAgfSBwYXJ0czsKK30gaWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKKworI2VuZGlmCisKKy8qIEdldCB0d28gMzIgYml0IGludHMgZnJvbSBhIGRvdWJsZS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9XT1JEUyhpeDAsaXgxLGQpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBld191OwkJCQkJXAorICBld191LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgKGl4MCkgPSBld191LnBhcnRzLm1zdzsJCQkJCVwKKyAgKGl4MSkgPSBld191LnBhcnRzLmxzdzsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIEdldCB0aGUgbW9yZSBzaWduaWZpY2FudCAzMiBiaXQgaW50IGZyb20gYSBkb3VibGUuICAqLworCisjZGVmaW5lIEdFVF9ISUdIX1dPUkQoaSxkKQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGdoX3U7CQkJCQlcCisgIGdoX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaSkgPSBnaF91LnBhcnRzLm1zdzsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBHZXQgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgMzIgYml0IGludCBmcm9tIGEgZG91YmxlLiAgKi8KKworI2RlZmluZSBHRVRfTE9XX1dPUkQoaSxkKQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGdsX3U7CQkJCQlcCisgIGdsX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaSkgPSBnbF91LnBhcnRzLmxzdzsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBTZXQgYSBkb3VibGUgZnJvbSB0d28gMzIgYml0IGludHMuICAqLworCisjZGVmaW5lIElOU0VSVF9XT1JEUyhkLGl4MCxpeDEpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgaXdfdTsJCQkJCVwKKyAgaXdfdS5wYXJ0cy5tc3cgPSAoaXgwKTsJCQkJCVwKKyAgaXdfdS5wYXJ0cy5sc3cgPSAoaXgxKTsJCQkJCVwKKyAgKGQpID0gaXdfdS52YWx1ZTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBTZXQgdGhlIG1vcmUgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIGRvdWJsZSBmcm9tIGFuIGludC4gICovCisKKyNkZWZpbmUgU0VUX0hJR0hfV09SRChkLHYpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgc2hfdTsJCQkJCVwKKyAgc2hfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIHNoX3UucGFydHMubXN3ID0gKHYpOwkJCQkJCVwKKyAgKGQpID0gc2hfdS52YWx1ZTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBTZXQgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIGRvdWJsZSBmcm9tIGFuIGludC4gICovCisKKyNkZWZpbmUgU0VUX0xPV19XT1JEKGQsdikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBzbF91OwkJCQkJXAorICBzbF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgc2xfdS5wYXJ0cy5sc3cgPSAodik7CQkJCQkJXAorICAoZCkgPSBzbF91LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBBIHVuaW9uIHdoaWNoIHBlcm1pdHMgdXMgdG8gY29udmVydCBiZXR3ZWVuIGEgZmxvYXQgYW5kIGEgMzIgYml0CisgKiBpbnQuCisgKi8KKwordHlwZWRlZiB1bmlvbgoreworICBmbG9hdCB2YWx1ZTsKKyAgLyogRklYTUU6IEFzc3VtZXMgMzIgYml0IGludC4gICovCisgIHVuc2lnbmVkIGludCB3b3JkOworfSBpZWVlX2Zsb2F0X3NoYXBlX3R5cGU7CisKKy8qIEdldCBhIDMyIGJpdCBpbnQgZnJvbSBhIGZsb2F0LiAgKi8KKworI2RlZmluZSBHRVRfRkxPQVRfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZmxvYXRfc2hhcGVfdHlwZSBnZl91OwkJCQkJXAorICBnZl91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgKGkpID0gZ2ZfdS53b3JkOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCBhIGZsb2F0IGZyb20gYSAzMiBiaXQgaW50LiAgKi8KKworI2RlZmluZSBTRVRfRkxPQVRfV09SRChkLGkpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZmxvYXRfc2hhcGVfdHlwZSBzZl91OwkJCQkJXAorICBzZl91LndvcmQgPSAoaSk7CQkJCQkJXAorICAoZCkgPSBzZl91LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBfQ09NUExFWF9ICisvKgorICogSW5saW5lIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBjb21wbGV4IHZhbHVlcy4KKyAqCisgKiBUaGUgQzk5IHN0YW5kYXJkIGludGVuZHMgeCtJKnkgdG8gYmUgdXNlZCBmb3IgdGhpcywgYnV0IHgrSSp5IGlzCisgKiBjdXJyZW50bHkgdW51c2FibGUgaW4gZ2VuZXJhbCBzaW5jZSBnY2MgaW50cm9kdWNlcyBtYW55IG92ZXJmbG93LAorICogdW5kZXJmbG93LCBzaWduIGFuZCBlZmZpY2llbmN5IGJ1Z3MgYnkgcmV3cml0aW5nIEkqeSBhcworICogKDAuMCtJKSooeSswLjAqSSkgYW5kIGxhYm9yaW91c2x5IGNvbXB1dGluZyB0aGUgZnVsbCBjb21wbGV4IHByb2R1Y3QuCisgKiBJbiBwYXJ0aWN1bGFyLCBJKkluZiBpcyBjb3JydXB0ZWQgdG8gTmFOK0kqSW5mLCBhbmQgSSotMCBpcyBjb3JydXB0ZWQKKyAqIHRvIC0wLjArSSowLjAuCisgKi8KK3N0YXRpYyBfX2lubGluZSBmbG9hdCBjb21wbGV4CitjcGFja2YoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwlmbG9hdCBjb21wbGV4IHo7CisKKwlfX3JlYWxfXyB6ID0geDsKKwlfX2ltYWdfXyB6ID0geTsKKwlyZXR1cm4gKHopOworfQorCitzdGF0aWMgX19pbmxpbmUgZG91YmxlIGNvbXBsZXgKK2NwYWNrKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlkb3VibGUgY29tcGxleCB6OworCisJX19yZWFsX18geiA9IHg7CisJX19pbWFnX18geiA9IHk7CisJcmV0dXJuICh6KTsKK30KKworc3RhdGljIF9faW5saW5lIGxvbmcgZG91YmxlIGNvbXBsZXgKK2NwYWNrbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCWxvbmcgZG91YmxlIGNvbXBsZXggejsKKworCV9fcmVhbF9fIHogPSB4OworCV9faW1hZ19fIHogPSB5OworCXJldHVybiAoeik7Cit9CisjZW5kaWYgLyogX0NPTVBMRVhfSCAqLworIAorLyoKKyAqIGllZWUgc3R5bGUgZWxlbWVudGFyeSBmdW5jdGlvbnMKKyAqCisgKiBXZSByZW5hbWUgZnVuY3Rpb25zIGhlcmUgdG8gaW1wcm92ZSBvdGhlciBzb3VyY2VzJyBkaWZmYWJpbGl0eQorICogYWdhaW5zdCBmZGxpYm0uCisgKi8KKyNkZWZpbmUJX19pZWVlNzU0X3NxcnQJc3FydAorI2RlZmluZQlfX2llZWU3NTRfYWNvcwlhY29zCisjZGVmaW5lCV9faWVlZTc1NF9hY29zaAlhY29zaAorI2RlZmluZQlfX2llZWU3NTRfbG9nCWxvZworI2RlZmluZQlfX2llZWU3NTRfYXRhbmgJYXRhbmgKKyNkZWZpbmUJX19pZWVlNzU0X2FzaW4JYXNpbgorI2RlZmluZQlfX2llZWU3NTRfYXRhbjIJYXRhbjIKKyNkZWZpbmUJX19pZWVlNzU0X2V4cAlleHAKKyNkZWZpbmUJX19pZWVlNzU0X2Nvc2gJY29zaAorI2RlZmluZQlfX2llZWU3NTRfZm1vZAlmbW9kCisjZGVmaW5lCV9faWVlZTc1NF9wb3cJcG93CisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWEgbGdhbW1hCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYQlnYW1tYQorI2RlZmluZQlfX2llZWU3NTRfbGdhbW1hX3IgbGdhbW1hX3IKKyNkZWZpbmUJX19pZWVlNzU0X2dhbW1hX3IgZ2FtbWFfcgorI2RlZmluZQlfX2llZWU3NTRfbG9nMTAJbG9nMTAKKyNkZWZpbmUJX19pZWVlNzU0X3NpbmgJc2luaAorI2RlZmluZQlfX2llZWU3NTRfaHlwb3QJaHlwb3QKKyNkZWZpbmUJX19pZWVlNzU0X2owCWowCisjZGVmaW5lCV9faWVlZTc1NF9qMQlqMQorI2RlZmluZQlfX2llZWU3NTRfeTAJeTAKKyNkZWZpbmUJX19pZWVlNzU0X3kxCXkxCisjZGVmaW5lCV9faWVlZTc1NF9qbglqbgorI2RlZmluZQlfX2llZWU3NTRfeW4JeW4KKyNkZWZpbmUJX19pZWVlNzU0X3JlbWFpbmRlciByZW1haW5kZXIKKyNkZWZpbmUJX19pZWVlNzU0X3NjYWxiCXNjYWxiCisjZGVmaW5lCV9faWVlZTc1NF9zcXJ0ZglzcXJ0ZgorI2RlZmluZQlfX2llZWU3NTRfYWNvc2YJYWNvc2YKKyNkZWZpbmUJX19pZWVlNzU0X2Fjb3NoZiBhY29zaGYKKyNkZWZpbmUJX19pZWVlNzU0X2xvZ2YJbG9nZgorI2RlZmluZQlfX2llZWU3NTRfYXRhbmhmIGF0YW5oZgorI2RlZmluZQlfX2llZWU3NTRfYXNpbmYJYXNpbmYKKyNkZWZpbmUJX19pZWVlNzU0X2F0YW4yZiBhdGFuMmYKKyNkZWZpbmUJX19pZWVlNzU0X2V4cGYJZXhwZgorI2RlZmluZQlfX2llZWU3NTRfY29zaGYJY29zaGYKKyNkZWZpbmUJX19pZWVlNzU0X2Ztb2RmCWZtb2RmCisjZGVmaW5lCV9faWVlZTc1NF9wb3dmCXBvd2YKKyNkZWZpbmUJX19pZWVlNzU0X2xnYW1tYWYgbGdhbW1hZgorI2RlZmluZQlfX2llZWU3NTRfZ2FtbWFmIGdhbW1hZgorI2RlZmluZQlfX2llZWU3NTRfbGdhbW1hZl9yIGxnYW1tYWZfcgorI2RlZmluZQlfX2llZWU3NTRfZ2FtbWFmX3IgZ2FtbWFmX3IKKyNkZWZpbmUJX19pZWVlNzU0X2xvZzEwZiBsb2cxMGYKKyNkZWZpbmUJX19pZWVlNzU0X3NpbmhmCXNpbmhmCisjZGVmaW5lCV9faWVlZTc1NF9oeXBvdGYgaHlwb3RmCisjZGVmaW5lCV9faWVlZTc1NF9qMGYJajBmCisjZGVmaW5lCV9faWVlZTc1NF9qMWYJajFmCisjZGVmaW5lCV9faWVlZTc1NF95MGYJeTBmCisjZGVmaW5lCV9faWVlZTc1NF95MWYJeTFmCisjZGVmaW5lCV9faWVlZTc1NF9qbmYJam5mCisjZGVmaW5lCV9faWVlZTc1NF95bmYJeW5mCisjZGVmaW5lCV9faWVlZTc1NF9yZW1haW5kZXJmIHJlbWFpbmRlcmYKKyNkZWZpbmUJX19pZWVlNzU0X3NjYWxiZiBzY2FsYmYKKyNkZWZpbmUgX19pZWVlNzU0X2xkZXhwZiBsZGV4cGYKKworLyogZmRsaWJtIGtlcm5lbCBmdW5jdGlvbiAqLworaW50CV9faWVlZTc1NF9yZW1fcGlvMihkb3VibGUsZG91YmxlKik7Citkb3VibGUJX19rZXJuZWxfc2luKGRvdWJsZSxkb3VibGUsaW50KTsKK2RvdWJsZQlfX2tlcm5lbF9jb3MoZG91YmxlLGRvdWJsZSk7Citkb3VibGUJX19rZXJuZWxfdGFuKGRvdWJsZSxkb3VibGUsaW50KTsKK2ludAlfX2tlcm5lbF9yZW1fcGlvMihkb3VibGUqLGRvdWJsZSosaW50LGludCxpbnQsY29uc3QgaW50Kik7CisKKy8qIGZsb2F0IHZlcnNpb25zIG9mIGZkbGlibSBrZXJuZWwgZnVuY3Rpb25zICovCitpbnQJX19pZWVlNzU0X3JlbV9waW8yZihmbG9hdCxmbG9hdCopOworZmxvYXQJX19rZXJuZWxfc2luZGYoZG91YmxlKTsKK2Zsb2F0CV9fa2VybmVsX2Nvc2RmKGRvdWJsZSk7CitmbG9hdAlfX2tlcm5lbF90YW5kZihkb3VibGUsaW50KTsKK2ludAlfX2tlcm5lbF9yZW1fcGlvMmYoZmxvYXQqLGZsb2F0KixpbnQsaW50LGludCxjb25zdCBpbnQqKTsKKworI2VuZGlmIC8qICFfTUFUSF9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2FzaW5oLmMgYi9saWJtL3NyYy9zX2FzaW5oLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MDA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfYXNpbmguYwpAQCAtMCwwICsxLDU3IEBACisvKiBAKCMpc19hc2luaC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19hc2luaC5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBhc2luaCh4KQorICogTWV0aG9kIDoKKyAqCUJhc2VkIG9uCisgKgkJYXNpbmgoeCkgPSBzaWduKHgpICogbG9nIFsgfHh8ICsgc3FydCh4KngrMSkgXQorICoJd2UgaGF2ZQorICoJYXNpbmgoeCkgOj0geCAgaWYgIDEreCp4PTEsCisgKgkJIDo9IHNpZ24oeCkqKGxvZyh4KStsbjIpKSBmb3IgbGFyZ2UgfHh8LCBlbHNlCisgKgkJIDo9IHNpZ24oeCkqbG9nKDJ8eHwrMS8ofHh8K3NxcnQoeCp4KzEpKSkgaWZ8eHw+MiwgZWxzZQorICoJCSA6PSBzaWduKHgpKmxvZzFwKHx4fCArIHheMi8oMSArIHNxcnQoMSt4XjIpKSkKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK2xuMiA9ICA2LjkzMTQ3MTgwNTU5OTQ1Mjg2MjI3ZS0wMSwgLyogMHgzRkU2MkU0MiwgMHhGRUZBMzlFRiAqLworaHVnZT0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzMwMDsKKworZG91YmxlCithc2luaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx3OworCWludDMyX3QgaHgsaXg7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CS8qIHggaXMgaW5mIG9yIE5hTiAqLworCWlmKGl4PCAweDNlMzAwMDAwKSB7CS8qIHx4fDwyKiotMjggKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJldHVybiB4IGluZXhhY3QgZXhjZXB0IDAgKi8KKwl9CisJaWYoaXg+MHg0MWIwMDAwMCkgewkvKiB8eHwgPiAyKioyOCAqLworCSAgICB3ID0gX19pZWVlNzU0X2xvZyhmYWJzKHgpKStsbjI7CisJfSBlbHNlIGlmIChpeD4weDQwMDAwMDAwKSB7CS8qIDIqKjI4ID4gfHh8ID4gMi4wICovCisJICAgIHQgPSBmYWJzKHgpOworCSAgICB3ID0gX19pZWVlNzU0X2xvZygyLjAqdCtvbmUvKF9faWVlZTc1NF9zcXJ0KHgqeCtvbmUpK3QpKTsKKwl9IGVsc2UgewkJLyogMi4wID4gfHh8ID4gMioqLTI4ICovCisJICAgIHQgPSB4Kng7CisJICAgIHcgPWxvZzFwKGZhYnMoeCkrdC8ob25lK19faWVlZTc1NF9zcXJ0KG9uZSt0KSkpOworCX0KKwlpZihoeD4wKSByZXR1cm4gdzsgZWxzZSByZXR1cm4gLXc7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2FzaW5oZi5jIGIvbGlibS9zcmMvc19hc2luaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RjNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19hc2luaGYuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBzX2FzaW5oZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19hc2luaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19hc2luaGYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzRjgwMDAwMCAqLworbG4yID0gIDYuOTMxNDcxODI0NmUtMDEsIC8qIDB4M2YzMTcyMTggKi8KK2h1Z2U9ICAxLjAwMDAwMDAwMDBlKzMwOworCitmbG9hdAorYXNpbmhmKGZsb2F0IHgpCit7CisJZmxvYXQgdCx3OworCWludDMyX3QgaHgsaXg7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCt4OwkvKiB4IGlzIGluZiBvciBOYU4gKi8KKwlpZihpeDwgMHgzMTgwMDAwMCkgewkvKiB8eHw8MioqLTI4ICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHJldHVybiB4OwkvKiByZXR1cm4geCBpbmV4YWN0IGV4Y2VwdCAwICovCisJfQorCWlmKGl4PjB4NGQ4MDAwMDApIHsJLyogfHh8ID4gMioqMjggKi8KKwkgICAgdyA9IF9faWVlZTc1NF9sb2dmKGZhYnNmKHgpKStsbjI7CisJfSBlbHNlIGlmIChpeD4weDQwMDAwMDAwKSB7CS8qIDIqKjI4ID4gfHh8ID4gMi4wICovCisJICAgIHQgPSBmYWJzZih4KTsKKwkgICAgdyA9IF9faWVlZTc1NF9sb2dmKChmbG9hdCkyLjAqdCtvbmUvKF9faWVlZTc1NF9zcXJ0Zih4Kngrb25lKSt0KSk7CisJfSBlbHNlIHsJCS8qIDIuMCA+IHx4fCA+IDIqKi0yOCAqLworCSAgICB0ID0geCp4OworCSAgICB3ID1sb2cxcGYoZmFic2YoeCkrdC8ob25lK19faWVlZTc1NF9zcXJ0ZihvbmUrdCkpKTsKKwl9CisJaWYoaHg+MCkgcmV0dXJuIHc7IGVsc2UgcmV0dXJuIC13OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19hdGFuLmMgYi9saWJtL3NyYy9zX2F0YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q3YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19hdGFuLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qIEAoIylzX2F0YW4uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfYXRhbi5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qIGF0YW4oeCkKKyAqIE1ldGhvZAorICogICAxLiBSZWR1Y2UgeCB0byBwb3NpdGl2ZSBieSBhdGFuKHgpID0gLWF0YW4oLXgpLgorICogICAyLiBBY2NvcmRpbmcgdG8gdGhlIGludGVnZXIgaz00dCswLjI1IGNob3BwZWQsIHQ9eCwgdGhlIGFyZ3VtZW50CisgKiAgICAgIGlzIGZ1cnRoZXIgcmVkdWNlZCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBpbnRlcnZhbHMgYW5kIHRoZQorICogICAgICBhcmN0YW5nZW50IG9mIHQgaXMgZXZhbHVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZvcm11bGE6CisgKgorICogICAgICBbMCw3LzE2XSAgICAgIGF0YW4oeCkgPSB0LXReMyooYTErdF4yKihhMisuLi4oYTEwK3ReMiphMTEpLi4uKQorICogICAgICBbNy8xNiwxMS8xNl0gIGF0YW4oeCkgPSBhdGFuKDEvMikgKyBhdGFuKCAodC0wLjUpLygxK3QvMikgKQorICogICAgICBbMTEvMTYuMTkvMTZdIGF0YW4oeCkgPSBhdGFuKCAxICkgKyBhdGFuKCAodC0xKS8oMSt0KSApCisgKiAgICAgIFsxOS8xNiwzOS8xNl0gYXRhbih4KSA9IGF0YW4oMy8yKSArIGF0YW4oICh0LTEuNSkvKDErMS41dCkgKQorICogICAgICBbMzkvMTYsSU5GXSAgIGF0YW4oeCkgPSBhdGFuKElORikgKyBhdGFuKCAtMS90ICkKKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZworICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgYXRhbmhpW10gPSB7CisgIDQuNjM2NDc2MDkwMDA4MDYwOTM1MTVlLTAxLCAvKiBhdGFuKDAuNSloaSAweDNGRERBQzY3LCAweDA1NjFCQjRGICovCisgIDcuODUzOTgxNjMzOTc0NDgyNzg5OTllLTAxLCAvKiBhdGFuKDEuMCloaSAweDNGRTkyMUZCLCAweDU0NDQyRDE4ICovCisgIDkuODI3OTM3MjMyNDczMjkwNTQwODJlLTAxLCAvKiBhdGFuKDEuNSloaSAweDNGRUY3MzBCLCAweEQyODFGNjlCICovCisgIDEuNTcwNzk2MzI2Nzk0ODk2NTU4MDBlKzAwLCAvKiBhdGFuKGluZiloaSAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIGF0YW5sb1tdID0geworICAyLjI2OTg3Nzc0NTI5NjE2ODcwOTI0ZS0xNywgLyogYXRhbigwLjUpbG8gMHgzQzdBMkI3RiwgMHgyMjJGNjVFMiAqLworICAzLjA2MTYxNjk5Nzg2ODM4MzAxNzkzZS0xNywgLyogYXRhbigxLjApbG8gMHgzQzgxQTYyNiwgMHgzMzE0NUMwNyAqLworICAxLjM5MDMzMTEwMzEyMzA5OTg0NTE2ZS0xNywgLyogYXRhbigxLjUpbG8gMHgzQzcwMDc4OCwgMHg3QUYwQ0JCRCAqLworICA2LjEyMzIzMzk5NTczNjc2NjAzNTg3ZS0xNywgLyogYXRhbihpbmYpbG8gMHgzQzkxQTYyNiwgMHgzMzE0NUMwNyAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBhVFtdID0geworICAzLjMzMzMzMzMzMzMzMzI5MzE4MDI3ZS0wMSwgLyogMHgzRkQ1NTU1NSwgMHg1NTU1NTUwRCAqLworIC0xLjk5OTk5OTk5OTk4NzY0ODMyNDc2ZS0wMSwgLyogMHhCRkM5OTk5OSwgMHg5OTk4RUJDNCAqLworICAxLjQyODU3MTQyNzI1MDM0NjYzNzExZS0wMSwgLyogMHgzRkMyNDkyNCwgMHg5MjAwODNGRiAqLworIC0xLjExMTExMTA0MDU0NjIzNTU3ODgwZS0wMSwgLyogMHhCRkJDNzFDNiwgMHhGRTIzMTY3MSAqLworICA5LjA5MDg4NzEzMzQzNjUwNjU2MTk2ZS0wMiwgLyogMHgzRkI3NDVDRCwgMHhDNTRDMjA2RSAqLworIC03LjY5MTg3NjIwNTA0NDgyOTk5NDk1ZS0wMiwgLyogMHhCRkIzQjBGMiwgMHhBRjc0OUE2RCAqLworICA2LjY2MTA3MzEzNzM4NzUzMTIwNjY5ZS0wMiwgLyogMHgzRkIxMEQ2NiwgMHhBMEQwM0Q1MSAqLworIC01LjgzMzU3MDEzMzc5MDU3MzQ4NjQ1ZS0wMiwgLyogMHhCRkFEREUyRCwgMHg1MkRFRkQ5QSAqLworICA0Ljk3Njg3Nzk5NDYxNTkzMjM2MDE3ZS0wMiwgLyogMHgzRkE5N0I0QiwgMHgyNDc2MERFQiAqLworIC0zLjY1MzE1NzI3NDQyMTY5MTU1MjcwZS0wMiwgLyogMHhCRkEyQjQ0NCwgMHgyQzZBNkMyRiAqLworICAxLjYyODU4MjAxMTUzNjU3ODIzNjIzZS0wMiwgLyogMHgzRjkwQUQzQSwgMHhFMzIyREExMSAqLworfTsKKworCXN0YXRpYyBjb25zdCBkb3VibGUKK29uZSAgID0gMS4wLAoraHVnZSAgID0gMS4wZTMwMDsKKworZG91YmxlCithdGFuKGRvdWJsZSB4KQoreworCWRvdWJsZSB3LHMxLHMyLHo7CisJaW50MzJfdCBpeCxoeCxpZDsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDQ0MTAwMDAwKSB7CS8qIGlmIHx4fCA+PSAyXjY2ICovCisJICAgIHVfaW50MzJfdCBsb3c7CisJICAgIEdFVF9MT1dfV09SRChsb3cseCk7CisJICAgIGlmKGl4PjB4N2ZmMDAwMDB8fAorCQkoaXg9PTB4N2ZmMDAwMDAmJihsb3chPTApKSkKKwkJcmV0dXJuIHgreDsJCS8qIE5hTiAqLworCSAgICBpZihoeD4wKSByZXR1cm4gIGF0YW5oaVszXSthdGFubG9bM107CisJICAgIGVsc2UgICAgIHJldHVybiAtYXRhbmhpWzNdLWF0YW5sb1szXTsKKwl9IGlmIChpeCA8IDB4M2ZkYzAwMDApIHsJLyogfHh8IDwgMC40Mzc1ICovCisJICAgIGlmIChpeCA8IDB4M2UyMDAwMDApIHsJLyogfHh8IDwgMl4tMjkgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJhaXNlIGluZXhhY3QgKi8KKwkgICAgfQorCSAgICBpZCA9IC0xOworCX0gZWxzZSB7CisJeCA9IGZhYnMoeCk7CisJaWYgKGl4IDwgMHgzZmYzMDAwMCkgewkJLyogfHh8IDwgMS4xODc1ICovCisJICAgIGlmIChpeCA8IDB4M2ZlNjAwMDApIHsJLyogNy8xNiA8PXx4fDwxMS8xNiAqLworCQlpZCA9IDA7IHggPSAoMi4wKngtb25lKS8oMi4wK3gpOworCSAgICB9IGVsc2UgewkJCS8qIDExLzE2PD18eHw8IDE5LzE2ICovCisJCWlkID0gMTsgeCAgPSAoeC1vbmUpLyh4K29uZSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoaXggPCAweDQwMDM4MDAwKSB7CS8qIHx4fCA8IDIuNDM3NSAqLworCQlpZCA9IDI7IHggID0gKHgtMS41KS8ob25lKzEuNSp4KTsKKwkgICAgfSBlbHNlIHsJCQkvKiAyLjQzNzUgPD0gfHh8IDwgMl42NiAqLworCQlpZCA9IDM7IHggID0gLTEuMC94OworCSAgICB9CisJfX0KKyAgICAvKiBlbmQgb2YgYXJndW1lbnQgcmVkdWN0aW9uICovCisJeiA9IHgqeDsKKwl3ID0geip6OworICAgIC8qIGJyZWFrIHN1bSBmcm9tIGk9MCB0byAxMCBhVFtpXXoqKihpKzEpIGludG8gb2RkIGFuZCBldmVuIHBvbHkgKi8KKwlzMSA9IHoqKGFUWzBdK3cqKGFUWzJdK3cqKGFUWzRdK3cqKGFUWzZdK3cqKGFUWzhdK3cqYVRbMTBdKSkpKSk7CisJczIgPSB3KihhVFsxXSt3KihhVFszXSt3KihhVFs1XSt3KihhVFs3XSt3KmFUWzldKSkpKTsKKwlpZiAoaWQ8MCkgcmV0dXJuIHggLSB4KihzMStzMik7CisJZWxzZSB7CisJICAgIHogPSBhdGFuaGlbaWRdIC0gKCh4KihzMStzMikgLSBhdGFubG9baWRdKSAtIHgpOworCSAgICByZXR1cm4gKGh4PDApPyAtejp6OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXRhbmYuYyBiL2xpYm0vc3JjL3NfYXRhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiMzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19hdGFuZi5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIHNfYXRhbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfYXRhbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19hdGFuZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgYXRhbmhpW10gPSB7CisgIDQuNjM2NDc2MDM5OWUtMDEsIC8qIGF0YW4oMC41KWhpIDB4M2VlZDYzMzggKi8KKyAgNy44NTM5ODEyNTY1ZS0wMSwgLyogYXRhbigxLjApaGkgMHgzZjQ5MGZkYSAqLworICA5LjgyNzkzNjg4NzdlLTAxLCAvKiBhdGFuKDEuNSloaSAweDNmN2I5ODVlICovCisgIDEuNTcwNzk2MjUxM2UrMDAsIC8qIGF0YW4oaW5mKWhpIDB4M2ZjOTBmZGEgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBhdGFubG9bXSA9IHsKKyAgNS4wMTIxNTgyNDQwZS0wOSwgLyogYXRhbigwLjUpbG8gMHgzMWFjMzc2OSAqLworICAzLjc3NDg5NDcwNzllLTA4LCAvKiBhdGFuKDEuMClsbyAweDMzMjIyMTY4ICovCisgIDMuNDQ3MzIxNzE3MGUtMDgsIC8qIGF0YW4oMS41KWxvIDB4MzMxNDBmYjQgKi8KKyAgNy41NDk3ODk0MTU5ZS0wOCwgLyogYXRhbihpbmYpbG8gMHgzM2EyMjE2OCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGFUW10gPSB7CisgIDMuMzMzMzMzNDMyN2UtMDEsIC8qIDB4M2VhYWFhYWEgKi8KKyAtMi4wMDAwMDAwMjk4ZS0wMSwgLyogMHhiZTRjY2NjZCAqLworICAxLjQyODU3MTQ5MjRlLTAxLCAvKiAweDNlMTI0OTI1ICovCisgLTEuMTExMTExMDQ0OWUtMDEsIC8qIDB4YmRlMzhlMzggKi8KKyAgOS4wOTA4ODcwMTAxZS0wMiwgLyogMHgzZGJhMmU2ZSAqLworIC03LjY5MTg3NTg0NTJlLTAyLCAvKiAweGJkOWQ4Nzk1ICovCisgIDYuNjYxMDczMTE4NGUtMDIsIC8qIDB4M2Q4ODZiMzUgKi8KKyAtNS44MzM1NzAyODY2ZS0wMiwgLyogMHhiZDZlZjE2YiAqLworICA0Ljk3Njg3Nzk0MjdlLTAyLCAvKiAweDNkNGJkYTU5ICovCisgLTMuNjUzMTU3MTI5OWUtMDIsIC8qIDB4YmQxNWEyMjEgKi8KKyAgMS42Mjg1ODE5OTMzZS0wMiwgLyogMHgzYzg1NjlkNyAqLworfTsKKworCXN0YXRpYyBjb25zdCBmbG9hdAorb25lICAgPSAxLjAsCitodWdlICAgPSAxLjBlMzA7CisKK2Zsb2F0CithdGFuZihmbG9hdCB4KQoreworCWZsb2F0IHcsczEsczIsejsKKwlpbnQzMl90IGl4LGh4LGlkOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDUwODAwMDAwKSB7CS8qIGlmIHx4fCA+PSAyXjM0ICovCisJICAgIGlmKGl4PjB4N2Y4MDAwMDApCisJCXJldHVybiB4K3g7CQkvKiBOYU4gKi8KKwkgICAgaWYoaHg+MCkgcmV0dXJuICBhdGFuaGlbM10rYXRhbmxvWzNdOworCSAgICBlbHNlICAgICByZXR1cm4gLWF0YW5oaVszXS1hdGFubG9bM107CisJfSBpZiAoaXggPCAweDNlZTAwMDAwKSB7CS8qIHx4fCA8IDAuNDM3NSAqLworCSAgICBpZiAoaXggPCAweDMxMDAwMDAwKSB7CS8qIHx4fCA8IDJeLTI5ICovCisJCWlmKGh1Z2UreD5vbmUpIHJldHVybiB4OwkvKiByYWlzZSBpbmV4YWN0ICovCisJICAgIH0KKwkgICAgaWQgPSAtMTsKKwl9IGVsc2UgeworCXggPSBmYWJzZih4KTsKKwlpZiAoaXggPCAweDNmOTgwMDAwKSB7CQkvKiB8eHwgPCAxLjE4NzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzZjMwMDAwMCkgewkvKiA3LzE2IDw9fHh8PDExLzE2ICovCisJCWlkID0gMDsgeCA9ICgoZmxvYXQpMi4wKngtb25lKS8oKGZsb2F0KTIuMCt4KTsKKwkgICAgfSBlbHNlIHsJCQkvKiAxMS8xNjw9fHh8PCAxOS8xNiAqLworCQlpZCA9IDE7IHggID0gKHgtb25lKS8oeCtvbmUpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKGl4IDwgMHg0MDFjMDAwMCkgewkvKiB8eHwgPCAyLjQzNzUgKi8KKwkJaWQgPSAyOyB4ICA9ICh4LShmbG9hdCkxLjUpLyhvbmUrKGZsb2F0KTEuNSp4KTsKKwkgICAgfSBlbHNlIHsJCQkvKiAyLjQzNzUgPD0gfHh8IDwgMl42NiAqLworCQlpZCA9IDM7IHggID0gLShmbG9hdCkxLjAveDsKKwkgICAgfQorCX19CisgICAgLyogZW5kIG9mIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCXogPSB4Kng7CisJdyA9IHoqejsKKyAgICAvKiBicmVhayBzdW0gZnJvbSBpPTAgdG8gMTAgYVRbaV16KiooaSsxKSBpbnRvIG9kZCBhbmQgZXZlbiBwb2x5ICovCisJczEgPSB6KihhVFswXSt3KihhVFsyXSt3KihhVFs0XSt3KihhVFs2XSt3KihhVFs4XSt3KmFUWzEwXSkpKSkpOworCXMyID0gdyooYVRbMV0rdyooYVRbM10rdyooYVRbNV0rdyooYVRbN10rdyphVFs5XSkpKSk7CisJaWYgKGlkPDApIHJldHVybiB4IC0geCooczErczIpOworCWVsc2UgeworCSAgICB6ID0gYXRhbmhpW2lkXSAtICgoeCooczErczIpIC0gYXRhbmxvW2lkXSkgLSB4KTsKKwkgICAgcmV0dXJuIChoeDwwKT8gLXo6ejsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NicnQuYyBiL2xpYm0vc3JjL3NfY2JydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDA2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NicnQuYwpAQCAtMCwwICsxLDkyIEBACisvKiBAKCMpc19jYnJ0LmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jYnJ0LmMsdiAxLjEwIDIwMDUvMTIvMTMgMjA6MTc6MjMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiBjYnJ0KHgpCisgKiBSZXR1cm4gY3ViZSByb290IG9mIHgKKyAqLworc3RhdGljIGNvbnN0IHVfaW50MzJfdAorCUIxID0gNzE1MDk0MTYzLCAvKiBCMSA9ICgxMDIzLTEwMjMvMy0wLjAzMzA2MjM1NjUxKSoyKioyMCAqLworCUIyID0gNjk2MjE5Nzk1OyAvKiBCMiA9ICgxMDIzLTEwMjMvMy01NC8zLTAuMDMzMDYyMzU2NTEpKjIqKjIwICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK0MgPSAgNS40Mjg1NzE0Mjg1NzE0MjgxNTkwNmUtMDEsIC8qIDE5LzM1ICAgICA9IDB4M0ZFMTVGMTUsIDB4RjE1RjE1RjEgKi8KK0QgPSAtNy4wNTMwNjEyMjQ0ODk3OTYxMTA1MGUtMDEsIC8qIC04NjQvMTIyNSA9IDB4QkZFNjkxREUsIDB4MjUzMkM4MzQgKi8KK0UgPSAgMS40MTQyODU3MTQyODU3MTQzNjgxOWUrMDAsIC8qIDk5LzcwICAgICA9IDB4M0ZGNkEwRUEsIDB4MEVBMEVBMEYgKi8KK0YgPSAgMS42MDcxNDI4NTcxNDI4NTcyMDYzMGUrMDAsIC8qIDQ1LzI4ICAgICA9IDB4M0ZGOUI2REIsIDB4NkRCNkRCNkUgKi8KK0cgPSAgMy41NzE0Mjg1NzE0Mjg1NzE1MDc4N2UtMDE7IC8qIDUvMTQgICAgICA9IDB4M0ZENkRCNkQsIDB4QjZEQjZEQjcgKi8KKworZG91YmxlCitjYnJ0KGRvdWJsZSB4KQoreworCWludDMyX3QJaHg7CisJZG91YmxlIHIscyx0PTAuMCx3OworCXVfaW50MzJfdCBzaWduOworCXVfaW50MzJfdCBoaWdoLGxvdzsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJc2lnbj1oeCYweDgwMDAwMDAwOyAJCS8qIHNpZ249IHNpZ24oeCkgKi8KKwloeCAgXj1zaWduOworCWlmKGh4Pj0weDdmZjAwMDAwKSByZXR1cm4oeCt4KTsgLyogY2JydChOYU4sSU5GKSBpcyBpdHNlbGYgKi8KKwlHRVRfTE9XX1dPUkQobG93LHgpOworCWlmKChoeHxsb3cpPT0wKQorCSAgICByZXR1cm4oeCk7CQkvKiBjYnJ0KDApIGlzIGl0c2VsZiAqLworCisgICAgLyoKKyAgICAgKiBSb3VnaCBjYnJ0IHRvIDUgYml0czoKKyAgICAgKiAgICBjYnJ0KDIqKmUqKDErbSkgfj0gMioqKGUvMykqKDErKGUlMyttKS8zKQorICAgICAqIHdoZXJlIGUgaXMgaW50ZWdyYWwgYW5kID49IDAsIG0gaXMgcmVhbCBhbmQgaW4gWzAsIDEpLCBhbmQgIi8iIGFuZAorICAgICAqICIlIiBhcmUgaW50ZWdlciBkaXZpc2lvbiBhbmQgbW9kdWx1cyB3aXRoIHJvdW5kaW5nIHRvd2FyZHMgbWludXMKKyAgICAgKiBpbmZpbml0eS4gIFRoZSBSSFMgaXMgYWx3YXlzID49IHRoZSBMSFMgYW5kIGhhcyBhIG1heGltdW0gcmVsYXRpdmUKKyAgICAgKiBlcnJvciBvZiBhYm91dCAxIGluIDE2LiAgQWRkaW5nIGEgYmlhcyBvZiAtMC4wMzMwNjIzNTY1MSB0byB0aGUKKyAgICAgKiAoZSUzK20pLzMgdGVybSByZWR1Y2VzIHRoZSBlcnJvciB0byBhYm91dCAxIGluIDMyLiBXaXRoIHRoZSBJRUVFCisgICAgICogZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24sIGZvciBmaW5pdGUgcG9zaXRpdmUgbm9ybWFsIHZhbHVlcywKKyAgICAgKiBvcmRpbmFyeSBpbnRlZ2VyIGRpdmlzb24gb2YgdGhlIHZhbHVlIGluIGJpdHMgbWFnaWNhbGx5IGdpdmVzCisgICAgICogYWxtb3N0IGV4YWN0bHkgdGhlIFJIUyBvZiB0aGUgYWJvdmUgcHJvdmlkZWQgd2UgZmlyc3Qgc3VidHJhY3QgdGhlCisgICAgICogZXhwb25lbnQgYmlhcyAoMTAyMyBmb3IgZG91YmxlcykgYW5kIGxhdGVyIGFkZCBpdCBiYWNrLiAgV2UgZG8gdGhlCisgICAgICogc3VidHJhY3Rpb24gdmlydHVhbGx5IHRvIGtlZXAgZSA+PSAwIHNvIHRoYXQgb3JkaW5hcnkgaW50ZWdlcgorICAgICAqIGRpdmlzaW9uIHJvdW5kcyB0b3dhcmRzIG1pbnVzIGluZmluaXR5OyB0aGlzIGlzIGFsc28gZWZmaWNpZW50LgorICAgICAqLworCWlmKGh4PDB4MDAxMDAwMDApIHsgCQkvKiBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIFNFVF9ISUdIX1dPUkQodCwweDQzNTAwMDAwKTsgLyogc2V0IHQ9IDIqKjU0ICovCisJICAgIHQqPXg7CisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx0KTsKKwkgICAgU0VUX0hJR0hfV09SRCh0LHNpZ258KChoaWdoJjB4N2ZmZmZmZmYpLzMrQjIpKTsKKwl9IGVsc2UKKwkgICAgU0VUX0hJR0hfV09SRCh0LHNpZ258KGh4LzMrQjEpKTsKKworICAgIC8qIG5ldyBjYnJ0IHRvIDIzIGJpdHM7IG1heSBiZSBpbXBsZW1lbnRlZCBpbiBzaW5nbGUgcHJlY2lzaW9uICovCisJcj10KnQveDsKKwlzPUMrcip0OworCXQqPUcrRi8ocytFK0Qvcyk7CisKKyAgICAvKiBjaG9wIHQgdG8gMjAgYml0cyBhbmQgbWFrZSBpdCBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gY2JydCh4KSAqLworCUdFVF9ISUdIX1dPUkQoaGlnaCx0KTsKKwlJTlNFUlRfV09SRFModCxoaWdoKzB4MDAwMDAwMDEsMCk7CisKKyAgICAvKiBvbmUgc3RlcCBOZXd0b24gaXRlcmF0aW9uIHRvIDUzIGJpdHMgd2l0aCBlcnJvciBsZXNzIHRoYW4gMC42NjcgdWxwcyAqLworCXM9dCp0OwkJLyogdCp0IGlzIGV4YWN0ICovCisJcj14L3M7CisJdz10K3Q7CisJcj0oci10KS8odytyKTsJLyogci10IGlzIGV4YWN0ICovCisJdD10K3QqcjsKKworCXJldHVybih0KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2JydGYuYyBiL2xpYm0vc3JjL3NfY2JydGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU2OWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jYnJ0Zi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIHNfY2JydGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfY2JydC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBEZWJ1Z2dlZCBhbmQgb3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2JydGYuYyx2IDEuMTIgMjAwNS8xMi8xMyAyMDoxNzoyMyBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIGNicnRmKHgpCisgKiBSZXR1cm4gY3ViZSByb290IG9mIHgKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkCisJQjEgPSA3MDk5NTgxMzAsIC8qIEIxID0gKDEyNy0xMjcuMC8zLTAuMDMzMDYyMzU2NTEpKjIqKjIzICovCisJQjIgPSA2NDI4NDkyNjY7IC8qIEIyID0gKDEyNy0xMjcuMC8zLTI0LzMtMC4wMzMwNjIzNTY1MSkqMioqMjMgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0CitDID0gIDUuNDI4NTcxNzAxMGUtMDEsIC8qIDE5LzM1ICAgICA9IDB4M2YwYWY4YjAgKi8KK0QgPSAtNy4wNTMwNjExMjc3ZS0wMSwgLyogLTg2NC8xMjI1ID0gMHhiZjM0OGVmMSAqLworRSA9ICAxLjQxNDI4NTY1OThlKzAwLCAvKiA5OS83MCAgICAgPSAweDNmYjUwNzUwICovCitGID0gIDEuNjA3MTQyODA2MWUrMDAsIC8qIDQ1LzI4ICAgICA9IDB4M2ZjZGI2ZGIgKi8KK0cgPSAgMy41NzE0Mjg2NTY2ZS0wMTsgLyogNS8xNCAgICAgID0gMHgzZWI2ZGI2ZSAqLworCitmbG9hdAorY2JydGYoZmxvYXQgeCkKK3sKKwlmbG9hdCByLHMsdCx3OworCWludDMyX3QgaHg7CisJdV9pbnQzMl90IHNpZ247CisJdV9pbnQzMl90IGhpZ2g7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlzaWduPWh4JjB4ODAwMDAwMDA7IAkJLyogc2lnbj0gc2lnbih4KSAqLworCWh4ICBePXNpZ247CisJaWYoaHg+PTB4N2Y4MDAwMDApIHJldHVybih4K3gpOyAvKiBjYnJ0KE5hTixJTkYpIGlzIGl0c2VsZiAqLworCWlmKGh4PT0wKQorCSAgICByZXR1cm4oeCk7CQkvKiBjYnJ0KDApIGlzIGl0c2VsZiAqLworCisgICAgLyogcm91Z2ggY2JydCB0byA1IGJpdHMgKi8KKwlpZihoeDwweDAwODAwMDAwKSB7IAkJLyogc3Vibm9ybWFsIG51bWJlciAqLworCSAgICBTRVRfRkxPQVRfV09SRCh0LDB4NGI4MDAwMDApOyAvKiBzZXQgdD0gMioqMjQgKi8KKwkgICAgdCo9eDsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaGlnaCx0KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodCxzaWdufCgoaGlnaCYweDdmZmZmZmZmKS8zK0IyKSk7CisJfSBlbHNlCisJICAgIFNFVF9GTE9BVF9XT1JEKHQsc2lnbnwoaHgvMytCMSkpOworCisgICAgLyogbmV3IGNicnQgdG8gMjMgYml0cyAqLworCXI9dCp0L3g7CisJcz1DK3IqdDsKKwl0Kj1HK0YvKHMrRStEL3MpOworCisgICAgLyogY2hvcCB0IHRvIDEyIGJpdHMgYW5kIG1ha2UgaXQgbGFyZ2VyIGluIG1hZ25pdHVkZSB0aGFuIGNicnQoeCkgKi8KKwlHRVRfRkxPQVRfV09SRChoaWdoLHQpOworCVNFVF9GTE9BVF9XT1JEKHQsKGhpZ2gmMHhmZmZmZjAwMCkrMHgwMDAwMTAwMCk7CisKKyAgICAvKiBvbmUgc3RlcCBOZXd0b24gaXRlcmF0aW9uIHRvIDI0IGJpdHMgd2l0aCBlcnJvciBsZXNzIHRoYW4gMC42NjcgdWxwcyAqLworCXM9dCp0OwkJLyogdCp0IGlzIGV4YWN0ICovCisJcj14L3M7CisJdz10K3Q7CisJcj0oci10KS8odytyKTsJLyogci10IGlzIGV4YWN0ICovCisJdD10K3QqcjsKKworCXJldHVybih0KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2VpbC5jIGIvbGlibS9zcmMvc19jZWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NDBlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2VpbC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEAoIylzX2NlaWwuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2VpbC5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjZWlsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBjZWlsKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2RvdWJsZQorY2VpbChkb3VibGUgeCkKK3sKKwlpbnQzMl90IGkwLGkxLGowOworCXVfaW50MzJfdCBpLGo7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlqMCA9ICgoaTA+PjIwKSYweDdmZiktMHgzZmY7CisJaWYoajA8MjApIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PjAuMCkgey8qIHJldHVybiAwKnNpZ24oeCkgaWYgfHh8PDEgKi8KKwkJICAgIGlmKGkwPDApIHtpMD0weDgwMDAwMDAwO2kxPTA7fQorCQkgICAgZWxzZSBpZigoaTB8aTEpIT0wKSB7IGkwPTB4M2ZmMDAwMDA7aTE9MDt9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+MC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaWYoaTA+MCkgaTAgKz0gKDB4MDAxMDAwMDApPj5qMDsKKwkJICAgIGkwICY9ICh+aSk7IGkxPTA7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaWYoaHVnZSt4PjAuMCkgeyAJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQlpZihpMD4wKSB7CisJCSAgICBpZihqMD09MjApIGkwKz0xOworCQkgICAgZWxzZSB7CisJCQlqID0gaTEgKyAoMTw8KDUyLWowKSk7CisJCQlpZihqPGkxKSBpMCs9MTsJLyogZ290IGEgY2FycnkgKi8KKwkJCWkxID0gajsKKwkJICAgIH0KKwkJfQorCQlpMSAmPSAofmkpOworCSAgICB9CisJfQorCUlOU0VSVF9XT1JEUyh4LGkwLGkxKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2VpbGYuYyBiL2xpYm0vc3JjL3NfY2VpbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ2NWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jZWlsZi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIHNfY2VpbGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfY2VpbC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jZWlsZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgaHVnZSA9IDEuMGUzMDsKKworZmxvYXQKK2NlaWxmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKworCUdFVF9GTE9BVF9XT1JEKGkwLHgpOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CisJaWYoajA8MjMpIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PihmbG9hdCkwLjApIHsvKiByZXR1cm4gMCpzaWduKHgpIGlmIHx4fDwxICovCisJCSAgICBpZihpMDwwKSB7aTA9MHg4MDAwMDAwMDt9CisJCSAgICBlbHNlIGlmKGkwIT0wKSB7IGkwPTB4M2Y4MDAwMDA7fQorCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4oZmxvYXQpMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaWYoaTA+MCkgaTAgKz0gKDB4MDA4MDAwMDApPj5qMDsKKwkJICAgIGkwICY9ICh+aSk7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGowPT0weDgwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaTApOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jZWlsbC5jIGIvbGlibS9zcmMvc19jZWlsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODgxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NlaWxsLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogRnJvbTogQCgjKXNfY2VpbC5jIDUuMSA5My8wOS8yNAorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NlaWxsLmMsdiAxLjQgMjAwNS8wNC8yOCAxOTo0NTo1NSBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogY2VpbGwoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGNlaWxsKHgpLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCU1BTkhfU0laRQkoTERCTF9NQU5IX1NJWkUgKyAxKQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pCQkJCQlcCisJCXUuYml0cy5leHArKzsJCQkJCVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZQlNQU5IX1NJWkUJTERCTF9NQU5IX1NJWkUKKyNkZWZpbmUJSU5DX01BTkgodSwgYykJZG8gewkJCQkJXAorCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFuaDsJCQkJXAorCXUuYml0cy5tYW5oICs9IChjKTsJCQkJCVwKKwlpZiAodS5iaXRzLm1hbmggPCBvKSB7CQkJCQlcCisJCXUuYml0cy5leHArKzsJCQkJCVwKKwkJdS5iaXRzLm1hbmggfD0gMWxsdSA8PCAoTERCTF9NQU5IX1NJWkUgLSAxKTsJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2xvbmcgZG91YmxlCitjZWlsbChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdSA9IHsgLmUgPSB4IH07CisJaW50IGUgPSB1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMTsKKworCWlmIChlIDwgTUFOSF9TSVpFIC0gMSkgeworCQlpZiAoZSA8IDApIHsJCQkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKQorCQkJCWlmICh1LmJpdHMuZXhwID4gMCB8fAorCQkJCSAgICAodS5iaXRzLm1hbmggfCB1LmJpdHMubWFubCkgIT0gMCkKKwkJCQkJdS5lID0gdS5iaXRzLnNpZ24gPyAwLjAgOiAxLjA7CisJCX0gZWxzZSB7CisJCQl1aW50NjRfdCBtID0gKCgxbGx1IDw8IE1BTkhfU0laRSkgLSAxKSA+PiAoZSArIDEpOworCQkJaWYgKCgodS5iaXRzLm1hbmggJiBtKSB8IHUuYml0cy5tYW5sKSA9PSAwKQorCQkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJCWlmICghdS5iaXRzLnNpZ24pIHsKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKwkJCQlpZiAoZSA9PSAwKQorCQkJCQl1LmJpdHMuZXhwKys7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJSU5DX01BTkgodSwgMWxsdSA8PCAoTUFOSF9TSVpFIC0gZSAtIDEpKTsKKwkJCX0KKwkJCWlmIChodWdlICsgeCA+IDAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCQl1LmJpdHMubWFuaCAmPSB+bTsKKwkJCQl1LmJpdHMubWFubCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGUgPCBMREJMX01BTlRfRElHIC0gMSkgeworCQl1aW50NjRfdCBtID0gKHVpbnQ2NF90KS0xID4+ICg2NCAtIExEQkxfTUFOVF9ESUcgKyBlICsgMSk7CisJCWlmICgodS5iaXRzLm1hbmwgJiBtKSA9PSAwKQorCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZiAoIXUuYml0cy5zaWduKSB7CisJCQlpZiAoZSA9PSBNQU5IX1NJWkUgLSAxKQorCQkJCUlOQ19NQU5IKHUsIDEpOworCQkJZWxzZSB7CisJCQkJdWludDY0X3QgbyA9IHUuYml0cy5tYW5sOworCQkJCXUuYml0cy5tYW5sICs9IDFsbHUgPDwgKExEQkxfTUFOVF9ESUcgLSBlIC0gMSk7CisJCQkJaWYgKHUuYml0cy5tYW5sIDwgbykJLyogZ290IGEgY2FycnkgKi8KKwkJCQkJSU5DX01BTkgodSwgMSk7CisJCQl9CisJCX0KKwkJaWYgKGh1Z2UgKyB4ID4gMC4wKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQl1LmJpdHMubWFubCAmPSB+bTsKKwl9CisJcmV0dXJuICh1LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jaW1hZy5jIGIvbGlibS9zcmMvc19jaW1hZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NpbWFnLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2ltYWcuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitkb3VibGUKK2NpbWFnKGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIC16ICogSTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2ltYWdmLmMgYi9saWJtL3NyYy9zX2NpbWFnZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGY1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NpbWFnZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NpbWFnZi5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2Zsb2F0CitjaW1hZ2YoZmxvYXQgY29tcGxleCB6KQoreworCXJldHVybiAteiAqIEk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NpbWFnbC5jIGIvbGlibS9zcmMvc19jaW1hZ2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc2NzdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jaW1hZ2wuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jaW1hZ2wuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitsb25nIGRvdWJsZQorY2ltYWdsKGxvbmcgZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gLXogKiBJOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb25qLmMgYi9saWJtL3NyYy9zX2NvbmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdhMTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb25qLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29uai5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2RvdWJsZSBjb21wbGV4Citjb25qKGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIGNyZWFsKHopIC0gSSAqIGNpbWFnKHopOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb25qZi5jIGIvbGlibS9zcmMvc19jb25qZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTAzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvbmpmLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29uamYuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitmbG9hdCBjb21wbGV4Citjb25qZihmbG9hdCBjb21wbGV4IHopCit7CisJcmV0dXJuIGNyZWFsZih6KSAtIEkgKiBjaW1hZ2Yoeik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvbmpsLmMgYi9saWJtL3NyYy9zX2NvbmpsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkODBjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29uamwuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb25qbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2xvbmcgZG91YmxlIGNvbXBsZXgKK2NvbmpsKGxvbmcgZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gY3JlYWxsKHopIC0gSSAqIGNpbWFnbCh6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29weXNpZ24uYyBiL2xpYm0vc3JjL3NfY29weXNpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdiZTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3B5c2lnbi5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIEAoIylzX2NvcHlzaWduLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvcHlzaWduLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGNvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgeSkKKyAqIGNvcHlzaWduKHgseSkgcmV0dXJucyBhIHZhbHVlIHdpdGggdGhlIG1hZ25pdHVkZSBvZiB4IGFuZAorICogd2l0aCB0aGUgc2lnbiBiaXQgb2YgeS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK2NvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl1X2ludDMyX3QgaHgsaHk7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlHRVRfSElHSF9XT1JEKGh5LHkpOworCVNFVF9ISUdIX1dPUkQoeCwoaHgmMHg3ZmZmZmZmZil8KGh5JjB4ODAwMDAwMDApKTsKKyAgICAgICAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvcHlzaWduZi5jIGIvbGlibS9zcmMvc19jb3B5c2lnbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM0NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3B5c2lnbmYuYwpAQCAtMCwwICsxLDM3IEBACisvKiBzX2NvcHlzaWduZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jb3B5c2lnbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3B5c2lnbmYuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogY29weXNpZ25mKGZsb2F0IHgsIGZsb2F0IHkpCisgKiBjb3B5c2lnbmYoeCx5KSByZXR1cm5zIGEgdmFsdWUgd2l0aCB0aGUgbWFnbml0dWRlIG9mIHggYW5kCisgKiB3aXRoIHRoZSBzaWduIGJpdCBvZiB5LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0Citjb3B5c2lnbmYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwl1X2ludDMyX3QgaXgsaXk7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaXkseSk7CisJU0VUX0ZMT0FUX1dPUkQoeCwoaXgmMHg3ZmZmZmZmZil8KGl5JjB4ODAwMDAwMDApKTsKKyAgICAgICAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvcHlzaWdubC5jIGIvbGlibS9zcmMvc19jb3B5c2lnbmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzViZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3B5c2lnbmwuYwpAQCAtMCwwICsxLDQyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3B5c2lnbmwuYyx2IDEuMSAyMDA0LzA1LzA3IDE4OjU2OjMxIHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2xvbmcgZG91YmxlCitjb3B5c2lnbmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHV4LCB1eTsKKworCXV4LmUgPSB4OworCXV5LmUgPSB5OworCXV4LmJpdHMuc2lnbiA9IHV5LmJpdHMuc2lnbjsKKwlyZXR1cm4gKHV4LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3MuYyBiL2xpYm0vc3JjL3NfY29zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhZjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29zLmMKQEAgLTAsMCArMSw4MiBAQAorLyogQCgjKXNfY29zLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Nvcy5jLHYgMS4xMCAyMDA1LzEwLzI0IDE0OjA4OjM2IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogY29zKHgpCisgKiBSZXR1cm4gY29zaW5lIGZ1bmN0aW9uIG9mIHguCisgKgorICoga2VybmVsIGZ1bmN0aW9uOgorICoJX19rZXJuZWxfc2luCQkuLi4gc2luZSBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9fa2VybmVsX2NvcwkJLi4uIGNvc2luZSBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9faWVlZTc1NF9yZW1fcGlvMgkuLi4gYXJndW1lbnQgcmVkdWN0aW9uIHJvdXRpbmUKKyAqCisgKiBNZXRob2QuCisgKiAgICAgIExldCBTLEMgYW5kIFQgZGVub3RlIHRoZSBzaW4sIGNvcyBhbmQgdGFuIHJlc3BlY3RpdmVseSBvbgorICoJWy1QSS80LCArUEkvNF0uIFJlZHVjZSB0aGUgYXJndW1lbnQgeCB0byB5MSt5MiA9IHgtaypwaS8yCisgKglpbiBbLXBpLzQgLCArcGkvNF0sIGFuZCBsZXQgbiA9IGsgbW9kIDQuCisgKglXZSBoYXZlCisgKgorICogICAgICAgICAgbiAgICAgICAgc2luKHgpICAgICAgY29zKHgpICAgICAgICB0YW4oeCkKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgMAkgICAgICAgUwkgICBDCQkgVAorICoJICAgIDEJICAgICAgIEMJICAtUwkJLTEvVAorICoJICAgIDIJICAgICAgLVMJICAtQwkJIFQKKyAqCSAgICAzCSAgICAgIC1DCSAgIFMJCS0xL1QKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqICAgICAgTGV0IHRyaWcgYmUgYW55IG9mIHNpbiwgY29zLCBvciB0YW4uCisgKiAgICAgIHRyaWcoKy1JTkYpICBpcyBOYU4sIHdpdGggc2lnbmFsczsKKyAqICAgICAgdHJpZyhOYU4pICAgIGlzIHRoYXQgTmFOOworICoKKyAqIEFjY3VyYWN5OgorICoJVFJJRyh4KSByZXR1cm5zIHRyaWcoeCkgbmVhcmx5IHJvdW5kZWQKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK2Nvcyhkb3VibGUgeCkKK3sKKwlkb3VibGUgeVsyXSx6PTAuMDsKKwlpbnQzMl90IG4sIGl4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHguICovCisJR0VUX0hJR0hfV09SRChpeCx4KTsKKworICAgIC8qIHx4fCB+PCBwaS80ICovCisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeCA8PSAweDNmZTkyMWZiKSB7CisJICAgIGlmKGl4PDB4M2U0MDAwMDApCQkJLyogaWYgeCA8IDIqKi0yNyAqLworCQlpZigoKGludCl4KT09MCkgcmV0dXJuIDEuMDsJLyogZ2VuZXJhdGUgaW5leGFjdCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfY29zKHgseik7CisJfQorCisgICAgLyogY29zKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yKHgseSk7CisJICAgIHN3aXRjaChuJjMpIHsKKwkJY2FzZSAwOiByZXR1cm4gIF9fa2VybmVsX2Nvcyh5WzBdLHlbMV0pOworCQljYXNlIDE6IHJldHVybiAtX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkJY2FzZSAyOiByZXR1cm4gLV9fa2VybmVsX2Nvcyh5WzBdLHlbMV0pOworCQlkZWZhdWx0OgorCQkgICAgICAgIHJldHVybiAgX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29zZi5jIGIvbGlibS9zcmMvc19jb3NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhZGFkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29zZi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIHNfY29zZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jb3MuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29zZi5jLHYgMS4xNSAyMDA1LzExLzMwIDA2OjQ3OjE4IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9DT1NERgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX1NJTkRGCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisjaW5jbHVkZSAia19jb3NmLmMiCisjaW5jbHVkZSAia19zaW5mLmMiCisKKy8qIFNtYWxsIG11bHRpcGxlcyBvZiBwaS8yIHJvdW5kZWQgdG8gZG91YmxlIHByZWNpc2lvbi4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK2MxcGlvMiA9IDEqTV9QSV8yLAkJCS8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK2MycGlvMiA9IDIqTV9QSV8yLAkJCS8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK2MzcGlvMiA9IDMqTV9QSV8yLAkJCS8qIDB4NDAxMkQ5N0MsIDB4N0YzMzIxRDIgKi8KK2M0cGlvMiA9IDQqTV9QSV8yOwkJCS8qIDB4NDAxOTIxRkIsIDB4NTQ0NDJEMTggKi8KKworZmxvYXQKK2Nvc2YoZmxvYXQgeCkKK3sKKwlmbG9hdCB5WzJdOworCWludDMyX3QgbiwgaHgsIGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CisKKwlpZihpeCA8PSAweDNmNDkwZmRhKSB7CQkvKiB8eHwgfjw9IHBpLzQgKi8KKwkgICAgaWYoaXg8MHgzOTgwMDAwMCkJCS8qIHx4fCA8IDIqKi0xMiAqLworCQlpZigoKGludCl4KT09MCkgcmV0dXJuIDEuMDsJLyogMSB3aXRoIGluZXhhY3QgaWYgeCAhPSAwICovCisJICAgIHJldHVybiBfX2tlcm5lbF9jb3NkZih4KTsKKwl9CisJaWYoaXg8PTB4NDA3YjUzZDEpIHsJCS8qIHx4fCB+PD0gNSpwaS80ICovCisJICAgIGlmKGl4PjB4NDAxNmNiZTMpCQkvKiB8eHwgIH4+IDMqcGkvNCAqLworCQlyZXR1cm4gLV9fa2VybmVsX2Nvc2RmKHggKyAoaHggPiAwID8gLWMycGlvMiA6IGMycGlvMikpOworCSAgICBlbHNlIHsKKwkJaWYoaHg+MCkKKwkJICAgIHJldHVybiBfX2tlcm5lbF9zaW5kZihjMXBpbzIgLSB4KTsKKwkJZWxzZQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHggKyBjMXBpbzIpOworCSAgICB9CisJfQorCWlmKGl4PD0weDQwZTIzMWQ1KSB7CQkvKiB8eHwgfjw9IDkqcGkvNCAqLworCSAgICBpZihpeD4weDQwYWZlZGRmKQkJLyogfHh8ICB+PiA3KnBpLzQgKi8KKwkJcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHggKyAoaHggPiAwID8gLWM0cGlvMiA6IGM0cGlvMikpOworCSAgICBlbHNlIHsKKwkJaWYoaHg+MCkKKwkJICAgIHJldHVybiBfX2tlcm5lbF9zaW5kZih4IC0gYzNwaW8yKTsKKwkJZWxzZQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKC1jM3BpbzIgLSB4KTsKKwkgICAgfQorCX0KKworICAgIC8qIGNvcyhJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGdlbmVyYWwgYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yZih4LHkpOworCSAgICBzd2l0Y2gobiYzKSB7CisJCWNhc2UgMDogcmV0dXJuICBfX2tlcm5lbF9jb3NkZigoZG91YmxlKXlbMF0reVsxXSk7CisJCWNhc2UgMTogcmV0dXJuICBfX2tlcm5lbF9zaW5kZigtKGRvdWJsZSl5WzBdLXlbMV0pOworCQljYXNlIDI6IHJldHVybiAtX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQlkZWZhdWx0OgorCQkgICAgICAgIHJldHVybiAgX19rZXJuZWxfc2luZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jcmVhbC5jIGIvbGlibS9zcmMvc19jcmVhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTRjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NyZWFsLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY3JlYWwuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitkb3VibGUKK2NyZWFsKGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NyZWFsZi5jIGIvbGlibS9zcmMvc19jcmVhbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMxNTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jcmVhbGYuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jcmVhbGYuYyx2IDEuMSAyMDA0LzA1LzMwIDA5OjIxOjU2IHN0ZWZhbmYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorCitmbG9hdAorY3JlYWxmKGZsb2F0IGNvbXBsZXggeikKK3sKKwlyZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY3JlYWxsLmMgYi9saWJtL3NyYy9zX2NyZWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzFkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NyZWFsbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NyZWFsbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2xvbmcgZG91YmxlCitjcmVhbGwobG9uZyBkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19lcmYuYyBiL2xpYm0vc3JjL3NfZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYTJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXJmLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qIEAoIylzX2VyZi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19lcmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogZG91YmxlIGVyZihkb3VibGUgeCkKKyAqIGRvdWJsZSBlcmZjKGRvdWJsZSB4KQorICoJCQkgICAgIHgKKyAqCQkgICAgICAyICAgICAgfFwKKyAqICAgICBlcmYoeCkgID0gIC0tLS0tLS0tLSAgfCBleHAoLXQqdClkdAorICoJIAkgICBzcXJ0KHBpKSBcfAorICoJCQkgICAgIDAKKyAqCisgKiAgICAgZXJmYyh4KSA9ICAxLWVyZih4KQorICogIE5vdGUgdGhhdAorICoJCWVyZigteCkgPSAtZXJmKHgpCisgKgkJZXJmYygteCkgPSAyIC0gZXJmYyh4KQorICoKKyAqIE1ldGhvZDoKKyAqCTEuIEZvciB8eHwgaW4gWzAsIDAuODQzNzVdCisgKgkgICAgZXJmKHgpICA9IHggKyB4KlIoeF4yKQorICogICAgICAgICAgZXJmYyh4KSA9IDEgLSBlcmYoeCkgICAgICAgICAgIGlmIHggaW4gWy0uODQzNzUsMC4yNV0KKyAqICAgICAgICAgICAgICAgICAgPSAwLjUgKyAoKDAuNS14KS14KlIpICBpZiB4IGluIFswLjI1LDAuODQzNzVdCisgKgkgICB3aGVyZSBSID0gUC9RIHdoZXJlIFAgaXMgYW4gb2RkIHBvbHkgb2YgZGVncmVlIDggYW5kCisgKgkgICBRIGlzIGFuIG9kZCBwb2x5IG9mIGRlZ3JlZSAxMC4KKyAqCQkJCQkJIC01Ny45MAorICoJCQl8IFIgLSAoZXJmKHgpLXgpL3ggfCA8PSAyCisgKgorICoKKyAqCSAgIFJlbWFyay4gVGhlIGZvcm11bGEgaXMgZGVyaXZlZCBieSBub3RpbmcKKyAqICAgICAgICAgIGVyZih4KSA9ICgyL3NxcnQocGkpKSooeCAtIHheMy8zICsgeF41LzEwIC0geF43LzQyICsgLi4uLikKKyAqCSAgIGFuZCB0aGF0CisgKiAgICAgICAgICAyL3NxcnQocGkpID0gMS4xMjgzNzkxNjcwOTU1MTI1NzM4OTYxNTg5MDMxMjE1NDUxNzE2ODgKKyAqCSAgIGlzIGNsb3NlIHRvIG9uZS4gVGhlIGludGVydmFsIGlzIGNob3NlbiBiZWNhdXNlIHRoZSBmaXgKKyAqCSAgIHBvaW50IG9mIGVyZih4KSBpcyBuZWFyIDAuNjE3NCAoaS5lLiwgZXJmKHgpPXggd2hlbiB4IGlzCisgKgkgICBuZWFyIDAuNjE3NCksIGFuZCBieSBzb21lIGV4cGVyaW1lbnQsIDAuODQzNzUgaXMgY2hvc2VuIHRvCisgKiAJICAgZ3VhcmFudGVlIHRoZSBlcnJvciBpcyBsZXNzIHRoYW4gb25lIHVscCBmb3IgZXJmLgorICoKKyAqICAgICAgMi4gRm9yIHx4fCBpbiBbMC44NDM3NSwxLjI1XSwgbGV0IHMgPSB8eHwgLSAxLCBhbmQKKyAqICAgICAgICAgYyA9IDAuODQ1MDYyOTExNTEgcm91bmRlZCB0byBzaW5nbGUgKDI0IGJpdHMpCisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSAqIChjICArIFAxKHMpL1ExKHMpKQorICogICAgICAgICAJZXJmYyh4KSA9ICgxLWMpICAtIFAxKHMpL1ExKHMpIGlmIHggPiAwCisgKgkJCSAgMSsoYytQMShzKS9RMShzKSkgICAgaWYgeCA8IDAKKyAqICAgICAgICAgCXxQMS9RMSAtIChlcmYofHh8KS1jKXwgPD0gMioqLTU5LjA2CisgKgkgICBSZW1hcms6IGhlcmUgd2UgdXNlIHRoZSB0YXlsb3Igc2VyaWVzIGV4cGFuc2lvbiBhdCB4PTEuCisgKgkJZXJmKDErcykgPSBlcmYoMSkgKyBzKlBvbHkocykKKyAqCQkJID0gMC44NDUuLiArIFAxKHMpL1ExKHMpCisgKgkgICBUaGF0IGlzLCB3ZSB1c2UgcmF0aW9uYWwgYXBwcm94aW1hdGlvbiB0byBhcHByb3hpbWF0ZQorICoJCQllcmYoMStzKSAtIChjID0gKHNpbmdsZSkwLjg0NTA2MjkxMTUxKQorICoJICAgTm90ZSB0aGF0IHxQMS9RMXw8IDAuMDc4IGZvciB4IGluIFswLjg0Mzc1LDEuMjVdCisgKgkgICB3aGVyZQorICoJCVAxKHMpID0gZGVncmVlIDYgcG9seSBpbiBzCisgKgkJUTEocykgPSBkZWdyZWUgNiBwb2x5IGluIHMKKyAqCisgKiAgICAgIDMuIEZvciB4IGluIFsxLjI1LDEvMC4zNSh+Mi44NTcxNDMpXSwKKyAqICAgICAgICAgCWVyZmMoeCkgPSAoMS94KSpleHAoLXgqeC0wLjU2MjUrUjEvUzEpCisgKiAgICAgICAgIAllcmYoeCkgID0gMSAtIGVyZmMoeCkKKyAqCSAgIHdoZXJlCisgKgkJUjEoeikgPSBkZWdyZWUgNyBwb2x5IGluIHosICh6PTEveF4yKQorICoJCVMxKHopID0gZGVncmVlIDggcG9seSBpbiB6CisgKgorICogICAgICA0LiBGb3IgeCBpbiBbMS8wLjM1LDI4XQorICogICAgICAgICAJZXJmYyh4KSA9ICgxL3gpKmV4cCgteCp4LTAuNTYyNStSMi9TMikgaWYgeCA+IDAKKyAqCQkJPSAyLjAgLSAoMS94KSpleHAoLXgqeC0wLjU2MjUrUjIvUzIpIGlmIC02PHg8MAorICoJCQk9IDIuMCAtIHRpbnkJCShpZiB4IDw9IC02KQorICogICAgICAgICAJZXJmKHgpICA9IHNpZ24oeCkqKDEuMCAtIGVyZmMoeCkpIGlmIHggPCA2LCBlbHNlCisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSooMS4wIC0gdGlueSkKKyAqCSAgIHdoZXJlCisgKgkJUjIoeikgPSBkZWdyZWUgNiBwb2x5IGluIHosICh6PTEveF4yKQorICoJCVMyKHopID0gZGVncmVlIDcgcG9seSBpbiB6CisgKgorICogICAgICBOb3RlMToKKyAqCSAgIFRvIGNvbXB1dGUgZXhwKC14KngtMC41NjI1K1IvUyksIGxldCBzIGJlIGEgc2luZ2xlCisgKgkgICBwcmVjaXNpb24gbnVtYmVyIGFuZCBzIDo9IHg7IHRoZW4KKyAqCQkteCp4ID0gLXMqcyArIChzLXgpKihzK3gpCisgKgkgICAgICAgIGV4cCgteCp4LTAuNTYyNitSL1MpID0KKyAqCQkJZXhwKC1zKnMtMC41NjI1KSpleHAoKHMteCkqKHMreCkrUi9TKTsKKyAqICAgICAgTm90ZTI6CisgKgkgICBIZXJlIDQgYW5kIDUgbWFrZSB1c2Ugb2YgdGhlIGFzeW1wdG90aWMgc2VyaWVzCisgKgkJCSAgZXhwKC14KngpCisgKgkJZXJmYyh4KSB+IC0tLS0tLS0tLS0gKiAoIDEgKyBQb2x5KDEveF4yKSApCisgKgkJCSAgeCpzcXJ0KHBpKQorICoJICAgV2UgdXNlIHJhdGlvbmFsIGFwcHJveGltYXRpb24gdG8gYXBwcm94aW1hdGUKKyAqICAgICAgCWcocyk9ZigxL3heMikgPSBsb2coZXJmYyh4KSp4KSAtIHgqeCArIDAuNTYyNQorICoJICAgSGVyZSBpcyB0aGUgZXJyb3IgYm91bmQgZm9yIFIxL1MxIGFuZCBSMi9TMgorICogICAgICAJfFIxL1MxIC0gZih4KXwgIDwgMioqKC02Mi41NykKKyAqICAgICAgCXxSMi9TMiAtIGYoeCl8ICA8IDIqKigtNjEuNTIpCisgKgorICogICAgICA1LiBGb3IgaW5mID4geCA+PSAyOAorICogICAgICAgICAJZXJmKHgpICA9IHNpZ24oeCkgKigxIC0gdGlueSkgIChyYWlzZSBpbmV4YWN0KQorICogICAgICAgICAJZXJmYyh4KSA9IHRpbnkqdGlueSAocmFpc2UgdW5kZXJmbG93KSBpZiB4ID4gMAorICoJCQk9IDIgLSB0aW55IGlmIHg8MAorICoKKyAqICAgICAgNy4gU3BlY2lhbCBjYXNlOgorICogICAgICAgICAJZXJmKDApICA9IDAsIGVyZihpbmYpICA9IDEsIGVyZigtaW5mKSA9IC0xLAorICogICAgICAgICAJZXJmYygwKSA9IDEsIGVyZmMoaW5mKSA9IDAsIGVyZmMoLWluZikgPSAyLAorICoJICAgCWVyZmMvZXJmKE5hTikgaXMgTmFOCisgKi8KKworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0aW55CSAgICA9IDFlLTMwMCwKK2hhbGY9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCit0d28gPSAgMi4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KKwkvKiBjID0gKGZsb2F0KTAuODQ1MDYyOTExNTEgKi8KK2VyeCA9ICA4LjQ1MDYyOTExNTEwNDY3NTI5Mjk3ZS0wMSwgLyogMHgzRkVCMEFDMSwgMHg2MDAwMDAwMCAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmIG9uIFswLDAuODQzNzVdCisgKi8KK2VmeCA9ICAxLjI4Mzc5MTY3MDk1NTEyNTg2MzE2ZS0wMSwgLyogMHgzRkMwNkVCQSwgMHg4MjE0REI2OSAqLworZWZ4OD0gIDEuMDI3MDMzMzM2NzY0MTAwNjkwNTNlKzAwLCAvKiAweDNGRjA2RUJBLCAweDgyMTREQjY5ICovCitwcDAgID0gIDEuMjgzNzkxNjcwOTU1MTI1NTg1NjFlLTAxLCAvKiAweDNGQzA2RUJBLCAweDgyMTREQjY4ICovCitwcDEgID0gLTMuMjUwNDIxMDcyNDcwMDE0OTkzNzBlLTAxLCAvKiAweEJGRDRDRDdELCAweDY5MUNCOTEzICovCitwcDIgID0gLTIuODQ4MTc0OTU3NTU5ODUxMDQ3NjZlLTAyLCAvKiAweEJGOUQyQTUxLCAweERCRDcxOTRGICovCitwcDMgID0gLTUuNzcwMjcwMjk2NDg5NDQxNTkxNTdlLTAzLCAvKiAweEJGNzdBMjkxLCAweDIzNjY2OEU0ICovCitwcDQgID0gLTIuMzc2MzAxNjY1NjY1MDE2MjYwODRlLTA1LCAvKiAweEJFRjhFQUQ2LCAweDEyMDAxNkFDICovCitxcTEgID0gIDMuOTc5MTcyMjM5NTkxNTUzNTI4MTllLTAxLCAvKiAweDNGRDk3Nzc5LCAweENEREFEQzA5ICovCitxcTIgID0gIDYuNTAyMjI0OTk4ODc2NzI5NDQ0ODVlLTAyLCAvKiAweDNGQjBBNTRDLCAweDU1MzZDRUJBICovCitxcTMgID0gIDUuMDgxMzA2MjgxODc1NzY1NjI3NzZlLTAzLCAvKiAweDNGNzREMDIyLCAweEM0RDM2QjBGICovCitxcTQgID0gIDEuMzI0OTQ3MzgwMDQzMjE2NDQ1MjZlLTA0LCAvKiAweDNGMjE1REM5LCAweDIyMUMxQTEwICovCitxcTUgID0gLTMuOTYwMjI4Mjc4Nzc1MzY4MTIzMjBlLTA2LCAvKiAweEJFRDA5QzQzLCAweDQyQTI2MTIwICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgIGluIFswLjg0Mzc1LDEuMjVdCisgKi8KK3BhMCAgPSAtMi4zNjIxMTg1NjA3NTI2NTk0NDA3N2UtMDMsIC8qIDB4QkY2MzU5QjgsIDB4QkVGNzc1MzggKi8KK3BhMSAgPSAgNC4xNDg1NjExODY4Mzc0ODMzMTY2NmUtMDEsIC8qIDB4M0ZEQThEMDAsIDB4QUQ5MkIzNEQgKi8KK3BhMiAgPSAtMy43MjIwNzg3NjAzNTcwMTMyMzg0N2UtMDEsIC8qIDB4QkZEN0QyNDAsIDB4RkJCOEMzRjEgKi8KK3BhMyAgPSAgMy4xODM0NjYxOTkwMTE2MTc1MzY3NGUtMDEsIC8qIDB4M0ZENDVGQ0EsIDB4ODA1MTIwRTQgKi8KK3BhNCAgPSAtMS4xMDg5NDY5NDI4MjM5NjY3NzQ3NmUtMDEsIC8qIDB4QkZCQzYzOTgsIDB4M0QzRTI4RUMgKi8KK3BhNSAgPSAgMy41NDc4MzA0MzI1NjE4MjM1OTM3MWUtMDIsIC8qIDB4M0ZBMjJBMzYsIDB4NTk5Nzk1RUIgKi8KK3BhNiAgPSAtMi4xNjYzNzU1OTQ4Njg3OTA4NDMwMGUtMDMsIC8qIDB4QkY2MUJGMzgsIDB4MEE5NjA3M0YgKi8KK3FhMSAgPSAgMS4wNjQyMDg4MDQwMDg0NDIyODI4NmUtMDEsIC8qIDB4M0ZCQjNFNjYsIDB4MThFRUUzMjMgKi8KK3FhMiAgPSAgNS40MDM5NzkxNzcwMjE3MTA0ODkzN2UtMDEsIC8qIDB4M0ZFMTRBRjAsIDB4OTJFQjZGMzMgKi8KK3FhMyAgPSAgNy4xODI4NjU0NDE0MTk2MjY2Mjg2OGUtMDIsIC8qIDB4M0ZCMjYzNUMsIDB4RDk5RkU5QTcgKi8KK3FhNCAgPSAgMS4yNjE3MTIxOTgwODc2MTY0MjExMmUtMDEsIC8qIDB4M0ZDMDI2NjAsIDB4RTc2MzM1MUYgKi8KK3FhNSAgPSAgMS4zNjM3MDgzOTEyMDI5MDUwNzM2MmUtMDIsIC8qIDB4M0Y4QkVEQzIsIDB4NkI1MUREMUMgKi8KK3FhNiAgPSAgMS4xOTg0NDk5ODQ2Nzk5MTA3NDE3MGUtMDIsIC8qIDB4M0Y4ODhCNTQsIDB4NTczNTE1MUQgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZmMgaW4gWzEuMjUsMS8wLjM1XQorICovCityYTAgID0gLTkuODY0OTQ0MDM0ODQ3MTQ4MjI3MDVlLTAzLCAvKiAweEJGODQzNDEyLCAweDYwMEQ2NDM1ICovCityYTEgID0gLTYuOTM4NTg1NzI3MDcxODE3NjQzNzJlLTAxLCAvKiAweEJGRTYzNDE2LCAweEU0QkE3MzYwICovCityYTIgID0gLTEuMDU1ODYyNjIyNTMyMzI5MDk4MTRlKzAxLCAvKiAweEMwMjUxRTA0LCAweDQxQjBFNzI2ICovCityYTMgID0gLTYuMjM3NTMzMjQ1MDMyNjAwNjAzOTZlKzAxLCAvKiAweEMwNEYzMDBBLCAweEU0Q0JBMzhEICovCityYTQgID0gLTEuNjIzOTY2Njk0NjI1NzM0NzAzNTVlKzAyLCAvKiAweEMwNjQ0Q0IxLCAweDg0MjgyMjY2ICovCityYTUgID0gLTEuODQ2MDUwOTI5MDY3MTEwMzU5OTRlKzAyLCAvKiAweEMwNjcxMzVDLCAweEVCQ0NBQkIyICovCityYTYgID0gLTguMTI4NzQzNTUwNjMwNjU5MzQyNDZlKzAxLCAvKiAweEMwNTQ1MjY1LCAweDU3RTREMkYyICovCityYTcgID0gLTkuODE0MzI5MzQ0MTY5MTQ1NDg1OTJlKzAwLCAvKiAweEMwMjNBMEVGLCAweEM2OUFDMjVDICovCitzYTEgID0gIDEuOTY1MTI3MTY2NzQzOTI1NzEyOTJlKzAxLCAvKiAweDQwMzNBNkI5LCAweEJENzA3Njg3ICovCitzYTIgID0gIDEuMzc2NTc3NTQxNDM1MTkwNDI2MDBlKzAyLCAvKiAweDQwNjEzNTBDLCAweDUyNkFFNzIxICovCitzYTMgID0gIDQuMzQ1NjU4Nzc0NzUyMjkyMjg4MjFlKzAyLCAvKiAweDQwN0IyOTBELCAweEQ1OEExQTcxICovCitzYTQgID0gIDYuNDUzODcyNzE3MzMyNjc4ODAzMzZlKzAyLCAvKiAweDQwODQyQjE5LCAweDIxRUMyODY4ICovCitzYTUgID0gIDQuMjkwMDgxNDAwMjc1Njc4MzMzODZlKzAyLCAvKiAweDQwN0FEMDIxLCAweDU3NzAwMzE0ICovCitzYTYgID0gIDEuMDg2MzUwMDU1NDE3Nzk0MzUxMzRlKzAyLCAvKiAweDQwNUIyOEEzLCAweEVFNDhBRTJDICovCitzYTcgID0gIDYuNTcwMjQ5NzcwMzE5MjgxNzAxMzVlKzAwLCAvKiAweDQwMUE0N0VGLCAweDhFNDg0QTkzICovCitzYTggID0gLTYuMDQyNDQxNTIxNDg1ODA5ODc0MzhlLTAyLCAvKiAweEJGQUVFRkYyLCAweEVFNzQ5QTYyICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLy4zNSwyOF0KKyAqLworcmIwICA9IC05Ljg2NDk0MjkyNDcwMDA5OTI4NTk3ZS0wMywgLyogMHhCRjg0MzQxMiwgMHgzOUU4NkY0QSAqLworcmIxICA9IC03Ljk5MjgzMjM3NjgwNTIzMDA2NTc0ZS0wMSwgLyogMHhCRkU5OTNCQSwgMHg3MEMyODVERSAqLworcmIyICA9IC0xLjc3NTc5NTQ5MTc3NTQ3NTE5ODg5ZSswMSwgLyogMHhDMDMxQzIwOSwgMHg1NTVGOTk1QSAqLworcmIzICA9IC0xLjYwNjM2Mzg0ODU1ODIxOTE2MDYyZSswMiwgLyogMHhDMDY0MTQ1RCwgMHg0M0M1RUQ5OCAqLworcmI0ICA9IC02LjM3NTY2NDQzMzY4Mzg5NjI3NzIyZSswMiwgLyogMHhDMDgzRUM4OCwgMHgxMzc1RjIyOCAqLworcmI1ICA9IC0xLjAyNTA5NTEzMTYxMTA3NzI0OTU0ZSswMywgLyogMHhDMDkwMDQ2MSwgMHg2QTJFNTk5MiAqLworcmI2ICA9IC00LjgzNTE5MTkxNjA4NjUxMzk3MDE5ZSswMiwgLyogMHhDMDdFMzg0RSwgMHg5QkRDMzgzRiAqLworc2IxICA9ICAzLjAzMzgwNjA3NDM0ODI0NTgyOTI0ZSswMSwgLyogMHg0MDNFNTY4QiwgMHgyNjFENTE5MCAqLworc2IyICA9ICAzLjI1NzkyNTEyOTk2NTczOTE4ODI2ZSswMiwgLyogMHg0MDc0NUNBRSwgMHgyMjFCOUYwQSAqLworc2IzICA9ICAxLjUzNjcyOTU4NjA4NDQzNjk1OTk0ZSswMywgLyogMHg0MDk4MDJFQiwgMHgxODlENTExOCAqLworc2I0ICA9ICAzLjE5OTg1ODIxOTUwODU5NTUzOTA4ZSswMywgLyogMHg0MEE4RkZCNywgMHg2ODhDMjQ2QSAqLworc2I1ICA9ICAyLjU1MzA1MDQwNjQzMzE2NDQyNTgzZSswMywgLyogMHg0MEEzRjIxOSwgMHhDRURGM0JFNiAqLworc2I2ICA9ICA0Ljc0NTI4NTQxMjA2OTU1MzY3MjE1ZSswMiwgLyogMHg0MDdEQTg3NCwgMHhFNzlGRTc2MyAqLworc2I3ICA9IC0yLjI0NDA5NTI0NDY1ODU4MTgzMzYyZSswMTsgLyogMHhDMDM2NzBFMiwgMHg0MjcxMkQ2MiAqLworCitkb3VibGUKK2VyZihkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4LGl4LGk7CisJZG91YmxlIFIsUyxQLFEscyx5LHoscjsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgewkJLyogZXJmKG5hbik9bmFuICovCisJICAgIGkgPSAoKHVfaW50MzJfdCloeD4+MzEpPDwxOworCSAgICByZXR1cm4gKGRvdWJsZSkoMS1pKStvbmUveDsJLyogZXJmKCstaW5mKT0rLTEgKi8KKwl9CisKKwlpZihpeCA8IDB4M2ZlYjAwMDApIHsJCS8qIHx4fDwwLjg0Mzc1ICovCisJICAgIGlmKGl4IDwgMHgzZTMwMDAwMCkgeyAJLyogfHh8PDIqKi0yOCAqLworCSAgICAgICAgaWYgKGl4IDwgMHgwMDgwMDAwMCkKKwkJICAgIHJldHVybiAwLjEyNSooOC4wKngrZWZ4OCp4KTsgIC8qYXZvaWQgdW5kZXJmbG93ICovCisJCXJldHVybiB4ICsgZWZ4Kng7CisJICAgIH0KKwkgICAgeiA9IHgqeDsKKwkgICAgciA9IHBwMCt6KihwcDEreioocHAyK3oqKHBwMyt6KnBwNCkpKTsKKwkgICAgcyA9IG9uZSt6KihxcTEreioocXEyK3oqKHFxMyt6KihxcTQreipxcTUpKSkpOworCSAgICB5ID0gci9zOworCSAgICByZXR1cm4geCArIHgqeTsKKwl9CisJaWYoaXggPCAweDNmZjQwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnMoeCktb25lOworCSAgICBQID0gcGEwK3MqKHBhMStzKihwYTIrcyoocGEzK3MqKHBhNCtzKihwYTUrcypwYTYpKSkpKTsKKwkgICAgUSA9IG9uZStzKihxYTErcyoocWEyK3MqKHFhMytzKihxYTQrcyoocWE1K3MqcWE2KSkpKSk7CisJICAgIGlmKGh4Pj0wKSByZXR1cm4gZXJ4ICsgUC9ROyBlbHNlIHJldHVybiAtZXJ4IC0gUC9ROworCX0KKwlpZiAoaXggPj0gMHg0MDE4MDAwMCkgewkJLyogaW5mPnx4fD49NiAqLworCSAgICBpZihoeD49MCkgcmV0dXJuIG9uZS10aW55OyBlbHNlIHJldHVybiB0aW55LW9uZTsKKwl9CisJeCA9IGZhYnMoeCk7CisgCXMgPSBvbmUvKHgqeCk7CisJaWYoaXg8IDB4NDAwNkRCNkUpIHsJLyogfHh8IDwgMS8wLjM1ICovCisJICAgIFI9cmEwK3MqKHJhMStzKihyYTIrcyoocmEzK3MqKHJhNCtzKigKKwkJCQlyYTUrcyoocmE2K3MqcmE3KSkpKSkpOworCSAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCX0gZWxzZSB7CS8qIHx4fCA+PSAxLzAuMzUgKi8KKwkgICAgUj1yYjArcyoocmIxK3MqKHJiMitzKihyYjMrcyoocmI0K3MqKAorCQkJCXJiNStzKnJiNikpKSkpOworCSAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwl9CisJeiAgPSB4OworCVNFVF9MT1dfV09SRCh6LDApOworCXIgID0gIF9faWVlZTc1NF9leHAoLXoqei0wLjU2MjUpKl9faWVlZTc1NF9leHAoKHoteCkqKHoreCkrUi9TKTsKKwlpZihoeD49MCkgcmV0dXJuIG9uZS1yL3g7IGVsc2UgcmV0dXJuICByL3gtb25lOworfQorCitkb3VibGUKK2VyZmMoZG91YmxlIHgpCit7CisJaW50MzJfdCBoeCxpeDsKKwlkb3VibGUgUixTLFAsUSxzLHkseixyOworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSB7CQkJLyogZXJmYyhuYW4pPW5hbiAqLworCQkJCQkJLyogZXJmYygrLWluZik9MCwyICovCisJICAgIHJldHVybiAoZG91YmxlKSgoKHVfaW50MzJfdCloeD4+MzEpPDwxKStvbmUveDsKKwl9CisKKwlpZihpeCA8IDB4M2ZlYjAwMDApIHsJCS8qIHx4fDwwLjg0Mzc1ICovCisJICAgIGlmKGl4IDwgMHgzYzcwMDAwMCkgIAkvKiB8eHw8MioqLTU2ICovCisJCXJldHVybiBvbmUteDsKKwkgICAgeiA9IHgqeDsKKwkgICAgciA9IHBwMCt6KihwcDEreioocHAyK3oqKHBwMyt6KnBwNCkpKTsKKwkgICAgcyA9IG9uZSt6KihxcTEreioocXEyK3oqKHFxMyt6KihxcTQreipxcTUpKSkpOworCSAgICB5ID0gci9zOworCSAgICBpZihoeCA8IDB4M2ZkMDAwMDApIHsgIAkvKiB4PDEvNCAqLworCQlyZXR1cm4gb25lLSh4K3gqeSk7CisJICAgIH0gZWxzZSB7CisJCXIgPSB4Knk7CisJCXIgKz0gKHgtaGFsZik7CisJICAgICAgICByZXR1cm4gaGFsZiAtIHIgOworCSAgICB9CisJfQorCWlmKGl4IDwgMHgzZmY0MDAwMCkgewkJLyogMC44NDM3NSA8PSB8eHwgPCAxLjI1ICovCisJICAgIHMgPSBmYWJzKHgpLW9uZTsKKwkgICAgUCA9IHBhMCtzKihwYTErcyoocGEyK3MqKHBhMytzKihwYTQrcyoocGE1K3MqcGE2KSkpKSk7CisJICAgIFEgPSBvbmUrcyoocWExK3MqKHFhMitzKihxYTMrcyoocWE0K3MqKHFhNStzKnFhNikpKSkpOworCSAgICBpZihoeD49MCkgeworCSAgICAgICAgeiAgPSBvbmUtZXJ4OyByZXR1cm4geiAtIFAvUTsKKwkgICAgfSBlbHNlIHsKKwkJeiA9IGVyeCtQL1E7IHJldHVybiBvbmUrejsKKwkgICAgfQorCX0KKwlpZiAoaXggPCAweDQwM2MwMDAwKSB7CQkvKiB8eHw8MjggKi8KKwkgICAgeCA9IGZhYnMoeCk7CisgCSAgICBzID0gb25lLyh4KngpOworCSAgICBpZihpeDwgMHg0MDA2REI2RCkgewkvKiB8eHwgPCAxLy4zNSB+IDIuODU3MTQzKi8KKwkgICAgICAgIFI9cmEwK3MqKHJhMStzKihyYTIrcyoocmEzK3MqKHJhNCtzKigKKwkJCQlyYTUrcyoocmE2K3MqcmE3KSkpKSkpOworCSAgICAgICAgUz1vbmUrcyooc2ExK3MqKHNhMitzKihzYTMrcyooc2E0K3MqKAorCQkJCXNhNStzKihzYTYrcyooc2E3K3Mqc2E4KSkpKSkpKTsKKwkgICAgfSBlbHNlIHsJCQkvKiB8eHwgPj0gMS8uMzUgfiAyLjg1NzE0MyAqLworCQlpZihoeDwwJiZpeD49MHg0MDE4MDAwMCkgcmV0dXJuIHR3by10aW55Oy8qIHggPCAtNiAqLworCSAgICAgICAgUj1yYjArcyoocmIxK3MqKHJiMitzKihyYjMrcyoocmI0K3MqKAorCQkJCXJiNStzKnJiNikpKSkpOworCSAgICAgICAgUz1vbmUrcyooc2IxK3MqKHNiMitzKihzYjMrcyooc2I0K3MqKAorCQkJCXNiNStzKihzYjYrcypzYjcpKSkpKSk7CisJICAgIH0KKwkgICAgeiAgPSB4OworCSAgICBTRVRfTE9XX1dPUkQoeiwwKTsKKwkgICAgciAgPSAgX19pZWVlNzU0X2V4cCgteip6LTAuNTYyNSkqCisJCQlfX2llZWU3NTRfZXhwKCh6LXgpKih6K3gpK1IvUyk7CisJICAgIGlmKGh4PjApIHJldHVybiByL3g7IGVsc2UgcmV0dXJuIHR3by1yL3g7CisJfSBlbHNlIHsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHRpbnkqdGlueTsgZWxzZSByZXR1cm4gdHdvLXRpbnk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19lcmZmLmMgYi9saWJtL3NyYy9zX2VyZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUwNTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19lcmZmLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qIHNfZXJmZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19lcmYuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXJmZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3RpbnkJICAgID0gMWUtMzAsCitoYWxmPSAgNS4wMDAwMDAwMDAwZS0wMSwgLyogMHgzRjAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0Y4MDAwMDAgKi8KK3R3byA9ICAyLjAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwICovCisJLyogYyA9IChzdWJmbG9hdCkwLjg0NTA2MjkxMTUxICovCitlcnggPSAgOC40NTA2MjkxMTUxZS0wMSwgLyogMHgzZjU4NTYwYiAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmIG9uIFswLDAuODQzNzVdCisgKi8KK2VmeCA9ICAxLjI4Mzc5MTY2MTNlLTAxLCAvKiAweDNlMDM3NWQ0ICovCitlZng4PSAgMS4wMjcwMzMzMjkwZSswMCwgLyogMHgzZjgzNzVkNCAqLworcHAwICA9ICAxLjI4Mzc5MTY2MTNlLTAxLCAvKiAweDNlMDM3NWQ0ICovCitwcDEgID0gLTMuMjUwNDIwOTg3NmUtMDEsIC8qIDB4YmVhNjZiZWIgKi8KK3BwMiAgPSAtMi44NDgxNzQ5ODE4ZS0wMiwgLyogMHhiY2U5NTI4ZiAqLworcHAzICA9IC01Ljc3MDI3MDI0NzBlLTAzLCAvKiAweGJiYmQxNDg5ICovCitwcDQgID0gLTIuMzc2MzAxNzQ1MmUtMDUsIC8qIDB4YjdjNzU2YjEgKi8KK3FxMSAgPSAgMy45NzkxNzIxMTA2ZS0wMSwgLyogMHgzZWNiYmJjZSAqLworcXEyICA9ICA2LjUwMjIyNTI1MDBlLTAyLCAvKiAweDNkODUyYTYzICovCitxcTMgID0gIDUuMDgxMzA2MjExN2UtMDMsIC8qIDB4M2JhNjgxMTYgKi8KK3FxNCAgPSAgMS4zMjQ5NDczNzA0ZS0wNCwgLyogMHgzOTBhZWU0OSAqLworcXE1ICA9IC0zLjk2MDIyODI0MTNlLTA2LCAvKiAweGI2ODRlMjFhICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgIGluIFswLjg0Mzc1LDEuMjVdCisgKi8KK3BhMCAgPSAtMi4zNjIxMTg1NjgzZS0wMywgLyogMHhiYjFhY2RjNiAqLworcGExICA9ICA0LjE0ODU2MTA2MDRlLTAxLCAvKiAweDNlZDQ2ODA1ICovCitwYTIgID0gLTMuNzIyMDc4ODAwMmUtMDEsIC8qIDB4YmViZTkyMDggKi8KK3BhMyAgPSAgMy4xODM0NjYxOTYxZS0wMSwgLyogMHgzZWEyZmU1NCAqLworcGE0ICA9IC0xLjEwODk0Njk0OTJlLTAxLCAvKiAweGJkZTMxY2MyICovCitwYTUgID0gIDMuNTQ3ODMwNTA3MmUtMDIsIC8qIDB4M2QxMTUxYjMgKi8KK3BhNiAgPSAtMi4xNjYzNzU1MTc4ZS0wMywgLyogMHhiYjBkZjljMCAqLworcWExICA9ICAxLjA2NDIwODgyMDVlLTAxLCAvKiAweDNkZDlmMzMxICovCitxYTIgID0gIDUuNDAzOTc5NDIwN2UtMDEsIC8qIDB4M2YwYTU3ODUgKi8KK3FhMyAgPSAgNy4xODI4NjU1ODk5ZS0wMiwgLyogMHgzZDkzMWFlNyAqLworcWE0ICA9ICAxLjI2MTcxMjE2MzdlLTAxLCAvKiAweDNlMDEzMzA3ICovCitxYTUgID0gIDEuMzYzNzA4MzU4M2UtMDIsIC8qIDB4M2M1ZjZlMTMgKi8KK3FhNiAgPSAgMS4xOTg0NTAwMTAzZS0wMiwgLyogMHgzYzQ0NWFhMyAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmYyBpbiBbMS4yNSwxLzAuMzVdCisgKi8KK3JhMCAgPSAtOS44NjQ5NDQwMzMzZS0wMywgLyogMHhiYzIxYTA5MyAqLworcmExICA9IC02LjkzODU4NTYzOTBlLTAxLCAvKiAweGJmMzFhMGI3ICovCityYTIgID0gLTEuMDU1ODYyNjE3NWUrMDEsIC8qIDB4YzEyOGYwMjIgKi8KK3JhMyAgPSAtNi4yMzc1MzMxODc5ZSswMSwgLyogMHhjMjc5ODA1NyAqLworcmE0ICA9IC0xLjYyMzk2NjY3NDhlKzAyLCAvKiAweGMzMjI2NThjICovCityYTUgID0gLTEuODQ2MDUwODcyOGUrMDIsIC8qIDB4YzMzODlhZTcgKi8KK3JhNiAgPSAtOC4xMjg3NDM3NDM5ZSswMSwgLyogMHhjMmEyOTMyYiAqLworcmE3ICA9IC05LjgxNDMyOTE0NzNlKzAwLCAvKiAweGMxMWQwNzdlICovCitzYTEgID0gIDEuOTY1MTI3MTgyMGUrMDEsIC8qIDB4NDE5ZDM1Y2UgKi8KK3NhMiAgPSAgMS4zNzY1Nzc2MDYyZSswMiwgLyogMHg0MzA5YTg2MyAqLworc2EzICA9ICA0LjM0NTY1ODg3NDVlKzAyLCAvKiAweDQzZDk0ODZmICovCitzYTQgID0gIDYuNDUzODcyNjgwN2UrMDIsIC8qIDB4NDQyMTU4YzkgKi8KK3NhNSAgPSAgNC4yOTAwODE0ODE5ZSswMiwgLyogMHg0M2Q2ODEwYiAqLworc2E2ICA9ICAxLjA4NjM1MDAyMTRlKzAyLCAvKiAweDQyZDk0NTFmICovCitzYTcgID0gIDYuNTcwMjQ5NTU3NWUrMDAsIC8qIDB4NDBkMjNmN2MgKi8KK3NhOCAgPSAtNi4wNDI0NDEzNTMyZS0wMiwgLyogMHhiZDc3N2Y5NyAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmYyBpbiBbMS8uMzUsMjhdCisgKi8KK3JiMCAgPSAtOS44NjQ5NDMxMDIwZS0wMywgLyogMHhiYzIxYTA5MiAqLworcmIxICA9IC03Ljk5MjgzMjY2MDdlLTAxLCAvKiAweGJmNGM5ZGQ0ICovCityYjIgID0gLTEuNzc1Nzk1NTU1MWUrMDEsIC8qIDB4YzE4ZTEwNGIgKi8KK3JiMyAgPSAtMS42MDYzNjM4MzA2ZSswMiwgLyogMHhjMzIwYTJlYSAqLworcmI0ICA9IC02LjM3NTY2NDY3MjllKzAyLCAvKiAweGM0MWY2NDQxICovCityYjUgID0gLTEuMDI1MDk1MDkyOGUrMDMsIC8qIDB4YzQ4MDIzMGIgKi8KK3JiNiAgPSAtNC44MzUxOTE5NTU2ZSswMiwgLyogMHhjM2YxYzI3NSAqLworc2IxICA9ICAzLjAzMzgwNjAzNzllKzAxLCAvKiAweDQxZjJiNDU5ICovCitzYjIgID0gIDMuMjU3OTI1MTA5OWUrMDIsIC8qIDB4NDNhMmU1NzEgKi8KK3NiMyAgPSAgMS41MzY3Mjk2MTQzZSswMywgLyogMHg0NGMwMTc1OSAqLworc2I0ICA9ICAzLjE5OTg1ODE1NDNlKzAzLCAvKiAweDQ1NDdmZGJiICovCitzYjUgID0gIDIuNTUzMDUwMjkzMGUrMDMsIC8qIDB4NDUxZjkwY2UgKi8KK3NiNiAgPSAgNC43NDUyODUzMzk0ZSswMiwgLyogMHg0M2VkNDNhNyAqLworc2I3ICA9IC0yLjI0NDA5NTIzMDFlKzAxOyAvKiAweGMxYjM4NzEyICovCisKK2Zsb2F0CitlcmZmKGZsb2F0IHgpCit7CisJaW50MzJfdCBoeCxpeCxpOworCWZsb2F0IFIsUyxQLFEscyx5LHoscjsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHsJCS8qIGVyZihuYW4pPW5hbiAqLworCSAgICBpID0gKCh1X2ludDMyX3QpaHg+PjMxKTw8MTsKKwkgICAgcmV0dXJuIChmbG9hdCkoMS1pKStvbmUveDsJLyogZXJmKCstaW5mKT0rLTEgKi8KKwl9CisKKwlpZihpeCA8IDB4M2Y1ODAwMDApIHsJCS8qIHx4fDwwLjg0Mzc1ICovCisJICAgIGlmKGl4IDwgMHgzMTgwMDAwMCkgeyAJLyogfHh8PDIqKi0yOCAqLworCSAgICAgICAgaWYgKGl4IDwgMHgwNDAwMDAwMCkKKwkJICAgIC8qYXZvaWQgdW5kZXJmbG93ICovCisJCSAgICByZXR1cm4gKGZsb2F0KTAuMTI1KigoZmxvYXQpOC4wKngrZWZ4OCp4KTsKKwkJcmV0dXJuIHggKyBlZngqeDsKKwkgICAgfQorCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIHJldHVybiB4ICsgeCp5OworCX0KKwlpZihpeCA8IDB4M2ZhMDAwMDApIHsJCS8qIDAuODQzNzUgPD0gfHh8IDwgMS4yNSAqLworCSAgICBzID0gZmFic2YoeCktb25lOworCSAgICBQID0gcGEwK3MqKHBhMStzKihwYTIrcyoocGEzK3MqKHBhNCtzKihwYTUrcypwYTYpKSkpKTsKKwkgICAgUSA9IG9uZStzKihxYTErcyoocWEyK3MqKHFhMytzKihxYTQrcyoocWE1K3MqcWE2KSkpKSk7CisJICAgIGlmKGh4Pj0wKSByZXR1cm4gZXJ4ICsgUC9ROyBlbHNlIHJldHVybiAtZXJ4IC0gUC9ROworCX0KKwlpZiAoaXggPj0gMHg0MGMwMDAwMCkgewkJLyogaW5mPnx4fD49NiAqLworCSAgICBpZihoeD49MCkgcmV0dXJuIG9uZS10aW55OyBlbHNlIHJldHVybiB0aW55LW9uZTsKKwl9CisJeCA9IGZhYnNmKHgpOworIAlzID0gb25lLyh4KngpOworCWlmKGl4PCAweDQwMzZEQjZFKSB7CS8qIHx4fCA8IDEvMC4zNSAqLworCSAgICBSPXJhMCtzKihyYTErcyoocmEyK3MqKHJhMytzKihyYTQrcyooCisJCQkJcmE1K3MqKHJhNitzKnJhNykpKSkpKTsKKwkgICAgUz1vbmUrcyooc2ExK3MqKHNhMitzKihzYTMrcyooc2E0K3MqKAorCQkJCXNhNStzKihzYTYrcyooc2E3K3Mqc2E4KSkpKSkpKTsKKwl9IGVsc2UgewkvKiB8eHwgPj0gMS8wLjM1ICovCisJICAgIFI9cmIwK3MqKHJiMStzKihyYjIrcyoocmIzK3MqKHJiNCtzKigKKwkJCQlyYjUrcypyYjYpKSkpKTsKKwkgICAgUz1vbmUrcyooc2IxK3MqKHNiMitzKihzYjMrcyooc2I0K3MqKAorCQkJCXNiNStzKihzYjYrcypzYjcpKSkpKSk7CisJfQorCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCVNFVF9GTE9BVF9XT1JEKHosaXgmMHhmZmZmZjAwMCk7CisJciAgPSAgX19pZWVlNzU0X2V4cGYoLXoqei0oZmxvYXQpMC41NjI1KSpfX2llZWU3NTRfZXhwZigoei14KSooeit4KStSL1MpOworCWlmKGh4Pj0wKSByZXR1cm4gb25lLXIveDsgZWxzZSByZXR1cm4gIHIveC1vbmU7Cit9CisKK2Zsb2F0CitlcmZjZihmbG9hdCB4KQoreworCWludDMyX3QgaHgsaXg7CisJZmxvYXQgUixTLFAsUSxzLHkseixyOworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgewkJCS8qIGVyZmMobmFuKT1uYW4gKi8KKwkJCQkJCS8qIGVyZmMoKy1pbmYpPTAsMiAqLworCSAgICByZXR1cm4gKGZsb2F0KSgoKHVfaW50MzJfdCloeD4+MzEpPDwxKStvbmUveDsKKwl9CisKKwlpZihpeCA8IDB4M2Y1ODAwMDApIHsJCS8qIHx4fDwwLjg0Mzc1ICovCisJICAgIGlmKGl4IDwgMHgyMzgwMDAwMCkgIAkvKiB8eHw8MioqLTU2ICovCisJCXJldHVybiBvbmUteDsKKwkgICAgeiA9IHgqeDsKKwkgICAgciA9IHBwMCt6KihwcDEreioocHAyK3oqKHBwMyt6KnBwNCkpKTsKKwkgICAgcyA9IG9uZSt6KihxcTEreioocXEyK3oqKHFxMyt6KihxcTQreipxcTUpKSkpOworCSAgICB5ID0gci9zOworCSAgICBpZihoeCA8IDB4M2U4MDAwMDApIHsgIAkvKiB4PDEvNCAqLworCQlyZXR1cm4gb25lLSh4K3gqeSk7CisJICAgIH0gZWxzZSB7CisJCXIgPSB4Knk7CisJCXIgKz0gKHgtaGFsZik7CisJICAgICAgICByZXR1cm4gaGFsZiAtIHIgOworCSAgICB9CisJfQorCWlmKGl4IDwgMHgzZmEwMDAwMCkgewkJLyogMC44NDM3NSA8PSB8eHwgPCAxLjI1ICovCisJICAgIHMgPSBmYWJzZih4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHsKKwkgICAgICAgIHogID0gb25lLWVyeDsgcmV0dXJuIHogLSBQL1E7CisJICAgIH0gZWxzZSB7CisJCXogPSBlcngrUC9ROyByZXR1cm4gb25lK3o7CisJICAgIH0KKwl9CisJaWYgKGl4IDwgMHg0MWUwMDAwMCkgewkJLyogfHh8PDI4ICovCisJICAgIHggPSBmYWJzZih4KTsKKyAJICAgIHMgPSBvbmUvKHgqeCk7CisJICAgIGlmKGl4PCAweDQwMzZEQjZEKSB7CS8qIHx4fCA8IDEvLjM1IH4gMi44NTcxNDMqLworCSAgICAgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCSAgICB9IGVsc2UgewkJCS8qIHx4fCA+PSAxLy4zNSB+IDIuODU3MTQzICovCisJCWlmKGh4PDAmJml4Pj0weDQwYzAwMDAwKSByZXR1cm4gdHdvLXRpbnk7LyogeCA8IC02ICovCisJICAgICAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwkgICAgfQorCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeixpeCYweGZmZmZmMDAwKTsKKwkgICAgciAgPSAgX19pZWVlNzU0X2V4cGYoLXoqei0oZmxvYXQpMC41NjI1KSoKKwkJCV9faWVlZTc1NF9leHBmKCh6LXgpKih6K3gpK1IvUyk7CisJICAgIGlmKGh4PjApIHJldHVybiByL3g7IGVsc2UgcmV0dXJuIHR3by1yL3g7CisJfSBlbHNlIHsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHRpbnkqdGlueTsgZWxzZSByZXR1cm4gdHdvLXRpbnk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19leHAyLmMgYi9saWJtL3NyYy9zX2V4cDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRlZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19leHAyLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwMi5jLHYgMS4xIDIwMDUvMDQvMDUgMDI6NTc6MTUgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNkZWZpbmUJVEJMQklUUwk4CisjZGVmaW5lCVRCTFNJWkUJKDEgPDwgVEJMQklUUykKKworc3RhdGljIGNvbnN0IGRvdWJsZQorICAgIGh1Z2UgICAgID0gMHgxcDEwMDAsCisgICAgdHdvbTEwMDAgPSAweDFwLTEwMDAsCisgICAgcmVkdXggICAgPSAweDEuOHA1MiAvIFRCTFNJWkUsCisgICAgUDEJICAgICA9IDB4MS42MmU0MmZlZmEzOWVmcC0xLAorICAgIFAyCSAgICAgPSAweDEuZWJmYmRmZjgyYzU3NXAtMywKKyAgICBQMwkgICAgID0gMHgxLmM2YjA4ZDcwNGEwYTZwLTUsCisgICAgUDQJICAgICA9IDB4MS4zYjJhYjg4ZjcwNDAwcC03LAorICAgIFA1CSAgICAgPSAweDEuNWQ4ODAwMzg3NWM3NHAtMTA7CisKK3N0YXRpYyBjb25zdCBkb3VibGUgdGJsW1RCTFNJWkUgKiAyXSA9IHsKKy8qCWV4cDIoeiArIGVwcykJCWVwcwkqLworCTB4MS42YTA5ZTY2N2YzZDVkcC0xLAkgMHgxLjk4ODBwLTQ0LAorCTB4MS42YjA1MmZhNzUxNzQ0cC0xLAkgMHgxLjgwMDBwLTUwLAorCTB4MS42YzAxMjc1MGJkOWZlcC0xLAktMHgxLjg3ODBwLTQ1LAorCTB4MS42Y2ZkY2RkZDQ3NmJmcC0xLAkgMHgxLmVjMDBwLTQ2LAorCTB4MS42ZGZiMjNjNjUxYTI5cC0xLAktMHgxLjgwMDBwLTUwLAorCTB4MS42ZWY5Mjk4NTkzYWUzcC0xLAktMHgxLmMwMDBwLTUyLAorCTB4MS42ZmY3ZGY5NTE5Mzg2cC0xLAktMHgxLmZkODBwLTQ1LAorCTB4MS43MGY3NDY2ZjQyZGEzcC0xLAktMHgxLmM4ODBwLTQ1LAorCTB4MS43MWY3NWU4ZWM1ZmMzcC0xLAkgMHgxLjNjMDBwLTQ2LAorCTB4MS43MmY4Mjg2ZWFjZjA1cC0xLAktMHgxLjgzMDBwLTQ0LAorCTB4MS43M2Y5YTQ4YTU4MTUycC0xLAktMHgxLjBjMDBwLTQ3LAorCTB4MS43NGZiZDM1ZDdjY2ZjcC0xLAkgMHgxLmY4ODBwLTQ1LAorCTB4MS43NWZlYjU2NDI2N2YxcC0xLAkgMHgxLjNlMDBwLTQ3LAorCTB4MS43NzAyNGIxYWI2ZDQ4cC0xLAktMHgxLjdkMDBwLTQ1LAorCTB4MS43ODA2OTRmZGU1ZDM4cC0xLAktMHgxLmQwMDBwLTUwLAorCTB4MS43OTBiOTM4YWMxZDAwcC0xLAkgMHgxLjMwMDBwLTQ5LAorCTB4MS43YTExNDczZWIwMTc4cC0xLAktMHgxLmQwMDBwLTQ5LAorCTB4MS43YjE3YjA5NzZkMDYwcC0xLAkgMHgxLjA0MDBwLTQ1LAorCTB4MS43YzFlZDAxMzBjMTMzcC0xLAkgMHgxLjAwMDBwLTUzLAorCTB4MS43ZDI2YTYyZmY4NjM2cC0xLAktMHgxLjY5MDBwLTQ1LAorCTB4MS43ZTJmMzM2Y2Y0ZTNicC0xLAktMHgxLjJlMDBwLTQ3LAorCTB4MS43ZjM4Nzg0OTFjM2U4cC0xLAktMHgxLjQ1ODBwLTQ1LAorCTB4MS44MDQyNzU0M2UxYjRlcC0xLAkgMHgxLjMwMDBwLTQ0LAorCTB4MS44MTRkMmFkZDEwNzFhcC0xLAkgMHgxLmYwMDBwLTQ3LAorCTB4MS44MjU4OTk5NGNjZDdlcC0xLAktMHgxLjFjMDBwLTQ1LAorCTB4MS44MzY0YzFlYjk0MmQwcC0xLAkgMHgxLjlkMDBwLTQ1LAorCTB4MS44NDcxYTQ2MjNjYWI1cC0xLAkgMHgxLjcxMDBwLTQzLAorCTB4MS44NTdmNDE3OWY1YmJjcC0xLAkgMHgxLjI2MDBwLTQ1LAorCTB4MS44NjhkOTliNDQ5MWFmcC0xLAktMHgxLjJjNDBwLTQ0LAorCTB4MS44NzljYWQ5MzFhMzk1cC0xLAktMHgxLjMwMDBwLTQ1LAorCTB4MS44OGFjN2Q5OGE2NWI4cC0xLAktMHgxLmE4MDBwLTQ1LAorCTB4MS44OWJkMGE0Nzg1ODAwcC0xLAktMHgxLmQwMDBwLTQ5LAorCTB4MS44YWNlNTQyMmFhMjIzcC0xLAkgMHgxLjMyODBwLTQ0LAorCTB4MS44YmUwNWJhZDYxOWZhcC0xLAkgMHgxLjJiNDBwLTQzLAorCTB4MS44Y2YzMjE2YjU0MzgzcC0xLAktMHgxLmVkMDBwLTQ1LAorCTB4MS44ZTA2YTVlMDg2NjRjcC0xLAktMHgxLjA1MDBwLTQ1LAorCTB4MS44ZjFhZTk5MTU3ODA3cC0xLAkgMHgxLjgyODBwLTQ1LAorCTB4MS45MDJmZWQwMjgyYzBlcC0xLAktMHgxLmNiMDBwLTQ2LAorCTB4MS45MTQ1YjBiOTFmZjk2cC0xLAktMHgxLjVlMDBwLTQ3LAorCTB4MS45MjVjMzUzYWEyZmY5cC0xLAkgMHgxLjU0MDBwLTQ4LAorCTB4MS45MzczN2IwY2RjNjRhcC0xLAkgMHgxLjcyMDBwLTQ2LAorCTB4MS45NDhiODJiNWY5OGFlcC0xLAktMHgxLjkwMDBwLTQ3LAorCTB4MS45NWE0NGNiYzg1MmNicC0xLAkgMHgxLjU2ODBwLTQ1LAorCTB4MS45NmJkZDlhNzY2ZjIxcC0xLAktMHgxLjZkMDBwLTQ0LAorCTB4MS45N2Q4MjlmZGU0ZTJhcC0xLAktMHgxLjEwMDBwLTQ3LAorCTB4MS45OGYzM2U0N2EyM2EzcC0xLAkgMHgxLmQwMDBwLTQ1LAorCTB4MS45YTBmMTcwY2EwNjA0cC0xLAktMHgxLjhhNDBwLTQ0LAorCTB4MS45YjJiYjRkNTNmZjg5cC0xLAkgMHgxLjU1YzBwLTQ0LAorCTB4MS45YzQ5MTgyYTNmMTVicC0xLAkgMHgxLjZiODBwLTQ1LAorCTB4MS45ZDY3NDE5NGJiOGM1cC0xLAktMHgxLmMwMDBwLTQ5LAorCTB4MS45ZTg2MzE5ZTMyMzhlcC0xLAkgMHgxLjdkMDBwLTQ2LAorCTB4MS45ZmE1ZThkMDdmMzAycC0xLAkgMHgxLjY0MDBwLTQ2LAorCTB4MS5hMGM2NjdiNWRlNTRkcC0xLAktMHgxLjUwMDBwLTQ4LAorCTB4MS5hMWU3YWVkOGViOGY2cC0xLAkgMHgxLjllMDBwLTQ3LAorCTB4MS5hMzA5YmVjNGEyZTI3cC0xLAkgMHgxLmFkODBwLTQ1LAorCTB4MS5hNDJjOTgwNDYwYTVkcC0xLAktMHgxLmFmMDBwLTQ2LAorCTB4MS5hNTUwM2IyM2UyNTlicC0xLAkgMHgxLmI2MDBwLTQ3LAorCTB4MS5hNjc0YThhZjQ2MjEzcC0xLAkgMHgxLjg4ODBwLTQ0LAorCTB4MS5hNzk5ZTEzMzBiM2E3cC0xLAkgMHgxLjEyMDBwLTQ2LAorCTB4MS5hOGJmZTUzYzEyZThkcC0xLAkgMHgxLjZjMDBwLTQ3LAorCTB4MS5hOWU2YjU1NzlmY2QycC0xLAktMHgxLjliODBwLTQ1LAorCTB4MS5hYjBlNTIxMzU2ZmI4cC0xLAkgMHgxLmI3MDBwLTQ1LAorCTB4MS5hYzM2YmJmZDNmMzgxcC0xLAkgMHgxLjkwMDBwLTUwLAorCTB4MS5hZDVmZjNhM2MyNzgwcC0xLAkgMHgxLjQwMDBwLTQ5LAorCTB4MS5hZTg5Zjk5NWFkMmEzcC0xLAktMHgxLmM5MDBwLTQ1LAorCTB4MS5hZmI0Y2U2MjJmMzY3cC0xLAkgMHgxLjY1MDBwLTQ2LAorCTB4MS5iMGUwNzI5OGRiNzkwcC0xLAkgMHgxLmZkNDBwLTQ1LAorCTB4MS5iMjBjZTZjOWE4OWE5cC0xLAkgMHgxLjI3MDBwLTQ2LAorCTB4MS5iMzNhMmI4NGYxYTRicC0xLAkgMHgxLmQ0NzBwLTQzLAorCTB4MS5iNDY4NDE1Yjc0N2U3cC0xLAktMHgxLjgzODBwLTQ0LAorCTB4MS5iNTk3MjhkZTU1OTNhcC0xLAkgMHgxLjgwMDBwLTU0LAorCTB4MS5iNmM2ZTI5ZjFjNTZhcC0xLAkgMHgxLmFkMDBwLTQ3LAorCTB4MS5iN2Y3NmYyZmI1ZTUwcC0xLAkgMHgxLmU4MDBwLTUwLAorCTB4MS5iOTI4Y2YyMjc0OWIycC0xLAktMHgxLjRjMDBwLTQ3LAorCTB4MS5iYTViMDMwYTEwNjAzcC0xLAktMHgxLmQ3MDBwLTQ3LAorCTB4MS5iYjhlMGI3OWE2ZjY2cC0xLAkgMHgxLmQ5MDBwLTQ3LAorCTB4MS5iY2MxZTkwNGJjMWZmcC0xLAkgMHgxLjJhMDBwLTQ3LAorCTB4MS5iZGY2OWMzZjNhMTZmcC0xLAktMHgxLmY3ODBwLTQ2LAorCTB4MS5iZjJjMjViZDcxZGI4cC0xLAktMHgxLjBhMDBwLTQ2LAorCTB4MS5jMDYyODYxNDFiMmU5cC0xLAktMHgxLjE0MDBwLTQ2LAorCTB4MS5jMTk5YmRkODU1MmUwcC0xLAkgMHgxLmJlMDBwLTQ3LAorCTB4MS5jMmQxY2Q5ZmE2NGVlcC0xLAktMHgxLjk0MDBwLTQ3LAorCTB4MS5jNDBhYjVmZmZkMDJmcC0xLAktMHgxLmVkMDBwLTQ3LAorCTB4MS5jNTQ0Nzc4ZmFmZDE1cC0xLAkgMHgxLjk2NjBwLTQ0LAorCTB4MS5jNjdmMTJlNTdkMGNicC0xLAktMHgxLmExMDBwLTQ2LAorCTB4MS5jN2JhODg5ODhjMWI2cC0xLAktMHgxLjg0NThwLTQyLAorCTB4MS5jOGY2ZDk0MDZlNzMzcC0xLAktMHgxLmE0ODBwLTQ2LAorCTB4MS5jYTM0MDU3NTFjNGRmcC0xLAkgMHgxLmIwMDBwLTUxLAorCTB4MS5jYjcyMGRjZWY5MDk0cC0xLAkgMHgxLjE0MDBwLTQ3LAorCTB4MS5jY2IwZjJlNmQxNjg5cC0xLAkgMHgxLjAyMDBwLTQ4LAorCTB4MS5jZGYwYjU1NWRjNDEycC0xLAkgMHgxLjM2MDBwLTQ4LAorCTB4MS5jZjMxNTViNWJhYjNicC0xLAktMHgxLjY5MDBwLTQ3LAorCTB4MS5kMDcyZDRhMDc4OWJjcC0xLAkgMHgxLjlhMDBwLTQ3LAorCTB4MS5kMWI1MzJiMDhjOGZhcC0xLAktMHgxLjVlMDBwLTQ2LAorCTB4MS5kMmY4NzA4MGQ4YTg1cC0xLAkgMHgxLmQyODBwLTQ2LAorCTB4MS5kNDNjOGVhY2FhMjAzcC0xLAkgMHgxLjFhMDBwLTQ3LAorCTB4MS5kNTgxOGRjZmJhNDkxcC0xLAkgMHgxLmYwMDBwLTUwLAorCTB4MS5kNmM3NmU4NjJlNmExcC0xLAktMHgxLjNhMDBwLTQ3LAorCTB4MS5kODBlMzE2Yzk4MzRlcC0xLAktMHgxLmNkODBwLTQ3LAorCTB4MS5kOTU1ZDcxZmY2MDkwcC0xLAkgMHgxLjRjMDBwLTQ4LAorCTB4MS5kYTllNjAzZGIzMmFlcC0xLAkgMHgxLmY5MDBwLTQ4LAorCTB4MS5kYmU3Y2Q2M2E4MzI1cC0xLAkgMHgxLjk4MDBwLTQ5LAorCTB4MS5kZDMyMWYzMDFiNDQ1cC0xLAktMHgxLjUyMDBwLTQ4LAorCTB4MS5kZTdkNTY0MWMwNWJmcC0xLAktMHgxLmQ3MDBwLTQ2LAorCTB4MS5kZmM5NzMzN2I5YWVjcC0xLAktMHgxLjYxNDBwLTQ2LAorCTB4MS5lMTE2NzZiMTk3ZDVlcC0xLAkgMHgxLmI0ODBwLTQ3LAorCTB4MS5lMjY0NjE0ZjVhM2U3cC0xLAkgMHgxLjBjZTBwLTQzLAorCTB4MS5lM2IzMzNiMTZlZTVjcC0xLAkgMHgxLmM2ODBwLTQ3LAorCTB4MS5lNTAyZWU3OGIzZmI0cC0xLAktMHgxLjkzMDBwLTQ3LAorCTB4MS5lNjUzOTI0Njc2ZDY4cC0xLAktMHgxLjUwMDBwLTQ5LAorCTB4MS5lN2E1MWZiYzc0YzQ0cC0xLAktMHgxLjdmODBwLTQ3LAorCTB4MS5lOGY3OTc3Y2RiNzI2cC0xLAktMHgxLjM3MDBwLTQ4LAorCTB4MS5lYTRhZmEyYTQ5MGU4cC0xLAkgMHgxLjVkMDBwLTQ5LAorCTB4MS5lYjlmNDg2N2NjYWU0cC0xLAkgMHgxLjYxYTBwLTQ2LAorCTB4MS5lY2Y0ODJkOGU2ODBkcC0xLAkgMHgxLjU1MDBwLTQ4LAorCTB4MS5lZTRhYWEyMTg4NTE0cC0xLAkgMHgxLjY0MDBwLTUxLAorCTB4MS5lZmExYmVlNjE1YTEzcC0xLAktMHgxLmU4MDBwLTQ5LAorCTB4MS5mMGY5YzFjYjY0MTA2cC0xLAktMHgxLmE4ODBwLTQ4LAorCTB4MS5mMjUyYjM3NmJiOTYzcC0xLAktMHgxLmM5MDBwLTQ1LAorCTB4MS5mM2FjOTQ4ZGQ3Mjc1cC0xLAkgMHgxLmEwMDBwLTUzLAorCTB4MS5mNTA3NjViNmU0NTI0cC0xLAktMHgxLjRmMDBwLTQ4LAorCTB4MS5mNjYzMjc5ODg0NGZkcC0xLAkgMHgxLmE4MDBwLTUxLAorCTB4MS5mN2JmZGFkOWNiZTM4cC0xLAkgMHgxLmFiYzBwLTQ4LAorCTB4MS5mOTFkODAyMjQzYzgycC0xLAktMHgxLjQ2MDBwLTUwLAorCTB4MS5mYTdjMTgxOWU5MDhlcC0xLAktMHgxLmIwYzBwLTQ3LAorCTB4MS5mYmRiYTM2OTJkNTExcC0xLAktMHgxLjBlMDBwLTUxLAorCTB4MS5mZDNjMjJiOGY3MTk0cC0xLAktMHgxLjBkZThwLTQ2LAorCTB4MS5mZTlkOTZiMmEyM2VlcC0xLAkgMHgxLmU0MzBwLTQ5LAorCTB4MS4wMDAwMDAwMDAwMDAwcCswLAkgMHgwLjAwMDBwKzAsCisJMHgxLjAwYjFhZmE1YWJjYmVwKzAsCS0weDEuMzQwMHAtNTIsCisJMHgxLjAxNjNkYTlmYjMzMDNwKzAsCS0weDEuMjE3MHAtNDYsCisJMHgxLjAyMTY4MTQzYjAyODJwKzAsCSAweDEuYTQwMHAtNTIsCisJMHgxLjAyYzlhM2U3NzgwNmNwKzAsCSAweDEuZjk4MHAtNDksCisJMHgxLjAzN2Q0MmUxMWJiY2FwKzAsCS0weDEuNzQwMHAtNTEsCisJMHgxLjA0MzE1ZTg2ZTdmODlwKzAsCSAweDEuODMwMHAtNTAsCisJMHgxLjA0ZTVmNzJmNjU0NjdwKzAsCS0weDEuYTNmMHAtNDYsCisJMHgxLjA1OWIwZDMxNTg1NWFwKzAsCS0weDEuMjg0MHAtNDcsCisJMHgxLjA2NTBhMGUzYzFmOTVwKzAsCSAweDEuMTYwMHAtNDgsCisJMHgxLjA3MDZiMjlkZGY3MWFwKzAsCSAweDEuNTI0MHAtNDYsCisJMHgxLjA3YmQ0MmI3MmE4MmRwKzAsCS0weDEuOWEwMHAtNDksCisJMHgxLjA4NzQ1MTg3NTliZDBwKzAsCSAweDEuNjQwMHAtNDksCisJMHgxLjA5MmJkZjY2NjA3YzhwKzAsCS0weDEuMDc4MHAtNDcsCisJMHgxLjA5ZTNlY2FjNmYzODNwKzAsCS0weDEuODAwMHAtNTQsCisJMHgxLjBhOWM3OWIxZjM5MzBwKzAsCSAweDEuZmEwMHAtNDgsCisJMHgxLjBiNTU4NmNmOTg4ZmNwKzAsCS0weDEuYWM4MHAtNDgsCisJMHgxLjBjMGYxNDVlNDZjOGFwKzAsCSAweDEuOWMwMHAtNTAsCisJMHgxLjBjYzkyMmI3MjQ4MTZwKzAsCSAweDEuNTIwMHAtNDcsCisJMHgxLjBkODNiMjMzOTVkZDhwKzAsCS0weDEuYWQwMHAtNDgsCisJMHgxLjBlM2VjMzJkM2QxZjNwKzAsCSAweDEuYmFjMHAtNDYsCisJMHgxLjBlZmE1NWZkZmE5YTZwKzAsCS0weDEuNGU4MHAtNDcsCisJMHgxLjBmYjY2YWZmZWQyZjBwKzAsCS0weDEuZDMwMHAtNDcsCisJMHgxLjEwNzMwMjhkNzIzNGJwKzAsCSAweDEuMTUwMHAtNDgsCisJMHgxLjExMzAxZDAxMjViNWJwKzAsCSAweDEuYzAwMHAtNDksCisJMHgxLjExZWRiYWI1ZTJhZjlwKzAsCSAweDEuNmJjMHAtNDYsCisJMHgxLjEyYWJkYzA2YzMxZDVwKzAsCSAweDEuODQwMHAtNDksCisJMHgxLjEzNmE4MTRmMjA0N2RwKzAsCS0weDEuZWQwMHAtNDcsCisJMHgxLjE0MjlhYWVhOTJkZTlwKzAsCSAweDEuOGUwMHAtNDksCisJMHgxLjE0ZTk1OTM0ZjMxMzhwKzAsCSAweDEuYjQwMHAtNDksCisJMHgxLjE1YTk4YzhhNThlNzFwKzAsCSAweDEuNTMwMHAtNDcsCisJMHgxLjE2NmE0NTQ3MWMzZGZwKzAsCSAweDEuMzM4MHAtNDcsCisJMHgxLjE3MmI4M2M3ZDUyMTFwKzAsCSAweDEuOGQ0MHAtNDUsCisJMHgxLjE3ZWQ0ODY5NWJiOWZwKzAsCS0weDEuNWQwMHAtNDcsCisJMHgxLjE4YWY5Mzg4YzhkOTNwKzAsCS0weDEuYzg4MHAtNDYsCisJMHgxLjE5NzI2NTgzNzVkNjZwKzAsCSAweDEuMWYwMHAtNDYsCisJMHgxLjFhMzViZWI2ZmNiYTdwKzAsCSAweDEuMDQ4MHAtNDYsCisJMHgxLjFhZjk5ZjgxMzg3ZTNwKzAsCS0weDEuNzM5MHAtNDMsCisJMHgxLjFiYmUwODQwNDVkNTRwKzAsCSAweDEuNGU0MHAtNDUsCisJMHgxLjFjODJmOTUyODFjNDNwKzAsCS0weDEuYTIwMHAtNDcsCisJMHgxLjFkNDg3MzE2OGI5YjJwKzAsCSAweDEuMzgwMHAtNDksCisJMHgxLjFlMGU3NWViNDQwMzFwKzAsCSAweDEuYWMwMHAtNDksCisJMHgxLjFlZDUwMjJmY2Q5MzhwKzAsCSAweDEuMTkwMHAtNDcsCisJMHgxLjFmOWMxODQzOGNkZjdwKzAsCS0weDEuYjc4MHAtNDYsCisJMHgxLjIwNjNiODg2MjhkOGZwKzAsCSAweDEuZDk0MHAtNDUsCisJMHgxLjIxMmJlMzU3OGE4MWVwKzAsCSAweDEuODAwMHAtNTAsCisJMHgxLjIxZjQ5OTE3ZGRkNDFwKzAsCSAweDEuYjM0MHAtNDUsCisJMHgxLjIyYmRkYTI3OTEzMjNwKzAsCSAweDEuOWY4MHAtNDYsCisJMHgxLjIzODdhNmU3NTYxZTdwKzAsCS0weDEuOWM4MHAtNDYsCisJMHgxLjI0NTFmZmI4MjE0MjdwKzAsCSAweDEuMjMwMHAtNDcsCisJMHgxLjI1MWNlNGZiMmE2MDJwKzAsCS0weDEuMzQ4MHAtNDYsCisJMHgxLjI1ZTg1NzExZWNlYjBwKzAsCSAweDEuMjcwMHAtNDYsCisJMHgxLjI2YjQ1NjVlMjdkMTZwKzAsCSAweDEuMWQwMHAtNDYsCisJMHgxLjI3ODBlMzQxZGUwMGZwKzAsCSAweDEuMWVlMHAtNDQsCisJMHgxLjI4NGRmZTFmNTYzM2VwKzAsCS0weDEuNGMwMHAtNDYsCisJMHgxLjI5MWJhNzU5MWJiMzBwKzAsCS0weDEuM2Q4MHAtNDYsCisJMHgxLjI5ZTlkZjUxZmRmMDlwKzAsCSAweDEuOGIwMHAtNDcsCisJMHgxLjJhYjhhNjZkMTBlOWJwKzAsCS0weDEuMjdjMHAtNDUsCisJMHgxLjJiODdmZDBkYWRhM2FwKzAsCSAweDEuYTM0MHAtNDUsCisJMHgxLjJjNTdlMzk3NzFhZjlwKzAsCS0weDEuMDgwMHAtNDYsCisJMHgxLjJkMjg1YTZlNDAyZDlwKzAsCS0weDEuZWQwMHAtNDcsCisJMHgxLjJkZjk2MWY2NDE1NzlwKzAsCS0weDEuNDIwMHAtNDgsCisJMHgxLjJlY2FmYTkzZTJlY2ZwKzAsCS0weDEuNDk4MHAtNDUsCisJMHgxLjJmOWQyNGFiZDg4MjJwKzAsCS0weDEuNjMwMHAtNDYsCisJMHgxLjMwNmZlMGEzMWI2MjVwKzAsCS0weDEuMjM2MHAtNDQsCisJMHgxLjMxNDMyZWRlZWE1MGJwKzAsCS0weDEuMGRmOHAtNDAsCisJMHgxLjMyMTcwZmM0Y2Q3YjhwKzAsCS0weDEuMjQ4MHAtNDUsCisJMHgxLjMyZWI4M2JhOGU5YTJwKzAsCS0weDEuNTk4MHAtNDUsCisJMHgxLjMzYzA4YjI2NDE3NjZwKzAsCSAweDEuZWQwMHAtNDYsCisJMHgxLjM0OTYyNjZlM2ZhMjdwKzAsCS0weDEuYzAwMHAtNTAsCisJMHgxLjM1NmM1NWY5MjlmMGZwKzAsCS0weDEuMGQ4MHAtNDQsCisJMHgxLjM2NDMxYTJkZTg4YjlwKzAsCSAweDEuMmM4MHAtNDUsCisJMHgxLjM3MWE3MzczYWFhMzlwKzAsCSAweDEuMDYwMHAtNDUsCisJMHgxLjM3ZjI2MjMxZTc0ZmVwKzAsCS0weDEuNjYwMHAtNDYsCisJMHgxLjM4Y2FlNmQwNWQ4MzhwKzAsCS0weDEuYWUwMHAtNDcsCisJMHgxLjM5YTQwMWI3MTNlYzNwKzAsCS0weDEuNDcyMHAtNDMsCisJMHgxLjNhN2RiMzRlNWEwMjBwKzAsCSAweDEuODIwMHAtNDcsCisJMHgxLjNiNTdmYmZlYzZlOTVwKzAsCSAweDEuZTgwMHAtNDQsCisJMHgxLjNjMzJkYzMxM2E4ZjJwKzAsCSAweDEuZjgwMHAtNDksCisJMHgxLjNkMGU1NDRlZGUxMjJwKzAsCS0weDEuN2EwMHAtNDYsCisJMHgxLjNkZWE2NGMxMjM0YmJwKzAsCSAweDEuNjMwMHAtNDUsCisJMHgxLjNlYzcwZGYxYzRlY2NwKzAsCS0weDEuOGE2MHAtNDMsCisJMHgxLjNmYTQ1MDRhYzdlOGNwKzAsCS0weDEuY2RjMHAtNDQsCisJMHgxLjQwODIyYzM2N2EwYmJwKzAsCSAweDEuNWI4MHAtNDUsCisJMHgxLjQxNjBhMjFmNzJlOTVwKzAsCSAweDEuZWMwMHAtNDYsCisJMHgxLjQyM2ZiMjcwOTQ2NDZwKzAsCS0weDEuMzYwMHAtNDYsCisJMHgxLjQzMWY1ZDk1MGE5MjBwKzAsCSAweDEuMzk4MHAtNDUsCisJMHgxLjQzZmZhM2Y4NGI5ZWJwKzAsCSAweDEuYTAwMHAtNDgsCisJMHgxLjQ0ZTA4NjA2MTg5MTlwKzAsCS0weDEuNmMwMHAtNDgsCisJMHgxLjQ1YzIwNDJhN2QyMDFwKzAsCS0weDEuYmMwMHAtNDcsCisJMHgxLjQ2YTQxZWQxZDAwMTZwKzAsCS0weDEuMjgwMHAtNDYsCisJMHgxLjQ3ODZkNjY4YjMzMjZwKzAsCSAweDEuMGUwMHAtNDQsCisJMHgxLjQ4NmEyYjVjMTNjMDBwKzAsCS0weDEuZDQwMHAtNDUsCisJMHgxLjQ5NGUxZTE5MmFmMDRwKzAsCSAweDEuYzIwMHAtNDcsCisJMHgxLjRhMzJhZjBkN2QzNzJwKzAsCS0weDEuZTUwMHAtNDYsCisJMHgxLjRiMTdkZWE2ZGI4MDFwKzAsCSAweDEuNzgwMHAtNDcsCisJMHgxLjRiZmRhZDUzNjI5ZTFwKzAsCS0weDEuMzgwMHAtNDYsCisJMHgxLjRjZTQxYjgxN2MxMzJwKzAsCSAweDEuMDgwMHAtNDcsCisJMHgxLjRkY2IyOTlmZGRkZGJwKzAsCSAweDEuYzcwMHAtNDUsCisJMHgxLjRlYjJkODFkOGFiOTZwKzAsCS0weDEuY2UwMHAtNDYsCisJMHgxLjRmOWIyNzY5ZDJkMDJwKzAsCSAweDEuOTIwMHAtNDYsCisJMHgxLjUwODQxN2Y0NTMxYzFwKzAsCS0weDEuOGMwMHAtNDcsCisJMHgxLjUxNmRhYTJjZjY2MmFwKzAsCS0weDEuYTAwMHAtNDgsCisJMHgxLjUyNTdkZTgzZjUxZWFwKzAsCSAweDEuYTA4MHAtNDMsCisJMHgxLjUzNDJiNTY5ZDRlZGFwKzAsCS0weDEuNmQ4MHAtNDUsCisJMHgxLjU0MmUyZjRmNmFjMWFwKzAsCS0weDEuMjQ0MHAtNDQsCisJMHgxLjU1MWE0Y2E1ZDk0ZGJwKzAsCSAweDEuODNjMHAtNDMsCisJMHgxLjU2MDcwZGRlOTExNmJwKzAsCSAweDEuNGIwMHAtNDUsCisJMHgxLjU2ZjQ3MzZiNTI5ZGVwKzAsCSAweDEuMTVhMHAtNDMsCisJMHgxLjU3ZTI3ZGJlMmM0MGVwKzAsCS0weDEuOWUwMHAtNDUsCisJMHgxLjU4ZDEyZDQ5N2M3NmZwKzAsCS0weDEuMzA4MHAtNDUsCisJMHgxLjU5YzA4MjdmZjBiNGNwKzAsCSAweDEuZGVjMHAtNDMsCisJMHgxLjVhYjA3ZGQ0ODU0MjdwKzAsCS0weDEuNDAwMHAtNTEsCisJMHgxLjViYTExZmJhODdhZjRwKzAsCSAweDEuMDA4MHAtNDQsCisJMHgxLjVjOTI2OGE1OTQ2MGJwKzAsCS0weDEuNmM4MHAtNDUsCisJMHgxLjVkODQ1OTA5OThlM2ZwKzAsCSAweDEuNjlhMHAtNDMsCisJMHgxLjVlNzZmMTVhZDIwZTFwKzAsCS0weDEuYjQwMHAtNDYsCisJMHgxLjVmNmEzMjBkY2ViY2FwKzAsCSAweDEuNzcwMHAtNDYsCisJMHgxLjYwNWUxYjk3NmRjYjhwKzAsCSAweDEuNmY4MHAtNDUsCisJMHgxLjYxNTJhZTZjZGY3MTVwKzAsCSAweDEuMTAwMHAtNDcsCisJMHgxLjYyNDdlYjAzYTU1MzFwKzAsCS0weDEuNWQwMHAtNDYsCisJMHgxLjYzM2RkMWQxOTI5YjVwKzAsCS0weDEuMmQwMHAtNDYsCisJMHgxLjY0MzQ2MzRjY2MzMTNwKzAsCS0weDEuYTgwMHAtNDksCisJMHgxLjY1MmI5ZmViYzhlZmFwKzAsCS0weDEuODYwMHAtNDUsCisJMHgxLjY2MjM4ODI1NTMzOTdwKzAsCSAweDEuMWZlMHAtNDAsCisJMHgxLjY3MWMxYzcwODMyOGVwKzAsCS0weDEuNzIwMHAtNDQsCisJMHgxLjY4MTU1ZDQ0Y2E5N2VwKzAsCSAweDEuNjgwMHAtNDksCisJMHgxLjY5MGY0YjE5ZTk0NzFwKzAsCS0weDEuOTc4MHAtNDUsCit9OworCisvKgorICogZXhwMih4KTogY29tcHV0ZSB0aGUgYmFzZSAyIGV4cG9uZW50aWFsIG9mIHgKKyAqCisgKiBBY2N1cmFjeTogUGVhayBlcnJvciA8IDAuNTAzIHVscCBmb3Igbm9ybWFsaXplZCByZXN1bHRzLgorICoKKyAqIE1ldGhvZDogKGFjY3VyYXRlIHRhYmxlcykKKyAqCisgKiAgIFJlZHVjZSB4OgorICogICAgIHggPSAyKiprICsgeSwgZm9yIGludGVnZXIgayBhbmQgfHl8IDw9IDEvMi4KKyAqICAgICBUaHVzIHdlIGhhdmUgZXhwMih4KSA9IDIqKmsgKiBleHAyKHkpLgorICoKKyAqICAgUmVkdWNlIHk6CisgKiAgICAgeSA9IGkvVEJMU0laRSArIHogLSBlcHNbaV0gZm9yIGludGVnZXIgaSBuZWFyIHkgKiBUQkxTSVpFLgorICogICAgIFRodXMgd2UgaGF2ZSBleHAyKHkpID0gZXhwMihpL1RCTFNJWkUpICogZXhwMih6IC0gZXBzW2ldKSwKKyAqICAgICB3aXRoIHx6IC0gZXBzW2ldfCA8PSAyKiotOSArIDIqKi0zOSBmb3IgdGhlIHRhYmxlIHVzZWQuCisgKgorICogICBXZSBjb21wdXRlIGV4cDIoaS9UQkxTSVpFKSB2aWEgdGFibGUgbG9va3VwIGFuZCBleHAyKHogLSBlcHNbaV0pIHZpYQorICogICBhIGRlZ3JlZS01IG1pbmltYXggcG9seW5vbWlhbCB3aXRoIG1heGltdW0gZXJyb3IgdW5kZXIgMS4zICogMioqLTYxLgorICogICBUaGUgdmFsdWVzIGluIGV4cDJ0W10gYW5kIGVwc1tdIGFyZSBjaG9zZW4gc3VjaCB0aGF0CisgKiAgIGV4cDJ0W2ldID0gZXhwMihpL1RCTFNJWkUgKyBlcHNbaV0pLCBhbmQgZXBzW2ldIGlzIGEgc21hbGwgb2Zmc2V0IHN1Y2gKKyAqICAgdGhhdCBleHAydFtpXSBpcyBhY2N1cmF0ZSB0byAyKiotNjQuCisgKgorICogICBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIGkgaXMgKy1UQkxTSVpFLzIsIHNvIHdlIGFjdHVhbGx5IGluZGV4IHRoZSB0YWJsZXMKKyAqICAgYnkgaTAgPSBpICsgVEJMU0laRS8yLiAgRm9yIGNhY2hlIGVmZmljaWVuY3ksIGV4cDJ0W10gYW5kIGVwc1tdIGFyZQorICogICB2aXJ0dWFsIHRhYmxlcywgaW50ZXJsZWF2ZWQgaW4gdGhlIHJlYWwgdGFibGUgdGJsW10uCisgKgorICogICBUaGlzIG1ldGhvZCBpcyBkdWUgdG8gR2FsLCB3aXRoIG1hbnkgZGV0YWlscyBkdWUgdG8gR2FsIGFuZCBCYWNoZWxpczoKKyAqCisgKglHYWwsIFMuIGFuZCBCYWNoZWxpcywgQi4gIEFuIEFjY3VyYXRlIEVsZW1lbnRhcnkgTWF0aGVtYXRpY2FsIExpYnJhcnkKKyAqCWZvciB0aGUgSUVFRSBGbG9hdGluZyBQb2ludCBTdGFuZGFyZC4gIFRPTVMgMTcoMSksIDI2LTQ2ICgxOTkxKS4KKyAqLworZG91YmxlCitleHAyKGRvdWJsZSB4KQoreworCWRvdWJsZSByLCB0LCB6OworCXVpbnQzMl90IGh4LCBociwgaXgsIGx4LCBpMDsKKwlpbnQgazsKKworCS8qIEZpbHRlciBvdXQgZXhjZXB0aW9uYWwgY2FzZXMuICovCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKwlpZihpeCA+PSAweDQwOTAwMDAwKSB7CQkJLyogfHh8ID49IDEwMjQgKi8KKwkJaWYoaXggPj0gMHg3ZmYwMDAwMCkgeworCQkJR0VUX0xPV19XT1JEKGx4LHgpOworCQkJaWYoKChpeCAmIDB4ZmZmZmYpIHwgbHgpICE9IDAgfHwgKGh4ICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOyAJLyogeCBpcyBOYU4gb3IgK0luZiAqLworCQkJZWxzZSAKKwkJCQlyZXR1cm4gKDAuMCk7CS8qIHggaXMgLUluZiAqLworCQl9CisJCWlmKHggPj0gMHgxLjBwMTApCisJCQlyZXR1cm4gKGh1Z2UgKiBodWdlKTsgLyogb3ZlcmZsb3cgKi8KKwkJaWYoeCA8PSAtMHgxLjBjY3AxMCkKKwkJCXJldHVybiAodHdvbTEwMDAgKiB0d29tMTAwMCk7IC8qIHVuZGVyZmxvdyAqLworCX0gZWxzZSBpZiAoaXggPCAweDNjOTAwMDAwKSB7CQkvKiB8eHwgPCAweDFwLTU0ICovCisJCXJldHVybiAoMS4wICsgeCk7CisJfQorCisJLyogUmVkdWNlIHgsIGNvbXB1dGluZyB6LCBpMCwgYW5kIGsuICovCisJdCA9IHggKyByZWR1eDsKKwlHRVRfTE9XX1dPUkQoaTAsIHQpOworCWkwICs9IFRCTFNJWkUgLyAyOworCWsgPSAoaTAgPj4gVEJMQklUUykgPDwgMjA7CisJaTAgPSAoaTAgJiAoVEJMU0laRSAtIDEpKSA8PCAxOworCXQgLT0gcmVkdXg7CisJeiA9IHggLSB0OworCisJLyogQ29tcHV0ZSByID0gZXhwMih5KSA9IGV4cDJ0W2kwXSAqIHAoeiAtIGVwc1tpXSkuICovCisJdCA9IHRibFtpMF07CQkvKiBleHAydFtpMF0gKi8KKwl6IC09IHRibFtpMCArIDFdOwkvKiBlcHNbaTBdICAgKi8KKwlyID0gdCArIHQgKiB6ICogKFAxICsgeiAqIChQMiArIHogKiAoUDMgKyB6ICogKFA0ICsgeiAqIFA1KSkpKTsKKworCS8qIFNjYWxlIGJ5IDIqKihrPj4yMCkuICovCisJaWYoayA+PSAtMTAyMSA8PCAyMCkgeworCQlpZiAoayAhPSAwKSB7CisJCQlHRVRfSElHSF9XT1JEKGhyLCByKTsKKwkJCVNFVF9ISUdIX1dPUkQociwgaHIgKyBrKTsKKwkJfQorCQlyZXR1cm4gKHIpOworCX0gZWxzZSB7CisJCUdFVF9ISUdIX1dPUkQoaHIsIHIpOworCQlTRVRfSElHSF9XT1JEKHIsIGhyICsgKGsgKyAoMTAwMCA8PCAyMCkpKTsKKwkJcmV0dXJuIChyICogdHdvbTEwMDApOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZXhwMmYuYyBiL2xpYm0vc3JjL3NfZXhwMmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk4ZThhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19leHAyZi5jCkBAIC0wLDAgKzEsMTQxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2V4cDJmLmMsdiAxLjEgMjAwNS8wNC8wNSAwMjo1NzoxNSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2RlZmluZQlUQkxCSVRTCTQKKyNkZWZpbmUJVEJMU0laRQkoMSA8PCBUQkxCSVRTKQorCitzdGF0aWMgY29uc3QgZmxvYXQKKyAgICBodWdlICAgID0gMHgxcDEwMGYsCisgICAgdHdvbTEwMCA9IDB4MXAtMTAwZiwKKyAgICByZWR1eCAgID0gMHgxLjhwMjNmIC8gVEJMU0laRSwKKyAgICBQMQkgICAgPSAweDEuNjJlNDMwcC0xZiwKKyAgICBQMgkgICAgPSAweDEuZWJmYmUwcC0zZiwKKyAgICBQMwkgICAgPSAweDEuYzZiMzQ4cC01ZiwKKyAgICBQNAkgICAgPSAweDEuM2IyYzljcC03ZjsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBleHAyZnRbVEJMU0laRV0gPSB7CisJMHgxLjZhMDllNjY3ZjNiY2RwLTEsCisJMHgxLjdhMTE0NzNlYjAxODdwLTEsCisJMHgxLjhhY2U1NDIyYWEwZGJwLTEsCisJMHgxLjljNDkxODJhM2YwOTBwLTEsCisJMHgxLmFlODlmOTk1YWQzYWRwLTEsCisJMHgxLmMxOTliZGQ4NTUyOWNwLTEsCisJMHgxLmQ1ODE4ZGNmYmE0ODdwLTEsCisJMHgxLmVhNGFmYTJhNDkwZGFwLTEsCisJMHgxLjAwMDAwMDAwMDAwMDBwKzAsCisJMHgxLjBiNTU4NmNmOTg5MGZwKzAsCisJMHgxLjE3MmI4M2M3ZDUxN2JwKzAsCisJMHgxLjIzODdhNmU3NTYyMzhwKzAsCisJMHgxLjMwNmZlMGEzMWI3MTVwKzAsCisJMHgxLjNkZWE2NGMxMjM0MjJwKzAsCisJMHgxLjRiZmRhZDUzNjJhMjdwKzAsCisJMHgxLjVhYjA3ZGQ0ODU0MjlwKzAsCit9OworCQorLyoKKyAqIGV4cDJmKHgpOiBjb21wdXRlIHRoZSBiYXNlIDIgZXhwb25lbnRpYWwgb2YgeAorICoKKyAqIEFjY3VyYWN5OiBQZWFrIGVycm9yIDwgMC41MDEgdWxwOyBsb2NhdGlvbiBvZiBwZWFrOiAtMC4wMzAxMTA5MjcuCisgKgorICogTWV0aG9kOiAoZXF1YWxseS1zcGFjZWQgdGFibGVzKQorICoKKyAqICAgUmVkdWNlIHg6CisgKiAgICAgeCA9IDIqKmsgKyB5LCBmb3IgaW50ZWdlciBrIGFuZCB8eXwgPD0gMS8yLgorICogICAgIFRodXMgd2UgaGF2ZSBleHAyZih4KSA9IDIqKmsgKiBleHAyKHkpLgorICoKKyAqICAgUmVkdWNlIHk6CisgKiAgICAgeSA9IGkvVEJMU0laRSArIHogZm9yIGludGVnZXIgaSBuZWFyIHkgKiBUQkxTSVpFLgorICogICAgIFRodXMgd2UgaGF2ZSBleHAyKHkpID0gZXhwMihpL1RCTFNJWkUpICogZXhwMih6KSwKKyAqICAgICB3aXRoIHx6fCA8PSAyKiotKFRCTFNJWkUrMSkuCisgKgorICogICBXZSBjb21wdXRlIGV4cDIoaS9UQkxTSVpFKSB2aWEgdGFibGUgbG9va3VwIGFuZCBleHAyKHopIHZpYSBhCisgKiAgIGRlZ3JlZS00IG1pbmltYXggcG9seW5vbWlhbCB3aXRoIG1heGltdW0gZXJyb3IgdW5kZXIgMS40ICogMioqLTMzLgorICogICBVc2luZyBkb3VibGUgcHJlY2lzaW9uIGluIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBhdm9pZHMgcm91bmRvZmYgZXJyb3IuCisgKgorICogICBUaGlzIG1ldGhvZCBpcyBkdWUgdG8gVGFuZywgYnV0IEkgZG8gbm90IHVzZSBoaXMgc3VnZ2VzdGVkIHBhcmFtZXRlcnM6CisgKgorICoJVGFuZywgUC4gIFRhYmxlLWRyaXZlbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXhwb25lbnRpYWwgRnVuY3Rpb24KKyAqCWluIElFRUUgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4gIFRPTVMgMTUoMiksIDE0NC0xNTcgKDE5ODkpLgorICovCitmbG9hdAorZXhwMmYoZmxvYXQgeCkKK3sKKwlkb3VibGUgdHY7CisJZmxvYXQgciwgejsKKwl2b2xhdGlsZSBmbG9hdCB0OwkvKiBwcmV2ZW50IGdjYyBmcm9tIHVzaW5nIHRvbyBtdWNoIHByZWNpc2lvbiAqLworCXVpbnQzMl90IGh4LCBociwgaXgsIGkwOworCWludDMyX3QgazsKKworCS8qIEZpbHRlciBvdXQgZXhjZXB0aW9uYWwgY2FzZXMuICovCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisJaWYoaXggPj0gMHg0MzAwMDAwMCkgewkJCS8qIHx4fCA+PSAxMjggKi8KKwkJaWYoaXggPj0gMHg3ZjgwMDAwMCkgeworCQkJaWYgKChpeCAmIDB4N2ZmZmZmKSAhPSAwIHx8IChoeCAmIDB4ODAwMDAwMDApID09IDApCisJCQkJcmV0dXJuICh4KTsgCS8qIHggaXMgTmFOIG9yICtJbmYgKi8KKwkJCWVsc2UgCisJCQkJcmV0dXJuICgwLjApOwkvKiB4IGlzIC1JbmYgKi8KKwkJfQorCQlpZih4ID49IDB4MS4wcDdmKQorCQkJcmV0dXJuIChodWdlICogaHVnZSk7CS8qIG92ZXJmbG93ICovCisJCWlmKHggPD0gLTB4MS4yY3A3ZikKKwkJCXJldHVybiAodHdvbTEwMCAqIHR3b20xMDApOyAvKiB1bmRlcmZsb3cgKi8KKwl9IGVsc2UgaWYgKGl4IDw9IDB4MzMwMDAwMDApIHsJCS8qIHx4fCA8PSAweDFwLTI1ICovCisJCXJldHVybiAoMS4wZiArIHgpOworCX0KKworCS8qIFJlZHVjZSB4LCBjb21wdXRpbmcgeiwgaTAsIGFuZCBrLiAqLworCXQgPSB4ICsgcmVkdXg7CisJR0VUX0ZMT0FUX1dPUkQoaTAsIHQpOworCWkwICs9IFRCTFNJWkUgLyAyOworCWsgPSAoaTAgPj4gVEJMQklUUykgPDwgMjM7CisJaTAgJj0gVEJMU0laRSAtIDE7CisJdCAtPSByZWR1eDsKKwl6ID0geCAtIHQ7CisKKwkvKiBDb21wdXRlIHIgPSBleHAyKHkpID0gZXhwMmZ0W2kwXSAqIHAoeikuICovCisJdHYgPSBleHAyZnRbaTBdOworCXIgPSB0diArIHR2ICogKHogKiAoUDEgKyB6ICogKFAyICsgeiAqIChQMyArIHogKiBQNCkpKSk7CisKKwkvKiBTY2FsZSBieSAyKiooaz4+MjMpLiAqLworCWlmKGsgPj0gLTEyNSA8PCAyMykgeworCQlpZiAoayAhPSAwKSB7CisJCQlHRVRfRkxPQVRfV09SRChociwgcik7CisJCQlTRVRfRkxPQVRfV09SRChyLCBociArIGspOworCQl9CisJCXJldHVybiAocik7CisJfSBlbHNlIHsKKwkJR0VUX0ZMT0FUX1dPUkQoaHIsIHIpOworCQlTRVRfRkxPQVRfV09SRChyLCBociArIChrICsgKDEwMCA8PCAyMykpKTsKKwkJcmV0dXJuIChyICogdHdvbTEwMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19leHBtMS5jIGIvbGlibS9zcmMvc19leHBtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWEzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cG0xLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qIEAoIylzX2V4cG0xLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2V4cG0xLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIGV4cG0xKHgpCisgKiBSZXR1cm5zIGV4cCh4KS0xLCB0aGUgZXhwb25lbnRpYWwgb2YgeCBtaW51cyAxLgorICoKKyAqIE1ldGhvZAorICogICAxLiBBcmd1bWVudCByZWR1Y3Rpb246CisgKglHaXZlbiB4LCBmaW5kIHIgYW5kIGludGVnZXIgayBzdWNoIHRoYXQKKyAqCisgKiAgICAgICAgICAgICAgIHggPSBrKmxuMiArIHIsICB8cnwgPD0gMC41KmxuMiB+IDAuMzQ2NTgKKyAqCisgKiAgICAgIEhlcmUgYSBjb3JyZWN0aW9uIHRlcm0gYyB3aWxsIGJlIGNvbXB1dGVkIHRvIGNvbXBlbnNhdGUKKyAqCXRoZSBlcnJvciBpbiByIHdoZW4gcm91bmRlZCB0byBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAqCisgKiAgIDIuIEFwcHJveGltYXRpbmcgZXhwbTEocikgYnkgYSBzcGVjaWFsIHJhdGlvbmFsIGZ1bmN0aW9uIG9uCisgKgl0aGUgaW50ZXJ2YWwgWzAsMC4zNDY1OF06CisgKglTaW5jZQorICoJICAgIHIqKGV4cChyKSsxKS8oZXhwKHIpLTEpID0gMisgcl4yLzYgLSByXjQvMzYwICsgLi4uCisgKgl3ZSBkZWZpbmUgUjEocipyKSBieQorICoJICAgIHIqKGV4cChyKSsxKS8oZXhwKHIpLTEpID0gMisgcl4yLzYgKiBSMShyKnIpCisgKglUaGF0IGlzLAorICoJICAgIFIxKHIqKjIpID0gNi9yICooKGV4cChyKSsxKS8oZXhwKHIpLTEpIC0gMi9yKQorICoJCSAgICAgPSA2L3IgKiAoIDEgKyAyLjAqKDEvKGV4cChyKS0xKSAtIDEvcikpCisgKgkJICAgICA9IDEgLSByXjIvNjAgKyByXjQvMjUyMCAtIHJeNi8xMDA4MDAgKyAuLi4KKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lIGFsZ29yaXRobSBvbiBbMCwwLjM0N10gdG8gZ2VuZXJhdGUKKyAqIAlhIHBvbHlub21pYWwgb2YgZGVncmVlIDUgaW4gcipyIHRvIGFwcHJveGltYXRlIFIxLiBUaGUKKyAqCW1heGltdW0gZXJyb3Igb2YgdGhpcyBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gaXMgYm91bmRlZAorICoJYnkgMioqLTYxLiBJbiBvdGhlciB3b3JkcywKKyAqCSAgICBSMSh6KSB+IDEuMCArIFExKnogKyBRMip6KioyICsgUTMqeioqMyArIFE0KnoqKjQgKyBRNSp6Kio1CisgKgl3aGVyZSAJUTEgID0gIC0xLjY2NjY2NjY2NjY2NjY1NjczODRFLTIsCisgKiAJCVEyICA9ICAgMy45NjgyNTM5NjgxMzcwMzY1ODczRS00LAorICogCQlRMyAgPSAgLTkuOTIwNjM0NDczMzQzNTk4NzM1N0UtNiwKKyAqIAkJUTQgID0gICAyLjUwNTEzNjE0MjA4MDg1MTcwMDJFLTcsCisgKiAJCVE1ICA9ICAtNi4yODQzNTA1NjgyMzgyNjE3MTAyRS05OworICogIAkod2hlcmUgej1yKnIsIGFuZCB0aGUgdmFsdWVzIG9mIFExIHRvIFE1IGFyZSBsaXN0ZWQgYmVsb3cpCisgKgl3aXRoIGVycm9yIGJvdW5kZWQgYnkKKyAqCSAgICB8ICAgICAgICAgICAgICAgICAgNSAgICAgICAgICAgfCAgICAgLTYxCisgKgkgICAgfCAxLjArUTEqeisuLi4rUTUqeiAgIC0gIFIxKHopIHwgPD0gMgorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKgorICoJZXhwbTEocikgPSBleHAociktMSBpcyB0aGVuIGNvbXB1dGVkIGJ5IHRoZSBmb2xsb3dpbmcKKyAqIAlzcGVjaWZpYyB3YXkgd2hpY2ggbWluaW1pemUgdGhlIGFjY3VtdWxhdGlvbiByb3VuZGluZyBlcnJvcjoKKyAqCQkJICAgICAgIDIgICAgIDMKKyAqCQkJICAgICAgciAgICAgciAgICBbIDMgLSAoUjEgKyBSMSpyLzIpICBdCisgKgkgICAgICBleHBtMShyKSA9IHIgKyAtLS0gKyAtLS0gKiBbLS0tLS0tLS0tLS0tLS0tLS0tLS1dCisgKgkJICAgICAgICAgICAgICAyICAgICAyICAgIFsgNiAtIHIqKDMgLSBSMSpyLzIpIF0KKyAqCisgKglUbyBjb21wZW5zYXRlIHRoZSBlcnJvciBpbiB0aGUgYXJndW1lbnQgcmVkdWN0aW9uLCB3ZSB1c2UKKyAqCQlleHBtMShyK2MpID0gZXhwbTEocikgKyBjICsgZXhwbTEocikqYworICoJCQkgICB+IGV4cG0xKHIpICsgYyArIHIqYworICoJVGh1cyBjK3IqYyB3aWxsIGJlIGFkZGVkIGluIGFzIHRoZSBjb3JyZWN0aW9uIHRlcm1zIGZvcgorICoJZXhwbTEocitjKS4gTm93IHJlYXJyYW5nZSB0aGUgdGVybSB0byBhdm9pZCBvcHRpbWl6YXRpb24KKyAqIAlzY3JldyB1cDoKKyAqCQkgICAgICAgICggICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiApCisgKgkJICAgICAgICAoeyAgKCByICAgIFsgUjEgLSAgKDMgLSBSMSpyLzIpIF0gICkgIH0gICAgciAgKQorICoJIGV4cG0xKHIrYyl+ciAtICh7ciooLS0tICogWy0tLS0tLS0tLS0tLS0tLS0tLS0tXS1jKS1jfSAtIC0tLSApCisgKgkgICAgICAgICAgICAgICAgKHsgICggMiAgICBbIDYgLSByKigzIC0gUjEqci8yKSBdICApICB9ICAgIDIgICkKKyAqICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgKgorICoJCSAgID0gciAtIEUKKyAqICAgMy4gU2NhbGUgYmFjayB0byBvYnRhaW4gZXhwbTEoeCk6CisgKglGcm9tIHN0ZXAgMSwgd2UgaGF2ZQorICoJICAgZXhwbTEoeCkgPSBlaXRoZXIgMl5rKltleHBtMShyKSsxXSAtIDEKKyAqCQkgICAgPSBvciAgICAgMl5rKltleHBtMShyKSArICgxLTJeLWspXQorICogICA0LiBJbXBsZW1lbnRhdGlvbiBub3RlczoKKyAqCShBKS4gVG8gc2F2ZSBvbmUgbXVsdGlwbGljYXRpb24sIHdlIHNjYWxlIHRoZSBjb2VmZmljaWVudCBRaQorICoJICAgICB0byBRaSoyXmksIGFuZCByZXBsYWNlIHogYnkgKHheMikvMi4KKyAqCShCKS4gVG8gYWNoaWV2ZSBtYXhpbXVtIGFjY3VyYWN5LCB3ZSBjb21wdXRlIGV4cG0xKHgpIGJ5CisgKgkgIChpKSAgIGlmIHggPCAtNTYqbG4yLCByZXR1cm4gLTEuMCwgKHJhaXNlIGluZXhhY3QgaWYgeCE9aW5mKQorICoJICAoaWkpICBpZiBrPTAsIHJldHVybiByLUUKKyAqCSAgKGlpaSkgaWYgaz0tMSwgcmV0dXJuIDAuNSooci1FKS0wLjUKKyAqICAgICAgICAoaXYpCWlmIGs9MSBpZiByIDwgLTAuMjUsIHJldHVybiAyKigociswLjUpLSBFKQorICoJICAgICAgIAkgICAgICAgZWxzZQkgICAgIHJldHVybiAgMS4wKzIuMCooci1FKTsKKyAqCSAgKHYpICAgaWYgKGs8LTJ8fGs+NTYpIHJldHVybiAyXmsoMS0oRS1yKSkgLSAxIChvciBleHAoeCktMSkKKyAqCSAgKHZpKSAgaWYgayA8PSAyMCwgcmV0dXJuIDJeaygoMS0yXi1rKS0oRS1yKSksIGVsc2UKKyAqCSAgKHZpaSkgcmV0dXJuIDJeaygxLSgoRSsyXi1rKS1yKSkKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJZXhwbTEoSU5GKSBpcyBJTkYsIGV4cG0xKE5hTikgaXMgTmFOOworICoJZXhwbTEoLUlORikgaXMgLTEsIGFuZAorICoJZm9yIGZpbml0ZSBhcmd1bWVudCwgb25seSBleHBtMSgwKT0wIGlzIGV4YWN0LgorICoKKyAqIEFjY3VyYWN5OgorICoJYWNjb3JkaW5nIHRvIGFuIGVycm9yIGFuYWx5c2lzLCB0aGUgZXJyb3IgaXMgYWx3YXlzIGxlc3MgdGhhbgorICoJMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICoKKyAqIE1pc2MuIGluZm8uCisgKglGb3IgSUVFRSBkb3VibGUKKyAqCSAgICBpZiB4ID4gIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyIHRoZW4gZXhwbTEoeCkgb3ZlcmZsb3cKKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZworICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZQkJPSAxLjAsCitodWdlCQk9IDEuMGUrMzAwLAordGlueQkJPSAxLjBlLTMwMCwKK29fdGhyZXNob2xkCT0gNy4wOTc4MjcxMjg5MzM4Mzk3MzA5NmUrMDIsLyogMHg0MDg2MkU0MiwgMHhGRUZBMzlFRiAqLworbG4yX2hpCQk9IDYuOTMxNDcxODAzNjkxMjM4MTY0OTBlLTAxLC8qIDB4M2ZlNjJlNDIsIDB4ZmVlMDAwMDAgKi8KK2xuMl9sbwkJPSAxLjkwODIxNDkyOTI3MDU4NzcwMDAyZS0xMCwvKiAweDNkZWEzOWVmLCAweDM1NzkzYzc2ICovCitpbnZsbjIJCT0gMS40NDI2OTUwNDA4ODg5NjMzODcwMGUrMDAsLyogMHgzZmY3MTU0NywgMHg2NTJiODJmZSAqLworCS8qIHNjYWxlZCBjb2VmZmljaWVudHMgcmVsYXRlZCB0byBleHBtMSAqLworUTEgID0gIC0zLjMzMzMzMzMzMzMzMzMxMzE2NDI4ZS0wMiwgLyogQkZBMTExMTEgMTExMTEwRjQgKi8KK1EyICA9ICAgMS41ODczMDE1ODcyNTQ4MTQ2MDE2NWUtMDMsIC8qIDNGNUEwMUEwIDE5RkU1NTg1ICovCitRMyAgPSAgLTcuOTM2NTA3NTc4Njc0ODc5NDI0NzNlLTA1LCAvKiBCRjE0Q0UxOSA5RUFBREJCNyAqLworUTQgID0gICA0LjAwODIxNzgyNzMyOTM2MjM5NTUyZS0wNiwgLyogM0VEMENGQ0EgODZFNjUyMzkgKi8KK1E1ICA9ICAtMi4wMTA5OTIxODE4MzYyNDM3MTMyNmUtMDc7IC8qIEJFOEFGREI3IDZFMDlDMzJEICovCisKK2RvdWJsZQorZXhwbTEoZG91YmxlIHgpCit7CisJZG91YmxlIHksaGksbG8sYyx0LGUsaHhzLGhmeCxyMTsKKwlpbnQzMl90IGsseHNiOworCXVfaW50MzJfdCBoeDsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJeHNiID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gYml0IG9mIHggKi8KKwlpZih4c2I9PTApIHk9eDsgZWxzZSB5PSAteDsJLyogeSA9IHx4fCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IGh1Z2UgYW5kIG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQwNDM2ODdBKSB7CQkJLyogaWYgfHh8Pj01NipsbjIgKi8KKwkgICAgaWYoaHggPj0gMHg0MDg2MkU0MikgewkJLyogaWYgfHh8Pj03MDkuNzguLi4gKi8KKyAgICAgICAgICAgICAgICBpZihoeD49MHg3ZmYwMDAwMCkgeworCQkgICAgdV9pbnQzMl90IGxvdzsKKwkJICAgIEdFVF9MT1dfV09SRChsb3cseCk7CisJCSAgICBpZigoKGh4JjB4ZmZmZmYpfGxvdykhPTApCisJCSAgICAgICAgIHJldHVybiB4K3g7IAkgLyogTmFOICovCisJCSAgICBlbHNlIHJldHVybiAoeHNiPT0wKT8geDotMS4wOy8qIGV4cCgrLWluZik9e2luZiwtMX0gKi8KKwkgICAgICAgIH0KKwkgICAgICAgIGlmKHggPiBvX3RocmVzaG9sZCkgcmV0dXJuIGh1Z2UqaHVnZTsgLyogb3ZlcmZsb3cgKi8KKwkgICAgfQorCSAgICBpZih4c2IhPTApIHsgLyogeCA8IC01NipsbjIsIHJldHVybiAtMS4wIHdpdGggaW5leGFjdCAqLworCQlpZih4K3Rpbnk8MC4wKQkJLyogcmFpc2UgaW5leGFjdCAqLworCQlyZXR1cm4gdGlueS1vbmU7CS8qIHJldHVybiAtMSAqLworCSAgICB9CisJfQorCisgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uICovCisJaWYoaHggPiAweDNmZDYyZTQyKSB7CQkvKiBpZiAgfHh8ID4gMC41IGxuMiAqLworCSAgICBpZihoeCA8IDB4M0ZGMEEyQjIpIHsJLyogYW5kIHx4fCA8IDEuNSBsbjIgKi8KKwkJaWYoeHNiPT0wKQorCQkgICAge2hpID0geCAtIGxuMl9oaTsgbG8gPSAgbG4yX2xvOyAgayA9ICAxO30KKwkJZWxzZQorCQkgICAge2hpID0geCArIGxuMl9oaTsgbG8gPSAtbG4yX2xvOyAgayA9IC0xO30KKwkgICAgfSBlbHNlIHsKKwkJayAgPSBpbnZsbjIqeCsoKHhzYj09MCk/MC41Oi0wLjUpOworCQl0ICA9IGs7CisJCWhpID0geCAtIHQqbG4yX2hpOwkvKiB0KmxuMl9oaSBpcyBleGFjdCBoZXJlICovCisJCWxvID0gdCpsbjJfbG87CisJICAgIH0KKwkgICAgeCAgPSBoaSAtIGxvOworCSAgICBjICA9IChoaS14KS1sbzsKKwl9CisJZWxzZSBpZihoeCA8IDB4M2M5MDAwMDApIHsgIAkvKiB3aGVuIHx4fDwyKiotNTQsIHJldHVybiB4ICovCisJICAgIHQgPSBodWdlK3g7CS8qIHJldHVybiB4IHdpdGggaW5leGFjdCBmbGFncyB3aGVuIHghPTAgKi8KKwkgICAgcmV0dXJuIHggLSAodC0oaHVnZSt4KSk7CisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJaGZ4ID0gMC41Kng7CisJaHhzID0geCpoZng7CisJcjEgPSBvbmUraHhzKihRMStoeHMqKFEyK2h4cyooUTMraHhzKihRNCtoeHMqUTUpKSkpOworCXQgID0gMy4wLXIxKmhmeDsKKwllICA9IGh4cyooKHIxLXQpLyg2LjAgLSB4KnQpKTsKKwlpZihrPT0wKSByZXR1cm4geCAtICh4KmUtaHhzKTsJCS8qIGMgaXMgMCAqLworCWVsc2UgeworCSAgICBlICA9ICh4KihlLWMpLWMpOworCSAgICBlIC09IGh4czsKKwkgICAgaWYoaz09IC0xKSByZXR1cm4gMC41Kih4LWUpLTAuNTsKKwkgICAgaWYoaz09MSkKKwkgICAgICAgCWlmKHggPCAtMC4yNSkgcmV0dXJuIC0yLjAqKGUtKHgrMC41KSk7CisJICAgICAgIAllbHNlIAkgICAgICByZXR1cm4gIG9uZSsyLjAqKHgtZSk7CisJICAgIGlmIChrIDw9IC0yIHx8IGs+NTYpIHsgICAvKiBzdWZmaWNlIHRvIHJldHVybiBleHAoeCktMSAqLworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgICAgICB5ID0gb25lLShlLXgpOworCQlHRVRfSElHSF9XT1JEKGhpZ2gseSk7CisJCVNFVF9ISUdIX1dPUkQoeSxoaWdoKyhrPDwyMCkpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgICAgIHJldHVybiB5LW9uZTsKKwkgICAgfQorCSAgICB0ID0gb25lOworCSAgICBpZihrPDIwKSB7CisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgICAgIFNFVF9ISUdIX1dPUkQodCwweDNmZjAwMDAwIC0gKDB4MjAwMDAwPj5rKSk7ICAvKiB0PTEtMl4tayAqLworCSAgICAgICAJeSA9IHQtKGUteCk7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5KTsKKwkJU0VUX0hJR0hfV09SRCh5LGhpZ2grKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgIH0gZWxzZSB7CisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkJU0VUX0hJR0hfV09SRCh0LCgoMHgzZmYtayk8PDIwKSk7CS8qIDJeLWsgKi8KKwkgICAgICAgCXkgPSB4LShlK3QpOworCSAgICAgICAJeSArPSBvbmU7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5KTsKKwkJU0VUX0hJR0hfV09SRCh5LGhpZ2grKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICB9CisJfQorCXJldHVybiB5OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19leHBtMWYuYyBiL2xpYm0vc3JjL3NfZXhwbTFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MGE3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXhwbTFmLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIHNfZXhwbTFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2V4cG0xLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2V4cG0xZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZQkJPSAxLjAsCitodWdlCQk9IDEuMGUrMzAsCit0aW55CQk9IDEuMGUtMzAsCitvX3RocmVzaG9sZAk9IDguODcyMTY3OTY4OGUrMDEsLyogMHg0MmIxNzE4MCAqLworbG4yX2hpCQk9IDYuOTMxMzgxMjI1NmUtMDEsLyogMHgzZjMxNzE4MCAqLworbG4yX2xvCQk9IDkuMDU4MDAwNjE0NWUtMDYsLyogMHgzNzE3ZjdkMSAqLworaW52bG4yCQk9IDEuNDQyNjk1MDIxNmUrMDAsLyogMHgzZmI4YWEzYiAqLworCS8qIHNjYWxlZCBjb2VmZmljaWVudHMgcmVsYXRlZCB0byBleHBtMSAqLworUTEgID0gIC0zLjMzMzMzMzUwNzJlLTAyLCAvKiAweGJkMDg4ODg5ICovCitRMiAgPSAgIDEuNTg3MzAxNjA5MWUtMDMsIC8qIDB4M2FkMDBkMDEgKi8KK1EzICA9ICAtNy45MzY1MDc2MDkwZS0wNSwgLyogMHhiOGE2NzBjZCAqLworUTQgID0gICA0LjAwODIxNzcyOTNlLTA2LCAvKiAweDM2ODY3ZTU0ICovCitRNSAgPSAgLTIuMDEwOTkyMTE5NWUtMDc7IC8qIDB4YjQ1N2VkYmIgKi8KKworZmxvYXQKK2V4cG0xZihmbG9hdCB4KQoreworCWZsb2F0IHksaGksbG8sYyx0LGUsaHhzLGhmeCxyMTsKKwlpbnQzMl90IGsseHNiOworCXVfaW50MzJfdCBoeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCXhzYiA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIGJpdCBvZiB4ICovCisJaWYoeHNiPT0wKSB5PXg7IGVsc2UgeT0gLXg7CS8qIHkgPSB8eHwgKi8KKwloeCAmPSAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCisgICAgLyogZmlsdGVyIG91dCBodWdlIGFuZCBub24tZmluaXRlIGFyZ3VtZW50ICovCisJaWYoaHggPj0gMHg0MTk1Yjg0NCkgewkJCS8qIGlmIHx4fD49MjcqbG4yICovCisJICAgIGlmKGh4ID49IDB4NDJiMTcyMTgpIHsJCS8qIGlmIHx4fD49ODguNzIxLi4uICovCisgICAgICAgICAgICAgICAgaWYoaHg+MHg3ZjgwMDAwMCkKKwkJICAgIHJldHVybiB4K3g7IAkgLyogTmFOICovCisJCWlmKGh4PT0weDdmODAwMDAwKQorCQkgICAgcmV0dXJuICh4c2I9PTApPyB4Oi0xLjA7LyogZXhwKCstaW5mKT17aW5mLC0xfSAqLworCSAgICAgICAgaWYoeCA+IG9fdGhyZXNob2xkKSByZXR1cm4gaHVnZSpodWdlOyAvKiBvdmVyZmxvdyAqLworCSAgICB9CisJICAgIGlmKHhzYiE9MCkgeyAvKiB4IDwgLTI3KmxuMiwgcmV0dXJuIC0xLjAgd2l0aCBpbmV4YWN0ICovCisJCWlmKHgrdGlueTwoZmxvYXQpMC4wKQkvKiByYWlzZSBpbmV4YWN0ICovCisJCXJldHVybiB0aW55LW9uZTsJLyogcmV0dXJuIC0xICovCisJICAgIH0KKwl9CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwlpZihoeCA+IDB4M2ViMTcyMTgpIHsJCS8qIGlmICB8eHwgPiAwLjUgbG4yICovCisJICAgIGlmKGh4IDwgMHgzRjg1MTU5MikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQlpZih4c2I9PTApCisJCSAgICB7aGkgPSB4IC0gbG4yX2hpOyBsbyA9ICBsbjJfbG87ICBrID0gIDE7fQorCQllbHNlCisJCSAgICB7aGkgPSB4ICsgbG4yX2hpOyBsbyA9IC1sbjJfbG87ICBrID0gLTE7fQorCSAgICB9IGVsc2UgeworCQlrICA9IGludmxuMip4KygoeHNiPT0wKT8oZmxvYXQpMC41OihmbG9hdCktMC41KTsKKwkJdCAgPSBrOworCQloaSA9IHggLSB0KmxuMl9oaTsJLyogdCpsbjJfaGkgaXMgZXhhY3QgaGVyZSAqLworCQlsbyA9IHQqbG4yX2xvOworCSAgICB9CisJICAgIHggID0gaGkgLSBsbzsKKwkgICAgYyAgPSAoaGkteCktbG87CisJfQorCWVsc2UgaWYoaHggPCAweDMzMDAwMDAwKSB7ICAJLyogd2hlbiB8eHw8MioqLTI1LCByZXR1cm4geCAqLworCSAgICB0ID0gaHVnZSt4OwkvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgZmxhZ3Mgd2hlbiB4IT0wICovCisJICAgIHJldHVybiB4IC0gKHQtKGh1Z2UreCkpOworCX0KKwllbHNlIGsgPSAwOworCisgICAgLyogeCBpcyBub3cgaW4gcHJpbWFyeSByYW5nZSAqLworCWhmeCA9IChmbG9hdCkwLjUqeDsKKwloeHMgPSB4KmhmeDsKKwlyMSA9IG9uZStoeHMqKFExK2h4cyooUTIraHhzKihRMytoeHMqKFE0K2h4cypRNSkpKSk7CisJdCAgPSAoZmxvYXQpMy4wLXIxKmhmeDsKKwllICA9IGh4cyooKHIxLXQpLygoZmxvYXQpNi4wIC0geCp0KSk7CisJaWYoaz09MCkgcmV0dXJuIHggLSAoeCplLWh4cyk7CQkvKiBjIGlzIDAgKi8KKwllbHNlIHsKKwkgICAgZSAgPSAoeCooZS1jKS1jKTsKKwkgICAgZSAtPSBoeHM7CisJICAgIGlmKGs9PSAtMSkgcmV0dXJuIChmbG9hdCkwLjUqKHgtZSktKGZsb2F0KTAuNTsKKwkgICAgaWYoaz09MSkKKwkgICAgICAgCWlmKHggPCAoZmxvYXQpLTAuMjUpIHJldHVybiAtKGZsb2F0KTIuMCooZS0oeCsoZmxvYXQpMC41KSk7CisJICAgICAgIAllbHNlIAkgICAgICByZXR1cm4gIG9uZSsoZmxvYXQpMi4wKih4LWUpOworCSAgICBpZiAoayA8PSAtMiB8fCBrPjU2KSB7ICAgLyogc3VmZmljZSB0byByZXR1cm4gZXhwKHgpLTEgKi8KKwkgICAgICAgIGludDMyX3QgaTsKKwkgICAgICAgIHkgPSBvbmUtKGUteCk7CisJCUdFVF9GTE9BVF9XT1JEKGkseSk7CisJCVNFVF9GTE9BVF9XT1JEKHksaSsoazw8MjMpKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgICAgICByZXR1cm4geS1vbmU7CisJICAgIH0KKwkgICAgdCA9IG9uZTsKKwkgICAgaWYoazwyMykgeworCSAgICAgICAgaW50MzJfdCBpOworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQodCwweDNmODAwMDAwIC0gKDB4MTAwMDAwMD4+aykpOyAvKiB0PTEtMl4tayAqLworCSAgICAgICAJeSA9IHQtKGUteCk7CisJCUdFVF9GTE9BVF9XT1JEKGkseSk7CisJCVNFVF9GTE9BVF9XT1JEKHksaSsoazw8MjMpKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgfSBlbHNlIHsKKwkgICAgICAgIGludDMyX3QgaTsKKwkJU0VUX0ZMT0FUX1dPUkQodCwoKDB4N2Ytayk8PDIzKSk7CS8qIDJeLWsgKi8KKwkgICAgICAgCXkgPSB4LShlK3QpOworCSAgICAgICAJeSArPSBvbmU7CisJCUdFVF9GTE9BVF9XT1JEKGkseSk7CisJCVNFVF9GTE9BVF9XT1JEKHksaSsoazw8MjMpKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgIH0KKwl9CisJcmV0dXJuIHk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZhYnMuYyBiL2xpYm0vc3JjL3NfZmFicy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmE5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZhYnMuYwpAQCAtMCwwICsxLDMxIEBACisvKiBAKCMpc19mYWJzLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZhYnMuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZhYnMoeCkgcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK2ZhYnMoZG91YmxlIHgpCit7CisJdV9pbnQzMl90IGhpZ2g7CisJR0VUX0hJR0hfV09SRChoaWdoLHgpOworCVNFVF9ISUdIX1dPUkQoeCxoaWdoJjB4N2ZmZmZmZmYpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmFic2YuYyBiL2xpYm0vc3JjL3NfZmFic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAwNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mYWJzZi5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHNfZmFic2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZmFicy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mYWJzZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmFic2YoeCkgcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorZmFic2YoZmxvYXQgeCkKK3sKKwl1X2ludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeCxpeCYweDdmZmZmZmZmKTsKKyAgICAgICAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZhYnNsLmMgYi9saWJtL3NyYy9zX2ZhYnNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmFic2wuYwpAQCAtMCwwICsxLDQzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBEYWctRXJsaW5nIENv72RhbiBTbfhyZ3JhdgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgIGluIHRoaXMgcG9zaXRpb24gYW5kIHVuY2hhbmdlZC4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mYWJzbC5jLHYgMS4yIDIwMDMvMTAvMjUgMTk6NTM6MjggZGVzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitsb25nIGRvdWJsZQorZmFic2wobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSB4OworCXUuYml0cy5zaWduID0gMDsKKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZkaW0uYyBiL2xpYm0vc3JjL3NfZmRpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZkaW0uYwpAQCAtMCwwICsxLDQ2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZkaW0uYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lCURFQ0wodHlwZSwgZm4pCQkJXAordHlwZQkJCQkJXAorZm4odHlwZSB4LCB0eXBlIHkpCQkJXAorewkJCQkJXAorCQkJCQlcCisJaWYgKGlzbmFuKHgpKQkJCVwKKwkJcmV0dXJuICh4KTsJCVwKKwlpZiAoaXNuYW4oeSkpCQkJXAorCQlyZXR1cm4gKHkpOwkJXAorCXJldHVybiAoeCA+IHkgPyB4IC0geSA6IDAuMCk7CVwKK30KKworREVDTChkb3VibGUsIGZkaW0pCitERUNMKGZsb2F0LCBmZGltZikKK0RFQ0wobG9uZyBkb3VibGUsIGZkaW1sKQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19maW5pdGUuYyBiL2xpYm0vc3JjL3NfZmluaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0ZDFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmluaXRlLmMKQEAgLTAsMCArMSwzMCBAQAorLyogQCgjKXNfZmluaXRlLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Zpbml0ZS5jLHYgMS44IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmaW5pdGUoeCkgcmV0dXJucyAxIGlzIHggaXMgZmluaXRlLCBlbHNlIDA7CisgKiBubyBicmFuY2hpbmchCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworCWludCBmaW5pdGUoZG91YmxlIHgpCit7CisJaW50MzJfdCBoeDsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCXJldHVybiAoaW50KSgodV9pbnQzMl90KSgoaHgmMHg3ZmZmZmZmZiktMHg3ZmYwMDAwMCk+PjMxKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmluaXRlZi5jIGIvbGlibS9zcmMvc19maW5pdGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMDYzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmluaXRlZi5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIHNfZmluaXRlZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19maW5pdGUuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmluaXRlZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6NTE6NDYgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmluaXRlZih4KSByZXR1cm5zIDEgaXMgeCBpcyBmaW5pdGUsIGVsc2UgMDsKKyAqIG5vIGJyYW5jaGluZyEKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisJaW50IGZpbml0ZWYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCXJldHVybiAoaW50KSgodV9pbnQzMl90KSgoaXgmMHg3ZmZmZmZmZiktMHg3ZjgwMDAwMCk+PjMxKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmxvb3IuYyBiL2xpYm0vc3JjL3NfZmxvb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2MzMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbG9vci5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Zsb29yLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZsb29yKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBmbG9vcih4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK2Zsb29yKGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGksajsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA+PTApIHtpMD1pMT0wO30KKwkJICAgIGVsc2UgaWYoKChpMCYweDdmZmZmZmZmKXxpMSkhPTApCisJCQl7IGkwPTB4YmZmMDAwMDA7aTE9MDt9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+MC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaWYoaTA8MCkgaTAgKz0gKDB4MDAxMDAwMDApPj5qMDsKKwkJICAgIGkwICY9ICh+aSk7IGkxPTA7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaWYoaHVnZSt4PjAuMCkgeyAJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQlpZihpMDwwKSB7CisJCSAgICBpZihqMD09MjApIGkwKz0xOworCQkgICAgZWxzZSB7CisJCQlqID0gaTErKDE8PCg1Mi1qMCkpOworCQkJaWYoajxpMSkgaTAgKz0xIDsgCS8qIGdvdCBhIGNhcnJ5ICovCisJCQlpMT1qOworCQkgICAgfQorCQl9CisJCWkxICY9ICh+aSk7CisJICAgIH0KKwl9CisJSU5TRVJUX1dPUkRTKHgsaTAsaTEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbG9vcmYuYyBiL2xpYm0vc3JjL3NfZmxvb3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhNzFmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmxvb3JmLmMKQEAgLTAsMCArMSw2MiBAQAorLyogc19mbG9vcmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZmxvb3IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmxvb3JmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmbG9vcmYoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGZsb29yZih4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgaHVnZSA9IDEuMGUzMDsKKworZmxvYXQKK2Zsb29yZihmbG9hdCB4KQoreworCWludDMyX3QgaTAsajA7CisJdV9pbnQzMl90IGk7CisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsKKwlpZihqMDwyMykgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgey8qIHJldHVybiAwKnNpZ24oeCkgaWYgfHh8PDEgKi8KKwkJICAgIGlmKGkwPj0wKSB7aTA9MDt9CisJCSAgICBlbHNlIGlmKChpMCYweDdmZmZmZmZmKSE9MCkKKwkJCXsgaTA9MHhiZjgwMDAwMDt9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwN2ZmZmZmKT4+ajA7CisJCWlmKChpMCZpKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PihmbG9hdCkwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMDwwKSBpMCArPSAoMHgwMDgwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxpMCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zsb29ybC5jIGIvbGlibS9zcmMvc19mbG9vcmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWYwYWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbG9vcmwuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBGcm9tOiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNAorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2Zsb29ybC5jLHYgMS40IDIwMDUvMDQvMjggMTk6NDU6NTUgc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZsb29ybCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gZmxvb3JsKHgpLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCU1BTkhfU0laRQkoTERCTF9NQU5IX1NJWkUgKyAxKQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pCQkJCQlcCisJCXUuYml0cy5leHArKzsJCQkJCVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZQlNQU5IX1NJWkUJTERCTF9NQU5IX1NJWkUKKyNkZWZpbmUJSU5DX01BTkgodSwgYykJZG8gewkJCQkJXAorCXVpbnQ2NF90IG8gPSB1LmJpdHMubWFuaDsJCQkJXAorCXUuYml0cy5tYW5oICs9IChjKTsJCQkJCVwKKwlpZiAodS5iaXRzLm1hbmggPCBvKSB7CQkJCQlcCisJCXUuYml0cy5leHArKzsJCQkJCVwKKwkJdS5iaXRzLm1hbmggfD0gMWxsdSA8PCAoTERCTF9NQU5IX1NJWkUgLSAxKTsJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2xvbmcgZG91YmxlCitmbG9vcmwobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHUgPSB7IC5lID0geCB9OworCWludCBlID0gdS5iaXRzLmV4cCAtIExEQkxfTUFYX0VYUCArIDE7CisKKwlpZiAoZSA8IE1BTkhfU0laRSAtIDEpIHsKKwkJaWYgKGUgPCAwKSB7CQkJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkKKwkJCQlpZiAodS5iaXRzLmV4cCA+IDAgfHwKKwkJCQkgICAgKHUuYml0cy5tYW5oIHwgdS5iaXRzLm1hbmwpICE9IDApCisJCQkJCXUuZSA9IHUuYml0cy5zaWduID8gLTEuMCA6IDAuMDsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ2NF90IG0gPSAoKDFsbHUgPDwgTUFOSF9TSVpFKSAtIDEpID4+IChlICsgMSk7CisJCQlpZiAoKCh1LmJpdHMubWFuaCAmIG0pIHwgdS5iaXRzLm1hbmwpID09IDApCisJCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkJaWYgKHUuYml0cy5zaWduKSB7CisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisJCQkJaWYgKGUgPT0gMCkKKwkJCQkJdS5iaXRzLmV4cCsrOworCQkJCWVsc2UKKyNlbmRpZgorCQkJCUlOQ19NQU5IKHUsIDFsbHUgPDwgKE1BTkhfU0laRSAtIGUgLSAxKSk7CisJCQl9CisJCQlpZiAoaHVnZSArIHggPiAwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQkJdS5iaXRzLm1hbmggJj0gfm07CisJCQkJdS5iaXRzLm1hbmwgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlIDwgTERCTF9NQU5UX0RJRyAtIDEpIHsKKwkJdWludDY0X3QgbSA9ICh1aW50NjRfdCktMSA+PiAoNjQgLSBMREJMX01BTlRfRElHICsgZSArIDEpOworCQlpZiAoKHUuYml0cy5tYW5sICYgbSkgPT0gMCkKKwkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYgKHUuYml0cy5zaWduKSB7CisJCQlpZiAoZSA9PSBNQU5IX1NJWkUgLSAxKQorCQkJCUlOQ19NQU5IKHUsIDEpOworCQkJZWxzZSB7CisJCQkJdWludDY0X3QgbyA9IHUuYml0cy5tYW5sOworCQkJCXUuYml0cy5tYW5sICs9IDFsbHUgPDwgKExEQkxfTUFOVF9ESUcgLSBlIC0gMSk7CisJCQkJaWYgKHUuYml0cy5tYW5sIDwgbykJLyogZ290IGEgY2FycnkgKi8KKwkJCQkJSU5DX01BTkgodSwgMSk7CisJCQl9CisJCX0KKwkJaWYgKGh1Z2UgKyB4ID4gMC4wKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQl1LmJpdHMubWFubCAmPSB+bTsKKwl9CisJcmV0dXJuICh1LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWEuYyBiL2xpYm0vc3JjL3NfZm1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjYzI2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1hLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1hLmMsdiAxLjQgMjAwNS8wMy8xOCAwMjoyNzo1OSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyoKKyAqIEZ1c2VkIG11bHRpcGx5LWFkZDogQ29tcHV0ZSB4ICogeSArIHogd2l0aCBhIHNpbmdsZSByb3VuZGluZyBlcnJvci4KKyAqCisgKiBXZSB1c2Ugc2NhbGluZyB0byBhdm9pZCBvdmVyZmxvdy91bmRlcmZsb3csIGFsb25nIHdpdGggdGhlCisgKiBjYW5vbmljYWwgcHJlY2lzaW9uLWRvdWJsaW5nIHRlY2huaXF1ZSBhZGFwdGVkIGZyb206CisgKgorICoJRGVra2VyLCBULiAgQSBGbG9hdGluZy1Qb2ludCBUZWNobmlxdWUgZm9yIEV4dGVuZGluZyB0aGUKKyAqCUF2YWlsYWJsZSBQcmVjaXNpb24uICBOdW1lci4gTWF0aC4gMTgsIDIyNC0yNDIgKDE5NzEpLgorICoKKyAqIFRoaXMgYWxnb3JpdGhtIGlzIHNlbnNpdGl2ZSB0byB0aGUgcm91bmRpbmcgcHJlY2lzaW9uLiAgRlBVcyBzdWNoCisgKiBhcyB0aGUgaTM4NyBtdXN0IGJlIHNldCBpbiBkb3VibGUtcHJlY2lzaW9uIG1vZGUgaWYgdmFyaWFibGVzIGFyZQorICogdG8gYmUgc3RvcmVkIGluIEZQIHJlZ2lzdGVycyBpbiBvcmRlciB0byBhdm9pZCBpbmNvcnJlY3QgcmVzdWx0cy4KKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgb24gRnJlZUJTRCwgYnV0IG5vdCBvbiBtYW55IG90aGVyIHN5c3RlbXMuCisgKgorICogSGFyZHdhcmUgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSB1c2VkIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IGl0LAorICogc2luY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGxpa2VseSBiZSBzZXZlcmFsIHRpbWVzIHNsb3dlci4KKyAqLworI2lmIExEQkxfTUFOVF9ESUcgIT0gMTEzCitkb3VibGUKK2ZtYShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KQoreworCXN0YXRpYyBjb25zdCBkb3VibGUgc3BsaXQgPSAweDFwMjcgKyAxLjA7CisJZG91YmxlIHhzLCB5cywgenM7CisJZG91YmxlIGMsIGNjLCBoeCwgaHksIHAsIHEsIHR4LCB0eTsKKwlkb3VibGUgciwgcnIsIHM7CisJaW50IG9yb3VuZDsKKwlpbnQgZXgsIGV5LCBlejsKKwlpbnQgc3ByZWFkOworCisJaWYgKHogPT0gMC4wKQorCQlyZXR1cm4gKHggKiB5KTsKKwlpZiAoeCA9PSAwLjAgfHwgeSA9PSAwLjApCisJCXJldHVybiAoeCAqIHkgKyB6KTsKKworCS8qIFJlc3VsdHMgb2YgZnJleHAoKSBhcmUgdW5kZWZpbmVkIGZvciB0aGVzZSBjYXNlcy4gKi8KKwlpZiAoIWlzZmluaXRlKHgpIHx8ICFpc2Zpbml0ZSh5KSB8fCAhaXNmaW5pdGUoeikpCisJCXJldHVybiAoeCAqIHkgKyB6KTsKKworCXhzID0gZnJleHAoeCwgJmV4KTsKKwl5cyA9IGZyZXhwKHksICZleSk7CisJenMgPSBmcmV4cCh6LCAmZXopOworCW9yb3VuZCA9IGZlZ2V0cm91bmQoKTsKKwlzcHJlYWQgPSBleCArIGV5IC0gZXo7CisKKwkvKgorCSAqIElmIHggKiB5IGFuZCB6IGFyZSBtYW55IG9yZGVycyBvZiBtYWduaXR1ZGUgYXBhcnQsIHRoZSBzY2FsaW5nCisJICogd2lsbCBvdmVyZmxvdywgc28gd2UgaGFuZGxlIHRoZXNlIGNhc2VzIHNwZWNpYWxseS4gIFJvdW5kaW5nCisJICogbW9kZXMgb3RoZXIgdGhhbiBGRV9UT05FQVJFU1QgYXJlIHBhaW5mdWwuCisJICovCisJaWYgKHNwcmVhZCA+IERCTF9NQU5UX0RJRyAqIDIpIHsKKwkJZmVudl90IGVudjsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsKKwkJc3dpdGNoKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeCAqIHkpOworCQljYXNlIEZFX1RPV0FSRFpFUk86CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjAgXiB6IDwgMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcihyLCAwKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJY2FzZSBGRV9ET1dOV0FSRDoKKwkJCWlmICh6ID4gMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcihyLCAtSU5GSU5JVFkpOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQlkZWZhdWx0OgkvKiBGRV9VUFdBUkQgKi8KKwkJCWlmICh6IDwgMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcihyLCBJTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCX0KKwl9CisJaWYgKHNwcmVhZCA8IC1EQkxfTUFOVF9ESUcpIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsKKwkJaWYgKCFpc25vcm1hbCh6KSkKKwkJCWZlcmFpc2VleGNlcHQoRkVfVU5ERVJGTE9XKTsKKwkJc3dpdGNoIChvcm91bmQpIHsKKwkJY2FzZSBGRV9UT05FQVJFU1Q6CisJCQlyZXR1cm4gKHopOworCQljYXNlIEZFX1RPV0FSRFpFUk86CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjAgXiB6IDwgMC4wKQorCQkJCXJldHVybiAoeik7CisJCQllbHNlCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXIoeiwgMCkpOworCQljYXNlIEZFX0RPV05XQVJEOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wKQorCQkJCXJldHVybiAoeik7CisJCQllbHNlCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXIoeiwgLUlORklOSVRZKSk7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wKQorCQkJCXJldHVybiAobmV4dGFmdGVyKHosIElORklOSVRZKSk7CisJCQllbHNlCisJCQkJcmV0dXJuICh6KTsKKwkJfQorCX0KKworCS8qCisJICogVXNlIERla2tlcidzIGFsZ29yaXRobSB0byBwZXJmb3JtIHRoZSBtdWx0aXBsaWNhdGlvbiBhbmQKKwkgKiBzdWJzZXF1ZW50IGFkZGl0aW9uIGluIHR3aWNlIHRoZSBtYWNoaW5lIHByZWNpc2lvbi4KKwkgKiBBcnJhbmdlIHNvIHRoYXQgeCAqIHkgPSBjICsgY2MsIGFuZCB4ICogeSArIHogPSByICsgcnIuCisJICovCisJZmVzZXRyb3VuZChGRV9UT05FQVJFU1QpOworCisJcCA9IHhzICogc3BsaXQ7CisJaHggPSB4cyAtIHA7CisJaHggKz0gcDsKKwl0eCA9IHhzIC0gaHg7CisKKwlwID0geXMgKiBzcGxpdDsKKwloeSA9IHlzIC0gcDsKKwloeSArPSBwOworCXR5ID0geXMgLSBoeTsKKworCXAgPSBoeCAqIGh5OworCXEgPSBoeCAqIHR5ICsgdHggKiBoeTsKKwljID0gcCArIHE7CisJY2MgPSBwIC0gYyArIHEgKyB0eCAqIHR5OworCisJenMgPSBsZGV4cCh6cywgLXNwcmVhZCk7CisJciA9IGMgKyB6czsKKwlzID0gciAtIGM7CisJcnIgPSAoYyAtIChyIC0gcykpICsgKHpzIC0gcykgKyBjYzsKKworCXNwcmVhZCA9IGV4ICsgZXk7CisJaWYgKHNwcmVhZCArIGlsb2diKHIpID4gLTEwMjMpIHsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gciArIHJyOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSByZXN1bHQgaXMgc3Vibm9ybWFsLCBzbyB3ZSByb3VuZCBiZWZvcmUgc2NhbGluZyB0bworCQkgKiBhdm9pZCBkb3VibGUgcm91bmRpbmcuCisJCSAqLworCQlwID0gbGRleHAoY29weXNpZ24oMHgxcC0xMDIyLCByKSwgLXNwcmVhZCk7CisJCWMgPSByICsgcDsKKwkJcyA9IGMgLSByOworCQljYyA9IChyIC0gKGMgLSBzKSkgKyAocCAtIHMpICsgcnI7CisJCWZlc2V0cm91bmQob3JvdW5kKTsKKwkJciA9IChjICsgY2MpIC0gcDsKKwl9CisJcmV0dXJuIChsZGV4cChyLCBzcHJlYWQpKTsKK30KKyNlbHNlCS8qIExEQkxfTUFOVF9ESUcgPT0gMTEzICovCisvKgorICogMTEzIGJpdHMgb2YgcHJlY2lzaW9uIGlzIG1vcmUgdGhhbiB0d2ljZSB0aGUgcHJlY2lzaW9uIG9mIGEgZG91YmxlLAorICogc28gaXQgaXMgZW5vdWdoIHRvIHJlcHJlc2VudCB0aGUgaW50ZXJtZWRpYXRlIHByb2R1Y3QgZXhhY3RseS4KKyAqLworZG91YmxlCitmbWEoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikKK3sKKwlyZXR1cm4gKChsb25nIGRvdWJsZSl4ICogeSArIHopOworfQorI2VuZGlmCS8qIExEQkxfTUFOVF9ESUcgIT0gMTEzICovCisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykKK19fd2Vha19yZWZlcmVuY2UoZm1hLCBmbWFsKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWFmLmMgYi9saWJtL3NyYy9zX2ZtYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWFmLmMKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWFmLmMsdiAxLjEgMjAwNS8wMS8yMiAwOTo1MzoxOCBkYXMgRXhwICQiKTsgKi8KKworLyoKKyAqIEZ1c2VkIG11bHRpcGx5LWFkZDogQ29tcHV0ZSB4ICogeSArIHogd2l0aCBhIHNpbmdsZSByb3VuZGluZyBlcnJvci4KKyAqCisgKiBBIGRvdWJsZSBoYXMgbW9yZSB0aGFuIHR3aWNlIGFzIG11Y2ggcHJlY2lzaW9uIHRoYW4gYSBmbG9hdCwgc28KKyAqIGRpcmVjdCBkb3VibGUtcHJlY2lzaW9uIGFyaXRobWV0aWMgc3VmZmljZXMuCisgKgorICogWFhYIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBjb21waWxlciB0byBjb252ZXJ0IGZyb20gZG91YmxlIHRvIGZsb2F0CisgKiAgICAgdXNpbmcgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZSBhbmQgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICBzaWRlLWVmZmVjdHMuICBCdXQgb24gYXQgbGVhc3Qgb25lIHBsYXRmb3JtIChnY2MgMy40LjIvc3BhcmM2NCksCisgKiAgICAgdGhpcyBhcHBlYXJzIHRvIGJlIHRvbyBtdWNoIHRvIGFzayBmb3IuICBUaGUgcHJlY2lzaW9uCisgKiAgICAgcmVkdWN0aW9uIHNob3VsZCBiZSBkb25lIG1hbnVhbGx5LgorICovCitmbG9hdAorZm1hZihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQoreworCisJcmV0dXJuICgoZG91YmxlKXggKiB5ICsgeik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYWwuYyBiL2xpYm0vc3JjL3NfZm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzM2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYWwuYwpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWFsLmMsdiAxLjIgMjAwNS8wMy8xOCAwMjoyNzo1OSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyoKKyAqIEZ1c2VkIG11bHRpcGx5LWFkZDogQ29tcHV0ZSB4ICogeSArIHogd2l0aCBhIHNpbmdsZSByb3VuZGluZyBlcnJvci4KKyAqCisgKiBXZSB1c2Ugc2NhbGluZyB0byBhdm9pZCBvdmVyZmxvdy91bmRlcmZsb3csIGFsb25nIHdpdGggdGhlCisgKiBjYW5vbmljYWwgcHJlY2lzaW9uLWRvdWJsaW5nIHRlY2huaXF1ZSBhZGFwdGVkIGZyb206CisgKgorICoJRGVra2VyLCBULiAgQSBGbG9hdGluZy1Qb2ludCBUZWNobmlxdWUgZm9yIEV4dGVuZGluZyB0aGUKKyAqCUF2YWlsYWJsZSBQcmVjaXNpb24uICBOdW1lci4gTWF0aC4gMTgsIDIyNC0yNDIgKDE5NzEpLgorICovCitsb25nIGRvdWJsZQorZm1hbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB6KQoreworI2lmIExEQkxfTUFOVF9ESUcgPT0gNjQKKwlzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgc3BsaXQgPSAweDFwMzJMICsgMS4wOworI2VsaWYgTERCTF9NQU5UX0RJRyA9PSAxMTMKKwlzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgc3BsaXQgPSAweDFwNTdMICsgMS4wOworI2VuZGlmCisJbG9uZyBkb3VibGUgeHMsIHlzLCB6czsKKwlsb25nIGRvdWJsZSBjLCBjYywgaHgsIGh5LCBwLCBxLCB0eCwgdHk7CisJbG9uZyBkb3VibGUgciwgcnIsIHM7CisJaW50IG9yb3VuZDsKKwlpbnQgZXgsIGV5LCBlejsKKwlpbnQgc3ByZWFkOworCisJaWYgKHogPT0gMC4wKQorCQlyZXR1cm4gKHggKiB5KTsKKwlpZiAoeCA9PSAwLjAgfHwgeSA9PSAwLjApCisJCXJldHVybiAoeCAqIHkgKyB6KTsKKworCS8qIFJlc3VsdHMgb2YgZnJleHAoKSBhcmUgdW5kZWZpbmVkIGZvciB0aGVzZSBjYXNlcy4gKi8KKwlpZiAoIWlzZmluaXRlKHgpIHx8ICFpc2Zpbml0ZSh5KSB8fCAhaXNmaW5pdGUoeikpCisJCXJldHVybiAoeCAqIHkgKyB6KTsKKworCXhzID0gZnJleHBsKHgsICZleCk7CisJeXMgPSBmcmV4cGwoeSwgJmV5KTsKKwl6cyA9IGZyZXhwbCh6LCAmZXopOworCW9yb3VuZCA9IGZlZ2V0cm91bmQoKTsKKwlzcHJlYWQgPSBleCArIGV5IC0gZXo7CisKKwkvKgorCSAqIElmIHggKiB5IGFuZCB6IGFyZSBtYW55IG9yZGVycyBvZiBtYWduaXR1ZGUgYXBhcnQsIHRoZSBzY2FsaW5nCisJICogd2lsbCBvdmVyZmxvdywgc28gd2UgaGFuZGxlIHRoZXNlIGNhc2VzIHNwZWNpYWxseS4gIFJvdW5kaW5nCisJICogbW9kZXMgb3RoZXIgdGhhbiBGRV9UT05FQVJFU1QgYXJlIHBhaW5mdWwuCisJICovCisJaWYgKHNwcmVhZCA+IExEQkxfTUFOVF9ESUcgKiAyKSB7CisJCWZlbnZfdCBlbnY7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7CisJCXN3aXRjaChvcm91bmQpIHsKKwkJY2FzZSBGRV9UT05FQVJFU1Q6CisJCQlyZXR1cm4gKHggKiB5KTsKKwkJY2FzZSBGRV9UT1dBUkRaRVJPOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wIF4geiA8IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXJsKHIsIDApOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQljYXNlIEZFX0RPV05XQVJEOgorCQkJaWYgKHogPiAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVybChyLCAtSU5GSU5JVFkpOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQlkZWZhdWx0OgkvKiBGRV9VUFdBUkQgKi8KKwkJCWlmICh6IDwgMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcmwociwgSU5GSU5JVFkpOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQl9CisJfQorCWlmIChzcHJlYWQgPCAtTERCTF9NQU5UX0RJRykgeworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlpZiAoIWlzbm9ybWFsKHopKQorCQkJZmVyYWlzZWV4Y2VwdChGRV9VTkRFUkZMT1cpOworCQlzd2l0Y2ggKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeik7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcmwoeiwgMCkpOworCQljYXNlIEZFX0RPV05XQVJEOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wKQorCQkJCXJldHVybiAoeik7CisJCQllbHNlCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXJsKHosIC1JTkZJTklUWSkpOworCQlkZWZhdWx0OgkvKiBGRV9VUFdBUkQgKi8KKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCkKKwkJCQlyZXR1cm4gKG5leHRhZnRlcmwoeiwgSU5GSU5JVFkpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHopOworCQl9CisJfQorCisJLyoKKwkgKiBVc2UgRGVra2VyJ3MgYWxnb3JpdGhtIHRvIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9uIGFuZAorCSAqIHN1YnNlcXVlbnQgYWRkaXRpb24gaW4gdHdpY2UgdGhlIG1hY2hpbmUgcHJlY2lzaW9uLgorCSAqIEFycmFuZ2Ugc28gdGhhdCB4ICogeSA9IGMgKyBjYywgYW5kIHggKiB5ICsgeiA9IHIgKyByci4KKwkgKi8KKwlmZXNldHJvdW5kKEZFX1RPTkVBUkVTVCk7CisKKwlwID0geHMgKiBzcGxpdDsKKwloeCA9IHhzIC0gcDsKKwloeCArPSBwOworCXR4ID0geHMgLSBoeDsKKworCXAgPSB5cyAqIHNwbGl0OworCWh5ID0geXMgLSBwOworCWh5ICs9IHA7CisJdHkgPSB5cyAtIGh5OworCisJcCA9IGh4ICogaHk7CisJcSA9IGh4ICogdHkgKyB0eCAqIGh5OworCWMgPSBwICsgcTsKKwljYyA9IHAgLSBjICsgcSArIHR4ICogdHk7CisKKwl6cyA9IGxkZXhwbCh6cywgLXNwcmVhZCk7CisJciA9IGMgKyB6czsKKwlzID0gciAtIGM7CisJcnIgPSAoYyAtIChyIC0gcykpICsgKHpzIC0gcykgKyBjYzsKKworCXNwcmVhZCA9IGV4ICsgZXk7CisJaWYgKHNwcmVhZCArIGlsb2dibChyKSA+IC0xNjM4MykgeworCQlmZXNldHJvdW5kKG9yb3VuZCk7CisJCXIgPSByICsgcnI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHJlc3VsdCBpcyBzdWJub3JtYWwsIHNvIHdlIHJvdW5kIGJlZm9yZSBzY2FsaW5nIHRvCisJCSAqIGF2b2lkIGRvdWJsZSByb3VuZGluZy4KKwkJICovCisJCXAgPSBsZGV4cGwoY29weXNpZ25sKDB4MXAtMTYzODJMLCByKSwgLXNwcmVhZCk7CisJCWMgPSByICsgcDsKKwkJcyA9IGMgLSByOworCQljYyA9IChyIC0gKGMgLSBzKSkgKyAocCAtIHMpICsgcnI7CisJCWZlc2V0cm91bmQob3JvdW5kKTsKKwkJciA9IChjICsgY2MpIC0gcDsKKwl9CisJcmV0dXJuIChsZGV4cGwociwgc3ByZWFkKSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYXguYyBiL2xpYm0vc3JjL3NfZm1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDVmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYXguYwpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYXguYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2RvdWJsZQorZm1heChkb3VibGUgeCwgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWQyYml0cyB1WzJdOworCisJdVswXS5kID0geDsKKwl1WzFdLmQgPSB5OworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDIwNDcgJiYgKHVbMF0uYml0cy5tYW5oIHwgdVswXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMjA0NyAmJiAodVsxXS5iaXRzLm1hbmggfCB1WzFdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1W3VbMF0uYml0cy5zaWduXS5kKTsKKworCXJldHVybiAoeCA+IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYXhmLmMgYi9saWJtL3NyYy9zX2ZtYXhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3ZjY1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1heGYuYwpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYXhmLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitmbG9hdAorZm1heGYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHVbMl07CisKKwl1WzBdLmYgPSB4OworCXVbMV0uZiA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjU1ICYmIHVbMF0uYml0cy5tYW4gIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVsxXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVswXS5iaXRzLnNpZ25dLmYpOworCisJcmV0dXJuICh4ID4geSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1heGwuYyBiL2xpYm0vc3JjL3NfZm1heGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE5ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWF4bC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1heGwuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2xvbmcgZG91YmxlCitmbWF4bChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdVsyXTsKKworCXVbMF0uZSA9IHg7CisJbWFza19uYml0X2wodVswXSk7CisJdVsxXS5lID0geTsKKwltYXNrX25iaXRfbCh1WzFdKTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodVsxXS5iaXRzLm1hbmggfCB1WzFdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1WzBdLmJpdHMuc2lnbiA/IHkgOiB4KTsKKworCXJldHVybiAoeCA+IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtaW4uYyBiL2xpYm0vc3JjL3NfZm1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjljYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtaW4uYwpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtaW4uYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2RvdWJsZQorZm1pbihkb3VibGUgeCwgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWQyYml0cyB1WzJdOworCisJdVswXS5kID0geDsKKwl1WzFdLmQgPSB5OworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDIwNDcgJiYgKHVbMF0uYml0cy5tYW5oIHwgdVswXS5iaXRzLm1hbmwpICE9IDApCisJCXJldHVybiAoeSk7CisJaWYgKHVbMV0uYml0cy5leHAgPT0gMjA0NyAmJiAodVsxXS5iaXRzLm1hbmggfCB1WzFdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1W3VbMV0uYml0cy5zaWduXS5kKTsKKworCXJldHVybiAoeCA8IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtaW5mLmMgYi9saWJtL3NyYy9zX2ZtaW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmYjU3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1pbmYuYwpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtaW5mLmMsdiAxLjEgMjAwNC8wNi8zMCAwNzowNDowMSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitmbG9hdAorZm1pbmYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHVbMl07CisKKwl1WzBdLmYgPSB4OworCXVbMV0uZiA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjU1ICYmIHVbMF0uYml0cy5tYW4gIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVsxXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVsxXS5iaXRzLnNpZ25dLmYpOworCisJcmV0dXJuICh4IDwgeSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1pbmwuYyBiL2xpYm0vc3JjL3NfZm1pbmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWlubC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1pbmwuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2xvbmcgZG91YmxlCitmbWlubChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdVsyXTsKKworCXVbMF0uZSA9IHg7CisJbWFza19uYml0X2wodVswXSk7CisJdVsxXS5lID0geTsKKwltYXNrX25iaXRfbCh1WzFdKTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodVsxXS5iaXRzLm1hbmggfCB1WzFdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh4KTsKKworCS8qIEhhbmRsZSBjb21wYXJpc29ucyBvZiBzaWduZWQgemVyb2VzLiAqLworCWlmICh1WzBdLmJpdHMuc2lnbiAhPSB1WzFdLmJpdHMuc2lnbikKKwkJcmV0dXJuICh1WzFdLmJpdHMuc2lnbiA/IHkgOiB4KTsKKworCXJldHVybiAoeCA8IHkgPyB4IDogeSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZyZXhwLmMgYi9saWJtL3NyYy9zX2ZyZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5ZTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZnJleHAuYwpAQCAtMCwwICsxLDU4IEBACisvKiBAKCMpc19mcmV4cC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mcmV4cC5jLHYgMS4xMCAyMDA1LzAzLzA3IDIxOjI3OjM3IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZvciBub24temVybyB4CisgKgl4ID0gZnJleHAoYXJnLCZleHApOworICogcmV0dXJuIGEgZG91YmxlIGZwIHF1YW50aXR5IHggc3VjaCB0aGF0IDAuNSA8PSB8eHwgPDEuMAorICogYW5kIHRoZSBjb3JyZXNwb25kaW5nIGJpbmFyeSBleHBvbmVudCAiZXhwIi4gVGhhdCBpcworICoJYXJnID0geCoyXmV4cC4KKyAqIElmIGFyZyBpcyBpbmYsIDAuMCwgb3IgTmFOLCB0aGVuIGZyZXhwKGFyZywmZXhwKSByZXR1cm5zIGFyZworICogd2l0aCAqZXhwPTAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzU0ID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2OyAvKiAweDQzNTAwMDAwLCAweDAwMDAwMDAwICovCisKK2RvdWJsZQorZnJleHAoZG91YmxlIHgsIGludCAqZXB0cikKK3sKKwlpbnQzMl90IGh4LCBpeCwgbHg7CisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisJKmVwdHIgPSAwOworCWlmKGl4Pj0weDdmZjAwMDAwfHwoKGl4fGx4KT09MCkpIHJldHVybiB4OwkvKiAwLGluZixuYW4gKi8KKwlpZiAoaXg8MHgwMDEwMDAwMCkgewkJLyogc3Vibm9ybWFsICovCisJICAgIHggKj0gdHdvNTQ7CisJICAgIEdFVF9ISUdIX1dPUkQoaHgseCk7CisJICAgIGl4ID0gaHgmMHg3ZmZmZmZmZjsKKwkgICAgKmVwdHIgPSAtNTQ7CisJfQorCSplcHRyICs9IChpeD4+MjApLTEwMjI7CisJaHggPSAoaHgmMHg4MDBmZmZmZil8MHgzZmUwMDAwMDsKKwlTRVRfSElHSF9XT1JEKHgsaHgpOworCXJldHVybiB4OworfQorCisjaWYgKExEQkxfTUFOVF9ESUcgPT0gNTMpCitfX3dlYWtfcmVmZXJlbmNlKGZyZXhwLCBmcmV4cGwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZyZXhwZi5jIGIvbGlibS9zcmMvc19mcmV4cGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ0NjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mcmV4cGYuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBzX2ZyZXhwZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19mcmV4cC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mcmV4cGYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSA9ICAzLjM1NTQ0MzIwMDBlKzA3OyAvKiAweDRjMDAwMDAwICovCisKK2Zsb2F0CitmcmV4cGYoZmxvYXQgeCwgaW50ICplcHRyKQoreworCWludDMyX3QgaHgsaXg7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworCSplcHRyID0gMDsKKwlpZihpeD49MHg3ZjgwMDAwMHx8KGl4PT0wKSkgcmV0dXJuIHg7CS8qIDAsaW5mLG5hbiAqLworCWlmIChpeDwweDAwODAwMDAwKSB7CQkvKiBzdWJub3JtYWwgKi8KKwkgICAgeCAqPSB0d28yNTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJICAgIGl4ID0gaHgmMHg3ZmZmZmZmZjsKKwkgICAgKmVwdHIgPSAtMjU7CisJfQorCSplcHRyICs9IChpeD4+MjMpLTEyNjsKKwloeCA9IChoeCYweDgwN2ZmZmZmKXwweDNmMDAwMDAwOworCSooaW50KikmeCA9IGh4OworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mcmV4cGwuYyBiL2xpYm0vc3JjL3NfZnJleHBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMzE2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZnJleHBsLmMKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZnJleHBsLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1NDo1MSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK2xvbmcgZG91YmxlCitmcmV4cGwobG9uZyBkb3VibGUgeCwgaW50ICpleCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSB4OworCXN3aXRjaCAodS5iaXRzLmV4cCkgeworCWNhc2UgMDoJCS8qIDAgb3Igc3Vibm9ybWFsICovCisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkgeworCQkJKmV4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXUuZSAqPSAweDEuMHA1MTQ7CisJCQkqZXggPSB1LmJpdHMuZXhwIC0gMHg0MjAwOworCQkJdS5iaXRzLmV4cCA9IDB4M2ZmZTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4N2ZmZjoJLyogaW5maW5pdHkgb3IgTmFOOyB2YWx1ZSBvZiAqZXggaXMgdW5zcGVjaWZpZWQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoJLyogbm9ybWFsICovCisJCSpleCA9IHUuYml0cy5leHAgLSAweDNmZmU7CisJCXUuYml0cy5leHAgPSAweDNmZmU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lsb2diLmMgYi9saWJtL3NyYy9zX2lsb2diLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaWxvZ2IuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBAKCMpc19pbG9nYi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pbG9nYi5jLHYgMS45IDIwMDQvMTAvMDkgMTc6MTQ6Mjggc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworLyogaWxvZ2IoZG91YmxlIHgpCisgKiByZXR1cm4gdGhlIGJpbmFyeSBleHBvbmVudCBvZiBub24temVybyB4CisgKiBpbG9nYigwKSA9IEZQX0lMT0dCMAorICogaWxvZ2IoTmFOKSA9IEZQX0lMT0dCTkFOIChubyBzaWduYWwgaXMgcmFpc2VkKQorICogaWxvZ2IoaW5mKSA9IElOVF9NQVggKG5vIHNpZ25hbCBpcyByYWlzZWQpCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisJaW50IGlsb2diKGRvdWJsZSB4KQoreworCWludDMyX3QgaHgsbHgsaXg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWh4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaHg8MHgwMDEwMDAwMCkgeworCSAgICBpZigoaHh8bHgpPT0wKQorCQlyZXR1cm4gRlBfSUxPR0IwOworCSAgICBlbHNlCQkJLyogc3Vibm9ybWFsIHggKi8KKwkJaWYoaHg9PTApIHsKKwkJICAgIGZvciAoaXggPSAtMTA0MzsgbHg+MDsgbHg8PD0xKSBpeCAtPTE7CisJCX0gZWxzZSB7CisJCSAgICBmb3IgKGl4ID0gLTEwMjIsaHg8PD0xMTsgaHg+MDsgaHg8PD0xKSBpeCAtPTE7CisJCX0KKwkgICAgcmV0dXJuIGl4OworCX0KKwllbHNlIGlmIChoeDwweDdmZjAwMDAwKSByZXR1cm4gKGh4Pj4yMCktMTAyMzsKKwllbHNlIGlmIChoeD4weDdmZjAwMDAwIHx8IGx4IT0wKSByZXR1cm4gRlBfSUxPR0JOQU47CisJZWxzZSByZXR1cm4gSU5UX01BWDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaWxvZ2JmLmMgYi9saWJtL3NyYy9zX2lsb2diZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOWM0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lsb2diZi5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHNfaWxvZ2JmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2lsb2diLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lsb2diZi5jLHYgMS43IDIwMDQvMTAvMDkgMTc6MTQ6Mjggc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisJaW50IGlsb2diZihmbG9hdCB4KQoreworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwloeCAmPSAweDdmZmZmZmZmOworCWlmKGh4PDB4MDA4MDAwMDApIHsKKwkgICAgaWYoaHg9PTApCisJCXJldHVybiBGUF9JTE9HQjA7CisJICAgIGVsc2UJCQkvKiBzdWJub3JtYWwgeCAqLworCSAgICAgICAgZm9yIChpeCA9IC0xMjYsaHg8PD04OyBoeD4wOyBoeDw8PTEpIGl4IC09MTsKKwkgICAgcmV0dXJuIGl4OworCX0KKwllbHNlIGlmIChoeDwweDdmODAwMDAwKSByZXR1cm4gKGh4Pj4yMyktMTI3OworCWVsc2UgaWYgKGh4PjB4N2Y4MDAwMDApIHJldHVybiBGUF9JTE9HQk5BTjsKKwllbHNlIHJldHVybiBJTlRfTUFYOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pbG9nYmwuYyBiL2xpYm0vc3JjL3NfaWxvZ2JsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2YWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaWxvZ2JsLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEZyb206IEAoIylzX2lsb2diLmMgNS4xIDkzLzA5LzI0CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaWxvZ2JsLmMsdiAxLjEgMjAwNC8xMC8xMSAxODoxMzo1MiBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitpbG9nYmwobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisJdW5zaWduZWQgbG9uZyBtOworCWludCBiOworCisJdS5lID0geDsKKwlpZiAodS5iaXRzLmV4cCA9PSAwKSB7CisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkKKwkJCXJldHVybiAoRlBfSUxPR0IwKTsKKwkJLyogZGVub3JtYWxpemVkICovCisJCWlmICh1LmJpdHMubWFuaCA9PSAwKSB7CisJCQltID0gMWx1IDw8IChMREJMX01BTkxfU0laRSAtIDEpOworCQkJZm9yIChiID0gTERCTF9NQU5IX1NJWkU7ICEodS5iaXRzLm1hbmwgJiBtKTsgbSA+Pj0gMSkKKwkJCQliKys7CisJCX0gZWxzZSB7CisJCQltID0gMWx1IDw8IChMREJMX01BTkhfU0laRSAtIDEpOworCQkJZm9yIChiID0gMDsgISh1LmJpdHMubWFuaCAmIG0pOyBtID4+PSAxKQorCQkJCWIrKzsKKwkJfQorI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorCQliKys7CisjZW5kaWYKKwkJcmV0dXJuIChMREJMX01JTl9FWFAgLSBiIC0gMSk7CisJfSBlbHNlIGlmICh1LmJpdHMuZXhwIDwgKExEQkxfTUFYX0VYUCA8PCAxKSAtIDEpCisJCXJldHVybiAodS5iaXRzLmV4cCAtIExEQkxfTUFYX0VYUCArIDEpOworCWVsc2UgaWYgKHUuYml0cy5tYW5sICE9IDAgfHwgdS5iaXRzLm1hbmggIT0gMCkKKwkJcmV0dXJuIChGUF9JTE9HQk5BTik7CisJZWxzZQorCQlyZXR1cm4gKElOVF9NQVgpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pc2Zpbml0ZS5jIGIvbGlibS9zcmMvc19pc2Zpbml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDUwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lzZmluaXRlLmMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lzZmluaXRlLmMsdiAxLjEgMjAwNC8wNy8wOSAwMzozMjozOSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2ludAorX19pc2Zpbml0ZShkb3VibGUgZCkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHU7CisKKwl1LmQgPSBkOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAyMDQ3KTsKK30KKworaW50CitfX2lzZmluaXRlZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDI1NSk7Cit9CisKK2ludAorX19pc2Zpbml0ZWwobG9uZyBkb3VibGUgZSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSBlOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAzMjc2Nyk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lzbmFuLmMgYi9saWJtL3NyYy9zX2lzbmFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2MzUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaXNuYW4uYwpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaXNuYW4uYyx2IDEuOCAyMDA0LzA4LzA1IDAxOjQ2OjExIGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworLyogUHJvdmlkZWQgYnkgbGliYyAqLworI2lmIDEKK2ludAorKGlzbmFuKShkb3VibGUgZCkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHU7CisKKwl1LmQgPSBkOworCXJldHVybiAodS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1LmJpdHMubWFubCAhPSAwIHx8IHUuYml0cy5tYW5oICE9IDApKTsKK30KKyNlbmRpZgorCitpbnQKK2lzbmFuZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDI1NSAmJiB1LmJpdHMubWFuICE9IDApOworfQorCitpbnQKK19faXNuYW5sKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwltYXNrX25iaXRfbCh1KTsKKwlyZXR1cm4gKHUuYml0cy5leHAgPT0gMzI3NjcgJiYgKHUuYml0cy5tYW5sICE9IDAgfHwgdS5iaXRzLm1hbmggIT0gMCkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pc25vcm1hbC5jIGIvbGlibS9zcmMvc19pc25vcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDVkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2lzbm9ybWFsLmMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lzbm9ybWFsLmMsdiAxLjEgMjAwNC8wNy8wOSAwMzozMjozOSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2ludAorX19pc25vcm1hbChkb3VibGUgZCkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHU7CisKKwl1LmQgPSBkOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAwICYmIHUuYml0cy5leHAgIT0gMjA0Nyk7Cit9CisKK2ludAorX19pc25vcm1hbGYoZmxvYXQgZikKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHU7CisKKwl1LmYgPSBmOworCXJldHVybiAodS5iaXRzLmV4cCAhPSAwICYmIHUuYml0cy5leHAgIT0gMjU1KTsKK30KKworaW50CitfX2lzbm9ybWFsbChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDAgJiYgdS5iaXRzLmV4cCAhPSAzMjc2Nyk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscmludC5jIGIvbGlibS9zcmMvc19sbHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY3ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJpbnQuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xscmludC5jLHYgMS4xIDIwMDUvMDEvMTEgMjM6MTI6NTUgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJpbnQKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlmbgkJbGxyaW50CisKKyNpbmNsdWRlICJzX2xyaW50LmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscmludGYuYyBiL2xpYm0vc3JjL3NfbGxyaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzVlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscmludGYuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xscmludGYuYyx2IDEuMSAyMDA1LzAxLzExIDIzOjEyOjU1IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJpbnRmCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJZm4JCWxscmludGYKKworI2luY2x1ZGUgInNfbHJpbnQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyb3VuZC5jIGIvbGlibS9zcmMvc19sbHJvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhYjEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyb3VuZC5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xscm91bmQuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjI3IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyb3VuZAorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdMT05HX01BWAorI2RlZmluZQlmbgkJbGxyb3VuZAorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyb3VuZGYuYyBiL2xpYm0vc3JjL3NfbGxyb3VuZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQ2OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJvdW5kZi5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xscm91bmRmLmMsdiAxLjIgMjAwNS8wNC8wOCAwMDo1MjoyNyBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlmbG9hdAorI2RlZmluZQlyb3VuZGl0CQlyb3VuZGYKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR0xPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxscm91bmRmCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJvdW5kbC5jIGIvbGlibS9zcmMvc19sbHJvdW5kbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmFlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscm91bmRsLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyb3VuZGwuYyx2IDEuMSAyMDA1LzA0LzA4IDAxOjI0OjA4IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWxvbmcgZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kbAorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdMT05HX01BWAorI2RlZmluZQlmbgkJbGxyb3VuZGwKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xvZzFwLmMgYi9saWJtL3NyYy9zX2xvZzFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMTUxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbG9nMXAuYwpAQCAtMCwwICsxLDE2OCBAQAorLyogQCgjKXNfbG9nMXAuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbG9nMXAuYyx2IDEuOCAyMDA1LzEyLzA0IDEyOjI4OjMzIGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogZG91YmxlIGxvZzFwKGRvdWJsZSB4KQorICoKKyAqIE1ldGhvZCA6CisgKiAgIDEuIEFyZ3VtZW50IFJlZHVjdGlvbjogZmluZCBrIGFuZCBmIHN1Y2ggdGhhdAorICoJCQkxK3ggPSAyXmsgKiAoMStmKSwKKyAqCSAgIHdoZXJlICBzcXJ0KDIpLzIgPCAxK2YgPCBzcXJ0KDIpIC4KKyAqCisgKiAgICAgIE5vdGUuIElmIGs9MCwgdGhlbiBmPXggaXMgZXhhY3QuIEhvd2V2ZXIsIGlmIGshPTAsIHRoZW4gZgorICoJbWF5IG5vdCBiZSByZXByZXNlbnRhYmxlIGV4YWN0bHkuIEluIHRoYXQgY2FzZSwgYSBjb3JyZWN0aW9uCisgKgl0ZXJtIGlzIG5lZWQuIExldCB1PTEreCByb3VuZGVkLiBMZXQgYyA9ICgxK3gpLXUsIHRoZW4KKyAqCWxvZygxK3gpIC0gbG9nKHUpIH4gYy91LiBUaHVzLCB3ZSBwcm9jZWVkIHRvIGNvbXB1dGUgbG9nKHUpLAorICoJYW5kIGFkZCBiYWNrIHRoZSBjb3JyZWN0aW9uIHRlcm0gYy91LgorICoJKE5vdGU6IHdoZW4geCA+IDIqKjUzLCBvbmUgY2FuIHNpbXBseSByZXR1cm4gbG9nKHgpKQorICoKKyAqICAgMi4gQXBwcm94aW1hdGlvbiBvZiBsb2cxcChmKS4KKyAqCUxldCBzID0gZi8oMitmKSA7IGJhc2VkIG9uIGxvZygxK2YpID0gbG9nKDErcykgLSBsb2coMS1zKQorICoJCSA9IDJzICsgMi8zIHMqKjMgKyAyLzUgcyoqNSArIC4uLi4uLAorICoJICAgICAJID0gMnMgKyBzKlIKKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lIGFsZ29yaXRobSBvbiBbMCwwLjE3MTZdIHRvIGdlbmVyYXRlCisgKiAJYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNCB0byBhcHByb3hpbWF0ZSBSIFRoZSBtYXhpbXVtIGVycm9yCisgKglvZiB0aGlzIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBpcyBib3VuZGVkIGJ5IDIqKi01OC40NS4gSW4KKyAqCW90aGVyIHdvcmRzLAorICoJCSAgICAgICAgMiAgICAgIDQgICAgICA2ICAgICAgOCAgICAgIDEwICAgICAgMTIgICAgICAxNAorICoJICAgIFIoeikgfiBMcDEqcyArTHAyKnMgK0xwMypzICtMcDQqcyArTHA1KnMgICtMcDYqcyAgK0xwNypzCisgKiAgCSh0aGUgdmFsdWVzIG9mIExwMSB0byBMcDcgYXJlIGxpc3RlZCBpbiB0aGUgcHJvZ3JhbSkKKyAqCWFuZAorICoJICAgIHwgICAgICAyICAgICAgICAgIDE0ICAgICAgICAgIHwgICAgIC01OC40NQorICoJICAgIHwgTHAxKnMgKy4uLitMcDcqcyAgICAtICBSKHopIHwgPD0gMgorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCU5vdGUgdGhhdCAycyA9IGYgLSBzKmYgPSBmIC0gaGZzcSArIHMqaGZzcSwgd2hlcmUgaGZzcSA9IGYqZi8yLgorICoJSW4gb3JkZXIgdG8gZ3VhcmFudGVlIGVycm9yIGluIGxvZyBiZWxvdyAxdWxwLCB3ZSBjb21wdXRlIGxvZworICoJYnkKKyAqCQlsb2cxcChmKSA9IGYgLSAoaGZzcSAtIHMqKGhmc3ErUikpLgorICoKKyAqCTMuIEZpbmFsbHksIGxvZzFwKHgpID0gaypsbjIgKyBsb2cxcChmKS4KKyAqCQkgCSAgICAgPSBrKmxuMl9oaSsoZi0oaGZzcS0ocyooaGZzcStSKStrKmxuMl9sbykpKQorICoJICAgSGVyZSBsbjIgaXMgc3BsaXQgaW50byB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVyOgorICoJCQlsbjJfaGkgKyBsbjJfbG8sCisgKgkgICB3aGVyZSBuKmxuMl9oaSBpcyBhbHdheXMgZXhhY3QgZm9yIHxufCA8IDIwMDAuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWxvZzFwKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4IDwgLTEgKGluY2x1ZGluZyAtSU5GKSA7CisgKglsb2cxcCgrSU5GKSBpcyArSU5GOyBsb2cxcCgtMSkgaXMgLUlORiB3aXRoIHNpZ25hbDsKKyAqCWxvZzFwKE5hTikgaXMgdGhhdCBOYU4gd2l0aCBubyBzaWduYWwuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZQorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2gKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqCisgKiBOb3RlOiBBc3N1bWluZyBsb2coKSByZXR1cm4gYWNjdXJhdGUgYW5zd2VyLCB0aGUgZm9sbG93aW5nCisgKiAJIGFsZ29yaXRobSBjYW4gYmUgdXNlZCB0byBjb21wdXRlIGxvZzFwKHgpIHRvIHdpdGhpbiBhIGZldyBVTFA6CisgKgorICoJCXUgPSAxK3g7CisgKgkJaWYodT09MS4wKSByZXR1cm4geCA7IGVsc2UKKyAqCQkJICAgcmV0dXJuIGxvZyh1KSooeC8odS0xLjApKTsKKyAqCisgKgkgU2VlIEhQLTE1QyBBZHZhbmNlZCBGdW5jdGlvbnMgSGFuZGJvb2ssIHAuMTkzLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2xuMl9oaSAgPSAgNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsCS8qIDNmZTYyZTQyIGZlZTAwMDAwICovCitsbjJfbG8gID0gIDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLAkvKiAzZGVhMzllZiAzNTc5M2M3NiAqLwordHdvNTQgICA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNiwgIC8qIDQzNTAwMDAwIDAwMDAwMDAwICovCitMcDEgPSA2LjY2NjY2NjY2NjY2NjczNTEzMGUtMDEsICAvKiAzRkU1NTU1NSA1NTU1NTU5MyAqLworTHAyID0gMy45OTk5OTk5OTk5NDA5NDE5MDhlLTAxLCAgLyogM0ZEOTk5OTkgOTk5N0ZBMDQgKi8KK0xwMyA9IDIuODU3MTQyODc0MzY2MjM5MTQ5ZS0wMSwgIC8qIDNGRDI0OTI0IDk0MjI5MzU5ICovCitMcDQgPSAyLjIyMjIxOTg0MzIxNDk3ODM5NmUtMDEsICAvKiAzRkNDNzFDNSAxRDhFNzhBRiAqLworTHA1ID0gMS44MTgzNTcyMTYxNjE4MDUwMTJlLTAxLCAgLyogM0ZDNzQ2NjQgOTZDQjAzREUgKi8KK0xwNiA9IDEuNTMxMzgzNzY5OTIwOTM3MzMyZS0wMSwgIC8qIDNGQzM5QTA5IEQwNzhDNjlGICovCitMcDcgPSAxLjQ3OTgxOTg2MDUxMTY1ODU5MWUtMDE7ICAvKiAzRkMyRjExMiBERjNFNTI0NCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gPSAwLjA7CisKK2RvdWJsZQorbG9nMXAoZG91YmxlIHgpCit7CisJZG91YmxlIGhmc3EsZixjLHMseixSLHU7CisJaW50MzJfdCBrLGh4LGh1LGF4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlheCA9IGh4JjB4N2ZmZmZmZmY7CisKKwlrID0gMTsKKwlpZiAoaHggPCAweDNGREE4MjdBKSB7CQkJLyogMSt4IDwgc3FydCgyKSsgKi8KKwkgICAgaWYoYXg+PTB4M2ZmMDAwMDApIHsJCS8qIHggPD0gLTEuMCAqLworCQlpZih4PT0tMS4wKSByZXR1cm4gLXR3bzU0L3plcm87IC8qIGxvZzFwKC0xKT0raW5mICovCisJCWVsc2UgcmV0dXJuICh4LXgpLyh4LXgpOwkvKiBsb2cxcCh4PC0xKT1OYU4gKi8KKwkgICAgfQorCSAgICBpZihheDwweDNlMjAwMDAwKSB7CQkJLyogfHh8IDwgMioqLTI5ICovCisJCWlmKHR3bzU0K3g+emVybwkJCS8qIHJhaXNlIGluZXhhY3QgKi8KKwkgICAgICAgICAgICAmJmF4PDB4M2M5MDAwMDApIAkJLyogfHh8IDwgMioqLTU0ICovCisJCSAgICByZXR1cm4geDsKKwkJZWxzZQorCQkgICAgcmV0dXJuIHggLSB4KngqMC41OworCSAgICB9CisJICAgIGlmKGh4PjB8fGh4PD0oKGludDMyX3QpMHhiZmQyYmVjNCkpIHsKKwkJaz0wO2Y9eDtodT0xO30JCS8qIHNxcnQoMikvMi0gPD0gMSt4IDwgc3FydCgyKSsgKi8KKwl9CisJaWYgKGh4ID49IDB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJaWYoayE9MCkgeworCSAgICBpZihoeDwweDQzNDAwMDAwKSB7CisJCXUgID0gMS4wK3g7CisJCUdFVF9ISUdIX1dPUkQoaHUsdSk7CisJICAgICAgICBrICA9IChodT4+MjApLTEwMjM7CisJICAgICAgICBjICA9IChrPjApPyAxLjAtKHUteCk6eC0odS0xLjApOy8qIGNvcnJlY3Rpb24gdGVybSAqLworCQljIC89IHU7CisJICAgIH0gZWxzZSB7CisJCXUgID0geDsKKwkJR0VUX0hJR0hfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMCktMTAyMzsKKwkJYyAgPSAwOworCSAgICB9CisJICAgIGh1ICY9IDB4MDAwZmZmZmY7CisJICAgIC8qCisJICAgICAqIFRoZSBhcHByb3hpbWF0aW9uIHRvIHNxcnQoMikgdXNlZCBpbiB0aHJlc2hvbGRzIGlzIG5vdAorCSAgICAgKiBjcml0aWNhbC4gIEhvd2V2ZXIsIHRoZSBvbmVzIHVzZWQgYWJvdmUgbXVzdCBnaXZlIGxlc3MKKwkgICAgICogc3RyaWN0IGJvdW5kcyB0aGFuIHRoZSBvbmUgaGVyZSBzbyB0aGF0IHRoZSBrPT0wIGNhc2UgaXMKKwkgICAgICogbmV2ZXIgcmVhY2hlZCBmcm9tIGhlcmUsIHNpbmNlIGhlcmUgd2UgaGF2ZSBjb21taXR0ZWQgdG8KKwkgICAgICogdXNpbmcgdGhlIGNvcnJlY3Rpb24gdGVybSBidXQgZG9uJ3QgdXNlIGl0IGlmIGs9PTAuCisJICAgICAqLworCSAgICBpZihodTwweDZhMDllKSB7CQkJLyogdSB+PCBzcXJ0KDIpICovCisJICAgICAgICBTRVRfSElHSF9XT1JEKHUsaHV8MHgzZmYwMDAwMCk7CS8qIG5vcm1hbGl6ZSB1ICovCisJICAgIH0gZWxzZSB7CisJICAgICAgICBrICs9IDE7CisJCVNFVF9ISUdIX1dPUkQodSxodXwweDNmZTAwMDAwKTsJLyogbm9ybWFsaXplIHUvMiAqLworCSAgICAgICAgaHUgPSAoMHgwMDEwMDAwMC1odSk+PjI7CisJICAgIH0KKwkgICAgZiA9IHUtMS4wOworCX0KKwloZnNxPTAuNSpmKmY7CisJaWYoaHU9PTApIHsJLyogfGZ8IDwgMioqLTIwICovCisJICAgIGlmKGY9PXplcm8pIGlmKGs9PTApIHJldHVybiB6ZXJvOworCQkJZWxzZSB7YyArPSBrKmxuMl9sbzsgcmV0dXJuIGsqbG4yX2hpK2M7fQorCSAgICBSID0gaGZzcSooMS4wLTAuNjY2NjY2NjY2NjY2NjY2NjYqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2UKKwkgICAgCSAgICAgcmV0dXJuIGsqbG4yX2hpLSgoUi0oaypsbjJfbG8rYykpLWYpOworCX0KKyAJcyA9IGYvKDIuMCtmKTsKKwl6ID0gcypzOworCVIgPSB6KihMcDEreiooTHAyK3oqKExwMyt6KihMcDQreiooTHA1K3oqKExwNit6KkxwNykpKSkpKTsKKwlpZihrPT0wKSByZXR1cm4gZi0oaGZzcS1zKihoZnNxK1IpKTsgZWxzZQorCQkgcmV0dXJuIGsqbG4yX2hpLSgoaGZzcS0ocyooaGZzcStSKSsoaypsbjJfbG8rYykpKS1mKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbG9nMXBmLmMgYi9saWJtL3NyYy9zX2xvZzFwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjRkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZzFwZi5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBzX2xvZzFwZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19sb2cxcC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sb2cxcGYuYyx2IDEuOSAyMDA1LzEyLzA0IDEyOjMwOjQ0IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitsbjJfaGkgPSAgIDYuOTMxMzgxMjI1NmUtMDEsCS8qIDB4M2YzMTcxODAgKi8KK2xuMl9sbyA9ICAgOS4wNTgwMDA2MTQ1ZS0wNiwJLyogMHgzNzE3ZjdkMSAqLwordHdvMjUgPSAgICAzLjM1NTQ0MzIwMGUrMDcsCS8qIDB4NGMwMDAwMDAgKi8KK0xwMSA9IDYuNjY2NjY2ODY1M2UtMDEsCS8qIDNGMkFBQUFCICovCitMcDIgPSA0LjAwMDAwMDA1OTZlLTAxLAkvKiAzRUNDQ0NDRCAqLworTHAzID0gMi44NTcxNDI5ODQ5ZS0wMSwgLyogM0U5MjQ5MjUgKi8KK0xwNCA9IDIuMjIyMjE5ODU0NmUtMDEsIC8qIDNFNjM4RTI5ICovCitMcDUgPSAxLjgxODM1NzI1OTBlLTAxLCAvKiAzRTNBMzMyNSAqLworTHA2ID0gMS41MzEzODM4NDIyZS0wMSwgLyogM0UxQ0QwNEYgKi8KK0xwNyA9IDEuNDc5ODE5ODY0MGUtMDE7IC8qIDNFMTc4ODk3ICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvID0gMC4wOworCitmbG9hdAorbG9nMXBmKGZsb2F0IHgpCit7CisJZmxvYXQgaGZzcSxmLGMscyx6LFIsdTsKKwlpbnQzMl90IGssaHgsaHUsYXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlheCA9IGh4JjB4N2ZmZmZmZmY7CisKKwlrID0gMTsKKwlpZiAoaHggPCAweDNlZDQxM2QwKSB7CQkJLyogMSt4IDwgc3FydCgyKSsgICovCisJICAgIGlmKGF4Pj0weDNmODAwMDAwKSB7CQkvKiB4IDw9IC0xLjAgKi8KKwkJaWYoeD09KGZsb2F0KS0xLjApIHJldHVybiAtdHdvMjUvemVybzsgLyogbG9nMXAoLTEpPStpbmYgKi8KKwkJZWxzZSByZXR1cm4gKHgteCkvKHgteCk7CS8qIGxvZzFwKHg8LTEpPU5hTiAqLworCSAgICB9CisJICAgIGlmKGF4PDB4MzEwMDAwMDApIHsJCQkvKiB8eHwgPCAyKiotMjkgKi8KKwkJaWYodHdvMjUreD56ZXJvCQkJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICAgICAgICAgICYmYXg8MHgyNDgwMDAwMCkgCQkvKiB8eHwgPCAyKiotNTQgKi8KKwkJICAgIHJldHVybiB4OworCQllbHNlCisJCSAgICByZXR1cm4geCAtIHgqeCooZmxvYXQpMC41OworCSAgICB9CisJICAgIGlmKGh4PjB8fGh4PD0oKGludDMyX3QpMHhiZTk1ZjYxOSkpIHsKKwkJaz0wO2Y9eDtodT0xO30JCS8qIHNxcnQoMikvMi0gPD0gMSt4IDwgc3FydCgyKSsgKi8KKwl9CisJaWYgKGh4ID49IDB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJaWYoayE9MCkgeworCSAgICBpZihoeDwweDVhMDAwMDAwKSB7CisJCSoodm9sYXRpbGUgZmxvYXQgKikmdSA9IChmbG9hdCkxLjAreDsKKwkJR0VUX0ZMT0FUX1dPUkQoaHUsdSk7CisJICAgICAgICBrICA9IChodT4+MjMpLTEyNzsKKwkJLyogY29ycmVjdGlvbiB0ZXJtICovCisJICAgICAgICBjICA9IChrPjApPyAoZmxvYXQpMS4wLSh1LXgpOngtKHUtKGZsb2F0KTEuMCk7CisJCWMgLz0gdTsKKwkgICAgfSBlbHNlIHsKKwkJdSAgPSB4OworCQlHRVRfRkxPQVRfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMyktMTI3OworCQljICA9IDA7CisJICAgIH0KKwkgICAgaHUgJj0gMHgwMDdmZmZmZjsKKwkgICAgLyoKKwkgICAgICogVGhlIGFwcHJveGltYXRpb24gdG8gc3FydCgyKSB1c2VkIGluIHRocmVzaG9sZHMgaXMgbm90CisJICAgICAqIGNyaXRpY2FsLiAgSG93ZXZlciwgdGhlIG9uZXMgdXNlZCBhYm92ZSBtdXN0IGdpdmUgbGVzcworCSAgICAgKiBzdHJpY3QgYm91bmRzIHRoYW4gdGhlIG9uZSBoZXJlIHNvIHRoYXQgdGhlIGs9PTAgY2FzZSBpcworCSAgICAgKiBuZXZlciByZWFjaGVkIGZyb20gaGVyZSwgc2luY2UgaGVyZSB3ZSBoYXZlIGNvbW1pdHRlZCB0bworCSAgICAgKiB1c2luZyB0aGUgY29ycmVjdGlvbiB0ZXJtIGJ1dCBkb24ndCB1c2UgaXQgaWYgaz09MC4KKwkgICAgICovCisJICAgIGlmKGh1PDB4MzUwNGY0KSB7CQkJLyogdSA8IHNxcnQoMikgKi8KKwkgICAgICAgIFNFVF9GTE9BVF9XT1JEKHUsaHV8MHgzZjgwMDAwMCk7Lyogbm9ybWFsaXplIHUgKi8KKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGsgKz0gMTsKKwkJU0VUX0ZMT0FUX1dPUkQodSxodXwweDNmMDAwMDAwKTsJLyogbm9ybWFsaXplIHUvMiAqLworCSAgICAgICAgaHUgPSAoMHgwMDgwMDAwMC1odSk+PjI7CisJICAgIH0KKwkgICAgZiA9IHUtKGZsb2F0KTEuMDsKKwl9CisJaGZzcT0oZmxvYXQpMC41KmYqZjsKKwlpZihodT09MCkgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87CisJCQllbHNlIHtjICs9IGsqbG4yX2xvOyByZXR1cm4gaypsbjJfaGkrYzt9CisJICAgIFIgPSBoZnNxKigoZmxvYXQpMS4wLShmbG9hdCkwLjY2NjY2NjY2NjY2NjY2NjY2KmYpOworCSAgICBpZihrPT0wKSByZXR1cm4gZi1SOyBlbHNlCisJICAgIAkgICAgIHJldHVybiBrKmxuMl9oaS0oKFItKGsqbG4yX2xvK2MpKS1mKTsKKwl9CisgCXMgPSBmLygoZmxvYXQpMi4wK2YpOworCXogPSBzKnM7CisJUiA9IHoqKExwMSt6KihMcDIreiooTHAzK3oqKExwNCt6KihMcDUreiooTHA2K3oqTHA3KSkpKSkpOworCWlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSByZXR1cm4gaypsbjJfaGktKChoZnNxLShzKihoZnNxK1IpKyhrKmxuMl9sbytjKSkpLWYpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2diLmMgYi9saWJtL3NyYy9zX2xvZ2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGVkYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sb2diLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQCgjKXNfbG9nYi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sb2diLmMsdiAxLjEwIDIwMDUvMTIvMDMgMTE6NTc6MTkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZG91YmxlIGxvZ2IoeCkKKyAqIElFRUUgNzU0IGxvZ2IuIEluY2x1ZGVkIHRvIHBhc3MgSUVFRSB0ZXN0IHN1aXRlLiBOb3QgcmVjb21tZW5kLgorICogVXNlIGlsb2diIGluc3RlYWQuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgPSAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNjsJLyogNDM1MDAwMDAgMDAwMDAwMDAgKi8KKworZG91YmxlCitsb2diKGRvdWJsZSB4KQoreworCWludDMyX3QgbHgsaXg7CisJRVhUUkFDVF9XT1JEUyhpeCxseCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOwkJCS8qIGhpZ2ggfHh8ICovCisJaWYoKGl4fGx4KT09MCkgcmV0dXJuIC0xLjAvZmFicyh4KTsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgqeDsKKwlpZihpeDwweDAwMTAwMDAwKSB7CisJCXggKj0gdHdvNTQ7CQkgLyogY29udmVydCBzdWJub3JtYWwgeCB0byBub3JtYWwgKi8KKwkJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJCWl4ICY9IDB4N2ZmZmZmZmY7CisJCXJldHVybiAoZmxvYXQpICgoaXg+PjIwKS0xMDIzLTU0KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChkb3VibGUpICgoaXg+PjIwKS0xMDIzKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbG9nYmYuYyBiL2xpYm0vc3JjL3NfbG9nYmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQ5MjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sb2diZi5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHNfbG9nYmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfbG9nYi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sb2diZi5jLHYgMS44IDIwMDUvMTIvMDMgMTE6NTc6MTkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzI1ID0gMy4zNTU0NDMyMDBlKzA3OwkJLyogMHg0YzAwMDAwMCAqLworCitmbG9hdAorbG9nYmYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CQkJLyogaGlnaCB8eHwgKi8KKwlpZihpeD09MCkgcmV0dXJuIChmbG9hdCktMS4wL2ZhYnNmKHgpOworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCp4OworCWlmKGl4PDB4MDA4MDAwMDApIHsKKwkJeCAqPSB0d28yNTsJCSAvKiBjb252ZXJ0IHN1Ym5vcm1hbCB4IHRvIG5vcm1hbCAqLworCQlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkJaXggJj0gMHg3ZmZmZmZmZjsKKwkJcmV0dXJuIChmbG9hdCkgKChpeD4+MjMpLTEyNy0yNSk7CisJfSBlbHNlCisJCXJldHVybiAoZmxvYXQpICgoaXg+PjIzKS0xMjcpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scmludC5jIGIvbGlibS9zcmMvc19scmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTA5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyaW50LmMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2lmbmRlZiB0eXBlCisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19scmludC5jLHYgMS4xIDIwMDUvMDEvMTEgMjM6MTI6NTUgZGFzIEV4cCAkIik7ICovCisjZGVmaW5lIHR5cGUJCWRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyaW50CisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCWZuCQlscmludAorI2VuZGlmCisKKy8qCisgKiBDOTkgc2F5cyB3ZSBzaG91bGQgbm90IHJhaXNlIGEgc3B1cmlvdXMgaW5leGFjdCBleGNlcHRpb24gd2hlbiBhbgorICogaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLiAgVW5mb3J0dW5hdGVseSwgdGhlIHNldCBvZiBpbnB1dHMKKyAqIHRoYXQgb3ZlcmZsb3dzIGRlcGVuZHMgb24gdGhlIHJvdW5kaW5nIG1vZGUgd2hlbiAnZHR5cGUnIGhhcyBtb3JlCisgKiBzaWduaWZpY2FudCBiaXRzIHRoYW4gJ3R5cGUnLiAgSGVuY2UsIHdlIGJlbmQgb3ZlciBiYWNrd2FyZHMgZm9yIHRoZQorICogc2FrZSBvZiBjb3JyZWN0bmVzczsgYW4gTUQgaW1wbGVtZW50YXRpb24gY291bGQgYmUgbW9yZSBlZmZpY2llbnQuCisgKi8KK2R0eXBlCitmbih0eXBlIHgpCit7CisJZmVudl90IGVudjsKKwlkdHlwZSBkOworCisJZmVob2xkZXhjZXB0KCZlbnYpOworCWQgPSAoZHR5cGUpcm91bmRpdCh4KTsKKwlpZiAoZmV0ZXN0ZXhjZXB0KEZFX0lOVkFMSUQpKQorCQlmZWNsZWFyZXhjZXB0KEZFX0lORVhBQ1QpOworCWZldXBkYXRlZW52KCZlbnYpOworCXJldHVybiAoZCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyaW50Zi5jIGIvbGlibS9zcmMvc19scmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjU4ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scmludGYuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyaW50Zi5jLHYgMS4xIDIwMDUvMDEvMTEgMjM6MTI6NTUgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZmxvYXQKKyNkZWZpbmUJcm91bmRpdAkJcmludGYKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJZm4JCWxyaW50ZgorCisjaW5jbHVkZSAic19scmludC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scm91bmQuYyBiL2xpYm0vc3JjL3NfbHJvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5ZjQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJvdW5kLmMKQEAgLTAsMCArMSw2NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2lmbmRlZiB0eXBlCisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19scm91bmQuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjE2IGRhcyBFeHAgJCIpOyAqLworI2RlZmluZSB0eXBlCQlkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmQKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HX01BWAorI2RlZmluZQlmbgkJbHJvdW5kCisjZW5kaWYKKworLyoKKyAqIElmIHR5cGUgaGFzIG1vcmUgcHJlY2lzaW9uIHRoYW4gZHR5cGUsIHRoZSBlbmRwb2ludHMgZHR5cGVfKG1pbnxtYXgpIGFyZQorICogb2YgdGhlIGZvcm0geHh4LjU7IHRoZXkgYXJlICJvdXQgb2YgcmFuZ2UiIGJlY2F1c2UgbHJvdW5kKCkgcm91bmRzIGF3YXkKKyAqIGZyb20gMC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0eXBlIGhhcyBsZXNzIHByZWNpc2lvbiB0aGFuIGR0eXBlLCB0aGVuCisgKiBhbGwgdmFsdWVzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaW50ZWdyYWwsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgYXNzdW1lCisgKiB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4gcmFuZ2UuICBBdCBjb21waWxlIHRpbWUsIElOUkFOR0UoeCkgc2hvdWxkIHJlZHVjZSB0bworICogdHdvIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb25zIGluIHRoZSBmb3JtZXIgY2FzZSwgb3IgVFJVRSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBjb25zdCB0eXBlIGR0eXBlX21pbiA9IERUWVBFX01JTiAtIDAuNTsKK3N0YXRpYyBjb25zdCB0eXBlIGR0eXBlX21heCA9IERUWVBFX01BWCArIDAuNTsKKyNkZWZpbmUJSU5SQU5HRSh4KQkoZHR5cGVfbWF4IC0gRFRZUEVfTUFYICE9IDAuNSB8fCBcCisJCQkgKCh4KSA+IGR0eXBlX21pbiAmJiAoeCkgPCBkdHlwZV9tYXgpKQorCitkdHlwZQorZm4odHlwZSB4KQoreworCisJaWYgKElOUkFOR0UoeCkpIHsKKwkJeCA9IHJvdW5kaXQoeCk7CisJCXJldHVybiAoKGR0eXBlKXgpOworCX0gZWxzZSB7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisJCXJldHVybiAoRFRZUEVfTUFYKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyb3VuZGYuYyBiL2xpYm0vc3JjL3NfbHJvdW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjljOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyb3VuZGYuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19scm91bmRmLmMsdiAxLjIgMjAwNS8wNC8wOCAwMDo1MjoyNyBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlmbG9hdAorI2RlZmluZQlyb3VuZGl0CQlyb3VuZGYKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdfTUlOCisjZGVmaW5lCURUWVBFX01BWAlMT05HX01BWAorI2RlZmluZQlmbgkJbHJvdW5kZgorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJvdW5kbC5jIGIvbGlibS9zcmMvc19scm91bmRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzZjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJvdW5kbC5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyb3VuZGwuYyx2IDEuMSAyMDA1LzA0LzA4IDAxOjI0OjA4IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWxvbmcgZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kbAorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdfTUFYCisjZGVmaW5lCWZuCQlscm91bmRsCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19tb2RmLmMgYi9saWJtL3NyYy9zX21vZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNmYmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19tb2RmLmMKQEAgLTAsMCArMSw3NSBAQAorLyogQCgjKXNfbW9kZi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19tb2RmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBtb2RmKGRvdWJsZSB4LCBkb3VibGUgKmlwdHIpCisgKiByZXR1cm4gZnJhY3Rpb24gcGFydCBvZiB4LCBhbmQgcmV0dXJuIHgncyBpbnRlZ3JhbCBwYXJ0IGluICppcHRyLgorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqCisgKiBFeGNlcHRpb246CisgKglObyBleGNlcHRpb24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmUgPSAxLjA7CisKK2RvdWJsZQorbW9kZihkb3VibGUgeCwgZG91YmxlICppcHRyKQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGk7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlqMCA9ICgoaTA+PjIwKSYweDdmZiktMHgzZmY7CS8qIGV4cG9uZW50IG9mIHggKi8KKwlpZihqMDwyMCkgewkJCS8qIGludGVnZXIgcGFydCBpbiBoaWdoIHggKi8KKwkgICAgaWYoajA8MCkgewkJCS8qIHx4fDwxICovCisJICAgICAgICBJTlNFUlRfV09SRFMoKmlwdHIsaTAmMHg4MDAwMDAwMCwwKTsJLyogKmlwdHIgPSArLTAgKi8KKwkJcmV0dXJuIHg7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgewkJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkgICAgdV9pbnQzMl90IGhpZ2g7CisJCSAgICAqaXB0ciA9IHg7CisJCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gseCk7CisJCSAgICBJTlNFUlRfV09SRFMoeCxoaWdoJjB4ODAwMDAwMDAsMCk7CS8qIHJldHVybiArLTAgKi8KKwkJICAgIHJldHVybiB4OworCQl9IGVsc2UgeworCQkgICAgSU5TRVJUX1dPUkRTKCppcHRyLGkwJih+aSksMCk7CisJCSAgICByZXR1cm4geCAtICppcHRyOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKGowPjUxKSB7CQkvKiBubyBmcmFjdGlvbiBwYXJ0ICovCisJICAgIHVfaW50MzJfdCBoaWdoOworCSAgICAqaXB0ciA9IHgqb25lOworCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gseCk7CisJICAgIElOU0VSVF9XT1JEUyh4LGhpZ2gmMHg4MDAwMDAwMCwwKTsJLyogcmV0dXJuICstMCAqLworCSAgICByZXR1cm4geDsKKwl9IGVsc2UgewkJCS8qIGZyYWN0aW9uIHBhcnQgaW4gbG93IHggKi8KKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgeyAJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCQkqaXB0ciA9IHg7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwkJSU5TRVJUX1dPUkRTKHgsaGlnaCYweDgwMDAwMDAwLDApOwkvKiByZXR1cm4gKy0wICovCisJCXJldHVybiB4OworCSAgICB9IGVsc2UgeworCSAgICAgICAgSU5TRVJUX1dPUkRTKCppcHRyLGkwLGkxJih+aSkpOworCQlyZXR1cm4geCAtICppcHRyOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19tb2RmZi5jIGIvbGlibS9zcmMvc19tb2RmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzVmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX21vZGZmLmMKQEAgLTAsMCArMSw1NiBAQAorLyogc19tb2RmZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19tb2RmLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX21vZGZmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBvbmUgPSAxLjA7CisKK2Zsb2F0Cittb2RmZihmbG9hdCB4LCBmbG9hdCAqaXB0cikKK3sKKwlpbnQzMl90IGkwLGowOworCXVfaW50MzJfdCBpOworCUdFVF9GTE9BVF9XT1JEKGkwLHgpOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CS8qIGV4cG9uZW50IG9mIHggKi8KKwlpZihqMDwyMykgewkJCS8qIGludGVnZXIgcGFydCBpbiB4ICovCisJICAgIGlmKGowPDApIHsJCQkvKiB8eHw8MSAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQoKmlwdHIsaTAmMHg4MDAwMDAwMCk7CS8qICppcHRyID0gKy0wICovCisJCXJldHVybiB4OworCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDA3ZmZmZmYpPj5qMDsKKwkJaWYoKGkwJmkpPT0wKSB7CQkJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkgICAgdV9pbnQzMl90IGl4OworCQkgICAgKmlwdHIgPSB4OworCQkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJCSAgICBTRVRfRkxPQVRfV09SRCh4LGl4JjB4ODAwMDAwMDApOwkvKiByZXR1cm4gKy0wICovCisJCSAgICByZXR1cm4geDsKKwkJfSBlbHNlIHsKKwkJICAgIFNFVF9GTE9BVF9XT1JEKCppcHRyLGkwJih+aSkpOworCQkgICAgcmV0dXJuIHggLSAqaXB0cjsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsJCQkvKiBubyBmcmFjdGlvbiBwYXJ0ICovCisJICAgIHVfaW50MzJfdCBpeDsKKwkgICAgKmlwdHIgPSB4Km9uZTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHgsaXgmMHg4MDAwMDAwMCk7CS8qIHJldHVybiArLTAgKi8KKwkgICAgcmV0dXJuIHg7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZWFyYnlpbnQuYyBiL2xpYm0vc3JjL3NfbmVhcmJ5aW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZDMyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmVhcmJ5aW50LmMKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZWFyYnlpbnQuYyx2IDEuMSAyMDA0LzA3LzA2IDA0OjQ2OjA4IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyoKKyAqIFdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IHRvIGF2b2lkIHJhaXNpbmcKKyAqIGFuIGluZXhhY3QgZXhjZXB0aW9uLiAgV2UgY2FuIGdldCBhd2F5IHdpdGggdXNpbmcgZmVzZXRlbnYoKQorICogaW5zdGVhZCBvZiBmZWNsZWFyZXhjZXB0KCkvZmV1cGRhdGVlbnYoKSB0byByZXN0b3JlIHRoZSBlbnZpcm9ubWVudAorICogYmVjYXVzZSB0aGUgb25seSBleGNlcHRpb24gZGVmaW5lZCBmb3IgcmludCgpIGlzIG92ZXJmbG93LCBhbmQKKyAqIHJvdW5kaW5nIGNhbid0IG92ZXJmbG93IGFzIGxvbmcgYXMgZW1heCA+PSBwLgorICovCisjZGVmaW5lCURFQ0wodHlwZSwgZm4sIHJpbnQpCVwKK3R5cGUJCQkJXAorZm4odHlwZSB4KQkJCVwKK3sJCQkJXAorCXR5cGUgcmV0OwkJXAorCWZlbnZfdCBlbnY7CQlcCisJCQkJXAorCWZlZ2V0ZW52KCZlbnYpOwkJXAorCXJldCA9IHJpbnQoeCk7CQlcCisJZmVzZXRlbnYoJmVudik7CQlcCisJcmV0dXJuIChyZXQpOwkJXAorfQorCitERUNMKGRvdWJsZSwgbmVhcmJ5aW50LCByaW50KQorREVDTChmbG9hdCwgbmVhcmJ5aW50ZiwgcmludGYpCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHRhZnRlci5jIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQwMzYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXIuYwpAQCAtMCwwICsxLDg1IEBACisvKiBAKCMpc19uZXh0YWZ0ZXIuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dGFmdGVyLmMsdiAxLjExIDIwMDUvMDMvMDcgMjE6Mjc6MzcgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBJRUVFIGZ1bmN0aW9ucworICoJbmV4dGFmdGVyKHgseSkKKyAqCXJldHVybiB0aGUgbmV4dCBtYWNoaW5lIGZsb2F0aW5nLXBvaW50IG51bWJlciBvZiB4IGluIHRoZQorICoJZGlyZWN0aW9uIHRvd2FyZCB5LgorICogICBTcGVjaWFsIGNhc2VzOgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK25leHRhZnRlcihkb3VibGUgeCwgZG91YmxlIHkpCit7CisJdm9sYXRpbGUgZG91YmxlIHQ7CisJaW50MzJfdCBoeCxoeSxpeCxpeTsKKwl1X2ludDMyX3QgbHgsbHk7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJaXggPSBoeCYweDdmZmZmZmZmOwkJLyogfHh8ICovCisJaXkgPSBoeSYweDdmZmZmZmZmOwkJLyogfHl8ICovCisKKwlpZigoKGl4Pj0weDdmZjAwMDAwKSYmKChpeC0weDdmZjAwMDAwKXxseCkhPTApIHx8ICAgLyogeCBpcyBuYW4gKi8KKwkgICAoKGl5Pj0weDdmZjAwMDAwKSYmKChpeS0weDdmZjAwMDAwKXxseSkhPTApKSAgICAgLyogeSBpcyBuYW4gKi8KKwkgICByZXR1cm4geCt5OworCWlmKHg9PXkpIHJldHVybiB5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKChpeHxseCk9PTApIHsJCQkvKiB4ID09IDAgKi8KKwkgICAgSU5TRVJUX1dPUkRTKHgsaHkmMHg4MDAwMDAwMCwxKTsJLyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD49MCkgewkJCQkvKiB4ID4gMCAqLworCSAgICBpZihoeD5oeXx8KChoeD09aHkpJiYobHg+bHkpKSkgewkvKiB4ID4geSwgeCAtPSB1bHAgKi8KKwkJaWYobHg9PTApIGh4IC09IDE7CisJCWx4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPCB5LCB4ICs9IHVscCAqLworCQlseCArPSAxOworCQlpZihseD09MCkgaHggKz0gMTsKKwkgICAgfQorCX0gZWxzZSB7CQkJCS8qIHggPCAwICovCisJICAgIGlmKGh5Pj0wfHxoeD5oeXx8KChoeD09aHkpJiYobHg+bHkpKSl7LyogeCA8IHksIHggLT0gdWxwICovCisJCWlmKGx4PT0wKSBoeCAtPSAxOworCQlseCAtPSAxOworCSAgICB9IGVsc2UgewkJCQkvKiB4ID4geSwgeCArPSB1bHAgKi8KKwkJbHggKz0gMTsKKwkJaWYobHg9PTApIGh4ICs9IDE7CisJICAgIH0KKwl9CisJaHkgPSBoeCYweDdmZjAwMDAwOworCWlmKGh5Pj0weDdmZjAwMDAwKSByZXR1cm4geCt4OwkvKiBvdmVyZmxvdyAgKi8KKwlpZihoeTwweDAwMTAwMDAwKSB7CQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodCE9eCkgewkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkgICAgICAgIElOU0VSVF9XT1JEUyh5LGh4LGx4KTsKKwkJcmV0dXJuIHk7CisJICAgIH0KKwl9CisJSU5TRVJUX1dPUkRTKHgsaHgsbHgpOworCXJldHVybiB4OworfQorCisjaWYgKExEQkxfTUFOVF9ESUcgPT0gNTMpCitfX3dlYWtfcmVmZXJlbmNlKG5leHRhZnRlciwgbmV4dHRvd2FyZCk7CitfX3dlYWtfcmVmZXJlbmNlKG5leHRhZnRlciwgbmV4dHRvd2FyZGwpOworX193ZWFrX3JlZmVyZW5jZShuZXh0YWZ0ZXIsIG5leHRhZnRlcmwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHRhZnRlcmYuYyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWFjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHRhZnRlcmYuYwpAQCAtMCwwICsxLDY3IEBACisvKiBzX25leHRhZnRlcmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfbmV4dGFmdGVyLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHRhZnRlcmYuYyx2IDEuMTAgMjAwNS8wMy8wNyAwNDo1NTo1OCBkYXMgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CituZXh0YWZ0ZXJmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJdm9sYXRpbGUgZmxvYXQgdDsKKwlpbnQzMl90IGh4LGh5LGl4LGl5OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJaXggPSBoeCYweDdmZmZmZmZmOwkJLyogfHh8ICovCisJaXkgPSBoeSYweDdmZmZmZmZmOwkJLyogfHl8ICovCisKKwlpZigoaXg+MHg3ZjgwMDAwMCkgfHwgICAvKiB4IGlzIG5hbiAqLworCSAgIChpeT4weDdmODAwMDAwKSkgICAgIC8qIHkgaXMgbmFuICovCisJICAgcmV0dXJuIHgreTsKKwlpZih4PT15KSByZXR1cm4geTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZihpeD09MCkgewkJCQkvKiB4ID09IDAgKi8KKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCwoaHkmMHg4MDAwMDAwMCl8MSk7LyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD49MCkgewkJCQkvKiB4ID4gMCAqLworCSAgICBpZihoeD5oeSkgewkJCQkvKiB4ID4geSwgeCAtPSB1bHAgKi8KKwkJaHggLT0gMTsKKwkgICAgfSBlbHNlIHsJCQkJLyogeCA8IHksIHggKz0gdWxwICovCisJCWh4ICs9IDE7CisJICAgIH0KKwl9IGVsc2UgewkJCQkvKiB4IDwgMCAqLworCSAgICBpZihoeT49MHx8aHg+aHkpewkJCS8qIHggPCB5LCB4IC09IHVscCAqLworCQloeCAtPSAxOworCSAgICB9IGVsc2UgewkJCQkvKiB4ID4geSwgeCArPSB1bHAgKi8KKwkJaHggKz0gMTsKKwkgICAgfQorCX0KKwloeSA9IGh4JjB4N2Y4MDAwMDA7CisJaWYoaHk+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGh5PDB4MDA4MDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQoeSxoeCk7CisJCXJldHVybiB5OworCSAgICB9CisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaHgpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0YWZ0ZXJsLmMgYi9saWJtL3NyYy9zX25leHRhZnRlcmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNmZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXJsLmMKQEAgLTAsMCArMSw4MiBAQAorLyogQCgjKXNfbmV4dGFmdGVyLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHRhZnRlcmwuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU2OjQ2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogSUVFRSBmdW5jdGlvbnMKKyAqCW5leHRhZnRlcih4LHkpCisgKglyZXR1cm4gdGhlIG5leHQgbWFjaGluZSBmbG9hdGluZy1wb2ludCBudW1iZXIgb2YgeCBpbiB0aGUKKyAqCWRpcmVjdGlvbiB0b3dhcmQgeS4KKyAqICAgU3BlY2lhbCBjYXNlczoKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK2xvbmcgZG91YmxlCituZXh0YWZ0ZXJsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdm9sYXRpbGUgbG9uZyBkb3VibGUgdDsKKwl1bmlvbiBJRUVFbDJiaXRzIHV4LCB1eTsKKworCXV4LmUgPSB4OworCXV5LmUgPSB5OworCisJaWYgKCh1eC5iaXRzLmV4cCA9PSAweDdmZmYgJiYKKwkgICAgICgodXguYml0cy5tYW5oJn5MREJMX05CSVQpfHV4LmJpdHMubWFubCkgIT0gMCkgfHwKKwkgICAgKHV5LmJpdHMuZXhwID09IDB4N2ZmZiAmJgorCSAgICAgKCh1eS5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXkuYml0cy5tYW5sKSAhPSAwKSkKKwkgICByZXR1cm4geCt5OwkvKiB4IG9yIHkgaXMgbmFuICovCisJaWYoeD09eSkgcmV0dXJuIHk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoeD09MC4wKSB7CisJICAgIHV4LmJpdHMubWFuaCA9IDA7CQkJLyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHV4LmJpdHMubWFubCA9IDE7CisJICAgIHV4LmJpdHMuc2lnbiA9IHV5LmJpdHMuc2lnbjsKKwkgICAgdCA9IHV4LmUqdXguZTsKKwkgICAgaWYodD09dXguZSkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHV4LmU7IC8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKHg+MC4wIF4geDx5KSB7CQkJLyogeCAtPSB1bHAgKi8KKwkgICAgaWYodXguYml0cy5tYW5sPT0wKSB7CisJCWlmICgodXguYml0cy5tYW5oJn5MREJMX05CSVQpPT0wKQorCQkgICAgdXguYml0cy5leHAgLT0gMTsKKwkJdXguYml0cy5tYW5oID0gKHV4LmJpdHMubWFuaCAtIDEpIHwgKHV4LmJpdHMubWFuaCAmIExEQkxfTkJJVCk7CisJICAgIH0KKwkgICAgdXguYml0cy5tYW5sIC09IDE7CisJfSBlbHNlIHsJCQkJLyogeCArPSB1bHAgKi8KKwkgICAgdXguYml0cy5tYW5sICs9IDE7CisJICAgIGlmKHV4LmJpdHMubWFubD09MCkgeworCQl1eC5iaXRzLm1hbmggPSAodXguYml0cy5tYW5oICsgMSkgfCAodXguYml0cy5tYW5oICYgTERCTF9OQklUKTsKKwkJaWYgKCh1eC5iaXRzLm1hbmgmfkxEQkxfTkJJVCk9PTApCisJCSAgICB1eC5iaXRzLmV4cCArPSAxOworCSAgICB9CisJfQorCWlmKHV4LmJpdHMuZXhwPT0weDdmZmYpIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKHV4LmJpdHMuZXhwPT0wKSB7CQkJLyogdW5kZXJmbG93ICovCisJICAgIG1hc2tfbmJpdF9sKHV4KTsKKwkgICAgdCA9IHV4LmUgKiB1eC5lOworCSAgICBpZih0IT11eC5lKQkJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJCXJldHVybiB1eC5lOworCX0KKwlyZXR1cm4gdXguZTsKK30KKworX19zdHJvbmdfcmVmZXJlbmNlKG5leHRhZnRlcmwsIG5leHR0b3dhcmRsKTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dHRvd2FyZC5jIGIvbGlibS9zcmMvc19uZXh0dG93YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkYTRhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dHRvd2FyZC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEAoIylzX25leHRhZnRlci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0dG93YXJkLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Njo0NiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBXZSBhc3N1bWUgdGhhdCBhIGxvbmcgZG91YmxlIGhhcyBhIDE1LWJpdCBleHBvbmVudC4gIE9uIHN5c3RlbXMKKyAqIHdoZXJlIGxvbmcgZG91YmxlIGlzIHRoZSBzYW1lIGFzIGRvdWJsZSwgbmV4dHRvd2FyZCgpIGlzIGFuIGFsaWFzCisgKiBmb3IgbmV4dGFmdGVyKCksIHNvIHdlIGRvbid0IHVzZSB0aGlzIHJvdXRpbmUuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZiBMREJMX01BWF9FWFAgIT0gMHg0MDAwCisjZXJyb3IgIlVuc3VwcG9ydGVkIGxvbmcgZG91YmxlIGZvcm1hdCIKKyNlbmRpZgorCitkb3VibGUKK25leHR0b3dhcmQoZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1eTsKKwl2b2xhdGlsZSBkb3VibGUgdDsKKwlpbnQzMl90IGh4LGl4OworCXVfaW50MzJfdCBseDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOwkJLyogfHh8ICovCisJdXkuZSA9IHk7CisKKwlpZigoKGl4Pj0weDdmZjAwMDAwKSYmKChpeC0weDdmZjAwMDAwKXxseCkhPTApIHx8CisJICAgICh1eS5iaXRzLmV4cCA9PSAweDdmZmYgJiYKKwkgICAgICgodXkuYml0cy5tYW5oJn5MREJMX05CSVQpfHV5LmJpdHMubWFubCkgIT0gMCkpCisJICAgcmV0dXJuIHgreTsJLyogeCBvciB5IGlzIG5hbiAqLworCWlmKHg9PXkpIHJldHVybiAoZG91YmxlKXk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoeD09MC4wKSB7CisJICAgIElOU0VSVF9XT1JEUyh4LHV5LmJpdHMuc2lnbjw8MzEsMSk7CS8qIHJldHVybiArLW1pbnN1Ym5vcm1hbCAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0PT14KSByZXR1cm4gdDsgZWxzZSByZXR1cm4geDsJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoaHg+MC4wIF4geCA8IHkpIHsJCQkvKiB4IC09IHVscCAqLworCSAgICBpZihseD09MCkgaHggLT0gMTsKKwkgICAgbHggLT0gMTsKKwl9IGVsc2UgewkJCQkvKiB4ICs9IHVscCAqLworCSAgICBseCArPSAxOworCSAgICBpZihseD09MCkgaHggKz0gMTsKKwl9CisJaXggPSBoeCYweDdmZjAwMDAwOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCt4OwkvKiBvdmVyZmxvdyAgKi8KKwlpZihpeDwweDAwMTAwMDAwKSB7CQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodCE9eCkgewkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkgICAgICAgIElOU0VSVF9XT1JEUyh5LGh4LGx4KTsKKwkJcmV0dXJuIHk7CisJICAgIH0KKwl9CisJSU5TRVJUX1dPUkRTKHgsaHgsbHgpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0dG93YXJkZi5jIGIvbGlibS9zcmMvc19uZXh0dG93YXJkZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTU2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHR0b3dhcmRmLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0dG93YXJkZi5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTc6MzggZGFzIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2RlZmluZQlMREJMX0lORk5BTl9FWFAJKExEQkxfTUFYX0VYUCAqIDIgLSAxKQorCitmbG9hdAorbmV4dHRvd2FyZGYoZmxvYXQgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHV5OworCXZvbGF0aWxlIGZsb2F0IHQ7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsJCS8qIHx4fCAqLworCXV5LmUgPSB5OworCisJaWYoKGl4PjB4N2Y4MDAwMDApIHx8CisJICAgKHV5LmJpdHMuZXhwID09IExEQkxfSU5GTkFOX0VYUCAmJgorCSAgICAoKHV5LmJpdHMubWFuaCZ+TERCTF9OQklUKXx1eS5iaXRzLm1hbmwpICE9IDApKQorCSAgIHJldHVybiB4K3k7CS8qIHggb3IgeSBpcyBuYW4gKi8KKwlpZih4PT15KSByZXR1cm4gKGZsb2F0KXk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoaXg9PTApIHsJCQkJLyogeCA9PSAwICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHgsKHV5LmJpdHMuc2lnbjw8MzEpfDEpOy8qIHJldHVybiArLW1pbnN1Ym5vcm1hbCAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0PT14KSByZXR1cm4gdDsgZWxzZSByZXR1cm4geDsJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoaHg+PTAgXiB4IDwgeSkJCQkvKiB4IC09IHVscCAqLworCSAgICBoeCAtPSAxOworCWVsc2UJCQkJCS8qIHggKz0gdWxwICovCisJICAgIGh4ICs9IDE7CisJaXggPSBoeCYweDdmODAwMDAwOworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCt4OwkvKiBvdmVyZmxvdyAgKi8KKwlpZihpeDwweDAwODAwMDAwKSB7CQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodCE9eCkgewkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkgICAgICAgIFNFVF9GTE9BVF9XT1JEKHksaHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlTRVRfRkxPQVRfV09SRCh4LGh4KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfcmVtcXVvLmMgYi9saWJtL3NyYy9zX3JlbXF1by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JlbXF1by5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiBAKCMpZV9mbW9kLmMgMS4zIDk1LzAxLzE4ICovCisvKi0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JlbXF1by5jLHYgMS4xIDIwMDUvMDMvMjUgMDQ6NDA6NDQgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCisvKgorICogUmV0dXJuIHRoZSBJRUVFIHJlbWFpbmRlciBhbmQgc2V0ICpxdW8gdG8gdGhlIGxhc3QgbiBiaXRzIG9mIHRoZQorICogcXVvdGllbnQsIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gIFdlIGNob29zZSBuPTMxIGJlY2F1c2UKKyAqIHdlIHdpbmQgdXAgY29tcHV0aW5nIGFsbCB0aGUgaW50ZWdlciBiaXRzIG9mIHRoZSBxdW90aWVudCBhbnl3YXkgYXMKKyAqIGEgc2lkZS1lZmZlY3Qgb2YgY29tcHV0aW5nIHRoZSByZW1haW5kZXIgYnkgdGhlIHNoaWZ0IGFuZCBzdWJ0cmFjdAorICogbWV0aG9kLiAgSW4gcHJhY3RpY2UsIHRoaXMgaXMgZmFyIG1vcmUgYml0cyB0aGFuIGFyZSBuZWVkZWQgdG8gdXNlCisgKiByZW1xdW8gaW4gcmVkdWN0aW9uIGFsZ29yaXRobXMuCisgKi8KK2RvdWJsZQorcmVtcXVvKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50ICpxdW8pCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisJdV9pbnQzMl90IGx4LGx5LGx6LHEsc3h5OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlFWFRSQUNUX1dPUkRTKGh5LGx5LHkpOworCXN4eSA9IChoeCBeIGh5KSAmIDB4ODAwMDAwMDA7CisJc3ggPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBvZiB4ICovCisJaHggXj1zeDsJCS8qIHx4fCAqLworCWh5ICY9IDB4N2ZmZmZmZmY7CS8qIHx5fCAqLworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZigoaHl8bHkpPT0wfHwoaHg+PTB4N2ZmMDAwMDApfHwJLyogeT0wLG9yIHggbm90IGZpbml0ZSAqLworCSAgKChoeXwoKGx5fC1seSk+PjMxKSk+MHg3ZmYwMDAwMCkpCS8qIG9yIHkgaXMgTmFOICovCisJICAgIHJldHVybiAoeCp5KS8oeCp5KTsKKwlpZihoeDw9aHkpIHsKKwkgICAgaWYoKGh4PGh5KXx8KGx4PGx5KSkgeworCQlxID0gMDsKKwkJZ290byBmaXh1cDsJLyogfHh8PHx5fCByZXR1cm4geCBvciB4LXkgKi8KKwkgICAgfQorCSAgICBpZihseD09bHkpIHsKKwkJKnF1byA9IDE7CisJCXJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsJLyogfHh8PXx5fCByZXR1cm4geCowKi8KKwkgICAgfQorCX0KKworICAgIC8qIGRldGVybWluZSBpeCA9IGlsb2diKHgpICovCisJaWYoaHg8MHgwMDEwMDAwMCkgewkvKiBzdWJub3JtYWwgeCAqLworCSAgICBpZihoeD09MCkgeworCQlmb3IgKGl4ID0gLTEwNDMsIGk9bHg7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpeCA9IC0xMDIyLGk9KGh4PDwxMSk7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfQorCX0gZWxzZSBpeCA9IChoeD4+MjApLTEwMjM7CisKKyAgICAvKiBkZXRlcm1pbmUgaXkgPSBpbG9nYih5KSAqLworCWlmKGh5PDB4MDAxMDAwMDApIHsJLyogc3Vibm9ybWFsIHkgKi8KKwkgICAgaWYoaHk9PTApIHsKKwkJZm9yIChpeSA9IC0xMDQzLCBpPWx5OyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0gZWxzZSB7CisJCWZvciAoaXkgPSAtMTAyMixpPShoeTw8MTEpOyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0KKwl9IGVsc2UgaXkgPSAoaHk+PjIwKS0xMDIzOworCisgICAgLyogc2V0IHVwIHtoeCxseH0sIHtoeSxseX0gYW5kIGFsaWduIHkgdG8geCAqLworCWlmKGl4ID49IC0xMDIyKSAKKwkgICAgaHggPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXg7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeCA9IChoeDw8bil8KGx4Pj4oMzItbikpOworCSAgICAgICAgbHggPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh4ID0gbHg8PChuLTMyKTsKKwkJbHggPSAwOworCSAgICB9CisJfQorCWlmKGl5ID49IC0xMDIyKSAKKwkgICAgaHkgPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXk7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeSA9IChoeTw8bil8KGx5Pj4oMzItbikpOworCSAgICAgICAgbHkgPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh5ID0gbHk8PChuLTMyKTsKKwkJbHkgPSAwOworCSAgICB9CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwlxID0gMDsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCSAgICBpZihoejwwKXtoeCA9IGh4K2h4KyhseD4+MzEpOyBseCA9IGx4K2x4O30KKwkgICAgZWxzZSB7aHggPSBoeitoeisobHo+PjMxKTsgbHggPSBseitsejsgcSsrO30KKwkgICAgcSA8PD0gMTsKKwl9CisJaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCWlmKGh6Pj0wKSB7aHg9aHo7bHg9bHo7cSsrO30KKworICAgIC8qIGNvbnZlcnQgYmFjayB0byBmbG9hdGluZyB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgc2lnbiAqLworCWlmKChoeHxseCk9PTApIHsJCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJICAgICpxdW8gPSAoc3h5ID8gLXEgOiBxKTsKKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCX0KKwl3aGlsZShoeDwweDAwMTAwMDAwKSB7CQkvKiBub3JtYWxpemUgeCAqLworCSAgICBoeCA9IGh4K2h4KyhseD4+MzEpOyBseCA9IGx4K2x4OworCSAgICBpeSAtPSAxOworCX0KKwlpZihpeT49IC0xMDIyKSB7CS8qIG5vcm1hbGl6ZSBvdXRwdXQgKi8KKwkgICAgaHggPSAoKGh4LTB4MDAxMDAwMDApfCgoaXkrMTAyMyk8PDIwKSk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMDIyIC0gaXk7CisJICAgIGlmKG48PTIwKSB7CisJCWx4ID0gKGx4Pj5uKXwoKHVfaW50MzJfdCloeDw8KDMyLW4pKTsKKwkJaHggPj49IG47CisJICAgIH0gZWxzZSBpZiAobjw9MzEpIHsKKwkJbHggPSAoaHg8PCgzMi1uKSl8KGx4Pj5uKTsgaHggPSBzeDsKKwkgICAgfSBlbHNlIHsKKwkJbHggPSBoeD4+KG4tMzIpOyBoeCA9IHN4OworCSAgICB9CisJfQorZml4dXA6CisJSU5TRVJUX1dPUkRTKHgsaHgsbHgpOworCXkgPSBmYWJzKHkpOworCWlmICh5IDwgMHgxcC0xMDIxKSB7CisJICAgIGlmICh4K3g+eSB8fCAoeCt4PT15ICYmIChxICYgMSkpKSB7CisJCXErKzsKKwkJeC09eTsKKwkgICAgfQorCX0gZWxzZSBpZiAoeD4wLjUqeSB8fCAoeD09MC41KnkgJiYgKHEgJiAxKSkpIHsKKwkgICAgcSsrOworCSAgICB4LT15OworCX0KKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCVNFVF9ISUdIX1dPUkQoeCxoeF5zeCk7CisJcSAmPSAweDdmZmZmZmZmOworCSpxdW8gPSAoc3h5ID8gLXEgOiBxKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfcmVtcXVvZi5jIGIvbGlibS9zcmMvc19yZW1xdW9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3MjJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfcmVtcXVvZi5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBAKCMpZV9mbW9kLmMgMS4zIDk1LzAxLzE4ICovCisvKi0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JlbXF1b2YuYyx2IDEuMSAyMDA1LzAzLzI1IDA0OjQwOjQ0IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCisvKgorICogUmV0dXJuIHRoZSBJRUVFIHJlbWFpbmRlciBhbmQgc2V0ICpxdW8gdG8gdGhlIGxhc3QgbiBiaXRzIG9mIHRoZQorICogcXVvdGllbnQsIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gIFdlIGNob29zZSBuPTMxIGJlY2F1c2UKKyAqIHdlIHdpbmQgdXAgY29tcHV0aW5nIGFsbCB0aGUgaW50ZWdlciBiaXRzIG9mIHRoZSBxdW90aWVudCBhbnl3YXkgYXMKKyAqIGEgc2lkZS1lZmZlY3Qgb2YgY29tcHV0aW5nIHRoZSByZW1haW5kZXIgYnkgdGhlIHNoaWZ0IGFuZCBzdWJ0cmFjdAorICogbWV0aG9kLiAgSW4gcHJhY3RpY2UsIHRoaXMgaXMgZmFyIG1vcmUgYml0cyB0aGFuIGFyZSBuZWVkZWQgdG8gdXNlCisgKiByZW1xdW8gaW4gcmVkdWN0aW9uIGFsZ29yaXRobXMuCisgKi8KK2Zsb2F0CityZW1xdW9mKGZsb2F0IHgsIGZsb2F0IHksIGludCAqcXVvKQoreworCWludDMyX3QgbixoeCxoeSxoeixpeCxpeSxzeCxpOworCXVfaW50MzJfdCBxLHN4eTsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCUdFVF9GTE9BVF9XT1JEKGh5LHkpOworCXN4eSA9IChoeCBeIGh5KSAmIDB4ODAwMDAwMDA7CisJc3ggPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBvZiB4ICovCisJaHggXj1zeDsJCS8qIHx4fCAqLworCWh5ICY9IDB4N2ZmZmZmZmY7CS8qIHx5fCAqLworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZihoeT09MHx8aHg+PTB4N2Y4MDAwMDB8fGh5PjB4N2Y4MDAwMDApIC8qIHk9MCxOYU47b3IgeCBub3QgZmluaXRlICovCisJICAgIHJldHVybiAoeCp5KS8oeCp5KTsKKwlpZihoeDxoeSkgeworCSAgICBxID0gMDsKKwkgICAgZ290byBmaXh1cDsJLyogfHh8PHx5fCByZXR1cm4geCBvciB4LXkgKi8KKwl9IGVsc2UgaWYoaHg9PWh5KSB7CisJICAgICpxdW8gPSAxOworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CS8qIHx4fD18eXwgcmV0dXJuIHgqMCovCisJfQorCisgICAgLyogZGV0ZXJtaW5lIGl4ID0gaWxvZ2IoeCkgKi8KKwlpZihoeDwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIGZvciAoaXggPSAtMTI2LGk9KGh4PDw4KTsgaT4wOyBpPDw9MSkgaXggLT0xOworCX0gZWxzZSBpeCA9IChoeD4+MjMpLTEyNzsKKworICAgIC8qIGRldGVybWluZSBpeSA9IGlsb2diKHkpICovCisJaWYoaHk8MHgwMDgwMDAwMCkgewkvKiBzdWJub3JtYWwgeSAqLworCSAgICBmb3IgKGl5ID0gLTEyNixpPShoeTw8OCk7IGk+MDsgaTw8PTEpIGl5IC09MTsKKwl9IGVsc2UgaXkgPSAoaHk+PjIzKS0xMjc7CisKKyAgICAvKiBzZXQgdXAge2h4LGx4fSwge2h5LGx5fSBhbmQgYWxpZ24geSB0byB4ICovCisJaWYoaXggPj0gLTEyNikKKwkgICAgaHggPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peDsKKwkgICAgaHggPDw9IG47CisJfQorCWlmKGl5ID49IC0xMjYpCisJICAgIGh5ID0gMHgwMDgwMDAwMHwoMHgwMDdmZmZmZiZoeSk7CisJZWxzZSB7CQkvKiBzdWJub3JtYWwgeSwgc2hpZnQgeSB0byBub3JtYWwgKi8KKwkgICAgbiA9IC0xMjYtaXk7CisJICAgIGh5IDw8PSBuOworCX0KKworICAgIC8qIGZpeCBwb2ludCBmbW9kICovCisJbiA9IGl4IC0gaXk7CisJcSA9IDA7CisJd2hpbGUobi0tKSB7CisJICAgIGh6PWh4LWh5OworCSAgICBpZihoejwwKSBoeCA9IGh4IDw8IDE7CisJICAgIGVsc2Uge2h4ID0gaHogPDwgMTsgcSsrO30KKwkgICAgcSA8PD0gMTsKKwl9CisJaHo9aHgtaHk7CisJaWYoaHo+PTApIHtoeD1oejtxKys7fQorCisgICAgLyogY29udmVydCBiYWNrIHRvIGZsb2F0aW5nIHZhbHVlIGFuZCByZXN0b3JlIHRoZSBzaWduICovCisJaWYoaHg9PTApIHsJCQkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCSAgICAqcXVvID0gKHN4eSA/IC1xIDogcSk7CisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwl9CisJd2hpbGUoaHg8MHgwMDgwMDAwMCkgewkJLyogbm9ybWFsaXplIHggKi8KKwkgICAgaHggPDw9IDE7CisJICAgIGl5IC09IDE7CisJfQorCWlmKGl5Pj0gLTEyNikgewkJLyogbm9ybWFsaXplIG91dHB1dCAqLworCSAgICBoeCA9ICgoaHgtMHgwMDgwMDAwMCl8KChpeSsxMjcpPDwyMykpOworCX0gZWxzZSB7CQkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJICAgIG4gPSAtMTI2IC0gaXk7CisJICAgIGh4ID4+PSBuOworCX0KK2ZpeHVwOgorCVNFVF9GTE9BVF9XT1JEKHgsaHgpOworCXkgPSBmYWJzZih5KTsKKwlpZiAoeSA8IDB4MXAtMTI1ZikgeworCSAgICBpZiAoeCt4PnkgfHwgKHgreD09eSAmJiAocSAmIDEpKSkgeworCQlxKys7CisJCXgtPXk7CisJICAgIH0KKwl9IGVsc2UgaWYgKHg+MC41Zip5IHx8ICh4PT0wLjVmKnkgJiYgKHEgJiAxKSkpIHsKKwkgICAgcSsrOworCSAgICB4LT15OworCX0KKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlTRVRfRkxPQVRfV09SRCh4LGh4XnN4KTsKKwlxICY9IDB4N2ZmZmZmZmY7CisJKnF1byA9IChzeHkgPyAtcSA6IHEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yaW50LmMgYi9saWJtL3NyYy9zX3JpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODhkN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yaW50LmMKQEAgLTAsMCArMSw4NyBAQAorLyogQCgjKXNfcmludC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yaW50LmMsdiAxLjEzIDIwMDUvMTIvMDMgMDc6Mzg6MzUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogcmludCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0byBpbnRlZ3JhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHByZXZhaWxpbmcKKyAqIHJvdW5kaW5nIG1vZGUuCisgKiBNZXRob2Q6CisgKglVc2luZyBmbG9hdGluZyBhZGRpdGlvbi4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gcmludCh4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitUV081MlsyXT17CisgIDQuNTAzNTk5NjI3MzcwNDk2MDAwMDBlKzE1LCAvKiAweDQzMzAwMDAwLCAweDAwMDAwMDAwICovCisgLTQuNTAzNTk5NjI3MzcwNDk2MDAwMDBlKzE1LCAvKiAweEMzMzAwMDAwLCAweDAwMDAwMDAwICovCit9OworCitkb3VibGUKK3JpbnQoZG91YmxlIHgpCit7CisJaW50MzJfdCBpMCxqMCxzeDsKKwl1X2ludDMyX3QgaSxpMTsKKwlkb3VibGUgdyx0OworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJc3ggPSAoaTA+PjMxKSYxOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7CisJCWlmKCgoaTAmMHg3ZmZmZmZmZil8aTEpPT0wKSByZXR1cm4geDsKKwkJaTEgfD0gKGkwJjB4MGZmZmZmKTsKKwkJaTAgJj0gMHhmZmZlMDAwMDsKKwkJaTAgfD0gKChpMXwtaTEpPj4xMikmMHg4MDAwMDsKKwkJU0VUX0hJR0hfV09SRCh4LGkwKTsKKwkgICAgICAgIHcgPSBUV081MltzeF0reDsKKwkgICAgICAgIHQgPSAgdy1UV081MltzeF07CisJCUdFVF9ISUdIX1dPUkQoaTAsdCk7CisJCVNFVF9ISUdIX1dPUkQodCwoaTAmMHg3ZmZmZmZmZil8KHN4PDwzMSkpOworCSAgICAgICAgcmV0dXJuIHQ7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaT4+PTE7CisJCWlmKCgoaTAmaSl8aTEpIT0wKSB7CisJCSAgICAvKgorCQkgICAgICogU29tZSBiaXQgaXMgc2V0IGFmdGVyIHRoZSAwLjUgYml0LiAgVG8gYXZvaWQgdGhlCisJCSAgICAgKiBwb3NzaWJpbGl0eSBvZiBlcnJvcnMgZnJvbSBkb3VibGUgcm91bmRpbmcgaW4KKwkJICAgICAqIHcgPSBUV081MltzeF0reCwgYWRqdXN0IHRoZSAwLjI1IGJpdCB0byBhIGxvd2VyCisJCSAgICAgKiBndWFyZCBiaXQuICBXZSBkbyB0aGlzIGZvciBhbGwgajA8PTUxLiAgVGhlCisJCSAgICAgKiBhZGp1c3RtZW50IGlzIHRyaWNraWVzdCBmb3IgajA9PTE4IGFuZCBqMD09MTkKKwkJICAgICAqIHNpbmNlIHRoZW4gaXQgc3BhbnMgdGhlIHdvcmQgYm91bmRhcnkuCisJCSAgICAgKi8KKwkJICAgIGlmKGowPT0xOSkgaTEgPSAweDQwMDAwMDAwOyBlbHNlCisJCSAgICBpZihqMD09MTgpIGkxID0gMHg4MDAwMDAwMDsgZWxzZQorCQkgICAgaTAgPSAoaTAmKH5pKSl8KCgweDIwMDAwKT4+ajApOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKGowPjUxKSB7CisJICAgIGlmKGowPT0weDQwMCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0gZWxzZSB7CisJICAgIGkgPSAoKHVfaW50MzJfdCkoMHhmZmZmZmZmZikpPj4oajAtMjApOworCSAgICBpZigoaTEmaSk9PTApIHJldHVybiB4OwkvKiB4IGlzIGludGVncmFsICovCisJICAgIGk+Pj0xOworCSAgICBpZigoaTEmaSkhPTApIGkxID0gKGkxJih+aSkpfCgoMHg0MDAwMDAwMCk+PihqMC0yMCkpOworCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJKih2b2xhdGlsZSBkb3VibGUgKikmdyA9IFRXTzUyW3N4XSt4OwkvKiBjbGlwIGFueSBleHRyYSBwcmVjaXNpb24gKi8KKwlyZXR1cm4gdy1UV081MltzeF07Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JpbnRmLmMgYi9saWJtL3NyYy9zX3JpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NDIxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfcmludGYuYwpAQCAtMCwwICsxLDUyIEBACisvKiBzX3JpbnRmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3JpbnQuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmludGYuYyx2IDEuMTAgMjAwNS8xMi8wMyAwOTowMDoyOSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorVFdPMjNbMl09eworICA4LjM4ODYwODAwMDBlKzA2LCAvKiAweDRiMDAwMDAwICovCisgLTguMzg4NjA4MDAwMGUrMDYsIC8qIDB4Y2IwMDAwMDAgKi8KK307CisKK2Zsb2F0CityaW50ZihmbG9hdCB4KQoreworCWludDMyX3QgaTAsajAsc3g7CisJdm9sYXRpbGUgZmxvYXQgdyx0OwkvKiB2b2xhdGlsZSB3b3JrcyBhcm91bmQgZ2NjIGJ1ZyAqLworCUdFVF9GTE9BVF9XT1JEKGkwLHgpOworCXN4ID0gKGkwPj4zMSkmMTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsKKwkJaWYoKGkwJjB4N2ZmZmZmZmYpPT0wKSByZXR1cm4geDsKKwkgICAgICAgIHcgPSBUV08yM1tzeF0reDsKKwkgICAgICAgIHQgPSAgdy1UV08yM1tzeF07CisJCUdFVF9GTE9BVF9XT1JEKGkwLHQpOworCQlTRVRfRkxPQVRfV09SRCh0LChpMCYweDdmZmZmZmZmKXwoc3g8PDMxKSk7CisJICAgICAgICByZXR1cm4gdDsKKwkgICAgfQorCSAgICB3ID0gVFdPMjNbc3hdK3g7CisJICAgIHJldHVybiB3LVRXTzIzW3N4XTsKKwl9CisJaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwllbHNlIHJldHVybiB4OwkJCS8qIHggaXMgaW50ZWdyYWwgKi8KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfcm91bmQuYyBiL2xpYm0vc3JjL3Nfcm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzRjMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yb3VuZC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlIHVubW9kaWZpZWQsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yb3VuZC5jLHYgMS40IDIwMDUvMTIvMDIgMTM6NDU6MDYgYmRlIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2RvdWJsZQorcm91bmQoZG91YmxlIHgpCit7CisJZG91YmxlIHQ7CisKKwlpZiAoIWlzZmluaXRlKHgpKQorCQlyZXR1cm4gKHgpOworCisJaWYgKHggPj0gMC4wKSB7CisJCXQgPSBmbG9vcih4KTsKKwkJaWYgKHQgLSB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICh0KTsKKwl9IGVsc2UgeworCQl0ID0gZmxvb3IoLXgpOworCQlpZiAodCArIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKC10KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JvdW5kZi5jIGIvbGlibS9zcmMvc19yb3VuZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjNiZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yb3VuZGYuYwpAQCAtMCwwICsxLDUxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgU3RldmVuIEcuIEthcmdsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSB1bm1vZGlmaWVkLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfcm91bmRmLmMsdiAxLjQgMjAwNS8xMi8wMiAxMzo0NTowNiBiZGUgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworZmxvYXQKK3JvdW5kZihmbG9hdCB4KQoreworCWZsb2F0IHQ7CisKKwlpZiAoIWlzZmluaXRlKHgpKQorCQlyZXR1cm4gKHgpOworCisJaWYgKHggPj0gMC4wKSB7CisJCXQgPSBmbG9vcmYoeCk7CisJCWlmICh0IC0geCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAodCk7CisJfSBlbHNlIHsKKwkJdCA9IGZsb29yZigteCk7CisJCWlmICh0ICsgeCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAoLXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfcm91bmRsLmMgYi9saWJtL3NyYy9zX3JvdW5kbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWYzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JvdW5kbC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlIHVubW9kaWZpZWQsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yb3VuZGwuYyx2IDEuMiAyMDA1LzEyLzAyIDEzOjQ1OjA2IGJkZSBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitsb25nIGRvdWJsZQorcm91bmRsKGxvbmcgZG91YmxlIHgpCit7CisJbG9uZyBkb3VibGUgdDsKKworCWlmICghaXNmaW5pdGUoeCkpCisJCXJldHVybiAoeCk7CisKKwlpZiAoeCA+PSAwLjApIHsKKwkJdCA9IGZsb29ybCh4KTsKKwkJaWYgKHQgLSB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICh0KTsKKwl9IGVsc2UgeworCQl0ID0gZmxvb3JsKC14KTsKKwkJaWYgKHQgKyB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICgtdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zY2FsYmxuLmMgYi9saWJtL3NyYy9zX3NjYWxibG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTkwOGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zY2FsYmxuLmMKQEAgLTAsMCArMSw3NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYmxuLmMsdiAxLjIgMjAwNS8wMy8wNyAwNDo1Nzo1MCBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCitzY2FsYmxuIChkb3VibGUgeCwgbG9uZyBuKQoreworCWludCBpbjsKKworCWluID0gKGludCluOworCWlmIChpbiAhPSBuKSB7CisJCWlmIChuID4gMCkKKwkJCWluID0gSU5UX01BWDsKKwkJZWxzZQorCQkJaW4gPSBJTlRfTUlOOworCX0KKwlyZXR1cm4gKHNjYWxibih4LCBpbikpOworfQorCitmbG9hdAorc2NhbGJsbmYgKGZsb2F0IHgsIGxvbmcgbikKK3sKKwlpbnQgaW47CisKKwlpbiA9IChpbnQpbjsKKwlpZiAoaW4gIT0gbikgeworCQlpZiAobiA+IDApCisJCQlpbiA9IElOVF9NQVg7CisJCWVsc2UKKwkJCWluID0gSU5UX01JTjsKKwl9CisJcmV0dXJuIChzY2FsYm5mKHgsIGluKSk7Cit9CisKK2xvbmcgZG91YmxlCitzY2FsYmxubCAobG9uZyBkb3VibGUgeCwgbG9uZyBuKQoreworCWludCBpbjsKKworCWluID0gKGludCluOworCWlmIChpbiAhPSBuKSB7CisJCWlmIChuID4gMCkKKwkJCWluID0gSU5UX01BWDsKKwkJZWxzZQorCQkJaW4gPSBJTlRfTUlOOworCX0KKwlyZXR1cm4gKHNjYWxibmwoeCwgKGludCluKSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NjYWxibi5jIGIvbGlibS9zcmMvc19zY2FsYm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE4YzExCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zY2FsYm4uYwpAQCAtMCwwICsxLDc5IEBACisvKiBAKCMpc19zY2FsYm4uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2NhbGJuLmMsdiAxLjExIDIwMDUvMDMvMDcgMjE6Mjc6MzcgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogc2NhbGJuIChkb3VibGUgeCwgaW50IG4pCisgKiBzY2FsYm4oeCxuKSByZXR1cm5zIHgqIDIqKm4gIGNvbXB1dGVkIGJ5ICBleHBvbmVudAorICogbWFuaXB1bGF0aW9uIHJhdGhlciB0aGFuIGJ5IGFjdHVhbGx5IHBlcmZvcm1pbmcgYW4KKyAqIGV4cG9uZW50aWF0aW9uIG9yIGEgbXVsdGlwbGljYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzU0ICAgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTYsIC8qIDB4NDM1MDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3b201NCAgPSAgNS41NTExMTUxMjMxMjU3ODI3MDIxMmUtMTcsIC8qIDB4M0M5MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2h1Z2UgICA9IDEuMGUrMzAwLAordGlueSAgID0gMS4wZS0zMDA7CisKK2RvdWJsZQorc2NhbGJuIChkb3VibGUgeCwgaW50IG4pCit7CisJaW50MzJfdCBrLGh4LGx4OworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisgICAgICAgIGsgPSAoaHgmMHg3ZmYwMDAwMCk+PjIwOwkJLyogZXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBpZiAoaz09MCkgewkJCQkvKiAwIG9yIHN1Ym5vcm1hbCB4ICovCisgICAgICAgICAgICBpZiAoKGx4fChoeCYweDdmZmZmZmZmKSk9PTApIHJldHVybiB4OyAvKiArLTAgKi8KKwkgICAgeCAqPSB0d281NDsKKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKwkgICAgayA9ICgoaHgmMHg3ZmYwMDAwMCk+PjIwKSAtIDU0OworICAgICAgICAgICAgaWYgKG48IC01MDAwMCkgcmV0dXJuIHRpbnkqeDsgCS8qdW5kZXJmbG93Ki8KKwkgICAgfQorICAgICAgICBpZiAoaz09MHg3ZmYpIHJldHVybiB4K3g7CQkvKiBOYU4gb3IgSW5mICovCisgICAgICAgIGsgPSBrK247CisgICAgICAgIGlmIChrID4gIDB4N2ZlKSByZXR1cm4gaHVnZSpjb3B5c2lnbihodWdlLHgpOyAvKiBvdmVyZmxvdyAgKi8KKyAgICAgICAgaWYgKGsgPiAwKSAJCQkJLyogbm9ybWFsIHJlc3VsdCAqLworCSAgICB7U0VUX0hJR0hfV09SRCh4LChoeCYweDgwMGZmZmZmKXwoazw8MjApKTsgcmV0dXJuIHg7fQorICAgICAgICBpZiAoayA8PSAtNTQpCisgICAgICAgICAgICBpZiAobiA+IDUwMDAwKSAJLyogaW4gY2FzZSBpbnRlZ2VyIG92ZXJmbG93IGluIG4rayAqLworCQlyZXR1cm4gaHVnZSpjb3B5c2lnbihodWdlLHgpOwkvKm92ZXJmbG93Ki8KKwkgICAgZWxzZSByZXR1cm4gdGlueSpjb3B5c2lnbih0aW55LHgpOyAJLyp1bmRlcmZsb3cqLworICAgICAgICBrICs9IDU0OwkJCQkvKiBzdWJub3JtYWwgcmVzdWx0ICovCisJU0VUX0hJR0hfV09SRCh4LChoeCYweDgwMGZmZmZmKXwoazw8MjApKTsKKyAgICAgICAgcmV0dXJuIHgqdHdvbTU0OworfQorCisvLyB0aGlzIGlzIG5vcm1hbGx5IGluIEZyZWVCU0QncyBsaWJjLgorZG91YmxlCitsZGV4cCAoZG91YmxlIHgsIGludCBuKQoreworICAgIHJldHVybiBzY2FsYm4oeCxuKTsKK30KKworI2lmIChMREJMX01BTlRfRElHID09IDUzKSAgICAvL1hYWDogYnJpYW4gRklYTUUgX193ZWFrX3JlZmVyZW5jZSBkb2VzbiB3b3JrCitsb25nIGRvdWJsZSBsZGV4cGwgKGxvbmcgZG91YmxlIHgsIGludCBuKSB7CisgICAgcmV0dXJuIHNjYWxibigoZG91YmxlKXgsbik7Cit9Citsb25nIGRvdWJsZSBzY2FsYm5sIChsb25nIGRvdWJsZSB4LCBpbnQgbikgeworICAgIHJldHVybiBzY2FsYm4oKGRvdWJsZSl4LG4pOworfQorX193ZWFrX3JlZmVyZW5jZShzY2FsYm4sIGxkZXhwbCk7CitfX3dlYWtfcmVmZXJlbmNlKHNjYWxibiwgc2NhbGJubCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJuZi5jIGIvbGlibS9zcmMvc19zY2FsYm5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjN2JhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2NhbGJuZi5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIHNfc2NhbGJuZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19zY2FsYm4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2NhbGJuZi5jLHYgMS44IDIwMDUvMDMvMDcgMDQ6NTI6NDMgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjUgICA9ICAzLjM1NTQ0MzIwMGUrMDcsCS8qIDB4NGMwMDAwMDAgKi8KK3R3b20yNSAgPSAgMi45ODAyMzIyMzg4ZS0wOCwJLyogMHgzMzAwMDAwMCAqLworaHVnZSAgID0gMS4wZSszMCwKK3RpbnkgICA9IDEuMGUtMzA7CisKK2Zsb2F0CitzY2FsYm5mIChmbG9hdCB4LCBpbnQgbikKK3sKKwlpbnQzMl90IGssaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisgICAgICAgIGsgPSAoaXgmMHg3ZjgwMDAwMCk+PjIzOwkJLyogZXh0cmFjdCBleHBvbmVudCAqLworICAgICAgICBpZiAoaz09MCkgewkJCQkvKiAwIG9yIHN1Ym5vcm1hbCB4ICovCisgICAgICAgICAgICBpZiAoKGl4JjB4N2ZmZmZmZmYpPT0wKSByZXR1cm4geDsgLyogKy0wICovCisJICAgIHggKj0gdHdvMjU7CisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCSAgICBrID0gKChpeCYweDdmODAwMDAwKT4+MjMpIC0gMjU7CisgICAgICAgICAgICBpZiAobjwgLTUwMDAwKSByZXR1cm4gdGlueSp4OyAJLyp1bmRlcmZsb3cqLworCSAgICB9CisgICAgICAgIGlmIChrPT0weGZmKSByZXR1cm4geCt4OwkJLyogTmFOIG9yIEluZiAqLworICAgICAgICBrID0gaytuOworICAgICAgICBpZiAoayA+ICAweGZlKSByZXR1cm4gaHVnZSpjb3B5c2lnbmYoaHVnZSx4KTsgLyogb3ZlcmZsb3cgICovCisgICAgICAgIGlmIChrID4gMCkgCQkJCS8qIG5vcm1hbCByZXN1bHQgKi8KKwkgICAge1NFVF9GTE9BVF9XT1JEKHgsKGl4JjB4ODA3ZmZmZmYpfChrPDwyMykpOyByZXR1cm4geDt9CisgICAgICAgIGlmIChrIDw9IC0yNSkKKyAgICAgICAgICAgIGlmIChuID4gNTAwMDApIAkvKiBpbiBjYXNlIGludGVnZXIgb3ZlcmZsb3cgaW4gbitrICovCisJCXJldHVybiBodWdlKmNvcHlzaWduZihodWdlLHgpOwkvKm92ZXJmbG93Ki8KKwkgICAgZWxzZSByZXR1cm4gdGlueSpjb3B5c2lnbmYodGlueSx4KTsJLyp1bmRlcmZsb3cqLworICAgICAgICBrICs9IDI1OwkJCQkvKiBzdWJub3JtYWwgcmVzdWx0ICovCisJU0VUX0ZMT0FUX1dPUkQoeCwoaXgmMHg4MDdmZmZmZil8KGs8PDIzKSk7CisgICAgICAgIHJldHVybiB4KnR3b20yNTsKK30KKworX19zdHJvbmdfcmVmZXJlbmNlKHNjYWxibmYsIGxkZXhwZik7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NjYWxibmwuYyBiL2xpYm0vc3JjL3Nfc2NhbGJubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDVkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibmwuYwpAQCAtMCwwICsxLDcxIEBACisvKiBAKCMpc19zY2FsYm4uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2NhbGJubC5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTI6NTggZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogc2NhbGJubCAobG9uZyBkb3VibGUgeCwgaW50IG4pCisgKiBzY2FsYm5sKHgsbikgcmV0dXJucyB4KiAyKipuICBjb21wdXRlZCBieSAgZXhwb25lbnQKKyAqIG1hbmlwdWxhdGlvbiByYXRoZXIgdGhhbiBieSBhY3R1YWxseSBwZXJmb3JtaW5nIGFuCisgKiBleHBvbmVudGlhdGlvbiBvciBhIG11bHRpcGxpY2F0aW9uLgorICovCisKKy8qCisgKiBXZSBhc3N1bWUgdGhhdCBhIGxvbmcgZG91YmxlIGhhcyBhIDE1LWJpdCBleHBvbmVudC4gIE9uIHN5c3RlbXMKKyAqIHdoZXJlIGxvbmcgZG91YmxlIGlzIHRoZSBzYW1lIGFzIGRvdWJsZSwgc2NhbGJubCgpIGlzIGFuIGFsaWFzCisgKiBmb3Igc2NhbGJuKCksIHNvIHdlIGRvbid0IHVzZSB0aGlzIHJvdXRpbmUuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZiBMREJMX01BWF9FWFAgIT0gMHg0MDAwCisjZXJyb3IgIlVuc3VwcG9ydGVkIGxvbmcgZG91YmxlIGZvcm1hdCIKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUKK2h1Z2UgPSAweDFwMTYwMDBMLAordGlueSA9IDB4MXAtMTYwMDBMOworCitsb25nIGRvdWJsZQorc2NhbGJubCAobG9uZyBkb3VibGUgeCwgaW50IG4pCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCWludCBrOworCXUuZSA9IHg7CisgICAgICAgIGsgPSB1LmJpdHMuZXhwOwkJCQkvKiBleHRyYWN0IGV4cG9uZW50ICovCisgICAgICAgIGlmIChrPT0wKSB7CQkJCS8qIDAgb3Igc3Vibm9ybWFsIHggKi8KKyAgICAgICAgICAgIGlmICgodS5iaXRzLm1hbmh8dS5iaXRzLm1hbmwpPT0wKSByZXR1cm4geDsJLyogKy0wICovCisJICAgIHUuZSAqPSAweDFwKzEyODsKKwkgICAgayA9IHUuYml0cy5leHAgLSAxMjg7CisgICAgICAgICAgICBpZiAobjwgLTUwMDAwKSByZXR1cm4gdGlueSp4OyAJLyp1bmRlcmZsb3cqLworCSAgICB9CisgICAgICAgIGlmIChrPT0weDdmZmYpIHJldHVybiB4K3g7CQkvKiBOYU4gb3IgSW5mICovCisgICAgICAgIGsgPSBrK247CisgICAgICAgIGlmIChrID49IDB4N2ZmZikgcmV0dXJuIGh1Z2UqY29weXNpZ25sKGh1Z2UseCk7IC8qIG92ZXJmbG93ICAqLworICAgICAgICBpZiAoayA+IDApIAkJCQkvKiBub3JtYWwgcmVzdWx0ICovCisJICAgIHt1LmJpdHMuZXhwID0gazsgcmV0dXJuIHUuZTt9CisgICAgICAgIGlmIChrIDw9IC0xMjgpCisgICAgICAgICAgICBpZiAobiA+IDUwMDAwKSAJLyogaW4gY2FzZSBpbnRlZ2VyIG92ZXJmbG93IGluIG4rayAqLworCQlyZXR1cm4gaHVnZSpjb3B5c2lnbihodWdlLHgpOwkvKm92ZXJmbG93Ki8KKwkgICAgZWxzZSByZXR1cm4gdGlueSpjb3B5c2lnbih0aW55LHgpOyAJLyp1bmRlcmZsb3cqLworICAgICAgICBrICs9IDEyODsJCQkJLyogc3Vibm9ybWFsIHJlc3VsdCAqLworCXUuYml0cy5leHAgPSBrOworICAgICAgICByZXR1cm4gdS5lKjB4MXAtMTI4OworfQorCitfX3N0cm9uZ19yZWZlcmVuY2Uoc2NhbGJubCwgbGRleHBsKTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2lnbmJpdC5jIGIvbGlibS9zcmMvc19zaWduYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjMDhmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2lnbmJpdC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2lnbmJpdC5jLHYgMS4xIDIwMDQvMDcvMTkgMDg6MTY6MTAgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitpbnQKK19fc2lnbmJpdChkb3VibGUgZCkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHU7CisKKwl1LmQgPSBkOworCXJldHVybiAodS5iaXRzLnNpZ24pOworfQorCitpbnQKK19fc2lnbmJpdGYoZmxvYXQgZikKK3sKKwl1bmlvbiBJRUVFZjJiaXRzIHU7CisKKwl1LmYgPSBmOworCXJldHVybiAodS5iaXRzLnNpZ24pOworfQorCitpbnQKK19fc2lnbmJpdGwobG9uZyBkb3VibGUgZSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSBlOworCXJldHVybiAodS5iaXRzLnNpZ24pOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaWduZ2FtLmMgYi9saWJtL3NyYy9zX3NpZ25nYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdkNTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduZ2FtLmMKQEAgLTAsMCArMSwzIEBACisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgoraW50IHNpZ25nYW0gPSAwOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaWduaWZpY2FuZC5jIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YmIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpZ25pZmljYW5kLmMKQEAgLTAsMCArMSwzMCBAQAorLyogQCgjKXNfc2lnbmlmLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NpZ25pZmljYW5kLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NyBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIHNpZ25pZmljYW5kKHgpIGNvbXB1dGVzIGp1c3QKKyAqIAlzY2FsYih4LCAoZG91YmxlKSAtaWxvZ2IoeCkpLAorICogZm9yIGV4ZXJjaXNpbmcgdGhlIGZyYWN0aW9uLXBhcnQoRikgSUVFRSA3NTQtMTk4NSB0ZXN0IHZlY3Rvci4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK3NpZ25pZmljYW5kKGRvdWJsZSB4KQoreworCXJldHVybiBfX2llZWU3NTRfc2NhbGIoeCwoZG91YmxlKSAtaWxvZ2IoeCkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaWduaWZpY2FuZGYuYyBiL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMzQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmRmLmMKQEAgLTAsMCArMSwyNyBAQAorLyogc19zaWduaWZpY2FuZGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfc2lnbmlmaWNhbmQuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2lnbmlmaWNhbmRmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitzaWduaWZpY2FuZGYoZmxvYXQgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X3NjYWxiZih4LChmbG9hdCkgLWlsb2diZih4KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3Npbi5jIGIvbGlibS9zcmMvc19zaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaW4uYwpAQCAtMCwwICsxLDgyIEBACisvKiBAKCMpc19zaW4uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2luLmMsdiAxLjEwIDIwMDUvMTAvMjQgMTQ6MDg6MzYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBzaW4oeCkKKyAqIFJldHVybiBzaW5lIGZ1bmN0aW9uIG9mIHguCisgKgorICoga2VybmVsIGZ1bmN0aW9uOgorICoJX19rZXJuZWxfc2luCQkuLi4gc2luZSBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9fa2VybmVsX2NvcwkJLi4uIGNvc2UgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2llZWU3NTRfcmVtX3BpbzIJLi4uIGFyZ3VtZW50IHJlZHVjdGlvbiByb3V0aW5lCisgKgorICogTWV0aG9kLgorICogICAgICBMZXQgUyxDIGFuZCBUIGRlbm90ZSB0aGUgc2luLCBjb3MgYW5kIHRhbiByZXNwZWN0aXZlbHkgb24KKyAqCVstUEkvNCwgK1BJLzRdLiBSZWR1Y2UgdGhlIGFyZ3VtZW50IHggdG8geTEreTIgPSB4LWsqcGkvMgorICoJaW4gWy1waS80ICwgK3BpLzRdLCBhbmQgbGV0IG4gPSBrIG1vZCA0LgorICoJV2UgaGF2ZQorICoKKyAqICAgICAgICAgIG4gICAgICAgIHNpbih4KSAgICAgIGNvcyh4KSAgICAgICAgdGFuKHgpCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgIDAJICAgICAgIFMJICAgQwkJIFQKKyAqCSAgICAxCSAgICAgICBDCSAgLVMJCS0xL1QKKyAqCSAgICAyCSAgICAgIC1TCSAgLUMJCSBUCisgKgkgICAgMwkgICAgICAtQwkgICBTCQktMS9UCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKiAgICAgIExldCB0cmlnIGJlIGFueSBvZiBzaW4sIGNvcywgb3IgdGFuLgorICogICAgICB0cmlnKCstSU5GKSAgaXMgTmFOLCB3aXRoIHNpZ25hbHM7CisgKiAgICAgIHRyaWcoTmFOKSAgICBpcyB0aGF0IE5hTjsKKyAqCisgKiBBY2N1cmFjeToKKyAqCVRSSUcoeCkgcmV0dXJucyB0cmlnKHgpIG5lYXJseSByb3VuZGVkCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitzaW4oZG91YmxlIHgpCit7CisJZG91YmxlIHlbMl0sej0wLjA7CisJaW50MzJfdCBuLCBpeDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB4LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisKKyAgICAvKiB8eHwgfjwgcGkvNCAqLworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXggPD0gMHgzZmU5MjFmYikgeworCSAgICBpZihpeDwweDNlNDAwMDAwKQkJCS8qIHx4fCA8IDIqKi0yNyAqLworCSAgICAgICB7aWYoKGludCl4PT0wKSByZXR1cm4geDt9CS8qIGdlbmVyYXRlIGluZXhhY3QgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3Npbih4LHosMCk7CisJfQorCisgICAgLyogc2luKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yKHgseSk7CisJICAgIHN3aXRjaChuJjMpIHsKKwkJY2FzZSAwOiByZXR1cm4gIF9fa2VybmVsX3Npbih5WzBdLHlbMV0sMSk7CisJCWNhc2UgMTogcmV0dXJuICBfX2tlcm5lbF9jb3MoeVswXSx5WzFdKTsKKwkJY2FzZSAyOiByZXR1cm4gLV9fa2VybmVsX3Npbih5WzBdLHlbMV0sMSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLV9fa2VybmVsX2Nvcyh5WzBdLHlbMV0pOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaW5mLmMgYi9saWJtL3NyYy9zX3NpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMzY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaW5mLmMKQEAgLTAsMCArMSw4MiBAQAorLyogc19zaW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3Npbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaW5mLmMsdiAxLjE0IDIwMDUvMTEvMjggMDY6MTU6MTAgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX0NPU0RGCisjZGVmaW5lCUlOTElORV9LRVJORUxfU0lOREYKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJrX2Nvc2YuYyIKKyNpbmNsdWRlICJrX3NpbmYuYyIKKworLyogU21hbGwgbXVsdGlwbGVzIG9mIHBpLzIgcm91bmRlZCB0byBkb3VibGUgcHJlY2lzaW9uLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorczFwaW8yID0gMSpNX1BJXzIsCQkJLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworczJwaW8yID0gMipNX1BJXzIsCQkJLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworczNwaW8yID0gMypNX1BJXzIsCQkJLyogMHg0MDEyRDk3QywgMHg3RjMzMjFEMiAqLworczRwaW8yID0gNCpNX1BJXzI7CQkJLyogMHg0MDE5MjFGQiwgMHg1NDQ0MkQxOCAqLworCitmbG9hdAorc2luZihmbG9hdCB4KQoreworCWZsb2F0IHlbMl07CisJaW50MzJfdCBuLCBoeCwgaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsKKworCWlmKGl4IDw9IDB4M2Y0OTBmZGEpIHsJCS8qIHx4fCB+PD0gcGkvNCAqLworCSAgICBpZihpeDwweDM5ODAwMDAwKQkJLyogfHh8IDwgMioqLTEyICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4geDsJLyogeCB3aXRoIGluZXhhY3QgaWYgeCAhPSAwICovCisJICAgIHJldHVybiBfX2tlcm5lbF9zaW5kZih4KTsKKwl9CisJaWYoaXg8PTB4NDA3YjUzZDEpIHsJCS8qIHx4fCB+PD0gNSpwaS80ICovCisJICAgIGlmKGl4PD0weDQwMTZjYmUzKSB7CS8qIHx4fCB+PD0gM3BpLzQgKi8KKwkJaWYoaHg+MCkKKwkJICAgIHJldHVybiBfX2tlcm5lbF9jb3NkZih4IC0gczFwaW8yKTsKKwkJZWxzZQorCQkgICAgcmV0dXJuIC1fX2tlcm5lbF9jb3NkZih4ICsgczFwaW8yKTsKKwkgICAgfSBlbHNlCisJCXJldHVybiBfX2tlcm5lbF9zaW5kZigoaHggPiAwID8gczJwaW8yIDogLXMycGlvMikgLSB4KTsKKwl9CisJaWYoaXg8PTB4NDBlMjMxZDUpIHsJCS8qIHx4fCB+PD0gOSpwaS80ICovCisJICAgIGlmKGl4PD0weDQwYWZlZGRmKSB7CS8qIHx4fCB+PD0gNypwaS80ICovCisJCWlmKGh4PjApCisJCSAgICByZXR1cm4gLV9fa2VybmVsX2Nvc2RmKHggLSBzM3BpbzIpOworCQllbHNlCisJCSAgICByZXR1cm4gX19rZXJuZWxfY29zZGYoeCArIHMzcGlvMik7CisJICAgIH0gZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfc2luZGYoeCArIChoeCA+IDAgPyAtczRwaW8yIDogczRwaW8yKSk7CisJfQorCisgICAgLyogc2luKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogZ2VuZXJhbCBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzJmKHgseSk7CisJICAgIHN3aXRjaChuJjMpIHsKKwkJY2FzZSAwOiByZXR1cm4gIF9fa2VybmVsX3NpbmRmKChkb3VibGUpeVswXSt5WzFdKTsKKwkJY2FzZSAxOiByZXR1cm4gIF9fa2VybmVsX2Nvc2RmKChkb3VibGUpeVswXSt5WzFdKTsKKwkJY2FzZSAyOiByZXR1cm4gIF9fa2VybmVsX3NpbmRmKC0oZG91YmxlKXlbMF0teVsxXSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLV9fa2VybmVsX2Nvc2RmKChkb3VibGUpeVswXSt5WzFdKTsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuLmMgYi9saWJtL3NyYy9zX3Rhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGI0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3Rhbi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIEAoIylzX3Rhbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW4uYyx2IDEuMTAgMjAwNS8xMS8wMiAxNDowMTo0NSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIHRhbih4KQorICogUmV0dXJuIHRhbmdlbnQgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBrZXJuZWwgZnVuY3Rpb246CisgKglfX2tlcm5lbF90YW4JCS4uLiB0YW5nZW50IGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19pZWVlNzU0X3JlbV9waW8yCS4uLiBhcmd1bWVudCByZWR1Y3Rpb24gcm91dGluZQorICoKKyAqIE1ldGhvZC4KKyAqICAgICAgTGV0IFMsQyBhbmQgVCBkZW5vdGUgdGhlIHNpbiwgY29zIGFuZCB0YW4gcmVzcGVjdGl2ZWx5IG9uCisgKglbLVBJLzQsICtQSS80XS4gUmVkdWNlIHRoZSBhcmd1bWVudCB4IHRvIHkxK3kyID0geC1rKnBpLzIKKyAqCWluIFstcGkvNCAsICtwaS80XSwgYW5kIGxldCBuID0gayBtb2QgNC4KKyAqCVdlIGhhdmUKKyAqCisgKiAgICAgICAgICBuICAgICAgICBzaW4oeCkgICAgICBjb3MoeCkgICAgICAgIHRhbih4KQorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAwCSAgICAgICBTCSAgIEMJCSBUCisgKgkgICAgMQkgICAgICAgQwkgIC1TCQktMS9UCisgKgkgICAgMgkgICAgICAtUwkgIC1DCQkgVAorICoJICAgIDMJICAgICAgLUMJICAgUwkJLTEvVAorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICogICAgICBMZXQgdHJpZyBiZSBhbnkgb2Ygc2luLCBjb3MsIG9yIHRhbi4KKyAqICAgICAgdHJpZygrLUlORikgIGlzIE5hTiwgd2l0aCBzaWduYWxzOworICogICAgICB0cmlnKE5hTikgICAgaXMgdGhhdCBOYU47CisgKgorICogQWNjdXJhY3k6CisgKglUUklHKHgpIHJldHVybnMgdHJpZyh4KSBuZWFybHkgcm91bmRlZAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQordGFuKGRvdWJsZSB4KQoreworCWRvdWJsZSB5WzJdLHo9MC4wOworCWludDMyX3QgbiwgaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgeC4gKi8KKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCisgICAgLyogfHh8IH48IHBpLzQgKi8KKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4IDw9IDB4M2ZlOTIxZmIpIHsKKwkgICAgaWYoaXg8MHgzZTMwMDAwMCkJCQkvKiB4IDwgMioqLTI4ICovCisJCWlmKChpbnQpeD09MCkgcmV0dXJuIHg7CQkvKiBnZW5lcmF0ZSBpbmV4YWN0ICovCisJICAgIHJldHVybiBfX2tlcm5lbF90YW4oeCx6LDEpOworCX0KKworICAgIC8qIHRhbihJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgteDsJCS8qIE5hTiAqLworCisgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yKHgseSk7CisJICAgIHJldHVybiBfX2tlcm5lbF90YW4oeVswXSx5WzFdLDEtKChuJjEpPDwxKSk7IC8qICAgMSAtLSBuIGV2ZW4KKwkJCQkJCQktMSAtLSBuIG9kZCAqLworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuZi5jIGIvbGlibS9zcmMvc190YW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MGQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuZi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHNfdGFuZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc190YW4uYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdGFuZi5jLHYgMS4xNCAyMDA1LzExLzI4IDA1OjM1OjMyIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9UQU5ERgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImtfdGFuZi5jIgorCisvKiBTbWFsbCBtdWx0aXBsZXMgb2YgcGkvMiByb3VuZGVkIHRvIGRvdWJsZSBwcmVjaXNpb24uICovCitzdGF0aWMgY29uc3QgZG91YmxlCit0MXBpbzIgPSAxKk1fUElfMiwJCQkvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCit0MnBpbzIgPSAyKk1fUElfMiwJCQkvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCit0M3BpbzIgPSAzKk1fUElfMiwJCQkvKiAweDQwMTJEOTdDLCAweDdGMzMyMUQyICovCit0NHBpbzIgPSA0Kk1fUElfMjsJCQkvKiAweDQwMTkyMUZCLCAweDU0NDQyRDE4ICovCisKK2Zsb2F0Cit0YW5mKGZsb2F0IHgpCit7CisJZmxvYXQgeVsyXTsKKwlpbnQzMl90IG4sIGh4LCBpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOworCisJaWYoaXggPD0gMHgzZjQ5MGZkYSkgewkJLyogfHh8IH48PSBwaS80ICovCisJICAgIGlmKGl4PDB4Mzk4MDAwMDApCQkvKiB8eHwgPCAyKiotMTIgKi8KKwkJaWYoKChpbnQpeCk9PTApIHJldHVybiB4OwkvKiB4IHdpdGggaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3RhbmRmKHgsMSk7CisJfQorCWlmKGl4PD0weDQwN2I1M2QxKSB7CQkvKiB8eHwgfjw9IDUqcGkvNCAqLworCSAgICBpZihpeDw9MHg0MDE2Y2JlMykJCS8qIHx4fCB+PD0gM3BpLzQgKi8KKwkJcmV0dXJuIF9fa2VybmVsX3RhbmRmKHggKyAoaHg+MCA/IC10MXBpbzIgOiB0MXBpbzIpLCAtMSk7CisJICAgIGVsc2UKKwkJcmV0dXJuIF9fa2VybmVsX3RhbmRmKHggKyAoaHg+MCA/IC10MnBpbzIgOiB0MnBpbzIpLCAxKTsKKwl9CisJaWYoaXg8PTB4NDBlMjMxZDUpIHsJCS8qIHx4fCB+PD0gOSpwaS80ICovCisJICAgIGlmKGl4PD0weDQwYWZlZGRmKQkJLyogfHh8IH48PSA3KnBpLzQgKi8KKwkJcmV0dXJuIF9fa2VybmVsX3RhbmRmKHggKyAoaHg+MCA/IC10M3BpbzIgOiB0M3BpbzIpLCAtMSk7CisJICAgIGVsc2UKKwkJcmV0dXJuIF9fa2VybmVsX3RhbmRmKHggKyAoaHg+MCA/IC10NHBpbzIgOiB0NHBpbzIpLCAxKTsKKwl9CisKKyAgICAvKiB0YW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBnZW5lcmFsIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMmYoeCx5KTsKKwkgICAgLyogaW50ZWdlciBwYXJhbWV0ZXI6IDEgLS0gbiBldmVuOyAtMSAtLSBuIG9kZCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfdGFuZGYoKGRvdWJsZSl5WzBdK3lbMV0sMS0oKG4mMSk8PDEpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RhbmguYyBiL2xpYm0vc3JjL3NfdGFuaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjkxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3RhbmguYwpAQCAtMCwwICsxLDc4IEBACisvKiBAKCMpc190YW5oLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RhbmguYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogVGFuaCh4KQorICogUmV0dXJuIHRoZSBIeXBlcmJvbGljIFRhbmdlbnQgb2YgeAorICoKKyAqIE1ldGhvZCA6CisgKgkJCQkgICAgICAgeCAgICAteAorICoJCQkJICAgICAgZSAgLSBlCisgKgkwLiB0YW5oKHgpIGlzIGRlZmluZWQgdG8gYmUgLS0tLS0tLS0tLS0KKyAqCQkJCSAgICAgICB4ICAgIC14CisgKgkJCQkgICAgICBlICArIGUKKyAqCTEuIHJlZHVjZSB4IHRvIG5vbi1uZWdhdGl2ZSBieSB0YW5oKC14KSA9IC10YW5oKHgpLgorICoJMi4gIDAgICAgICA8PSB4IDw9IDIqKi01NSA6IHRhbmgoeCkgOj0geCoob25lK3gpCisgKgkJCQkJICAgICAgICAtdAorICoJICAgIDIqKi01NSA8ICB4IDw9ICAxICAgICA6IHRhbmgoeCkgOj0gLS0tLS07IHQgPSBleHBtMSgtMngpCisgKgkJCQkJICAgICAgIHQgKyAyCisgKgkJCQkJCSAgICAgMgorICoJICAgIDEgICAgICA8PSB4IDw9ICAyMi4wICA6IHRhbmgoeCkgOj0gMS0gIC0tLS0tIDsgdD1leHBtMSgyeCkKKyAqCQkJCQkJICAgdCArIDIKKyAqCSAgICAyMi4wICAgPCAgeCA8PSBJTkYgICAgOiB0YW5oKHgpIDo9IDEuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCXRhbmgoTmFOKSBpcyBOYU47CisgKglvbmx5IHRhbmgoMCk9MCBpcyBleGFjdCBmb3IgZmluaXRlIGFyZ3VtZW50LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgb25lPTEuMCwgdHdvPTIuMCwgdGlueSA9IDEuMGUtMzAwOworCitkb3VibGUKK3RhbmgoZG91YmxlIHgpCit7CisJZG91YmxlIHQsejsKKwlpbnQzMl90IGp4LGl4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHx4fC4gKi8KKwlHRVRfSElHSF9XT1JEKGp4LHgpOworCWl4ID0gangmMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSB7CisJICAgIGlmIChqeD49MCkgcmV0dXJuIG9uZS94K29uZTsgICAgLyogdGFuaCgrLWluZik9Ky0xICovCisJICAgIGVsc2UgICAgICAgcmV0dXJuIG9uZS94LW9uZTsgICAgLyogdGFuaChOYU4pID0gTmFOICovCisJfQorCisgICAgLyogfHh8IDwgMjIgKi8KKwlpZiAoaXggPCAweDQwMzYwMDAwKSB7CQkvKiB8eHw8MjIgKi8KKwkgICAgaWYgKGl4PDB4M2M4MDAwMDApIAkJLyogfHh8PDIqKi01NSAqLworCQlyZXR1cm4geCoob25lK3gpOyAgICAJLyogdGFuaChzbWFsbCkgPSBzbWFsbCAqLworCSAgICBpZiAoaXg+PTB4M2ZmMDAwMDApIHsJLyogfHh8Pj0xICAqLworCQl0ID0gZXhwbTEodHdvKmZhYnMoeCkpOworCQl6ID0gb25lIC0gdHdvLyh0K3R3byk7CisJICAgIH0gZWxzZSB7CisJICAgICAgICB0ID0gZXhwbTEoLXR3bypmYWJzKHgpKTsKKwkgICAgICAgIHo9IC10Lyh0K3R3byk7CisJICAgIH0KKyAgICAvKiB8eHwgPiAyMiwgcmV0dXJuICstMSAqLworCX0gZWxzZSB7CisJICAgIHogPSBvbmUgLSB0aW55OwkJLyogcmFpc2VkIGluZXhhY3QgZmxhZyAqLworCX0KKwlyZXR1cm4gKGp4Pj0wKT8gejogLXo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RhbmhmLmMgYi9saWJtL3NyYy9zX3RhbmhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYTZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuaGYuYwpAQCAtMCwwICsxLDU2IEBACisvKiBzX3RhbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3RhbmguYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdGFuaGYuYyx2IDEuOCAyMDA1LzEyLzExIDExOjQwOjU1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZT0xLjAsIHR3bz0yLjAsIHRpbnkgPSAxLjBlLTMwLCBodWdlID0gMS4wZTMwOworZmxvYXQKK3RhbmhmKGZsb2F0IHgpCit7CisJZmxvYXQgdCx6OworCWludDMyX3QgangsaXg7CisKKwlHRVRfRkxPQVRfV09SRChqeCx4KTsKKwlpeCA9IGp4JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgeworCSAgICBpZiAoang+PTApIHJldHVybiBvbmUveCtvbmU7ICAgIC8qIHRhbmgoKy1pbmYpPSstMSAqLworCSAgICBlbHNlICAgICAgIHJldHVybiBvbmUveC1vbmU7ICAgIC8qIHRhbmgoTmFOKSA9IE5hTiAqLworCX0KKworICAgIC8qIHx4fCA8IDkgKi8KKwlpZiAoaXggPCAweDQxMTAwMDAwKSB7CQkvKiB8eHw8OSAqLworCSAgICBpZiAoaXg8MHgzOTgwMDAwMCkgewkvKiB8eHw8MioqLTEyICovCisJCWlmKGh1Z2UreD5vbmUpIHJldHVybiB4OyAvKiB0YW5oKHRpbnkpID0gdGlueSB3aXRoIGluZXhhY3QgKi8KKwkgICAgfQorCSAgICBpZiAoaXg+PTB4M2Y4MDAwMDApIHsJLyogfHh8Pj0xICAqLworCQl0ID0gZXhwbTFmKHR3bypmYWJzZih4KSk7CisJCXogPSBvbmUgLSB0d28vKHQrdHdvKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHQgPSBleHBtMWYoLXR3bypmYWJzZih4KSk7CisJICAgICAgICB6PSAtdC8odCt0d28pOworCSAgICB9CisgICAgLyogfHh8ID49IDksIHJldHVybiArLTEgKi8KKwl9IGVsc2UgeworCSAgICB6ID0gb25lIC0gdGlueTsJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCX0KKwlyZXR1cm4gKGp4Pj0wKT8gejogLXo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RydW5jLmMgYi9saWJtL3NyYy9zX3RydW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyODdlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdHJ1bmMuYwpAQCAtMCwwICsxLDYxIEBACisvKiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190cnVuYy5jLHYgMS4xIDIwMDQvMDYvMjAgMDk6MjU6NDMgZGFzIEV4cCAkIik7ICovCisKKy8qCisgKiB0cnVuYyh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgMCB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gdHJ1bmMoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworZG91YmxlCit0cnVuYyhkb3VibGUgeCkKK3sKKwlpbnQzMl90IGkwLGkxLGowOworCXVfaW50MzJfdCBpLGo7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlqMCA9ICgoaTA+PjIwKSYweDdmZiktMHgzZmY7CisJaWYoajA8MjApIHsKKwkgICAgaWYoajA8MCkgeyAJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJaWYoaHVnZSt4PjAuMCkgey8qIHx4fDwxLCBzbyByZXR1cm4gMCpzaWduKHgpICovCisJCSAgICBpMCAmPSAweDgwMDAwMDAwVTsKKwkJICAgIGkxID0gMDsKKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpMCAmPSAofmkpOyBpMT0wOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKGowPjUxKSB7CisJICAgIGlmKGowPT0weDQwMCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0gZWxzZSB7CisJICAgIGkgPSAoKHVfaW50MzJfdCkoMHhmZmZmZmZmZikpPj4oajAtMjApOworCSAgICBpZigoaTEmaSk9PTApIHJldHVybiB4OwkvKiB4IGlzIGludGVncmFsICovCisJICAgIGlmKGh1Z2UreD4wLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJaTEgJj0gKH5pKTsKKwl9CisJSU5TRVJUX1dPUkRTKHgsaTAsaTEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190cnVuY2YuYyBiL2xpYm0vc3JjL3NfdHJ1bmNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNzI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdHJ1bmNmLmMKQEAgLTAsMCArMSw1MyBAQAorLyogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdHJ1bmNmLmMsdiAxLjEgMjAwNC8wNi8yMCAwOToyNTo0MyBkYXMgRXhwICQiKTsgKi8KKworLyoKKyAqIHRydW5jZih4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgMCB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gdHJ1bmNmKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBodWdlID0gMS4wZTMwRjsKKworZmxvYXQKK3RydW5jZihmbG9hdCB4KQoreworCWludDMyX3QgaTAsajA7CisJdV9pbnQzMl90IGk7CisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsKKwlpZihqMDwyMykgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wRikJCS8qIHx4fDwxLCBzbyByZXR1cm4gMCpzaWduKHgpICovCisJCSAgICBpMCAmPSAweDgwMDAwMDAwOworCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDA3ZmZmZmYpPj5qMDsKKwkJaWYoKGkwJmkpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+MC4wRikJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkgICAgaTAgJj0gKH5pKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGowPT0weDgwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaTApOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190cnVuY2wuYyBiL2xpYm0vc3JjL3NfdHJ1bmNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5MjZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdHJ1bmNsLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBGcm9tOiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNAorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RydW5jbC5jLHYgMS40IDIwMDUvMDQvMjggMTk6NDU6NTUgc3RlZmFuZiBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIHRydW5jbCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgMCB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gdHJ1bmNsKHgpLgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCU1BTkhfU0laRQkoTERCTF9NQU5IX1NJWkUgKyAxKQorI2Vsc2UKKyNkZWZpbmUJTUFOSF9TSVpFCUxEQkxfTUFOSF9TSVpFCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitsb25nIGRvdWJsZQordHJ1bmNsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1ID0geyAuZSA9IHggfTsKKwlpbnQgZSA9IHUuYml0cy5leHAgLSBMREJMX01BWF9FWFAgKyAxOworCisJaWYgKGUgPCBNQU5IX1NJWkUgLSAxKSB7CisJCWlmIChlIDwgMCkgewkJCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCQlpZiAoaHVnZSArIHggPiAwLjApCisJCQkJdS5lID0gMC4wOworCQl9IGVsc2UgeworCQkJdWludDY0X3QgbSA9ICgoMWxsdSA8PCBNQU5IX1NJWkUpIC0gMSkgPj4gKGUgKyAxKTsKKwkJCWlmICgoKHUuYml0cy5tYW5oICYgbSkgfCB1LmJpdHMubWFubCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCQlpZiAoaHVnZSArIHggPiAwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQkJdS5iaXRzLm1hbmggJj0gfm07CisJCQkJdS5iaXRzLm1hbmwgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlIDwgTERCTF9NQU5UX0RJRyAtIDEpIHsKKwkJdWludDY0X3QgbSA9ICh1aW50NjRfdCktMSA+PiAoNjQgLSBMREJMX01BTlRfRElHICsgZSArIDEpOworCQlpZiAoKHUuYml0cy5tYW5sICYgbSkgPT0gMCkKKwkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYgKGh1Z2UgKyB4ID4gMC4wKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCQl1LmJpdHMubWFubCAmPSB+bTsKKwl9CisJcmV0dXJuICh1LmUpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvd19jYWJzLmMgYi9saWJtL3NyYy93X2NhYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdlNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvd19jYWJzLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGNhYnMoKSB3cmFwcGVyIGZvciBoeXBvdCgpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPQorICAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvd19jYWJzLmMsdiAxLjQgMjAwMS8wNi8xMyAxNToxNjozMCBydSBFeHAgJCI7CisjZW5kaWYgLyogbm90IGxpbnQgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK2RvdWJsZQorY2Ficyh6KQorCWRvdWJsZSBjb21wbGV4IHo7Cit7CisJcmV0dXJuIGh5cG90KGNyZWFsKHopLCBjaW1hZyh6KSk7Cit9CisKK2RvdWJsZQorel9hYnMoeikKKwlkb3VibGUgY29tcGxleCAqejsKK3sKKwlyZXR1cm4gaHlwb3QoY3JlYWwoKnopLCBjaW1hZygqeikpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvd19jYWJzZi5jIGIvbGlibS9zcmMvd19jYWJzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzE1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2NhYnNmLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGNhYnNmKCkgd3JhcHBlciBmb3IgaHlwb3RmKCkuCisgKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIDxqdGNAd2ltc2V5LmNvbT4KKyAqIFBsYWNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLCAxOTk0LgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9CisgICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy93X2NhYnNmLmMsdiAxLjMgMjAwMS8wNi8xMyAxNToxNjozMCBydSBFeHAgJCI7CisjZW5kaWYgLyogbm90IGxpbnQgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitjYWJzZih6KQorCWZsb2F0IGNvbXBsZXggejsKK3sKKworCXJldHVybiBoeXBvdGYoY3JlYWxmKHopLCBjaW1hZ2YoeikpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvd19kcmVtLmMgYi9saWJtL3NyYy93X2RyZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjY4NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvd19kcmVtLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGRyZW0oKSB3cmFwcGVyIGZvciByZW1haW5kZXIoKS4KKyAqCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgPGp0Y0B3aW1zZXkuY29tPgorICogUGxhY2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4sIDE5OTQuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCitkcmVtKHgsIHkpCisJZG91YmxlIHgsIHk7Cit7CisJcmV0dXJuIHJlbWFpbmRlcih4LCB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3dfZHJlbWYuYyBiL2xpYm0vc3JjL3dfZHJlbWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNhYzBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvd19kcmVtZi5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBkcmVtZigpIHdyYXBwZXIgZm9yIHJlbWFpbmRlcmYoKS4KKyAqCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgPGp0Y0B3aW1zZXkuY29tPgorICogUGxhY2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4sIDE5OTQuCisgKi8KKy8qICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3dfZHJlbWYuYyx2IDEuMyAyMDA0LzA3LzI4IDA1OjUzOjE4IGthbiBFeHAgJCAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorZHJlbWYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwlyZXR1cm4gcmVtYWluZGVyZih4LCB5KTsKK30K