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+IC4uLgorCQkgKiAgc2luZ2xlIDguODcyMjgzOTM1NWUrMDEKKwkJICogIGRvdWJsZSA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMgorCQkgKiAgbG9uZyBkb3VibGUgMS4xMzU2NTIzNDA2Mjk0MTQzOTQ5NDkxOTMxMDc3OTcwNzY1MDA2MTcwZSswNAorCQkgKiAgdGhlbiByZWN1cnJlbnQgdmFsdWUgbWF5IG92ZXJmbG93IGFuZCB0aGUgcmVzdWx0IGlzCisJCSAqICBsaWtlbHkgdW5kZXJmbG93IHRvIHplcm8KKwkJICovCisJCXRtcCA9IG47CisJCXYgPSB0d28veDsKKwkJdG1wID0gdG1wKl9faWVlZTc1NF9sb2dmKGZhYnNmKHYqdG1wKSk7CisJCWlmKHRtcDwoZmxvYXQpOC44NzIxNjc5Njg4ZSswMSkgeworCSAgICAJICAgIGZvcihpPW4tMSxkaT0oZmxvYXQpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCSAgICAgCSAgICB9CisJCX0gZWxzZSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShmbG9hdCkoaStpKTtpPjA7aS0tKXsKKwkJICAgICAgICB0ZW1wID0gYjsKKwkJCWIgKj0gZGk7CisJCQliICA9IGIveCAtIGE7CisJCSAgICAgICAgYSA9IHRlbXA7CisJCQlkaSAtPSB0d287CisJCSAgICAvKiBzY2FsZSBiIHRvIGF2b2lkIHNwdXJpb3VzIG92ZXJmbG93ICovCisJCQlpZihiPihmbG9hdCkxZTEwKSB7CisJCQkgICAgYSAvPSBiOworCQkJICAgIHQgLz0gYjsKKwkJCSAgICBiICA9IG9uZTsKKwkJCX0KKwkgICAgIAkgICAgfQorCQl9CisJICAgIAliID0gKHQqX19pZWVlNzU0X2owZih4KS9iKTsKKwkgICAgfQorCX0KKwlpZihzZ249PTEpIHJldHVybiAtYjsgZWxzZSByZXR1cm4gYjsKK30KKworZmxvYXQKK19faWVlZTc1NF95bmYoaW50IG4sIGZsb2F0IHgpCit7CisJaW50MzJfdCBpLGh4LGl4LGliOworCWludDMyX3Qgc2lnbjsKKwlmbG9hdCBhLCBiLCB0ZW1wOworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIFkobixOYU4pIGlzIE5hTiAqLworCWlmKGl4PjB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJaWYoaXg9PTApIHJldHVybiAtb25lL3plcm87CisJaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKwlzaWduID0gMTsKKwlpZihuPDApeworCQluID0gLW47CisJCXNpZ24gPSAxIC0gKChuJjEpPDwxKTsKKwl9CisJaWYobj09MCkgcmV0dXJuKF9faWVlZTc1NF95MGYoeCkpOworCWlmKG49PTEpIHJldHVybihzaWduKl9faWVlZTc1NF95MWYoeCkpOworCWlmKGl4PT0weDdmODAwMDAwKSByZXR1cm4gemVybzsKKworCWEgPSBfX2llZWU3NTRfeTBmKHgpOworCWIgPSBfX2llZWU3NTRfeTFmKHgpOworCS8qIHF1aXQgaWYgYiBpcyAtaW5mICovCisJR0VUX0ZMT0FUX1dPUkQoaWIsYik7CisJZm9yKGk9MTtpPG4mJmliIT0weGZmODAwMDAwO2krKyl7CisJICAgIHRlbXAgPSBiOworCSAgICBiID0gKChmbG9hdCkoaStpKS94KSpiIC0gYTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaWIsYik7CisJICAgIGEgPSB0ZW1wOworCX0KKwlpZihzaWduPjApIHJldHVybiBiOyBlbHNlIHJldHVybiAtYjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hLmMgYi9saWJtL3NyYy9lX2xnYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWQ0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xnYW1tYS5jCkBAIC0wLDAgKzEsMzQgQEAKKworLyogQCgjKWVfbGdhbW1hLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYS5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbGdhbW1hKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2xnYW1tYV9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitkb3VibGUKK19faWVlZTc1NF9sZ2FtbWEoZG91YmxlIHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFfcih4LCZzaWduZ2FtKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hX3IuYyBiL2xpYm0vc3JjL2VfbGdhbW1hX3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRiZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFfci5jCkBAIC0wLDAgKzEsMjk3IEBACisKKy8qIEAoIyllX2xnYW1tYV9yLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYV9yLmMsdiAxLjggMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sZ2FtbWFfcih4LCBzaWduZ2FtcCkKKyAqIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIAorICogd2l0aCB1c2VyIHByb3ZpZGUgcG9pbnRlciBmb3IgdGhlIHNpZ24gb2YgR2FtbWEoeCkuIAorICoKKyAqIE1ldGhvZDoKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uIGZvciAwIDwgeCA8PSA4CisgKiAJU2luY2UgZ2FtbWEoMStzKT1zKmdhbW1hKHMpLCBmb3IgeCBpbiBbMCw4XSwgd2UgbWF5IAorICogCXJlZHVjZSB4IHRvIGEgbnVtYmVyIGluIFsxLjUsMi41XSBieQorICogCQlsZ2FtbWEoMStzKSA9IGxvZyhzKSArIGxnYW1tYShzKQorICoJZm9yIGV4YW1wbGUsCisgKgkJbGdhbW1hKDcuMykgPSBsb2coNi4zKSArIGxnYW1tYSg2LjMpCisgKgkJCSAgICA9IGxvZyg2LjMqNS4zKSArIGxnYW1tYSg1LjMpCisgKgkJCSAgICA9IGxvZyg2LjMqNS4zKjQuMyozLjMqMi4zKSArIGxnYW1tYSgyLjMpCisgKiAgIDIuIFBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiBsZ2FtbWEgYXJvdW5kIGl0cworICoJbWluaW11biB5bWluPTEuNDYxNjMyMTQ0OTY4MzYyMjQ1IHRvIG1haW50YWluIG1vbm90b25pY2l0eS4KKyAqCU9uIFt5bWluLTAuMjMsIHltaW4rMC4yN10gKGkuZS4sIFsxLjIzMTY0LDEuNzMxNjNdKSwgdXNlCisgKgkJTGV0IHogPSB4LXltaW47CisgKgkJbGdhbW1hKHgpID0gLTEuMjE0ODYyOTA1MzU4NDk2MDc4MjE4ICsgel4yKnBvbHkoeikKKyAqCXdoZXJlCisgKgkJcG9seSh6KSBpcyBhIDE0IGRlZ3JlZSBwb2x5bm9taWFsLgorICogICAyLiBSYXRpb25hbCBhcHByb3hpbWF0aW9uIGluIHRoZSBwcmltYXJ5IGludGVydmFsIFsyLDNdCisgKglXZSB1c2UgdGhlIGZvbGxvd2luZyBhcHByb3hpbWF0aW9uOgorICoJCXMgPSB4LTIuMDsKKyAqCQlsZ2FtbWEoeCkgPSAwLjUqcyArIHMqUChzKS9RKHMpCisgKgl3aXRoIGFjY3VyYWN5CisgKgkJfFAvUSAtIChsZ2FtbWEoeCktMC41cyl8IDwgMioqLTYxLjcxCisgKglPdXIgYWxnb3JpdGhtcyBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBvYnNlcnZhdGlvbgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXRhKDIpLTEgICAgMiAgICB6ZXRhKDMpLTEgICAgMworICogbGdhbW1hKDIrcykgPSBzKigxLUV1bGVyKSArIC0tLS0tLS0tLSAqIHMgIC0gIC0tLS0tLS0tLSAqIHMgICsgLi4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgIDMKKyAqCisgKgl3aGVyZSBFdWxlciA9IDAuNTc3MS4uLiBpcyB0aGUgRXVsZXIgY29uc3RhbnQsIHdoaWNoIGlzIHZlcnkKKyAqCWNsb3NlIHRvIDAuNS4KKyAqCisgKiAgIDMuIEZvciB4Pj04LCB3ZSBoYXZlCisgKglsZ2FtbWEoeCl+KHgtMC41KWxvZyh4KS14KzAuNSpsb2coMnBpKSsxLygxMngpLTEvKDM2MHgqKjMpKy4uLi4KKyAqCShiZXR0ZXIgZm9ybXVsYToKKyAqCSAgIGxnYW1tYSh4KX4oeC0wLjUpKihsb2coeCktMSktLjUqKGxvZygycGkpLTEpICsgLi4uKQorICoJTGV0IHogPSAxL3gsIHRoZW4gd2UgYXBwcm94aW1hdGlvbgorICoJCWYoeikgPSBsZ2FtbWEoeCkgLSAoeC0wLjUpKGxvZyh4KS0xKQorICoJYnkKKyAqCSAgCQkJICAgIDMgICAgICAgNSAgICAgICAgICAgICAxMQorICoJCXcgPSB3MCArIHcxKnogKyB3Mip6ICArIHczKnogICsgLi4uICsgdzYqegorICoJd2hlcmUgCisgKgkJfHcgLSBmKHopfCA8IDIqKi01OC43NAorICoJCQorICogICA0LiBGb3IgbmVnYXRpdmUgeCwgc2luY2UgKEcgaXMgZ2FtbWEgZnVuY3Rpb24pCisgKgkJLXgqRygteCkqRyh4KSA9IHBpL3NpbihwaSp4KSwKKyAqIAl3ZSBoYXZlCisgKiAJCUcoeCkgPSBwaS8oc2luKHBpKngpKigteCkqRygteCkpCisgKglzaW5jZSBHKC14KSBpcyBwb3NpdGl2ZSwgc2lnbihHKHgpKSA9IHNpZ24oc2luKHBpKngpKSBmb3IgeDwwCisgKglIZW5jZSwgZm9yIHg8MCwgc2lnbmdhbSA9IHNpZ24oc2luKHBpKngpKSBhbmQgCisgKgkJbGdhbW1hKHgpID0gbG9nKHxHYW1tYSh4KXwpCisgKgkJCSAgPSBsb2cocGkvKHx4KnNpbihwaSp4KXwpKSAtIGxnYW1tYSgteCk7CisgKglOb3RlOiBvbmUgc2hvdWxkIGF2b2lkIGNvbXB1dGUgcGkqKC14KSBkaXJlY3RseSBpbiB0aGUgCisgKgkgICAgICBjb21wdXRhdGlvbiBvZiBzaW4ocGkqKC14KSkuCisgKgkJCisgKiAgIDUuIFNwZWNpYWwgQ2FzZXMKKyAqCQlsZ2FtbWEoMitzKSB+IHMqKDEtRXVsZXIpIGZvciB0aW55IHMKKyAqCQlsZ2FtbWEoMSk9bGdhbW1hKDIpPTAKKyAqCQlsZ2FtbWEoeCkgfiAtbG9nKHgpIGZvciB0aW55IHgKKyAqCQlsZ2FtbWEoMCkgPSBsZ2FtbWEoaW5mKSA9IGluZgorICoJIAlsZ2FtbWEoLWludGVnZXIpID0gKy1pbmYKKyAqCQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzUyPSAgNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4NDMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KK2hhbGY9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitwaSAgPSAgMy4xNDE1OTI2NTM1ODk3OTMxMTYwMGUrMDAsIC8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK2EwICA9ICA3LjcyMTU2NjQ5MDE1MzI4NjU1NDk0ZS0wMiwgLyogMHgzRkIzQzQ2NywgMHhFMzdEQjBDOCAqLworYTEgID0gIDMuMjI0NjcwMzM0MjQxMTM1OTE2MTFlLTAxLCAvKiAweDNGRDRBMzRDLCAweEM0QTYwRkFEICovCithMiAgPSAgNi43MzUyMzAxMDUzMTI5MjY4MTgyNGUtMDIsIC8qIDB4M0ZCMTNFMDAsIDB4MUE1NTYyQTcgKi8KK2EzICA9ICAyLjA1ODA4MDg0MzI1MTY3MzMyODA2ZS0wMiwgLyogMHgzRjk1MTMyMiwgMHhBQzkyNTQ3QiAqLworYTQgID0gIDcuMzg1NTUwODYwODE0MDI4ODM5NTdlLTAzLCAvKiAweDNGN0U0MDRGLCAweEI2OEZFRkU4ICovCithNSAgPSAgMi44OTA1MTM4MzY3MzQxNTYyOTA5MWUtMDMsIC8qIDB4M0Y2N0FERDgsIDB4Q0NCNzkyNkIgKi8KK2E2ICA9ICAxLjE5MjcwNzYzMTgzMzYyMDY3ODQ1ZS0wMywgLyogMHgzRjUzOEE5NCwgMHgxMTZGM0Y1RCAqLworYTcgID0gIDUuMTAwNjk3OTIxNTM1MTEzMzY2MDhlLTA0LCAvKiAweDNGNDBCNkM2LCAweDg5Qjk5QzAwICovCithOCAgPSAgMi4yMDg2Mjc5MDcxMzkwODM4NTU1N2UtMDQsIC8qIDB4M0YyQ0YyRUMsIDB4RUQxMEU1NEQgKi8KK2E5ICA9ICAxLjA4MDExNTY3MjQ3NTgzOTM5OTU0ZS0wNCwgLyogMHgzRjFDNTA4OCwgMHg5ODdERkIwNyAqLworYTEwID0gIDIuNTIxNDQ1NjU0NTEyNTczMjY5MzllLTA1LCAvKiAweDNFRkE3MDc0LCAweDQyOENGQTUyICovCithMTEgPSAgNC40ODY0MDk0OTYxODkxNTE2MDE1MGUtMDUsIC8qIDB4M0YwNzg1OEUsIDB4OTBBNDU4MzcgKi8KK3RjICA9ICAxLjQ2MTYzMjE0NDk2ODM2MjI0NTc2ZSswMCwgLyogMHgzRkY3NjJEOCwgMHg2MzU2QkUzRiAqLwordGYgID0gLTEuMjE0ODYyOTA1MzU4NDk2MTE0NjFlLTAxLCAvKiAweEJGQkYxOUI5LCAweEJDQzM4QTQyICovCisvKiB0dCA9IC0odGFpbCBvZiB0ZikgKi8KK3R0ICA9IC0zLjYzODY3Njk5NzAzOTUwNTM2NTQxZS0xOCwgLyogMHhCQzUwQzdDQSwgMHhBNDhBOTcxRiAqLwordDAgID0gIDQuODM4MzYxMjI3MjM4MTAwNDcwNDJlLTAxLCAvKiAweDNGREVGNzJCLCAweEM4RUUzOEEyICovCit0MSAgPSAtMS40NzU4NzcyMjk5NDU5MzkxMTc1MmUtMDEsIC8qIDB4QkZDMkU0MjcsIDB4OERDNkM1MDkgKi8KK3QyICA9ICA2LjQ2MjQ5NDAyMzkxMzMzODU0Nzc4ZS0wMiwgLyogMHgzRkIwOEI0MiwgMHg5NEQ1NDE5QiAqLwordDMgID0gLTMuMjc4ODU0MTA3NTk4NTk2NDk1NjVlLTAyLCAvKiAweEJGQTBDOUE4LCAweERGMzVCNzEzICovCit0NCAgPSAgMS43OTcwNjc1MDgxMTgyMDM4NzEyNmUtMDIsIC8qIDB4M0Y5MjY2RTcsIDB4OTcwQUY5RUMgKi8KK3Q1ICA9IC0xLjAzMTQyMjQxMjk4MzQxNDM3NDUwZS0wMiwgLyogMHhCRjg1MUY5RiwgMHhCQTkxRUM2QSAqLwordDYgID0gIDYuMTAwNTM4NzAyNDYyOTEzMzI2MzVlLTAzLCAvKiAweDNGNzhGQ0UwLCAweEUzNzBFMzQ0ICovCit0NyAgPSAtMy42ODQ1MjAxNjc4MTEzODI1Njc2MGUtMDMsIC8qIDB4QkY2RTJFRkYsIDB4QjNFOTE0RDcgKi8KK3Q4ICA9ICAyLjI1OTY0NzgwOTAwNjEyNDcyMjUwZS0wMywgLyogMHgzRjYyODJEMywgMHgyRTE1QzkxNSAqLwordDkgID0gLTEuNDAzNDY0Njk5ODkyMzI4NDM4MTNlLTAzLCAvKiAweEJGNTZGRThFLCAweEJGMkQxQUYxICovCit0MTAgPSAgOC44MTA4MTg4MjQzNzY1NDAxMTM4MmUtMDQsIC8qIDB4M0Y0Q0RGMEMsIDB4RUY2MUE4RTkgKi8KK3QxMSA9IC01LjM4NTk1MzA1MzU2NzQwNTQ2NzE1ZS0wNCwgLyogMHhCRjQxQTYxMCwgMHg5QzczRTBFQyAqLwordDEyID0gIDMuMTU2MzIwNzA5MDM2MjU5NTAzNjFlLTA0LCAvKiAweDNGMzRBRjZELCAweDZDMEVCQkY3ICovCit0MTMgPSAtMy4xMjc1NDE2ODM3NTEyMDg2MDUxOGUtMDQsIC8qIDB4QkYzNDdGMjQsIDB4RUNDMzhDMzggKi8KK3QxNCA9ICAzLjM1NTI5MTkyNjM1NTE5MDczNTQzZS0wNCwgLyogMHgzRjM1RkQzRSwgMHhFOEMyRDNGNCAqLwordTAgID0gLTcuNzIxNTY2NDkwMTUzMjg2NTU0OTRlLTAyLCAvKiAweEJGQjNDNDY3LCAweEUzN0RCMEM4ICovCit1MSAgPSAgNi4zMjgyNzA2NDAyNTA5MzM2NjUxN2UtMDEsIC8qIDB4M0ZFNDQwMUUsIDB4OEIwMDVERkYgKi8KK3UyICA9ICAxLjQ1NDkyMjUwMTM3MjM0NzY4NzM3ZSswMCwgLyogMHgzRkY3NDc1QywgMHhEMTE5QkQ2RiAqLwordTMgID0gIDkuNzc3MTc1Mjc5NjMzNzI3NDU2MDNlLTAxLCAvKiAweDNGRUY0OTc2LCAweDQ0RUE4NDUwICovCit1NCAgPSAgMi4yODk2MzcyODA2NDY5MjQ1MTA5MmUtMDEsIC8qIDB4M0ZDRDRFQUUsIDB4RjYwMTA5MjQgKi8KK3U1ICA9ICAxLjMzODEwOTE4NTM2Nzg3NjYwMzc3ZS0wMiwgLyogMHgzRjhCNjc4QiwgMHhCRjJCQUIwOSAqLwordjEgID0gIDIuNDU1OTc3OTM3MTMwNDExMzQ4MjJlKzAwLCAvKiAweDQwMDNBNUQ3LCAweEMyQkQ2MTlDICovCit2MiAgPSAgMi4xMjg0ODk3NjM3OTg5MzM5NTM2MWUrMDAsIC8qIDB4NDAwMTA3MjUsIDB4QTQyQjE4RjUgKi8KK3YzICA9ICA3LjY5Mjg1MTUwNDU2NjcyNzgzODI1ZS0wMSwgLyogMHgzRkU4OURGQiwgMHhFNDUwNTBBRiAqLwordjQgID0gIDEuMDQyMjI2NDU1OTMzNjkxMzQyNTRlLTAxLCAvKiAweDNGQkFBRTU1LCAweEQ2NTM3Qzg4ICovCit2NSAgPSAgMy4yMTcwOTI0MjI4MjQyMzkxMTgxMGUtMDMsIC8qIDB4M0Y2QTVBQkIsIDB4NTdEMENGNjEgKi8KK3MwICA9IC03LjcyMTU2NjQ5MDE1MzI4NjU1NDk0ZS0wMiwgLyogMHhCRkIzQzQ2NywgMHhFMzdEQjBDOCAqLworczEgID0gIDIuMTQ5ODI0MTU5NjA2MDg4NTI1MDFlLTAxLCAvKiAweDNGQ0I4NDhCLCAweDM2RTIwODc4ICovCitzMiAgPSAgMy4yNTc3ODc5NjQwODkzMDk4MTc4N2UtMDEsIC8qIDB4M0ZENEQ5OEYsIDB4NEYxMzlGNTkgKi8KK3MzICA9ICAxLjQ2MzUwNDcyNjUyNDY0NDUyODA1ZS0wMSwgLyogMHgzRkMyQkI5QywgMHhCRUU1RjJGNyAqLworczQgID0gIDIuNjY0MjI3MDMwMzM2Mzg2MDk1NjBlLTAyLCAvKiAweDNGOUI0ODFDLCAweDdFOTM5OTYxICovCitzNSAgPSAgMS44NDAyODQ1MTQwNzMzNzcxNTY1MmUtMDMsIC8qIDB4M0Y1RTI2QjYsIDB4NzM2OEYyMzkgKi8KK3M2ICA9ICAzLjE5NDc1MzI2NTg0MTAwODY3NjE3ZS0wNSwgLyogMHgzRjAwQkZFQywgMHhERDE3RTk0NSAqLworcjEgID0gIDEuMzkyMDA1MzM0Njc2MjEwNDU5NThlKzAwLCAvKiAweDNGRjY0NUE3LCAweDYyQzRBQjc0ICovCityMiAgPSAgNy4yMTkzNTU0NzU2NzEzODA2OTUyNWUtMDEsIC8qIDB4M0ZFNzFBMTgsIDB4OTNEM0RDREMgKi8KK3IzICA9ICAxLjcxOTMzODY1NjMyODAzMDc4OTkzZS0wMSwgLyogMHgzRkM2MDFFRCwgMHhDQ0ZCREYyNyAqLworcjQgID0gIDEuODY0NTkxOTE3MTU2NTI5MDEzNDRlLTAyLCAvKiAweDNGOTMxN0VBLCAweDc0MkVENDc1ICovCityNSAgPSAgNy43Nzk0MjQ5NjM4MTg5MzU5NjQzNGUtMDQsIC8qIDB4M0Y0OTdEREEsIDB4Q0E0MUE5NUIgKi8KK3I2ICA9ICA3LjMyNjY4NDMwNzQ0NjI1NjM2MTg5ZS0wNiwgLyogMHgzRURFQkFGNywgMHhBNUIzODE0MCAqLwordzAgID0gIDQuMTg5Mzg1MzMyMDQ2NzI3MjUwNTJlLTAxLCAvKiAweDNGREFDRkUzLCAweDkwQzk3RDY5ICovCit3MSAgPSAgOC4zMzMzMzMzMzMzMzMyOTY3ODg0OWUtMDIsIC8qIDB4M0ZCNTU1NTUsIDB4NTU1NTU1M0IgKi8KK3cyICA9IC0yLjc3Nzc3Nzc3NzI4Nzc1NTM2NDcwZS0wMywgLyogMHhCRjY2QzE2QywgMHgxNkIwMkU1QyAqLwordzMgID0gIDcuOTM2NTA1NTg2NDMwMTk1NTg1MDBlLTA0LCAvKiAweDNGNEEwMTlGLCAweDk4Q0YzOEI2ICovCit3NCAgPSAtNS45NTE4NzU1NzQ1MDMzOTk2MzEzNWUtMDQsIC8qIDB4QkY0MzgwQ0IsIDB4OEMwRkU3NDEgKi8KK3c1ICA9ICA4LjM2MzM5OTE4OTk2MjgyMTM5MTI2ZS0wNCwgLyogMHgzRjRCNjdCQSwgMHg0Q0RBRDVEMSAqLwordzYgID0gLTEuNjMwOTI5MzQwOTY1NzUyNzM5ODllLTAzOyAvKiAweEJGNUFCODlELCAweDBCOUU0M0U0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybz0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwOworCisJc3RhdGljIGRvdWJsZSBzaW5fcGkoZG91YmxlIHgpCit7CisJZG91YmxlIHksejsKKwlpbnQgbixpeDsKKworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworCWlmKGl4PDB4M2ZkMDAwMDApIHJldHVybiBfX2tlcm5lbF9zaW4ocGkqeCx6ZXJvLDApOworCXkgPSAteDsJCS8qIHggaXMgYXNzdW1lIG5lZ2F0aXZlICovCisKKyAgICAvKgorICAgICAqIGFyZ3VtZW50IHJlZHVjdGlvbiwgbWFrZSBzdXJlIGluZXhhY3QgZmxhZyBub3QgcmFpc2VkIGlmIGlucHV0CisgICAgICogaXMgYW4gaW50ZWdlcgorICAgICAqLworCXogPSBmbG9vcih5KTsKKwlpZih6IT15KSB7CQkJCS8qIGluZXhhY3QgYW55d2F5ICovCisJICAgIHkgICo9IDAuNTsKKwkgICAgeSAgID0gMi4wKih5IC0gZmxvb3IoeSkpOwkJLyogeSA9IHx4fCBtb2QgMi4wICovCisJICAgIG4gICA9IChpbnQpICh5KjQuMCk7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGl4Pj0weDQzNDAwMDAwKSB7CisgICAgICAgICAgICAgICAgeSA9IHplcm87IG4gPSAwOyAgICAgICAgICAgICAgICAgLyogeSBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg0MzMwMDAwMCkgeiA9IHkrdHdvNTI7CS8qIGV4YWN0ICovCisJCUdFVF9MT1dfV09SRChuLHopOworCQluICY9IDE7CisgICAgICAgICAgICAgICAgeSAgPSBuOworICAgICAgICAgICAgICAgIG48PD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAobikgeworCSAgICBjYXNlIDA6ICAgeSA9ICBfX2tlcm5lbF9zaW4ocGkqeSx6ZXJvLDApOyBicmVhazsKKwkgICAgY2FzZSAxOiAgIAorCSAgICBjYXNlIDI6ICAgeSA9ICBfX2tlcm5lbF9jb3MocGkqKDAuNS15KSx6ZXJvKTsgYnJlYWs7CisJICAgIGNhc2UgMzogIAorCSAgICBjYXNlIDQ6ICAgeSA9ICBfX2tlcm5lbF9zaW4ocGkqKG9uZS15KSx6ZXJvLDApOyBicmVhazsKKwkgICAgY2FzZSA1OgorCSAgICBjYXNlIDY6ICAgeSA9IC1fX2tlcm5lbF9jb3MocGkqKHktMS41KSx6ZXJvKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6ICB5ID0gIF9fa2VybmVsX3NpbihwaSooeS0yLjApLHplcm8sMCk7IGJyZWFrOworCSAgICB9CisJcmV0dXJuIC15OworfQorCisKK2RvdWJsZQorX19pZWVlNzU0X2xnYW1tYV9yKGRvdWJsZSB4LCBpbnQgKnNpZ25nYW1wKQoreworCWRvdWJsZSB0LHkseixuYWRqLHAscDEscDIscDMscSxyLHc7CisJaW50IGksaHgsbHgsaXg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCisgICAgLyogcHVyZ2Ugb2ZmICstaW5mLCBOYU4sICstMCwgYW5kIG5lZ2F0aXZlIGFyZ3VtZW50cyAqLworCSpzaWduZ2FtcCA9IDE7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OworCWlmKChpeHxseCk9PTApIHJldHVybiBvbmUvemVybzsKKwlpZihpeDwweDNiOTAwMDAwKSB7CS8qIHx4fDwyKiotNzAsIHJldHVybiAtbG9nKHx4fCkgKi8KKwkgICAgaWYoaHg8MCkgeworCSAgICAgICAgKnNpZ25nYW1wID0gLTE7CisJICAgICAgICByZXR1cm4gLV9faWVlZTc1NF9sb2coLXgpOworCSAgICB9IGVsc2UgcmV0dXJuIC1fX2llZWU3NTRfbG9nKHgpOworCX0KKwlpZihoeDwwKSB7CisJICAgIGlmKGl4Pj0weDQzMzAwMDAwKSAJLyogfHh8Pj0yKio1MiwgbXVzdCBiZSAtaW50ZWdlciAqLworCQlyZXR1cm4gb25lL3plcm87CisJICAgIHQgPSBzaW5fcGkoeCk7CisJICAgIGlmKHQ9PXplcm8pIHJldHVybiBvbmUvemVybzsgLyogLWludGVnZXIgKi8KKwkgICAgbmFkaiA9IF9faWVlZTc1NF9sb2cocGkvZmFicyh0KngpKTsKKwkgICAgaWYodDx6ZXJvKSAqc2lnbmdhbXAgPSAtMTsKKwkgICAgeCA9IC14OworCX0KKworICAgIC8qIHB1cmdlIG9mZiAxIGFuZCAyICovCisJaWYoKCgoaXgtMHgzZmYwMDAwMCl8bHgpPT0wKXx8KCgoaXgtMHg0MDAwMDAwMCl8bHgpPT0wKSkgciA9IDA7CisgICAgLyogZm9yIHggPCAyLjAgKi8KKwllbHNlIGlmKGl4PDB4NDAwMDAwMDApIHsKKwkgICAgaWYoaXg8PTB4M2ZlY2NjY2MpIHsgCS8qIGxnYW1tYSh4KSA9IGxnYW1tYSh4KzEpLWxvZyh4KSAqLworCQlyID0gLV9faWVlZTc1NF9sb2coeCk7CisJCWlmKGl4Pj0weDNGRTc2OTQ0KSB7eSA9IG9uZS14OyBpPSAwO30KKwkJZWxzZSBpZihpeD49MHgzRkNEQTY2MSkge3k9IHgtKHRjLW9uZSk7IGk9MTt9CisJICAJZWxzZSB7eSA9IHg7IGk9Mjt9CisJICAgIH0gZWxzZSB7CisJICAJciA9IHplcm87CisJICAgICAgICBpZihpeD49MHgzRkZCQjRDMykge3k9Mi4wLXg7aT0wO30gLyogWzEuNzMxNiwyXSAqLworCSAgICAgICAgZWxzZSBpZihpeD49MHgzRkYzQjRDNCkge3k9eC10YztpPTE7fSAvKiBbMS4yMywxLjczXSAqLworCQllbHNlIHt5PXgtb25lO2k9Mjt9CisJICAgIH0KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgICBjYXNlIDA6CisJCXogPSB5Knk7CisJCXAxID0gYTAreiooYTIreiooYTQreiooYTYreiooYTgreiphMTApKSkpOworCQlwMiA9IHoqKGExK3oqKGEzK3oqKGE1K3oqKGE3K3oqKGE5K3oqYTExKSkpKSk7CisJCXAgID0geSpwMStwMjsKKwkJciAgKz0gKHAtMC41KnkpOyBicmVhazsKKwkgICAgICBjYXNlIDE6CisJCXogPSB5Knk7CisJCXcgPSB6Knk7CisJCXAxID0gdDArdyoodDMrdyoodDYrdyoodDkgK3cqdDEyKSkpOwkvKiBwYXJhbGxlbCBjb21wICovCisJCXAyID0gdDErdyoodDQrdyoodDcrdyoodDEwK3cqdDEzKSkpOworCQlwMyA9IHQyK3cqKHQ1K3cqKHQ4K3cqKHQxMSt3KnQxNCkpKTsKKwkJcCAgPSB6KnAxLSh0dC13KihwMit5KnAzKSk7CisJCXIgKz0gKHRmICsgcCk7IGJyZWFrOworCSAgICAgIGNhc2UgMjoJCisJCXAxID0geSoodTAreSoodTEreSoodTIreSoodTMreSoodTQreSp1NSkpKSkpOworCQlwMiA9IG9uZSt5Kih2MSt5Kih2Mit5Kih2Myt5Kih2NCt5KnY1KSkpKTsKKwkJciArPSAoLTAuNSp5ICsgcDEvcDIpOworCSAgICB9CisJfQorCWVsc2UgaWYoaXg8MHg0MDIwMDAwMCkgeyAJCQkvKiB4IDwgOC4wICovCisJICAgIGkgPSAoaW50KXg7CisJICAgIHQgPSB6ZXJvOworCSAgICB5ID0geC0oZG91YmxlKWk7CisJICAgIHAgPSB5KihzMCt5KihzMSt5KihzMit5KihzMyt5KihzNCt5KihzNSt5KnM2KSkpKSkpOworCSAgICBxID0gb25lK3kqKHIxK3kqKHIyK3kqKHIzK3kqKHI0K3kqKHI1K3kqcjYpKSkpKTsKKwkgICAgciA9IGhhbGYqeStwL3E7CisJICAgIHogPSBvbmU7CS8qIGxnYW1tYSgxK3MpID0gbG9nKHMpICsgbGdhbW1hKHMpICovCisJICAgIHN3aXRjaChpKSB7CisJICAgIGNhc2UgNzogeiAqPSAoeSs2LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDY6IHogKj0gKHkrNS4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA1OiB6ICo9ICh5KzQuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNDogeiAqPSAoeSszLjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDM6IHogKj0gKHkrMi4wKTsJLyogRkFMTFRIUlUgKi8KKwkJICAgIHIgKz0gX19pZWVlNzU0X2xvZyh6KTsgYnJlYWs7CisJICAgIH0KKyAgICAvKiA4LjAgPD0geCA8IDIqKjU4ICovCisJfSBlbHNlIGlmIChpeCA8IDB4NDM5MDAwMDApIHsKKwkgICAgdCA9IF9faWVlZTc1NF9sb2coeCk7CisJICAgIHogPSBvbmUveDsKKwkgICAgeSA9IHoqejsKKwkgICAgdyA9IHcwK3oqKHcxK3kqKHcyK3kqKHczK3kqKHc0K3kqKHc1K3kqdzYpKSkpKTsKKwkgICAgciA9ICh4LWhhbGYpKih0LW9uZSkrdzsKKwl9IGVsc2UgCisgICAgLyogMioqNTggPD0geCA8PSBpbmYgKi8KKwkgICAgciA9ICB4KihfX2llZWU3NTRfbG9nKHgpLW9uZSk7CisJaWYoaHg8MCkgciA9IG5hZGogLSByOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZ2FtbWFmLmMgYi9saWJtL3NyYy9lX2xnYW1tYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY0OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFmLmMKQEAgLTAsMCArMSwzNSBAQAorLyogZV9sZ2FtbWFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2xnYW1tYS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sZ2FtbWFmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sZ2FtbWFmKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2xnYW1tYWZfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2V4dGVybiBpbnQgc2lnbmdhbTsKKworZmxvYXQKK19faWVlZTc1NF9sZ2FtbWFmKGZsb2F0IHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFmX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xnYW1tYWZfci5jIGIvbGlibS9zcmMvZV9sZ2FtbWFmX3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU1MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFmX3IuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogZV9sZ2FtbWFmX3IuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfbGdhbW1hX3IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbGdhbW1hZl9yLmMsdiAxLjkgMjAwNS8xMS8yOCAwODozMjoxNSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjM9ICA4LjM4ODYwODAwMDBlKzA2LCAvKiAweDRiMDAwMDAwICovCitoYWxmPSAgNS4wMDAwMDAwMDAwZS0wMSwgLyogMHgzZjAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMGUrMDAsIC8qIDB4M2Y4MDAwMDAgKi8KK3BpICA9ICAzLjE0MTU5Mjc0MTBlKzAwLCAvKiAweDQwNDkwZmRiICovCithMCAgPSAgNy43MjE1NjY0MDg5ZS0wMiwgLyogMHgzZDllMjMzZiAqLworYTEgID0gIDMuMjI0NjcwMjkwOWUtMDEsIC8qIDB4M2VhNTFhNjYgKi8KK2EyICA9ICA2LjczNTIzMDIzNzJlLTAyLCAvKiAweDNkODlmMDAxICovCithMyAgPSAgMi4wNTgwODA3NzAxZS0wMiwgLyogMHgzY2E4OTkxNSAqLworYTQgID0gIDcuMzg1NTUwOTk4MmUtMDMsIC8qIDB4M2JmMjAyN2UgKi8KK2E1ICA9ICAyLjg5MDUxMzc0NDJlLTAzLCAvKiAweDNiM2Q2ZWM2ICovCithNiAgPSAgMS4xOTI3MDc2ODQ4ZS0wMywgLyogMHgzYTljNTRhMSAqLworYTcgID0gIDUuMTAwNjk3NzQ0NmUtMDQsIC8qIDB4M2EwNWI2MzQgKi8KK2E4ICA9ICAyLjIwODYyNzg0NzdlLTA0LCAvKiAweDM5Njc5NzY3ICovCithOSAgPSAgMS4wODAxMTU2ODk1ZS0wNCwgLyogMHgzOGUyODQ0NSAqLworYTEwID0gIDIuNTIxNDQ1NjQwMGUtMDUsIC8qIDB4MzdkMzgzYTIgKi8KK2ExMSA9ICA0LjQ4NjQwOTY3MDhlLTA1LCAvKiAweDM4M2MyYzc1ICovCit0YyAgPSAgMS40NjE2MzIxMzI1ZSswMCwgLyogMHgzZmJiMTZjMyAqLwordGYgID0gLTEuMjE0ODYyODM4NGUtMDEsIC8qIDB4YmRmOGNkY2QgKi8KKy8qIHR0ID0gLSh0YWlsIG9mIHRmKSAqLwordHQgID0gIDYuNjk3MTAwNjUxOGUtMDksIC8qIDB4MzFlNjFjNTIgKi8KK3QwICA9ICA0LjgzODM2MTE0NDFlLTAxLCAvKiAweDNlZjdiOTVlICovCit0MSAgPSAtMS40NzU4NzcxNjU4ZS0wMSwgLyogMHhiZTE3MjEzYyAqLwordDIgID0gIDYuNDYyNDk0MjgzOWUtMDIsIC8qIDB4M2Q4NDVhMTUgKi8KK3QzICA9IC0zLjI3ODg1NDExNjhlLTAyLCAvKiAweGJkMDY0ZDQ3ICovCit0NCAgPSAgMS43OTcwNjc1NjAzZS0wMiwgLyogMHgzYzkzMzczZCAqLwordDUgID0gLTEuMDMxNDIyNDI4OGUtMDIsIC8qIDB4YmMyOGZjZmUgKi8KK3Q2ICA9ICA2LjEwMDUzODY1MjRlLTAzLCAvKiAweDNiYzdlNzA3ICovCit0NyAgPSAtMy42ODQ1MjAyNTU4ZS0wMywgLyogMHhiYjcxNzdmZSAqLwordDggID0gIDIuMjU5NjQ3NzA2NWUtMDMsIC8qIDB4M2IxNDE2OTkgKi8KK3Q5ICA9IC0xLjQwMzQ2NDcwMjllLTAzLCAvKiAweGJhYjdmNDc2ICovCit0MTAgPSAgOC44MTA4MTg1NDQ2ZS0wNCwgLyogMHgzYTY2Zjg2NyAqLwordDExID0gLTUuMzg1OTUzMTE4MWUtMDQsIC8qIDB4YmEwZDMwODUgKi8KK3QxMiA9ICAzLjE1NjMyMDU5OTRlLTA0LCAvKiAweDM5YTU3YjZiICovCit0MTMgPSAtMy4xMjc1NDE1Njc3ZS0wNCwgLyogMHhiOWEzZjkyNyAqLwordDE0ID0gIDMuMzU1MjkxODQ2N2UtMDQsIC8qIDB4MzlhZmU5ZjcgKi8KK3UwICA9IC03LjcyMTU2NjQwODllLTAyLCAvKiAweGJkOWUyMzNmICovCit1MSAgPSAgNi4zMjgyNzA0MzUzZS0wMSwgLyogMHgzZjIyMDBmNCAqLwordTIgID0gIDEuNDU0OTIyNTU2OWUrMDAsIC8qIDB4M2ZiYTNhZTcgKi8KK3UzICA9ICA5Ljc3NzE3NTE4ODFlLTAxLCAvKiAweDNmN2E0YmIyICovCit1NCAgPSAgMi4yODk2MzczMjcyZS0wMSwgLyogMHgzZTZhNzU3OCAqLwordTUgID0gIDEuMzM4MTA5MTg3OGUtMDIsIC8qIDB4M2M1YjNjNWUgKi8KK3YxICA9ICAyLjQ1NTk3NzkxNjdlKzAwLCAvKiAweDQwMWQyZWJlICovCit2MiAgPSAgMi4xMjg0ODk3MzI3ZSswMCwgLyogMHg0MDA4MzkyZCAqLwordjMgID0gIDcuNjkyODUxNDI0MmUtMDEsIC8qIDB4M2Y0NGVmZGYgKi8KK3Y0ICA9ICAxLjA0MjIyNjQ3ODVlLTAxLCAvKiAweDNkZDU3MmFmICovCit2NSAgPSAgMy4yMTcwOTI0ODI0ZS0wMywgLyogMHgzYjUyZDVkYiAqLworczAgID0gLTcuNzIxNTY2NDA4OWUtMDIsIC8qIDB4YmQ5ZTIzM2YgKi8KK3MxICA9ICAyLjE0OTgyNDIwMjFlLTAxLCAvKiAweDNlNWMyNDVhICovCitzMiAgPSAgMy4yNTc3ODc4MjM3ZS0wMSwgLyogMHgzZWE2Y2M3YSAqLworczMgID0gIDEuNDYzNTA0NzMxN2UtMDEsIC8qIDB4M2UxNWRjZTYgKi8KK3M0ICA9ICAyLjY2NDIyNzAzODZlLTAyLCAvKiAweDNjZGE0MGU0ICovCitzNSAgPSAgMS44NDAyODQ1NTk5ZS0wMywgLyogMHgzYWYxMzViNCAqLworczYgID0gIDMuMTk0NzUzMjk4OWUtMDUsIC8qIDB4MzgwNWZmNjcgKi8KK3IxICA9ICAxLjM5MjAwNTMyNDRlKzAwLCAvKiAweDNmYjIyZDNiICovCityMiAgPSAgNy4yMTkzNTU3MDI0ZS0wMSwgLyogMHgzZjM4ZDBjNSAqLworcjMgID0gIDEuNzE5MzM4NTk1OWUtMDEsIC8qIDB4M2UzMDBmNmUgKi8KK3I0ICA9ICAxLjg2NDU5MTk4NTllLTAyLCAvKiAweDNjOThiZjU0ICovCityNSAgPSAgNy43Nzk0MjQ3NzczZS0wNCwgLyogMHgzYTRiZWVkNiAqLworcjYgID0gIDcuMzI2Njg0MjI2NGUtMDYsIC8qIDB4MzZmNWQ3YmQgKi8KK3cwICA9ICA0LjE4OTM4NTQ3MzdlLTAxLCAvKiAweDNlZDY3ZjFkICovCit3MSAgPSAgOC4zMzMzMzM1ODE3ZS0wMiwgLyogMHgzZGFhYWFhYiAqLwordzIgID0gLTIuNzc3Nzc3ODQ1MGUtMDMsIC8qIDB4YmIzNjBiNjEgKi8KK3czICA9ICA3LjkzNjUwNTcxNzJlLTA0LCAvKiAweDNhNTAwY2ZkICovCit3NCAgPSAtNS45NTE4NzUzNTUxZS0wNCwgLyogMHhiYTFjMDY1YyAqLwordzUgID0gIDguMzYzMzk4OTU2MWUtMDQsIC8qIDB4M2E1YjNkZDIgKi8KK3c2ICA9IC0xLjYzMDkyOTI5ODdlLTAzOyAvKiAweGJhZDVjNGU4ICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvPSAgMC4wMDAwMDAwMDAwZSswMDsKKworCXN0YXRpYyBmbG9hdCBzaW5fcGlmKGZsb2F0IHgpCit7CisJZmxvYXQgeSx6OworCWludCBuLGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworCWlmKGl4PDB4M2U4MDAwMDApIHJldHVybiBfX2tlcm5lbF9zaW5kZihwaSp4KTsKKwl5ID0gLXg7CQkvKiB4IGlzIGFzc3VtZSBuZWdhdGl2ZSAqLworCisgICAgLyoKKyAgICAgKiBhcmd1bWVudCByZWR1Y3Rpb24sIG1ha2Ugc3VyZSBpbmV4YWN0IGZsYWcgbm90IHJhaXNlZCBpZiBpbnB1dAorICAgICAqIGlzIGFuIGludGVnZXIKKyAgICAgKi8KKwl6ID0gZmxvb3JmKHkpOworCWlmKHohPXkpIHsJCQkJLyogaW5leGFjdCBhbnl3YXkgKi8KKwkgICAgeSAgKj0gKGZsb2F0KTAuNTsKKwkgICAgeSAgID0gKGZsb2F0KTIuMCooeSAtIGZsb29yZih5KSk7CS8qIHkgPSB8eHwgbW9kIDIuMCAqLworCSAgICBuICAgPSAoaW50KSAoeSooZmxvYXQpNC4wKTsKKwl9IGVsc2UgeworICAgICAgICAgICAgaWYoaXg+PTB4NGI4MDAwMDApIHsKKyAgICAgICAgICAgICAgICB5ID0gemVybzsgbiA9IDA7ICAgICAgICAgICAgICAgICAvKiB5IG11c3QgYmUgZXZlbiAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihpeDwweDRiMDAwMDAwKSB6ID0geSt0d28yMzsJLyogZXhhY3QgKi8KKwkJR0VUX0ZMT0FUX1dPUkQobix6KTsKKwkJbiAmPSAxOworICAgICAgICAgICAgICAgIHkgID0gbjsKKyAgICAgICAgICAgICAgICBuPDw9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKG4pIHsKKwkgICAgY2FzZSAwOiAgIHkgPSAgX19rZXJuZWxfc2luZGYocGkqeSk7IGJyZWFrOworCSAgICBjYXNlIDE6CisJICAgIGNhc2UgMjogICB5ID0gIF9fa2VybmVsX2Nvc2RmKHBpKigoZmxvYXQpMC41LXkpKTsgYnJlYWs7CisJICAgIGNhc2UgMzoKKwkgICAgY2FzZSA0OiAgIHkgPSAgX19rZXJuZWxfc2luZGYocGkqKG9uZS15KSk7IGJyZWFrOworCSAgICBjYXNlIDU6CisJICAgIGNhc2UgNjogICB5ID0gLV9fa2VybmVsX2Nvc2RmKHBpKih5LShmbG9hdCkxLjUpKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6ICB5ID0gIF9fa2VybmVsX3NpbmRmKHBpKih5LShmbG9hdCkyLjApKTsgYnJlYWs7CisJICAgIH0KKwlyZXR1cm4gLXk7Cit9CisKKworZmxvYXQKK19faWVlZTc1NF9sZ2FtbWFmX3IoZmxvYXQgeCwgaW50ICpzaWduZ2FtcCkKK3sKKwlmbG9hdCB0LHkseixuYWRqLHAscDEscDIscDMscSxyLHc7CisJaW50IGksaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKworICAgIC8qIHB1cmdlIG9mZiArLWluZiwgTmFOLCArLTAsIGFuZCBuZWdhdGl2ZSBhcmd1bWVudHMgKi8KKwkqc2lnbmdhbXAgPSAxOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgqeDsKKwlpZihpeD09MCkgcmV0dXJuIG9uZS96ZXJvOworCWlmKGl4PDB4MzUwMDAwMDApIHsJLyogfHh8PDIqKi0yMSwgcmV0dXJuIC1sb2cofHh8KSAqLworCSAgICBpZihoeDwwKSB7CisJICAgICAgICAqc2lnbmdhbXAgPSAtMTsKKwkgICAgICAgIHJldHVybiAtX19pZWVlNzU0X2xvZ2YoLXgpOworCSAgICB9IGVsc2UgcmV0dXJuIC1fX2llZWU3NTRfbG9nZih4KTsKKwl9CisJaWYoaHg8MCkgeworCSAgICBpZihpeD49MHg0YjAwMDAwMCkgCS8qIHx4fD49MioqMjMsIG11c3QgYmUgLWludGVnZXIgKi8KKwkJcmV0dXJuIG9uZS96ZXJvOworCSAgICB0ID0gc2luX3BpZih4KTsKKwkgICAgaWYodD09emVybykgcmV0dXJuIG9uZS96ZXJvOyAvKiAtaW50ZWdlciAqLworCSAgICBuYWRqID0gX19pZWVlNzU0X2xvZ2YocGkvZmFic2YodCp4KSk7CisJICAgIGlmKHQ8emVybykgKnNpZ25nYW1wID0gLTE7CisJICAgIHggPSAteDsKKwl9CisKKyAgICAvKiBwdXJnZSBvZmYgMSBhbmQgMiAqLworCWlmIChpeD09MHgzZjgwMDAwMHx8aXg9PTB4NDAwMDAwMDApIHIgPSAwOworICAgIC8qIGZvciB4IDwgMi4wICovCisJZWxzZSBpZihpeDwweDQwMDAwMDAwKSB7CisJICAgIGlmKGl4PD0weDNmNjY2NjY2KSB7IAkvKiBsZ2FtbWEoeCkgPSBsZ2FtbWEoeCsxKS1sb2coeCkgKi8KKwkJciA9IC1fX2llZWU3NTRfbG9nZih4KTsKKwkJaWYoaXg+PTB4M2YzYjRhMjApIHt5ID0gb25lLXg7IGk9IDA7fQorCQllbHNlIGlmKGl4Pj0weDNlNmQzMzA4KSB7eT0geC0odGMtb25lKTsgaT0xO30KKwkgIAllbHNlIHt5ID0geDsgaT0yO30KKwkgICAgfSBlbHNlIHsKKwkgIAlyID0gemVybzsKKwkgICAgICAgIGlmKGl4Pj0weDNmZGRhNjE4KSB7eT0oZmxvYXQpMi4wLXg7aT0wO30gLyogWzEuNzMxNiwyXSAqLworCSAgICAgICAgZWxzZSBpZihpeD49MHgzRjlkYTYyMCkge3k9eC10YztpPTE7fSAvKiBbMS4yMywxLjczXSAqLworCQllbHNlIHt5PXgtb25lO2k9Mjt9CisJICAgIH0KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgICBjYXNlIDA6CisJCXogPSB5Knk7CisJCXAxID0gYTAreiooYTIreiooYTQreiooYTYreiooYTgreiphMTApKSkpOworCQlwMiA9IHoqKGExK3oqKGEzK3oqKGE1K3oqKGE3K3oqKGE5K3oqYTExKSkpKSk7CisJCXAgID0geSpwMStwMjsKKwkJciAgKz0gKHAtKGZsb2F0KTAuNSp5KTsgYnJlYWs7CisJICAgICAgY2FzZSAxOgorCQl6ID0geSp5OworCQl3ID0geip5OworCQlwMSA9IHQwK3cqKHQzK3cqKHQ2K3cqKHQ5ICt3KnQxMikpKTsJLyogcGFyYWxsZWwgY29tcCAqLworCQlwMiA9IHQxK3cqKHQ0K3cqKHQ3K3cqKHQxMCt3KnQxMykpKTsKKwkJcDMgPSB0Mit3Kih0NSt3Kih0OCt3Kih0MTErdyp0MTQpKSk7CisJCXAgID0geipwMS0odHQtdyoocDIreSpwMykpOworCQlyICs9ICh0ZiArIHApOyBicmVhazsKKwkgICAgICBjYXNlIDI6CisJCXAxID0geSoodTAreSoodTEreSoodTIreSoodTMreSoodTQreSp1NSkpKSkpOworCQlwMiA9IG9uZSt5Kih2MSt5Kih2Mit5Kih2Myt5Kih2NCt5KnY1KSkpKTsKKwkJciArPSAoLShmbG9hdCkwLjUqeSArIHAxL3AyKTsKKwkgICAgfQorCX0KKwllbHNlIGlmKGl4PDB4NDEwMDAwMDApIHsgCQkJLyogeCA8IDguMCAqLworCSAgICBpID0gKGludCl4OworCSAgICB0ID0gemVybzsKKwkgICAgeSA9IHgtKGZsb2F0KWk7CisJICAgIHAgPSB5KihzMCt5KihzMSt5KihzMit5KihzMyt5KihzNCt5KihzNSt5KnM2KSkpKSkpOworCSAgICBxID0gb25lK3kqKHIxK3kqKHIyK3kqKHIzK3kqKHI0K3kqKHI1K3kqcjYpKSkpKTsKKwkgICAgciA9IGhhbGYqeStwL3E7CisJICAgIHogPSBvbmU7CS8qIGxnYW1tYSgxK3MpID0gbG9nKHMpICsgbGdhbW1hKHMpICovCisJICAgIHN3aXRjaChpKSB7CisJICAgIGNhc2UgNzogeiAqPSAoeSsoZmxvYXQpNi4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA2OiB6ICo9ICh5KyhmbG9hdCk1LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDU6IHogKj0gKHkrKGZsb2F0KTQuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNDogeiAqPSAoeSsoZmxvYXQpMy4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSAzOiB6ICo9ICh5KyhmbG9hdCkyLjApOwkvKiBGQUxMVEhSVSAqLworCQkgICAgciArPSBfX2llZWU3NTRfbG9nZih6KTsgYnJlYWs7CisJICAgIH0KKyAgICAvKiA4LjAgPD0geCA8IDIqKjU4ICovCisJfSBlbHNlIGlmIChpeCA8IDB4NWM4MDAwMDApIHsKKwkgICAgdCA9IF9faWVlZTc1NF9sb2dmKHgpOworCSAgICB6ID0gb25lL3g7CisJICAgIHkgPSB6Kno7CisJICAgIHcgPSB3MCt6Kih3MSt5Kih3Mit5Kih3Myt5Kih3NCt5Kih3NSt5Knc2KSkpKSk7CisJICAgIHIgPSAoeC1oYWxmKSoodC1vbmUpK3c7CisJfSBlbHNlCisgICAgLyogMioqNTggPD0geCA8PSBpbmYgKi8KKwkgICAgciA9ICB4KihfX2llZWU3NTRfbG9nZih4KS1vbmUpOworCWlmKGh4PDApIHIgPSBuYWRqIC0gcjsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nLmMgYi9saWJtL3NyYy9lX2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYmYwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZy5jCkBAIC0wLDAgKzEsMTM1IEBACisKKy8qIEAoIyllX2xvZy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZy5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xvZyh4KQorICogUmV0dXJuIHRoZSBsb2dyaXRobSBvZiB4CisgKgorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uOiBmaW5kIGsgYW5kIGYgc3VjaCB0aGF0IAorICoJCQl4ID0gMl5rICogKDErZiksIAorICoJICAgd2hlcmUgIHNxcnQoMikvMiA8IDErZiA8IHNxcnQoMikgLgorICoKKyAqICAgMi4gQXBwcm94aW1hdGlvbiBvZiBsb2coMStmKS4KKyAqCUxldCBzID0gZi8oMitmKSA7IGJhc2VkIG9uIGxvZygxK2YpID0gbG9nKDErcykgLSBsb2coMS1zKQorICoJCSA9IDJzICsgMi8zIHMqKjMgKyAyLzUgcyoqNSArIC4uLi4uLAorICoJICAgICAJID0gMnMgKyBzKlIKKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lIGFsZ29yaXRobSBvbiBbMCwwLjE3MTZdIHRvIGdlbmVyYXRlIAorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTQgdG8gYXBwcm94aW1hdGUgUiBUaGUgbWF4aW11bSBlcnJvciAKKyAqCW9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQgYnkgMioqLTU4LjQ1LiBJbgorICoJb3RoZXIgd29yZHMsCisgKgkJICAgICAgICAyICAgICAgNCAgICAgIDYgICAgICA4ICAgICAgMTAgICAgICAxMiAgICAgIDE0CisgKgkgICAgUih6KSB+IExnMSpzICtMZzIqcyArTGczKnMgK0xnNCpzICtMZzUqcyAgK0xnNipzICArTGc3KnMKKyAqICAJKHRoZSB2YWx1ZXMgb2YgTGcxIHRvIExnNyBhcmUgbGlzdGVkIGluIHRoZSBwcm9ncmFtKQorICoJYW5kCisgKgkgICAgfCAgICAgIDIgICAgICAgICAgMTQgICAgICAgICAgfCAgICAgLTU4LjQ1CisgKgkgICAgfCBMZzEqcyArLi4uK0xnNypzICAgIC0gIFIoeikgfCA8PSAyIAorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCU5vdGUgdGhhdCAycyA9IGYgLSBzKmYgPSBmIC0gaGZzcSArIHMqaGZzcSwgd2hlcmUgaGZzcSA9IGYqZi8yLgorICoJSW4gb3JkZXIgdG8gZ3VhcmFudGVlIGVycm9yIGluIGxvZyBiZWxvdyAxdWxwLCB3ZSBjb21wdXRlIGxvZworICoJYnkKKyAqCQlsb2coMStmKSA9IGYgLSBzKihmIC0gUikJKGlmIGYgaXMgbm90IHRvbyBsYXJnZSkKKyAqCQlsb2coMStmKSA9IGYgLSAoaGZzcSAtIHMqKGhmc3ErUikpLgkoYmV0dGVyIGFjY3VyYWN5KQorICoJCisgKgkzLiBGaW5hbGx5LCAgbG9nKHgpID0gaypsbjIgKyBsb2coMStmKS4gIAorICoJCQkgICAgPSBrKmxuMl9oaSsoZi0oaGZzcS0ocyooaGZzcStSKStrKmxuMl9sbykpKQorICoJICAgSGVyZSBsbjIgaXMgc3BsaXQgaW50byB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAKKyAqCQkJbG4yX2hpICsgbG4yX2xvLAorICoJICAgd2hlcmUgbipsbjJfaGkgaXMgYWx3YXlzIGV4YWN0IGZvciB8bnwgPCAyMDAwLgorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglsb2coeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHggPCAwIChpbmNsdWRpbmcgLUlORikgOyAKKyAqCWxvZygrSU5GKSBpcyArSU5GOyBsb2coMCkgaXMgLUlORiB3aXRoIHNpZ25hbDsKKyAqCWxvZyhOYU4pIGlzIHRoYXQgTmFOIHdpdGggbm8gc2lnbmFsLgorICoKKyAqIEFjY3VyYWN5OgorICoJYWNjb3JkaW5nIHRvIGFuIGVycm9yIGFuYWx5c2lzLCB0aGUgZXJyb3IgaXMgYWx3YXlzIGxlc3MgdGhhbgorICoJMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorbG4yX2hpICA9ICA2LjkzMTQ3MTgwMzY5MTIzODE2NDkwZS0wMSwJLyogM2ZlNjJlNDIgZmVlMDAwMDAgKi8KK2xuMl9sbyAgPSAgMS45MDgyMTQ5MjkyNzA1ODc3MDAwMmUtMTAsCS8qIDNkZWEzOWVmIDM1NzkzYzc2ICovCit0d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAgLyogNDM1MDAwMDAgMDAwMDAwMDAgKi8KK0xnMSA9IDYuNjY2NjY2NjY2NjY2NzM1MTMwZS0wMSwgIC8qIDNGRTU1NTU1IDU1NTU1NTkzICovCitMZzIgPSAzLjk5OTk5OTk5OTk0MDk0MTkwOGUtMDEsICAvKiAzRkQ5OTk5OSA5OTk3RkEwNCAqLworTGczID0gMi44NTcxNDI4NzQzNjYyMzkxNDllLTAxLCAgLyogM0ZEMjQ5MjQgOTQyMjkzNTkgKi8KK0xnNCA9IDIuMjIyMjE5ODQzMjE0OTc4Mzk2ZS0wMSwgIC8qIDNGQ0M3MUM1IDFEOEU3OEFGICovCitMZzUgPSAxLjgxODM1NzIxNjE2MTgwNTAxMmUtMDEsICAvKiAzRkM3NDY2NCA5NkNCMDNERSAqLworTGc2ID0gMS41MzEzODM3Njk5MjA5MzczMzJlLTAxLCAgLyogM0ZDMzlBMDkgRDA3OEM2OUYgKi8KK0xnNyA9IDEuNDc5ODE5ODYwNTExNjU4NTkxZS0wMTsgIC8qIDNGQzJGMTEyIERGM0U1MjQ0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyAgID0gIDAuMDsKKworZG91YmxlCitfX2llZWU3NTRfbG9nKGRvdWJsZSB4KQoreworCWRvdWJsZSBoZnNxLGYscyx6LFIsdyx0MSx0MixkazsKKwlpbnQzMl90IGssaHgsaSxqOworCXVfaW50MzJfdCBseDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisKKwlrPTA7CisJaWYgKGh4IDwgMHgwMDEwMDAwMCkgewkJCS8qIHggPCAyKiotMTAyMiAgKi8KKwkgICAgaWYgKCgoaHgmMHg3ZmZmZmZmZil8bHgpPT0wKSAKKwkJcmV0dXJuIC10d281NC96ZXJvOwkJLyogbG9nKCstMCk9LWluZiAqLworCSAgICBpZiAoaHg8MCkgcmV0dXJuICh4LXgpL3plcm87CS8qIGxvZygtIykgPSBOYU4gKi8KKwkgICAgayAtPSA1NDsgeCAqPSB0d281NDsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworCX0gCisJaWYgKGh4ID49IDB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJayArPSAoaHg+PjIwKS0xMDIzOworCWh4ICY9IDB4MDAwZmZmZmY7CisJaSA9IChoeCsweDk1ZjY0KSYweDEwMDAwMDsKKwlTRVRfSElHSF9XT1JEKHgsaHh8KGleMHgzZmYwMDAwMCkpOwkvKiBub3JtYWxpemUgeCBvciB4LzIgKi8KKwlrICs9IChpPj4yMCk7CisJZiA9IHgtMS4wOworCWlmKCgweDAwMGZmZmZmJigyK2h4KSk8MykgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87ICBlbHNlIHtkaz0oZG91YmxlKWs7CisJCQkJIHJldHVybiBkaypsbjJfaGkrZGsqbG4yX2xvO30KKwkgICAgUiA9IGYqZiooMC41LTAuMzMzMzMzMzMzMzMzMzMzMzMqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2Uge2RrPShkb3VibGUpazsKKwkgICAgCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKFItZGsqbG4yX2xvKS1mKTt9CisJfQorIAlzID0gZi8oMi4wK2YpOyAKKwlkayA9IChkb3VibGUpazsKKwl6ID0gcypzOworCWkgPSBoeC0weDYxNDdhOworCXcgPSB6Kno7CisJaiA9IDB4NmI4NTEtaHg7CisJdDE9IHcqKExnMit3KihMZzQrdypMZzYpKTsgCisJdDI9IHoqKExnMSt3KihMZzMrdyooTGc1K3cqTGc3KSkpOyAKKwlpIHw9IGo7CisJUiA9IHQyK3QxOworCWlmKGk+MCkgeworCSAgICBoZnNxPTAuNSpmKmY7CisJICAgIGlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrZGsqbG4yX2xvKSktZik7CisJfSBlbHNlIHsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtcyooZi1SKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChzKihmLVIpLWRrKmxuMl9sbyktZik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sb2cxMC5jIGIvbGlibS9zcmMvZV9sb2cxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGMwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZzEwLmMKQEAgLTAsMCArMSw4NyBAQAorCisvKiBAKCMpZV9sb2cxMC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZzEwLmMsdiAxLjExIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbG9nMTAoeCkKKyAqIFJldHVybiB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgeAorICogCisgKiBNZXRob2QgOgorICoJTGV0IGxvZzEwXzJoaSA9IGxlYWRpbmcgNDAgYml0cyBvZiBsb2cxMCgyKSBhbmQKKyAqCSAgICBsb2cxMF8ybG8gPSBsb2cxMCgyKSAtIGxvZzEwXzJoaSwKKyAqCSAgICBpdmxuMTAgICA9IDEvbG9nKDEwKSByb3VuZGVkLgorICoJVGhlbgorICoJCW4gPSBpbG9nYih4KSwgCisgKgkJaWYobjwwKSAgbiA9IG4rMTsKKyAqCQl4ID0gc2NhbGJuKHgsLW4pOworICoJCWxvZzEwKHgpIDo9IG4qbG9nMTBfMmhpICsgKG4qbG9nMTBfMmxvICsgaXZsbjEwKmxvZyh4KSkKKyAqCisgKiBOb3RlIDE6CisgKglUbyBndWFyYW50ZWUgbG9nMTAoMTAqKm4pPW4sIHdoZXJlIDEwKipuIGlzIG5vcm1hbCwgdGhlIHJvdW5kaW5nIAorICoJbW9kZSBtdXN0IHNldCB0byBSb3VuZC10by1OZWFyZXN0LgorICogTm90ZSAyOgorICoJWzEvbG9nKDEwKV0gcm91bmRlZCB0byA1MyBiaXRzIGhhcyBlcnJvciAgLjE5OCAgIHVscHM7CisgKglsb2cxMCBpcyBtb25vdG9uaWMgYXQgYWxsIGJpbmFyeSBicmVhayBwb2ludHMuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWxvZzEwKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4IDwgMDsgCisgKglsb2cxMCgrSU5GKSBpcyArSU5GIHdpdGggbm8gc2lnbmFsOyBsb2cxMCgwKSBpcyAtSU5GIHdpdGggc2lnbmFsOworICoJbG9nMTAoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbDsKKyAqCWxvZzEwKDEwKipOKSA9IE4gIGZvciBOPTAsMSwuLi4sMjIuCisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLgorICogVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQKKyAqIGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzCisgKiBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCAgICAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAvKiAweDQzNTAwMDAwLCAweDAwMDAwMDAwICovCitpdmxuMTAgICAgID0gIDQuMzQyOTQ0ODE5MDMyNTE4MTY2NjhlLTAxLCAvKiAweDNGREJDQjdCLCAweDE1MjZFNTBFICovCitsb2cxMF8yaGkgID0gIDMuMDEwMjk5OTU2NjM2MTE3NzEzMDZlLTAxLCAvKiAweDNGRDM0NDEzLCAweDUwOUY2MDAwICovCitsb2cxMF8ybG8gID0gIDMuNjk0MjM5MDc3MTU4OTMwNzg2MTZlLTEzOyAvKiAweDNENTlGRUYzLCAweDExRjEyQjM2ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyAgID0gIDAuMDsKKworZG91YmxlCitfX2llZWU3NTRfbG9nMTAoZG91YmxlIHgpCit7CisJZG91YmxlIHksejsKKwlpbnQzMl90IGksayxoeDsKKwl1X2ludDMyX3QgbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCisgICAgICAgIGs9MDsKKyAgICAgICAgaWYgKGh4IDwgMHgwMDEwMDAwMCkgeyAgICAgICAgICAgICAgICAgIC8qIHggPCAyKiotMTAyMiAgKi8KKyAgICAgICAgICAgIGlmICgoKGh4JjB4N2ZmZmZmZmYpfGx4KT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLXR3bzU0L3plcm87ICAgICAgICAgICAgIC8qIGxvZygrLTApPS1pbmYgKi8KKyAgICAgICAgICAgIGlmIChoeDwwKSByZXR1cm4gKHgteCkvemVybzsgICAgICAgIC8qIGxvZygtIykgPSBOYU4gKi8KKyAgICAgICAgICAgIGsgLT0gNTQ7IHggKj0gdHdvNTQ7IC8qIHN1Ym5vcm1hbCBudW1iZXIsIHNjYWxlIHVwIHggKi8KKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKyAgICAgICAgfQorCWlmIChoeCA+PSAweDdmZjAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGh4Pj4yMCktMTAyMzsKKwlpICA9ICgodV9pbnQzMl90KWsmMHg4MDAwMDAwMCk+PjMxOworICAgICAgICBoeCA9IChoeCYweDAwMGZmZmZmKXwoKDB4M2ZmLWkpPDwyMCk7CisgICAgICAgIHkgID0gKGRvdWJsZSkoaytpKTsKKwlTRVRfSElHSF9XT1JEKHgsaHgpOworCXogID0geSpsb2cxMF8ybG8gKyBpdmxuMTAqX19pZWVlNzU0X2xvZyh4KTsKKwlyZXR1cm4gIHoreSpsb2cxMF8yaGk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xvZzEwZi5jIGIvbGlibS9zcmMvZV9sb2cxMGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDczMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sb2cxMGYuYwpAQCAtMCwwICsxLDU1IEBACisvKiBlX2xvZzEwZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sb2cxMC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sb2cxMGYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSAgICAgID0gIDMuMzU1NDQzMjAwMGUrMDcsIC8qIDB4NGMwMDAwMDAgKi8KK2l2bG4xMCAgICAgPSAgNC4zNDI5NDQ5MjAxZS0wMSwgLyogMHgzZWRlNWJkOSAqLworbG9nMTBfMmhpICA9ICAzLjAxMDI5MjA1MzJlLTAxLCAvKiAweDNlOWEyMDgwICovCitsb2cxMF8ybG8gID0gIDcuOTAzNDE1MTY2OGUtMDc7IC8qIDB4MzU1NDI3ZGIgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gICA9ICAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfbG9nMTBmKGZsb2F0IHgpCit7CisJZmxvYXQgeSx6OworCWludDMyX3QgaSxrLGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisKKyAgICAgICAgaz0wOworICAgICAgICBpZiAoaHggPCAweDAwODAwMDAwKSB7ICAgICAgICAgICAgICAgICAgLyogeCA8IDIqKi0xMjYgICovCisgICAgICAgICAgICBpZiAoKGh4JjB4N2ZmZmZmZmYpPT0wKQorICAgICAgICAgICAgICAgIHJldHVybiAtdHdvMjUvemVybzsgICAgICAgICAgICAgLyogbG9nKCstMCk9LWluZiAqLworICAgICAgICAgICAgaWYgKGh4PDApIHJldHVybiAoeC14KS96ZXJvOyAgICAgICAgLyogbG9nKC0jKSA9IE5hTiAqLworICAgICAgICAgICAgayAtPSAyNTsgeCAqPSB0d28yNTsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfRkxPQVRfV09SRChoeCx4KTsKKyAgICAgICAgfQorCWlmIChoeCA+PSAweDdmODAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGh4Pj4yMyktMTI3OworCWkgID0gKCh1X2ludDMyX3QpayYweDgwMDAwMDAwKT4+MzE7CisgICAgICAgIGh4ID0gKGh4JjB4MDA3ZmZmZmYpfCgoMHg3Zi1pKTw8MjMpOworICAgICAgICB5ICA9IChmbG9hdCkoaytpKTsKKwlTRVRfRkxPQVRfV09SRCh4LGh4KTsKKwl6ICA9IHkqbG9nMTBfMmxvICsgaXZsbjEwKl9faWVlZTc1NF9sb2dmKHgpOworCXJldHVybiAgeit5KmxvZzEwXzJoaTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nZi5jIGIvbGlibS9zcmMvZV9sb2dmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZTJhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbG9nZi5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIGVfbG9nZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sb2cuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbG9nZi5jLHYgMS44IDIwMDUvMTEvMTIgMTg6MjA6MDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK2xuMl9oaSA9ICAgNi45MzEzODEyMjU2ZS0wMSwJLyogMHgzZjMxNzE4MCAqLworbG4yX2xvID0gICA5LjA1ODAwMDYxNDVlLTA2LAkvKiAweDM3MTdmN2QxICovCit0d28yNSA9ICAgIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLworLyogfChsb2coMStzKS1sb2coMS1zKSkvcyAtIExnKHMpfCA8IDIqKi0zNC4yNCAoflstNC45NWUtMTEsIDQuOTdlLTExXSkuICovCitMZzEgPSAgICAgIDB4YWFhYWFhLjBwLTI0LAkvKiAwLjY2NjY2NjYyNjkzICovCitMZzIgPSAgICAgIDB4Y2NjZTEzLjBwLTI1LAkvKiAwLjQwMDAwOTcyMTUyICovCitMZzMgPSAgICAgIDB4OTFlOWVlLjBwLTI1LAkvKiAwLjI4NDk4Nzg2Njg4ICovCitMZzQgPSAgICAgIDB4Zjg5ZTI2LjBwLTI2OwkvKiAwLjI0Mjc5MDc4ODQxICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICAgPSAgMC4wOworCitmbG9hdAorX19pZWVlNzU0X2xvZ2YoZmxvYXQgeCkKK3sKKwlmbG9hdCBoZnNxLGYscyx6LFIsdyx0MSx0MixkazsKKwlpbnQzMl90IGssaXgsaSxqOworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisKKwlrPTA7CisJaWYgKGl4IDwgMHgwMDgwMDAwMCkgewkJCS8qIHggPCAyKiotMTI2ICAqLworCSAgICBpZiAoKGl4JjB4N2ZmZmZmZmYpPT0wKQorCQlyZXR1cm4gLXR3bzI1L3plcm87CQkvKiBsb2coKy0wKT0taW5mICovCisJICAgIGlmIChpeDwwKSByZXR1cm4gKHgteCkvemVybzsJLyogbG9nKC0jKSA9IE5hTiAqLworCSAgICBrIC09IDI1OyB4ICo9IHR3bzI1OyAvKiBzdWJub3JtYWwgbnVtYmVyLCBzY2FsZSB1cCB4ICovCisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCX0KKwlpZiAoaXggPj0gMHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlrICs9IChpeD4+MjMpLTEyNzsKKwlpeCAmPSAweDAwN2ZmZmZmOworCWkgPSAoaXgrKDB4OTVmNjQ8PDMpKSYweDgwMDAwMDsKKwlTRVRfRkxPQVRfV09SRCh4LGl4fChpXjB4M2Y4MDAwMDApKTsJLyogbm9ybWFsaXplIHggb3IgeC8yICovCisJayArPSAoaT4+MjMpOworCWYgPSB4LShmbG9hdCkxLjA7CisJaWYoKDB4MDA3ZmZmZmYmKDE1K2l4KSk8MTYpIHsJLyogfGZ8IDwgMioqLTIwICovCisJICAgIGlmKGY9PXplcm8pIGlmKGs9PTApIHJldHVybiB6ZXJvOyAgZWxzZSB7ZGs9KGZsb2F0KWs7CisJCQkJIHJldHVybiBkaypsbjJfaGkrZGsqbG4yX2xvO30KKwkgICAgUiA9IGYqZiooKGZsb2F0KTAuNS0oZmxvYXQpMC4zMzMzMzMzMzMzMzMzMzMzMypmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZSB7ZGs9KGZsb2F0KWs7CisJICAgIAkgICAgIHJldHVybiBkaypsbjJfaGktKChSLWRrKmxuMl9sbyktZik7fQorCX0KKyAJcyA9IGYvKChmbG9hdCkyLjArZik7CisJZGsgPSAoZmxvYXQpazsKKwl6ID0gcypzOworCWkgPSBpeC0oMHg2MTQ3YTw8Myk7CisJdyA9IHoqejsKKwlqID0gKDB4NmI4NTE8PDMpLWl4OworCXQxPSB3KihMZzIrdypMZzQpOworCXQyPSB6KihMZzErdypMZzMpOworCWkgfD0gajsKKwlSID0gdDIrdDE7CisJaWYoaT4wKSB7CisJICAgIGhmc3E9KGZsb2F0KTAuNSpmKmY7CisJICAgIGlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrZGsqbG4yX2xvKSktZik7CisJfSBlbHNlIHsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtcyooZi1SKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChzKihmLVIpLWRrKmxuMl9sbyktZik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9wb3cuYyBiL2xpYm0vc3JjL2VfcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMzEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcG93LmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qIEAoIyllX3Bvdy5jIDEuNSAwNC8wNC8yMiBTTUkgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3Bvdy5jLHYgMS4xMSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3Bvdyh4LHkpIHJldHVybiB4Kip5CisgKgorICoJCSAgICAgIG4KKyAqIE1ldGhvZDogIExldCB4ID0gIDIgICAqICgxK2YpCisgKgkxLiBDb21wdXRlIGFuZCByZXR1cm4gbG9nMih4KSBpbiB0d28gcGllY2VzOgorICoJCWxvZzIoeCkgPSB3MSArIHcyLAorICoJICAgd2hlcmUgdzEgaGFzIDUzLTI0ID0gMjkgYml0IHRyYWlsaW5nIHplcm9zLgorICoJMi4gUGVyZm9ybSB5KmxvZzIoeCkgPSBuK3knIGJ5IHNpbXVsYXRpbmcgbXV0aS1wcmVjaXNpb24gCisgKgkgICBhcml0aG1ldGljLCB3aGVyZSB8eSd8PD0wLjUuCisgKgkzLiBSZXR1cm4geCoqeSA9IDIqKm4qZXhwKHknKmxvZzIpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCTEuICAoYW55dGhpbmcpICoqIDAgIGlzIDEKKyAqCTIuICAoYW55dGhpbmcpICoqIDEgIGlzIGl0c2VsZgorICoJMy4gIChhbnl0aGluZykgKiogTkFOIGlzIE5BTgorICoJNC4gIE5BTiAqKiAoYW55dGhpbmcgZXhjZXB0IDApIGlzIE5BTgorICoJNS4gICstKHx4fCA+IDEpICoqICArSU5GIGlzICtJTkYKKyAqCTYuICArLSh8eHwgPiAxKSAqKiAgLUlORiBpcyArMAorICoJNy4gICstKHx4fCA8IDEpICoqICArSU5GIGlzICswCisgKgk4LiAgKy0ofHh8IDwgMSkgKiogIC1JTkYgaXMgK0lORgorICoJOS4gICstMSAgICAgICAgICoqICstSU5GIGlzIE5BTgorICoJMTAuICswICoqICgrYW55dGhpbmcgZXhjZXB0IDAsIE5BTikgICAgICAgICAgICAgICBpcyArMAorICoJMTEuIC0wICoqICgrYW55dGhpbmcgZXhjZXB0IDAsIE5BTiwgb2RkIGludGVnZXIpICBpcyArMAorICoJMTIuICswICoqICgtYW55dGhpbmcgZXhjZXB0IDAsIE5BTikgICAgICAgICAgICAgICBpcyArSU5GCisgKgkxMy4gLTAgKiogKC1hbnl0aGluZyBleGNlcHQgMCwgTkFOLCBvZGQgaW50ZWdlcikgIGlzICtJTkYKKyAqCTE0LiAtMCAqKiAob2RkIGludGVnZXIpID0gLSggKzAgKiogKG9kZCBpbnRlZ2VyKSApCisgKgkxNS4gK0lORiAqKiAoK2FueXRoaW5nIGV4Y2VwdCAwLE5BTikgaXMgK0lORgorICoJMTYuICtJTkYgKiogKC1hbnl0aGluZyBleGNlcHQgMCxOQU4pIGlzICswCisgKgkxNy4gLUlORiAqKiAoYW55dGhpbmcpICA9IC0wICoqICgtYW55dGhpbmcpCisgKgkxOC4gKC1hbnl0aGluZykgKiogKGludGVnZXIpIGlzICgtMSkqKihpbnRlZ2VyKSooK2FueXRoaW5nKippbnRlZ2VyKQorICoJMTkuICgtYW55dGhpbmcgZXhjZXB0IDAgYW5kIGluZikgKiogKG5vbi1pbnRlZ2VyKSBpcyBOQU4KKyAqCisgKiBBY2N1cmFjeToKKyAqCXBvdyh4LHkpIHJldHVybnMgeCoqeSBuZWFybHkgcm91bmRlZC4gSW4gcGFydGljdWxhcgorICoJCQlwb3coaW50ZWdlcixpbnRlZ2VyKQorICoJYWx3YXlzIHJldHVybnMgdGhlIGNvcnJlY3QgaW50ZWdlciBwcm92aWRlZCBpdCBpcyAKKyAqCXJlcHJlc2VudGFibGUuCisgKgorICogQ29uc3RhbnRzIDoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorYnBbXSA9IHsxLjAsIDEuNSx9LAorZHBfaFtdID0geyAwLjAsIDUuODQ5NjI0ODcyMjA3NjQxNjAxNTZlLTAxLH0sIC8qIDB4M0ZFMkI4MDMsIDB4NDAwMDAwMDAgKi8KK2RwX2xbXSA9IHsgMC4wLCAxLjM1MDAzOTIwMjEyOTc0ODk3MTI4ZS0wOCx9LCAvKiAweDNFNENGREVCLCAweDQzQ0ZEMDA2ICovCit6ZXJvICAgID0gIDAuMCwKK29uZQk9ICAxLjAsCit0d28JPSAgMi4wLAordHdvNTMJPSAgOTAwNzE5OTI1NDc0MDk5Mi4wLAkvKiAweDQzNDAwMDAwLCAweDAwMDAwMDAwICovCitodWdlCT0gIDEuMGUzMDAsCit0aW55ICAgID0gIDEuMGUtMzAwLAorCS8qIHBvbHkgY29lZnMgZm9yICgzLzIpKihsb2coeCktMnMtMi8zKnMqKjMgKi8KK0wxICA9ICA1Ljk5OTk5OTk5OTk5OTk0NjQ4NzI1ZS0wMSwgLyogMHgzRkUzMzMzMywgMHgzMzMzMzMwMyAqLworTDIgID0gIDQuMjg1NzE0Mjg1Nzg1NTAxODQyNTJlLTAxLCAvKiAweDNGREI2REI2LCAweERCNkZBQkZGICovCitMMyAgPSAgMy4zMzMzMzMyOTgxODM3NzQzMjkxOGUtMDEsIC8qIDB4M0ZENTU1NTUsIDB4NTE4RjI2NEQgKi8KK0w0ICA9ICAyLjcyNzI4MTIzODA4NTM0MDA2NDg5ZS0wMSwgLyogMHgzRkQxNzQ2MCwgMHhBOTFENDEwMSAqLworTDUgID0gIDIuMzA2NjA3NDU3NzU1NjE3NTQwNjdlLTAxLCAvKiAweDNGQ0Q4NjRBLCAweDkzQzlEQjY1ICovCitMNiAgPSAgMi4wNjk3NTAxNzgwMDMzODQxNzc4NGUtMDEsIC8qIDB4M0ZDQTdFMjgsIDB4NEE0NTRFRUYgKi8KK1AxICAgPSAgMS42NjY2NjY2NjY2NjY2NjAxOTAzN2UtMDEsIC8qIDB4M0ZDNTU1NTUsIDB4NTU1NTU1M0UgKi8KK1AyICAgPSAtMi43Nzc3Nzc3Nzc3MDE1NTkzMzg0MmUtMDMsIC8qIDB4QkY2NkMxNkMsIDB4MTZCRUJEOTMgKi8KK1AzICAgPSAgNi42MTM3NTYzMjE0Mzc5MzQzNjExN2UtMDUsIC8qIDB4M0YxMTU2NkEsIDB4QUYyNURFMkMgKi8KK1A0ICAgPSAtMS42NTMzOTAyMjA1NDY1MjUxNTM5MGUtMDYsIC8qIDB4QkVCQkJENDEsIDB4QzVEMjZCRjEgKi8KK1A1ICAgPSAgNC4xMzgxMzY3OTcwNTcyMzg0NjAzOWUtMDgsIC8qIDB4M0U2NjM3NjksIDB4NzJCRUE0RDAgKi8KK2xnMiAgPSAgNi45MzE0NzE4MDU1OTk0NTI4NjIyN2UtMDEsIC8qIDB4M0ZFNjJFNDIsIDB4RkVGQTM5RUYgKi8KK2xnMl9oICA9ICA2LjkzMTQ3MTgyNDY0NTk5NjA5Mzc1ZS0wMSwgLyogMHgzRkU2MkU0MywgMHgwMDAwMDAwMCAqLworbGcyX2wgID0gLTEuOTA0NjU0Mjk5OTU3NzY4MDQ1MjVlLTA5LCAvKiAweEJFMjA1QzYxLCAweDBDQTg2QzM5ICovCitvdnQgPSAgOC4wMDg1NjYyNTk1MzcyOTQ0MzcyZS0wMDE3LCAvKiAtKDEwMjQtbG9nMihvdmZsKy41dWxwKSkgKi8KK2NwICAgID0gIDkuNjE3OTY2OTM5MjU5NzU1NTQzMjllLTAxLCAvKiAweDNGRUVDNzA5LCAweERDM0EwM0ZEID0yLygzbG4yKSAqLworY3BfaCAgPSAgOS42MTc5NjcwMDk1NDQzNzI1NTg1OWUtMDEsIC8qIDB4M0ZFRUM3MDksIDB4RTAwMDAwMDAgPShmbG9hdCljcCAqLworY3BfbCAgPSAtNy4wMjg0NjE2NTA5NTI3NTgyNjUxNmUtMDksIC8qIDB4QkUzRTJGRTAsIDB4MTQ1QjAxRjUgPXRhaWwgb2YgY3BfaCovCitpdmxuMiAgICA9ICAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwZSswMCwgLyogMHgzRkY3MTU0NywgMHg2NTJCODJGRSA9MS9sbjIgKi8KK2l2bG4yX2ggID0gIDEuNDQyNjk1MDIxNjI5MzMzNDk2MDllKzAwLCAvKiAweDNGRjcxNTQ3LCAweDYwMDAwMDAwID0yNGIgMS9sbjIqLworaXZsbjJfbCAgPSAgMS45MjU5NjI5OTExMjY2MTc0Njg4N2UtMDg7IC8qIDB4M0U1NEFFMEIsIDB4Rjg1RERGNDQgPTEvbG4yIHRhaWwqLworCitkb3VibGUKK19faWVlZTc1NF9wb3coZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSB6LGF4LHpfaCx6X2wscF9oLHBfbDsKKwlkb3VibGUgeTEsdDEsdDIscixzLHQsdSx2LHc7CisJaW50MzJfdCBpLGosayx5aXNpbnQsbjsKKwlpbnQzMl90IGh4LGh5LGl4LGl5OworCXVfaW50MzJfdCBseCxseTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7ICBpeSA9IGh5JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB5PT16ZXJvOiB4KiowID0gMSAqLworCWlmKChpeXxseSk9PTApIHJldHVybiBvbmU7IAkKKworICAgIC8qICstTmFOIHJldHVybiB4K3kgKi8KKwlpZihpeCA+IDB4N2ZmMDAwMDAgfHwgKChpeD09MHg3ZmYwMDAwMCkmJihseCE9MCkpIHx8CisJICAgaXkgPiAweDdmZjAwMDAwIHx8ICgoaXk9PTB4N2ZmMDAwMDApJiYobHkhPTApKSkgCisJCXJldHVybiB4K3k7CQorCisgICAgLyogZGV0ZXJtaW5lIGlmIHkgaXMgYW4gb2RkIGludCB3aGVuIHggPCAwCisgICAgICogeWlzaW50ID0gMAkuLi4geSBpcyBub3QgYW4gaW50ZWdlcgorICAgICAqIHlpc2ludCA9IDEJLi4uIHkgaXMgYW4gb2RkIGludAorICAgICAqIHlpc2ludCA9IDIJLi4uIHkgaXMgYW4gZXZlbiBpbnQKKyAgICAgKi8KKwl5aXNpbnQgID0gMDsKKwlpZihoeDwwKSB7CQorCSAgICBpZihpeT49MHg0MzQwMDAwMCkgeWlzaW50ID0gMjsgLyogZXZlbiBpbnRlZ2VyIHkgKi8KKwkgICAgZWxzZSBpZihpeT49MHgzZmYwMDAwMCkgeworCQlrID0gKGl5Pj4yMCktMHgzZmY7CSAgIC8qIGV4cG9uZW50ICovCisJCWlmKGs+MjApIHsKKwkJICAgIGogPSBseT4+KDUyLWspOworCQkgICAgaWYoKGo8PCg1Mi1rKSk9PWx5KSB5aXNpbnQgPSAyLShqJjEpOworCQl9IGVsc2UgaWYobHk9PTApIHsKKwkJICAgIGogPSBpeT4+KDIwLWspOworCQkgICAgaWYoKGo8PCgyMC1rKSk9PWl5KSB5aXNpbnQgPSAyLShqJjEpOworCQl9CisJICAgIH0JCQorCX0gCisKKyAgICAvKiBzcGVjaWFsIHZhbHVlIG9mIHkgKi8KKwlpZihseT09MCkgeyAJCisJICAgIGlmIChpeT09MHg3ZmYwMDAwMCkgewkvKiB5IGlzICstaW5mICovCisJICAgICAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkKKwkJICAgIHJldHVybiAgeSAtIHk7CS8qIGluZioqKy0xIGlzIE5hTiAqLworCSAgICAgICAgZWxzZSBpZiAoaXggPj0gMHgzZmYwMDAwMCkvKiAofHh8PjEpKiorLWluZiA9IGluZiwwICovCisJCSAgICByZXR1cm4gKGh5Pj0wKT8geTogemVybzsKKwkgICAgICAgIGVsc2UJCQkvKiAofHh8PDEpKiotLCtpbmYgPSBpbmYsMCAqLworCQkgICAgcmV0dXJuIChoeTwwKT8teTogemVybzsKKwkgICAgfSAKKwkgICAgaWYoaXk9PTB4M2ZmMDAwMDApIHsJLyogeSBpcyAgKy0xICovCisJCWlmKGh5PDApIHJldHVybiBvbmUveDsgZWxzZSByZXR1cm4geDsKKwkgICAgfQorCSAgICBpZihoeT09MHg0MDAwMDAwMCkgcmV0dXJuIHgqeDsgLyogeSBpcyAgMiAqLworCSAgICBpZihoeT09MHgzZmUwMDAwMCkgewkvKiB5IGlzICAwLjUgKi8KKwkJaWYoaHg+PTApCS8qIHggPj0gKzAgKi8KKwkJcmV0dXJuIHNxcnQoeCk7CQorCSAgICB9CisJfQorCisJYXggICA9IGZhYnMoeCk7CisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB4ICovCisJaWYobHg9PTApIHsKKwkgICAgaWYoaXg9PTB4N2ZmMDAwMDB8fGl4PT0wfHxpeD09MHgzZmYwMDAwMCl7CisJCXogPSBheDsJCQkvKnggaXMgKy0wLCstaW5mLCstMSovCisJCWlmKGh5PDApIHogPSBvbmUvejsJLyogeiA9ICgxL3x4fCkgKi8KKwkJaWYoaHg8MCkgeworCQkgICAgaWYoKChpeC0weDNmZjAwMDAwKXx5aXNpbnQpPT0wKSB7CisJCQl6ID0gKHoteikvKHoteik7IC8qICgtMSkqKm5vbi1pbnQgaXMgTmFOICovCisJCSAgICB9IGVsc2UgaWYoeWlzaW50PT0xKSAKKwkJCXogPSAtejsJCS8qICh4PDApKipvZGQgPSAtKHx4fCoqb2RkKSAqLworCQl9CisJCXJldHVybiB6OworCSAgICB9CisJfQorICAgIAorICAgIC8qIENZR05VUyBMT0NBTCArIGZkbGlibS01LjMgZml4OiBUaGlzIHVzZWQgdG8gYmUKKwluID0gKGh4Pj4zMSkrMTsKKyAgICAgICBidXQgQU5TSSBDIHNheXMgYSByaWdodCBzaGlmdCBvZiBhIHNpZ25lZCBuZWdhdGl2ZSBxdWFudGl0eSBpcworICAgICAgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICAqLworCW4gPSAoKHVfaW50MzJfdCloeD4+MzEpLTE7CisKKyAgICAvKiAoeDwwKSoqKG5vbi1pbnQpIGlzIE5hTiAqLworCWlmKChufHlpc2ludCk9PTApIHJldHVybiAoeC14KS8oeC14KTsKKworCXMgPSBvbmU7IC8qIHMgKHNpZ24gb2YgcmVzdWx0IC12ZSoqb2RkKSA9IC0xIGVsc2UgPSAxICovCisJaWYoKG58KHlpc2ludC0xKSk9PTApIHMgPSAtb25lOy8qICgtdmUpKioob2RkIGludCkgKi8KKworICAgIC8qIHx5fCBpcyBodWdlICovCisJaWYoaXk+MHg0MWUwMDAwMCkgeyAvKiBpZiB8eXwgPiAyKiozMSAqLworCSAgICBpZihpeT4weDQzZjAwMDAwKXsJLyogaWYgfHl8ID4gMioqNjQsIG11c3Qgby91ZmxvdyAqLworCQlpZihpeDw9MHgzZmVmZmZmZikgcmV0dXJuIChoeTwwKT8gaHVnZSpodWdlOnRpbnkqdGlueTsKKwkJaWYoaXg+PTB4M2ZmMDAwMDApIHJldHVybiAoaHk+MCk/IGh1Z2UqaHVnZTp0aW55KnRpbnk7CisJICAgIH0KKwkvKiBvdmVyL3VuZGVyZmxvdyBpZiB4IGlzIG5vdCBjbG9zZSB0byBvbmUgKi8KKwkgICAgaWYoaXg8MHgzZmVmZmZmZikgcmV0dXJuIChoeTwwKT8gcypodWdlKmh1Z2U6cyp0aW55KnRpbnk7CisJICAgIGlmKGl4PjB4M2ZmMDAwMDApIHJldHVybiAoaHk+MCk/IHMqaHVnZSpodWdlOnMqdGlueSp0aW55OworCS8qIG5vdyB8MS14fCBpcyB0aW55IDw9IDIqKi0yMCwgc3VmZmljZSB0byBjb21wdXRlIAorCSAgIGxvZyh4KSBieSB4LXheMi8yK3heMy8zLXheNC80ICovCisJICAgIHQgPSBheC1vbmU7CQkvKiB0IGhhcyAyMCB0cmFpbGluZyB6ZXJvcyAqLworCSAgICB3ID0gKHQqdCkqKDAuNS10KigwLjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMtdCowLjI1KSk7CisJICAgIHUgPSBpdmxuMl9oKnQ7CS8qIGl2bG4yX2ggaGFzIDIxIHNpZy4gYml0cyAqLworCSAgICB2ID0gdCppdmxuMl9sLXcqaXZsbjI7CisJICAgIHQxID0gdSt2OworCSAgICBTRVRfTE9XX1dPUkQodDEsMCk7CisJICAgIHQyID0gdi0odDEtdSk7CisJfSBlbHNlIHsKKwkgICAgZG91YmxlIHNzLHMyLHNfaCxzX2wsdF9oLHRfbDsKKwkgICAgbiA9IDA7CisJLyogdGFrZSBjYXJlIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgaWYoaXg8MHgwMDEwMDAwMCkKKwkJe2F4ICo9IHR3bzUzOyBuIC09IDUzOyBHRVRfSElHSF9XT1JEKGl4LGF4KTsgfQorCSAgICBuICArPSAoKGl4KT4+MjApLTB4M2ZmOworCSAgICBqICA9IGl4JjB4MDAwZmZmZmY7CisJLyogZGV0ZXJtaW5lIGludGVydmFsICovCisJICAgIGl4ID0ganwweDNmZjAwMDAwOwkJLyogbm9ybWFsaXplIGl4ICovCisJICAgIGlmKGo8PTB4Mzk4OEUpIGs9MDsJCS8qIHx4fDxzcXJ0KDMvMikgKi8KKwkgICAgZWxzZSBpZihqPDB4QkI2N0EpIGs9MTsJLyogfHh8PHNxcnQoMykgICAqLworCSAgICBlbHNlIHtrPTA7bis9MTtpeCAtPSAweDAwMTAwMDAwO30KKwkgICAgU0VUX0hJR0hfV09SRChheCxpeCk7CisKKwkvKiBjb21wdXRlIHNzID0gc19oK3NfbCA9ICh4LTEpLyh4KzEpIG9yICh4LTEuNSkvKHgrMS41KSAqLworCSAgICB1ID0gYXgtYnBba107CQkvKiBicFswXT0xLjAsIGJwWzFdPTEuNSAqLworCSAgICB2ID0gb25lLyhheCticFtrXSk7CisJICAgIHNzID0gdSp2OworCSAgICBzX2ggPSBzczsKKwkgICAgU0VUX0xPV19XT1JEKHNfaCwwKTsKKwkvKiB0X2g9YXgrYnBba10gSGlnaCAqLworCSAgICB0X2ggPSB6ZXJvOworCSAgICBTRVRfSElHSF9XT1JEKHRfaCwoKGl4Pj4xKXwweDIwMDAwMDAwKSsweDAwMDgwMDAwKyhrPDwxOCkpOworCSAgICB0X2wgPSBheCAtICh0X2gtYnBba10pOworCSAgICBzX2wgPSB2KigodS1zX2gqdF9oKS1zX2gqdF9sKTsKKwkvKiBjb21wdXRlIGxvZyhheCkgKi8KKwkgICAgczIgPSBzcypzczsKKwkgICAgciA9IHMyKnMyKihMMStzMiooTDIrczIqKEwzK3MyKihMNCtzMiooTDUrczIqTDYpKSkpKTsKKwkgICAgciArPSBzX2wqKHNfaCtzcyk7CisJICAgIHMyICA9IHNfaCpzX2g7CisJICAgIHRfaCA9IDMuMCtzMityOworCSAgICBTRVRfTE9XX1dPUkQodF9oLDApOworCSAgICB0X2wgPSByLSgodF9oLTMuMCktczIpOworCS8qIHUrdiA9IHNzKigxKy4uLikgKi8KKwkgICAgdSA9IHNfaCp0X2g7CisJICAgIHYgPSBzX2wqdF9oK3RfbCpzczsKKwkvKiAyLygzbG9nMikqKHNzKy4uLikgKi8KKwkgICAgcF9oID0gdSt2OworCSAgICBTRVRfTE9XX1dPUkQocF9oLDApOworCSAgICBwX2wgPSB2LShwX2gtdSk7CisJICAgIHpfaCA9IGNwX2gqcF9oOwkJLyogY3BfaCtjcF9sID0gMi8oMypsb2cyKSAqLworCSAgICB6X2wgPSBjcF9sKnBfaCtwX2wqY3ArZHBfbFtrXTsKKwkvKiBsb2cyKGF4KSA9IChzcysuLikqMi8oMypsb2cyKSA9IG4gKyBkcF9oICsgel9oICsgel9sICovCisJICAgIHQgPSAoZG91YmxlKW47CisJICAgIHQxID0gKCgoel9oK3pfbCkrZHBfaFtrXSkrdCk7CisJICAgIFNFVF9MT1dfV09SRCh0MSwwKTsKKwkgICAgdDIgPSB6X2wtKCgodDEtdCktZHBfaFtrXSktel9oKTsKKwl9CisKKyAgICAvKiBzcGxpdCB1cCB5IGludG8geTEreTIgYW5kIGNvbXB1dGUgKHkxK3kyKSoodDErdDIpICovCisJeTEgID0geTsKKwlTRVRfTE9XX1dPUkQoeTEsMCk7CisJcF9sID0gKHkteTEpKnQxK3kqdDI7CisJcF9oID0geTEqdDE7CisJeiA9IHBfbCtwX2g7CisJRVhUUkFDVF9XT1JEUyhqLGkseik7CisJaWYgKGo+PTB4NDA5MDAwMDApIHsJCQkJLyogeiA+PSAxMDI0ICovCisJICAgIGlmKCgoai0weDQwOTAwMDAwKXxpKSE9MCkJCQkvKiBpZiB6ID4gMTAyNCAqLworCQlyZXR1cm4gcypodWdlKmh1Z2U7CQkJLyogb3ZlcmZsb3cgKi8KKwkgICAgZWxzZSB7CisJCWlmKHBfbCtvdnQ+ei1wX2gpIHJldHVybiBzKmh1Z2UqaHVnZTsJLyogb3ZlcmZsb3cgKi8KKwkgICAgfQorCX0gZWxzZSBpZigoaiYweDdmZmZmZmZmKT49MHg0MDkwY2MwMCApIHsJLyogeiA8PSAtMTA3NSAqLworCSAgICBpZigoKGotMHhjMDkwY2MwMCl8aSkhPTApIAkJLyogeiA8IC0xMDc1ICovCisJCXJldHVybiBzKnRpbnkqdGlueTsJCS8qIHVuZGVyZmxvdyAqLworCSAgICBlbHNlIHsKKwkJaWYocF9sPD16LXBfaCkgcmV0dXJuIHMqdGlueSp0aW55OwkvKiB1bmRlcmZsb3cgKi8KKwkgICAgfQorCX0KKyAgICAvKgorICAgICAqIGNvbXB1dGUgMioqKHBfaCtwX2wpCisgICAgICovCisJaSA9IGomMHg3ZmZmZmZmZjsKKwlrID0gKGk+PjIwKS0weDNmZjsKKwluID0gMDsKKwlpZihpPjB4M2ZlMDAwMDApIHsJCS8qIGlmIHx6fCA+IDAuNSwgc2V0IG4gPSBbeiswLjVdICovCisJICAgIG4gPSBqKygweDAwMTAwMDAwPj4oaysxKSk7CisJICAgIGsgPSAoKG4mMHg3ZmZmZmZmZik+PjIwKS0weDNmZjsJLyogbmV3IGsgZm9yIG4gKi8KKwkgICAgdCA9IHplcm87CisJICAgIFNFVF9ISUdIX1dPUkQodCxuJn4oMHgwMDBmZmZmZj4+aykpOworCSAgICBuID0gKChuJjB4MDAwZmZmZmYpfDB4MDAxMDAwMDApPj4oMjAtayk7CisJICAgIGlmKGo8MCkgbiA9IC1uOworCSAgICBwX2ggLT0gdDsKKwl9IAorCXQgPSBwX2wrcF9oOworCVNFVF9MT1dfV09SRCh0LDApOworCXUgPSB0KmxnMl9oOworCXYgPSAocF9sLSh0LXBfaCkpKmxnMit0KmxnMl9sOworCXogPSB1K3Y7CisJdyA9IHYtKHotdSk7CisJdCAgPSB6Kno7CisJdDEgID0geiAtIHQqKFAxK3QqKFAyK3QqKFAzK3QqKFA0K3QqUDUpKSkpOworCXIgID0gKHoqdDEpLyh0MS10d28pLSh3K3oqdyk7CisJeiAgPSBvbmUtKHIteik7CisJR0VUX0hJR0hfV09SRChqLHopOworCWogKz0gKG48PDIwKTsKKwlpZigoaj4+MjApPD0wKSB6ID0gc2NhbGJuKHosbik7CS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwllbHNlIFNFVF9ISUdIX1dPUkQoeixqKTsKKwlyZXR1cm4gcyp6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9wb3dmLmMgYi9saWJtL3NyYy9lX3Bvd2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYwOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9wb3dmLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGVfcG93Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9wb3cuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcG93Zi5jLHYgMS4xMiAyMDA0LzA2LzAxIDE5OjMzOjMwIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CiticFtdID0gezEuMCwgMS41LH0sCitkcF9oW10gPSB7IDAuMCwgNS44NDk2MDkzOGUtMDEsfSwgLyogMHgzZjE1YzAwMCAqLworZHBfbFtdID0geyAwLjAsIDEuNTYzMjIwODVlLTA2LH0sIC8qIDB4MzVkMWNmZGMgKi8KK3plcm8gICAgPSAgMC4wLAorb25lCT0gIDEuMCwKK3R3bwk9ICAyLjAsCit0d28yNAk9ICAxNjc3NzIxNi4wLAkvKiAweDRiODAwMDAwICovCitodWdlCT0gIDEuMGUzMCwKK3RpbnkgICAgPSAgMS4wZS0zMCwKKwkvKiBwb2x5IGNvZWZzIGZvciAoMy8yKSoobG9nKHgpLTJzLTIvMypzKiozICovCitMMSAgPSAgNi4wMDAwMDAyMzg0ZS0wMSwgLyogMHgzZjE5OTk5YSAqLworTDIgID0gIDQuMjg1NzE0MzI4M2UtMDEsIC8qIDB4M2VkYjZkYjcgKi8KK0wzICA9ICAzLjMzMzMzMzQzMjdlLTAxLCAvKiAweDNlYWFhYWFiICovCitMNCAgPSAgMi43MjcyODExNTMyZS0wMSwgLyogMHgzZThiYTMwNSAqLworTDUgID0gIDIuMzA2NjA3NTE0NmUtMDEsIC8qIDB4M2U2YzMyNTUgKi8KK0w2ICA9ICAyLjA2OTc1MDEzMDJlLTAxLCAvKiAweDNlNTNmMTQyICovCitQMSAgID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK1AyICAgPSAtMi43Nzc3Nzc4NDUwZS0wMywgLyogMHhiYjM2MGI2MSAqLworUDMgICA9ICA2LjYxMzc1NTk3NzBlLTA1LCAvKiAweDM4OGFiMzU1ICovCitQNCAgID0gLTEuNjUzMzkwMTk5OWUtMDYsIC8qIDB4YjVkZGVhMGUgKi8KK1A1ICAgPSAgNC4xMzgxMzY5NDQyZS0wOCwgLyogMHgzMzMxYmI0YyAqLworbGcyICA9ICA2LjkzMTQ3MTgyNDZlLTAxLCAvKiAweDNmMzE3MjE4ICovCitsZzJfaCAgPSAgNi45MzE0NTc1MmUtMDEsIC8qIDB4M2YzMTcyMDAgKi8KK2xnMl9sICA9ICAxLjQyODYwNjU0ZS0wNiwgLyogMHgzNWJmYmU4YyAqLworb3Z0ID0gIDQuMjk5NTY2NTY5NGUtMDgsIC8qIC0oMTI4LWxvZzIob3ZmbCsuNXVscCkpICovCitjcCAgICA9ICA5LjYxNzk2NzAwOTVlLTAxLCAvKiAweDNmNzYzODRmID0yLygzbG4yKSAqLworY3BfaCAgPSAgOS42MTc5MTk5MjE5ZS0wMSwgLyogMHgzZjc2MzgwMCA9aGVhZCBvZiBjcCAqLworY3BfbCAgPSAgNC43MDE3MzgzNjIyZS0wNiwgLyogMHgzNjlkYzNhMCA9dGFpbCBvZiBjcF9oICovCitpdmxuMiAgICA9ICAxLjQ0MjY5NTAyMTZlKzAwLCAvKiAweDNmYjhhYTNiID0xL2xuMiAqLworaXZsbjJfaCAgPSAgMS40NDI2ODc5ODgzZSswMCwgLyogMHgzZmI4YWEwMCA9MTZiIDEvbG4yKi8KK2l2bG4yX2wgID0gIDcuMDUyNjA3NTQzM2UtMDY7IC8qIDB4MzZlY2E1NzAgPTEvbG4yIHRhaWwqLworCitmbG9hdAorX19pZWVlNzU0X3Bvd2YoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwlmbG9hdCB6LGF4LHpfaCx6X2wscF9oLHBfbDsKKwlmbG9hdCB5MSx0MSx0MixyLHMsc24sdCx1LHYsdzsKKwlpbnQzMl90IGksaixrLHlpc2ludCxuOworCWludDMyX3QgaHgsaHksaXgsaXksaXM7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7ICBpeSA9IGh5JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB5PT16ZXJvOiB4KiowID0gMSAqLworCWlmKGl5PT0wKSByZXR1cm4gb25lOworCisgICAgLyogKy1OYU4gcmV0dXJuIHgreSAqLworCWlmKGl4ID4gMHg3ZjgwMDAwMCB8fAorCSAgIGl5ID4gMHg3ZjgwMDAwMCkKKwkJcmV0dXJuIHgreTsKKworICAgIC8qIGRldGVybWluZSBpZiB5IGlzIGFuIG9kZCBpbnQgd2hlbiB4IDwgMAorICAgICAqIHlpc2ludCA9IDAJLi4uIHkgaXMgbm90IGFuIGludGVnZXIKKyAgICAgKiB5aXNpbnQgPSAxCS4uLiB5IGlzIGFuIG9kZCBpbnQKKyAgICAgKiB5aXNpbnQgPSAyCS4uLiB5IGlzIGFuIGV2ZW4gaW50CisgICAgICovCisJeWlzaW50ICA9IDA7CisJaWYoaHg8MCkgeworCSAgICBpZihpeT49MHg0YjgwMDAwMCkgeWlzaW50ID0gMjsgLyogZXZlbiBpbnRlZ2VyIHkgKi8KKwkgICAgZWxzZSBpZihpeT49MHgzZjgwMDAwMCkgeworCQlrID0gKGl5Pj4yMyktMHg3ZjsJICAgLyogZXhwb25lbnQgKi8KKwkJaiA9IGl5Pj4oMjMtayk7CisJCWlmKChqPDwoMjMtaykpPT1peSkgeWlzaW50ID0gMi0oaiYxKTsKKwkgICAgfQorCX0KKworICAgIC8qIHNwZWNpYWwgdmFsdWUgb2YgeSAqLworCWlmIChpeT09MHg3ZjgwMDAwMCkgewkvKiB5IGlzICstaW5mICovCisJICAgIGlmIChpeD09MHgzZjgwMDAwMCkKKwkgICAgICAgIHJldHVybiAgeSAtIHk7CS8qIGluZioqKy0xIGlzIE5hTiAqLworCSAgICBlbHNlIGlmIChpeCA+IDB4M2Y4MDAwMDApLyogKHx4fD4xKSoqKy1pbmYgPSBpbmYsMCAqLworCSAgICAgICAgcmV0dXJuIChoeT49MCk/IHk6IHplcm87CisJICAgIGVsc2UJCQkvKiAofHh8PDEpKiotLCtpbmYgPSBpbmYsMCAqLworCSAgICAgICAgcmV0dXJuIChoeTwwKT8teTogemVybzsKKwl9CisJaWYoaXk9PTB4M2Y4MDAwMDApIHsJLyogeSBpcyAgKy0xICovCisJICAgIGlmKGh5PDApIHJldHVybiBvbmUveDsgZWxzZSByZXR1cm4geDsKKwl9CisJaWYoaHk9PTB4NDAwMDAwMDApIHJldHVybiB4Kng7IC8qIHkgaXMgIDIgKi8KKwlpZihoeT09MHgzZjAwMDAwMCkgewkvKiB5IGlzICAwLjUgKi8KKwkgICAgaWYoaHg+PTApCS8qIHggPj0gKzAgKi8KKwkgICAgcmV0dXJuIF9faWVlZTc1NF9zcXJ0Zih4KTsKKwl9CisKKwlheCAgID0gZmFic2YoeCk7CisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB4ICovCisJaWYoaXg9PTB4N2Y4MDAwMDB8fGl4PT0wfHxpeD09MHgzZjgwMDAwMCl7CisJICAgIHogPSBheDsJCQkvKnggaXMgKy0wLCstaW5mLCstMSovCisJICAgIGlmKGh5PDApIHogPSBvbmUvejsJLyogeiA9ICgxL3x4fCkgKi8KKwkgICAgaWYoaHg8MCkgeworCQlpZigoKGl4LTB4M2Y4MDAwMDApfHlpc2ludCk9PTApIHsKKwkJICAgIHogPSAoei16KS8oei16KTsgLyogKC0xKSoqbm9uLWludCBpcyBOYU4gKi8KKwkJfSBlbHNlIGlmKHlpc2ludD09MSkKKwkJICAgIHogPSAtejsJCS8qICh4PDApKipvZGQgPSAtKHx4fCoqb2RkKSAqLworCSAgICB9CisJICAgIHJldHVybiB6OworCX0KKworCW4gPSAoKHVfaW50MzJfdCloeD4+MzEpLTE7CisKKyAgICAvKiAoeDwwKSoqKG5vbi1pbnQpIGlzIE5hTiAqLworCWlmKChufHlpc2ludCk9PTApIHJldHVybiAoeC14KS8oeC14KTsKKworCXNuID0gb25lOyAvKiBzIChzaWduIG9mIHJlc3VsdCAtdmUqKm9kZCkgPSAtMSBlbHNlID0gMSAqLworCWlmKChufCh5aXNpbnQtMSkpPT0wKSBzbiA9IC1vbmU7LyogKC12ZSkqKihvZGQgaW50KSAqLworCisgICAgLyogfHl8IGlzIGh1Z2UgKi8KKwlpZihpeT4weDRkMDAwMDAwKSB7IC8qIGlmIHx5fCA+IDIqKjI3ICovCisJLyogb3Zlci91bmRlcmZsb3cgaWYgeCBpcyBub3QgY2xvc2UgdG8gb25lICovCisJICAgIGlmKGl4PDB4M2Y3ZmZmZjgpIHJldHVybiAoaHk8MCk/IHNuKmh1Z2UqaHVnZTpzbip0aW55KnRpbnk7CisJICAgIGlmKGl4PjB4M2Y4MDAwMDcpIHJldHVybiAoaHk+MCk/IHNuKmh1Z2UqaHVnZTpzbip0aW55KnRpbnk7CisJLyogbm93IHwxLXh8IGlzIHRpbnkgPD0gMioqLTIwLCBzdWZmaWNlIHRvIGNvbXB1dGUKKwkgICBsb2coeCkgYnkgeC14XjIvMit4XjMvMy14XjQvNCAqLworCSAgICB0ID0gYXgtMTsJCS8qIHQgaGFzIDIwIHRyYWlsaW5nIHplcm9zICovCisJICAgIHcgPSAodCp0KSooKGZsb2F0KTAuNS10KigoZmxvYXQpMC4zMzMzMzMzMzMzMzMtdCooZmxvYXQpMC4yNSkpOworCSAgICB1ID0gaXZsbjJfaCp0OwkvKiBpdmxuMl9oIGhhcyAxNiBzaWcuIGJpdHMgKi8KKwkgICAgdiA9IHQqaXZsbjJfbC13Kml2bG4yOworCSAgICB0MSA9IHUrdjsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsdDEpOworCSAgICBTRVRfRkxPQVRfV09SRCh0MSxpcyYweGZmZmZmMDAwKTsKKwkgICAgdDIgPSB2LSh0MS11KTsKKwl9IGVsc2UgeworCSAgICBmbG9hdCBzMixzX2gsc19sLHRfaCx0X2w7CisJICAgIG4gPSAwOworCS8qIHRha2UgY2FyZSBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIGlmKGl4PDB4MDA4MDAwMDApCisJCXtheCAqPSB0d28yNDsgbiAtPSAyNDsgR0VUX0ZMT0FUX1dPUkQoaXgsYXgpOyB9CisJICAgIG4gICs9ICgoaXgpPj4yMyktMHg3ZjsKKwkgICAgaiAgPSBpeCYweDAwN2ZmZmZmOworCS8qIGRldGVybWluZSBpbnRlcnZhbCAqLworCSAgICBpeCA9IGp8MHgzZjgwMDAwMDsJCS8qIG5vcm1hbGl6ZSBpeCAqLworCSAgICBpZihqPD0weDFjYzQ3MSkgaz0wOwkvKiB8eHw8c3FydCgzLzIpICovCisJICAgIGVsc2UgaWYoajwweDVkYjNkNykgaz0xOwkvKiB8eHw8c3FydCgzKSAgICovCisJICAgIGVsc2Uge2s9MDtuKz0xO2l4IC09IDB4MDA4MDAwMDA7fQorCSAgICBTRVRfRkxPQVRfV09SRChheCxpeCk7CisKKwkvKiBjb21wdXRlIHMgPSBzX2grc19sID0gKHgtMSkvKHgrMSkgb3IgKHgtMS41KS8oeCsxLjUpICovCisJICAgIHUgPSBheC1icFtrXTsJCS8qIGJwWzBdPTEuMCwgYnBbMV09MS41ICovCisJICAgIHYgPSBvbmUvKGF4K2JwW2tdKTsKKwkgICAgcyA9IHUqdjsKKwkgICAgc19oID0gczsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsc19oKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoc19oLGlzJjB4ZmZmZmYwMDApOworCS8qIHRfaD1heCticFtrXSBIaWdoICovCisJICAgIGlzID0gKChpeD4+MSkmMHhmZmZmZjAwMCl8MHgyMDAwMDAwMDsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodF9oLGlzKzB4MDA0MDAwMDArKGs8PDIxKSk7CisJICAgIHRfbCA9IGF4IC0gKHRfaC1icFtrXSk7CisJICAgIHNfbCA9IHYqKCh1LXNfaCp0X2gpLXNfaCp0X2wpOworCS8qIGNvbXB1dGUgbG9nKGF4KSAqLworCSAgICBzMiA9IHMqczsKKwkgICAgciA9IHMyKnMyKihMMStzMiooTDIrczIqKEwzK3MyKihMNCtzMiooTDUrczIqTDYpKSkpKTsKKwkgICAgciArPSBzX2wqKHNfaCtzKTsKKwkgICAgczIgID0gc19oKnNfaDsKKwkgICAgdF9oID0gKGZsb2F0KTMuMCtzMityOworCSAgICBHRVRfRkxPQVRfV09SRChpcyx0X2gpOworCSAgICBTRVRfRkxPQVRfV09SRCh0X2gsaXMmMHhmZmZmZjAwMCk7CisJICAgIHRfbCA9IHItKCh0X2gtKGZsb2F0KTMuMCktczIpOworCS8qIHUrdiA9IHMqKDErLi4uKSAqLworCSAgICB1ID0gc19oKnRfaDsKKwkgICAgdiA9IHNfbCp0X2grdF9sKnM7CisJLyogMi8oM2xvZzIpKihzKy4uLikgKi8KKwkgICAgcF9oID0gdSt2OworCSAgICBHRVRfRkxPQVRfV09SRChpcyxwX2gpOworCSAgICBTRVRfRkxPQVRfV09SRChwX2gsaXMmMHhmZmZmZjAwMCk7CisJICAgIHBfbCA9IHYtKHBfaC11KTsKKwkgICAgel9oID0gY3BfaCpwX2g7CQkvKiBjcF9oK2NwX2wgPSAyLygzKmxvZzIpICovCisJICAgIHpfbCA9IGNwX2wqcF9oK3BfbCpjcCtkcF9sW2tdOworCS8qIGxvZzIoYXgpID0gKHMrLi4pKjIvKDMqbG9nMikgPSBuICsgZHBfaCArIHpfaCArIHpfbCAqLworCSAgICB0ID0gKGZsb2F0KW47CisJICAgIHQxID0gKCgoel9oK3pfbCkrZHBfaFtrXSkrdCk7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHQxKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaXMmMHhmZmZmZjAwMCk7CisJICAgIHQyID0gel9sLSgoKHQxLXQpLWRwX2hba10pLXpfaCk7CisJfQorCisgICAgLyogc3BsaXQgdXAgeSBpbnRvIHkxK3kyIGFuZCBjb21wdXRlICh5MSt5MikqKHQxK3QyKSAqLworCUdFVF9GTE9BVF9XT1JEKGlzLHkpOworCVNFVF9GTE9BVF9XT1JEKHkxLGlzJjB4ZmZmZmYwMDApOworCXBfbCA9ICh5LXkxKSp0MSt5KnQyOworCXBfaCA9IHkxKnQxOworCXogPSBwX2wrcF9oOworCUdFVF9GTE9BVF9XT1JEKGoseik7CisJaWYgKGo+MHg0MzAwMDAwMCkJCQkJLyogaWYgeiA+IDEyOCAqLworCSAgICByZXR1cm4gc24qaHVnZSpodWdlOwkJCS8qIG92ZXJmbG93ICovCisJZWxzZSBpZiAoaj09MHg0MzAwMDAwMCkgewkJCS8qIGlmIHogPT0gMTI4ICovCisJICAgIGlmKHBfbCtvdnQ+ei1wX2gpIHJldHVybiBzbipodWdlKmh1Z2U7CS8qIG92ZXJmbG93ICovCisJfQorCWVsc2UgaWYgKChqJjB4N2ZmZmZmZmYpPjB4NDMxNjAwMDApCQkvKiB6IDw9IC0xNTAgKi8KKwkgICAgcmV0dXJuIHNuKnRpbnkqdGlueTsJCQkvKiB1bmRlcmZsb3cgKi8KKwllbHNlIGlmIChqPT0weGMzMTYwMDAwKXsJCQkvKiB6ID09IC0xNTAgKi8KKwkgICAgaWYocF9sPD16LXBfaCkgcmV0dXJuIHNuKnRpbnkqdGlueTsJCS8qIHVuZGVyZmxvdyAqLworCX0KKyAgICAvKgorICAgICAqIGNvbXB1dGUgMioqKHBfaCtwX2wpCisgICAgICovCisJaSA9IGomMHg3ZmZmZmZmZjsKKwlrID0gKGk+PjIzKS0weDdmOworCW4gPSAwOworCWlmKGk+MHgzZjAwMDAwMCkgewkJLyogaWYgfHp8ID4gMC41LCBzZXQgbiA9IFt6KzAuNV0gKi8KKwkgICAgbiA9IGorKDB4MDA4MDAwMDA+PihrKzEpKTsKKwkgICAgayA9ICgobiYweDdmZmZmZmZmKT4+MjMpLTB4N2Y7CS8qIG5ldyBrIGZvciBuICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHQsbiZ+KDB4MDA3ZmZmZmY+PmspKTsKKwkgICAgbiA9ICgobiYweDAwN2ZmZmZmKXwweDAwODAwMDAwKT4+KDIzLWspOworCSAgICBpZihqPDApIG4gPSAtbjsKKwkgICAgcF9oIC09IHQ7CisJfQorCXQgPSBwX2wrcF9oOworCUdFVF9GTE9BVF9XT1JEKGlzLHQpOworCVNFVF9GTE9BVF9XT1JEKHQsaXMmMHhmZmZmODAwMCk7CisJdSA9IHQqbGcyX2g7CisJdiA9IChwX2wtKHQtcF9oKSkqbGcyK3QqbGcyX2w7CisJeiA9IHUrdjsKKwl3ID0gdi0oei11KTsKKwl0ICA9IHoqejsKKwl0MSAgPSB6IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJciAgPSAoeip0MSkvKHQxLXR3byktKHcreip3KTsKKwl6ICA9IG9uZS0oci16KTsKKwlHRVRfRkxPQVRfV09SRChqLHopOworCWogKz0gKG48PDIzKTsKKwlpZigoaj4+MjMpPD0wKSB6ID0gc2NhbGJuZih6LG4pOwkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJZWxzZSBTRVRfRkxPQVRfV09SRCh6LGopOworCXJldHVybiBzbip6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1fcGlvMi5jIGIvbGlibS9zcmMvZV9yZW1fcGlvMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbV9waW8yLmMKQEAgLTAsMCArMSwxNjggQEAKKworLyogQCgjKWVfcmVtX3BpbzIuYyAxLjQgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcmVtX3BpbzIuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3JlbV9waW8yKHgseSkKKyAqIAorICogcmV0dXJuIHRoZSByZW1haW5kZXIgb2YgeCByZW0gcGkvMiBpbiB5WzBdK3lbMV0gCisgKiB1c2UgX19rZXJuZWxfcmVtX3BpbzIoKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qCisgKiBUYWJsZSBvZiBjb25zdGFudHMgZm9yIDIvcGksIDM5NiBIZXggZGlnaXRzICg0NzYgZGVjaW1hbCkgb2YgMi9waSAKKyAqLworc3RhdGljIGNvbnN0IGludDMyX3QgdHdvX292ZXJfcGlbXSA9IHsKKzB4QTJGOTgzLCAweDZFNEU0NCwgMHgxNTI5RkMsIDB4Mjc1N0QxLCAweEY1MzRERCwgMHhDMERCNjIsIAorMHg5NTk5M0MsIDB4NDM5MDQxLCAweEZFNTE2MywgMHhBQkRFQkIsIDB4QzU2MUI3LCAweDI0NkUzQSwgCisweDQyNEREMiwgMHhFMDA2NDksIDB4MkVFQTA5LCAweEQxOTIxQywgMHhGRTFERUIsIDB4MUNCMTI5LCAKKzB4QTczRUU4LCAweDgyMzVGNSwgMHgyRUJCNDQsIDB4ODRFOTlDLCAweDcwMjZCNCwgMHg1RjdFNDEsIAorMHgzOTkxRDYsIDB4Mzk4MzUzLCAweDM5RjQ5QywgMHg4NDVGOEIsIDB4QkRGOTI4LCAweDNCMUZGOCwgCisweDk3RkZERSwgMHgwNTk4MEYsIDB4RUYyRjExLCAweDhCNUEwQSwgMHg2RDFGNkQsIDB4MzY3RUNGLCAKKzB4MjdDQjA5LCAweEI3NEY0NiwgMHgzRjY2OUUsIDB4NUZFQTJELCAweDc1MjdCQSwgMHhDN0VCRTUsIAorMHhGMTdCM0QsIDB4MDczOUY3LCAweDhBNTI5MiwgMHhFQTZCRkIsIDB4NUZCMTFGLCAweDhENUQwOCwgCisweDU2MDMzMCwgMHg0NkZDN0IsIDB4NkJBQkYwLCAweENGQkMyMCwgMHg5QUY0MzYsIDB4MURBOUUzLCAKKzB4OTE2MTVFLCAweEU2MUIwOCwgMHg2NTk5ODUsIDB4NUYxNEEwLCAweDY4NDA4RCwgMHhGRkQ4ODAsIAorMHg0RDczMjcsIDB4MzEwNjA2LCAweDE1NTZDQSwgMHg3M0E4QzksIDB4NjBFMjdCLCAweEMwOEM2QiwgCit9OworCitzdGF0aWMgY29uc3QgaW50MzJfdCBucGlvMl9od1tdID0geworMHgzRkY5MjFGQiwgMHg0MDA5MjFGQiwgMHg0MDEyRDk3QywgMHg0MDE5MjFGQiwgMHg0MDFGNkE3QSwgMHg0MDIyRDk3QywKKzB4NDAyNUZEQkIsIDB4NDAyOTIxRkIsIDB4NDAyQzQ2M0EsIDB4NDAyRjZBN0EsIDB4NDAzMTQ3NUMsIDB4NDAzMkQ5N0MsCisweDQwMzQ2QjlDLCAweDQwMzVGREJCLCAweDQwMzc4RkRCLCAweDQwMzkyMUZCLCAweDQwM0FCNDFCLCAweDQwM0M0NjNBLAorMHg0MDNERDg1QSwgMHg0MDNGNkE3QSwgMHg0MDQwN0U0QywgMHg0MDQxNDc1QywgMHg0MDQyMTA2QywgMHg0MDQyRDk3QywKKzB4NDA0M0EyOEMsIDB4NDA0NDZCOUMsIDB4NDA0NTM0QUMsIDB4NDA0NUZEQkIsIDB4NDA0NkM2Q0IsIDB4NDA0NzhGREIsCisweDQwNDg1OEVCLCAweDQwNDkyMUZCLAorfTsKKworLyoKKyAqIGludnBpbzI6ICA1MyBiaXRzIG9mIDIvcGkKKyAqIHBpbzJfMTogICBmaXJzdCAgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfMXQ6ICBwaS8yIC0gcGlvMl8xCisgKiBwaW8yXzI6ICAgc2Vjb25kIDMzIGJpdCBvZiBwaS8yCisgKiBwaW8yXzJ0OiAgcGkvMiAtIChwaW8yXzErcGlvMl8yKQorICogcGlvMl8zOiAgIHRoaXJkICAzMyBiaXQgb2YgcGkvMgorICogcGlvMl8zdDogIHBpLzIgLSAocGlvMl8xK3BpbzJfMitwaW8yXzMpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQoremVybyA9ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworaGFsZiA9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvMjQgPSAgMS42Nzc3MjE2MDAwMDAwMDAwMDAwMGUrMDcsIC8qIDB4NDE3MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2ludnBpbzIgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KK3BpbzJfMSAgPSAgMS41NzA3OTYzMjY3MzQxMjU2MTQxN2UrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0MDAwMDAgKi8KK3BpbzJfMXQgPSAgNi4wNzcxMDA1MDY1MDYxOTIyNDkzMmUtMTEsIC8qIDB4M0REMEI0NjEsIDB4MUE2MjYzMzEgKi8KK3BpbzJfMiAgPSAgNi4wNzcxMDA1MDYzMDM5NjU5NzY2MGUtMTEsIC8qIDB4M0REMEI0NjEsIDB4MUE2MDAwMDAgKi8KK3BpbzJfMnQgPSAgMi4wMjIyNjYyNDg3OTU5NTA2MzE1NGUtMjEsIC8qIDB4M0JBMzE5OEEsIDB4MkUwMzcwNzMgKi8KK3BpbzJfMyAgPSAgMi4wMjIyNjYyNDg3MTExNjY0NTU4MGUtMjEsIC8qIDB4M0JBMzE5OEEsIDB4MkUwMDAwMDAgKi8KK3BpbzJfM3QgPSAgOC40Nzg0Mjc2NjAzNjg4OTk1Njk5N2UtMzI7IC8qIDB4Mzk3QjgzOUEsIDB4MjUyMDQ5QzEgKi8KKworCWludDMyX3QgX19pZWVlNzU0X3JlbV9waW8yKGRvdWJsZSB4LCBkb3VibGUgKnkpCit7CisJZG91YmxlIHosdyx0LHIsZm47CisJZG91YmxlIHR4WzNdOworCWludDMyX3QgZTAsaSxqLG54LG4saXgsaHg7CisJdV9pbnQzMl90IGxvdzsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CQkvKiBoaWdoIHdvcmQgb2YgeCAqLworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeDw9MHgzZmU5MjFmYikgICAvKiB8eHwgfjw9IHBpLzQgLCBubyBuZWVkIGZvciByZWR1Y3Rpb24gKi8KKwkgICAge3lbMF0gPSB4OyB5WzFdID0gMDsgcmV0dXJuIDA7fQorCWlmKGl4PDB4NDAwMmQ5N2MpIHsgIC8qIHx4fCA8IDNwaS80LCBzcGVjaWFsIGNhc2Ugd2l0aCBuPSstMSAqLworCSAgICBpZihoeD4wKSB7IAorCQl6ID0geCAtIHBpbzJfMTsKKwkJaWYoaXghPTB4M2ZmOTIxZmIpIHsgCS8qIDMzKzUzIGJpdCBwaSBpcyBnb29kIGVub3VnaCAqLworCQkgICAgeVswXSA9IHogLSBwaW8yXzF0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pLXBpbzJfMXQ7CisJCX0gZWxzZSB7CQkvKiBuZWFyIHBpLzIsIHVzZSAzMyszMys1MyBiaXQgcGkgKi8KKwkJICAgIHogLT0gcGlvMl8yOworCQkgICAgeVswXSA9IHogLSBwaW8yXzJ0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pLXBpbzJfMnQ7CisJCX0KKwkJcmV0dXJuIDE7CisJICAgIH0gZWxzZSB7CS8qIG5lZ2F0aXZlIHggKi8KKwkJeiA9IHggKyBwaW8yXzE7CisJCWlmKGl4IT0weDNmZjkyMWZiKSB7IAkvKiAzMys1MyBiaXQgcGkgaXMgZ29vZCBlbm91Z2ggKi8KKwkJICAgIHlbMF0gPSB6ICsgcGlvMl8xdDsKKwkJICAgIHlbMV0gPSAoei15WzBdKStwaW8yXzF0OworCQl9IGVsc2UgewkJLyogbmVhciBwaS8yLCB1c2UgMzMrMzMrNTMgYml0IHBpICovCisJCSAgICB6ICs9IHBpbzJfMjsKKwkJICAgIHlbMF0gPSB6ICsgcGlvMl8ydDsKKwkJICAgIHlbMV0gPSAoei15WzBdKStwaW8yXzJ0OworCQl9CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKwlpZihpeDw9MHg0MTM5MjFmYikgeyAvKiB8eHwgfjw9IDJeMTkqKHBpLzIpLCBtZWRpdW0gc2l6ZSAqLworCSAgICB0ICA9IGZhYnMoeCk7CisJICAgIG4gID0gKGludDMyX3QpICh0KmludnBpbzIraGFsZik7CisJICAgIGZuID0gKGRvdWJsZSluOworCSAgICByICA9IHQtZm4qcGlvMl8xOworCSAgICB3ICA9IGZuKnBpbzJfMXQ7CS8qIDFzdCByb3VuZCBnb29kIHRvIDg1IGJpdCAqLworCSAgICBpZihuPDMyJiZpeCE9bnBpbzJfaHdbbi0xXSkgewkKKwkJeVswXSA9IHItdzsJLyogcXVpY2sgY2hlY2sgbm8gY2FuY2VsbGF0aW9uICovCisJICAgIH0gZWxzZSB7CisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgICAgIGogID0gaXg+PjIwOworCSAgICAgICAgeVswXSA9IHItdzsgCisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5WzBdKTsKKwkgICAgICAgIGkgPSBqLSgoaGlnaD4+MjApJjB4N2ZmKTsKKwkgICAgICAgIGlmKGk+MTYpIHsgIC8qIDJuZCBpdGVyYXRpb24gbmVlZGVkLCBnb29kIHRvIDExOCAqLworCQkgICAgdCAgPSByOworCQkgICAgdyAgPSBmbipwaW8yXzI7CQorCQkgICAgciAgPSB0LXc7CisJCSAgICB3ICA9IGZuKnBpbzJfMnQtKCh0LXIpLXcpOwkKKwkJICAgIHlbMF0gPSByLXc7CisJCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gseVswXSk7CisJCSAgICBpID0gai0oKGhpZ2g+PjIwKSYweDdmZik7CisJCSAgICBpZihpPjQ5KSAgewkvKiAzcmQgaXRlcmF0aW9uIG5lZWQsIDE1MSBiaXRzIGFjYyAqLworCQkgICAgCXQgID0gcjsJLyogd2lsbCBjb3ZlciBhbGwgcG9zc2libGUgY2FzZXMgKi8KKwkJICAgIAl3ICA9IGZuKnBpbzJfMzsJCisJCSAgICAJciAgPSB0LXc7CisJCSAgICAJdyAgPSBmbipwaW8yXzN0LSgodC1yKS13KTsJCisJCSAgICAJeVswXSA9IHItdzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIHlbMV0gPSAoci15WzBdKS13OworCSAgICBpZihoeDwwKSAJe3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCSAgICBlbHNlCSByZXR1cm4gbjsKKwl9CisgICAgLyogCisgICAgICogYWxsIG90aGVyIChsYXJnZSkgYXJndW1lbnRzCisgICAgICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHsJCS8qIHggaXMgaW5mIG9yIE5hTiAqLworCSAgICB5WzBdPXlbMV09eC14OyByZXR1cm4gMDsKKwl9CisgICAgLyogc2V0IHogPSBzY2FsYm4ofHh8LGlsb2diKHgpLTIzKSAqLworCUdFVF9MT1dfV09SRChsb3cseCk7CisJU0VUX0xPV19XT1JEKHosbG93KTsKKwllMCAJPSAoaXg+PjIwKS0xMDQ2OwkvKiBlMCA9IGlsb2diKHopLTIzOyAqLworCVNFVF9ISUdIX1dPUkQoeiwgaXggLSAoKGludDMyX3QpKGUwPDwyMCkpKTsKKwlmb3IoaT0wO2k8MjtpKyspIHsKKwkJdHhbaV0gPSAoZG91YmxlKSgoaW50MzJfdCkoeikpOworCQl6ICAgICA9ICh6LXR4W2ldKSp0d28yNDsKKwl9CisJdHhbMl0gPSB6OworCW54ID0gMzsKKwl3aGlsZSh0eFtueC0xXT09emVybykgbngtLTsJLyogc2tpcCB6ZXJvIHRlcm0gKi8KKwluICA9ICBfX2tlcm5lbF9yZW1fcGlvMih0eCx5LGUwLG54LDIsdHdvX292ZXJfcGkpOworCWlmKGh4PDApIHt5WzBdID0gLXlbMF07IHlbMV0gPSAteVsxXTsgcmV0dXJuIC1uO30KKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcmVtX3BpbzJmLmMgYi9saWJtL3NyYy9lX3JlbV9waW8yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzFjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbV9waW8yZi5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIGVfcmVtX3BpbzJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3JlbV9waW8yLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogRGVidWdnZWQgYW5kIG9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3JlbV9waW8yZi5jLHYgMS4xOSAyMDA1LzExLzIzIDAzOjAzOjA5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3JlbV9waW8yZih4LHkpCisgKgorICogcmV0dXJuIHRoZSByZW1haW5kZXIgb2YgeCByZW0gcGkvMiBpbiB5WzBdK3lbMV0KKyAqIHVzZSBkb3VibGUgcHJlY2lzaW9uIGludGVybmFsbHkKKyAqIHVzZSBfX2tlcm5lbF9yZW1fcGlvMigpIGZvciBsYXJnZSB4CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyoKKyAqIFRhYmxlIG9mIGNvbnN0YW50cyBmb3IgMi9waSwgMzk2IEhleCBkaWdpdHMgKDQ3NiBkZWNpbWFsKSBvZiAyL3BpCisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IHR3b19vdmVyX3BpW10gPSB7CisweEEyRjk4MywgMHg2RTRFNDQsIDB4MTUyOUZDLCAweDI3NTdEMSwgMHhGNTM0REQsIDB4QzBEQjYyLCAKKzB4OTU5OTNDLCAweDQzOTA0MSwgMHhGRTUxNjMsIDB4QUJERUJCLCAweEM1NjFCNywgMHgyNDZFM0EsIAorMHg0MjRERDIsIDB4RTAwNjQ5LCAweDJFRUEwOSwgMHhEMTkyMUMsIDB4RkUxREVCLCAweDFDQjEyOSwgCisweEE3M0VFOCwgMHg4MjM1RjUsIDB4MkVCQjQ0LCAweDg0RTk5QywgMHg3MDI2QjQsIDB4NUY3RTQxLCAKKzB4Mzk5MUQ2LCAweDM5ODM1MywgMHgzOUY0OUMsIDB4ODQ1RjhCLCAweEJERjkyOCwgMHgzQjFGRjgsIAorMHg5N0ZGREUsIDB4MDU5ODBGLCAweEVGMkYxMSwgMHg4QjVBMEEsIDB4NkQxRjZELCAweDM2N0VDRiwgCisweDI3Q0IwOSwgMHhCNzRGNDYsIDB4M0Y2NjlFLCAweDVGRUEyRCwgMHg3NTI3QkEsIDB4QzdFQkU1LCAKKzB4RjE3QjNELCAweDA3MzlGNywgMHg4QTUyOTIsIDB4RUE2QkZCLCAweDVGQjExRiwgMHg4RDVEMDgsIAorMHg1NjAzMzAsIDB4NDZGQzdCLCAweDZCQUJGMCwgMHhDRkJDMjAsIDB4OUFGNDM2LCAweDFEQTlFMywgCisweDkxNjE1RSwgMHhFNjFCMDgsIDB4NjU5OTg1LCAweDVGMTRBMCwgMHg2ODQwOEQsIDB4RkZEODgwLCAKKzB4NEQ3MzI3LCAweDMxMDYwNiwgMHgxNTU2Q0EsIDB4NzNBOEM5LCAweDYwRTI3QiwgMHhDMDhDNkIsIAorfTsKKworLyoKKyAqIGludnBpbzI6ICA1MyBiaXRzIG9mIDIvcGkKKyAqIHBpbzJfMTogICBmaXJzdCAgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfMXQ6ICBwaS8yIC0gcGlvMl8xCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQoremVybyA9ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworaGFsZiA9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvMjQgPSAgMS42Nzc3MjE2MDAwMDAwMDAwMDAwMGUrMDcsIC8qIDB4NDE3MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2ludnBpbzIgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KK3BpbzJfMSAgPSAgMS41NzA3OTYzMjY3MzQxMjU2MTQxN2UrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0MDAwMDAgKi8KK3BpbzJfMXQgPSAgNi4wNzcxMDA1MDY1MDYxOTIyNDkzMmUtMTE7IC8qIDB4M0REMEI0NjEsIDB4MUE2MjYzMzEgKi8KKworCWludDMyX3QgX19pZWVlNzU0X3JlbV9waW8yZihmbG9hdCB4LCBmbG9hdCAqeSkKK3sKKwlkb3VibGUgdyx0LHIsZm47CisJZG91YmxlIHR4WzFdLHR5WzJdOworCWZsb2F0IHo7CisJaW50MzJfdCBlMCxuLGl4LGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworICAgIC8qIDMzKzUzIGJpdCBwaSBpcyBnb29kIGVub3VnaCBmb3IgbWVkaXVtIHNpemUgKi8KKwlpZihpeDw9MHg0OTQ5MGY4MCkgewkJLyogfHh8IH48PSAyXjE5KihwaS8yKSwgbWVkaXVtIHNpemUgKi8KKwkgICAgdCAgPSBmYWJzZih4KTsKKwkgICAgbiAgPSAoaW50MzJfdCkgKHQqaW52cGlvMitoYWxmKTsKKwkgICAgZm4gPSAoZG91YmxlKW47CisJICAgIHIgID0gdC1mbipwaW8yXzE7CisJICAgIHcgID0gZm4qcGlvMl8xdDsKKwkgICAgeVswXSA9IHItdzsKKwkgICAgeVsxXSA9IChyLXlbMF0pLXc7CisJICAgIGlmKGh4PDApIAl7eVswXSA9IC15WzBdOyB5WzFdID0gLXlbMV07IHJldHVybiAtbjt9CisJICAgIGVsc2UJIHJldHVybiBuOworCX0KKyAgICAvKgorICAgICAqIGFsbCBvdGhlciAobGFyZ2UpIGFyZ3VtZW50cworICAgICAqLworCWlmKGl4Pj0weDdmODAwMDAwKSB7CQkvKiB4IGlzIGluZiBvciBOYU4gKi8KKwkgICAgeVswXT15WzFdPXgteDsgcmV0dXJuIDA7CisJfQorICAgIC8qIHNldCB6ID0gc2NhbGJuKHx4fCxpbG9nYih8eHwpLTIzKSAqLworCWUwID0gKGl4Pj4yMyktMTUwOwkJLyogZTAgPSBpbG9nYih8eHwpLTIzOyAqLworCVNFVF9GTE9BVF9XT1JEKHosIGl4IC0gKChpbnQzMl90KShlMDw8MjMpKSk7CisJdHhbMF0gPSB6OworCW4gID0gIF9fa2VybmVsX3JlbV9waW8yKHR4LHR5LGUwLDEsMSx0d29fb3Zlcl9waSk7CisJeVswXSA9IHR5WzBdOworCXlbMV0gPSB0eVswXSAtIHlbMF07CisJaWYoaHg8MCkge3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1haW5kZXIuYyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MzJhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyLmMKQEAgLTAsMCArMSw3MyBAQAorCisvKiBAKCMpZV9yZW1haW5kZXIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1haW5kZXIuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9yZW1haW5kZXIoeCxwKQorICogUmV0dXJuIDogICAgICAgICAgICAgICAgICAKKyAqIAlyZXR1cm5zICB4IFJFTSBwICA9ICB4IC0gW3gvcF0qcCBhcyBpZiBpbiBpbmZpbml0ZSAKKyAqIAlwcmVjaXNlIGFyaXRobWV0aWMsIHdoZXJlIFt4L3BdIGlzIHRoZSAoaW5maW5pdGUgYml0KSAKKyAqCWludGVnZXIgbmVhcmVzdCB4L3AgKGluIGhhbGYgd2F5IGNhc2UgY2hvb3NlIHRoZSBldmVuIG9uZSkuCisgKiBNZXRob2QgOiAKKyAqCUJhc2VkIG9uIGZtb2QoKSByZXR1cm4geC1beC9wXWNob3BwZWQqcCBleGFjdGxwLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuMDsKKworCitkb3VibGUKK19faWVlZTc1NF9yZW1haW5kZXIoZG91YmxlIHgsIGRvdWJsZSBwKQoreworCWludDMyX3QgaHgsaHA7CisJdV9pbnQzMl90IHN4LGx4LGxwOworCWRvdWJsZSBwX2hhbGY7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHAsbHAscCk7CisJc3ggPSBoeCYweDgwMDAwMDAwOworCWhwICY9IDB4N2ZmZmZmZmY7CisJaHggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoKGhwfGxwKT09MCkgcmV0dXJuICh4KnApLyh4KnApOyAJLyogcCA9IDAgKi8KKwlpZigoaHg+PTB4N2ZmMDAwMDApfHwJCQkvKiB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHA+PTB4N2ZmMDAwMDApJiYJCQkvKiBwIGlzIE5hTiAqLworCSAgKCgoaHAtMHg3ZmYwMDAwMCl8bHApIT0wKSkpCisJICAgIHJldHVybiAoeCpwKS8oeCpwKTsKKworCisJaWYgKGhwPD0weDdmZGZmZmZmKSB4ID0gX19pZWVlNzU0X2Ztb2QoeCxwK3ApOwkvKiBub3cgeCA8IDJwICovCisJaWYgKCgoaHgtaHApfChseC1scCkpPT0wKSByZXR1cm4gemVybyp4OworCXggID0gZmFicyh4KTsKKwlwICA9IGZhYnMocCk7CisJaWYgKGhwPDB4MDAyMDAwMDApIHsKKwkgICAgaWYoeCt4PnApIHsKKwkJeC09cDsKKwkJaWYoeCt4Pj1wKSB4IC09IHA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwX2hhbGYgPSAwLjUqcDsKKwkgICAgaWYoeD5wX2hhbGYpIHsKKwkJeC09cDsKKwkJaWYoeD49cF9oYWxmKSB4IC09IHA7CisJICAgIH0KKwl9CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlTRVRfSElHSF9XT1JEKHgsaHhec3gpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1haW5kZXJmLmMgYi9saWJtL3NyYy9lX3JlbWFpbmRlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ1MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9yZW1haW5kZXJmLmMKQEAgLTAsMCArMSw2NSBAQAorLyogZV9yZW1haW5kZXJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3JlbWFpbmRlci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1haW5kZXJmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvID0gMC4wOworCisKK2Zsb2F0CitfX2llZWU3NTRfcmVtYWluZGVyZihmbG9hdCB4LCBmbG9hdCBwKQoreworCWludDMyX3QgaHgsaHA7CisJdV9pbnQzMl90IHN4OworCWZsb2F0IHBfaGFsZjsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCUdFVF9GTE9BVF9XT1JEKGhwLHApOworCXN4ID0gaHgmMHg4MDAwMDAwMDsKKwlocCAmPSAweDdmZmZmZmZmOworCWh4ICY9IDB4N2ZmZmZmZmY7CisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGhwPT0wKSByZXR1cm4gKHgqcCkvKHgqcCk7CSAJLyogcCA9IDAgKi8KKwlpZigoaHg+PTB4N2Y4MDAwMDApfHwJCQkvKiB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHA+MHg3ZjgwMDAwMCkpKQkJCS8qIHAgaXMgTmFOICovCisJICAgIHJldHVybiAoeCpwKS8oeCpwKTsKKworCisJaWYgKGhwPD0weDdlZmZmZmZmKSB4ID0gX19pZWVlNzU0X2Ztb2RmKHgscCtwKTsJLyogbm93IHggPCAycCAqLworCWlmICgoaHgtaHApPT0wKSByZXR1cm4gemVybyp4OworCXggID0gZmFic2YoeCk7CisJcCAgPSBmYWJzZihwKTsKKwlpZiAoaHA8MHgwMTAwMDAwMCkgeworCSAgICBpZih4K3g+cCkgeworCQl4LT1wOworCQlpZih4K3g+PXApIHggLT0gcDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHBfaGFsZiA9IChmbG9hdCkwLjUqcDsKKwkgICAgaWYoeD5wX2hhbGYpIHsKKwkJeC09cDsKKwkJaWYoeD49cF9oYWxmKSB4IC09IHA7CisJICAgIH0KKwl9CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeCxoeF5zeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NjYWxiLmMgYi9saWJtL3NyYy9lX3NjYWxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxNjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc2NhbGIuYwpAQCAtMCwwICsxLDQ4IEBACisKKy8qIEAoIyllX3NjYWxiLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2NhbGIuYyx2IDEuMTIgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBfX2llZWU3NTRfc2NhbGIoeCwgZm4pIGlzIHByb3ZpZGUgZm9yCisgKiBwYXNzaW5nIHZhcmlvdXMgc3RhbmRhcmQgdGVzdCBzdWl0ZS4gT25lIAorICogc2hvdWxkIHVzZSBzY2FsYm4oKSBpbnN0ZWFkLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZmRlZiBfU0NBTEJfSU5UCitkb3VibGUKK19faWVlZTc1NF9zY2FsYihkb3VibGUgeCwgaW50IGZuKQorI2Vsc2UKK2RvdWJsZQorX19pZWVlNzU0X3NjYWxiKGRvdWJsZSB4LCBkb3VibGUgZm4pCisjZW5kaWYKK3sKKyNpZmRlZiBfU0NBTEJfSU5UCisJcmV0dXJuIHNjYWxibih4LGZuKTsKKyNlbHNlCisJaWYgKGlzbmFuKHgpfHxpc25hbihmbikpIHJldHVybiB4KmZuOworCWlmICghZmluaXRlKGZuKSkgeworCSAgICBpZihmbj4wLjApIHJldHVybiB4KmZuOworCSAgICBlbHNlICAgICAgIHJldHVybiB4LygtZm4pOworCX0KKwlpZiAocmludChmbikhPWZuKSByZXR1cm4gKGZuLWZuKS8oZm4tZm4pOworCWlmICggZm4gPiA2NTAwMC4wKSByZXR1cm4gc2NhbGJuKHgsIDY1MDAwKTsKKwlpZiAoLWZuID4gNjUwMDAuMCkgcmV0dXJuIHNjYWxibih4LC02NTAwMCk7CisJcmV0dXJuIHNjYWxibih4LChpbnQpZm4pOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NjYWxiZi5jIGIvbGlibS9zcmMvZV9zY2FsYmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FjMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zY2FsYmYuYwpAQCAtMCwwICsxLDQ2IEBACisvKiBlX3NjYWxiZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9zY2FsYi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zY2FsYmYuYyx2IDEuMTAgMjAwNS8xMi8wNiAyMDoxMjozOCBvYnJpZW4gRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZmRlZiBfU0NBTEJfSU5UCitmbG9hdAorX19pZWVlNzU0X3NjYWxiZihmbG9hdCB4LCBpbnQgZm4pCisjZWxzZQorZmxvYXQKK19faWVlZTc1NF9zY2FsYmYoZmxvYXQgeCwgZmxvYXQgZm4pCisjZW5kaWYKK3sKKyNpZmRlZiBfU0NBTEJfSU5UCisJcmV0dXJuIHNjYWxibmYoeCxmbik7CisjZWxzZQorCWlmICgoaXNuYW5mKSh4KXx8KGlzbmFuZikoZm4pKSByZXR1cm4geCpmbjsKKwlpZiAoIWZpbml0ZWYoZm4pKSB7CisJICAgIGlmKGZuPihmbG9hdCkwLjApIHJldHVybiB4KmZuOworCSAgICBlbHNlICAgICAgIHJldHVybiB4LygtZm4pOworCX0KKwlpZiAocmludGYoZm4pIT1mbikgcmV0dXJuIChmbi1mbikvKGZuLWZuKTsKKwlpZiAoIGZuID4gKGZsb2F0KTY1MDAwLjApIHJldHVybiBzY2FsYm5mKHgsIDY1MDAwKTsKKwlpZiAoLWZuID4gKGZsb2F0KTY1MDAwLjApIHJldHVybiBzY2FsYm5mKHgsLTY1MDAwKTsKKwlyZXR1cm4gc2NhbGJuZih4LChpbnQpZm4pOworI2VuZGlmCit9CisKK19fd2Vha19yZWZlcmVuY2Uoc2NhbGJmLCBsZGV4cGYpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zaW5oLmMgYi9saWJtL3NyYy9lX3NpbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg0YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zaW5oLmMKQEAgLTAsMCArMSw3OSBAQAorCisvKiBAKCMpZV9zaW5oLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2luaC5jLHYgMS45IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfc2luaCh4KQorICogTWV0aG9kIDogCisgKiBtYXRoZW1hdGljYWxseSBzaW5oKHgpIGlmIGRlZmluZWQgdG8gYmUgKGV4cCh4KS1leHAoLXgpKS8yCisgKgkxLiBSZXBsYWNlIHggYnkgfHh8IChzaW5oKC14KSA9IC1zaW5oKHgpKS4gCisgKgkyLiAKKyAqCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFICsgRS8oRSsxKQorICoJICAgIDAgICAgICAgIDw9IHggPD0gMjIgICAgIDogIHNpbmgoeCkgOj0gLS0tLS0tLS0tLS0tLS0sIEU9ZXhwbTEoeCkKKyAqCQkJICAgICAgIAkJCSAgICAgICAgMgorICoKKyAqCSAgICAyMiAgICAgICA8PSB4IDw9IGxub3ZmdCA6ICBzaW5oKHgpIDo9IGV4cCh4KS8yIAorICoJICAgIGxub3ZmdCAgIDw9IHggPD0gbG4yb3ZmdDogIHNpbmgoeCkgOj0gZXhwKHgvMikvMiAqIGV4cCh4LzIpCisgKgkgICAgbG4yb3ZmdCAgPCAgeAkgICAgOiAgc2luaCh4KSA6PSB4KnNodWdlIChvdmVyZmxvdykKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJc2luaCh4KSBpcyB8eHwgaWYgeCBpcyArSU5GLCAtSU5GLCBvciBOYU4uCisgKglvbmx5IHNpbmgoMCk9MCBpcyBleGFjdCBmb3IgZmluaXRlIHguCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmUgPSAxLjAsIHNodWdlID0gMS4wZTMwNzsKKworZG91YmxlCitfX2llZWU3NTRfc2luaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx3LGg7CisJaW50MzJfdCBpeCxqeDsKKwl1X2ludDMyX3QgbHg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CQorCisJaCA9IDAuNTsKKwlpZiAoang8MCkgaCA9IC1oOworICAgIC8qIHx4fCBpbiBbMCwyMl0sIHJldHVybiBzaWduKHgpKjAuNSooRStFLyhFKzEpKSkgKi8KKwlpZiAoaXggPCAweDQwMzYwMDAwKSB7CQkvKiB8eHw8MjIgKi8KKwkgICAgaWYgKGl4PDB4M2UzMDAwMDApIAkJLyogfHh8PDIqKi0yOCAqLworCQlpZihzaHVnZSt4Pm9uZSkgcmV0dXJuIHg7Lyogc2luaCh0aW55KSA9IHRpbnkgd2l0aCBpbmV4YWN0ICovCisJICAgIHQgPSBleHBtMShmYWJzKHgpKTsKKwkgICAgaWYoaXg8MHgzZmYwMDAwMCkgcmV0dXJuIGgqKDIuMCp0LXQqdC8odCtvbmUpKTsKKwkgICAgcmV0dXJuIGgqKHQrdC8odCtvbmUpKTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzIyLCBsb2cobWF4ZG91YmxlKV0gcmV0dXJuIDAuNSpleHAofHh8KSAqLworCWlmIChpeCA8IDB4NDA4NjJFNDIpICByZXR1cm4gaCpfX2llZWU3NTRfZXhwKGZhYnMoeCkpOworCisgICAgLyogfHh8IGluIFtsb2cobWF4ZG91YmxlKSwgb3ZlcmZsb3d0aHJlc29sZF0gKi8KKwlHRVRfTE9XX1dPUkQobHgseCk7CisJaWYgKGl4PDB4NDA4NjMzQ0UgfHwgKChpeD09MHg0MDg2MzNjZSkmJihseDw9KHVfaW50MzJfdCkweDhmYjlmODdkKSkpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHAoMC41KmZhYnMoeCkpOworCSAgICB0ID0gaCp3OworCSAgICByZXR1cm4gdCp3OworCX0KKworICAgIC8qIHx4fCA+IG92ZXJmbG93dGhyZXNvbGQsIHNpbmgoeCkgb3ZlcmZsb3cgKi8KKwlyZXR1cm4geCpzaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc2luaGYuYyBiL2xpYm0vc3JjL2Vfc2luaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU3NTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zaW5oZi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGVfc2luaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfc2luaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zaW5oZi5jLHYgMS44IDIwMDUvMTEvMTMgMDA6NDE6NDYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBzaHVnZSA9IDEuMGUzNzsKKworZmxvYXQKK19faWVlZTc1NF9zaW5oZihmbG9hdCB4KQoreworCWZsb2F0IHQsdyxoOworCWludDMyX3QgaXgsang7CisKKwlHRVRfRkxPQVRfV09SRChqeCx4KTsKKwlpeCA9IGp4JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKworCWggPSAwLjU7CisJaWYgKGp4PDApIGggPSAtaDsKKyAgICAvKiB8eHwgaW4gWzAsOV0sIHJldHVybiBzaWduKHgpKjAuNSooRStFLyhFKzEpKSkgKi8KKwlpZiAoaXggPCAweDQxMTAwMDAwKSB7CQkvKiB8eHw8OSAqLworCSAgICBpZiAoaXg8MHgzOTgwMDAwMCkgCQkvKiB8eHw8MioqLTEyICovCisJCWlmKHNodWdlK3g+b25lKSByZXR1cm4geDsvKiBzaW5oKHRpbnkpID0gdGlueSB3aXRoIGluZXhhY3QgKi8KKwkgICAgdCA9IGV4cG0xZihmYWJzZih4KSk7CisJICAgIGlmKGl4PDB4M2Y4MDAwMDApIHJldHVybiBoKigoZmxvYXQpMi4wKnQtdCp0Lyh0K29uZSkpOworCSAgICByZXR1cm4gaCoodCt0Lyh0K29uZSkpOworCX0KKworICAgIC8qIHx4fCBpbiBbOSwgbG9nZihtYXhmbG9hdCldIHJldHVybiAwLjUqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQyYjE3MjE3KSAgcmV0dXJuIGgqX19pZWVlNzU0X2V4cGYoZmFic2YoeCkpOworCisgICAgLyogfHh8IGluIFtsb2dmKG1heGZsb2F0KSwgb3ZlcmZsb3d0aHJlc29sZF0gKi8KKwlpZiAoaXg8PTB4NDJiMmQ0ZmMpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHBmKChmbG9hdCkwLjUqZmFic2YoeCkpOworCSAgICB0ID0gaCp3OworCSAgICByZXR1cm4gdCp3OworCX0KKworICAgIC8qIHx4fCA+IG92ZXJmbG93dGhyZXNvbGQsIHNpbmgoeCkgb3ZlcmZsb3cgKi8KKwlyZXR1cm4geCpzaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc3FydC5jIGIvbGlibS9zcmMvZV9zcXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1Y2IxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc3FydC5jCkBAIC0wLDAgKzEsNDQ2IEBACisKKy8qIEAoIyllX3NxcnQuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zcXJ0LmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfc3FydCh4KQorICogUmV0dXJuIGNvcnJlY3RseSByb3VuZGVkIHNxcnQuCisgKiAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgIHwgIFVzZSB0aGUgaGFyZHdhcmUgc3FydCBpZiB5b3UgaGF2ZSBvbmUgfAorICogICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWV0aG9kOiAKKyAqICAgQml0IGJ5IGJpdCBtZXRob2QgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljLiAoU2xvdywgYnV0IHBvcnRhYmxlKSAKKyAqICAgMS4gTm9ybWFsaXphdGlvbgorICoJU2NhbGUgeCB0byB5IGluIFsxLDQpIHdpdGggZXZlbiBwb3dlcnMgb2YgMjogCisgKglmaW5kIGFuIGludGVnZXIgayBzdWNoIHRoYXQgIDEgPD0gKHk9eCoyXigyaykpIDwgNCwgdGhlbgorICoJCXNxcnQoeCkgPSAyXmsgKiBzcXJ0KHkpCisgKiAgIDIuIEJpdCBieSBiaXQgY29tcHV0YXRpb24KKyAqCUxldCBxICA9IHNxcnQoeSkgdHJ1bmNhdGVkIHRvIGkgYml0IGFmdGVyIGJpbmFyeSBwb2ludCAocSA9IDEpLAorICoJICAgICBpCQkJCQkJCSAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEgICAgICAgICAyCisgKgkgICAgcyAgPSAyKnEgLCBhbmQJeSAgPSAgMiAgICogKCB5IC0gcSAgKS4JCSgxKQorICoJICAgICBpICAgICAgaSAgICAgICAgICAgIGkgICAgICAgICAgICAgICAgIGkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCVRvIGNvbXB1dGUgcSAgICBmcm9tIHEgLCBvbmUgY2hlY2tzIHdoZXRoZXIgCisgKgkJICAgIGkrMSAgICAgICBpICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKgkJCSAgICAgIC0oaSsxKSAyCisgKgkJCShxICsgMiAgICAgICkgPD0geS4JCQkoMikKKyAqICAgICAJCQkgIGkKKyAqCQkJCQkJCSAgICAgIC0oaSsxKQorICoJSWYgKDIpIGlzIGZhbHNlLCB0aGVuIHEgICA9IHEgOyBvdGhlcndpc2UgcSAgID0gcSAgKyAyICAgICAgLgorICoJCSAJICAgICAgIGkrMSAgIGkgICAgICAgICAgICAgaSsxICAgaQorICoKKyAqCVdpdGggc29tZSBhbGdlYnJpYyBtYW5pcHVsYXRpb24sIGl0IGlzIG5vdCBkaWZmaWN1bHQgdG8gc2VlCisgKgl0aGF0ICgyKSBpcyBlcXVpdmFsZW50IHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaSsxKQorICoJCQlzICArICAyICAgICAgIDw9IHkJCQkoMykKKyAqCQkJIGkgICAgICAgICAgICAgICAgaQorICoKKyAqCVRoZSBhZHZhbnRhZ2Ugb2YgKDMpIGlzIHRoYXQgcyAgYW5kIHkgIGNhbiBiZSBjb21wdXRlZCBieSAKKyAqCQkJCSAgICAgIGkgICAgICBpCisgKgl0aGUgZm9sbG93aW5nIHJlY3VycmVuY2UgZm9ybXVsYToKKyAqCSAgICBpZiAoMykgaXMgZmFsc2UKKyAqCisgKgkgICAgcyAgICAgPSAgcyAgLAl5ICAgID0geSAgIDsJCQkoNCkKKyAqCSAgICAgaSsxICAgICAgaQkJIGkrMSAgICBpCisgKgorICoJICAgIG90aGVyd2lzZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC1pICAgICAgICAgICAgICAgICAgICAgLShpKzEpCisgKgkgICAgcwkgID0gIHMgICsgMiAgLCAgeSAgICA9IHkgIC0gIHMgIC0gMiAgCQkoNSkKKyAqICAgICAgICAgICBpKzEgICAgICBpICAgICAgICAgIGkrMSAgICBpICAgICBpCisgKgkJCQkKKyAqCU9uZSBtYXkgZWFzaWx5IHVzZSBpbmR1Y3Rpb24gdG8gcHJvdmUgKDQpIGFuZCAoNSkuIAorICoJTm90ZS4gU2luY2UgdGhlIGxlZnQgaGFuZCBzaWRlIG9mICgzKSBjb250YWluIG9ubHkgaSsyIGJpdHMsCisgKgkgICAgICBpdCBkb2VzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYSBmdWxsICg1My1iaXQpIGNvbXBhcmlzb24gCisgKgkgICAgICBpbiAoMykuCisgKiAgIDMuIEZpbmFsIHJvdW5kaW5nCisgKglBZnRlciBnZW5lcmF0aW5nIHRoZSA1MyBiaXRzIHJlc3VsdCwgd2UgY29tcHV0ZSBvbmUgbW9yZSBiaXQuCisgKglUb2dldGhlciB3aXRoIHRoZSByZW1haW5kZXIsIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0aGUKKyAqCXJlc3VsdCBpcyBleGFjdCwgYmlnZ2VyIHRoYW4gMS8ydWxwLCBvciBsZXNzIHRoYW4gMS8ydWxwCisgKgkoaXQgd2lsbCBuZXZlciBlcXVhbCB0byAxLzJ1bHApLgorICoJVGhlIHJvdW5kaW5nIG1vZGUgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHdoZXRoZXIKKyAqCWh1Z2UgKyB0aW55IGlzIGVxdWFsIHRvIGh1Z2UsIGFuZCB3aGV0aGVyIGh1Z2UgLSB0aW55IGlzCisgKgllcXVhbCB0byBodWdlIGZvciBzb21lIGZsb2F0aW5nIHBvaW50IG51bWJlciAiaHVnZSIgYW5kICJ0aW55Ii4KKyAqCQkKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglzcXJ0KCstMCkgPSArLTAgCS4uLiBleGFjdAorICoJc3FydChpbmYpID0gaW5mCisgKglzcXJ0KC12ZSkgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsCisgKglzcXJ0KE5hTikgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsIGZvciBzaWduYWxpbmcgTmFOCisgKgorICogT3RoZXIgbWV0aG9kcyA6IHNlZSB0aGUgYXBwZW5kZWQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGJlbG93LgorICotLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMJY29uc3QgZG91YmxlCW9uZQk9IDEuMCwgdGlueT0xLjBlLTMwMDsKKworZG91YmxlCitfX2llZWU3NTRfc3FydChkb3VibGUgeCkKK3sKKwlkb3VibGUgejsKKwlpbnQzMl90IHNpZ24gPSAoaW50KTB4ODAwMDAwMDA7CisJaW50MzJfdCBpeDAsczAscSxtLHQsaTsKKwl1X2ludDMyX3Qgcix0MSxzMSxpeDEscTE7CisKKwlFWFRSQUNUX1dPUkRTKGl4MCxpeDEseCk7CisKKyAgICAvKiB0YWtlIGNhcmUgb2YgSW5mIGFuZCBOYU4gKi8KKwlpZigoaXgwJjB4N2ZmMDAwMDApPT0weDdmZjAwMDAwKSB7CQkJCisJICAgIHJldHVybiB4KngreDsJCS8qIHNxcnQoTmFOKT1OYU4sIHNxcnQoK2luZik9K2luZgorCQkJCQkgICBzcXJ0KC1pbmYpPXNOYU4gKi8KKwl9IAorICAgIC8qIHRha2UgY2FyZSBvZiB6ZXJvICovCisJaWYoaXgwPD0wKSB7CisJICAgIGlmKCgoaXgwJih+c2lnbikpfGl4MSk9PTApIHJldHVybiB4Oy8qIHNxcnQoKy0wKSA9ICstMCAqLworCSAgICBlbHNlIGlmKGl4MDwwKQorCQlyZXR1cm4gKHgteCkvKHgteCk7CQkvKiBzcXJ0KC12ZSkgPSBzTmFOICovCisJfQorICAgIC8qIG5vcm1hbGl6ZSB4ICovCisJbSA9IChpeDA+PjIwKTsKKwlpZihtPT0wKSB7CQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIHdoaWxlKGl4MD09MCkgeworCQltIC09IDIxOworCQlpeDAgfD0gKGl4MT4+MTEpOyBpeDEgPDw9IDIxOworCSAgICB9CisJICAgIGZvcihpPTA7KGl4MCYweDAwMTAwMDAwKT09MDtpKyspIGl4MDw8PTE7CisJICAgIG0gLT0gaS0xOworCSAgICBpeDAgfD0gKGl4MT4+KDMyLWkpKTsKKwkgICAgaXgxIDw8PSBpOworCX0KKwltIC09IDEwMjM7CS8qIHVuYmlhcyBleHBvbmVudCAqLworCWl4MCA9IChpeDAmMHgwMDBmZmZmZil8MHgwMDEwMDAwMDsKKwlpZihtJjEpewkvKiBvZGQgbSwgZG91YmxlIHggdG8gbWFrZSBpdCBldmVuICovCisJICAgIGl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCSAgICBpeDEgKz0gaXgxOworCX0KKwltID4+PSAxOwkvKiBtID0gW20vMl0gKi8KKworICAgIC8qIGdlbmVyYXRlIHNxcnQoeCkgYml0IGJ5IGJpdCAqLworCWl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCWl4MSArPSBpeDE7CisJcSA9IHExID0gczAgPSBzMSA9IDA7CS8qIFtxLHExXSA9IHNxcnQoeCkgKi8KKwlyID0gMHgwMDIwMDAwMDsJCS8qIHIgPSBtb3ZpbmcgYml0IGZyb20gcmlnaHQgdG8gbGVmdCAqLworCisJd2hpbGUociE9MCkgeworCSAgICB0ID0gczArcjsgCisJICAgIGlmKHQ8PWl4MCkgeyAKKwkJczAgICA9IHQrcjsgCisJCWl4MCAtPSB0OyAKKwkJcSAgICs9IHI7IAorCSAgICB9IAorCSAgICBpeDAgKz0gaXgwICsgKChpeDEmc2lnbik+PjMxKTsKKwkgICAgaXgxICs9IGl4MTsKKwkgICAgcj4+PTE7CisJfQorCisJciA9IHNpZ247CisJd2hpbGUociE9MCkgeworCSAgICB0MSA9IHMxK3I7IAorCSAgICB0ICA9IHMwOworCSAgICBpZigodDxpeDApfHwoKHQ9PWl4MCkmJih0MTw9aXgxKSkpIHsgCisJCXMxICA9IHQxK3I7CisJCWlmKCgodDEmc2lnbik9PXNpZ24pJiYoczEmc2lnbik9PTApIHMwICs9IDE7CisJCWl4MCAtPSB0OworCQlpZiAoaXgxIDwgdDEpIGl4MCAtPSAxOworCQlpeDEgLT0gdDE7CisJCXExICArPSByOworCSAgICB9CisJICAgIGl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCSAgICBpeDEgKz0gaXgxOworCSAgICByPj49MTsKKwl9CisKKyAgICAvKiB1c2UgZmxvYXRpbmcgYWRkIHRvIGZpbmQgb3V0IHJvdW5kaW5nIGRpcmVjdGlvbiAqLworCWlmKChpeDB8aXgxKSE9MCkgeworCSAgICB6ID0gb25lLXRpbnk7IC8qIHRyaWdnZXIgaW5leGFjdCBmbGFnICovCisJICAgIGlmICh6Pj1vbmUpIHsKKwkgICAgICAgIHogPSBvbmUrdGlueTsKKwkgICAgICAgIGlmIChxMT09KHVfaW50MzJfdCkweGZmZmZmZmZmKSB7IHExPTA7IHEgKz0gMTt9CisJCWVsc2UgaWYgKHo+b25lKSB7CisJCSAgICBpZiAocTE9PSh1X2ludDMyX3QpMHhmZmZmZmZmZSkgcSs9MTsKKwkJICAgIHExKz0yOyAKKwkJfSBlbHNlCisJICAgICAgICAgICAgcTEgKz0gKHExJjEpOworCSAgICB9CisJfQorCWl4MCA9IChxPj4xKSsweDNmZTAwMDAwOworCWl4MSA9ICBxMT4+MTsKKwlpZiAoKHEmMSk9PTEpIGl4MSB8PSBzaWduOworCWl4MCArPSAobSA8PDIwKTsKKwlJTlNFUlRfV09SRFMoeixpeDAsaXgxKTsKKwlyZXR1cm4gejsKK30KKworLyoKK090aGVyIG1ldGhvZHMgICh1c2UgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYykKKy0tLS0tLS0tLS0tLS0KKyhUaGlzIGlzIGEgY29weSBvZiBhIGRyYWZ0ZWQgcGFwZXIgYnkgUHJvZiBXLiBLYWhhbiAKK2FuZCBLLkMuIE5nLCB3cml0dGVuIGluIE1heSwgMTk4NikKKworCVR3byBhbGdvcml0aG1zIGFyZSBnaXZlbiBoZXJlIHRvIGltcGxlbWVudCBzcXJ0KHgpIAorCShJRUVFIGRvdWJsZSBwcmVjaXNpb24gYXJpdGhtZXRpYykgaW4gc29mdHdhcmUuCisJQm90aCBzdXBwbHkgc3FydCh4KSBjb3JyZWN0bHkgcm91bmRlZC4gVGhlIGZpcnN0IGFsZ29yaXRobSAoaW4KKwlTZWN0aW9uIEEpIHVzZXMgbmV3dG9uIGl0ZXJhdGlvbnMgYW5kIGludm9sdmVzIGZvdXIgZGl2aXNpb25zLgorCVRoZSBzZWNvbmQgb25lIHVzZXMgcmVjaXByb290IGl0ZXJhdGlvbnMgdG8gYXZvaWQgZGl2aXNpb24sIGJ1dAorCXJlcXVpcmVzIG1vcmUgbXVsdGlwbGljYXRpb25zLiBCb3RoIGFsZ29yaXRobXMgbmVlZCB0aGUgYWJpbGl0eQorCXRvIGNob3AgcmVzdWx0cyBvZiBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW5zdGVhZCBvZiByb3VuZCB0aGVtLCAKKwlhbmQgdGhlIElORVhBQ1QgZmxhZyB0byBpbmRpY2F0ZSB3aGVuIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uCisJaXMgZXhlY3V0ZWQgZXhhY3RseSB3aXRoIG5vIHJvdW5kb2ZmIGVycm9yLCBhbGwgcGFydCBvZiB0aGUgCisJc3RhbmRhcmQgKElFRUUgNzU0LTE5ODUpLiBUaGUgYWJpbGl0eSB0byBwZXJmb3JtIHNoaWZ0LCBhZGQsCisJc3VidHJhY3QgYW5kIGxvZ2ljYWwgQU5EIG9wZXJhdGlvbnMgdXBvbiAzMi1iaXQgd29yZHMgaXMgbmVlZGVkCisJdG9vLCB0aG91Z2ggbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgorCitBLiAgc3FydCh4KSBieSBOZXd0b24gSXRlcmF0aW9uCisKKyAgICgxKQlJbml0aWFsIGFwcHJveGltYXRpb24KKworCUxldCB4MCBhbmQgeDEgYmUgdGhlIGxlYWRpbmcgYW5kIHRoZSB0cmFpbGluZyAzMi1iaXQgd29yZHMgb2YKKwlhIGZsb2F0aW5nIHBvaW50IG51bWJlciB4IChpbiBJRUVFIGRvdWJsZSBmb3JtYXQpIHJlc3BlY3RpdmVseSAKKworCSAgICAxICAgIDExCQkgICAgIDUyCQkJCSAgLi4ud2lkdGhzCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJeDogfHN8CSAgZSAgICAgfAkgICAgICBmCQkJCXwKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgICBtc2IgICAgbHNiICBtc2IJCQkJICAgICAgbHNiIC4uLm9yZGVyCisKKyAKKwkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJeDA6ICB8c3wgICBlICAgIHwgICAgZjEgICAgIHwJIHgxOiB8ICAgICAgICAgIGYyICAgICAgICAgICB8CisJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQnkgcGVyZm9ybWluZyBzaGlmdHMgYW5kIHN1YnRyYWN0cyBvbiB4MCBhbmQgeDEgKGJvdGggcmVnYXJkZWQKKwlhcyBpbnRlZ2VycyksIHdlIG9idGFpbiBhbiA4LWJpdCBhcHByb3hpbWF0aW9uIG9mIHNxcnQoeCkgYXMKKwlmb2xsb3dzLgorCisJCWsgIDo9ICh4MD4+MSkgKyAweDFmZjgwMDAwOworCQl5MCA6PSBrIC0gVDFbMzEmKGs+PjE1KV0uCS4uLiB5IH4gc3FydCh4KSB0byA4IGJpdHMKKwlIZXJlIGsgaXMgYSAzMi1iaXQgaW50ZWdlciBhbmQgVDFbXSBpcyBhbiBpbnRlZ2VyIGFycmF5IGNvbnRhaW5pbmcKKwljb3JyZWN0aW9uIHRlcm1zLiBOb3cgbWFnaWNhbGx5IHRoZSBmbG9hdGluZyB2YWx1ZSBvZiB5ICh5J3MKKwlsZWFkaW5nIDMyLWJpdCB3b3JkIGlzIHkwLCB0aGUgdmFsdWUgb2YgaXRzIHRyYWlsaW5nIHdvcmQgaXMgMCkKKwlhcHByb3hpbWF0ZXMgc3FydCh4KSB0byBhbG1vc3QgOC1iaXQuCisKKwlWYWx1ZSBvZiBUMToKKwlzdGF0aWMgaW50IFQxWzMyXT0geworCTAsCTEwMjQsCTMwNjIsCTU3NDYsCTkxOTMsCTEzMzQ4LAkxODE2MiwJMjM1OTIsCisJMjk1OTgsCTM2MTQ1LAk0MzIwMiwJNTA3NDAsCTU4NzMzLAk2NzE1OCwJNzU5OTIsCTg1MjE1LAorCTgzNTk5LAk3MTM3OCwJNjA0MjgsCTUwNjQ3LAk0MTk0NSwJMzQyNDYsCTI3NDc4LAkyMTU4MSwKKwkxNjQ5OSwJMTIxODMsCTg1ODgsCTU2NzQsCTM0MDMsCTE3NDIsCTY2MSwJMTMwLH07CisKKyAgICAoMikJSXRlcmF0aXZlIHJlZmluZW1lbnQKKworCUFwcGx5IEhlcm9uJ3MgcnVsZSB0aHJlZSB0aW1lcyB0byB5LCB3ZSBoYXZlIHkgYXBwcm94aW1hdGVzIAorCXNxcnQoeCkgdG8gd2l0aGluIDEgdWxwIChVbml0IGluIHRoZSBMYXN0IFBsYWNlKToKKworCQl5IDo9ICh5K3gveSkvMgkJLi4uIGFsbW9zdCAxNyBzaWcuIGJpdHMKKwkJeSA6PSAoeSt4L3kpLzIJCS4uLiBhbG1vc3QgMzUgc2lnLiBiaXRzCisJCXkgOj0geS0oeS14L3kpLzIJLi4uIHdpdGhpbiAxIHVscAorCisKKwlSZW1hcmsgMS4KKwkgICAgQW5vdGhlciB3YXkgdG8gaW1wcm92ZSB5IHRvIHdpdGhpbiAxIHVscCBpczoKKworCQl5IDo9ICh5K3gveSkJCS4uLiBhbG1vc3QgMTcgc2lnLiBiaXRzIHRvIDIqc3FydCh4KQorCQl5IDo9IHkgLSAweDAwMTAwMDA2CS4uLiBhbG1vc3QgMTggc2lnLiBiaXRzIHRvIHNxcnQoeCkKKworCQkJCTIKKwkJCSAgICAoeC15ICkqeQorCQl5IDo9IHkgKyAyKiAtLS0tLS0tLS0tCS4uLndpdGhpbiAxIHVscAorCQkJICAgICAgIDIKKwkJCSAgICAgM3kgICsgeAorCisKKwlUaGlzIGZvcm11bGEgaGFzIG9uZSBkaXZpc2lvbiBmZXdlciB0aGFuIHRoZSBvbmUgYWJvdmU7IGhvd2V2ZXIsCisJaXQgcmVxdWlyZXMgbW9yZSBtdWx0aXBsaWNhdGlvbnMgYW5kIGFkZGl0aW9ucy4gQWxzbyB4IG11c3QgYmUKKwlzY2FsZWQgaW4gYWR2YW5jZSB0byBhdm9pZCBzcHVyaW91cyBvdmVyZmxvdyBpbiBldmFsdWF0aW5nIHRoZQorCWV4cHJlc3Npb24gM3kqeSt4LiBIZW5jZSBpdCBpcyBub3QgcmVjb21tZW5kZWQgdWxlc3MgZGl2aXNpb24KKwlpcyBzbG93LiBJZiBkaXZpc2lvbiBpcyB2ZXJ5IHNsb3csIHRoZW4gb25lIHNob3VsZCB1c2UgdGhlIAorCXJlY2lwcm9vdCBhbGdvcml0aG0gZ2l2ZW4gaW4gc2VjdGlvbiBCLgorCisgICAgKDMpIEZpbmFsIGFkanVzdG1lbnQKKworCUJ5IHR3aWRkbGluZyB5J3MgbGFzdCBiaXQgaXQgaXMgcG9zc2libGUgdG8gZm9yY2UgeSB0byBiZSAKKwljb3JyZWN0bHkgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZQorCWFzIGZvbGxvd3MuIExldCByIGFuZCBpIGJlIGNvcGllcyBvZiB0aGUgcm91bmRpbmcgbW9kZSBhbmQKKwlpbmV4YWN0IGZsYWcgYmVmb3JlIGVudGVyaW5nIHRoZSBzcXVhcmUgcm9vdCBwcm9ncmFtLiBBbHNvIHdlCisJdXNlIHRoZSBleHByZXNzaW9uIHkrLXVscCBmb3IgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdGluZworCW51bWJlcnMgKHVwIGFuZCBkb3duKSBvZiB5LiBOb3RlIHRoYXQgeSstdWxwID0gZWl0aGVyIGZpeGVkCisJcG9pbnQgeSstMSwgb3IgbXVsdGlwbHkgeSBieSBuZXh0YWZ0ZXIoMSwrLWluZikgaW4gY2hvcHBlZAorCW1vZGUuCisKKwkJSSA6PSBGQUxTRTsJLi4uIHJlc2V0IElORVhBQ1QgZmxhZyBJCisJCVIgOj0gUlo7CS4uLiBzZXQgcm91bmRpbmcgbW9kZSB0byByb3VuZC10b3dhcmQtemVybworCQl6IDo9IHgveTsJLi4uIGNob3BwZWQgcXVvdGllbnQsIHBvc3NpYmx5IGluZXhhY3QKKwkJSWYobm90IEkpIHRoZW4gewkuLi4gaWYgdGhlIHF1b3RpZW50IGlzIGV4YWN0CisJCSAgICBpZih6PXkpIHsKKwkJICAgICAgICBJIDo9IGk7CSAuLi4gcmVzdG9yZSBpbmV4YWN0IGZsYWcKKwkJICAgICAgICBSIDo9IHI7ICAuLi4gcmVzdG9yZSByb3VuZGVkIG1vZGUKKwkJICAgICAgICByZXR1cm4gc3FydCh4KTo9eS4KKwkJICAgIH0gZWxzZSB7CisJCQl6IDo9IHogLSB1bHA7CS4uLiBzcGVjaWFsIHJvdW5kaW5nCisJCSAgICB9CisJCX0KKwkJaSA6PSBUUlVFOwkJLi4uIHNxcnQoeCkgaXMgaW5leGFjdAorCQlJZiAocj1STikgdGhlbiB6PXordWxwCS4uLiByb3VuZGVkLXRvLW5lYXJlc3QKKwkJSWYgKHI9UlApIHRoZW4gewkuLi4gcm91bmQtdG93YXJkLStpbmYKKwkJICAgIHkgPSB5K3VscDsgej16K3VscDsKKwkJfQorCQl5IDo9IHkrejsJCS4uLiBjaG9wcGVkIHN1bQorCQl5MDo9eTAtMHgwMDEwMDAwMDsJLi4uIHkgOj0geS8yIGlzIGNvcnJlY3RseSByb3VuZGVkLgorCSAgICAgICAgSSA6PSBpOwkgCQkuLi4gcmVzdG9yZSBpbmV4YWN0IGZsYWcKKwkgICAgICAgIFIgOj0gcjsgIAkJLi4uIHJlc3RvcmUgcm91bmRlZCBtb2RlCisJICAgICAgICByZXR1cm4gc3FydCh4KTo9eS4KKwkJICAgIAorICAgICg0KQlTcGVjaWFsIGNhc2VzCisKKwlTcXVhcmUgcm9vdCBvZiAraW5mLCArLTAsIG9yIE5hTiBpcyBpdHNlbGY7CisJU3F1YXJlIHJvb3Qgb2YgYSBuZWdhdGl2ZSBudW1iZXIgaXMgTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisKKworQi4gIHNxcnQoeCkgYnkgUmVjaXByb290IEl0ZXJhdGlvbgorCisgICAoMSkJSW5pdGlhbCBhcHByb3hpbWF0aW9uCisKKwlMZXQgeDAgYW5kIHgxIGJlIHRoZSBsZWFkaW5nIGFuZCB0aGUgdHJhaWxpbmcgMzItYml0IHdvcmRzIG9mCisJYSBmbG9hdGluZyBwb2ludCBudW1iZXIgeCAoaW4gSUVFRSBkb3VibGUgZm9ybWF0KSByZXNwZWN0aXZlbHkKKwkoc2VlIHNlY3Rpb24gQSkuIEJ5IHBlcmZvcm1pbmcgc2hpZnMgYW5kIHN1YnRyYWN0cyBvbiB4MCBhbmQgeTAsCisJd2Ugb2J0YWluIGEgNy44LWJpdCBhcHByb3hpbWF0aW9uIG9mIDEvc3FydCh4KSBhcyBmb2xsb3dzLgorCisJICAgIGsgOj0gMHg1ZmU4MDAwMCAtICh4MD4+MSk7CisJICAgIHkwOj0gayAtIFQyWzYzJihrPj4xNCldLgkuLi4geSB+IDEvc3FydCh4KSB0byA3LjggYml0cworCisJSGVyZSBrIGlzIGEgMzItYml0IGludGVnZXIgYW5kIFQyW10gaXMgYW4gaW50ZWdlciBhcnJheSAKKwljb250YWluaW5nIGNvcnJlY3Rpb24gdGVybXMuIE5vdyBtYWdpY2FsbHkgdGhlIGZsb2F0aW5nCisJdmFsdWUgb2YgeSAoeSdzIGxlYWRpbmcgMzItYml0IHdvcmQgaXMgeTAsIHRoZSB2YWx1ZSBvZgorCWl0cyB0cmFpbGluZyB3b3JkIHkxIGlzIHNldCB0byB6ZXJvKSBhcHByb3hpbWF0ZXMgMS9zcXJ0KHgpCisJdG8gYWxtb3N0IDcuOC1iaXQuCisKKwlWYWx1ZSBvZiBUMjoKKwlzdGF0aWMgaW50IFQyWzY0XT0geworCTB4MTUwMCwJMHgyZWY4LAkweDRkNjcsCTB4NmIwMiwJMHg4N2JlLAkweGEzOTUsCTB4YmU3YSwJMHhkODY2LAorCTB4ZjE0YSwJMHgxMDkxYiwweDExZmNkLDB4MTM1NTIsMHgxNDk5OSwweDE1Yzk4LDB4MTZlMzQsMHgxN2U1ZiwKKwkweDE4ZDAzLDB4MTlhMDEsMHgxYTU0NSwweDFhZThhLDB4MWI1YzQsMHgxYmIwMSwweDFiZmRlLDB4MWMyOGQsCisJMHgxYzJkZSwweDFjMGRiLDB4MWJhNzMsMHgxYjExYywweDFhNGI1LDB4MTk1M2QsMHgxODI2NiwweDE2YmUwLAorCTB4MTY4M2UsMHgxNzlkOCwweDE4YTRkLDB4MTk5OTIsMHgxYTc4OSwweDFiNDQ1LDB4MWJmNjEsMHgxYzk4OSwKKwkweDFkMTZkLDB4MWQ3N2IsMHgxZGRkZiwweDFlMmFkLDB4MWU1YmYsMHgxZTZlOCwweDFlNjU0LDB4MWUzY2QsCisJMHgxZGYyYSwweDFkNjM1LDB4MWNiMTYsMHgxYmUyYywweDFhZTRlLDB4MTliZGUsMHgxODY4ZSwweDE2ZTJlLAorCTB4MTUyN2YsMHgxMzM0YSwweDExMDUxLDB4ZTk1MSwJMHhiZTAxLAkweDhlMGQsCTB4NTkyNCwJMHgxZWRkLH07CisKKyAgICAoMikJSXRlcmF0aXZlIHJlZmluZW1lbnQKKworCUFwcGx5IFJlY2lwcm9vdCBpdGVyYXRpb24gdGhyZWUgdGltZXMgdG8geSBhbmQgbXVsdGlwbHkgdGhlCisJcmVzdWx0IGJ5IHggdG8gZ2V0IGFuIGFwcHJveGltYXRpb24geiB0aGF0IG1hdGNoZXMgc3FydCh4KQorCXRvIGFib3V0IDEgdWxwLiBUbyBiZSBleGFjdCwgd2Ugd2lsbCBoYXZlIAorCQktMXVscCA8IHNxcnQoeCktejwxLjA2MjV1bHAuCisJCisJLi4uIHNldCByb3VuZGluZyBtb2RlIHRvIFJvdW5kLXRvLW5lYXJlc3QKKwkgICB5IDo9IHkqKDEuNS0wLjUqeCp5KnkpCS4uLiBhbG1vc3QgMTUgc2lnLiBiaXRzIHRvIDEvc3FydCh4KQorCSAgIHkgOj0geSooKDEuNS0yXi0zMCkrMC41KngqeSp5KS4uLiBhYm91dCAyOSBzaWcuIGJpdHMgdG8gMS9zcXJ0KHgpCisJLi4uIHNwZWNpYWwgYXJyYW5nZW1lbnQgZm9yIGJldHRlciBhY2N1cmFjeQorCSAgIHogOj0geCp5CQkJLi4uIDI5IGJpdHMgdG8gc3FydCh4KSwgd2l0aCB6Knk8MQorCSAgIHogOj0geiArIDAuNSp6KigxLXoqeSkJLi4uIGFib3V0IDEgdWxwIHRvIHNxcnQoeCkKKworCVJlbWFyayAyLiBUaGUgY29uc3RhbnQgMS41LTJeLTMwIGlzIGNob3NlbiB0byBiaWFzIHRoZSBlcnJvciBzbyB0aGF0CisJKGEpIHRoZSB0ZXJtIHoqeSBpbiB0aGUgZmluYWwgaXRlcmF0aW9uIGlzIGFsd2F5cyBsZXNzIHRoYW4gMTsgCisJKGIpIHRoZSBlcnJvciBpbiB0aGUgZmluYWwgcmVzdWx0IGlzIGJpYXNlZCB1cHdhcmQgc28gdGhhdAorCQktMSB1bHAgPCBzcXJ0KHgpIC0geiA8IDEuMDYyNSB1bHAKKwkgICAgaW5zdGVhZCBvZiB8c3FydCh4KS16fDwxLjAzMTI1dWxwLgorCisgICAgKDMpCUZpbmFsIGFkanVzdG1lbnQKKworCUJ5IHR3aWRkbGluZyB5J3MgbGFzdCBiaXQgaXQgaXMgcG9zc2libGUgdG8gZm9yY2UgeSB0byBiZSAKKwljb3JyZWN0bHkgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZQorCWFzIGZvbGxvd3MuIExldCByIGFuZCBpIGJlIGNvcGllcyBvZiB0aGUgcm91bmRpbmcgbW9kZSBhbmQKKwlpbmV4YWN0IGZsYWcgYmVmb3JlIGVudGVyaW5nIHRoZSBzcXVhcmUgcm9vdCBwcm9ncmFtLiBBbHNvIHdlCisJdXNlIHRoZSBleHByZXNzaW9uIHkrLXVscCBmb3IgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdGluZworCW51bWJlcnMgKHVwIGFuZCBkb3duKSBvZiB5LiBOb3RlIHRoYXQgeSstdWxwID0gZWl0aGVyIGZpeGVkCisJcG9pbnQgeSstMSwgb3IgbXVsdGlwbHkgeSBieSBuZXh0YWZ0ZXIoMSwrLWluZikgaW4gY2hvcHBlZAorCW1vZGUuCisKKwlSIDo9IFJaOwkJLi4uIHNldCByb3VuZGluZyBtb2RlIHRvIHJvdW5kLXRvd2FyZC16ZXJvCisJc3dpdGNoKHIpIHsKKwkgICAgY2FzZSBSTjoJCS4uLiByb3VuZC10by1uZWFyZXN0CisJICAgICAgIGlmKHg8PSB6Kih6LXVscCkuLi5jaG9wcGVkKSB6ID0geiAtIHVscDsgZWxzZQorCSAgICAgICBpZih4PD0geiooeit1bHApLi4uY2hvcHBlZCkgeiA9IHo7IGVsc2UgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBSWjpjYXNlIFJNOgkuLi4gcm91bmQtdG8temVybyBvciByb3VuZC10by0taW5mCisJICAgICAgIFI6PVJQOwkJLi4uIHJlc2V0IHJvdW5kaW5nIG1vZCB0byByb3VuZC10by0raW5mCisJICAgICAgIGlmKHg8eip6IC4uLiByb3VuZGVkIHVwKSB6ID0geiAtIHVscDsgZWxzZQorCSAgICAgICBpZih4Pj0oeit1bHApKih6K3VscCkgLi4ucm91bmRlZCB1cCkgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBSUDoJCS4uLiByb3VuZC10by0raW5mCisJICAgICAgIGlmKHg+KHordWxwKSooeit1bHApLi4uY2hvcHBlZCkgeiA9IHorMip1bHA7IGVsc2UKKwkgICAgICAgaWYoeD56KnogLi4uY2hvcHBlZCkgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwl9CisKKwlSZW1hcmsgMy4gVGhlIGFib3ZlIGNvbXBhcmlzb25zIGNhbiBiZSBkb25lIGluIGZpeGVkIHBvaW50LiBGb3IKKwlleGFtcGxlLCB0byBjb21wYXJlIHggYW5kIHc9eip6IGNob3BwZWQsIGl0IHN1ZmZpY2VzIHRvIGNvbXBhcmUKKwl4MSBhbmQgdzEgKHRoZSB0cmFpbGluZyBwYXJ0cyBvZiB4IGFuZCB3KSwgcmVnYXJkaW5nIHRoZW0gYXMKKwl0d28ncyBjb21wbGVtZW50IGludGVnZXJzLgorCisJLi4uSXMgeiBhbiBleGFjdCBzcXVhcmUgcm9vdD8KKwlUbyBkZXRlcm1pbmUgd2hldGhlciB6IGlzIGFuIGV4YWN0IHNxdWFyZSByb290IG9mIHgsIGxldCB6MSBiZSB0aGUKKwl0cmFpbGluZyBwYXJ0IG9mIHosIGFuZCBhbHNvIGxldCB4MCBhbmQgeDEgYmUgdGhlIGxlYWRpbmcgYW5kCisJdHJhaWxpbmcgcGFydHMgb2YgeC4KKworCUlmICgoejEmMHgwM2ZmZmZmZikhPTApCS4uLiBub3QgZXhhY3QgaWYgdHJhaWxpbmcgMjYgYml0cyBvZiB6IT0wCisJICAgIEkgOj0gMTsJCS4uLiBSYWlzZSBJbmV4YWN0IGZsYWc6IHogaXMgbm90IGV4YWN0CisJZWxzZSB7CisJICAgIGogOj0gMSAtIFsoeDA+PjIwKSYxXQkuLi4gaiA9IGxvZ2IoeCkgbW9kIDIKKwkgICAgayA6PSB6MSA+PiAyNjsJCS4uLiBnZXQgeidzIDI1LXRoIGFuZCAyNi10aCAKKwkJCQkJICAgIGZyYWN0aW9uIGJpdHMKKwkgICAgSSA6PSBpIG9yIChrJmopIG9yICgoayYoaitqKzEpKSE9KHgxJjMpKTsKKwl9CisJUjo9IHIJCS4uLiByZXN0b3JlIHJvdW5kZWQgbW9kZQorCXJldHVybiBzcXJ0KHgpOj16LgorCisJSWYgbXVsdGlwbGljYXRpb24gaXMgY2hlYXBlciB0aGVuIHRoZSBmb3JlZ29pbmcgcmVkIHRhcGUsIHRoZSAKKwlJbmV4YWN0IGZsYWcgY2FuIGJlIGV2YWx1YXRlZCBieQorCisJICAgIEkgOj0gaTsKKwkgICAgSSA6PSAoeip6IT14KSBvciBJLgorCisJTm90ZSB0aGF0IHoqeiBjYW4gb3ZlcndyaXRlIEk7IHRoaXMgdmFsdWUgbXVzdCBiZSBzZW5zZWQgaWYgaXQgaXMgCisJVHJ1ZS4KKworCVJlbWFyayA0LiBJZiB6KnogPSB4IGV4YWN0bHksIHRoZW4gYml0IDI1IHRvIGJpdCAwIG9mIHoxIG11c3QgYmUKKwl6ZXJvLgorCisJCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl6MTogfCAgICAgICAgZjIgICAgICAgIHwgCisJCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQliaXQgMzEJCSAgIGJpdCAwCisKKwlGdXJ0aGVyIG1vcmUsIGJpdCAyNyBhbmQgMjYgb2YgejEsIGJpdCAwIGFuZCAxIG9mIHgxLCBhbmQgdGhlIG9kZAorCW9yIGV2ZW4gb2YgbG9nYih4KSBoYXZlIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zOgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWJpdCAyNywyNiBvZiB6MQkJYml0IDEsMCBvZiB4MQlsb2diKHgpCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTAwCQkJMDAJCW9kZCBhbmQgZXZlbgorCTAxCQkJMDEJCWV2ZW4KKwkxMAkJCTEwCQlvZGQKKwkxMAkJCTAwCQlldmVuCisJMTEJCQkwMQkJZXZlbgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICg0KQlTcGVjaWFsIGNhc2VzIChzZWUgKDQpIG9mIFNlY3Rpb24gQSkuCQorIAorICovCisgCmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NxcnRmLmMgYi9saWJtL3NyYy9lX3NxcnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjOWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc3FydGYuYwpAQCAtMCwwICsxLDg5IEBACisvKiBlX3NxcnRmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3NxcnQuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc3FydGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljCWNvbnN0IGZsb2F0CW9uZQk9IDEuMCwgdGlueT0xLjBlLTMwOworCitmbG9hdAorX19pZWVlNzU0X3NxcnRmKGZsb2F0IHgpCit7CisJZmxvYXQgejsKKwlpbnQzMl90IHNpZ24gPSAoaW50KTB4ODAwMDAwMDA7CisJaW50MzJfdCBpeCxzLHEsbSx0LGk7CisJdV9pbnQzMl90IHI7CisKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKworICAgIC8qIHRha2UgY2FyZSBvZiBJbmYgYW5kIE5hTiAqLworCWlmKChpeCYweDdmODAwMDAwKT09MHg3ZjgwMDAwMCkgeworCSAgICByZXR1cm4geCp4K3g7CQkvKiBzcXJ0KE5hTik9TmFOLCBzcXJ0KCtpbmYpPStpbmYKKwkJCQkJICAgc3FydCgtaW5mKT1zTmFOICovCisJfQorICAgIC8qIHRha2UgY2FyZSBvZiB6ZXJvICovCisJaWYoaXg8PTApIHsKKwkgICAgaWYoKGl4Jih+c2lnbikpPT0wKSByZXR1cm4geDsvKiBzcXJ0KCstMCkgPSArLTAgKi8KKwkgICAgZWxzZSBpZihpeDwwKQorCQlyZXR1cm4gKHgteCkvKHgteCk7CQkvKiBzcXJ0KC12ZSkgPSBzTmFOICovCisJfQorICAgIC8qIG5vcm1hbGl6ZSB4ICovCisJbSA9IChpeD4+MjMpOworCWlmKG09PTApIHsJCQkJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yKGk9MDsoaXgmMHgwMDgwMDAwMCk9PTA7aSsrKSBpeDw8PTE7CisJICAgIG0gLT0gaS0xOworCX0KKwltIC09IDEyNzsJLyogdW5iaWFzIGV4cG9uZW50ICovCisJaXggPSAoaXgmMHgwMDdmZmZmZil8MHgwMDgwMDAwMDsKKwlpZihtJjEpCS8qIG9kZCBtLCBkb3VibGUgeCB0byBtYWtlIGl0IGV2ZW4gKi8KKwkgICAgaXggKz0gaXg7CisJbSA+Pj0gMTsJLyogbSA9IFttLzJdICovCisKKyAgICAvKiBnZW5lcmF0ZSBzcXJ0KHgpIGJpdCBieSBiaXQgKi8KKwlpeCArPSBpeDsKKwlxID0gcyA9IDA7CQkvKiBxID0gc3FydCh4KSAqLworCXIgPSAweDAxMDAwMDAwOwkJLyogciA9IG1vdmluZyBiaXQgZnJvbSByaWdodCB0byBsZWZ0ICovCisKKwl3aGlsZShyIT0wKSB7CisJICAgIHQgPSBzK3I7CisJICAgIGlmKHQ8PWl4KSB7CisJCXMgICAgPSB0K3I7CisJCWl4ICAtPSB0OworCQlxICAgKz0gcjsKKwkgICAgfQorCSAgICBpeCArPSBpeDsKKwkgICAgcj4+PTE7CisJfQorCisgICAgLyogdXNlIGZsb2F0aW5nIGFkZCB0byBmaW5kIG91dCByb3VuZGluZyBkaXJlY3Rpb24gKi8KKwlpZihpeCE9MCkgeworCSAgICB6ID0gb25lLXRpbnk7IC8qIHRyaWdnZXIgaW5leGFjdCBmbGFnICovCisJICAgIGlmICh6Pj1vbmUpIHsKKwkgICAgICAgIHogPSBvbmUrdGlueTsKKwkJaWYgKHo+b25lKQorCQkgICAgcSArPSAyOworCQllbHNlCisJCSAgICBxICs9IChxJjEpOworCSAgICB9CisJfQorCWl4ID0gKHE+PjEpKzB4M2YwMDAwMDA7CisJaXggKz0gKG0gPDwyMyk7CisJU0VUX0ZMT0FUX1dPUkQoeixpeCk7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9mcG1hdGguaCBiL2xpYm0vc3JjL2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWJkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9mcG1hdGguaApAQCAtMCwwICsxLDcyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9pbmNsdWRlL2ZwbWF0aC5oLHYgMS4zIDIwMDUvMDIvMDYgMDM6MjM6MzEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgIl9mcG1hdGguaCIKKwordW5pb24gSUVFRWYyYml0cyB7CisJZmxvYXQJZjsKKwlzdHJ1Y3QgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwkJdW5zaWduZWQgaW50CW1hbgk6MjM7CisJCXVuc2lnbmVkIGludAlleHAJOjg7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworI2Vsc2UgLyogX0JJR19FTkRJQU4gKi8KKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlleHAJOjg7CisJCXVuc2lnbmVkIGludAltYW4JOjIzOworI2VuZGlmCisJfSBiaXRzOworfTsKKworI2RlZmluZQlEQkxfTUFOSF9TSVpFCTIwCisjZGVmaW5lCURCTF9NQU5MX1NJWkUJMzIKKwordW5pb24gSUVFRWQyYml0cyB7CisJZG91YmxlCWQ7CisJc3RydWN0IHsKKy8qICNpZmRlZiBfX0FSTUVCX18gKi8KKyNpZiAoX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikgfHwgKGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19WRlBfRlBfXykpCisJCXVuc2lnbmVkIGludAltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTE7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisjZWxpZiAgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKyNlbmRpZgorCX0gYml0czsKK307CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX2Nvcy5jIGIvbGlibS9zcmMva19jb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkxNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19jb3MuYwpAQCAtMCwwICsxLDc5IEBACisKKy8qIEAoIylrX2Nvcy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX2Nvcy5jLHYgMS4xMCAyMDA1LzEwLzI2IDEyOjM2OjE4IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9fa2VybmVsX2NvcyggeCwgIHkgKQorICoga2VybmVsIGNvcyBmdW5jdGlvbiBvbiBbLXBpLzQsIHBpLzRdLCBwaS80IH4gMC43ODUzOTgxNjQKKyAqIElucHV0IHggaXMgYXNzdW1lZCB0byBiZSBib3VuZGVkIGJ5IH5waS80IGluIG1hZ25pdHVkZS4KKyAqIElucHV0IHkgaXMgdGhlIHRhaWwgb2YgeC4gCisgKgorICogQWxnb3JpdGhtCisgKgkxLiBTaW5jZSBjb3MoLXgpID0gY29zKHgpLCB3ZSBuZWVkIG9ubHkgdG8gY29uc2lkZXIgcG9zaXRpdmUgeC4KKyAqCTIuIGlmIHggPCAyXi0yNyAoaHg8MHgzZTQwMDAwMCAwKSwgcmV0dXJuIDEgd2l0aCBpbmV4YWN0IGlmIHghPTAuCisgKgkzLiBjb3MoeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTQgb24KKyAqCSAgIFswLHBpLzRdCisgKgkJICAJICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgMTQKKyAqCSAgIAljb3MoeCkgfiAxIC0geCp4LzIgKyBDMSp4ICsgLi4uICsgQzYqeAorICoJICAgd2hlcmUgdGhlIHJlbWV6IGVycm9yIGlzCisgKgkKKyAqIAl8ICAgICAgICAgICAgICAyICAgICA0ICAgICA2ICAgICA4ICAgICAxMCAgICAxMiAgICAgMTQgfCAgICAgLTU4CisgKiAJfGNvcyh4KS0oMS0uNSp4ICtDMSp4ICtDMip4ICtDMyp4ICtDNCp4ICtDNSp4ICArQzYqeCAgKXwgPD0gMgorICogCXwgICAgCQkJCQkgICAgICAgICAgICAgICB8IAorICogCisgKiAJICAgICAgICAgICAgICAgNCAgICAgNiAgICAgOCAgICAgMTAgICAgMTIgICAgIDE0IAorICoJNC4gbGV0IHIgPSBDMSp4ICtDMip4ICtDMyp4ICtDNCp4ICtDNSp4ICArQzYqeCAgLCB0aGVuCisgKgkgICAgICAgY29zKHgpIH4gMSAtIHgqeC8yICsgcgorICoJICAgc2luY2UgY29zKHgreSkgfiBjb3MoeCkgLSBzaW4oeCkqeSAKKyAqCQkJICB+IGNvcyh4KSAtIHgqeSwKKyAqCSAgIGEgY29ycmVjdGlvbiB0ZXJtIGlzIG5lY2Vzc2FyeSBpbiBjb3MoeCkgYW5kIGhlbmNlCisgKgkJY29zKHgreSkgPSAxIC0gKHgqeC8yIC0gKHIgLSB4KnkpKQorICoJICAgRm9yIGJldHRlciBhY2N1cmFjeSwgcmVhcnJhbmdlIHRvCisgKgkJY29zKHgreSkgfiB3ICsgKHRtcCArIChyLXgqeSkpCisgKgkgICB3aGVyZSB3ID0gMSAtIHgqeC8yIGFuZCB0bXAgaXMgYSB0aW55IGNvcnJlY3Rpb24gdGVybQorICoJICAgKDEgLSB4KngvMiA9PSB3ICsgdG1wIGV4YWN0bHkgaW4gaW5maW5pdGUgcHJlY2lzaW9uKS4KKyAqCSAgIFRoZSBleGFjdG5lc3Mgb2YgdyArIHRtcCBpbiBpbmZpbml0ZSBwcmVjaXNpb24gZGVwZW5kcyBvbiB3CisgKgkgICBhbmQgdG1wIGhhdmluZyB0aGUgc2FtZSBwcmVjaXNpb24gYXMgeC4gIElmIHRoZXkgaGF2ZSBleHRyYQorICoJICAgcHJlY2lzaW9uIGR1ZSB0byBjb21waWxlciBidWdzLCB0aGVuIHRoZSBleHRyYSBwcmVjaXNpb24gaXMKKyAqCSAgIG9ubHkgZ29vZCBwcm92aWRlZCBpdCBpcyByZXRhaW5lZCBpbiBhbGwgdGVybXMgb2YgdGhlIGZpbmFsCisgKgkgICBleHByZXNzaW9uIGZvciBjb3MoKS4gIFJldGVudGlvbiBoYXBwZW5zIGluIGFsbCBjYXNlcyB0ZXN0ZWQKKyAqCSAgIHVuZGVyIEZyZWVCU0QsIHNvIGRvbid0IHBlc3NpbWl6ZSB0aGluZ3MgYnkgZm9yY2libHkgY2xpcHBpbmcKKyAqCSAgIGFueSBleHRyYSBwcmVjaXNpb24gaW4gdy4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK0MxICA9ICA0LjE2NjY2NjY2NjY2NjY2MDE5MDM3ZS0wMiwgLyogMHgzRkE1NTU1NSwgMHg1NTU1NTU0QyAqLworQzIgID0gLTEuMzg4ODg4ODg4ODg3NDEwOTU3NDllLTAzLCAvKiAweEJGNTZDMTZDLCAweDE2QzE1MTc3ICovCitDMyAgPSAgMi40ODAxNTg3Mjg5NDc2NzI5NDE3OGUtMDUsIC8qIDB4M0VGQTAxQTAsIDB4MTlDQjE1OTAgKi8KK0M0ICA9IC0yLjc1NTczMTQzNTEzOTA2NjMzMDM1ZS0wNywgLyogMHhCRTkyN0U0RiwgMHg4MDlDNTJBRCAqLworQzUgID0gIDIuMDg3NTcyMzIxMjk4MTc0ODI3OTBlLTA5LCAvKiAweDNFMjFFRTlFLCAweEJEQjRCMUM0ICovCitDNiAgPSAtMS4xMzU5NjQ3NTU3Nzg4MTk0ODI2NWUtMTE7IC8qIDB4QkRBOEZBRTksIDB4QkU4ODM4RDQgKi8KKworZG91YmxlCitfX2tlcm5lbF9jb3MoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBoeix6LHIsdzsKKworCXogID0geCp4OworCXIgID0geiooQzEreiooQzIreiooQzMreiooQzQreiooQzUreipDNikpKSkpOworCWh6ID0gKGZsb2F0KTAuNSp6OworCXcgID0gb25lLWh6OworCXJldHVybiB3ICsgKCgob25lLXcpLWh6KSArICh6KnIteCp5KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX2Nvc2YuYyBiL2xpYm0vc3JjL2tfY29zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDhkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX2Nvc2YuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBrX2Nvc2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGtfY29zLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogRGVidWdnZWQgYW5kIG9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9DT1NERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfY29zZi5jLHYgMS4xNSAyMDA1LzExLzMwIDExOjUxOjE3IGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8Y29zKHgpIC0gYyh4KXwgPCAyKiotMzQuMSAoflstNS4zN2UtMTEsIDUuMjk1ZS0xMV0pLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMCwKK0MwICA9IC0weDFmZmZmZmZkMGM1ZTgxLjBwLTU0LAkvKiAtMC40OTk5OTk5OTcyNTEwMzEwMDMxMjAgKi8KK0MxICA9ICAweDE1NTU1M2UxMDUzYTQyLjBwLTU3LAkvKiAgMC4wNDE2NjY2MjMzMjM3MzkwNjMxODk0ICovCitDMiAgPSAtMHgxNmMwODdlODBmMWUyNy4wcC02MiwJLyogLTAuMDAxMzg4Njc2Mzc3NDYwOTkyOTQ2OTIgKi8KK0MzICA9ICAweDE5OTM0MmUwZWU1MDY5LjBwLTY4OwkvKiAgMC4wMDAwMjQzOTA0NDg3OTYyNzc0MDkwNjU0ICovCisKKyNpZmRlZiBJTkxJTkVfS0VSTkVMX0NPU0RGCitleHRlcm4gaW5saW5lCisjZW5kaWYKK2Zsb2F0CitfX2tlcm5lbF9jb3NkZihkb3VibGUgeCkKK3sKKwlkb3VibGUgciwgdywgejsKKworCS8qIFRyeSB0byBvcHRpbWl6ZSBmb3IgcGFyYWxsZWwgZXZhbHVhdGlvbiBhcyBpbiBrX3RhbmYuYy4gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisJciA9IEMyK3oqQzM7CisJcmV0dXJuICgob25lK3oqQzApICsgdypDMSkgKyAodyp6KSpyOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19yZW1fcGlvMi5jIGIvbGlibS9zcmMva19yZW1fcGlvMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3JlbV9waW8yLmMKQEAgLTAsMCArMSwzMDQgQEAKKworLyogQCgjKWtfcmVtX3BpbzIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19yZW1fcGlvMi5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19rZXJuZWxfcmVtX3BpbzIoeCx5LGUwLG54LHByZWMsaXBpbzIpCisgKiBkb3VibGUgeFtdLHlbXTsgaW50IGUwLG54LHByZWM7IGludCBpcGlvMltdOworICogCisgKiBfX2tlcm5lbF9yZW1fcGlvMiByZXR1cm4gdGhlIGxhc3QgdGhyZWUgZGlnaXRzIG9mIE4gd2l0aCAKKyAqCQl5ID0geCAtIE4qcGkvMgorICogc28gdGhhdCB8eXwgPCBwaS8yLgorICoKKyAqIFRoZSBtZXRob2QgaXMgdG8gY29tcHV0ZSB0aGUgaW50ZWdlciAobW9kIDgpIGFuZCBmcmFjdGlvbiBwYXJ0cyBvZiAKKyAqICgyL3BpKSp4IHdpdGhvdXQgZG9pbmcgdGhlIGZ1bGwgbXVsdGlwbGljYXRpb24uIEluIGdlbmVyYWwgd2UKKyAqIHNraXAgdGhlIHBhcnQgb2YgdGhlIHByb2R1Y3QgdGhhdCBhcmUga25vd24gdG8gYmUgYSBodWdlIGludGVnZXIgKAorICogbW9yZSBhY2N1cmF0ZWx5LCA9IDAgbW9kIDggKS4gVGh1cyB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgYXJlCisgKiBpbmRlcGVuZGVudCBvZiB0aGUgZXhwb25lbnQgb2YgdGhlIGlucHV0LgorICoKKyAqICgyL3BpKSBpcyByZXByZXNlbnRlZCBieSBhbiBhcnJheSBvZiAyNC1iaXQgaW50ZWdlcnMgaW4gaXBpbzJbXS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogCXhbXQlUaGUgaW5wdXQgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUpIGlzIGJyb2tlbiBpbnRvIG54IAorICoJCXBpZWNlcyBvZiAyNC1iaXQgaW50ZWdlcnMgaW4gZG91YmxlIHByZWNpc2lvbiBmb3JtYXQuCisgKgkJeFtpXSB3aWxsIGJlIHRoZSBpLXRoIDI0IGJpdCBvZiB4LiBUaGUgc2NhbGVkIGV4cG9uZW50IAorICoJCW9mIHhbMF0gaXMgZ2l2ZW4gaW4gaW5wdXQgcGFyYW1ldGVyIGUwIChpLmUuLCB4WzBdKjJeZTAgCisgKgkJbWF0Y2ggeCdzIHVwIHRvIDI0IGJpdHMuCisgKgorICoJCUV4YW1wbGUgb2YgYnJlYWtpbmcgYSBkb3VibGUgcG9zaXRpdmUgeiBpbnRvIHhbMF0reFsxXSt4WzJdOgorICoJCQllMCA9IGlsb2diKHopLTIzCisgKgkJCXogID0gc2NhbGJuKHosLWUwKQorICoJCWZvciBpID0gMCwxLDIKKyAqCQkJeFtpXSA9IGZsb29yKHopCisgKgkJCXogICAgPSAoei14W2ldKSoyKioyNAorICoKKyAqCisgKgl5W10Jb3VwdXQgcmVzdWx0IGluIGFuIGFycmF5IG9mIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVycy4KKyAqCQlUaGUgZGltZW5zaW9uIG9mIHlbXSBpczoKKyAqCQkJMjQtYml0ICBwcmVjaXNpb24JMQorICoJCQk1My1iaXQgIHByZWNpc2lvbgkyCisgKgkJCTY0LWJpdCAgcHJlY2lzaW9uCTIKKyAqCQkJMTEzLWJpdCBwcmVjaXNpb24JMworICoJCVRoZSBhY3R1YWwgdmFsdWUgaXMgdGhlIHN1bSBvZiB0aGVtLiBUaHVzIGZvciAxMTMtYml0CisgKgkJcHJlY2lzb24sIG9uZSBtYXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZToKKyAqCisgKgkJbG9uZyBkb3VibGUgdCx3LHJfaGVhZCwgcl90YWlsOworICoJCXQgPSAobG9uZyBkb3VibGUpeVsyXSArIChsb25nIGRvdWJsZSl5WzFdOworICoJCXcgPSAobG9uZyBkb3VibGUpeVswXTsKKyAqCQlyX2hlYWQgPSB0K3c7CisgKgkJcl90YWlsID0gdyAtIChyX2hlYWQgLSB0KTsKKyAqCisgKgllMAlUaGUgZXhwb25lbnQgb2YgeFswXQorICoKKyAqCW54CWRpbWVuc2lvbiBvZiB4W10KKyAqCisgKiAgCXByZWMJYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBwcmVjaXNpb246CisgKgkJCTAJMjQgIGJpdHMgKHNpbmdsZSkKKyAqCQkJMQk1MyAgYml0cyAoZG91YmxlKQorICoJCQkyCTY0ICBiaXRzIChleHRlbmRlZCkKKyAqCQkJMwkxMTMgYml0cyAocXVhZCkKKyAqCisgKglpcGlvMltdCisgKgkJaW50ZWdlciBhcnJheSwgY29udGFpbnMgdGhlICgyNCppKS10aCB0byAoMjQqaSsyMyktdGggCisgKgkJYml0IG9mIDIvcGkgYWZ0ZXIgYmluYXJ5IHBvaW50LiBUaGUgY29ycmVzcG9uZGluZyAKKyAqCQlmbG9hdGluZyB2YWx1ZSBpcworICoKKyAqCQkJaXBpbzJbaV0gKiAyXigtMjQoaSsxKSkuCisgKgorICogRXh0ZXJuYWwgZnVuY3Rpb246CisgKglkb3VibGUgc2NhbGJuKCksIGZsb29yKCk7CisgKgorICoKKyAqIEhlcmUgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHNvbWUgbG9jYWwgdmFyaWFibGVzOgorICoKKyAqIAlqawlqaysxIGlzIHRoZSBpbml0aWFsIG51bWJlciBvZiB0ZXJtcyBvZiBpcGlvMltdIG5lZWRlZAorICoJCWluIHRoZSBjb21wdXRhdGlvbi4gVGhlIHJlY29tbWVuZGVkIHZhbHVlIGlzIDIsMyw0LAorICoJCTYgZm9yIHNpbmdsZSwgZG91YmxlLCBleHRlbmRlZCxhbmQgcXVhZC4KKyAqCisgKiAJanoJbG9jYWwgaW50ZWdlciB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgCisgKgkJdGVybXMgb2YgaXBpbzJbXSB1c2VkLiAKKyAqCisgKglqeAlueCAtIDEKKyAqCisgKglqdglpbmRleCBmb3IgcG9pbnRpbmcgdG8gdGhlIHN1aXRhYmxlIGlwaW8yW10gZm9yIHRoZQorICoJCWNvbXB1dGF0aW9uLiBJbiBnZW5lcmFsLCB3ZSB3YW50CisgKgkJCSggMl5lMCp4WzBdICogaXBpbzJbanYtMV0qMl4oLTI0anYpICkvOAorICoJCWlzIGFuIGludGVnZXIuIFRodXMKKyAqCQkJZTAtMy0yNCpqdiA+PSAwIG9yIChlMC0zKS8yNCA+PSBqdgorICoJCUhlbmNlIGp2ID0gbWF4KDAsKGUwLTMpLzI0KS4KKyAqCisgKglqcAlqcCsxIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgaW4gUElvMltdIG5lZWRlZCwganAgPSBqay4KKyAqCisgKiAJcVtdCWRvdWJsZSBhcnJheSB3aXRoIGludGVncmFsIHZhbHVlLCByZXByZXNlbnRpbmcgdGhlCisgKgkJMjQtYml0cyBjaHVuayBvZiB0aGUgcHJvZHVjdCBvZiB4IGFuZCAyL3BpLgorICoKKyAqCXEwCXRoZSBjb3JyZXNwb25kaW5nIGV4cG9uZW50IG9mIHFbMF0uIE5vdGUgdGhhdCB0aGUKKyAqCQlleHBvbmVudCBmb3IgcVtpXSB3b3VsZCBiZSBxMC0yNCppLgorICoKKyAqCVBJbzJbXQlkb3VibGUgcHJlY2lzaW9uIGFycmF5LCBvYnRhaW5lZCBieSBjdXR0aW5nIHBpLzIKKyAqCQlpbnRvIDI0IGJpdHMgY2h1bmtzLiAKKyAqCisgKglmW10JaXBpbzJbXSBpbiBmbG9hdGluZyBwb2ludCAKKyAqCisgKglpcVtdCWludGVnZXIgYXJyYXkgYnkgYnJlYWtpbmcgdXAgcVtdIGluIDI0LWJpdHMgY2h1bmsuCisgKgorICoJZnFbXQlmaW5hbCBwcm9kdWN0IG9mIHgqKDIvcGkpIGluIGZxWzBdLC4uLGZxW2prXQorICoKKyAqCWloCWludGVnZXIuIElmID4wIGl0IGluZGljYXRlcyBxW10gaXMgPj0gMC41LCBoZW5jZQorICoJCWl0IGFsc28gaW5kaWNhdGVzIHRoZSAqc2lnbiogb2YgdGhlIHJlc3VsdC4KKyAqCisgKi8KKworCisvKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgaW50IGluaXRfamtbXSA9IHsyLDMsNCw2fTsgLyogaW5pdGlhbCB2YWx1ZSBmb3IgamsgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBQSW8yW10gPSB7CisgIDEuNTcwNzk2MjUxMjk2OTk3MDcwMzFlKzAwLCAvKiAweDNGRjkyMUZCLCAweDQwMDAwMDAwICovCisgIDcuNTQ5Nzg5NDE1ODYxNTk2MzUzMzVlLTA4LCAvKiAweDNFNzQ0NDJELCAweDAwMDAwMDAwICovCisgIDUuMzkwMzAyNTI5OTU3NzY0NzY1NTRlLTE1LCAvKiAweDNDRjg0Njk4LCAweDgwMDAwMDAwICovCisgIDMuMjgyMDAzNDE1ODA3OTEyOTQxMjNlLTIyLCAvKiAweDNCNzhDQzUxLCAweDYwMDAwMDAwICovCisgIDEuMjcwNjU1NzUzMDgwNjc2MDczNDllLTI5LCAvKiAweDM5RjAxQjgzLCAweDgwMDAwMDAwICovCisgIDEuMjI5MzMzMDg5ODExMTEzMjg5MzJlLTM2LCAvKiAweDM4N0EyNTIwLCAweDQwMDAwMDAwICovCisgIDIuNzMzNzAwNTM4MTY0NjQ1NTk2MjRlLTQ0LCAvKiAweDM2RTM4MjIyLCAweDgwMDAwMDAwICovCisgIDIuMTY3NDE2ODM4Nzc4MDQ4MTk0NDRlLTUxLCAvKiAweDM1NjlGMzFELCAweDAwMDAwMDAwICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlCQkJCit6ZXJvICAgPSAwLjAsCitvbmUgICAgPSAxLjAsCit0d28yNCAgID0gIDEuNjc3NzIxNjAwMDAwMDAwMDAwMDBlKzA3LCAvKiAweDQxNzAwMDAwLCAweDAwMDAwMDAwICovCit0d29uMjQgID0gIDUuOTYwNDY0NDc3NTM5MDYyNTAwMDBlLTA4OyAvKiAweDNFNzAwMDAwLCAweDAwMDAwMDAwICovCisKKwlpbnQgX19rZXJuZWxfcmVtX3BpbzIoZG91YmxlICp4LCBkb3VibGUgKnksIGludCBlMCwgaW50IG54LCBpbnQgcHJlYywgY29uc3QgaW50MzJfdCAqaXBpbzIpCit7CisJaW50MzJfdCBqeixqeCxqdixqcCxqayxjYXJyeSxuLGlxWzIwXSxpLGosayxtLHEwLGloOworCWRvdWJsZSB6LGZ3LGZbMjBdLGZxWzIwXSxxWzIwXTsKKworICAgIC8qIGluaXRpYWxpemUgamsqLworCWprID0gaW5pdF9qa1twcmVjXTsKKwlqcCA9IGprOworCisgICAgLyogZGV0ZXJtaW5lIGp4LGp2LHEwLCBub3RlIHRoYXQgMz5xMCAqLworCWp4ID0gIG54LTE7CisJanYgPSAoZTAtMykvMjQ7IGlmKGp2PDApIGp2PTA7CisJcTAgPSAgZTAtMjQqKGp2KzEpOworCisgICAgLyogc2V0IHVwIGZbMF0gdG8gZltqeCtqa10gd2hlcmUgZltqeCtqa10gPSBpcGlvMltqditqa10gKi8KKwlqID0ganYtang7IG0gPSBqeCtqazsKKwlmb3IoaT0wO2k8PW07aSsrLGorKykgZltpXSA9IChqPDApPyB6ZXJvIDogKGRvdWJsZSkgaXBpbzJbal07CisKKyAgICAvKiBjb21wdXRlIHFbMF0scVsxXSwuLi5xW2prXSAqLworCWZvciAoaT0wO2k8PWprO2krKykgeworCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOyBxW2ldID0gZnc7CisJfQorCisJanogPSBqazsKK3JlY29tcHV0ZToKKyAgICAvKiBkaXN0aWxsIHFbXSBpbnRvIGlxW10gcmV2ZXJzaW5nbHkgKi8KKwlmb3IoaT0wLGo9anosej1xW2p6XTtqPjA7aSsrLGotLSkgeworCSAgICBmdyAgICA9ICAoZG91YmxlKSgoaW50MzJfdCkodHdvbjI0KiB6KSk7CisJICAgIGlxW2ldID0gIChpbnQzMl90KSh6LXR3bzI0KmZ3KTsKKwkgICAgeiAgICAgPSAgcVtqLTFdK2Z3OworCX0KKworICAgIC8qIGNvbXB1dGUgbiAqLworCXogID0gc2NhbGJuKHoscTApOwkJLyogYWN0dWFsIHZhbHVlIG9mIHogKi8KKwl6IC09IDguMCpmbG9vcih6KjAuMTI1KTsJCS8qIHRyaW0gb2ZmIGludGVnZXIgPj0gOCAqLworCW4gID0gKGludDMyX3QpIHo7CisJeiAtPSAoZG91YmxlKW47CisJaWggPSAwOworCWlmKHEwPjApIHsJLyogbmVlZCBpcVtqei0xXSB0byBkZXRlcm1pbmUgbiAqLworCSAgICBpICA9IChpcVtqei0xXT4+KDI0LXEwKSk7IG4gKz0gaTsKKwkgICAgaXFbanotMV0gLT0gaTw8KDI0LXEwKTsKKwkgICAgaWggPSBpcVtqei0xXT4+KDIzLXEwKTsKKwl9IAorCWVsc2UgaWYocTA9PTApIGloID0gaXFbanotMV0+PjIzOworCWVsc2UgaWYoej49MC41KSBpaD0yOworCisJaWYoaWg+MCkgewkvKiBxID4gMC41ICovCisJICAgIG4gKz0gMTsgY2FycnkgPSAwOworCSAgICBmb3IoaT0wO2k8anogO2krKykgewkvKiBjb21wdXRlIDEtcSAqLworCQlqID0gaXFbaV07CisJCWlmKGNhcnJ5PT0wKSB7CisJCSAgICBpZihqIT0wKSB7CisJCQljYXJyeSA9IDE7IGlxW2ldID0gMHgxMDAwMDAwLSBqOworCQkgICAgfQorCQl9IGVsc2UgIGlxW2ldID0gMHhmZmZmZmYgLSBqOworCSAgICB9CisJICAgIGlmKHEwPjApIHsJCS8qIHJhcmUgY2FzZTogY2hhbmNlIGlzIDEgaW4gMTIgKi8KKwkgICAgICAgIHN3aXRjaChxMCkgeworCSAgICAgICAgY2FzZSAxOgorCSAgICAJICAgaXFbanotMV0gJj0gMHg3ZmZmZmY7IGJyZWFrOworCSAgICAJY2FzZSAyOgorCSAgICAJICAgaXFbanotMV0gJj0gMHgzZmZmZmY7IGJyZWFrOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGlmKGloPT0yKSB7CisJCXogPSBvbmUgLSB6OworCQlpZihjYXJyeSE9MCkgeiAtPSBzY2FsYm4ob25lLHEwKTsKKwkgICAgfQorCX0KKworICAgIC8qIGNoZWNrIGlmIHJlY29tcHV0YXRpb24gaXMgbmVlZGVkICovCisJaWYoej09emVybykgeworCSAgICBqID0gMDsKKwkgICAgZm9yIChpPWp6LTE7aT49ams7aS0tKSBqIHw9IGlxW2ldOworCSAgICBpZihqPT0wKSB7IC8qIG5lZWQgcmVjb21wdXRhdGlvbiAqLworCQlmb3Ioaz0xO2lxW2prLWtdPT0wO2srKyk7ICAgLyogayA9IG5vLiBvZiB0ZXJtcyBuZWVkZWQgKi8KKworCQlmb3IoaT1qeisxO2k8PWp6K2s7aSsrKSB7ICAgLyogYWRkIHFbanorMV0gdG8gcVtqeitrXSAqLworCQkgICAgZltqeCtpXSA9IChkb3VibGUpIGlwaW8yW2p2K2ldOworCQkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsKKwkJICAgIHFbaV0gPSBmdzsKKwkJfQorCQlqeiArPSBrOworCQlnb3RvIHJlY29tcHV0ZTsKKwkgICAgfQorCX0KKworICAgIC8qIGNob3Agb2ZmIHplcm8gdGVybXMgKi8KKwlpZih6PT0wLjApIHsKKwkgICAganogLT0gMTsgcTAgLT0gMjQ7CisJICAgIHdoaWxlKGlxW2p6XT09MCkgeyBqei0tOyBxMC09MjQ7fQorCX0gZWxzZSB7IC8qIGJyZWFrIHogaW50byAyNC1iaXQgaWYgbmVjZXNzYXJ5ICovCisJICAgIHogPSBzY2FsYm4oeiwtcTApOworCSAgICBpZih6Pj10d28yNCkgeyAKKwkJZncgPSAoZG91YmxlKSgoaW50MzJfdCkodHdvbjI0KnopKTsKKwkJaXFbanpdID0gKGludDMyX3QpKHotdHdvMjQqZncpOworCQlqeiArPSAxOyBxMCArPSAyNDsKKwkJaXFbanpdID0gKGludDMyX3QpIGZ3OworCSAgICB9IGVsc2UgaXFbanpdID0gKGludDMyX3QpIHogOworCX0KKworICAgIC8qIGNvbnZlcnQgaW50ZWdlciAiYml0IiBjaHVuayB0byBmbG9hdGluZy1wb2ludCB2YWx1ZSAqLworCWZ3ID0gc2NhbGJuKG9uZSxxMCk7CisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgcVtpXSA9IGZ3Kihkb3VibGUpaXFbaV07IGZ3Kj10d29uMjQ7CisJfQorCisgICAgLyogY29tcHV0ZSBQSW8yWzAsLi4uLGpwXSpxW2p6LC4uLiwwXSAqLworCWZvcihpPWp6O2k+PTA7aS0tKSB7CisJICAgIGZvcihmdz0wLjAsaz0wO2s8PWpwJiZrPD1qei1pO2srKykgZncgKz0gUElvMltrXSpxW2kra107CisJICAgIGZxW2p6LWldID0gZnc7CisJfQorCisgICAgLyogY29tcHJlc3MgZnFbXSBpbnRvIHlbXSAqLworCXN3aXRjaChwcmVjKSB7CisJICAgIGNhc2UgMDoKKwkJZncgPSAwLjA7CisJCWZvciAoaT1qejtpPj0wO2ktLSkgZncgKz0gZnFbaV07CisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OyAKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsgCisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OyAKKwkJZncgPSBmcVswXS1mdzsKKwkJZm9yIChpPTE7aTw9ano7aSsrKSBmdyArPSBmcVtpXTsKKwkJeVsxXSA9IChpaD09MCk/IGZ3OiAtZnc7IAorCQlicmVhazsKKwkgICAgY2FzZSAzOgkvKiBwYWluZnVsICovCisJCWZvciAoaT1qejtpPjA7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsgCisJCSAgICBmcVtpXSAgKz0gZnFbaS0xXS1mdzsKKwkJICAgIGZxW2ktMV0gPSBmdzsKKwkJfQorCQlmb3IgKGk9ano7aT4xO2ktLSkgeworCQkgICAgZncgICAgICA9IGZxW2ktMV0rZnFbaV07IAorCQkgICAgZnFbaV0gICs9IGZxW2ktMV0tZnc7CisJCSAgICBmcVtpLTFdID0gZnc7CisJCX0KKwkJZm9yIChmdz0wLjAsaT1qejtpPj0yO2ktLSkgZncgKz0gZnFbaV07IAorCQlpZihpaD09MCkgeworCQkgICAgeVswXSA9ICBmcVswXTsgeVsxXSA9ICBmcVsxXTsgeVsyXSA9ICBmdzsKKwkJfSBlbHNlIHsKKwkJICAgIHlbMF0gPSAtZnFbMF07IHlbMV0gPSAtZnFbMV07IHlbMl0gPSAtZnc7CisJCX0KKwl9CisJcmV0dXJuIG4mNzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfcmVtX3BpbzJmLmMgYi9saWJtL3NyYy9rX3JlbV9waW8yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzI4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3JlbV9waW8yZi5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiBrX3JlbV9waW8yZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Yga19yZW1fcGlvMi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3JlbV9waW8yZi5jLHYgMS44IDIwMDUvMTAvMTEgMDc6NTY6MDUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiBJbiB0aGUgZmxvYXQgdmVyc2lvbiwgdGhlIGlucHV0IHBhcmFtZXRlciB4IGNvbnRhaW5zIDggYml0CisgICBpbnRlZ2Vycywgbm90IDI0IGJpdCBpbnRlZ2Vycy4gIDExMyBiaXQgcHJlY2lzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuICAqLworCitzdGF0aWMgY29uc3QgaW50IGluaXRfamtbXSA9IHs0LDcsOX07IC8qIGluaXRpYWwgdmFsdWUgZm9yIGprICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBQSW8yW10gPSB7CisgIDEuNTcwMzEyNTAwMGUrMDAsIC8qIDB4M2ZjOTAwMDAgKi8KKyAgNC41Nzc2MzY3MTg4ZS0wNCwgLyogMHgzOWYwMDAwMCAqLworICAyLjU5ODc2MjUxMjJlLTA1LCAvKiAweDM3ZGEwMDAwICovCisgIDcuNTQzNzEyODU0NGUtMDgsIC8qIDB4MzNhMjAwMDAgKi8KKyAgNi4wMDI2NjUwMzE3ZS0xMSwgLyogMHgyZTg0MDAwMCAqLworICA3LjM4OTY0NDQ1MTllLTEzLCAvKiAweDJiNTAwMDAwICovCisgIDUuMzg0NTgxNjY5NGUtMTUsIC8qIDB4MjdjMjAwMDAgKi8KKyAgNS42Mzc4NTEyOTY5ZS0xOCwgLyogMHgyMmQwMDAwMCAqLworICA4LjMwMDkyMjg4MzFlLTIwLCAvKiAweDFmYzQwMDAwICovCisgIDMuMjc1NjM1MjI1N2UtMjIsIC8qIDB4MWJjNjAwMDAgKi8KKyAgNi4zMzMxMDE1NjQ5ZS0yNSwgLyogMHgxNzQ0MDAwMCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0Cit6ZXJvICAgPSAwLjAsCitvbmUgICAgPSAxLjAsCit0d284ICAgPSAgMi41NjAwMDAwMDAwZSswMiwgLyogMHg0MzgwMDAwMCAqLwordHdvbjggID0gIDMuOTA2MjUwMDAwMGUtMDM7IC8qIDB4M2I4MDAwMDAgKi8KKworCWludCBfX2tlcm5lbF9yZW1fcGlvMmYoZmxvYXQgKngsIGZsb2F0ICp5LCBpbnQgZTAsIGludCBueCwgaW50IHByZWMsIGNvbnN0IGludDMyX3QgKmlwaW8yKQoreworCWludDMyX3QganosangsanYsanAsamssY2FycnksbixpcVsyMF0saSxqLGssbSxxMCxpaDsKKwlmbG9hdCB6LGZ3LGZbMjBdLGZxWzIwXSxxWzIwXTsKKworICAgIC8qIGluaXRpYWxpemUgamsqLworCWprID0gaW5pdF9qa1twcmVjXTsKKwlqcCA9IGprOworCisgICAgLyogZGV0ZXJtaW5lIGp4LGp2LHEwLCBub3RlIHRoYXQgMz5xMCAqLworCWp4ID0gIG54LTE7CisJanYgPSAoZTAtMykvODsgaWYoanY8MCkganY9MDsKKwlxMCA9ICBlMC04KihqdisxKTsKKworICAgIC8qIHNldCB1cCBmWzBdIHRvIGZbangramtdIHdoZXJlIGZbangramtdID0gaXBpbzJbanYramtdICovCisJaiA9IGp2LWp4OyBtID0gangrams7CisJZm9yKGk9MDtpPD1tO2krKyxqKyspIGZbaV0gPSAoajwwKT8gemVybyA6IChmbG9hdCkgaXBpbzJbal07CisKKyAgICAvKiBjb21wdXRlIHFbMF0scVsxXSwuLi5xW2prXSAqLworCWZvciAoaT0wO2k8PWprO2krKykgeworCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOyBxW2ldID0gZnc7CisJfQorCisJanogPSBqazsKK3JlY29tcHV0ZToKKyAgICAvKiBkaXN0aWxsIHFbXSBpbnRvIGlxW10gcmV2ZXJzaW5nbHkgKi8KKwlmb3IoaT0wLGo9anosej1xW2p6XTtqPjA7aSsrLGotLSkgeworCSAgICBmdyAgICA9ICAoZmxvYXQpKChpbnQzMl90KSh0d29uOCogeikpOworCSAgICBpcVtpXSA9ICAoaW50MzJfdCkoei10d284KmZ3KTsKKwkgICAgeiAgICAgPSAgcVtqLTFdK2Z3OworCX0KKworICAgIC8qIGNvbXB1dGUgbiAqLworCXogID0gc2NhbGJuZih6LHEwKTsJCS8qIGFjdHVhbCB2YWx1ZSBvZiB6ICovCisJeiAtPSAoZmxvYXQpOC4wKmZsb29yZih6KihmbG9hdCkwLjEyNSk7CS8qIHRyaW0gb2ZmIGludGVnZXIgPj0gOCAqLworCW4gID0gKGludDMyX3QpIHo7CisJeiAtPSAoZmxvYXQpbjsKKwlpaCA9IDA7CisJaWYocTA+MCkgewkvKiBuZWVkIGlxW2p6LTFdIHRvIGRldGVybWluZSBuICovCisJICAgIGkgID0gKGlxW2p6LTFdPj4oOC1xMCkpOyBuICs9IGk7CisJICAgIGlxW2p6LTFdIC09IGk8PCg4LXEwKTsKKwkgICAgaWggPSBpcVtqei0xXT4+KDctcTApOworCX0KKwllbHNlIGlmKHEwPT0wKSBpaCA9IGlxW2p6LTFdPj43OworCWVsc2UgaWYoej49KGZsb2F0KTAuNSkgaWg9MjsKKworCWlmKGloPjApIHsJLyogcSA+IDAuNSAqLworCSAgICBuICs9IDE7IGNhcnJ5ID0gMDsKKwkgICAgZm9yKGk9MDtpPGp6IDtpKyspIHsJLyogY29tcHV0ZSAxLXEgKi8KKwkJaiA9IGlxW2ldOworCQlpZihjYXJyeT09MCkgeworCQkgICAgaWYoaiE9MCkgeworCQkJY2FycnkgPSAxOyBpcVtpXSA9IDB4MTAwLSBqOworCQkgICAgfQorCQl9IGVsc2UgIGlxW2ldID0gMHhmZiAtIGo7CisJICAgIH0KKwkgICAgaWYocTA+MCkgewkJLyogcmFyZSBjYXNlOiBjaGFuY2UgaXMgMSBpbiAxMiAqLworCSAgICAgICAgc3dpdGNoKHEwKSB7CisJICAgICAgICBjYXNlIDE6CisJICAgIAkgICBpcVtqei0xXSAmPSAweDdmOyBicmVhazsKKwkgICAgCWNhc2UgMjoKKwkgICAgCSAgIGlxW2p6LTFdICY9IDB4M2Y7IGJyZWFrOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGlmKGloPT0yKSB7CisJCXogPSBvbmUgLSB6OworCQlpZihjYXJyeSE9MCkgeiAtPSBzY2FsYm5mKG9uZSxxMCk7CisJICAgIH0KKwl9CisKKyAgICAvKiBjaGVjayBpZiByZWNvbXB1dGF0aW9uIGlzIG5lZWRlZCAqLworCWlmKHo9PXplcm8pIHsKKwkgICAgaiA9IDA7CisJICAgIGZvciAoaT1qei0xO2k+PWprO2ktLSkgaiB8PSBpcVtpXTsKKwkgICAgaWYoaj09MCkgeyAvKiBuZWVkIHJlY29tcHV0YXRpb24gKi8KKwkJZm9yKGs9MTtpcVtqay1rXT09MDtrKyspOyAgIC8qIGsgPSBuby4gb2YgdGVybXMgbmVlZGVkICovCisKKwkJZm9yKGk9anorMTtpPD1qeitrO2krKykgeyAgIC8qIGFkZCBxW2p6KzFdIHRvIHFbanora10gKi8KKwkJICAgIGZbangraV0gPSAoZmxvYXQpIGlwaW8yW2p2K2ldOworCQkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsKKwkJICAgIHFbaV0gPSBmdzsKKwkJfQorCQlqeiArPSBrOworCQlnb3RvIHJlY29tcHV0ZTsKKwkgICAgfQorCX0KKworICAgIC8qIGNob3Agb2ZmIHplcm8gdGVybXMgKi8KKwlpZih6PT0oZmxvYXQpMC4wKSB7CisJICAgIGp6IC09IDE7IHEwIC09IDg7CisJICAgIHdoaWxlKGlxW2p6XT09MCkgeyBqei0tOyBxMC09ODt9CisJfSBlbHNlIHsgLyogYnJlYWsgeiBpbnRvIDgtYml0IGlmIG5lY2Vzc2FyeSAqLworCSAgICB6ID0gc2NhbGJuZih6LC1xMCk7CisJICAgIGlmKHo+PXR3bzgpIHsKKwkJZncgPSAoZmxvYXQpKChpbnQzMl90KSh0d29uOCp6KSk7CisJCWlxW2p6XSA9IChpbnQzMl90KSh6LXR3bzgqZncpOworCQlqeiArPSAxOyBxMCArPSA4OworCQlpcVtqel0gPSAoaW50MzJfdCkgZnc7CisJICAgIH0gZWxzZSBpcVtqel0gPSAoaW50MzJfdCkgeiA7CisJfQorCisgICAgLyogY29udmVydCBpbnRlZ2VyICJiaXQiIGNodW5rIHRvIGZsb2F0aW5nLXBvaW50IHZhbHVlICovCisJZncgPSBzY2FsYm5mKG9uZSxxMCk7CisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgcVtpXSA9IGZ3KihmbG9hdClpcVtpXTsgZncqPXR3b244OworCX0KKworICAgIC8qIGNvbXB1dGUgUElvMlswLC4uLixqcF0qcVtqeiwuLi4sMF0gKi8KKwlmb3IoaT1qejtpPj0wO2ktLSkgeworCSAgICBmb3IoZnc9MC4wLGs9MDtrPD1qcCYmazw9anotaTtrKyspIGZ3ICs9IFBJbzJba10qcVtpK2tdOworCSAgICBmcVtqei1pXSA9IGZ3OworCX0KKworICAgIC8qIGNvbXByZXNzIGZxW10gaW50byB5W10gKi8KKwlzd2l0Y2gocHJlYykgeworCSAgICBjYXNlIDA6CisJCWZ3ID0gMC4wOworCQlmb3IgKGk9ano7aT49MDtpLS0pIGZ3ICs9IGZxW2ldOworCQl5WzBdID0gKGloPT0wKT8gZnc6IC1mdzsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsKKwkJZncgPSAqKHZvbGF0aWxlIGZsb2F0ICopJmZ3OwkvKiBjbGlwIGFueSBleHRyYSBwcmVjaXNpb24gKi8KKwkJeVswXSA9IChpaD09MCk/IGZ3OiAtZnc7CisJCWZ3ID0gZnFbMF0tZnc7CisJCWZvciAoaT0xO2k8PWp6O2krKykgZncgKz0gZnFbaV07CisJCXlbMV0gPSAoaWg9PTApPyBmdzogLWZ3OworCQlicmVhazsKKwkgICAgY2FzZSAzOgkvKiBwYWluZnVsICovCisJCWZvciAoaT1qejtpPjA7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoaT1qejtpPjE7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoZnc9MC4wLGk9ano7aT49MjtpLS0pIGZ3ICs9IGZxW2ldOworCQlpZihpaD09MCkgeworCQkgICAgeVswXSA9ICBmcVswXTsgeVsxXSA9ICBmcVsxXTsgeVsyXSA9ICBmdzsKKwkJfSBlbHNlIHsKKwkJICAgIHlbMF0gPSAtZnFbMF07IHlbMV0gPSAtZnFbMV07IHlbMl0gPSAtZnc7CisJCX0KKwl9CisJcmV0dXJuIG4mNzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfc2luLmMgYi9saWJtL3NyYy9rX3Npbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDZhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3Npbi5jCkBAIC0wLDAgKzEsNzAgQEAKKworLyogQCgjKWtfc2luLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfc2luLmMsdiAxLjEwIDIwMDUvMTEvMDIgMTM6MDY6NDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2tlcm5lbF9zaW4oIHgsIHksIGl5KQorICoga2VybmVsIHNpbiBmdW5jdGlvbiBvbiB+Wy1waS80LCBwaS80XSAoZXhjZXB0IG9uIC0wKSwgcGkvNCB+IDAuNzg1NAorICogSW5wdXQgeCBpcyBhc3N1bWVkIHRvIGJlIGJvdW5kZWQgYnkgfnBpLzQgaW4gbWFnbml0dWRlLgorICogSW5wdXQgeSBpcyB0aGUgdGFpbCBvZiB4LgorICogSW5wdXQgaXkgaW5kaWNhdGVzIHdoZXRoZXIgeSBpcyAwLiAoaWYgaXk9MCwgeSBhc3N1bWUgdG8gYmUgMCkuIAorICoKKyAqIEFsZ29yaXRobQorICoJMS4gU2luY2Ugc2luKC14KSA9IC1zaW4oeCksIHdlIG5lZWQgb25seSB0byBjb25zaWRlciBwb3NpdGl2ZSB4LiAKKyAqCTIuIENhbGxlcnMgbXVzdCByZXR1cm4gc2luKC0wKSA9IC0wIHdpdGhvdXQgY2FsbGluZyBoZXJlIHNpbmNlIG91cgorICoJICAgb2RkIHBvbHlub21pYWwgaXMgbm90IGV2YWx1YXRlZCBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyAtMC4KKyAqCSAgIENhbGxlcnMgbWF5IGRvIHRoZSBvcHRpbWl6YXRpb24gc2luKHgpIH4geCBmb3IgdGlueSB4LgorICoJMy4gc2luKHgpIGlzIGFwcHJveGltYXRlZCBieSBhIHBvbHlub21pYWwgb2YgZGVncmVlIDEzIG9uCisgKgkgICBbMCxwaS80XQorICoJCSAgCSAgICAgICAgIDMgICAgICAgICAgICAxMworICoJICAgCXNpbih4KSB+IHggKyBTMSp4ICsgLi4uICsgUzYqeAorICoJICAgd2hlcmUKKyAqCQorICogCXxzaW4oeCkgICAgICAgICAyICAgICA0ICAgICA2ICAgICA4ICAgICAxMCAgICAgMTIgIHwgICAgIC01OAorICogCXwtLS0tLSAtICgxK1MxKnggK1MyKnggK1MzKnggK1M0KnggK1M1KnggICtTNip4ICAgKXwgPD0gMgorICogCXwgIHggCQkJCQkgICAgICAgICAgIHwgCisgKiAKKyAqCTQuIHNpbih4K3kpID0gc2luKHgpICsgc2luJyh4JykqeQorICoJCSAgICB+IHNpbih4KSArICgxLXgqeC8yKSp5CisgKgkgICBGb3IgYmV0dGVyIGFjY3VyYWN5LCBsZXQgCisgKgkJICAgICAzICAgICAgMiAgICAgIDIgICAgICAyICAgICAgMgorICoJCXIgPSB4ICooUzIreCAqKFMzK3ggKihTNCt4ICooUzUreCAqUzYpKSkpCisgKgkgICB0aGVuICAgICAgICAgICAgICAgICAgIDMgICAgMgorICoJCXNpbih4KSA9IHggKyAoUzEqeCArICh4ICooci15LzIpK3kpKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2hhbGYgPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK1MxICA9IC0xLjY2NjY2NjY2NjY2NjY2MzI0MzQ4ZS0wMSwgLyogMHhCRkM1NTU1NSwgMHg1NTU1NTU0OSAqLworUzIgID0gIDguMzMzMzMzMzMzMzIyNDg5NDYxMjRlLTAzLCAvKiAweDNGODExMTExLCAweDExMTBGOEE2ICovCitTMyAgPSAtMS45ODQxMjY5ODI5ODU3OTQ5MzEzNGUtMDQsIC8qIDB4QkYyQTAxQTAsIDB4MTlDMTYxRDUgKi8KK1M0ICA9ICAyLjc1NTczMTM3MDcwNzAwNjc2Nzg5ZS0wNiwgLyogMHgzRUM3MURFMywgMHg1N0IxRkU3RCAqLworUzUgID0gLTIuNTA1MDc2MDI1MzQwNjg2MzQxOTVlLTA4LCAvKiAweEJFNUFFNUU2LCAweDhBMkI5Q0VCICovCitTNiAgPSAgMS41ODk2OTA5OTUyMTE1NTAxMDIyMWUtMTA7IC8qIDB4M0RFNUQ5M0EsIDB4NUFDRkQ1N0MgKi8KKworZG91YmxlCitfX2tlcm5lbF9zaW4oZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgaXkpCit7CisJZG91YmxlIHoscix2OworCisJegk9ICB4Kng7CisJdgk9ICB6Kng7CisJcgk9ICBTMit6KihTMyt6KihTNCt6KihTNSt6KlM2KSkpOworCWlmKGl5PT0wKSByZXR1cm4geCt2KihTMSt6KnIpOworCWVsc2UgICAgICByZXR1cm4geC0oKHoqKGhhbGYqeS12KnIpLXkpLXYqUzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19zaW5mLmMgYi9saWJtL3NyYy9rX3NpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVkYzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19zaW5mLmMKQEAgLTAsMCArMSw0NyBAQAorLyoga19zaW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX3Npbi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9TSU5ERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfc2luZi5jLHYgMS4xMyAyMDA1LzExLzMwIDExOjUxOjE3IGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8c2luKHgpL3ggLSBzKHgpfCA8IDIqKi0zNy41ICh+Wy00Ljg5ZS0xMiwgNC44MjRlLTEyXSkuICovCitzdGF0aWMgY29uc3QgZG91YmxlCitTMSA9IC0weDE1NTU1NTU0Y2JhYzc3LjBwLTU1LAkvKiAtMC4xNjY2NjY2NjY0MTYyNjUyMzU1OTUgKi8KK1MyID0gIDB4MTExMTEwODk2ZWZiYjIuMHAtNTksCS8qICAwLjAwODMzMzMyOTM4NTg4OTQ2MzE3NTYgKi8KK1MzID0gLTB4MWEwMGY5ZTJjYWU3NzQuMHAtNjUsCS8qIC0wLjAwMDE5ODM5MzM0ODM2MDk2NjMxNzM0NyAqLworUzQgPSAgMHgxNmNkODc4YzNiNDZhNy4wcC03MTsJLyogIDAuMDAwMDAyNzE4MzExNDkzOTg5ODIxOTA2NCAqLworCisjaWZkZWYgSU5MSU5FX0tFUk5FTF9TSU5ERgorZXh0ZXJuIGlubGluZQorI2VuZGlmCitmbG9hdAorX19rZXJuZWxfc2luZGYoZG91YmxlIHgpCit7CisJZG91YmxlIHIsIHMsIHcsIHo7CisKKwkvKiBUcnkgdG8gb3B0aW1pemUgZm9yIHBhcmFsbGVsIGV2YWx1YXRpb24gYXMgaW4ga190YW5mLmMuICovCisJeiA9IHgqeDsKKwl3ID0geip6OworCXIgPSBTMyt6KlM0OworCXMgPSB6Kng7CisJcmV0dXJuICh4ICsgcyooUzEreipTMikpICsgcyp3KnI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3Rhbi5jIGIvbGlibS9zcmMva190YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZlMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva190YW4uYwpAQCAtMCwwICsxLDEzMyBAQAorLyogQCgjKWtfdGFuLmMgMS41IDA0LzA0LzIyIFNNSSAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIElOREVOVCBPRkYgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3Rhbi5jLHYgMS4xMiAyMDA1LzExLzAyIDE0OjAxOjQ1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogX19rZXJuZWxfdGFuKCB4LCB5LCBrICkKKyAqIGtlcm5lbCB0YW4gZnVuY3Rpb24gb24gflstcGkvNCwgcGkvNF0gKGV4Y2VwdCBvbiAtMCksIHBpLzQgfiAwLjc4NTQKKyAqIElucHV0IHggaXMgYXNzdW1lZCB0byBiZSBib3VuZGVkIGJ5IH5waS80IGluIG1hZ25pdHVkZS4KKyAqIElucHV0IHkgaXMgdGhlIHRhaWwgb2YgeC4KKyAqIElucHV0IGsgaW5kaWNhdGVzIHdoZXRoZXIgdGFuIChpZiBrID0gMSkgb3IgLTEvdGFuIChpZiBrID0gLTEpIGlzIHJldHVybmVkLgorICoKKyAqIEFsZ29yaXRobQorICoJMS4gU2luY2UgdGFuKC14KSA9IC10YW4oeCksIHdlIG5lZWQgb25seSB0byBjb25zaWRlciBwb3NpdGl2ZSB4LgorICoJMi4gQ2FsbGVycyBtdXN0IHJldHVybiB0YW4oLTApID0gLTAgd2l0aG91dCBjYWxsaW5nIGhlcmUgc2luY2Ugb3VyCisgKgkgICBvZGQgcG9seW5vbWlhbCBpcyBub3QgZXZhbHVhdGVkIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIC0wLgorICoJICAgQ2FsbGVycyBtYXkgZG8gdGhlIG9wdGltaXphdGlvbiB0YW4oeCkgfiB4IGZvciB0aW55IHguCisgKgkzLiB0YW4oeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgb2RkIHBvbHlub21pYWwgb2YgZGVncmVlIDI3IG9uCisgKgkgICBbMCwwLjY3NDM0XQorICoJCSAgCSAgICAgICAgIDMgICAgICAgICAgICAgMjcKKyAqCSAgIAl0YW4oeCkgfiB4ICsgVDEqeCArIC4uLiArIFQxMyp4CisgKgkgICB3aGVyZQorICoKKyAqIAkgICAgICAgIHx0YW4oeCkgICAgICAgICAyICAgICA0ICAgICAgICAgICAgMjYgICB8ICAgICAtNTkuMgorICogCSAgICAgICAgfC0tLS0tIC0gKDErVDEqeCArVDIqeCArLi4uLiArVDEzKnggICAgKXwgPD0gMgorICogCSAgICAgICAgfCAgeCAJCQkJCXwKKyAqCisgKgkgICBOb3RlOiB0YW4oeCt5KSA9IHRhbih4KSArIHRhbicoeCkqeQorICoJCSAgICAgICAgICB+IHRhbih4KSArICgxK3gqeCkqeQorICoJICAgVGhlcmVmb3JlLCBmb3IgYmV0dGVyIGFjY3VyYWN5IGluIGNvbXB1dGluZyB0YW4oeCt5KSwgbGV0CisgKgkJICAgICAzICAgICAgMiAgICAgIDIgICAgICAgMiAgICAgICAyCisgKgkJciA9IHggKihUMit4ICooVDMreCAqKC4uLit4ICooVDEyK3ggKlQxMykpKSkKKyAqCSAgIHRoZW4KKyAqCQkgCQkgICAgMyAgICAyCisgKgkJdGFuKHgreSkgPSB4ICsgKFQxKnggKyAoeCAqKHIreSkreSkpCisgKgorICogICAgICA0LiBGb3IgeCBpbiBbMC42NzQzNCxwaS80XSwgIGxldCB5ID0gcGkvNCAtIHgsIHRoZW4KKyAqCQl0YW4oeCkgPSB0YW4ocGkvNC15KSA9ICgxLXRhbih5KSkvKDErdGFuKHkpKQorICoJCSAgICAgICA9IDEgLSAyKih0YW4oeSkgLSAodGFuKHkpXjIpLygxK3Rhbih5KSkpCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKK3N0YXRpYyBjb25zdCBkb3VibGUgeHh4W10gPSB7CisJCSAzLjMzMzMzMzMzMzMzMzM0MDkxOTg2ZS0wMSwJLyogM0ZENTU1NTUsIDU1NTU1NTYzICovCisJCSAxLjMzMzMzMzMzMzMzMjAxMjQyNjk5ZS0wMSwJLyogM0ZDMTExMTEsIDExMTBGRTdBICovCisJCSA1LjM5NjgyNTM5NzYyMjYwNTIxMzc3ZS0wMiwJLyogM0ZBQkExQkEsIDFCQjM0MUZFICovCisJCSAyLjE4Njk0ODgyOTQ4NTk1NDI0NTk5ZS0wMiwJLyogM0Y5NjY0RjQsIDg0MDZENjM3ICovCisJCSA4Ljg2MzIzOTgyMzU5OTMwMDA1NzM3ZS0wMywJLyogM0Y4MjI2RTMsIEU5NkU4NDkzICovCisJCSAzLjU5MjA3OTEwNzU5MTMxMjM1MzU2ZS0wMywJLyogM0Y2RDZEMjIsIEM5NTYwMzI4ICovCisJCSAxLjQ1NjIwOTQ1NDMyNTI5MDI1NTE2ZS0wMywJLyogM0Y1N0RCQzgsIEZFRTA4MzE1ICovCisJCSA1Ljg4MDQxMjQwODIwMjY0MDk2ODc0ZS0wNCwJLyogM0Y0MzQ0RDgsIEYyRjI2NTAxICovCisJCSAyLjQ2NDYzMTM0ODE4NDY5OTA2ODEyZS0wNCwJLyogM0YzMDI2RjcsIDFBOEQxMDY4ICovCisJCSA3LjgxNzk0NDQyOTM5NTU3MDkyMzAwZS0wNSwJLyogM0YxNDdFODgsIEEwMzc5MkE2ICovCisJCSA3LjE0MDcyNDkxMzgyNjA4MTkwMzA1ZS0wNSwJLyogM0YxMkI4MEYsIDMyRjBBN0U5ICovCisJCS0xLjg1NTg2Mzc0ODU1Mjc1NDU2NjU0ZS0wNSwJLyogQkVGMzc1Q0IsIERCNjA1MzczICovCisJCSAyLjU5MDczMDUxODYzNjMzNzEyODg0ZS0wNSwJLyogM0VGQjJBNzAsIDc0QkY3QUQ0ICovCisvKiBvbmUgKi8JIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLAkvKiAzRkYwMDAwMCwgMDAwMDAwMDAgKi8KKy8qIHBpbzQgKi8JIDcuODUzOTgxNjMzOTc0NDgyNzg5OTllLTAxLAkvKiAzRkU5MjFGQiwgNTQ0NDJEMTggKi8KKy8qIHBpbzRsbyAqLwkgMy4wNjE2MTY5OTc4NjgzODMwMTc5M2UtMTcJLyogM0M4MUE2MjYsIDMzMTQ1QzA3ICovCit9OworI2RlZmluZQlvbmUJeHh4WzEzXQorI2RlZmluZQlwaW80CXh4eFsxNF0KKyNkZWZpbmUJcGlvNGxvCXh4eFsxNV0KKyNkZWZpbmUJVAl4eHgKKy8qIElOREVOVCBPTiAqLworCitkb3VibGUKK19fa2VybmVsX3Rhbihkb3VibGUgeCwgZG91YmxlIHksIGludCBpeSkgeworCWRvdWJsZSB6LCByLCB2LCB3LCBzOworCWludDMyX3QgaXgsIGh4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsJCQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisJaWYgKGl4ID49IDB4M0ZFNTk0MjgpIHsJLyogfHh8ID49IDAuNjc0NCAqLworCQlpZiAoaHggPCAwKSB7CisJCQl4ID0gLXg7CisJCQl5ID0gLXk7CisJCX0KKwkJeiA9IHBpbzQgLSB4OworCQl3ID0gcGlvNGxvIC0geTsKKwkJeCA9IHogKyB3OworCQl5ID0gMC4wOworCX0KKwl6ID0geCAqIHg7CisJdyA9IHogKiB6OworCS8qCisJICogQnJlYWsgeF41KihUWzFdK3heMipUWzJdKy4uLikgaW50bworCSAqIHheNShUWzFdK3heNCpUWzNdKy4uLit4XjIwKlRbMTFdKSArCisJICogeF41KHheMiooVFsyXSt4XjQqVFs0XSsuLi4reF4yMipbVDEyXSkpCisJICovCisJciA9IFRbMV0gKyB3ICogKFRbM10gKyB3ICogKFRbNV0gKyB3ICogKFRbN10gKyB3ICogKFRbOV0gKworCQl3ICogVFsxMV0pKSkpOworCXYgPSB6ICogKFRbMl0gKyB3ICogKFRbNF0gKyB3ICogKFRbNl0gKyB3ICogKFRbOF0gKyB3ICogKFRbMTBdICsKKwkJdyAqIFRbMTJdKSkpKSk7CisJcyA9IHogKiB4OworCXIgPSB5ICsgeiAqIChzICogKHIgKyB2KSArIHkpOworCXIgKz0gVFswXSAqIHM7CisJdyA9IHggKyByOworCWlmIChpeCA+PSAweDNGRTU5NDI4KSB7CisJCXYgPSAoZG91YmxlKSBpeTsKKwkJcmV0dXJuIChkb3VibGUpICgxIC0gKChoeCA+PiAzMCkgJiAyKSkgKgorCQkJKHYgLSAyLjAgKiAoeCAtICh3ICogdyAvICh3ICsgdikgLSByKSkpOworCX0KKwlpZiAoaXkgPT0gMSkKKwkJcmV0dXJuIHc7CisJZWxzZSB7CisJCS8qCisJCSAqIGlmIGFsbG93IGVycm9yIHVwIHRvIDIgdWxwLCBzaW1wbHkgcmV0dXJuCisJCSAqIC0xLjAgLyAoeCtyKSBoZXJlCisJCSAqLworCQkvKiBjb21wdXRlIC0xLjAgLyAoeCtyKSBhY2N1cmF0ZWx5ICovCisJCWRvdWJsZSBhLCB0OworCQl6ID0gdzsKKwkJU0VUX0xPV19XT1JEKHosMCk7CisJCXYgPSByIC0gKHogLSB4KTsJLyogeit2ID0gcit4ICovCisJCXQgPSBhID0gLTEuMCAvIHc7CS8qIGEgPSAtMS4wL3cgKi8KKwkJU0VUX0xPV19XT1JEKHQsMCk7CisJCXMgPSAxLjAgKyB0ICogejsKKwkJcmV0dXJuIHQgKyBhICogKHMgKyB0ICogdik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva190YW5mLmMgYi9saWJtL3NyYy9rX3RhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc0MDMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva190YW5mLmMKQEAgLTAsMCArMSw2NyBAQAorLyoga190YW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX3Rhbi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9UQU5ERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfdGFuZi5jLHYgMS4yMCAyMDA1LzExLzI4IDExOjQ2OjIwIGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8dGFuKHgpL3ggLSB0KHgpfCA8IDIqKi0yNS41ICh+Wy0yZS0wOCwgMmUtMDhdKS4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK1RbXSA9ICB7CisgIDB4MTU1NTRkMzQxOGM5OWYuMHAtNTQsCS8qIDAuMzMzMzMxMzk1MDMwNzkxMzk5NzU4ICovCisgIDB4MTExMmZkMzg5OTlmNzIuMHAtNTUsCS8qIDAuMTMzMzkyMDAyNzEyOTc2NzQyNzE4ICovCisgIDB4MWI1NGM5MWQ4NjVhZmUuMHAtNTcsCS8qIDAuMDUzMzgxMjM3ODQ0NTY3MDM5MzUyMyAqLworICAweDE5MWRmMzkwOGMzM2NlLjBwLTU4LAkvKiAwLjAyNDUyODMxODExNjY1NDcyNzg4NzMgKi8KKyAgMHgxODVkYWRmY2VjZjQ0ZS4wcC02MSwJLyogMC4wMDI5NzQzNTc0MzM1OTk2NzMwNDkyNyAqLworICAweDEzNjJiOWJmOTcxYmNkLjBwLTU5LAkvKiAwLjAwOTQ2NTY0Nzg0OTQzNjczMTY2NzI4ICovCit9OworCisjaWZkZWYgSU5MSU5FX0tFUk5FTF9UQU5ERgorZXh0ZXJuIGlubGluZQorI2VuZGlmCitmbG9hdAorX19rZXJuZWxfdGFuZGYoZG91YmxlIHgsIGludCBpeSkKK3sKKwlkb3VibGUgeixyLHcscyx0LHU7CisKKwl6CT0gIHgqeDsKKwkvKgorCSAqIFNwbGl0IHVwIHRoZSBwb2x5bm9taWFsIGludG8gc21hbGwgaW5kZXBlbmRlbnQgdGVybXMgdG8gZ2l2ZQorCSAqIG9wcG9ydHVuaXRpZXMgZm9yIHBhcmFsbGVsIGV2YWx1YXRpb24uICBUaGUgY2hvc2VuIHNwbGl0dGluZyBpcworCSAqIG1pY3JvLW9wdGltaXplZCBmb3IgQXRobG9ucyAoWFAsIFg2NCkuICBJdCBjb3N0cyAyIG11bHRpcGxpY2F0aW9ucworCSAqIHJlbGF0aXZlIHRvIEhvcm5lcidzIG1ldGhvZCBvbiBzZXF1ZW50aWFsIG1hY2hpbmVzLgorCSAqCisJICogV2UgYWRkIHRoZSBzbWFsbCB0ZXJtcyBmcm9tIGxvd2VzdCBkZWdyZWUgdXAgZm9yIGVmZmljaWVuY3kgb24KKwkgKiBub24tc2VxdWVudGlhbCBtYWNoaW5lcyAodGhlIGxvd2VzdCBkZWdyZWUgdGVybXMgdGVuZCB0byBiZSByZWFkeQorCSAqIGVhcmxpZXIpLiAgQXBhcnQgZnJvbSB0aGlzLCB3ZSBkb24ndCBjYXJlIGFib3V0IG9yZGVyIG9mCisJICogb3BlcmF0aW9ucywgYW5kIGRvbid0IG5lZWQgdG8gdG8gY2FyZSBzaW5jZSB3ZSBoYXZlIHByZWNpc2lvbiB0bworCSAqIHNwYXJlLiAgSG93ZXZlciwgdGhlIGNob3NlbiBzcGxpdHRpbmcgaXMgZ29vZCBmb3IgYWNjdXJhY3kgdG9vLAorCSAqIGFuZCB3b3VsZCBnaXZlIHJlc3VsdHMgYXMgYWNjdXJhdGUgYXMgSG9ybmVyJ3MgbWV0aG9kIGlmIHRoZQorCSAqIHNtYWxsIHRlcm1zIHdlcmUgYWRkZWQgZnJvbSBoaWdoZXN0IGRlZ3JlZSBkb3duLgorCSAqLworCXIgPSBUWzRdK3oqVFs1XTsKKwl0ID0gVFsyXSt6KlRbM107CisJdyA9IHoqejsKKwlzID0geip4OworCXUgPSBUWzBdK3oqVFsxXTsKKwlyID0gKHgrcyp1KSsocyp3KSoodCt3KnIpOworCWlmKGl5PT0xKSByZXR1cm4gcjsKKwllbHNlIHJldHVybiAtMS4wL3I7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9tYXRoX3ByaXZhdGUuaCBiL2xpYm0vc3JjL21hdGhfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmNkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9tYXRoX3ByaXZhdGUuaApAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogZnJvbTogQCgjKWZkbGlibS5oIDUuMSA5My8wOS8yNAorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvbWF0aF9wcml2YXRlLmgsdiAxLjIwIDIwMDUvMTEvMjggMDQ6NTg6NTcgYmRlIEV4cCAkCisgKi8KKworI2lmbmRlZiBfTUFUSF9QUklWQVRFX0hfCisjZGVmaW5lCV9NQVRIX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisvKgorICogVGhlIG9yaWdpbmFsIGZkbGlibSBjb2RlIHVzZWQgc3RhdGVtZW50cyBsaWtlOgorICoJbjAgPSAoKCooaW50Kikmb25lKT4+MjkpXjE7CQkqIGluZGV4IG9mIGhpZ2ggd29yZCAqCisgKglpeDAgPSAqKG4wKyhpbnQqKSZ4KTsJCQkqIGhpZ2ggd29yZCBvZiB4ICoKKyAqCWl4MSA9ICooKDEtbjApKyhpbnQqKSZ4KTsJCSogbG93IHdvcmQgb2YgeCAqCisgKiB0byBkaWcgdHdvIDMyIGJpdCB3b3JkcyBvdXQgb2YgdGhlIDY0IGJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisgKiB2YWx1ZS4gIFRoYXQgaXMgbm9uLUFOU0ksIGFuZCwgbW9yZW92ZXIsIHRoZSBnY2MgaW5zdHJ1Y3Rpb24KKyAqIHNjaGVkdWxlciBnZXRzIGl0IHdyb25nLiAgV2UgaW5zdGVhZCB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3MuCisgKiBVbmxpa2UgdGhlIG9yaWdpbmFsIGNvZGUsIHdlIGRldGVybWluZSB0aGUgZW5kaWFubmVzcyBhdCBjb21waWxlCisgKiB0aW1lLCBub3QgYXQgcnVuIHRpbWU7IEkgZG9uJ3Qgc2VlIG11Y2ggYmVuZWZpdCB0byBzZWxlY3RpbmcKKyAqIGVuZGlhbm5lc3MgYXQgcnVuIHRpbWUuCisgKi8KKworLyoKKyAqIEEgdW5pb24gd2hpY2ggcGVybWl0cyB1cyB0byBjb252ZXJ0IGJldHdlZW4gYSBkb3VibGUgYW5kIHR3byAzMiBiaXQKKyAqIGludHMuCisgKi8KKworI2lmIChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOKSB8fCAoZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1ZGUF9GUF9fKSkKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgdmFsdWU7CisgIHN0cnVjdAorICB7CisgICAgdV9pbnQzMl90IG1zdzsKKyAgICB1X2ludDMyX3QgbHN3OworICB9IHBhcnRzOworfSBpZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gICYmICEoZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1ZGUF9GUF9fKSkKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgdmFsdWU7CisgIHN0cnVjdAorICB7CisgICAgdV9pbnQzMl90IGxzdzsKKyAgICB1X2ludDMyX3QgbXN3OworICB9IHBhcnRzOworfSBpZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworLyogR2V0IHR3byAzMiBiaXQgaW50cyBmcm9tIGEgZG91YmxlLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1dPUkRTKGl4MCxpeDEsZCkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGV3X3U7CQkJCQlcCisgIGV3X3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaXgwKSA9IGV3X3UucGFydHMubXN3OwkJCQkJXAorICAoaXgxKSA9IGV3X3UucGFydHMubHN3OwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogR2V0IHRoZSBtb3JlIHNpZ25pZmljYW50IDMyIGJpdCBpbnQgZnJvbSBhIGRvdWJsZS4gICovCisKKyNkZWZpbmUgR0VUX0hJR0hfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2hfdTsJCQkJCVwKKyAgZ2hfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdoX3UucGFydHMubXN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIEdldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXQgaW50IGZyb20gYSBkb3VibGUuICAqLworCisjZGVmaW5lIEdFVF9MT1dfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2xfdTsJCQkJCVwKKyAgZ2xfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdsX3UucGFydHMubHN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCBhIGRvdWJsZSBmcm9tIHR3byAzMiBiaXQgaW50cy4gICovCisKKyNkZWZpbmUgSU5TRVJUX1dPUkRTKGQsaXgwLGl4MSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBpd191OwkJCQkJXAorICBpd191LnBhcnRzLm1zdyA9IChpeDApOwkJCQkJXAorICBpd191LnBhcnRzLmxzdyA9IChpeDEpOwkJCQkJXAorICAoZCkgPSBpd191LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbW9yZSBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfSElHSF9XT1JEKGQsdikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBzaF91OwkJCQkJXAorICBzaF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgc2hfdS5wYXJ0cy5tc3cgPSAodik7CQkJCQkJXAorICAoZCkgPSBzaF91LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfTE9XX1dPUkQoZCx2KQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIHNsX3U7CQkJCQlcCisgIHNsX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICBzbF91LnBhcnRzLmxzdyA9ICh2KTsJCQkJCQlcCisgIChkKSA9IHNsX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEEgdW5pb24gd2hpY2ggcGVybWl0cyB1cyB0byBjb252ZXJ0IGJldHdlZW4gYSBmbG9hdCBhbmQgYSAzMiBiaXQKKyAqIGludC4KKyAqLworCit0eXBlZGVmIHVuaW9uCit7CisgIGZsb2F0IHZhbHVlOworICAvKiBGSVhNRTogQXNzdW1lcyAzMiBiaXQgaW50LiAgKi8KKyAgdW5zaWduZWQgaW50IHdvcmQ7Cit9IGllZWVfZmxvYXRfc2hhcGVfdHlwZTsKKworLyogR2V0IGEgMzIgYml0IGludCBmcm9tIGEgZmxvYXQuICAqLworCisjZGVmaW5lIEdFVF9GTE9BVF9XT1JEKGksZCkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIGdmX3U7CQkJCQlcCisgIGdmX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaSkgPSBnZl91LndvcmQ7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IGEgZmxvYXQgZnJvbSBhIDMyIGJpdCBpbnQuICAqLworCisjZGVmaW5lIFNFVF9GTE9BVF9XT1JEKGQsaSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIHNmX3U7CQkJCQlcCisgIHNmX3Uud29yZCA9IChpKTsJCQkJCQlcCisgIChkKSA9IHNmX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIF9DT01QTEVYX0gKKy8qCisgKiBJbmxpbmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGNvbXBsZXggdmFsdWVzLgorICoKKyAqIFRoZSBDOTkgc3RhbmRhcmQgaW50ZW5kcyB4K0kqeSB0byBiZSB1c2VkIGZvciB0aGlzLCBidXQgeCtJKnkgaXMKKyAqIGN1cnJlbnRseSB1bnVzYWJsZSBpbiBnZW5lcmFsIHNpbmNlIGdjYyBpbnRyb2R1Y2VzIG1hbnkgb3ZlcmZsb3csCisgKiB1bmRlcmZsb3csIHNpZ24gYW5kIGVmZmljaWVuY3kgYnVncyBieSByZXdyaXRpbmcgSSp5IGFzCisgKiAoMC4wK0kpKih5KzAuMCpJKSBhbmQgbGFib3Jpb3VzbHkgY29tcHV0aW5nIHRoZSBmdWxsIGNvbXBsZXggcHJvZHVjdC4KKyAqIEluIHBhcnRpY3VsYXIsIEkqSW5mIGlzIGNvcnJ1cHRlZCB0byBOYU4rSSpJbmYsIGFuZCBJKi0wIGlzIGNvcnJ1cHRlZAorICogdG8gLTAuMCtJKjAuMC4KKyAqLworc3RhdGljIF9faW5saW5lIGZsb2F0IGNvbXBsZXgKK2NwYWNrZihmbG9hdCB4LCBmbG9hdCB5KQoreworCWZsb2F0IGNvbXBsZXggejsKKworCV9fcmVhbF9fIHogPSB4OworCV9faW1hZ19fIHogPSB5OworCXJldHVybiAoeik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBkb3VibGUgY29tcGxleAorY3BhY2soZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBjb21wbGV4IHo7CisKKwlfX3JlYWxfXyB6ID0geDsKKwlfX2ltYWdfXyB6ID0geTsKKwlyZXR1cm4gKHopOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBkb3VibGUgY29tcGxleAorY3BhY2tsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJbG9uZyBkb3VibGUgY29tcGxleCB6OworCisJX19yZWFsX18geiA9IHg7CisJX19pbWFnX18geiA9IHk7CisJcmV0dXJuICh6KTsKK30KKyNlbmRpZiAvKiBfQ09NUExFWF9IICovCisgCisvKgorICogaWVlZSBzdHlsZSBlbGVtZW50YXJ5IGZ1bmN0aW9ucworICoKKyAqIFdlIHJlbmFtZSBmdW5jdGlvbnMgaGVyZSB0byBpbXByb3ZlIG90aGVyIHNvdXJjZXMnIGRpZmZhYmlsaXR5CisgKiBhZ2FpbnN0IGZkbGlibS4KKyAqLworI2RlZmluZQlfX2llZWU3NTRfc3FydAlzcXJ0CisjZGVmaW5lCV9faWVlZTc1NF9hY29zCWFjb3MKKyNkZWZpbmUJX19pZWVlNzU0X2Fjb3NoCWFjb3NoCisjZGVmaW5lCV9faWVlZTc1NF9sb2cJbG9nCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuaAlhdGFuaAorI2RlZmluZQlfX2llZWU3NTRfYXNpbglhc2luCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuMglhdGFuMgorI2RlZmluZQlfX2llZWU3NTRfZXhwCWV4cAorI2RlZmluZQlfX2llZWU3NTRfY29zaAljb3NoCisjZGVmaW5lCV9faWVlZTc1NF9mbW9kCWZtb2QKKyNkZWZpbmUJX19pZWVlNzU0X3Bvdwlwb3cKKyNkZWZpbmUJX19pZWVlNzU0X2xnYW1tYSBsZ2FtbWEKKyNkZWZpbmUJX19pZWVlNzU0X2dhbW1hCWdhbW1hCisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWFfciBsZ2FtbWFfcgorI2RlZmluZQlfX2llZWU3NTRfZ2FtbWFfciBnYW1tYV9yCisjZGVmaW5lCV9faWVlZTc1NF9sb2cxMAlsb2cxMAorI2RlZmluZQlfX2llZWU3NTRfc2luaAlzaW5oCisjZGVmaW5lCV9faWVlZTc1NF9oeXBvdAloeXBvdAorI2RlZmluZQlfX2llZWU3NTRfajAJajAKKyNkZWZpbmUJX19pZWVlNzU0X2oxCWoxCisjZGVmaW5lCV9faWVlZTc1NF95MAl5MAorI2RlZmluZQlfX2llZWU3NTRfeTEJeTEKKyNkZWZpbmUJX19pZWVlNzU0X2puCWpuCisjZGVmaW5lCV9faWVlZTc1NF95bgl5bgorI2RlZmluZQlfX2llZWU3NTRfcmVtYWluZGVyIHJlbWFpbmRlcgorI2RlZmluZQlfX2llZWU3NTRfc2NhbGIJc2NhbGIKKyNkZWZpbmUJX19pZWVlNzU0X3NxcnRmCXNxcnRmCisjZGVmaW5lCV9faWVlZTc1NF9hY29zZglhY29zZgorI2RlZmluZQlfX2llZWU3NTRfYWNvc2hmIGFjb3NoZgorI2RlZmluZQlfX2llZWU3NTRfbG9nZglsb2dmCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuaGYgYXRhbmhmCisjZGVmaW5lCV9faWVlZTc1NF9hc2luZglhc2luZgorI2RlZmluZQlfX2llZWU3NTRfYXRhbjJmIGF0YW4yZgorI2RlZmluZQlfX2llZWU3NTRfZXhwZglleHBmCisjZGVmaW5lCV9faWVlZTc1NF9jb3NoZgljb3NoZgorI2RlZmluZQlfX2llZWU3NTRfZm1vZGYJZm1vZGYKKyNkZWZpbmUJX19pZWVlNzU0X3Bvd2YJcG93ZgorI2RlZmluZQlfX2llZWU3NTRfbGdhbW1hZiBsZ2FtbWFmCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYWYgZ2FtbWFmCisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWFmX3IgbGdhbW1hZl9yCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYWZfciBnYW1tYWZfcgorI2RlZmluZQlfX2llZWU3NTRfbG9nMTBmIGxvZzEwZgorI2RlZmluZQlfX2llZWU3NTRfc2luaGYJc2luaGYKKyNkZWZpbmUJX19pZWVlNzU0X2h5cG90ZiBoeXBvdGYKKyNkZWZpbmUJX19pZWVlNzU0X2owZglqMGYKKyNkZWZpbmUJX19pZWVlNzU0X2oxZglqMWYKKyNkZWZpbmUJX19pZWVlNzU0X3kwZgl5MGYKKyNkZWZpbmUJX19pZWVlNzU0X3kxZgl5MWYKKyNkZWZpbmUJX19pZWVlNzU0X2puZglqbmYKKyNkZWZpbmUJX19pZWVlNzU0X3luZgl5bmYKKyNkZWZpbmUJX19pZWVlNzU0X3JlbWFpbmRlcmYgcmVtYWluZGVyZgorI2RlZmluZQlfX2llZWU3NTRfc2NhbGJmIHNjYWxiZgorCisvKiBmZGxpYm0ga2VybmVsIGZ1bmN0aW9uICovCitpbnQJX19pZWVlNzU0X3JlbV9waW8yKGRvdWJsZSxkb3VibGUqKTsKK2RvdWJsZQlfX2tlcm5lbF9zaW4oZG91YmxlLGRvdWJsZSxpbnQpOworZG91YmxlCV9fa2VybmVsX2Nvcyhkb3VibGUsZG91YmxlKTsKK2RvdWJsZQlfX2tlcm5lbF90YW4oZG91YmxlLGRvdWJsZSxpbnQpOworaW50CV9fa2VybmVsX3JlbV9waW8yKGRvdWJsZSosZG91YmxlKixpbnQsaW50LGludCxjb25zdCBpbnQqKTsKKworLyogZmxvYXQgdmVyc2lvbnMgb2YgZmRsaWJtIGtlcm5lbCBmdW5jdGlvbnMgKi8KK2ludAlfX2llZWU3NTRfcmVtX3BpbzJmKGZsb2F0LGZsb2F0Kik7CitmbG9hdAlfX2tlcm5lbF9zaW5kZihkb3VibGUpOworZmxvYXQJX19rZXJuZWxfY29zZGYoZG91YmxlKTsKK2Zsb2F0CV9fa2VybmVsX3RhbmRmKGRvdWJsZSxpbnQpOworaW50CV9fa2VybmVsX3JlbV9waW8yZihmbG9hdCosZmxvYXQqLGludCxpbnQsaW50LGNvbnN0IGludCopOworCisjZW5kaWYgLyogIV9NQVRIX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXNpbmguYyBiL2xpYm0vc3JjL3NfYXNpbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkwMDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19hc2luaC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEAoIylzX2FzaW5oLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2FzaW5oLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIGFzaW5oKHgpCisgKiBNZXRob2QgOgorICoJQmFzZWQgb24KKyAqCQlhc2luaCh4KSA9IHNpZ24oeCkgKiBsb2cgWyB8eHwgKyBzcXJ0KHgqeCsxKSBdCisgKgl3ZSBoYXZlCisgKglhc2luaCh4KSA6PSB4ICBpZiAgMSt4Kng9MSwKKyAqCQkgOj0gc2lnbih4KSoobG9nKHgpK2xuMikpIGZvciBsYXJnZSB8eHwsIGVsc2UKKyAqCQkgOj0gc2lnbih4KSpsb2coMnx4fCsxLyh8eHwrc3FydCh4KngrMSkpKSBpZnx4fD4yLCBlbHNlCisgKgkJIDo9IHNpZ24oeCkqbG9nMXAofHh8ICsgeF4yLygxICsgc3FydCgxK3heMikpKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworbG4yID0gIDYuOTMxNDcxODA1NTk5NDUyODYyMjdlLTAxLCAvKiAweDNGRTYyRTQyLCAweEZFRkEzOUVGICovCitodWdlPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMzAwOworCitkb3VibGUKK2FzaW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHc7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsJLyogeCBpcyBpbmYgb3IgTmFOICovCisJaWYoaXg8IDB4M2UzMDAwMDApIHsJLyogfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmV0dXJuIHggaW5leGFjdCBleGNlcHQgMCAqLworCX0KKwlpZihpeD4weDQxYjAwMDAwKSB7CS8qIHx4fCA+IDIqKjI4ICovCisJICAgIHcgPSBfX2llZWU3NTRfbG9nKGZhYnMoeCkpK2xuMjsKKwl9IGVsc2UgaWYgKGl4PjB4NDAwMDAwMDApIHsJLyogMioqMjggPiB8eHwgPiAyLjAgKi8KKwkgICAgdCA9IGZhYnMoeCk7CisJICAgIHcgPSBfX2llZWU3NTRfbG9nKDIuMCp0K29uZS8oX19pZWVlNzU0X3NxcnQoeCp4K29uZSkrdCkpOworCX0gZWxzZSB7CQkvKiAyLjAgPiB8eHwgPiAyKiotMjggKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgdyA9bG9nMXAoZmFicyh4KSt0LyhvbmUrX19pZWVlNzU0X3NxcnQob25lK3QpKSk7CisJfQorCWlmKGh4PjApIHJldHVybiB3OyBlbHNlIHJldHVybiAtdzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXNpbmhmLmMgYi9saWJtL3NyYy9zX2FzaW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2FzaW5oZi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHNfYXNpbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2FzaW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2FzaW5oZi5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitsbjIgPSAgNi45MzE0NzE4MjQ2ZS0wMSwgLyogMHgzZjMxNzIxOCAqLworaHVnZT0gIDEuMDAwMDAwMDAwMGUrMzA7CisKK2Zsb2F0Cithc2luaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHc7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CS8qIHggaXMgaW5mIG9yIE5hTiAqLworCWlmKGl4PCAweDMxODAwMDAwKSB7CS8qIHx4fDwyKiotMjggKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJldHVybiB4IGluZXhhY3QgZXhjZXB0IDAgKi8KKwl9CisJaWYoaXg+MHg0ZDgwMDAwMCkgewkvKiB8eHwgPiAyKioyOCAqLworCSAgICB3ID0gX19pZWVlNzU0X2xvZ2YoZmFic2YoeCkpK2xuMjsKKwl9IGVsc2UgaWYgKGl4PjB4NDAwMDAwMDApIHsJLyogMioqMjggPiB8eHwgPiAyLjAgKi8KKwkgICAgdCA9IGZhYnNmKHgpOworCSAgICB3ID0gX19pZWVlNzU0X2xvZ2YoKGZsb2F0KTIuMCp0K29uZS8oX19pZWVlNzU0X3NxcnRmKHgqeCtvbmUpK3QpKTsKKwl9IGVsc2UgewkJLyogMi4wID4gfHh8ID4gMioqLTI4ICovCisJICAgIHQgPSB4Kng7CisJICAgIHcgPWxvZzFwZihmYWJzZih4KSt0LyhvbmUrX19pZWVlNzU0X3NxcnRmKG9uZSt0KSkpOworCX0KKwlpZihoeD4wKSByZXR1cm4gdzsgZWxzZSByZXR1cm4gLXc7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2F0YW4uYyBiL2xpYm0vc3JjL3NfYXRhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDdhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2F0YW4uYwpAQCAtMCwwICsxLDExOSBAQAorLyogQCgjKXNfYXRhbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19hdGFuLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyogYXRhbih4KQorICogTWV0aG9kCisgKiAgIDEuIFJlZHVjZSB4IHRvIHBvc2l0aXZlIGJ5IGF0YW4oeCkgPSAtYXRhbigteCkuCisgKiAgIDIuIEFjY29yZGluZyB0byB0aGUgaW50ZWdlciBrPTR0KzAuMjUgY2hvcHBlZCwgdD14LCB0aGUgYXJndW1lbnQKKyAqICAgICAgaXMgZnVydGhlciByZWR1Y2VkIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVydmFscyBhbmQgdGhlCisgKiAgICAgIGFyY3RhbmdlbnQgb2YgdCBpcyBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybXVsYToKKyAqCisgKiAgICAgIFswLDcvMTZdICAgICAgYXRhbih4KSA9IHQtdF4zKihhMSt0XjIqKGEyKy4uLihhMTArdF4yKmExMSkuLi4pCisgKiAgICAgIFs3LzE2LDExLzE2XSAgYXRhbih4KSA9IGF0YW4oMS8yKSArIGF0YW4oICh0LTAuNSkvKDErdC8yKSApCisgKiAgICAgIFsxMS8xNi4xOS8xNl0gYXRhbih4KSA9IGF0YW4oIDEgKSArIGF0YW4oICh0LTEpLygxK3QpICkKKyAqICAgICAgWzE5LzE2LDM5LzE2XSBhdGFuKHgpID0gYXRhbigzLzIpICsgYXRhbiggKHQtMS41KS8oMSsxLjV0KSApCisgKiAgICAgIFszOS8xNixJTkZdICAgYXRhbih4KSA9IGF0YW4oSU5GKSArIGF0YW4oIC0xL3QgKQorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBhdGFuaGlbXSA9IHsKKyAgNC42MzY0NzYwOTAwMDgwNjA5MzUxNWUtMDEsIC8qIGF0YW4oMC41KWhpIDB4M0ZEREFDNjcsIDB4MDU2MUJCNEYgKi8KKyAgNy44NTM5ODE2MzM5NzQ0ODI3ODk5OWUtMDEsIC8qIGF0YW4oMS4wKWhpIDB4M0ZFOTIxRkIsIDB4NTQ0NDJEMTggKi8KKyAgOS44Mjc5MzcyMzI0NzMyOTA1NDA4MmUtMDEsIC8qIGF0YW4oMS41KWhpIDB4M0ZFRjczMEIsIDB4RDI4MUY2OUIgKi8KKyAgMS41NzA3OTYzMjY3OTQ4OTY1NTgwMGUrMDAsIC8qIGF0YW4oaW5mKWhpIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgYXRhbmxvW10gPSB7CisgIDIuMjY5ODc3NzQ1Mjk2MTY4NzA5MjRlLTE3LCAvKiBhdGFuKDAuNSlsbyAweDNDN0EyQjdGLCAweDIyMkY2NUUyICovCisgIDMuMDYxNjE2OTk3ODY4MzgzMDE3OTNlLTE3LCAvKiBhdGFuKDEuMClsbyAweDNDODFBNjI2LCAweDMzMTQ1QzA3ICovCisgIDEuMzkwMzMxMTAzMTIzMDk5ODQ1MTZlLTE3LCAvKiBhdGFuKDEuNSlsbyAweDNDNzAwNzg4LCAweDdBRjBDQkJEICovCisgIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiBhdGFuKGluZilsbyAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIGFUW10gPSB7CisgIDMuMzMzMzMzMzMzMzMzMjkzMTgwMjdlLTAxLCAvKiAweDNGRDU1NTU1LCAweDU1NTU1NTBEICovCisgLTEuOTk5OTk5OTk5OTg3NjQ4MzI0NzZlLTAxLCAvKiAweEJGQzk5OTk5LCAweDk5OThFQkM0ICovCisgIDEuNDI4NTcxNDI3MjUwMzQ2NjM3MTFlLTAxLCAvKiAweDNGQzI0OTI0LCAweDkyMDA4M0ZGICovCisgLTEuMTExMTExMDQwNTQ2MjM1NTc4ODBlLTAxLCAvKiAweEJGQkM3MUM2LCAweEZFMjMxNjcxICovCisgIDkuMDkwODg3MTMzNDM2NTA2NTYxOTZlLTAyLCAvKiAweDNGQjc0NUNELCAweEM1NEMyMDZFICovCisgLTcuNjkxODc2MjA1MDQ0ODI5OTk0OTVlLTAyLCAvKiAweEJGQjNCMEYyLCAweEFGNzQ5QTZEICovCisgIDYuNjYxMDczMTM3Mzg3NTMxMjA2NjllLTAyLCAvKiAweDNGQjEwRDY2LCAweEEwRDAzRDUxICovCisgLTUuODMzNTcwMTMzNzkwNTczNDg2NDVlLTAyLCAvKiAweEJGQURERTJELCAweDUyREVGRDlBICovCisgIDQuOTc2ODc3OTk0NjE1OTMyMzYwMTdlLTAyLCAvKiAweDNGQTk3QjRCLCAweDI0NzYwREVCICovCisgLTMuNjUzMTU3Mjc0NDIxNjkxNTUyNzBlLTAyLCAvKiAweEJGQTJCNDQ0LCAweDJDNkE2QzJGICovCisgIDEuNjI4NTgyMDExNTM2NTc4MjM2MjNlLTAyLCAvKiAweDNGOTBBRDNBLCAweEUzMjJEQTExICovCit9OworCisJc3RhdGljIGNvbnN0IGRvdWJsZQorb25lICAgPSAxLjAsCitodWdlICAgPSAxLjBlMzAwOworCitkb3VibGUKK2F0YW4oZG91YmxlIHgpCit7CisJZG91YmxlIHcsczEsczIsejsKKwlpbnQzMl90IGl4LGh4LGlkOworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDQxMDAwMDApIHsJLyogaWYgfHh8ID49IDJeNjYgKi8KKwkgICAgdV9pbnQzMl90IGxvdzsKKwkgICAgR0VUX0xPV19XT1JEKGxvdyx4KTsKKwkgICAgaWYoaXg+MHg3ZmYwMDAwMHx8CisJCShpeD09MHg3ZmYwMDAwMCYmKGxvdyE9MCkpKQorCQlyZXR1cm4geCt4OwkJLyogTmFOICovCisJICAgIGlmKGh4PjApIHJldHVybiAgYXRhbmhpWzNdK2F0YW5sb1szXTsKKwkgICAgZWxzZSAgICAgcmV0dXJuIC1hdGFuaGlbM10tYXRhbmxvWzNdOworCX0gaWYgKGl4IDwgMHgzZmRjMDAwMCkgewkvKiB8eHwgPCAwLjQzNzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzZTIwMDAwMCkgewkvKiB8eHwgPCAyXi0yOSAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICB9CisJICAgIGlkID0gLTE7CisJfSBlbHNlIHsKKwl4ID0gZmFicyh4KTsKKwlpZiAoaXggPCAweDNmZjMwMDAwKSB7CQkvKiB8eHwgPCAxLjE4NzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzZmU2MDAwMCkgewkvKiA3LzE2IDw9fHh8PDExLzE2ICovCisJCWlkID0gMDsgeCA9ICgyLjAqeC1vbmUpLygyLjAreCk7CisJICAgIH0gZWxzZSB7CQkJLyogMTEvMTY8PXx4fDwgMTkvMTYgKi8KKwkJaWQgPSAxOyB4ICA9ICh4LW9uZSkvKHgrb25lKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmIChpeCA8IDB4NDAwMzgwMDApIHsJLyogfHh8IDwgMi40Mzc1ICovCisJCWlkID0gMjsgeCAgPSAoeC0xLjUpLyhvbmUrMS41KngpOworCSAgICB9IGVsc2UgewkJCS8qIDIuNDM3NSA8PSB8eHwgPCAyXjY2ICovCisJCWlkID0gMzsgeCAgPSAtMS4wL3g7CisJICAgIH0KKwl9fQorICAgIC8qIGVuZCBvZiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisgICAgLyogYnJlYWsgc3VtIGZyb20gaT0wIHRvIDEwIGFUW2ldeioqKGkrMSkgaW50byBvZGQgYW5kIGV2ZW4gcG9seSAqLworCXMxID0geiooYVRbMF0rdyooYVRbMl0rdyooYVRbNF0rdyooYVRbNl0rdyooYVRbOF0rdyphVFsxMF0pKSkpKTsKKwlzMiA9IHcqKGFUWzFdK3cqKGFUWzNdK3cqKGFUWzVdK3cqKGFUWzddK3cqYVRbOV0pKSkpOworCWlmIChpZDwwKSByZXR1cm4geCAtIHgqKHMxK3MyKTsKKwllbHNlIHsKKwkgICAgeiA9IGF0YW5oaVtpZF0gLSAoKHgqKHMxK3MyKSAtIGF0YW5sb1tpZF0pIC0geCk7CisJICAgIHJldHVybiAoaHg8MCk/IC16Ono7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19hdGFuZi5jIGIvbGlibS9zcmMvc19hdGFuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MGIzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2F0YW5mLmMKQEAgLTAsMCArMSw5OSBAQAorLyogc19hdGFuZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19hdGFuLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2F0YW5mLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBhdGFuaGlbXSA9IHsKKyAgNC42MzY0NzYwMzk5ZS0wMSwgLyogYXRhbigwLjUpaGkgMHgzZWVkNjMzOCAqLworICA3Ljg1Mzk4MTI1NjVlLTAxLCAvKiBhdGFuKDEuMCloaSAweDNmNDkwZmRhICovCisgIDkuODI3OTM2ODg3N2UtMDEsIC8qIGF0YW4oMS41KWhpIDB4M2Y3Yjk4NWUgKi8KKyAgMS41NzA3OTYyNTEzZSswMCwgLyogYXRhbihpbmYpaGkgMHgzZmM5MGZkYSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGF0YW5sb1tdID0geworICA1LjAxMjE1ODI0NDBlLTA5LCAvKiBhdGFuKDAuNSlsbyAweDMxYWMzNzY5ICovCisgIDMuNzc0ODk0NzA3OWUtMDgsIC8qIGF0YW4oMS4wKWxvIDB4MzMyMjIxNjggKi8KKyAgMy40NDczMjE3MTcwZS0wOCwgLyogYXRhbigxLjUpbG8gMHgzMzE0MGZiNCAqLworICA3LjU0OTc4OTQxNTllLTA4LCAvKiBhdGFuKGluZilsbyAweDMzYTIyMTY4ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgYVRbXSA9IHsKKyAgMy4zMzMzMzM0MzI3ZS0wMSwgLyogMHgzZWFhYWFhYSAqLworIC0yLjAwMDAwMDAyOThlLTAxLCAvKiAweGJlNGNjY2NkICovCisgIDEuNDI4NTcxNDkyNGUtMDEsIC8qIDB4M2UxMjQ5MjUgKi8KKyAtMS4xMTExMTEwNDQ5ZS0wMSwgLyogMHhiZGUzOGUzOCAqLworICA5LjA5MDg4NzAxMDFlLTAyLCAvKiAweDNkYmEyZTZlICovCisgLTcuNjkxODc1ODQ1MmUtMDIsIC8qIDB4YmQ5ZDg3OTUgKi8KKyAgNi42NjEwNzMxMTg0ZS0wMiwgLyogMHgzZDg4NmIzNSAqLworIC01LjgzMzU3MDI4NjZlLTAyLCAvKiAweGJkNmVmMTZiICovCisgIDQuOTc2ODc3OTQyN2UtMDIsIC8qIDB4M2Q0YmRhNTkgKi8KKyAtMy42NTMxNTcxMjk5ZS0wMiwgLyogMHhiZDE1YTIyMSAqLworICAxLjYyODU4MTk5MzNlLTAyLCAvKiAweDNjODU2OWQ3ICovCit9OworCisJc3RhdGljIGNvbnN0IGZsb2F0CitvbmUgICA9IDEuMCwKK2h1Z2UgICA9IDEuMGUzMDsKKworZmxvYXQKK2F0YW5mKGZsb2F0IHgpCit7CisJZmxvYXQgdyxzMSxzMix6OworCWludDMyX3QgaXgsaHgsaWQ7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NTA4MDAwMDApIHsJLyogaWYgfHh8ID49IDJeMzQgKi8KKwkgICAgaWYoaXg+MHg3ZjgwMDAwMCkKKwkJcmV0dXJuIHgreDsJCS8qIE5hTiAqLworCSAgICBpZihoeD4wKSByZXR1cm4gIGF0YW5oaVszXSthdGFubG9bM107CisJICAgIGVsc2UgICAgIHJldHVybiAtYXRhbmhpWzNdLWF0YW5sb1szXTsKKwl9IGlmIChpeCA8IDB4M2VlMDAwMDApIHsJLyogfHh8IDwgMC40Mzc1ICovCisJICAgIGlmIChpeCA8IDB4MzEwMDAwMDApIHsJLyogfHh8IDwgMl4tMjkgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJhaXNlIGluZXhhY3QgKi8KKwkgICAgfQorCSAgICBpZCA9IC0xOworCX0gZWxzZSB7CisJeCA9IGZhYnNmKHgpOworCWlmIChpeCA8IDB4M2Y5ODAwMDApIHsJCS8qIHx4fCA8IDEuMTg3NSAqLworCSAgICBpZiAoaXggPCAweDNmMzAwMDAwKSB7CS8qIDcvMTYgPD18eHw8MTEvMTYgKi8KKwkJaWQgPSAwOyB4ID0gKChmbG9hdCkyLjAqeC1vbmUpLygoZmxvYXQpMi4wK3gpOworCSAgICB9IGVsc2UgewkJCS8qIDExLzE2PD18eHw8IDE5LzE2ICovCisJCWlkID0gMTsgeCAgPSAoeC1vbmUpLyh4K29uZSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoaXggPCAweDQwMWMwMDAwKSB7CS8qIHx4fCA8IDIuNDM3NSAqLworCQlpZCA9IDI7IHggID0gKHgtKGZsb2F0KTEuNSkvKG9uZSsoZmxvYXQpMS41KngpOworCSAgICB9IGVsc2UgewkJCS8qIDIuNDM3NSA8PSB8eHwgPCAyXjY2ICovCisJCWlkID0gMzsgeCAgPSAtKGZsb2F0KTEuMC94OworCSAgICB9CisJfX0KKyAgICAvKiBlbmQgb2YgYXJndW1lbnQgcmVkdWN0aW9uICovCisJeiA9IHgqeDsKKwl3ID0geip6OworICAgIC8qIGJyZWFrIHN1bSBmcm9tIGk9MCB0byAxMCBhVFtpXXoqKihpKzEpIGludG8gb2RkIGFuZCBldmVuIHBvbHkgKi8KKwlzMSA9IHoqKGFUWzBdK3cqKGFUWzJdK3cqKGFUWzRdK3cqKGFUWzZdK3cqKGFUWzhdK3cqYVRbMTBdKSkpKSk7CisJczIgPSB3KihhVFsxXSt3KihhVFszXSt3KihhVFs1XSt3KihhVFs3XSt3KmFUWzldKSkpKTsKKwlpZiAoaWQ8MCkgcmV0dXJuIHggLSB4KihzMStzMik7CisJZWxzZSB7CisJICAgIHogPSBhdGFuaGlbaWRdIC0gKCh4KihzMStzMikgLSBhdGFubG9baWRdKSAtIHgpOworCSAgICByZXR1cm4gKGh4PDApPyAtejp6OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2JydC5jIGIvbGlibS9zcmMvc19jYnJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwMDY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2JydC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEAoIylzX2NicnQuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NicnQuYyx2IDEuMTAgMjAwNS8xMi8xMyAyMDoxNzoyMyBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIGNicnQoeCkKKyAqIFJldHVybiBjdWJlIHJvb3Qgb2YgeAorICovCitzdGF0aWMgY29uc3QgdV9pbnQzMl90CisJQjEgPSA3MTUwOTQxNjMsIC8qIEIxID0gKDEwMjMtMTAyMy8zLTAuMDMzMDYyMzU2NTEpKjIqKjIwICovCisJQjIgPSA2OTYyMTk3OTU7IC8qIEIyID0gKDEwMjMtMTAyMy8zLTU0LzMtMC4wMzMwNjIzNTY1MSkqMioqMjAgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQorQyA9ICA1LjQyODU3MTQyODU3MTQyODE1OTA2ZS0wMSwgLyogMTkvMzUgICAgID0gMHgzRkUxNUYxNSwgMHhGMTVGMTVGMSAqLworRCA9IC03LjA1MzA2MTIyNDQ4OTc5NjExMDUwZS0wMSwgLyogLTg2NC8xMjI1ID0gMHhCRkU2OTFERSwgMHgyNTMyQzgzNCAqLworRSA9ICAxLjQxNDI4NTcxNDI4NTcxNDM2ODE5ZSswMCwgLyogOTkvNzAgICAgID0gMHgzRkY2QTBFQSwgMHgwRUEwRUEwRiAqLworRiA9ICAxLjYwNzE0Mjg1NzE0Mjg1NzIwNjMwZSswMCwgLyogNDUvMjggICAgID0gMHgzRkY5QjZEQiwgMHg2REI2REI2RSAqLworRyA9ICAzLjU3MTQyODU3MTQyODU3MTUwNzg3ZS0wMTsgLyogNS8xNCAgICAgID0gMHgzRkQ2REI2RCwgMHhCNkRCNkRCNyAqLworCitkb3VibGUKK2NicnQoZG91YmxlIHgpCit7CisJaW50MzJfdAloeDsKKwlkb3VibGUgcixzLHQ9MC4wLHc7CisJdV9pbnQzMl90IHNpZ247CisJdV9pbnQzMl90IGhpZ2gsbG93OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlzaWduPWh4JjB4ODAwMDAwMDA7IAkJLyogc2lnbj0gc2lnbih4KSAqLworCWh4ICBePXNpZ247CisJaWYoaHg+PTB4N2ZmMDAwMDApIHJldHVybih4K3gpOyAvKiBjYnJ0KE5hTixJTkYpIGlzIGl0c2VsZiAqLworCUdFVF9MT1dfV09SRChsb3cseCk7CisJaWYoKGh4fGxvdyk9PTApCisJICAgIHJldHVybih4KTsJCS8qIGNicnQoMCkgaXMgaXRzZWxmICovCisKKyAgICAvKgorICAgICAqIFJvdWdoIGNicnQgdG8gNSBiaXRzOgorICAgICAqICAgIGNicnQoMioqZSooMSttKSB+PSAyKiooZS8zKSooMSsoZSUzK20pLzMpCisgICAgICogd2hlcmUgZSBpcyBpbnRlZ3JhbCBhbmQgPj0gMCwgbSBpcyByZWFsIGFuZCBpbiBbMCwgMSksIGFuZCAiLyIgYW5kCisgICAgICogIiUiIGFyZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCBtb2R1bHVzIHdpdGggcm91bmRpbmcgdG93YXJkcyBtaW51cworICAgICAqIGluZmluaXR5LiAgVGhlIFJIUyBpcyBhbHdheXMgPj0gdGhlIExIUyBhbmQgaGFzIGEgbWF4aW11bSByZWxhdGl2ZQorICAgICAqIGVycm9yIG9mIGFib3V0IDEgaW4gMTYuICBBZGRpbmcgYSBiaWFzIG9mIC0wLjAzMzA2MjM1NjUxIHRvIHRoZQorICAgICAqIChlJTMrbSkvMyB0ZXJtIHJlZHVjZXMgdGhlIGVycm9yIHRvIGFib3V0IDEgaW4gMzIuIFdpdGggdGhlIElFRUUKKyAgICAgKiBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbiwgZm9yIGZpbml0ZSBwb3NpdGl2ZSBub3JtYWwgdmFsdWVzLAorICAgICAqIG9yZGluYXJ5IGludGVnZXIgZGl2aXNvbiBvZiB0aGUgdmFsdWUgaW4gYml0cyBtYWdpY2FsbHkgZ2l2ZXMKKyAgICAgKiBhbG1vc3QgZXhhY3RseSB0aGUgUkhTIG9mIHRoZSBhYm92ZSBwcm92aWRlZCB3ZSBmaXJzdCBzdWJ0cmFjdCB0aGUKKyAgICAgKiBleHBvbmVudCBiaWFzICgxMDIzIGZvciBkb3VibGVzKSBhbmQgbGF0ZXIgYWRkIGl0IGJhY2suICBXZSBkbyB0aGUKKyAgICAgKiBzdWJ0cmFjdGlvbiB2aXJ0dWFsbHkgdG8ga2VlcCBlID49IDAgc28gdGhhdCBvcmRpbmFyeSBpbnRlZ2VyCisgICAgICogZGl2aXNpb24gcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHk7IHRoaXMgaXMgYWxzbyBlZmZpY2llbnQuCisgICAgICovCisJaWYoaHg8MHgwMDEwMDAwMCkgeyAJCS8qIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgU0VUX0hJR0hfV09SRCh0LDB4NDM1MDAwMDApOyAvKiBzZXQgdD0gMioqNTQgKi8KKwkgICAgdCo9eDsKKwkgICAgR0VUX0hJR0hfV09SRChoaWdoLHQpOworCSAgICBTRVRfSElHSF9XT1JEKHQsc2lnbnwoKGhpZ2gmMHg3ZmZmZmZmZikvMytCMikpOworCX0gZWxzZQorCSAgICBTRVRfSElHSF9XT1JEKHQsc2lnbnwoaHgvMytCMSkpOworCisgICAgLyogbmV3IGNicnQgdG8gMjMgYml0czsgbWF5IGJlIGltcGxlbWVudGVkIGluIHNpbmdsZSBwcmVjaXNpb24gKi8KKwlyPXQqdC94OworCXM9QytyKnQ7CisJdCo9RytGLyhzK0UrRC9zKTsKKworICAgIC8qIGNob3AgdCB0byAyMCBiaXRzIGFuZCBtYWtlIGl0IGxhcmdlciBpbiBtYWduaXR1ZGUgdGhhbiBjYnJ0KHgpICovCisJR0VUX0hJR0hfV09SRChoaWdoLHQpOworCUlOU0VSVF9XT1JEUyh0LGhpZ2grMHgwMDAwMDAwMSwwKTsKKworICAgIC8qIG9uZSBzdGVwIE5ld3RvbiBpdGVyYXRpb24gdG8gNTMgYml0cyB3aXRoIGVycm9yIGxlc3MgdGhhbiAwLjY2NyB1bHBzICovCisJcz10KnQ7CQkvKiB0KnQgaXMgZXhhY3QgKi8KKwlyPXgvczsKKwl3PXQrdDsKKwlyPShyLXQpLyh3K3IpOwkvKiByLXQgaXMgZXhhY3QgKi8KKwl0PXQrdCpyOworCisJcmV0dXJuKHQpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jYnJ0Zi5jIGIvbGlibS9zcmMvc19jYnJ0Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTY5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NicnRmLmMKQEAgLTAsMCArMSw3OSBAQAorLyogc19jYnJ0Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jYnJ0LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIERlYnVnZ2VkIGFuZCBvcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jYnJ0Zi5jLHYgMS4xMiAyMDA1LzEyLzEzIDIwOjE3OjIzIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogY2JydGYoeCkKKyAqIFJldHVybiBjdWJlIHJvb3Qgb2YgeAorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQKKwlCMSA9IDcwOTk1ODEzMCwgLyogQjEgPSAoMTI3LTEyNy4wLzMtMC4wMzMwNjIzNTY1MSkqMioqMjMgKi8KKwlCMiA9IDY0Mjg0OTI2NjsgLyogQjIgPSAoMTI3LTEyNy4wLzMtMjQvMy0wLjAzMzA2MjM1NjUxKSoyKioyMyAqLworCitzdGF0aWMgY29uc3QgZmxvYXQKK0MgPSAgNS40Mjg1NzE3MDEwZS0wMSwgLyogMTkvMzUgICAgID0gMHgzZjBhZjhiMCAqLworRCA9IC03LjA1MzA2MTEyNzdlLTAxLCAvKiAtODY0LzEyMjUgPSAweGJmMzQ4ZWYxICovCitFID0gIDEuNDE0Mjg1NjU5OGUrMDAsIC8qIDk5LzcwICAgICA9IDB4M2ZiNTA3NTAgKi8KK0YgPSAgMS42MDcxNDI4MDYxZSswMCwgLyogNDUvMjggICAgID0gMHgzZmNkYjZkYiAqLworRyA9ICAzLjU3MTQyODY1NjZlLTAxOyAvKiA1LzE0ICAgICAgPSAweDNlYjZkYjZlICovCisKK2Zsb2F0CitjYnJ0ZihmbG9hdCB4KQoreworCWZsb2F0IHIscyx0LHc7CisJaW50MzJfdCBoeDsKKwl1X2ludDMyX3Qgc2lnbjsKKwl1X2ludDMyX3QgaGlnaDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCXNpZ249aHgmMHg4MDAwMDAwMDsgCQkvKiBzaWduPSBzaWduKHgpICovCisJaHggIF49c2lnbjsKKwlpZihoeD49MHg3ZjgwMDAwMCkgcmV0dXJuKHgreCk7IC8qIGNicnQoTmFOLElORikgaXMgaXRzZWxmICovCisJaWYoaHg9PTApCisJICAgIHJldHVybih4KTsJCS8qIGNicnQoMCkgaXMgaXRzZWxmICovCisKKyAgICAvKiByb3VnaCBjYnJ0IHRvIDUgYml0cyAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsgCQkvKiBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHQsMHg0YjgwMDAwMCk7IC8qIHNldCB0PSAyKioyNCAqLworCSAgICB0Kj14OworCSAgICBHRVRfRkxPQVRfV09SRChoaWdoLHQpOworCSAgICBTRVRfRkxPQVRfV09SRCh0LHNpZ258KChoaWdoJjB4N2ZmZmZmZmYpLzMrQjIpKTsKKwl9IGVsc2UKKwkgICAgU0VUX0ZMT0FUX1dPUkQodCxzaWdufChoeC8zK0IxKSk7CisKKyAgICAvKiBuZXcgY2JydCB0byAyMyBiaXRzICovCisJcj10KnQveDsKKwlzPUMrcip0OworCXQqPUcrRi8ocytFK0Qvcyk7CisKKyAgICAvKiBjaG9wIHQgdG8gMTIgYml0cyBhbmQgbWFrZSBpdCBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gY2JydCh4KSAqLworCUdFVF9GTE9BVF9XT1JEKGhpZ2gsdCk7CisJU0VUX0ZMT0FUX1dPUkQodCwoaGlnaCYweGZmZmZmMDAwKSsweDAwMDAxMDAwKTsKKworICAgIC8qIG9uZSBzdGVwIE5ld3RvbiBpdGVyYXRpb24gdG8gMjQgYml0cyB3aXRoIGVycm9yIGxlc3MgdGhhbiAwLjY2NyB1bHBzICovCisJcz10KnQ7CQkvKiB0KnQgaXMgZXhhY3QgKi8KKwlyPXgvczsKKwl3PXQrdDsKKwlyPShyLXQpLyh3K3IpOwkvKiByLXQgaXMgZXhhY3QgKi8KKwl0PXQrdCpyOworCisJcmV0dXJuKHQpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jZWlsLmMgYi9saWJtL3NyYy9zX2NlaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jZWlsLmMKQEAgLTAsMCArMSw3MiBAQAorLyogQCgjKXNfY2VpbC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jZWlsLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGNlaWwoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGNlaWwoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworZG91YmxlCitjZWlsKGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGksajsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA8MCkge2kwPTB4ODAwMDAwMDA7aTE9MDt9CisJCSAgICBlbHNlIGlmKChpMHxpMSkhPTApIHsgaTA9MHgzZmYwMDAwMDtpMT0wO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMD4wKSBpMCArPSAoMHgwMDEwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsgaTE9MDsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpZihodWdlK3g+MC4wKSB7IAkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCWlmKGkwPjApIHsKKwkJICAgIGlmKGowPT0yMCkgaTArPTE7CisJCSAgICBlbHNlIHsKKwkJCWogPSBpMSArICgxPDwoNTItajApKTsKKwkJCWlmKGo8aTEpIGkwKz0xOwkvKiBnb3QgYSBjYXJyeSAqLworCQkJaTEgPSBqOworCQkgICAgfQorCQl9CisJCWkxICY9ICh+aSk7CisJICAgIH0KKwl9CisJSU5TRVJUX1dPUkRTKHgsaTAsaTEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jZWlsZi5jIGIvbGlibS9zcmMvc19jZWlsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NlaWxmLmMKQEAgLTAsMCArMSw1MyBAQAorLyogc19jZWlsZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jZWlsLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NlaWxmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBodWdlID0gMS4wZTMwOworCitmbG9hdAorY2VpbGYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGkwLGowOworCXVfaW50MzJfdCBpOworCisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsKKwlpZihqMDwyMykgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgey8qIHJldHVybiAwKnNpZ24oeCkgaWYgfHh8PDEgKi8KKwkJICAgIGlmKGkwPDApIHtpMD0weDgwMDAwMDAwO30KKwkJICAgIGVsc2UgaWYoaTAhPTApIHsgaTA9MHgzZjgwMDAwMDt9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwN2ZmZmZmKT4+ajA7CisJCWlmKChpMCZpKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PihmbG9hdCkwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMD4wKSBpMCArPSAoMHgwMDgwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxpMCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NlaWxsLmMgYi9saWJtL3NyYy9zX2NlaWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4ODE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2VpbGwuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBGcm9tOiBAKCMpc19jZWlsLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2VpbGwuYyx2IDEuNCAyMDA1LzA0LzI4IDE5OjQ1OjU1IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjZWlsbCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gY2VpbGwoeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCU1BTkhfU0laRQlMREJMX01BTkhfU0laRQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pIHsJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorCQl1LmJpdHMubWFuaCB8PSAxbGx1IDw8IChMREJMX01BTkhfU0laRSAtIDEpOwlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworbG9uZyBkb3VibGUKK2NlaWxsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1ID0geyAuZSA9IHggfTsKKwlpbnQgZSA9IHUuYml0cy5leHAgLSBMREJMX01BWF9FWFAgKyAxOworCisJaWYgKGUgPCBNQU5IX1NJWkUgLSAxKSB7CisJCWlmIChlIDwgMCkgewkJCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCQlpZiAoaHVnZSArIHggPiAwLjApCisJCQkJaWYgKHUuYml0cy5leHAgPiAwIHx8CisJCQkJICAgICh1LmJpdHMubWFuaCB8IHUuYml0cy5tYW5sKSAhPSAwKQorCQkJCQl1LmUgPSB1LmJpdHMuc2lnbiA/IDAuMCA6IDEuMDsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ2NF90IG0gPSAoKDFsbHUgPDwgTUFOSF9TSVpFKSAtIDEpID4+IChlICsgMSk7CisJCQlpZiAoKCh1LmJpdHMubWFuaCAmIG0pIHwgdS5iaXRzLm1hbmwpID09IDApCisJCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkJaWYgKCF1LmJpdHMuc2lnbikgeworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorCQkJCWlmIChlID09IDApCisJCQkJCXUuYml0cy5leHArKzsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQlJTkNfTUFOSCh1LCAxbGx1IDw8IChNQU5IX1NJWkUgLSBlIC0gMSkpOworCQkJfQorCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJCXUuYml0cy5tYW5oICY9IH5tOworCQkJCXUuYml0cy5tYW5sID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZSA8IExEQkxfTUFOVF9ESUcgLSAxKSB7CisJCXVpbnQ2NF90IG0gPSAodWludDY0X3QpLTEgPj4gKDY0IC0gTERCTF9NQU5UX0RJRyArIGUgKyAxKTsKKwkJaWYgKCh1LmJpdHMubWFubCAmIG0pID09IDApCisJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCWlmICghdS5iaXRzLnNpZ24pIHsKKwkJCWlmIChlID09IE1BTkhfU0laRSAtIDEpCisJCQkJSU5DX01BTkgodSwgMSk7CisJCQllbHNlIHsKKwkJCQl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmw7CisJCQkJdS5iaXRzLm1hbmwgKz0gMWxsdSA8PCAoTERCTF9NQU5UX0RJRyAtIGUgLSAxKTsKKwkJCQlpZiAodS5iaXRzLm1hbmwgPCBvKQkvKiBnb3QgYSBjYXJyeSAqLworCQkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NpbWFnLmMgYi9saWJtL3NyYy9zX2NpbWFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2ltYWcuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jaW1hZy5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2RvdWJsZQorY2ltYWcoZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gLXogKiBJOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jaW1hZ2YuYyBiL2xpYm0vc3JjL3NfY2ltYWdmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwZjUzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2ltYWdmLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2ltYWdmLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZmxvYXQKK2NpbWFnZihmbG9hdCBjb21wbGV4IHopCit7CisJcmV0dXJuIC16ICogSTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2ltYWdsLmMgYi9saWJtL3NyYy9zX2NpbWFnbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzY3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NpbWFnbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NpbWFnbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2xvbmcgZG91YmxlCitjaW1hZ2wobG9uZyBkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiAteiAqIEk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvbmouYyBiL2xpYm0vc3JjL3NfY29uai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2ExNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvbmouYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb25qLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZG91YmxlIGNvbXBsZXgKK2NvbmooZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gY3JlYWwoeikgLSBJICogY2ltYWcoeik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvbmpmLmMgYi9saWJtL3NyYy9zX2NvbmpmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlMDM5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29uamYuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb25qZi5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2Zsb2F0IGNvbXBsZXgKK2NvbmpmKGZsb2F0IGNvbXBsZXggeikKK3sKKwlyZXR1cm4gY3JlYWxmKHopIC0gSSAqIGNpbWFnZih6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29uamwuYyBiL2xpYm0vc3JjL3NfY29uamwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q4MGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb25qbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvbmpsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworbG9uZyBkb3VibGUgY29tcGxleAorY29uamwobG9uZyBkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiBjcmVhbGwoeikgLSBJICogY2ltYWdsKHopOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3B5c2lnbi5jIGIvbGlibS9zcmMvc19jb3B5c2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2JlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWduLmMKQEAgLTAsMCArMSwzNCBAQAorLyogQCgjKXNfY29weXNpZ24uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29weXNpZ24uYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQorICogY29weXNpZ24oeCx5KSByZXR1cm5zIGEgdmFsdWUgd2l0aCB0aGUgbWFnbml0dWRlIG9mIHggYW5kCisgKiB3aXRoIHRoZSBzaWduIGJpdCBvZiB5LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQoreworCXVfaW50MzJfdCBoeCxoeTsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCUdFVF9ISUdIX1dPUkQoaHkseSk7CisJU0VUX0hJR0hfV09SRCh4LChoeCYweDdmZmZmZmZmKXwoaHkmMHg4MDAwMDAwMCkpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29weXNpZ25mLmMgYi9saWJtL3NyYy9zX2NvcHlzaWduZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzQ0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWduZi5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIHNfY29weXNpZ25mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2NvcHlzaWduLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvcHlzaWduZi5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjb3B5c2lnbmYoZmxvYXQgeCwgZmxvYXQgeSkKKyAqIGNvcHlzaWduZih4LHkpIHJldHVybnMgYSB2YWx1ZSB3aXRoIHRoZSBtYWduaXR1ZGUgb2YgeCBhbmQKKyAqIHdpdGggdGhlIHNpZ24gYml0IG9mIHkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2NvcHlzaWduZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVfaW50MzJfdCBpeCxpeTsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlHRVRfRkxPQVRfV09SRChpeSx5KTsKKwlTRVRfRkxPQVRfV09SRCh4LChpeCYweDdmZmZmZmZmKXwoaXkmMHg4MDAwMDAwMCkpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29weXNpZ25sLmMgYi9saWJtL3NyYy9zX2NvcHlzaWdubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWJkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWdubC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvcHlzaWdubC5jLHYgMS4xIDIwMDQvMDUvMDcgMTg6NTY6MzEgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2NvcHlzaWdubChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdXgsIHV5OworCisJdXguZSA9IHg7CisJdXkuZSA9IHk7CisJdXguYml0cy5zaWduID0gdXkuYml0cy5zaWduOworCXJldHVybiAodXguZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Nvcy5jIGIvbGlibS9zcmMvc19jb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFmOTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3MuYwpAQCAtMCwwICsxLDgyIEBACisvKiBAKCMpc19jb3MuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29zLmMsdiAxLjEwIDIwMDUvMTAvMjQgMTQ6MDg6MzYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBjb3MoeCkKKyAqIFJldHVybiBjb3NpbmUgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBrZXJuZWwgZnVuY3Rpb246CisgKglfX2tlcm5lbF9zaW4JCS4uLiBzaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19rZXJuZWxfY29zCQkuLi4gY29zaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19pZWVlNzU0X3JlbV9waW8yCS4uLiBhcmd1bWVudCByZWR1Y3Rpb24gcm91dGluZQorICoKKyAqIE1ldGhvZC4KKyAqICAgICAgTGV0IFMsQyBhbmQgVCBkZW5vdGUgdGhlIHNpbiwgY29zIGFuZCB0YW4gcmVzcGVjdGl2ZWx5IG9uCisgKglbLVBJLzQsICtQSS80XS4gUmVkdWNlIHRoZSBhcmd1bWVudCB4IHRvIHkxK3kyID0geC1rKnBpLzIKKyAqCWluIFstcGkvNCAsICtwaS80XSwgYW5kIGxldCBuID0gayBtb2QgNC4KKyAqCVdlIGhhdmUKKyAqCisgKiAgICAgICAgICBuICAgICAgICBzaW4oeCkgICAgICBjb3MoeCkgICAgICAgIHRhbih4KQorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAwCSAgICAgICBTCSAgIEMJCSBUCisgKgkgICAgMQkgICAgICAgQwkgIC1TCQktMS9UCisgKgkgICAgMgkgICAgICAtUwkgIC1DCQkgVAorICoJICAgIDMJICAgICAgLUMJICAgUwkJLTEvVAorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICogICAgICBMZXQgdHJpZyBiZSBhbnkgb2Ygc2luLCBjb3MsIG9yIHRhbi4KKyAqICAgICAgdHJpZygrLUlORikgIGlzIE5hTiwgd2l0aCBzaWduYWxzOworICogICAgICB0cmlnKE5hTikgICAgaXMgdGhhdCBOYU47CisgKgorICogQWNjdXJhY3k6CisgKglUUklHKHgpIHJldHVybnMgdHJpZyh4KSBuZWFybHkgcm91bmRlZAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorY29zKGRvdWJsZSB4KQoreworCWRvdWJsZSB5WzJdLHo9MC4wOworCWludDMyX3QgbiwgaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgeC4gKi8KKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCisgICAgLyogfHh8IH48IHBpLzQgKi8KKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4IDw9IDB4M2ZlOTIxZmIpIHsKKwkgICAgaWYoaXg8MHgzZTQwMDAwMCkJCQkvKiBpZiB4IDwgMioqLTI3ICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4gMS4wOwkvKiBnZW5lcmF0ZSBpbmV4YWN0ICovCisJICAgIHJldHVybiBfX2tlcm5lbF9jb3MoeCx6KTsKKwl9CisKKyAgICAvKiBjb3MoSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJCWNhc2UgMTogcmV0dXJuIC1fX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCQljYXNlIDI6IHJldHVybiAtX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJCWRlZmF1bHQ6CisJCSAgICAgICAgcmV0dXJuICBfX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3NmLmMgYi9saWJtL3NyYy9zX2Nvc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFkYWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3NmLmMKQEAgLTAsMCArMSw4NCBAQAorLyogc19jb3NmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2Nvcy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3NmLmMsdiAxLjE1IDIwMDUvMTEvMzAgMDY6NDc6MTggYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX0NPU0RGCisjZGVmaW5lCUlOTElORV9LRVJORUxfU0lOREYKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJrX2Nvc2YuYyIKKyNpbmNsdWRlICJrX3NpbmYuYyIKKworLyogU21hbGwgbXVsdGlwbGVzIG9mIHBpLzIgcm91bmRlZCB0byBkb3VibGUgcHJlY2lzaW9uLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorYzFwaW8yID0gMSpNX1BJXzIsCQkJLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworYzJwaW8yID0gMipNX1BJXzIsCQkJLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworYzNwaW8yID0gMypNX1BJXzIsCQkJLyogMHg0MDEyRDk3QywgMHg3RjMzMjFEMiAqLworYzRwaW8yID0gNCpNX1BJXzI7CQkJLyogMHg0MDE5MjFGQiwgMHg1NDQ0MkQxOCAqLworCitmbG9hdAorY29zZihmbG9hdCB4KQoreworCWZsb2F0IHlbMl07CisJaW50MzJfdCBuLCBoeCwgaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsKKworCWlmKGl4IDw9IDB4M2Y0OTBmZGEpIHsJCS8qIHx4fCB+PD0gcGkvNCAqLworCSAgICBpZihpeDwweDM5ODAwMDAwKQkJLyogfHh8IDwgMioqLTEyICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4gMS4wOwkvKiAxIHdpdGggaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHgpOworCX0KKwlpZihpeDw9MHg0MDdiNTNkMSkgewkJLyogfHh8IH48PSA1KnBpLzQgKi8KKwkgICAgaWYoaXg+MHg0MDE2Y2JlMykJCS8qIHx4fCAgfj4gMypwaS80ICovCisJCXJldHVybiAtX19rZXJuZWxfY29zZGYoeCArIChoeCA+IDAgPyAtYzJwaW8yIDogYzJwaW8yKSk7CisJICAgIGVsc2UgeworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKGMxcGlvMiAtIHgpOworCQllbHNlCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoeCArIGMxcGlvMik7CisJICAgIH0KKwl9CisJaWYoaXg8PTB4NDBlMjMxZDUpIHsJCS8qIHx4fCB+PD0gOSpwaS80ICovCisJICAgIGlmKGl4PjB4NDBhZmVkZGYpCQkvKiB8eHwgIH4+IDcqcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfY29zZGYoeCArIChoeCA+IDAgPyAtYzRwaW8yIDogYzRwaW8yKSk7CisJICAgIGVsc2UgeworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHggLSBjM3BpbzIpOworCQllbHNlCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoLWMzcGlvMiAtIHgpOworCSAgICB9CisJfQorCisgICAgLyogY29zKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogZ2VuZXJhbCBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzJmKHgseSk7CisJICAgIHN3aXRjaChuJjMpIHsKKwkJY2FzZSAwOiByZXR1cm4gIF9fa2VybmVsX2Nvc2RmKChkb3VibGUpeVswXSt5WzFdKTsKKwkJY2FzZSAxOiByZXR1cm4gIF9fa2VybmVsX3NpbmRmKC0oZG91YmxlKXlbMF0teVsxXSk7CisJCWNhc2UgMjogcmV0dXJuIC1fX2tlcm5lbF9jb3NkZigoZG91YmxlKXlbMF0reVsxXSk7CisJCWRlZmF1bHQ6CisJCSAgICAgICAgcmV0dXJuICBfX2tlcm5lbF9zaW5kZigoZG91YmxlKXlbMF0reVsxXSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NyZWFsLmMgYi9saWJtL3NyYy9zX2NyZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNGNkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY3JlYWwuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jcmVhbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2RvdWJsZQorY3JlYWwoZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY3JlYWxmLmMgYi9saWJtL3NyYy9zX2NyZWFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzE1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NyZWFsZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NyZWFsZi5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2Zsb2F0CitjcmVhbGYoZmxvYXQgY29tcGxleCB6KQoreworCXJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jcmVhbGwuYyBiL2xpYm0vc3JjL3NfY3JlYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMWQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY3JlYWxsLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY3JlYWxsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworbG9uZyBkb3VibGUKK2NyZWFsbChsb25nIGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2VyZi5jIGIvbGlibS9zcmMvc19lcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19lcmYuYwpAQCAtMCwwICsxLDMwMiBAQAorLyogQCgjKXNfZXJmLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2VyZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBkb3VibGUgZXJmKGRvdWJsZSB4KQorICogZG91YmxlIGVyZmMoZG91YmxlIHgpCisgKgkJCSAgICAgeAorICoJCSAgICAgIDIgICAgICB8XAorICogICAgIGVyZih4KSAgPSAgLS0tLS0tLS0tICB8IGV4cCgtdCp0KWR0CisgKgkgCSAgIHNxcnQocGkpIFx8CisgKgkJCSAgICAgMAorICoKKyAqICAgICBlcmZjKHgpID0gIDEtZXJmKHgpCisgKiAgTm90ZSB0aGF0CisgKgkJZXJmKC14KSA9IC1lcmYoeCkKKyAqCQllcmZjKC14KSA9IDIgLSBlcmZjKHgpCisgKgorICogTWV0aG9kOgorICoJMS4gRm9yIHx4fCBpbiBbMCwgMC44NDM3NV0KKyAqCSAgICBlcmYoeCkgID0geCArIHgqUih4XjIpCisgKiAgICAgICAgICBlcmZjKHgpID0gMSAtIGVyZih4KSAgICAgICAgICAgaWYgeCBpbiBbLS44NDM3NSwwLjI1XQorICogICAgICAgICAgICAgICAgICA9IDAuNSArICgoMC41LXgpLXgqUikgIGlmIHggaW4gWzAuMjUsMC44NDM3NV0KKyAqCSAgIHdoZXJlIFIgPSBQL1Egd2hlcmUgUCBpcyBhbiBvZGQgcG9seSBvZiBkZWdyZWUgOCBhbmQKKyAqCSAgIFEgaXMgYW4gb2RkIHBvbHkgb2YgZGVncmVlIDEwLgorICoJCQkJCQkgLTU3LjkwCisgKgkJCXwgUiAtIChlcmYoeCkteCkveCB8IDw9IDIKKyAqCisgKgorICoJICAgUmVtYXJrLiBUaGUgZm9ybXVsYSBpcyBkZXJpdmVkIGJ5IG5vdGluZworICogICAgICAgICAgZXJmKHgpID0gKDIvc3FydChwaSkpKih4IC0geF4zLzMgKyB4XjUvMTAgLSB4XjcvNDIgKyAuLi4uKQorICoJICAgYW5kIHRoYXQKKyAqICAgICAgICAgIDIvc3FydChwaSkgPSAxLjEyODM3OTE2NzA5NTUxMjU3Mzg5NjE1ODkwMzEyMTU0NTE3MTY4OAorICoJICAgaXMgY2xvc2UgdG8gb25lLiBUaGUgaW50ZXJ2YWwgaXMgY2hvc2VuIGJlY2F1c2UgdGhlIGZpeAorICoJICAgcG9pbnQgb2YgZXJmKHgpIGlzIG5lYXIgMC42MTc0IChpLmUuLCBlcmYoeCk9eCB3aGVuIHggaXMKKyAqCSAgIG5lYXIgMC42MTc0KSwgYW5kIGJ5IHNvbWUgZXhwZXJpbWVudCwgMC44NDM3NSBpcyBjaG9zZW4gdG8KKyAqIAkgICBndWFyYW50ZWUgdGhlIGVycm9yIGlzIGxlc3MgdGhhbiBvbmUgdWxwIGZvciBlcmYuCisgKgorICogICAgICAyLiBGb3IgfHh8IGluIFswLjg0Mzc1LDEuMjVdLCBsZXQgcyA9IHx4fCAtIDEsIGFuZAorICogICAgICAgICBjID0gMC44NDUwNjI5MTE1MSByb3VuZGVkIHRvIHNpbmdsZSAoMjQgYml0cykKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpICogKGMgICsgUDEocykvUTEocykpCisgKiAgICAgICAgIAllcmZjKHgpID0gKDEtYykgIC0gUDEocykvUTEocykgaWYgeCA+IDAKKyAqCQkJICAxKyhjK1AxKHMpL1ExKHMpKSAgICBpZiB4IDwgMAorICogICAgICAgICAJfFAxL1ExIC0gKGVyZih8eHwpLWMpfCA8PSAyKiotNTkuMDYKKyAqCSAgIFJlbWFyazogaGVyZSB3ZSB1c2UgdGhlIHRheWxvciBzZXJpZXMgZXhwYW5zaW9uIGF0IHg9MS4KKyAqCQllcmYoMStzKSA9IGVyZigxKSArIHMqUG9seShzKQorICoJCQkgPSAwLjg0NS4uICsgUDEocykvUTEocykKKyAqCSAgIFRoYXQgaXMsIHdlIHVzZSByYXRpb25hbCBhcHByb3hpbWF0aW9uIHRvIGFwcHJveGltYXRlCisgKgkJCWVyZigxK3MpIC0gKGMgPSAoc2luZ2xlKTAuODQ1MDYyOTExNTEpCisgKgkgICBOb3RlIHRoYXQgfFAxL1ExfDwgMC4wNzggZm9yIHggaW4gWzAuODQzNzUsMS4yNV0KKyAqCSAgIHdoZXJlCisgKgkJUDEocykgPSBkZWdyZWUgNiBwb2x5IGluIHMKKyAqCQlRMShzKSA9IGRlZ3JlZSA2IHBvbHkgaW4gcworICoKKyAqICAgICAgMy4gRm9yIHggaW4gWzEuMjUsMS8wLjM1KH4yLjg1NzE0MyldLAorICogICAgICAgICAJZXJmYyh4KSA9ICgxL3gpKmV4cCgteCp4LTAuNTYyNStSMS9TMSkKKyAqICAgICAgICAgCWVyZih4KSAgPSAxIC0gZXJmYyh4KQorICoJICAgd2hlcmUKKyAqCQlSMSh6KSA9IGRlZ3JlZSA3IHBvbHkgaW4geiwgKHo9MS94XjIpCisgKgkJUzEoeikgPSBkZWdyZWUgOCBwb2x5IGluIHoKKyAqCisgKiAgICAgIDQuIEZvciB4IGluIFsxLzAuMzUsMjhdCisgKiAgICAgICAgIAllcmZjKHgpID0gKDEveCkqZXhwKC14KngtMC41NjI1K1IyL1MyKSBpZiB4ID4gMAorICoJCQk9IDIuMCAtICgxL3gpKmV4cCgteCp4LTAuNTYyNStSMi9TMikgaWYgLTY8eDwwCisgKgkJCT0gMi4wIC0gdGlueQkJKGlmIHggPD0gLTYpCisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSooMS4wIC0gZXJmYyh4KSkgaWYgeCA8IDYsIGVsc2UKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpKigxLjAgLSB0aW55KQorICoJICAgd2hlcmUKKyAqCQlSMih6KSA9IGRlZ3JlZSA2IHBvbHkgaW4geiwgKHo9MS94XjIpCisgKgkJUzIoeikgPSBkZWdyZWUgNyBwb2x5IGluIHoKKyAqCisgKiAgICAgIE5vdGUxOgorICoJICAgVG8gY29tcHV0ZSBleHAoLXgqeC0wLjU2MjUrUi9TKSwgbGV0IHMgYmUgYSBzaW5nbGUKKyAqCSAgIHByZWNpc2lvbiBudW1iZXIgYW5kIHMgOj0geDsgdGhlbgorICoJCS14KnggPSAtcypzICsgKHMteCkqKHMreCkKKyAqCSAgICAgICAgZXhwKC14KngtMC41NjI2K1IvUykgPQorICoJCQlleHAoLXMqcy0wLjU2MjUpKmV4cCgocy14KSoocyt4KStSL1MpOworICogICAgICBOb3RlMjoKKyAqCSAgIEhlcmUgNCBhbmQgNSBtYWtlIHVzZSBvZiB0aGUgYXN5bXB0b3RpYyBzZXJpZXMKKyAqCQkJICBleHAoLXgqeCkKKyAqCQllcmZjKHgpIH4gLS0tLS0tLS0tLSAqICggMSArIFBvbHkoMS94XjIpICkKKyAqCQkJICB4KnNxcnQocGkpCisgKgkgICBXZSB1c2UgcmF0aW9uYWwgYXBwcm94aW1hdGlvbiB0byBhcHByb3hpbWF0ZQorICogICAgICAJZyhzKT1mKDEveF4yKSA9IGxvZyhlcmZjKHgpKngpIC0geCp4ICsgMC41NjI1CisgKgkgICBIZXJlIGlzIHRoZSBlcnJvciBib3VuZCBmb3IgUjEvUzEgYW5kIFIyL1MyCisgKiAgICAgIAl8UjEvUzEgLSBmKHgpfCAgPCAyKiooLTYyLjU3KQorICogICAgICAJfFIyL1MyIC0gZih4KXwgIDwgMioqKC02MS41MikKKyAqCisgKiAgICAgIDUuIEZvciBpbmYgPiB4ID49IDI4CisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSAqKDEgLSB0aW55KSAgKHJhaXNlIGluZXhhY3QpCisgKiAgICAgICAgIAllcmZjKHgpID0gdGlueSp0aW55IChyYWlzZSB1bmRlcmZsb3cpIGlmIHggPiAwCisgKgkJCT0gMiAtIHRpbnkgaWYgeDwwCisgKgorICogICAgICA3LiBTcGVjaWFsIGNhc2U6CisgKiAgICAgICAgIAllcmYoMCkgID0gMCwgZXJmKGluZikgID0gMSwgZXJmKC1pbmYpID0gLTEsCisgKiAgICAgICAgIAllcmZjKDApID0gMSwgZXJmYyhpbmYpID0gMCwgZXJmYygtaW5mKSA9IDIsCisgKgkgICAJZXJmYy9lcmYoTmFOKSBpcyBOYU4KKyAqLworCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3RpbnkJICAgID0gMWUtMzAwLAoraGFsZj0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3byA9ICAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCAqLworCS8qIGMgPSAoZmxvYXQpMC44NDUwNjI5MTE1MSAqLworZXJ4ID0gIDguNDUwNjI5MTE1MTA0Njc1MjkyOTdlLTAxLCAvKiAweDNGRUIwQUMxLCAweDYwMDAwMDAwICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgb24gWzAsMC44NDM3NV0KKyAqLworZWZ4ID0gIDEuMjgzNzkxNjcwOTU1MTI1ODYzMTZlLTAxLCAvKiAweDNGQzA2RUJBLCAweDgyMTREQjY5ICovCitlZng4PSAgMS4wMjcwMzMzMzY3NjQxMDA2OTA1M2UrMDAsIC8qIDB4M0ZGMDZFQkEsIDB4ODIxNERCNjkgKi8KK3BwMCAgPSAgMS4yODM3OTE2NzA5NTUxMjU1ODU2MWUtMDEsIC8qIDB4M0ZDMDZFQkEsIDB4ODIxNERCNjggKi8KK3BwMSAgPSAtMy4yNTA0MjEwNzI0NzAwMTQ5OTM3MGUtMDEsIC8qIDB4QkZENENEN0QsIDB4NjkxQ0I5MTMgKi8KK3BwMiAgPSAtMi44NDgxNzQ5NTc1NTk4NTEwNDc2NmUtMDIsIC8qIDB4QkY5RDJBNTEsIDB4REJENzE5NEYgKi8KK3BwMyAgPSAtNS43NzAyNzAyOTY0ODk0NDE1OTE1N2UtMDMsIC8qIDB4QkY3N0EyOTEsIDB4MjM2NjY4RTQgKi8KK3BwNCAgPSAtMi4zNzYzMDE2NjU2NjUwMTYyNjA4NGUtMDUsIC8qIDB4QkVGOEVBRDYsIDB4MTIwMDE2QUMgKi8KK3FxMSAgPSAgMy45NzkxNzIyMzk1OTE1NTM1MjgxOWUtMDEsIC8qIDB4M0ZEOTc3NzksIDB4Q0REQURDMDkgKi8KK3FxMiAgPSAgNi41MDIyMjQ5OTg4NzY3Mjk0NDQ4NWUtMDIsIC8qIDB4M0ZCMEE1NEMsIDB4NTUzNkNFQkEgKi8KK3FxMyAgPSAgNS4wODEzMDYyODE4NzU3NjU2Mjc3NmUtMDMsIC8qIDB4M0Y3NEQwMjIsIDB4QzREMzZCMEYgKi8KK3FxNCAgPSAgMS4zMjQ5NDczODAwNDMyMTY0NDUyNmUtMDQsIC8qIDB4M0YyMTVEQzksIDB4MjIxQzFBMTAgKi8KK3FxNSAgPSAtMy45NjAyMjgyNzg3NzUzNjgxMjMyMGUtMDYsIC8qIDB4QkVEMDlDNDMsIDB4NDJBMjYxMjAgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiAgaW4gWzAuODQzNzUsMS4yNV0KKyAqLworcGEwICA9IC0yLjM2MjExODU2MDc1MjY1OTQ0MDc3ZS0wMywgLyogMHhCRjYzNTlCOCwgMHhCRUY3NzUzOCAqLworcGExICA9ICA0LjE0ODU2MTE4NjgzNzQ4MzMxNjY2ZS0wMSwgLyogMHgzRkRBOEQwMCwgMHhBRDkyQjM0RCAqLworcGEyICA9IC0zLjcyMjA3ODc2MDM1NzAxMzIzODQ3ZS0wMSwgLyogMHhCRkQ3RDI0MCwgMHhGQkI4QzNGMSAqLworcGEzICA9ICAzLjE4MzQ2NjE5OTAxMTYxNzUzNjc0ZS0wMSwgLyogMHgzRkQ0NUZDQSwgMHg4MDUxMjBFNCAqLworcGE0ICA9IC0xLjEwODk0Njk0MjgyMzk2Njc3NDc2ZS0wMSwgLyogMHhCRkJDNjM5OCwgMHgzRDNFMjhFQyAqLworcGE1ICA9ICAzLjU0NzgzMDQzMjU2MTgyMzU5MzcxZS0wMiwgLyogMHgzRkEyMkEzNiwgMHg1OTk3OTVFQiAqLworcGE2ICA9IC0yLjE2NjM3NTU5NDg2ODc5MDg0MzAwZS0wMywgLyogMHhCRjYxQkYzOCwgMHgwQTk2MDczRiAqLworcWExICA9ICAxLjA2NDIwODgwNDAwODQ0MjI4Mjg2ZS0wMSwgLyogMHgzRkJCM0U2NiwgMHgxOEVFRTMyMyAqLworcWEyICA9ICA1LjQwMzk3OTE3NzAyMTcxMDQ4OTM3ZS0wMSwgLyogMHgzRkUxNEFGMCwgMHg5MkVCNkYzMyAqLworcWEzICA9ICA3LjE4Mjg2NTQ0MTQxOTYyNjYyODY4ZS0wMiwgLyogMHgzRkIyNjM1QywgMHhEOTlGRTlBNyAqLworcWE0ICA9ICAxLjI2MTcxMjE5ODA4NzYxNjQyMTEyZS0wMSwgLyogMHgzRkMwMjY2MCwgMHhFNzYzMzUxRiAqLworcWE1ICA9ICAxLjM2MzcwODM5MTIwMjkwNTA3MzYyZS0wMiwgLyogMHgzRjhCRURDMiwgMHg2QjUxREQxQyAqLworcWE2ICA9ICAxLjE5ODQ0OTk4NDY3OTkxMDc0MTcwZS0wMiwgLyogMHgzRjg4OEI1NCwgMHg1NzM1MTUxRCAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmYyBpbiBbMS4yNSwxLzAuMzVdCisgKi8KK3JhMCAgPSAtOS44NjQ5NDQwMzQ4NDcxNDgyMjcwNWUtMDMsIC8qIDB4QkY4NDM0MTIsIDB4NjAwRDY0MzUgKi8KK3JhMSAgPSAtNi45Mzg1ODU3MjcwNzE4MTc2NDM3MmUtMDEsIC8qIDB4QkZFNjM0MTYsIDB4RTRCQTczNjAgKi8KK3JhMiAgPSAtMS4wNTU4NjI2MjI1MzIzMjkwOTgxNGUrMDEsIC8qIDB4QzAyNTFFMDQsIDB4NDFCMEU3MjYgKi8KK3JhMyAgPSAtNi4yMzc1MzMyNDUwMzI2MDA2MDM5NmUrMDEsIC8qIDB4QzA0RjMwMEEsIDB4RTRDQkEzOEQgKi8KK3JhNCAgPSAtMS42MjM5NjY2OTQ2MjU3MzQ3MDM1NWUrMDIsIC8qIDB4QzA2NDRDQjEsIDB4ODQyODIyNjYgKi8KK3JhNSAgPSAtMS44NDYwNTA5MjkwNjcxMTAzNTk5NGUrMDIsIC8qIDB4QzA2NzEzNUMsIDB4RUJDQ0FCQjIgKi8KK3JhNiAgPSAtOC4xMjg3NDM1NTA2MzA2NTkzNDI0NmUrMDEsIC8qIDB4QzA1NDUyNjUsIDB4NTdFNEQyRjIgKi8KK3JhNyAgPSAtOS44MTQzMjkzNDQxNjkxNDU0ODU5MmUrMDAsIC8qIDB4QzAyM0EwRUYsIDB4QzY5QUMyNUMgKi8KK3NhMSAgPSAgMS45NjUxMjcxNjY3NDM5MjU3MTI5MmUrMDEsIC8qIDB4NDAzM0E2QjksIDB4QkQ3MDc2ODcgKi8KK3NhMiAgPSAgMS4zNzY1Nzc1NDE0MzUxOTA0MjYwMGUrMDIsIC8qIDB4NDA2MTM1MEMsIDB4NTI2QUU3MjEgKi8KK3NhMyAgPSAgNC4zNDU2NTg3NzQ3NTIyOTIyODgyMWUrMDIsIC8qIDB4NDA3QjI5MEQsIDB4RDU4QTFBNzEgKi8KK3NhNCAgPSAgNi40NTM4NzI3MTczMzI2Nzg4MDMzNmUrMDIsIC8qIDB4NDA4NDJCMTksIDB4MjFFQzI4NjggKi8KK3NhNSAgPSAgNC4yOTAwODE0MDAyNzU2NzgzMzM4NmUrMDIsIC8qIDB4NDA3QUQwMjEsIDB4NTc3MDAzMTQgKi8KK3NhNiAgPSAgMS4wODYzNTAwNTU0MTc3OTQzNTEzNGUrMDIsIC8qIDB4NDA1QjI4QTMsIDB4RUU0OEFFMkMgKi8KK3NhNyAgPSAgNi41NzAyNDk3NzAzMTkyODE3MDEzNWUrMDAsIC8qIDB4NDAxQTQ3RUYsIDB4OEU0ODRBOTMgKi8KK3NhOCAgPSAtNi4wNDI0NDE1MjE0ODU4MDk4NzQzOGUtMDIsIC8qIDB4QkZBRUVGRjIsIDB4RUU3NDlBNjIgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZmMgaW4gWzEvLjM1LDI4XQorICovCityYjAgID0gLTkuODY0OTQyOTI0NzAwMDk5Mjg1OTdlLTAzLCAvKiAweEJGODQzNDEyLCAweDM5RTg2RjRBICovCityYjEgID0gLTcuOTkyODMyMzc2ODA1MjMwMDY1NzRlLTAxLCAvKiAweEJGRTk5M0JBLCAweDcwQzI4NURFICovCityYjIgID0gLTEuNzc1Nzk1NDkxNzc1NDc1MTk4ODllKzAxLCAvKiAweEMwMzFDMjA5LCAweDU1NUY5OTVBICovCityYjMgID0gLTEuNjA2MzYzODQ4NTU4MjE5MTYwNjJlKzAyLCAvKiAweEMwNjQxNDVELCAweDQzQzVFRDk4ICovCityYjQgID0gLTYuMzc1NjY0NDMzNjgzODk2Mjc3MjJlKzAyLCAvKiAweEMwODNFQzg4LCAweDEzNzVGMjI4ICovCityYjUgID0gLTEuMDI1MDk1MTMxNjExMDc3MjQ5NTRlKzAzLCAvKiAweEMwOTAwNDYxLCAweDZBMkU1OTkyICovCityYjYgID0gLTQuODM1MTkxOTE2MDg2NTEzOTcwMTllKzAyLCAvKiAweEMwN0UzODRFLCAweDlCREMzODNGICovCitzYjEgID0gIDMuMDMzODA2MDc0MzQ4MjQ1ODI5MjRlKzAxLCAvKiAweDQwM0U1NjhCLCAweDI2MUQ1MTkwICovCitzYjIgID0gIDMuMjU3OTI1MTI5OTY1NzM5MTg4MjZlKzAyLCAvKiAweDQwNzQ1Q0FFLCAweDIyMUI5RjBBICovCitzYjMgID0gIDEuNTM2NzI5NTg2MDg0NDM2OTU5OTRlKzAzLCAvKiAweDQwOTgwMkVCLCAweDE4OUQ1MTE4ICovCitzYjQgID0gIDMuMTk5ODU4MjE5NTA4NTk1NTM5MDhlKzAzLCAvKiAweDQwQThGRkI3LCAweDY4OEMyNDZBICovCitzYjUgID0gIDIuNTUzMDUwNDA2NDMzMTY0NDI1ODNlKzAzLCAvKiAweDQwQTNGMjE5LCAweENFREYzQkU2ICovCitzYjYgID0gIDQuNzQ1Mjg1NDEyMDY5NTUzNjcyMTVlKzAyLCAvKiAweDQwN0RBODc0LCAweEU3OUZFNzYzICovCitzYjcgID0gLTIuMjQ0MDk1MjQ0NjU4NTgxODMzNjJlKzAxOyAvKiAweEMwMzY3MEUyLCAweDQyNzEyRDYyICovCisKK2RvdWJsZQorZXJmKGRvdWJsZSB4KQoreworCWludDMyX3QgaHgsaXgsaTsKKwlkb3VibGUgUixTLFAsUSxzLHkseixyOworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSB7CQkvKiBlcmYobmFuKT1uYW4gKi8KKwkgICAgaSA9ICgodV9pbnQzMl90KWh4Pj4zMSk8PDE7CisJICAgIHJldHVybiAoZG91YmxlKSgxLWkpK29uZS94OwkvKiBlcmYoKy1pbmYpPSstMSAqLworCX0KKworCWlmKGl4IDwgMHgzZmViMDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDNlMzAwMDAwKSB7IAkvKiB8eHw8MioqLTI4ICovCisJICAgICAgICBpZiAoaXggPCAweDAwODAwMDAwKQorCQkgICAgcmV0dXJuIDAuMTI1Kig4LjAqeCtlZng4KngpOyAgLyphdm9pZCB1bmRlcmZsb3cgKi8KKwkJcmV0dXJuIHggKyBlZngqeDsKKwkgICAgfQorCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIHJldHVybiB4ICsgeCp5OworCX0KKwlpZihpeCA8IDB4M2ZmNDAwMDApIHsJCS8qIDAuODQzNzUgPD0gfHh8IDwgMS4yNSAqLworCSAgICBzID0gZmFicyh4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHJldHVybiBlcnggKyBQL1E7IGVsc2UgcmV0dXJuIC1lcnggLSBQL1E7CisJfQorCWlmIChpeCA+PSAweDQwMTgwMDAwKSB7CQkvKiBpbmY+fHh8Pj02ICovCisJICAgIGlmKGh4Pj0wKSByZXR1cm4gb25lLXRpbnk7IGVsc2UgcmV0dXJuIHRpbnktb25lOworCX0KKwl4ID0gZmFicyh4KTsKKyAJcyA9IG9uZS8oeCp4KTsKKwlpZihpeDwgMHg0MDA2REI2RSkgewkvKiB8eHwgPCAxLzAuMzUgKi8KKwkgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJfSBlbHNlIHsJLyogfHh8ID49IDEvMC4zNSAqLworCSAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCX0KKwl6ICA9IHg7CisJU0VUX0xPV19XT1JEKHosMCk7CisJciAgPSAgX19pZWVlNzU0X2V4cCgteip6LTAuNTYyNSkqX19pZWVlNzU0X2V4cCgoei14KSooeit4KStSL1MpOworCWlmKGh4Pj0wKSByZXR1cm4gb25lLXIveDsgZWxzZSByZXR1cm4gIHIveC1vbmU7Cit9CisKK2RvdWJsZQorZXJmYyhkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4LGl4OworCWRvdWJsZSBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHsJCQkvKiBlcmZjKG5hbik9bmFuICovCisJCQkJCQkvKiBlcmZjKCstaW5mKT0wLDIgKi8KKwkgICAgcmV0dXJuIChkb3VibGUpKCgodV9pbnQzMl90KWh4Pj4zMSk8PDEpK29uZS94OworCX0KKworCWlmKGl4IDwgMHgzZmViMDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDNjNzAwMDAwKSAgCS8qIHx4fDwyKiotNTYgKi8KKwkJcmV0dXJuIG9uZS14OworCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIGlmKGh4IDwgMHgzZmQwMDAwMCkgeyAgCS8qIHg8MS80ICovCisJCXJldHVybiBvbmUtKHgreCp5KTsKKwkgICAgfSBlbHNlIHsKKwkJciA9IHgqeTsKKwkJciArPSAoeC1oYWxmKTsKKwkgICAgICAgIHJldHVybiBoYWxmIC0gciA7CisJICAgIH0KKwl9CisJaWYoaXggPCAweDNmZjQwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnMoeCktb25lOworCSAgICBQID0gcGEwK3MqKHBhMStzKihwYTIrcyoocGEzK3MqKHBhNCtzKihwYTUrcypwYTYpKSkpKTsKKwkgICAgUSA9IG9uZStzKihxYTErcyoocWEyK3MqKHFhMytzKihxYTQrcyoocWE1K3MqcWE2KSkpKSk7CisJICAgIGlmKGh4Pj0wKSB7CisJICAgICAgICB6ICA9IG9uZS1lcng7IHJldHVybiB6IC0gUC9ROworCSAgICB9IGVsc2UgeworCQl6ID0gZXJ4K1AvUTsgcmV0dXJuIG9uZSt6OworCSAgICB9CisJfQorCWlmIChpeCA8IDB4NDAzYzAwMDApIHsJCS8qIHx4fDwyOCAqLworCSAgICB4ID0gZmFicyh4KTsKKyAJICAgIHMgPSBvbmUvKHgqeCk7CisJICAgIGlmKGl4PCAweDQwMDZEQjZEKSB7CS8qIHx4fCA8IDEvLjM1IH4gMi44NTcxNDMqLworCSAgICAgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCSAgICB9IGVsc2UgewkJCS8qIHx4fCA+PSAxLy4zNSB+IDIuODU3MTQzICovCisJCWlmKGh4PDAmJml4Pj0weDQwMTgwMDAwKSByZXR1cm4gdHdvLXRpbnk7LyogeCA8IC02ICovCisJICAgICAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwkgICAgfQorCSAgICB6ICA9IHg7CisJICAgIFNFVF9MT1dfV09SRCh6LDApOworCSAgICByICA9ICBfX2llZWU3NTRfZXhwKC16KnotMC41NjI1KSoKKwkJCV9faWVlZTc1NF9leHAoKHoteCkqKHoreCkrUi9TKTsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHIveDsgZWxzZSByZXR1cm4gdHdvLXIveDsKKwl9IGVsc2UgeworCSAgICBpZihoeD4wKSByZXR1cm4gdGlueSp0aW55OyBlbHNlIHJldHVybiB0d28tdGlueTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2VyZmYuYyBiL2xpYm0vc3JjL3NfZXJmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTA1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2VyZmYuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogc19lcmZmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2VyZi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19lcmZmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordGlueQkgICAgPSAxZS0zMCwKK2hhbGY9ICA1LjAwMDAwMDAwMDBlLTAxLCAvKiAweDNGMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzRjgwMDAwMCAqLwordHdvID0gIDIuMDAwMDAwMDAwMGUrMDAsIC8qIDB4NDAwMDAwMDAgKi8KKwkvKiBjID0gKHN1YmZsb2F0KTAuODQ1MDYyOTExNTEgKi8KK2VyeCA9ICA4LjQ1MDYyOTExNTFlLTAxLCAvKiAweDNmNTg1NjBiICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgb24gWzAsMC44NDM3NV0KKyAqLworZWZ4ID0gIDEuMjgzNzkxNjYxM2UtMDEsIC8qIDB4M2UwMzc1ZDQgKi8KK2VmeDg9ICAxLjAyNzAzMzMyOTBlKzAwLCAvKiAweDNmODM3NWQ0ICovCitwcDAgID0gIDEuMjgzNzkxNjYxM2UtMDEsIC8qIDB4M2UwMzc1ZDQgKi8KK3BwMSAgPSAtMy4yNTA0MjA5ODc2ZS0wMSwgLyogMHhiZWE2NmJlYiAqLworcHAyICA9IC0yLjg0ODE3NDk4MThlLTAyLCAvKiAweGJjZTk1MjhmICovCitwcDMgID0gLTUuNzcwMjcwMjQ3MGUtMDMsIC8qIDB4YmJiZDE0ODkgKi8KK3BwNCAgPSAtMi4zNzYzMDE3NDUyZS0wNSwgLyogMHhiN2M3NTZiMSAqLworcXExICA9ICAzLjk3OTE3MjExMDZlLTAxLCAvKiAweDNlY2JiYmNlICovCitxcTIgID0gIDYuNTAyMjI1MjUwMGUtMDIsIC8qIDB4M2Q4NTJhNjMgKi8KK3FxMyAgPSAgNS4wODEzMDYyMTE3ZS0wMywgLyogMHgzYmE2ODExNiAqLworcXE0ICA9ICAxLjMyNDk0NzM3MDRlLTA0LCAvKiAweDM5MGFlZTQ5ICovCitxcTUgID0gLTMuOTYwMjI4MjQxM2UtMDYsIC8qIDB4YjY4NGUyMWEgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiAgaW4gWzAuODQzNzUsMS4yNV0KKyAqLworcGEwICA9IC0yLjM2MjExODU2ODNlLTAzLCAvKiAweGJiMWFjZGM2ICovCitwYTEgID0gIDQuMTQ4NTYxMDYwNGUtMDEsIC8qIDB4M2VkNDY4MDUgKi8KK3BhMiAgPSAtMy43MjIwNzg4MDAyZS0wMSwgLyogMHhiZWJlOTIwOCAqLworcGEzICA9ICAzLjE4MzQ2NjE5NjFlLTAxLCAvKiAweDNlYTJmZTU0ICovCitwYTQgID0gLTEuMTA4OTQ2OTQ5MmUtMDEsIC8qIDB4YmRlMzFjYzIgKi8KK3BhNSAgPSAgMy41NDc4MzA1MDcyZS0wMiwgLyogMHgzZDExNTFiMyAqLworcGE2ICA9IC0yLjE2NjM3NTUxNzhlLTAzLCAvKiAweGJiMGRmOWMwICovCitxYTEgID0gIDEuMDY0MjA4ODIwNWUtMDEsIC8qIDB4M2RkOWYzMzEgKi8KK3FhMiAgPSAgNS40MDM5Nzk0MjA3ZS0wMSwgLyogMHgzZjBhNTc4NSAqLworcWEzICA9ICA3LjE4Mjg2NTU4OTllLTAyLCAvKiAweDNkOTMxYWU3ICovCitxYTQgID0gIDEuMjYxNzEyMTYzN2UtMDEsIC8qIDB4M2UwMTMzMDcgKi8KK3FhNSAgPSAgMS4zNjM3MDgzNTgzZS0wMiwgLyogMHgzYzVmNmUxMyAqLworcWE2ICA9ICAxLjE5ODQ1MDAxMDNlLTAyLCAvKiAweDNjNDQ1YWEzICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLjI1LDEvMC4zNV0KKyAqLworcmEwICA9IC05Ljg2NDk0NDAzMzNlLTAzLCAvKiAweGJjMjFhMDkzICovCityYTEgID0gLTYuOTM4NTg1NjM5MGUtMDEsIC8qIDB4YmYzMWEwYjcgKi8KK3JhMiAgPSAtMS4wNTU4NjI2MTc1ZSswMSwgLyogMHhjMTI4ZjAyMiAqLworcmEzICA9IC02LjIzNzUzMzE4NzllKzAxLCAvKiAweGMyNzk4MDU3ICovCityYTQgID0gLTEuNjIzOTY2Njc0OGUrMDIsIC8qIDB4YzMyMjY1OGMgKi8KK3JhNSAgPSAtMS44NDYwNTA4NzI4ZSswMiwgLyogMHhjMzM4OWFlNyAqLworcmE2ICA9IC04LjEyODc0Mzc0MzllKzAxLCAvKiAweGMyYTI5MzJiICovCityYTcgID0gLTkuODE0MzI5MTQ3M2UrMDAsIC8qIDB4YzExZDA3N2UgKi8KK3NhMSAgPSAgMS45NjUxMjcxODIwZSswMSwgLyogMHg0MTlkMzVjZSAqLworc2EyICA9ICAxLjM3NjU3NzYwNjJlKzAyLCAvKiAweDQzMDlhODYzICovCitzYTMgID0gIDQuMzQ1NjU4ODc0NWUrMDIsIC8qIDB4NDNkOTQ4NmYgKi8KK3NhNCAgPSAgNi40NTM4NzI2ODA3ZSswMiwgLyogMHg0NDIxNThjOSAqLworc2E1ICA9ICA0LjI5MDA4MTQ4MTllKzAyLCAvKiAweDQzZDY4MTBiICovCitzYTYgID0gIDEuMDg2MzUwMDIxNGUrMDIsIC8qIDB4NDJkOTQ1MWYgKi8KK3NhNyAgPSAgNi41NzAyNDk1NTc1ZSswMCwgLyogMHg0MGQyM2Y3YyAqLworc2E4ICA9IC02LjA0MjQ0MTM1MzJlLTAyLCAvKiAweGJkNzc3Zjk3ICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLy4zNSwyOF0KKyAqLworcmIwICA9IC05Ljg2NDk0MzEwMjBlLTAzLCAvKiAweGJjMjFhMDkyICovCityYjEgID0gLTcuOTkyODMyNjYwN2UtMDEsIC8qIDB4YmY0YzlkZDQgKi8KK3JiMiAgPSAtMS43NzU3OTU1NTUxZSswMSwgLyogMHhjMThlMTA0YiAqLworcmIzICA9IC0xLjYwNjM2MzgzMDZlKzAyLCAvKiAweGMzMjBhMmVhICovCityYjQgID0gLTYuMzc1NjY0NjcyOWUrMDIsIC8qIDB4YzQxZjY0NDEgKi8KK3JiNSAgPSAtMS4wMjUwOTUwOTI4ZSswMywgLyogMHhjNDgwMjMwYiAqLworcmI2ICA9IC00LjgzNTE5MTk1NTZlKzAyLCAvKiAweGMzZjFjMjc1ICovCitzYjEgID0gIDMuMDMzODA2MDM3OWUrMDEsIC8qIDB4NDFmMmI0NTkgKi8KK3NiMiAgPSAgMy4yNTc5MjUxMDk5ZSswMiwgLyogMHg0M2EyZTU3MSAqLworc2IzICA9ICAxLjUzNjcyOTYxNDNlKzAzLCAvKiAweDQ0YzAxNzU5ICovCitzYjQgID0gIDMuMTk5ODU4MTU0M2UrMDMsIC8qIDB4NDU0N2ZkYmIgKi8KK3NiNSAgPSAgMi41NTMwNTAyOTMwZSswMywgLyogMHg0NTFmOTBjZSAqLworc2I2ICA9ICA0Ljc0NTI4NTMzOTRlKzAyLCAvKiAweDQzZWQ0M2E3ICovCitzYjcgID0gLTIuMjQ0MDk1MjMwMWUrMDE7IC8qIDB4YzFiMzg3MTIgKi8KKworZmxvYXQKK2VyZmYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGh4LGl4LGk7CisJZmxvYXQgUixTLFAsUSxzLHkseixyOworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgewkJLyogZXJmKG5hbik9bmFuICovCisJICAgIGkgPSAoKHVfaW50MzJfdCloeD4+MzEpPDwxOworCSAgICByZXR1cm4gKGZsb2F0KSgxLWkpK29uZS94OwkvKiBlcmYoKy1pbmYpPSstMSAqLworCX0KKworCWlmKGl4IDwgMHgzZjU4MDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDMxODAwMDAwKSB7IAkvKiB8eHw8MioqLTI4ICovCisJICAgICAgICBpZiAoaXggPCAweDA0MDAwMDAwKQorCQkgICAgLyphdm9pZCB1bmRlcmZsb3cgKi8KKwkJICAgIHJldHVybiAoZmxvYXQpMC4xMjUqKChmbG9hdCk4LjAqeCtlZng4KngpOworCQlyZXR1cm4geCArIGVmeCp4OworCSAgICB9CisJICAgIHogPSB4Kng7CisJICAgIHIgPSBwcDAreioocHAxK3oqKHBwMit6KihwcDMreipwcDQpKSk7CisJICAgIHMgPSBvbmUreioocXExK3oqKHFxMit6KihxcTMreioocXE0K3oqcXE1KSkpKTsKKwkgICAgeSA9IHIvczsKKwkgICAgcmV0dXJuIHggKyB4Knk7CisJfQorCWlmKGl4IDwgMHgzZmEwMDAwMCkgewkJLyogMC44NDM3NSA8PSB8eHwgPCAxLjI1ICovCisJICAgIHMgPSBmYWJzZih4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHJldHVybiBlcnggKyBQL1E7IGVsc2UgcmV0dXJuIC1lcnggLSBQL1E7CisJfQorCWlmIChpeCA+PSAweDQwYzAwMDAwKSB7CQkvKiBpbmY+fHh8Pj02ICovCisJICAgIGlmKGh4Pj0wKSByZXR1cm4gb25lLXRpbnk7IGVsc2UgcmV0dXJuIHRpbnktb25lOworCX0KKwl4ID0gZmFic2YoeCk7CisgCXMgPSBvbmUvKHgqeCk7CisJaWYoaXg8IDB4NDAzNkRCNkUpIHsJLyogfHh8IDwgMS8wLjM1ICovCisJICAgIFI9cmEwK3MqKHJhMStzKihyYTIrcyoocmEzK3MqKHJhNCtzKigKKwkJCQlyYTUrcyoocmE2K3MqcmE3KSkpKSkpOworCSAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCX0gZWxzZSB7CS8qIHx4fCA+PSAxLzAuMzUgKi8KKwkgICAgUj1yYjArcyoocmIxK3MqKHJiMitzKihyYjMrcyoocmI0K3MqKAorCQkJCXJiNStzKnJiNikpKSkpOworCSAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwl9CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeixpeCYweGZmZmZmMDAwKTsKKwlyICA9ICBfX2llZWU3NTRfZXhwZigteip6LShmbG9hdCkwLjU2MjUpKl9faWVlZTc1NF9leHBmKCh6LXgpKih6K3gpK1IvUyk7CisJaWYoaHg+PTApIHJldHVybiBvbmUtci94OyBlbHNlIHJldHVybiAgci94LW9uZTsKK30KKworZmxvYXQKK2VyZmNmKGZsb2F0IHgpCit7CisJaW50MzJfdCBoeCxpeDsKKwlmbG9hdCBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSB7CQkJLyogZXJmYyhuYW4pPW5hbiAqLworCQkJCQkJLyogZXJmYygrLWluZik9MCwyICovCisJICAgIHJldHVybiAoZmxvYXQpKCgodV9pbnQzMl90KWh4Pj4zMSk8PDEpK29uZS94OworCX0KKworCWlmKGl4IDwgMHgzZjU4MDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDIzODAwMDAwKSAgCS8qIHx4fDwyKiotNTYgKi8KKwkJcmV0dXJuIG9uZS14OworCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIGlmKGh4IDwgMHgzZTgwMDAwMCkgeyAgCS8qIHg8MS80ICovCisJCXJldHVybiBvbmUtKHgreCp5KTsKKwkgICAgfSBlbHNlIHsKKwkJciA9IHgqeTsKKwkJciArPSAoeC1oYWxmKTsKKwkgICAgICAgIHJldHVybiBoYWxmIC0gciA7CisJICAgIH0KKwl9CisJaWYoaXggPCAweDNmYTAwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnNmKHgpLW9uZTsKKwkgICAgUCA9IHBhMCtzKihwYTErcyoocGEyK3MqKHBhMytzKihwYTQrcyoocGE1K3MqcGE2KSkpKSk7CisJICAgIFEgPSBvbmUrcyoocWExK3MqKHFhMitzKihxYTMrcyoocWE0K3MqKHFhNStzKnFhNikpKSkpOworCSAgICBpZihoeD49MCkgeworCSAgICAgICAgeiAgPSBvbmUtZXJ4OyByZXR1cm4geiAtIFAvUTsKKwkgICAgfSBlbHNlIHsKKwkJeiA9IGVyeCtQL1E7IHJldHVybiBvbmUrejsKKwkgICAgfQorCX0KKwlpZiAoaXggPCAweDQxZTAwMDAwKSB7CQkvKiB8eHw8MjggKi8KKwkgICAgeCA9IGZhYnNmKHgpOworIAkgICAgcyA9IG9uZS8oeCp4KTsKKwkgICAgaWYoaXg8IDB4NDAzNkRCNkQpIHsJLyogfHh8IDwgMS8uMzUgfiAyLjg1NzE0MyovCisJICAgICAgICBSPXJhMCtzKihyYTErcyoocmEyK3MqKHJhMytzKihyYTQrcyooCisJCQkJcmE1K3MqKHJhNitzKnJhNykpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJICAgIH0gZWxzZSB7CQkJLyogfHh8ID49IDEvLjM1IH4gMi44NTcxNDMgKi8KKwkJaWYoaHg8MCYmaXg+PTB4NDBjMDAwMDApIHJldHVybiB0d28tdGlueTsvKiB4IDwgLTYgKi8KKwkgICAgICAgIFI9cmIwK3MqKHJiMStzKihyYjIrcyoocmIzK3MqKHJiNCtzKigKKwkJCQlyYjUrcypyYjYpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCSAgICB9CisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCSAgICBTRVRfRkxPQVRfV09SRCh6LGl4JjB4ZmZmZmYwMDApOworCSAgICByICA9ICBfX2llZWU3NTRfZXhwZigteip6LShmbG9hdCkwLjU2MjUpKgorCQkJX19pZWVlNzU0X2V4cGYoKHoteCkqKHoreCkrUi9TKTsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHIveDsgZWxzZSByZXR1cm4gdHdvLXIveDsKKwl9IGVsc2UgeworCSAgICBpZihoeD4wKSByZXR1cm4gdGlueSp0aW55OyBlbHNlIHJldHVybiB0d28tdGlueTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cDIuYyBiL2xpYm0vc3JjL3NfZXhwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGVmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cDIuYwpAQCAtMCwwICsxLDM4OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19leHAyLmMsdiAxLjEgMjAwNS8wNC8wNSAwMjo1NzoxNSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2RlZmluZQlUQkxCSVRTCTgKKyNkZWZpbmUJVEJMU0laRQkoMSA8PCBUQkxCSVRTKQorCitzdGF0aWMgY29uc3QgZG91YmxlCisgICAgaHVnZSAgICAgPSAweDFwMTAwMCwKKyAgICB0d29tMTAwMCA9IDB4MXAtMTAwMCwKKyAgICByZWR1eCAgICA9IDB4MS44cDUyIC8gVEJMU0laRSwKKyAgICBQMQkgICAgID0gMHgxLjYyZTQyZmVmYTM5ZWZwLTEsCisgICAgUDIJICAgICA9IDB4MS5lYmZiZGZmODJjNTc1cC0zLAorICAgIFAzCSAgICAgPSAweDEuYzZiMDhkNzA0YTBhNnAtNSwKKyAgICBQNAkgICAgID0gMHgxLjNiMmFiODhmNzA0MDBwLTcsCisgICAgUDUJICAgICA9IDB4MS41ZDg4MDAzODc1Yzc0cC0xMDsKKworc3RhdGljIGNvbnN0IGRvdWJsZSB0YmxbVEJMU0laRSAqIDJdID0geworLyoJZXhwMih6ICsgZXBzKQkJZXBzCSovCisJMHgxLjZhMDllNjY3ZjNkNWRwLTEsCSAweDEuOTg4MHAtNDQsCisJMHgxLjZiMDUyZmE3NTE3NDRwLTEsCSAweDEuODAwMHAtNTAsCisJMHgxLjZjMDEyNzUwYmQ5ZmVwLTEsCS0weDEuODc4MHAtNDUsCisJMHgxLjZjZmRjZGRkNDc2YmZwLTEsCSAweDEuZWMwMHAtNDYsCisJMHgxLjZkZmIyM2M2NTFhMjlwLTEsCS0weDEuODAwMHAtNTAsCisJMHgxLjZlZjkyOTg1OTNhZTNwLTEsCS0weDEuYzAwMHAtNTIsCisJMHgxLjZmZjdkZjk1MTkzODZwLTEsCS0weDEuZmQ4MHAtNDUsCisJMHgxLjcwZjc0NjZmNDJkYTNwLTEsCS0weDEuYzg4MHAtNDUsCisJMHgxLjcxZjc1ZThlYzVmYzNwLTEsCSAweDEuM2MwMHAtNDYsCisJMHgxLjcyZjgyODZlYWNmMDVwLTEsCS0weDEuODMwMHAtNDQsCisJMHgxLjczZjlhNDhhNTgxNTJwLTEsCS0weDEuMGMwMHAtNDcsCisJMHgxLjc0ZmJkMzVkN2NjZmNwLTEsCSAweDEuZjg4MHAtNDUsCisJMHgxLjc1ZmViNTY0MjY3ZjFwLTEsCSAweDEuM2UwMHAtNDcsCisJMHgxLjc3MDI0YjFhYjZkNDhwLTEsCS0weDEuN2QwMHAtNDUsCisJMHgxLjc4MDY5NGZkZTVkMzhwLTEsCS0weDEuZDAwMHAtNTAsCisJMHgxLjc5MGI5MzhhYzFkMDBwLTEsCSAweDEuMzAwMHAtNDksCisJMHgxLjdhMTE0NzNlYjAxNzhwLTEsCS0weDEuZDAwMHAtNDksCisJMHgxLjdiMTdiMDk3NmQwNjBwLTEsCSAweDEuMDQwMHAtNDUsCisJMHgxLjdjMWVkMDEzMGMxMzNwLTEsCSAweDEuMDAwMHAtNTMsCisJMHgxLjdkMjZhNjJmZjg2MzZwLTEsCS0weDEuNjkwMHAtNDUsCisJMHgxLjdlMmYzMzZjZjRlM2JwLTEsCS0weDEuMmUwMHAtNDcsCisJMHgxLjdmMzg3ODQ5MWMzZThwLTEsCS0weDEuNDU4MHAtNDUsCisJMHgxLjgwNDI3NTQzZTFiNGVwLTEsCSAweDEuMzAwMHAtNDQsCisJMHgxLjgxNGQyYWRkMTA3MWFwLTEsCSAweDEuZjAwMHAtNDcsCisJMHgxLjgyNTg5OTk0Y2NkN2VwLTEsCS0weDEuMWMwMHAtNDUsCisJMHgxLjgzNjRjMWViOTQyZDBwLTEsCSAweDEuOWQwMHAtNDUsCisJMHgxLjg0NzFhNDYyM2NhYjVwLTEsCSAweDEuNzEwMHAtNDMsCisJMHgxLjg1N2Y0MTc5ZjViYmNwLTEsCSAweDEuMjYwMHAtNDUsCisJMHgxLjg2OGQ5OWI0NDkxYWZwLTEsCS0weDEuMmM0MHAtNDQsCisJMHgxLjg3OWNhZDkzMWEzOTVwLTEsCS0weDEuMzAwMHAtNDUsCisJMHgxLjg4YWM3ZDk4YTY1YjhwLTEsCS0weDEuYTgwMHAtNDUsCisJMHgxLjg5YmQwYTQ3ODU4MDBwLTEsCS0weDEuZDAwMHAtNDksCisJMHgxLjhhY2U1NDIyYWEyMjNwLTEsCSAweDEuMzI4MHAtNDQsCisJMHgxLjhiZTA1YmFkNjE5ZmFwLTEsCSAweDEuMmI0MHAtNDMsCisJMHgxLjhjZjMyMTZiNTQzODNwLTEsCS0weDEuZWQwMHAtNDUsCisJMHgxLjhlMDZhNWUwODY2NGNwLTEsCS0weDEuMDUwMHAtNDUsCisJMHgxLjhmMWFlOTkxNTc4MDdwLTEsCSAweDEuODI4MHAtNDUsCisJMHgxLjkwMmZlZDAyODJjMGVwLTEsCS0weDEuY2IwMHAtNDYsCisJMHgxLjkxNDViMGI5MWZmOTZwLTEsCS0weDEuNWUwMHAtNDcsCisJMHgxLjkyNWMzNTNhYTJmZjlwLTEsCSAweDEuNTQwMHAtNDgsCisJMHgxLjkzNzM3YjBjZGM2NGFwLTEsCSAweDEuNzIwMHAtNDYsCisJMHgxLjk0OGI4MmI1Zjk4YWVwLTEsCS0weDEuOTAwMHAtNDcsCisJMHgxLjk1YTQ0Y2JjODUyY2JwLTEsCSAweDEuNTY4MHAtNDUsCisJMHgxLjk2YmRkOWE3NjZmMjFwLTEsCS0weDEuNmQwMHAtNDQsCisJMHgxLjk3ZDgyOWZkZTRlMmFwLTEsCS0weDEuMTAwMHAtNDcsCisJMHgxLjk4ZjMzZTQ3YTIzYTNwLTEsCSAweDEuZDAwMHAtNDUsCisJMHgxLjlhMGYxNzBjYTA2MDRwLTEsCS0weDEuOGE0MHAtNDQsCisJMHgxLjliMmJiNGQ1M2ZmODlwLTEsCSAweDEuNTVjMHAtNDQsCisJMHgxLjljNDkxODJhM2YxNWJwLTEsCSAweDEuNmI4MHAtNDUsCisJMHgxLjlkNjc0MTk0YmI4YzVwLTEsCS0weDEuYzAwMHAtNDksCisJMHgxLjllODYzMTllMzIzOGVwLTEsCSAweDEuN2QwMHAtNDYsCisJMHgxLjlmYTVlOGQwN2YzMDJwLTEsCSAweDEuNjQwMHAtNDYsCisJMHgxLmEwYzY2N2I1ZGU1NGRwLTEsCS0weDEuNTAwMHAtNDgsCisJMHgxLmExZTdhZWQ4ZWI4ZjZwLTEsCSAweDEuOWUwMHAtNDcsCisJMHgxLmEzMDliZWM0YTJlMjdwLTEsCSAweDEuYWQ4MHAtNDUsCisJMHgxLmE0MmM5ODA0NjBhNWRwLTEsCS0weDEuYWYwMHAtNDYsCisJMHgxLmE1NTAzYjIzZTI1OWJwLTEsCSAweDEuYjYwMHAtNDcsCisJMHgxLmE2NzRhOGFmNDYyMTNwLTEsCSAweDEuODg4MHAtNDQsCisJMHgxLmE3OTllMTMzMGIzYTdwLTEsCSAweDEuMTIwMHAtNDYsCisJMHgxLmE4YmZlNTNjMTJlOGRwLTEsCSAweDEuNmMwMHAtNDcsCisJMHgxLmE5ZTZiNTU3OWZjZDJwLTEsCS0weDEuOWI4MHAtNDUsCisJMHgxLmFiMGU1MjEzNTZmYjhwLTEsCSAweDEuYjcwMHAtNDUsCisJMHgxLmFjMzZiYmZkM2YzODFwLTEsCSAweDEuOTAwMHAtNTAsCisJMHgxLmFkNWZmM2EzYzI3ODBwLTEsCSAweDEuNDAwMHAtNDksCisJMHgxLmFlODlmOTk1YWQyYTNwLTEsCS0weDEuYzkwMHAtNDUsCisJMHgxLmFmYjRjZTYyMmYzNjdwLTEsCSAweDEuNjUwMHAtNDYsCisJMHgxLmIwZTA3Mjk4ZGI3OTBwLTEsCSAweDEuZmQ0MHAtNDUsCisJMHgxLmIyMGNlNmM5YTg5YTlwLTEsCSAweDEuMjcwMHAtNDYsCisJMHgxLmIzM2EyYjg0ZjFhNGJwLTEsCSAweDEuZDQ3MHAtNDMsCisJMHgxLmI0Njg0MTViNzQ3ZTdwLTEsCS0weDEuODM4MHAtNDQsCisJMHgxLmI1OTcyOGRlNTU5M2FwLTEsCSAweDEuODAwMHAtNTQsCisJMHgxLmI2YzZlMjlmMWM1NmFwLTEsCSAweDEuYWQwMHAtNDcsCisJMHgxLmI3Zjc2ZjJmYjVlNTBwLTEsCSAweDEuZTgwMHAtNTAsCisJMHgxLmI5MjhjZjIyNzQ5YjJwLTEsCS0weDEuNGMwMHAtNDcsCisJMHgxLmJhNWIwMzBhMTA2MDNwLTEsCS0weDEuZDcwMHAtNDcsCisJMHgxLmJiOGUwYjc5YTZmNjZwLTEsCSAweDEuZDkwMHAtNDcsCisJMHgxLmJjYzFlOTA0YmMxZmZwLTEsCSAweDEuMmEwMHAtNDcsCisJMHgxLmJkZjY5YzNmM2ExNmZwLTEsCS0weDEuZjc4MHAtNDYsCisJMHgxLmJmMmMyNWJkNzFkYjhwLTEsCS0weDEuMGEwMHAtNDYsCisJMHgxLmMwNjI4NjE0MWIyZTlwLTEsCS0weDEuMTQwMHAtNDYsCisJMHgxLmMxOTliZGQ4NTUyZTBwLTEsCSAweDEuYmUwMHAtNDcsCisJMHgxLmMyZDFjZDlmYTY0ZWVwLTEsCS0weDEuOTQwMHAtNDcsCisJMHgxLmM0MGFiNWZmZmQwMmZwLTEsCS0weDEuZWQwMHAtNDcsCisJMHgxLmM1NDQ3NzhmYWZkMTVwLTEsCSAweDEuOTY2MHAtNDQsCisJMHgxLmM2N2YxMmU1N2QwY2JwLTEsCS0weDEuYTEwMHAtNDYsCisJMHgxLmM3YmE4ODk4OGMxYjZwLTEsCS0weDEuODQ1OHAtNDIsCisJMHgxLmM4ZjZkOTQwNmU3MzNwLTEsCS0weDEuYTQ4MHAtNDYsCisJMHgxLmNhMzQwNTc1MWM0ZGZwLTEsCSAweDEuYjAwMHAtNTEsCisJMHgxLmNiNzIwZGNlZjkwOTRwLTEsCSAweDEuMTQwMHAtNDcsCisJMHgxLmNjYjBmMmU2ZDE2ODlwLTEsCSAweDEuMDIwMHAtNDgsCisJMHgxLmNkZjBiNTU1ZGM0MTJwLTEsCSAweDEuMzYwMHAtNDgsCisJMHgxLmNmMzE1NWI1YmFiM2JwLTEsCS0weDEuNjkwMHAtNDcsCisJMHgxLmQwNzJkNGEwNzg5YmNwLTEsCSAweDEuOWEwMHAtNDcsCisJMHgxLmQxYjUzMmIwOGM4ZmFwLTEsCS0weDEuNWUwMHAtNDYsCisJMHgxLmQyZjg3MDgwZDhhODVwLTEsCSAweDEuZDI4MHAtNDYsCisJMHgxLmQ0M2M4ZWFjYWEyMDNwLTEsCSAweDEuMWEwMHAtNDcsCisJMHgxLmQ1ODE4ZGNmYmE0OTFwLTEsCSAweDEuZjAwMHAtNTAsCisJMHgxLmQ2Yzc2ZTg2MmU2YTFwLTEsCS0weDEuM2EwMHAtNDcsCisJMHgxLmQ4MGUzMTZjOTgzNGVwLTEsCS0weDEuY2Q4MHAtNDcsCisJMHgxLmQ5NTVkNzFmZjYwOTBwLTEsCSAweDEuNGMwMHAtNDgsCisJMHgxLmRhOWU2MDNkYjMyYWVwLTEsCSAweDEuZjkwMHAtNDgsCisJMHgxLmRiZTdjZDYzYTgzMjVwLTEsCSAweDEuOTgwMHAtNDksCisJMHgxLmRkMzIxZjMwMWI0NDVwLTEsCS0weDEuNTIwMHAtNDgsCisJMHgxLmRlN2Q1NjQxYzA1YmZwLTEsCS0weDEuZDcwMHAtNDYsCisJMHgxLmRmYzk3MzM3YjlhZWNwLTEsCS0weDEuNjE0MHAtNDYsCisJMHgxLmUxMTY3NmIxOTdkNWVwLTEsCSAweDEuYjQ4MHAtNDcsCisJMHgxLmUyNjQ2MTRmNWEzZTdwLTEsCSAweDEuMGNlMHAtNDMsCisJMHgxLmUzYjMzM2IxNmVlNWNwLTEsCSAweDEuYzY4MHAtNDcsCisJMHgxLmU1MDJlZTc4YjNmYjRwLTEsCS0weDEuOTMwMHAtNDcsCisJMHgxLmU2NTM5MjQ2NzZkNjhwLTEsCS0weDEuNTAwMHAtNDksCisJMHgxLmU3YTUxZmJjNzRjNDRwLTEsCS0weDEuN2Y4MHAtNDcsCisJMHgxLmU4Zjc5NzdjZGI3MjZwLTEsCS0weDEuMzcwMHAtNDgsCisJMHgxLmVhNGFmYTJhNDkwZThwLTEsCSAweDEuNWQwMHAtNDksCisJMHgxLmViOWY0ODY3Y2NhZTRwLTEsCSAweDEuNjFhMHAtNDYsCisJMHgxLmVjZjQ4MmQ4ZTY4MGRwLTEsCSAweDEuNTUwMHAtNDgsCisJMHgxLmVlNGFhYTIxODg1MTRwLTEsCSAweDEuNjQwMHAtNTEsCisJMHgxLmVmYTFiZWU2MTVhMTNwLTEsCS0weDEuZTgwMHAtNDksCisJMHgxLmYwZjljMWNiNjQxMDZwLTEsCS0weDEuYTg4MHAtNDgsCisJMHgxLmYyNTJiMzc2YmI5NjNwLTEsCS0weDEuYzkwMHAtNDUsCisJMHgxLmYzYWM5NDhkZDcyNzVwLTEsCSAweDEuYTAwMHAtNTMsCisJMHgxLmY1MDc2NWI2ZTQ1MjRwLTEsCS0weDEuNGYwMHAtNDgsCisJMHgxLmY2NjMyNzk4ODQ0ZmRwLTEsCSAweDEuYTgwMHAtNTEsCisJMHgxLmY3YmZkYWQ5Y2JlMzhwLTEsCSAweDEuYWJjMHAtNDgsCisJMHgxLmY5MWQ4MDIyNDNjODJwLTEsCS0weDEuNDYwMHAtNTAsCisJMHgxLmZhN2MxODE5ZTkwOGVwLTEsCS0weDEuYjBjMHAtNDcsCisJMHgxLmZiZGJhMzY5MmQ1MTFwLTEsCS0weDEuMGUwMHAtNTEsCisJMHgxLmZkM2MyMmI4ZjcxOTRwLTEsCS0weDEuMGRlOHAtNDYsCisJMHgxLmZlOWQ5NmIyYTIzZWVwLTEsCSAweDEuZTQzMHAtNDksCisJMHgxLjAwMDAwMDAwMDAwMDBwKzAsCSAweDAuMDAwMHArMCwKKwkweDEuMDBiMWFmYTVhYmNiZXArMCwJLTB4MS4zNDAwcC01MiwKKwkweDEuMDE2M2RhOWZiMzMwM3ArMCwJLTB4MS4yMTcwcC00NiwKKwkweDEuMDIxNjgxNDNiMDI4MnArMCwJIDB4MS5hNDAwcC01MiwKKwkweDEuMDJjOWEzZTc3ODA2Y3ArMCwJIDB4MS5mOTgwcC00OSwKKwkweDEuMDM3ZDQyZTExYmJjYXArMCwJLTB4MS43NDAwcC01MSwKKwkweDEuMDQzMTVlODZlN2Y4OXArMCwJIDB4MS44MzAwcC01MCwKKwkweDEuMDRlNWY3MmY2NTQ2N3ArMCwJLTB4MS5hM2YwcC00NiwKKwkweDEuMDU5YjBkMzE1ODU1YXArMCwJLTB4MS4yODQwcC00NywKKwkweDEuMDY1MGEwZTNjMWY5NXArMCwJIDB4MS4xNjAwcC00OCwKKwkweDEuMDcwNmIyOWRkZjcxYXArMCwJIDB4MS41MjQwcC00NiwKKwkweDEuMDdiZDQyYjcyYTgyZHArMCwJLTB4MS45YTAwcC00OSwKKwkweDEuMDg3NDUxODc1OWJkMHArMCwJIDB4MS42NDAwcC00OSwKKwkweDEuMDkyYmRmNjY2MDdjOHArMCwJLTB4MS4wNzgwcC00NywKKwkweDEuMDllM2VjYWM2ZjM4M3ArMCwJLTB4MS44MDAwcC01NCwKKwkweDEuMGE5Yzc5YjFmMzkzMHArMCwJIDB4MS5mYTAwcC00OCwKKwkweDEuMGI1NTg2Y2Y5ODhmY3ArMCwJLTB4MS5hYzgwcC00OCwKKwkweDEuMGMwZjE0NWU0NmM4YXArMCwJIDB4MS45YzAwcC01MCwKKwkweDEuMGNjOTIyYjcyNDgxNnArMCwJIDB4MS41MjAwcC00NywKKwkweDEuMGQ4M2IyMzM5NWRkOHArMCwJLTB4MS5hZDAwcC00OCwKKwkweDEuMGUzZWMzMmQzZDFmM3ArMCwJIDB4MS5iYWMwcC00NiwKKwkweDEuMGVmYTU1ZmRmYTlhNnArMCwJLTB4MS40ZTgwcC00NywKKwkweDEuMGZiNjZhZmZlZDJmMHArMCwJLTB4MS5kMzAwcC00NywKKwkweDEuMTA3MzAyOGQ3MjM0YnArMCwJIDB4MS4xNTAwcC00OCwKKwkweDEuMTEzMDFkMDEyNWI1YnArMCwJIDB4MS5jMDAwcC00OSwKKwkweDEuMTFlZGJhYjVlMmFmOXArMCwJIDB4MS42YmMwcC00NiwKKwkweDEuMTJhYmRjMDZjMzFkNXArMCwJIDB4MS44NDAwcC00OSwKKwkweDEuMTM2YTgxNGYyMDQ3ZHArMCwJLTB4MS5lZDAwcC00NywKKwkweDEuMTQyOWFhZWE5MmRlOXArMCwJIDB4MS44ZTAwcC00OSwKKwkweDEuMTRlOTU5MzRmMzEzOHArMCwJIDB4MS5iNDAwcC00OSwKKwkweDEuMTVhOThjOGE1OGU3MXArMCwJIDB4MS41MzAwcC00NywKKwkweDEuMTY2YTQ1NDcxYzNkZnArMCwJIDB4MS4zMzgwcC00NywKKwkweDEuMTcyYjgzYzdkNTIxMXArMCwJIDB4MS44ZDQwcC00NSwKKwkweDEuMTdlZDQ4Njk1YmI5ZnArMCwJLTB4MS41ZDAwcC00NywKKwkweDEuMThhZjkzODhjOGQ5M3ArMCwJLTB4MS5jODgwcC00NiwKKwkweDEuMTk3MjY1ODM3NWQ2NnArMCwJIDB4MS4xZjAwcC00NiwKKwkweDEuMWEzNWJlYjZmY2JhN3ArMCwJIDB4MS4wNDgwcC00NiwKKwkweDEuMWFmOTlmODEzODdlM3ArMCwJLTB4MS43MzkwcC00MywKKwkweDEuMWJiZTA4NDA0NWQ1NHArMCwJIDB4MS40ZTQwcC00NSwKKwkweDEuMWM4MmY5NTI4MWM0M3ArMCwJLTB4MS5hMjAwcC00NywKKwkweDEuMWQ0ODczMTY4YjliMnArMCwJIDB4MS4zODAwcC00OSwKKwkweDEuMWUwZTc1ZWI0NDAzMXArMCwJIDB4MS5hYzAwcC00OSwKKwkweDEuMWVkNTAyMmZjZDkzOHArMCwJIDB4MS4xOTAwcC00NywKKwkweDEuMWY5YzE4NDM4Y2RmN3ArMCwJLTB4MS5iNzgwcC00NiwKKwkweDEuMjA2M2I4ODYyOGQ4ZnArMCwJIDB4MS5kOTQwcC00NSwKKwkweDEuMjEyYmUzNTc4YTgxZXArMCwJIDB4MS44MDAwcC01MCwKKwkweDEuMjFmNDk5MTdkZGQ0MXArMCwJIDB4MS5iMzQwcC00NSwKKwkweDEuMjJiZGRhMjc5MTMyM3ArMCwJIDB4MS45ZjgwcC00NiwKKwkweDEuMjM4N2E2ZTc1NjFlN3ArMCwJLTB4MS45YzgwcC00NiwKKwkweDEuMjQ1MWZmYjgyMTQyN3ArMCwJIDB4MS4yMzAwcC00NywKKwkweDEuMjUxY2U0ZmIyYTYwMnArMCwJLTB4MS4zNDgwcC00NiwKKwkweDEuMjVlODU3MTFlY2ViMHArMCwJIDB4MS4yNzAwcC00NiwKKwkweDEuMjZiNDU2NWUyN2QxNnArMCwJIDB4MS4xZDAwcC00NiwKKwkweDEuMjc4MGUzNDFkZTAwZnArMCwJIDB4MS4xZWUwcC00NCwKKwkweDEuMjg0ZGZlMWY1NjMzZXArMCwJLTB4MS40YzAwcC00NiwKKwkweDEuMjkxYmE3NTkxYmIzMHArMCwJLTB4MS4zZDgwcC00NiwKKwkweDEuMjllOWRmNTFmZGYwOXArMCwJIDB4MS44YjAwcC00NywKKwkweDEuMmFiOGE2NmQxMGU5YnArMCwJLTB4MS4yN2MwcC00NSwKKwkweDEuMmI4N2ZkMGRhZGEzYXArMCwJIDB4MS5hMzQwcC00NSwKKwkweDEuMmM1N2UzOTc3MWFmOXArMCwJLTB4MS4wODAwcC00NiwKKwkweDEuMmQyODVhNmU0MDJkOXArMCwJLTB4MS5lZDAwcC00NywKKwkweDEuMmRmOTYxZjY0MTU3OXArMCwJLTB4MS40MjAwcC00OCwKKwkweDEuMmVjYWZhOTNlMmVjZnArMCwJLTB4MS40OTgwcC00NSwKKwkweDEuMmY5ZDI0YWJkODgyMnArMCwJLTB4MS42MzAwcC00NiwKKwkweDEuMzA2ZmUwYTMxYjYyNXArMCwJLTB4MS4yMzYwcC00NCwKKwkweDEuMzE0MzJlZGVlYTUwYnArMCwJLTB4MS4wZGY4cC00MCwKKwkweDEuMzIxNzBmYzRjZDdiOHArMCwJLTB4MS4yNDgwcC00NSwKKwkweDEuMzJlYjgzYmE4ZTlhMnArMCwJLTB4MS41OTgwcC00NSwKKwkweDEuMzNjMDhiMjY0MTc2NnArMCwJIDB4MS5lZDAwcC00NiwKKwkweDEuMzQ5NjI2NmUzZmEyN3ArMCwJLTB4MS5jMDAwcC01MCwKKwkweDEuMzU2YzU1ZjkyOWYwZnArMCwJLTB4MS4wZDgwcC00NCwKKwkweDEuMzY0MzFhMmRlODhiOXArMCwJIDB4MS4yYzgwcC00NSwKKwkweDEuMzcxYTczNzNhYWEzOXArMCwJIDB4MS4wNjAwcC00NSwKKwkweDEuMzdmMjYyMzFlNzRmZXArMCwJLTB4MS42NjAwcC00NiwKKwkweDEuMzhjYWU2ZDA1ZDgzOHArMCwJLTB4MS5hZTAwcC00NywKKwkweDEuMzlhNDAxYjcxM2VjM3ArMCwJLTB4MS40NzIwcC00MywKKwkweDEuM2E3ZGIzNGU1YTAyMHArMCwJIDB4MS44MjAwcC00NywKKwkweDEuM2I1N2ZiZmVjNmU5NXArMCwJIDB4MS5lODAwcC00NCwKKwkweDEuM2MzMmRjMzEzYThmMnArMCwJIDB4MS5mODAwcC00OSwKKwkweDEuM2QwZTU0NGVkZTEyMnArMCwJLTB4MS43YTAwcC00NiwKKwkweDEuM2RlYTY0YzEyMzRiYnArMCwJIDB4MS42MzAwcC00NSwKKwkweDEuM2VjNzBkZjFjNGVjY3ArMCwJLTB4MS44YTYwcC00MywKKwkweDEuM2ZhNDUwNGFjN2U4Y3ArMCwJLTB4MS5jZGMwcC00NCwKKwkweDEuNDA4MjJjMzY3YTBiYnArMCwJIDB4MS41YjgwcC00NSwKKwkweDEuNDE2MGEyMWY3MmU5NXArMCwJIDB4MS5lYzAwcC00NiwKKwkweDEuNDIzZmIyNzA5NDY0NnArMCwJLTB4MS4zNjAwcC00NiwKKwkweDEuNDMxZjVkOTUwYTkyMHArMCwJIDB4MS4zOTgwcC00NSwKKwkweDEuNDNmZmEzZjg0YjllYnArMCwJIDB4MS5hMDAwcC00OCwKKwkweDEuNDRlMDg2MDYxODkxOXArMCwJLTB4MS42YzAwcC00OCwKKwkweDEuNDVjMjA0MmE3ZDIwMXArMCwJLTB4MS5iYzAwcC00NywKKwkweDEuNDZhNDFlZDFkMDAxNnArMCwJLTB4MS4yODAwcC00NiwKKwkweDEuNDc4NmQ2NjhiMzMyNnArMCwJIDB4MS4wZTAwcC00NCwKKwkweDEuNDg2YTJiNWMxM2MwMHArMCwJLTB4MS5kNDAwcC00NSwKKwkweDEuNDk0ZTFlMTkyYWYwNHArMCwJIDB4MS5jMjAwcC00NywKKwkweDEuNGEzMmFmMGQ3ZDM3MnArMCwJLTB4MS5lNTAwcC00NiwKKwkweDEuNGIxN2RlYTZkYjgwMXArMCwJIDB4MS43ODAwcC00NywKKwkweDEuNGJmZGFkNTM2MjllMXArMCwJLTB4MS4zODAwcC00NiwKKwkweDEuNGNlNDFiODE3YzEzMnArMCwJIDB4MS4wODAwcC00NywKKwkweDEuNGRjYjI5OWZkZGRkYnArMCwJIDB4MS5jNzAwcC00NSwKKwkweDEuNGViMmQ4MWQ4YWI5NnArMCwJLTB4MS5jZTAwcC00NiwKKwkweDEuNGY5YjI3NjlkMmQwMnArMCwJIDB4MS45MjAwcC00NiwKKwkweDEuNTA4NDE3ZjQ1MzFjMXArMCwJLTB4MS44YzAwcC00NywKKwkweDEuNTE2ZGFhMmNmNjYyYXArMCwJLTB4MS5hMDAwcC00OCwKKwkweDEuNTI1N2RlODNmNTFlYXArMCwJIDB4MS5hMDgwcC00MywKKwkweDEuNTM0MmI1NjlkNGVkYXArMCwJLTB4MS42ZDgwcC00NSwKKwkweDEuNTQyZTJmNGY2YWMxYXArMCwJLTB4MS4yNDQwcC00NCwKKwkweDEuNTUxYTRjYTVkOTRkYnArMCwJIDB4MS44M2MwcC00MywKKwkweDEuNTYwNzBkZGU5MTE2YnArMCwJIDB4MS40YjAwcC00NSwKKwkweDEuNTZmNDczNmI1MjlkZXArMCwJIDB4MS4xNWEwcC00MywKKwkweDEuNTdlMjdkYmUyYzQwZXArMCwJLTB4MS45ZTAwcC00NSwKKwkweDEuNThkMTJkNDk3Yzc2ZnArMCwJLTB4MS4zMDgwcC00NSwKKwkweDEuNTljMDgyN2ZmMGI0Y3ArMCwJIDB4MS5kZWMwcC00MywKKwkweDEuNWFiMDdkZDQ4NTQyN3ArMCwJLTB4MS40MDAwcC01MSwKKwkweDEuNWJhMTFmYmE4N2FmNHArMCwJIDB4MS4wMDgwcC00NCwKKwkweDEuNWM5MjY4YTU5NDYwYnArMCwJLTB4MS42YzgwcC00NSwKKwkweDEuNWQ4NDU5MDk5OGUzZnArMCwJIDB4MS42OWEwcC00MywKKwkweDEuNWU3NmYxNWFkMjBlMXArMCwJLTB4MS5iNDAwcC00NiwKKwkweDEuNWY2YTMyMGRjZWJjYXArMCwJIDB4MS43NzAwcC00NiwKKwkweDEuNjA1ZTFiOTc2ZGNiOHArMCwJIDB4MS42ZjgwcC00NSwKKwkweDEuNjE1MmFlNmNkZjcxNXArMCwJIDB4MS4xMDAwcC00NywKKwkweDEuNjI0N2ViMDNhNTUzMXArMCwJLTB4MS41ZDAwcC00NiwKKwkweDEuNjMzZGQxZDE5MjliNXArMCwJLTB4MS4yZDAwcC00NiwKKwkweDEuNjQzNDYzNGNjYzMxM3ArMCwJLTB4MS5hODAwcC00OSwKKwkweDEuNjUyYjlmZWJjOGVmYXArMCwJLTB4MS44NjAwcC00NSwKKwkweDEuNjYyMzg4MjU1MzM5N3ArMCwJIDB4MS4xZmUwcC00MCwKKwkweDEuNjcxYzFjNzA4MzI4ZXArMCwJLTB4MS43MjAwcC00NCwKKwkweDEuNjgxNTVkNDRjYTk3ZXArMCwJIDB4MS42ODAwcC00OSwKKwkweDEuNjkwZjRiMTllOTQ3MXArMCwJLTB4MS45NzgwcC00NSwKK307CisKKy8qCisgKiBleHAyKHgpOiBjb21wdXRlIHRoZSBiYXNlIDIgZXhwb25lbnRpYWwgb2YgeAorICoKKyAqIEFjY3VyYWN5OiBQZWFrIGVycm9yIDwgMC41MDMgdWxwIGZvciBub3JtYWxpemVkIHJlc3VsdHMuCisgKgorICogTWV0aG9kOiAoYWNjdXJhdGUgdGFibGVzKQorICoKKyAqICAgUmVkdWNlIHg6CisgKiAgICAgeCA9IDIqKmsgKyB5LCBmb3IgaW50ZWdlciBrIGFuZCB8eXwgPD0gMS8yLgorICogICAgIFRodXMgd2UgaGF2ZSBleHAyKHgpID0gMioqayAqIGV4cDIoeSkuCisgKgorICogICBSZWR1Y2UgeToKKyAqICAgICB5ID0gaS9UQkxTSVpFICsgeiAtIGVwc1tpXSBmb3IgaW50ZWdlciBpIG5lYXIgeSAqIFRCTFNJWkUuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDIoeSkgPSBleHAyKGkvVEJMU0laRSkgKiBleHAyKHogLSBlcHNbaV0pLAorICogICAgIHdpdGggfHogLSBlcHNbaV18IDw9IDIqKi05ICsgMioqLTM5IGZvciB0aGUgdGFibGUgdXNlZC4KKyAqCisgKiAgIFdlIGNvbXB1dGUgZXhwMihpL1RCTFNJWkUpIHZpYSB0YWJsZSBsb29rdXAgYW5kIGV4cDIoeiAtIGVwc1tpXSkgdmlhCisgKiAgIGEgZGVncmVlLTUgbWluaW1heCBwb2x5bm9taWFsIHdpdGggbWF4aW11bSBlcnJvciB1bmRlciAxLjMgKiAyKiotNjEuCisgKiAgIFRoZSB2YWx1ZXMgaW4gZXhwMnRbXSBhbmQgZXBzW10gYXJlIGNob3NlbiBzdWNoIHRoYXQKKyAqICAgZXhwMnRbaV0gPSBleHAyKGkvVEJMU0laRSArIGVwc1tpXSksIGFuZCBlcHNbaV0gaXMgYSBzbWFsbCBvZmZzZXQgc3VjaAorICogICB0aGF0IGV4cDJ0W2ldIGlzIGFjY3VyYXRlIHRvIDIqKi02NC4KKyAqCisgKiAgIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgaSBpcyArLVRCTFNJWkUvMiwgc28gd2UgYWN0dWFsbHkgaW5kZXggdGhlIHRhYmxlcworICogICBieSBpMCA9IGkgKyBUQkxTSVpFLzIuICBGb3IgY2FjaGUgZWZmaWNpZW5jeSwgZXhwMnRbXSBhbmQgZXBzW10gYXJlCisgKiAgIHZpcnR1YWwgdGFibGVzLCBpbnRlcmxlYXZlZCBpbiB0aGUgcmVhbCB0YWJsZSB0YmxbXS4KKyAqCisgKiAgIFRoaXMgbWV0aG9kIGlzIGR1ZSB0byBHYWwsIHdpdGggbWFueSBkZXRhaWxzIGR1ZSB0byBHYWwgYW5kIEJhY2hlbGlzOgorICoKKyAqCUdhbCwgUy4gYW5kIEJhY2hlbGlzLCBCLiAgQW4gQWNjdXJhdGUgRWxlbWVudGFyeSBNYXRoZW1hdGljYWwgTGlicmFyeQorICoJZm9yIHRoZSBJRUVFIEZsb2F0aW5nIFBvaW50IFN0YW5kYXJkLiAgVE9NUyAxNygxKSwgMjYtNDYgKDE5OTEpLgorICovCitkb3VibGUKK2V4cDIoZG91YmxlIHgpCit7CisJZG91YmxlIHIsIHQsIHo7CisJdWludDMyX3QgaHgsIGhyLCBpeCwgbHgsIGkwOworCWludCBrOworCisJLyogRmlsdGVyIG91dCBleGNlcHRpb25hbCBjYXNlcy4gKi8KKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCWlmKGl4ID49IDB4NDA5MDAwMDApIHsJCQkvKiB8eHwgPj0gMTAyNCAqLworCQlpZihpeCA+PSAweDdmZjAwMDAwKSB7CisJCQlHRVRfTE9XX1dPUkQobHgseCk7CisJCQlpZigoKGl4ICYgMHhmZmZmZikgfCBseCkgIT0gMCB8fCAoaHggJiAweDgwMDAwMDAwKSA9PSAwKQorCQkJCXJldHVybiAoeCk7IAkvKiB4IGlzIE5hTiBvciArSW5mICovCisJCQllbHNlIAorCQkJCXJldHVybiAoMC4wKTsJLyogeCBpcyAtSW5mICovCisJCX0KKwkJaWYoeCA+PSAweDEuMHAxMCkKKwkJCXJldHVybiAoaHVnZSAqIGh1Z2UpOyAvKiBvdmVyZmxvdyAqLworCQlpZih4IDw9IC0weDEuMGNjcDEwKQorCQkJcmV0dXJuICh0d29tMTAwMCAqIHR3b20xMDAwKTsgLyogdW5kZXJmbG93ICovCisJfSBlbHNlIGlmIChpeCA8IDB4M2M5MDAwMDApIHsJCS8qIHx4fCA8IDB4MXAtNTQgKi8KKwkJcmV0dXJuICgxLjAgKyB4KTsKKwl9CisKKwkvKiBSZWR1Y2UgeCwgY29tcHV0aW5nIHosIGkwLCBhbmQgay4gKi8KKwl0ID0geCArIHJlZHV4OworCUdFVF9MT1dfV09SRChpMCwgdCk7CisJaTAgKz0gVEJMU0laRSAvIDI7CisJayA9IChpMCA+PiBUQkxCSVRTKSA8PCAyMDsKKwlpMCA9IChpMCAmIChUQkxTSVpFIC0gMSkpIDw8IDE7CisJdCAtPSByZWR1eDsKKwl6ID0geCAtIHQ7CisKKwkvKiBDb21wdXRlIHIgPSBleHAyKHkpID0gZXhwMnRbaTBdICogcCh6IC0gZXBzW2ldKS4gKi8KKwl0ID0gdGJsW2kwXTsJCS8qIGV4cDJ0W2kwXSAqLworCXogLT0gdGJsW2kwICsgMV07CS8qIGVwc1tpMF0gICAqLworCXIgPSB0ICsgdCAqIHogKiAoUDEgKyB6ICogKFAyICsgeiAqIChQMyArIHogKiAoUDQgKyB6ICogUDUpKSkpOworCisJLyogU2NhbGUgYnkgMioqKGs+PjIwKS4gKi8KKwlpZihrID49IC0xMDIxIDw8IDIwKSB7CisJCWlmIChrICE9IDApIHsKKwkJCUdFVF9ISUdIX1dPUkQoaHIsIHIpOworCQkJU0VUX0hJR0hfV09SRChyLCBociArIGspOworCQl9CisJCXJldHVybiAocik7CisJfSBlbHNlIHsKKwkJR0VUX0hJR0hfV09SRChociwgcik7CisJCVNFVF9ISUdIX1dPUkQociwgaHIgKyAoayArICgxMDAwIDw8IDIwKSkpOworCQlyZXR1cm4gKHIgKiB0d29tMTAwMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19leHAyZi5jIGIvbGlibS9zcmMvc19leHAyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOThlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cDJmLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwMmYuYyx2IDEuMSAyMDA1LzA0LzA1IDAyOjU3OjE1IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjZGVmaW5lCVRCTEJJVFMJNAorI2RlZmluZQlUQkxTSVpFCSgxIDw8IFRCTEJJVFMpCisKK3N0YXRpYyBjb25zdCBmbG9hdAorICAgIGh1Z2UgICAgPSAweDFwMTAwZiwKKyAgICB0d29tMTAwID0gMHgxcC0xMDBmLAorICAgIHJlZHV4ICAgPSAweDEuOHAyM2YgLyBUQkxTSVpFLAorICAgIFAxCSAgICA9IDB4MS42MmU0MzBwLTFmLAorICAgIFAyCSAgICA9IDB4MS5lYmZiZTBwLTNmLAorICAgIFAzCSAgICA9IDB4MS5jNmIzNDhwLTVmLAorICAgIFA0CSAgICA9IDB4MS4zYjJjOWNwLTdmOworCitzdGF0aWMgY29uc3QgZG91YmxlIGV4cDJmdFtUQkxTSVpFXSA9IHsKKwkweDEuNmEwOWU2NjdmM2JjZHAtMSwKKwkweDEuN2ExMTQ3M2ViMDE4N3AtMSwKKwkweDEuOGFjZTU0MjJhYTBkYnAtMSwKKwkweDEuOWM0OTE4MmEzZjA5MHAtMSwKKwkweDEuYWU4OWY5OTVhZDNhZHAtMSwKKwkweDEuYzE5OWJkZDg1NTI5Y3AtMSwKKwkweDEuZDU4MThkY2ZiYTQ4N3AtMSwKKwkweDEuZWE0YWZhMmE0OTBkYXAtMSwKKwkweDEuMDAwMDAwMDAwMDAwMHArMCwKKwkweDEuMGI1NTg2Y2Y5ODkwZnArMCwKKwkweDEuMTcyYjgzYzdkNTE3YnArMCwKKwkweDEuMjM4N2E2ZTc1NjIzOHArMCwKKwkweDEuMzA2ZmUwYTMxYjcxNXArMCwKKwkweDEuM2RlYTY0YzEyMzQyMnArMCwKKwkweDEuNGJmZGFkNTM2MmEyN3ArMCwKKwkweDEuNWFiMDdkZDQ4NTQyOXArMCwKK307CisJCisvKgorICogZXhwMmYoeCk6IGNvbXB1dGUgdGhlIGJhc2UgMiBleHBvbmVudGlhbCBvZiB4CisgKgorICogQWNjdXJhY3k6IFBlYWsgZXJyb3IgPCAwLjUwMSB1bHA7IGxvY2F0aW9uIG9mIHBlYWs6IC0wLjAzMDExMDkyNy4KKyAqCisgKiBNZXRob2Q6IChlcXVhbGx5LXNwYWNlZCB0YWJsZXMpCisgKgorICogICBSZWR1Y2UgeDoKKyAqICAgICB4ID0gMioqayArIHksIGZvciBpbnRlZ2VyIGsgYW5kIHx5fCA8PSAxLzIuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDJmKHgpID0gMioqayAqIGV4cDIoeSkuCisgKgorICogICBSZWR1Y2UgeToKKyAqICAgICB5ID0gaS9UQkxTSVpFICsgeiBmb3IgaW50ZWdlciBpIG5lYXIgeSAqIFRCTFNJWkUuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDIoeSkgPSBleHAyKGkvVEJMU0laRSkgKiBleHAyKHopLAorICogICAgIHdpdGggfHp8IDw9IDIqKi0oVEJMU0laRSsxKS4KKyAqCisgKiAgIFdlIGNvbXB1dGUgZXhwMihpL1RCTFNJWkUpIHZpYSB0YWJsZSBsb29rdXAgYW5kIGV4cDIoeikgdmlhIGEKKyAqICAgZGVncmVlLTQgbWluaW1heCBwb2x5bm9taWFsIHdpdGggbWF4aW11bSBlcnJvciB1bmRlciAxLjQgKiAyKiotMzMuCisgKiAgIFVzaW5nIGRvdWJsZSBwcmVjaXNpb24gaW4gdGhlIGZpbmFsIGNhbGN1bGF0aW9uIGF2b2lkcyByb3VuZG9mZiBlcnJvci4KKyAqCisgKiAgIFRoaXMgbWV0aG9kIGlzIGR1ZSB0byBUYW5nLCBidXQgSSBkbyBub3QgdXNlIGhpcyBzdWdnZXN0ZWQgcGFyYW1ldGVyczoKKyAqCisgKglUYW5nLCBQLiAgVGFibGUtZHJpdmVuIEltcGxlbWVudGF0aW9uIG9mIHRoZSBFeHBvbmVudGlhbCBGdW5jdGlvbgorICoJaW4gSUVFRSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLiAgVE9NUyAxNSgyKSwgMTQ0LTE1NyAoMTk4OSkuCisgKi8KK2Zsb2F0CitleHAyZihmbG9hdCB4KQoreworCWRvdWJsZSB0djsKKwlmbG9hdCByLCB6OworCXZvbGF0aWxlIGZsb2F0IHQ7CS8qIHByZXZlbnQgZ2NjIGZyb20gdXNpbmcgdG9vIG11Y2ggcHJlY2lzaW9uICovCisJdWludDMyX3QgaHgsIGhyLCBpeCwgaTA7CisJaW50MzJfdCBrOworCisJLyogRmlsdGVyIG91dCBleGNlcHRpb25hbCBjYXNlcy4gKi8KKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKwlpZihpeCA+PSAweDQzMDAwMDAwKSB7CQkJLyogfHh8ID49IDEyOCAqLworCQlpZihpeCA+PSAweDdmODAwMDAwKSB7CisJCQlpZiAoKGl4ICYgMHg3ZmZmZmYpICE9IDAgfHwgKGh4ICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOyAJLyogeCBpcyBOYU4gb3IgK0luZiAqLworCQkJZWxzZSAKKwkJCQlyZXR1cm4gKDAuMCk7CS8qIHggaXMgLUluZiAqLworCQl9CisJCWlmKHggPj0gMHgxLjBwN2YpCisJCQlyZXR1cm4gKGh1Z2UgKiBodWdlKTsJLyogb3ZlcmZsb3cgKi8KKwkJaWYoeCA8PSAtMHgxLjJjcDdmKQorCQkJcmV0dXJuICh0d29tMTAwICogdHdvbTEwMCk7IC8qIHVuZGVyZmxvdyAqLworCX0gZWxzZSBpZiAoaXggPD0gMHgzMzAwMDAwMCkgewkJLyogfHh8IDw9IDB4MXAtMjUgKi8KKwkJcmV0dXJuICgxLjBmICsgeCk7CisJfQorCisJLyogUmVkdWNlIHgsIGNvbXB1dGluZyB6LCBpMCwgYW5kIGsuICovCisJdCA9IHggKyByZWR1eDsKKwlHRVRfRkxPQVRfV09SRChpMCwgdCk7CisJaTAgKz0gVEJMU0laRSAvIDI7CisJayA9IChpMCA+PiBUQkxCSVRTKSA8PCAyMzsKKwlpMCAmPSBUQkxTSVpFIC0gMTsKKwl0IC09IHJlZHV4OworCXogPSB4IC0gdDsKKworCS8qIENvbXB1dGUgciA9IGV4cDIoeSkgPSBleHAyZnRbaTBdICogcCh6KS4gKi8KKwl0diA9IGV4cDJmdFtpMF07CisJciA9IHR2ICsgdHYgKiAoeiAqIChQMSArIHogKiAoUDIgKyB6ICogKFAzICsgeiAqIFA0KSkpKTsKKworCS8qIFNjYWxlIGJ5IDIqKihrPj4yMykuICovCisJaWYoayA+PSAtMTI1IDw8IDIzKSB7CisJCWlmIChrICE9IDApIHsKKwkJCUdFVF9GTE9BVF9XT1JEKGhyLCByKTsKKwkJCVNFVF9GTE9BVF9XT1JEKHIsIGhyICsgayk7CisJCX0KKwkJcmV0dXJuIChyKTsKKwl9IGVsc2UgeworCQlHRVRfRkxPQVRfV09SRChociwgcik7CisJCVNFVF9GTE9BVF9XT1JEKHIsIGhyICsgKGsgKyAoMTAwIDw8IDIzKSkpOworCQlyZXR1cm4gKHIgKiB0d29tMTAwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cG0xLmMgYi9saWJtL3NyYy9zX2V4cG0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhYTNmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXhwbTEuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogQCgjKXNfZXhwbTEuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwbTEuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogZXhwbTEoeCkKKyAqIFJldHVybnMgZXhwKHgpLTEsIHRoZSBleHBvbmVudGlhbCBvZiB4IG1pbnVzIDEuCisgKgorICogTWV0aG9kCisgKiAgIDEuIEFyZ3VtZW50IHJlZHVjdGlvbjoKKyAqCUdpdmVuIHgsIGZpbmQgciBhbmQgaW50ZWdlciBrIHN1Y2ggdGhhdAorICoKKyAqICAgICAgICAgICAgICAgeCA9IGsqbG4yICsgciwgIHxyfCA8PSAwLjUqbG4yIH4gMC4zNDY1OAorICoKKyAqICAgICAgSGVyZSBhIGNvcnJlY3Rpb24gdGVybSBjIHdpbGwgYmUgY29tcHV0ZWQgdG8gY29tcGVuc2F0ZQorICoJdGhlIGVycm9yIGluIHIgd2hlbiByb3VuZGVkIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICoKKyAqICAgMi4gQXBwcm94aW1hdGluZyBleHBtMShyKSBieSBhIHNwZWNpYWwgcmF0aW9uYWwgZnVuY3Rpb24gb24KKyAqCXRoZSBpbnRlcnZhbCBbMCwwLjM0NjU4XToKKyAqCVNpbmNlCisgKgkgICAgciooZXhwKHIpKzEpLyhleHAociktMSkgPSAyKyByXjIvNiAtIHJeNC8zNjAgKyAuLi4KKyAqCXdlIGRlZmluZSBSMShyKnIpIGJ5CisgKgkgICAgciooZXhwKHIpKzEpLyhleHAociktMSkgPSAyKyByXjIvNiAqIFIxKHIqcikKKyAqCVRoYXQgaXMsCisgKgkgICAgUjEocioqMikgPSA2L3IgKigoZXhwKHIpKzEpLyhleHAociktMSkgLSAyL3IpCisgKgkJICAgICA9IDYvciAqICggMSArIDIuMCooMS8oZXhwKHIpLTEpIC0gMS9yKSkKKyAqCQkgICAgID0gMSAtIHJeMi82MCArIHJeNC8yNTIwIC0gcl42LzEwMDgwMCArIC4uLgorICogICAgICBXZSB1c2UgYSBzcGVjaWFsIFJlbWUgYWxnb3JpdGhtIG9uIFswLDAuMzQ3XSB0byBnZW5lcmF0ZQorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNSBpbiByKnIgdG8gYXBwcm94aW1hdGUgUjEuIFRoZQorICoJbWF4aW11bSBlcnJvciBvZiB0aGlzIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBpcyBib3VuZGVkCisgKglieSAyKiotNjEuIEluIG90aGVyIHdvcmRzLAorICoJICAgIFIxKHopIH4gMS4wICsgUTEqeiArIFEyKnoqKjIgKyBRMyp6KiozICsgUTQqeioqNCArIFE1KnoqKjUKKyAqCXdoZXJlIAlRMSAgPSAgLTEuNjY2NjY2NjY2NjY2NjU2NzM4NEUtMiwKKyAqIAkJUTIgID0gICAzLjk2ODI1Mzk2ODEzNzAzNjU4NzNFLTQsCisgKiAJCVEzICA9ICAtOS45MjA2MzQ0NzMzNDM1OTg3MzU3RS02LAorICogCQlRNCAgPSAgIDIuNTA1MTM2MTQyMDgwODUxNzAwMkUtNywKKyAqIAkJUTUgID0gIC02LjI4NDM1MDU2ODIzODI2MTcxMDJFLTk7CisgKiAgCSh3aGVyZSB6PXIqciwgYW5kIHRoZSB2YWx1ZXMgb2YgUTEgdG8gUTUgYXJlIGxpc3RlZCBiZWxvdykKKyAqCXdpdGggZXJyb3IgYm91bmRlZCBieQorICoJICAgIHwgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICB8ICAgICAtNjEKKyAqCSAgICB8IDEuMCtRMSp6Ky4uLitRNSp6ICAgLSAgUjEoeikgfCA8PSAyCisgKgkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCisgKglleHBtMShyKSA9IGV4cChyKS0xIGlzIHRoZW4gY29tcHV0ZWQgYnkgdGhlIGZvbGxvd2luZworICogCXNwZWNpZmljIHdheSB3aGljaCBtaW5pbWl6ZSB0aGUgYWNjdW11bGF0aW9uIHJvdW5kaW5nIGVycm9yOgorICoJCQkgICAgICAgMiAgICAgMworICoJCQkgICAgICByICAgICByICAgIFsgMyAtIChSMSArIFIxKnIvMikgIF0KKyAqCSAgICAgIGV4cG0xKHIpID0gciArIC0tLSArIC0tLSAqIFstLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAqCQkgICAgICAgICAgICAgIDIgICAgIDIgICAgWyA2IC0gciooMyAtIFIxKnIvMikgXQorICoKKyAqCVRvIGNvbXBlbnNhdGUgdGhlIGVycm9yIGluIHRoZSBhcmd1bWVudCByZWR1Y3Rpb24sIHdlIHVzZQorICoJCWV4cG0xKHIrYykgPSBleHBtMShyKSArIGMgKyBleHBtMShyKSpjCisgKgkJCSAgIH4gZXhwbTEocikgKyBjICsgcipjCisgKglUaHVzIGMrcipjIHdpbGwgYmUgYWRkZWQgaW4gYXMgdGhlIGNvcnJlY3Rpb24gdGVybXMgZm9yCisgKglleHBtMShyK2MpLiBOb3cgcmVhcnJhbmdlIHRoZSB0ZXJtIHRvIGF2b2lkIG9wdGltaXphdGlvbgorICogCXNjcmV3IHVwOgorICoJCSAgICAgICAgKCAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICkKKyAqCQkgICAgICAgICh7ICAoIHIgICAgWyBSMSAtICAoMyAtIFIxKnIvMikgXSAgKSAgfSAgICByICApCisgKgkgZXhwbTEocitjKX5yIC0gKHtyKigtLS0gKiBbLS0tLS0tLS0tLS0tLS0tLS0tLS1dLWMpLWN9IC0gLS0tICkKKyAqCSAgICAgICAgICAgICAgICAoeyAgKCAyICAgIFsgNiAtIHIqKDMgLSBSMSpyLzIpIF0gICkgIH0gICAgMiAgKQorICogICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAqCisgKgkJICAgPSByIC0gRQorICogICAzLiBTY2FsZSBiYWNrIHRvIG9idGFpbiBleHBtMSh4KToKKyAqCUZyb20gc3RlcCAxLCB3ZSBoYXZlCisgKgkgICBleHBtMSh4KSA9IGVpdGhlciAyXmsqW2V4cG0xKHIpKzFdIC0gMQorICoJCSAgICA9IG9yICAgICAyXmsqW2V4cG0xKHIpICsgKDEtMl4tayldCisgKiAgIDQuIEltcGxlbWVudGF0aW9uIG5vdGVzOgorICoJKEEpLiBUbyBzYXZlIG9uZSBtdWx0aXBsaWNhdGlvbiwgd2Ugc2NhbGUgdGhlIGNvZWZmaWNpZW50IFFpCisgKgkgICAgIHRvIFFpKjJeaSwgYW5kIHJlcGxhY2UgeiBieSAoeF4yKS8yLgorICoJKEIpLiBUbyBhY2hpZXZlIG1heGltdW0gYWNjdXJhY3ksIHdlIGNvbXB1dGUgZXhwbTEoeCkgYnkKKyAqCSAgKGkpICAgaWYgeCA8IC01NipsbjIsIHJldHVybiAtMS4wLCAocmFpc2UgaW5leGFjdCBpZiB4IT1pbmYpCisgKgkgIChpaSkgIGlmIGs9MCwgcmV0dXJuIHItRQorICoJICAoaWlpKSBpZiBrPS0xLCByZXR1cm4gMC41KihyLUUpLTAuNQorICogICAgICAgIChpdikJaWYgaz0xIGlmIHIgPCAtMC4yNSwgcmV0dXJuIDIqKChyKzAuNSktIEUpCisgKgkgICAgICAgCSAgICAgICBlbHNlCSAgICAgcmV0dXJuICAxLjArMi4wKihyLUUpOworICoJICAodikgICBpZiAoazwtMnx8az41NikgcmV0dXJuIDJeaygxLShFLXIpKSAtIDEgKG9yIGV4cCh4KS0xKQorICoJICAodmkpICBpZiBrIDw9IDIwLCByZXR1cm4gMl5rKCgxLTJeLWspLShFLXIpKSwgZWxzZQorICoJICAodmlpKSByZXR1cm4gMl5rKDEtKChFKzJeLWspLXIpKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglleHBtMShJTkYpIGlzIElORiwgZXhwbTEoTmFOKSBpcyBOYU47CisgKglleHBtMSgtSU5GKSBpcyAtMSwgYW5kCisgKglmb3IgZmluaXRlIGFyZ3VtZW50LCBvbmx5IGV4cG0xKDApPTAgaXMgZXhhY3QuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogTWlzYy4gaW5mby4KKyAqCUZvciBJRUVFIGRvdWJsZQorICoJICAgIGlmIHggPiAgNy4wOTc4MjcxMjg5MzM4Mzk3MzA5NmUrMDIgdGhlbiBleHBtMSh4KSBvdmVyZmxvdworICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lCQk9IDEuMCwKK2h1Z2UJCT0gMS4wZSszMDAsCit0aW55CQk9IDEuMGUtMzAwLAorb190aHJlc2hvbGQJPSA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMiwvKiAweDQwODYyRTQyLCAweEZFRkEzOUVGICovCitsbjJfaGkJCT0gNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsLyogMHgzZmU2MmU0MiwgMHhmZWUwMDAwMCAqLworbG4yX2xvCQk9IDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLC8qIDB4M2RlYTM5ZWYsIDB4MzU3OTNjNzYgKi8KK2ludmxuMgkJPSAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwZSswMCwvKiAweDNmZjcxNTQ3LCAweDY1MmI4MmZlICovCisJLyogc2NhbGVkIGNvZWZmaWNpZW50cyByZWxhdGVkIHRvIGV4cG0xICovCitRMSAgPSAgLTMuMzMzMzMzMzMzMzMzMzEzMTY0MjhlLTAyLCAvKiBCRkExMTExMSAxMTExMTBGNCAqLworUTIgID0gICAxLjU4NzMwMTU4NzI1NDgxNDYwMTY1ZS0wMywgLyogM0Y1QTAxQTAgMTlGRTU1ODUgKi8KK1EzICA9ICAtNy45MzY1MDc1Nzg2NzQ4Nzk0MjQ3M2UtMDUsIC8qIEJGMTRDRTE5IDlFQUFEQkI3ICovCitRNCAgPSAgIDQuMDA4MjE3ODI3MzI5MzYyMzk1NTJlLTA2LCAvKiAzRUQwQ0ZDQSA4NkU2NTIzOSAqLworUTUgID0gIC0yLjAxMDk5MjE4MTgzNjI0MzcxMzI2ZS0wNzsgLyogQkU4QUZEQjcgNkUwOUMzMkQgKi8KKworZG91YmxlCitleHBtMShkb3VibGUgeCkKK3sKKwlkb3VibGUgeSxoaSxsbyxjLHQsZSxoeHMsaGZ4LHIxOworCWludDMyX3Qgayx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwl4c2IgPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWlmKHhzYj09MCkgeT14OyBlbHNlIHk9IC14OwkvKiB5ID0gfHh8ICovCisJaHggJj0gMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKworICAgIC8qIGZpbHRlciBvdXQgaHVnZSBhbmQgbm9uLWZpbml0ZSBhcmd1bWVudCAqLworCWlmKGh4ID49IDB4NDA0MzY4N0EpIHsJCQkvKiBpZiB8eHw+PTU2KmxuMiAqLworCSAgICBpZihoeCA+PSAweDQwODYyRTQyKSB7CQkvKiBpZiB8eHw+PTcwOS43OC4uLiAqLworICAgICAgICAgICAgICAgIGlmKGh4Pj0weDdmZjAwMDAwKSB7CisJCSAgICB1X2ludDMyX3QgbG93OworCQkgICAgR0VUX0xPV19XT1JEKGxvdyx4KTsKKwkJICAgIGlmKCgoaHgmMHhmZmZmZil8bG93KSE9MCkKKwkJICAgICAgICAgcmV0dXJuIHgreDsgCSAvKiBOYU4gKi8KKwkJICAgIGVsc2UgcmV0dXJuICh4c2I9PTApPyB4Oi0xLjA7LyogZXhwKCstaW5mKT17aW5mLC0xfSAqLworCSAgICAgICAgfQorCSAgICAgICAgaWYoeCA+IG9fdGhyZXNob2xkKSByZXR1cm4gaHVnZSpodWdlOyAvKiBvdmVyZmxvdyAqLworCSAgICB9CisJICAgIGlmKHhzYiE9MCkgeyAvKiB4IDwgLTU2KmxuMiwgcmV0dXJuIC0xLjAgd2l0aCBpbmV4YWN0ICovCisJCWlmKHgrdGlueTwwLjApCQkvKiByYWlzZSBpbmV4YWN0ICovCisJCXJldHVybiB0aW55LW9uZTsJLyogcmV0dXJuIC0xICovCisJICAgIH0KKwl9CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwlpZihoeCA+IDB4M2ZkNjJlNDIpIHsJCS8qIGlmICB8eHwgPiAwLjUgbG4yICovCisJICAgIGlmKGh4IDwgMHgzRkYwQTJCMikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQlpZih4c2I9PTApCisJCSAgICB7aGkgPSB4IC0gbG4yX2hpOyBsbyA9ICBsbjJfbG87ICBrID0gIDE7fQorCQllbHNlCisJCSAgICB7aGkgPSB4ICsgbG4yX2hpOyBsbyA9IC1sbjJfbG87ICBrID0gLTE7fQorCSAgICB9IGVsc2UgeworCQlrICA9IGludmxuMip4KygoeHNiPT0wKT8wLjU6LTAuNSk7CisJCXQgID0gazsKKwkJaGkgPSB4IC0gdCpsbjJfaGk7CS8qIHQqbG4yX2hpIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMl9sbzsKKwkgICAgfQorCSAgICB4ICA9IGhpIC0gbG87CisJICAgIGMgID0gKGhpLXgpLWxvOworCX0KKwllbHNlIGlmKGh4IDwgMHgzYzkwMDAwMCkgeyAgCS8qIHdoZW4gfHh8PDIqKi01NCwgcmV0dXJuIHggKi8KKwkgICAgdCA9IGh1Z2UreDsJLyogcmV0dXJuIHggd2l0aCBpbmV4YWN0IGZsYWdzIHdoZW4geCE9MCAqLworCSAgICByZXR1cm4geCAtICh0LShodWdlK3gpKTsKKwl9CisJZWxzZSBrID0gMDsKKworICAgIC8qIHggaXMgbm93IGluIHByaW1hcnkgcmFuZ2UgKi8KKwloZnggPSAwLjUqeDsKKwloeHMgPSB4KmhmeDsKKwlyMSA9IG9uZStoeHMqKFExK2h4cyooUTIraHhzKihRMytoeHMqKFE0K2h4cypRNSkpKSk7CisJdCAgPSAzLjAtcjEqaGZ4OworCWUgID0gaHhzKigocjEtdCkvKDYuMCAtIHgqdCkpOworCWlmKGs9PTApIHJldHVybiB4IC0gKHgqZS1oeHMpOwkJLyogYyBpcyAwICovCisJZWxzZSB7CisJICAgIGUgID0gKHgqKGUtYyktYyk7CisJICAgIGUgLT0gaHhzOworCSAgICBpZihrPT0gLTEpIHJldHVybiAwLjUqKHgtZSktMC41OworCSAgICBpZihrPT0xKQorCSAgICAgICAJaWYoeCA8IC0wLjI1KSByZXR1cm4gLTIuMCooZS0oeCswLjUpKTsKKwkgICAgICAgCWVsc2UgCSAgICAgIHJldHVybiAgb25lKzIuMCooeC1lKTsKKwkgICAgaWYgKGsgPD0gLTIgfHwgaz41NikgeyAgIC8qIHN1ZmZpY2UgdG8gcmV0dXJuIGV4cCh4KS0xICovCisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgICAgIHkgPSBvbmUtKGUteCk7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5KTsKKwkJU0VUX0hJR0hfV09SRCh5LGhpZ2grKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICAgICAgcmV0dXJuIHktb25lOworCSAgICB9CisJICAgIHQgPSBvbmU7CisJICAgIGlmKGs8MjApIHsKKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCSAgICAgICAgU0VUX0hJR0hfV09SRCh0LDB4M2ZmMDAwMDAgLSAoMHgyMDAwMDA+PmspKTsgIC8qIHQ9MS0yXi1rICovCisJICAgICAgIAl5ID0gdC0oZS14KTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHkpOworCQlTRVRfSElHSF9XT1JEKHksaGlnaCsoazw8MjApKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgfSBlbHNlIHsKKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCQlTRVRfSElHSF9XT1JEKHQsKCgweDNmZi1rKTw8MjApKTsJLyogMl4tayAqLworCSAgICAgICAJeSA9IHgtKGUrdCk7CisJICAgICAgIAl5ICs9IG9uZTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHkpOworCQlTRVRfSElHSF9XT1JEKHksaGlnaCsoazw8MjApKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgIH0KKwl9CisJcmV0dXJuIHk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cG0xZi5jIGIvbGlibS9zcmMvc19leHBtMWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcwYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19leHBtMWYuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogc19leHBtMWYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZXhwbTEuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwbTFmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorb25lCQk9IDEuMCwKK2h1Z2UJCT0gMS4wZSszMCwKK3RpbnkJCT0gMS4wZS0zMCwKK29fdGhyZXNob2xkCT0gOC44NzIxNjc5Njg4ZSswMSwvKiAweDQyYjE3MTgwICovCitsbjJfaGkJCT0gNi45MzEzODEyMjU2ZS0wMSwvKiAweDNmMzE3MTgwICovCitsbjJfbG8JCT0gOS4wNTgwMDA2MTQ1ZS0wNiwvKiAweDM3MTdmN2QxICovCitpbnZsbjIJCT0gMS40NDI2OTUwMjE2ZSswMCwvKiAweDNmYjhhYTNiICovCisJLyogc2NhbGVkIGNvZWZmaWNpZW50cyByZWxhdGVkIHRvIGV4cG0xICovCitRMSAgPSAgLTMuMzMzMzMzNTA3MmUtMDIsIC8qIDB4YmQwODg4ODkgKi8KK1EyICA9ICAgMS41ODczMDE2MDkxZS0wMywgLyogMHgzYWQwMGQwMSAqLworUTMgID0gIC03LjkzNjUwNzYwOTBlLTA1LCAvKiAweGI4YTY3MGNkICovCitRNCAgPSAgIDQuMDA4MjE3NzI5M2UtMDYsIC8qIDB4MzY4NjdlNTQgKi8KK1E1ICA9ICAtMi4wMTA5OTIxMTk1ZS0wNzsgLyogMHhiNDU3ZWRiYiAqLworCitmbG9hdAorZXhwbTFmKGZsb2F0IHgpCit7CisJZmxvYXQgeSxoaSxsbyxjLHQsZSxoeHMsaGZ4LHIxOworCWludDMyX3Qgayx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJeHNiID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gYml0IG9mIHggKi8KKwlpZih4c2I9PTApIHk9eDsgZWxzZSB5PSAteDsJLyogeSA9IHx4fCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IGh1Z2UgYW5kIG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQxOTViODQ0KSB7CQkJLyogaWYgfHh8Pj0yNypsbjIgKi8KKwkgICAgaWYoaHggPj0gMHg0MmIxNzIxOCkgewkJLyogaWYgfHh8Pj04OC43MjEuLi4gKi8KKyAgICAgICAgICAgICAgICBpZihoeD4weDdmODAwMDAwKQorCQkgICAgcmV0dXJuIHgreDsgCSAvKiBOYU4gKi8KKwkJaWYoaHg9PTB4N2Y4MDAwMDApCisJCSAgICByZXR1cm4gKHhzYj09MCk/IHg6LTEuMDsvKiBleHAoKy1pbmYpPXtpbmYsLTF9ICovCisJICAgICAgICBpZih4ID4gb190aHJlc2hvbGQpIHJldHVybiBodWdlKmh1Z2U7IC8qIG92ZXJmbG93ICovCisJICAgIH0KKwkgICAgaWYoeHNiIT0wKSB7IC8qIHggPCAtMjcqbG4yLCByZXR1cm4gLTEuMCB3aXRoIGluZXhhY3QgKi8KKwkJaWYoeCt0aW55PChmbG9hdCkwLjApCS8qIHJhaXNlIGluZXhhY3QgKi8KKwkJcmV0dXJuIHRpbnktb25lOwkvKiByZXR1cm4gLTEgKi8KKwkgICAgfQorCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZWIxNzIxOCkgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8KKwkgICAgaWYoaHggPCAweDNGODUxNTkyKSB7CS8qIGFuZCB8eHwgPCAxLjUgbG4yICovCisJCWlmKHhzYj09MCkKKwkJICAgIHtoaSA9IHggLSBsbjJfaGk7IGxvID0gIGxuMl9sbzsgIGsgPSAgMTt9CisJCWVsc2UKKwkJICAgIHtoaSA9IHggKyBsbjJfaGk7IGxvID0gLWxuMl9sbzsgIGsgPSAtMTt9CisJICAgIH0gZWxzZSB7CisJCWsgID0gaW52bG4yKngrKCh4c2I9PTApPyhmbG9hdCkwLjU6KGZsb2F0KS0wLjUpOworCQl0ICA9IGs7CisJCWhpID0geCAtIHQqbG4yX2hpOwkvKiB0KmxuMl9oaSBpcyBleGFjdCBoZXJlICovCisJCWxvID0gdCpsbjJfbG87CisJICAgIH0KKwkgICAgeCAgPSBoaSAtIGxvOworCSAgICBjICA9IChoaS14KS1sbzsKKwl9CisJZWxzZSBpZihoeCA8IDB4MzMwMDAwMDApIHsgIAkvKiB3aGVuIHx4fDwyKiotMjUsIHJldHVybiB4ICovCisJICAgIHQgPSBodWdlK3g7CS8qIHJldHVybiB4IHdpdGggaW5leGFjdCBmbGFncyB3aGVuIHghPTAgKi8KKwkgICAgcmV0dXJuIHggLSAodC0oaHVnZSt4KSk7CisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJaGZ4ID0gKGZsb2F0KTAuNSp4OworCWh4cyA9IHgqaGZ4OworCXIxID0gb25lK2h4cyooUTEraHhzKihRMitoeHMqKFEzK2h4cyooUTQraHhzKlE1KSkpKTsKKwl0ICA9IChmbG9hdCkzLjAtcjEqaGZ4OworCWUgID0gaHhzKigocjEtdCkvKChmbG9hdCk2LjAgLSB4KnQpKTsKKwlpZihrPT0wKSByZXR1cm4geCAtICh4KmUtaHhzKTsJCS8qIGMgaXMgMCAqLworCWVsc2UgeworCSAgICBlICA9ICh4KihlLWMpLWMpOworCSAgICBlIC09IGh4czsKKwkgICAgaWYoaz09IC0xKSByZXR1cm4gKGZsb2F0KTAuNSooeC1lKS0oZmxvYXQpMC41OworCSAgICBpZihrPT0xKQorCSAgICAgICAJaWYoeCA8IChmbG9hdCktMC4yNSkgcmV0dXJuIC0oZmxvYXQpMi4wKihlLSh4KyhmbG9hdCkwLjUpKTsKKwkgICAgICAgCWVsc2UgCSAgICAgIHJldHVybiAgb25lKyhmbG9hdCkyLjAqKHgtZSk7CisJICAgIGlmIChrIDw9IC0yIHx8IGs+NTYpIHsgICAvKiBzdWZmaWNlIHRvIHJldHVybiBleHAoeCktMSAqLworCSAgICAgICAgaW50MzJfdCBpOworCSAgICAgICAgeSA9IG9uZS0oZS14KTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgICAgIHJldHVybiB5LW9uZTsKKwkgICAgfQorCSAgICB0ID0gb25lOworCSAgICBpZihrPDIzKSB7CisJICAgICAgICBpbnQzMl90IGk7CisJICAgICAgICBTRVRfRkxPQVRfV09SRCh0LDB4M2Y4MDAwMDAgLSAoMHgxMDAwMDAwPj5rKSk7IC8qIHQ9MS0yXi1rICovCisJICAgICAgIAl5ID0gdC0oZS14KTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICB9IGVsc2UgeworCSAgICAgICAgaW50MzJfdCBpOworCQlTRVRfRkxPQVRfV09SRCh0LCgoMHg3Zi1rKTw8MjMpKTsJLyogMl4tayAqLworCSAgICAgICAJeSA9IHgtKGUrdCk7CisJICAgICAgIAl5ICs9IG9uZTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgfQorCX0KKwlyZXR1cm4geTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmFicy5jIGIvbGlibS9zcmMvc19mYWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmFicy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEAoIylzX2ZhYnMuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmFicy5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmFicyh4KSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB4LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorZmFicyhkb3VibGUgeCkKK3sKKwl1X2ludDMyX3QgaGlnaDsKKwlHRVRfSElHSF9XT1JEKGhpZ2gseCk7CisJU0VUX0hJR0hfV09SRCh4LGhpZ2gmMHg3ZmZmZmZmZik7CisgICAgICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mYWJzZi5jIGIvbGlibS9zcmMvc19mYWJzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDA3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZhYnNmLmMKQEAgLTAsMCArMSwzNCBAQAorLyogc19mYWJzZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19mYWJzLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZhYnNmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmYWJzZih4KSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB4LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitmYWJzZihmbG9hdCB4KQoreworCXVfaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlTRVRfRkxPQVRfV09SRCh4LGl4JjB4N2ZmZmZmZmYpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmFic2wuYyBiL2xpYm0vc3JjL3NfZmFic2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mYWJzbC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIERhZy1FcmxpbmcgQ2/vZGFuIFNt+HJncmF2CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgaW4gdGhpcyBwb3NpdGlvbiBhbmQgdW5jaGFuZ2VkLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZhYnNsLmMsdiAxLjIgMjAwMy8xMC8yNSAxOTo1MzoyOCBkZXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2xvbmcgZG91YmxlCitmYWJzbChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IHg7CisJdS5iaXRzLnNpZ24gPSAwOworCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmRpbS5jIGIvbGlibS9zcmMvc19mZGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNDdjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmRpbS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmRpbS5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUJREVDTCh0eXBlLCBmbikJCQlcCit0eXBlCQkJCQlcCitmbih0eXBlIHgsIHR5cGUgeSkJCQlcCit7CQkJCQlcCisJCQkJCVwKKwlpZiAoaXNuYW4oeCkpCQkJXAorCQlyZXR1cm4gKHgpOwkJXAorCWlmIChpc25hbih5KSkJCQlcCisJCXJldHVybiAoeSk7CQlcCisJcmV0dXJuICh4ID4geSA/IHggLSB5IDogMC4wKTsJXAorfQorCitERUNMKGRvdWJsZSwgZmRpbSkKK0RFQ0woZmxvYXQsIGZkaW1mKQorREVDTChsb25nIGRvdWJsZSwgZmRpbWwpCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zpbml0ZS5jIGIvbGlibS9zcmMvc19maW5pdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRkMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19maW5pdGUuYwpAQCAtMCwwICsxLDMwIEBACisvKiBAKCMpc19maW5pdGUuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmluaXRlLmMsdiAxLjggMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZpbml0ZSh4KSByZXR1cm5zIDEgaXMgeCBpcyBmaW5pdGUsIGVsc2UgMDsKKyAqIG5vIGJyYW5jaGluZyEKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisJaW50IGZpbml0ZShkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJcmV0dXJuIChpbnQpKCh1X2ludDMyX3QpKChoeCYweDdmZmZmZmZmKS0weDdmZjAwMDAwKT4+MzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19maW5pdGVmLmMgYi9saWJtL3NyYy9zX2Zpbml0ZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMwNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19maW5pdGVmLmMKQEAgLTAsMCArMSwzMyBAQAorLyogc19maW5pdGVmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2Zpbml0ZS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19maW5pdGVmLmMsdiAxLjYgMjAwMi8wNS8yOCAxNzo1MTo0NiBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmaW5pdGVmKHgpIHJldHVybnMgMSBpcyB4IGlzIGZpbml0ZSwgZWxzZSAwOworICogbm8gYnJhbmNoaW5nIQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgZmluaXRlZihmbG9hdCB4KQoreworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJcmV0dXJuIChpbnQpKCh1X2ludDMyX3QpKChpeCYweDdmZmZmZmZmKS0weDdmODAwMDAwKT4+MzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbG9vci5jIGIvbGlibS9zcmMvc19mbG9vci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzMyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zsb29yLmMKQEAgLTAsMCArMSw3MyBAQAorLyogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmxvb3IuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmxvb3IoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGZsb29yKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2RvdWJsZQorZmxvb3IoZG91YmxlIHgpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaSxqOworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjApIHsvKiByZXR1cm4gMCpzaWduKHgpIGlmIHx4fDwxICovCisJCSAgICBpZihpMD49MCkge2kwPWkxPTA7fQorCQkgICAgZWxzZSBpZigoKGkwJjB4N2ZmZmZmZmYpfGkxKSE9MCkKKwkJCXsgaTA9MHhiZmYwMDAwMDtpMT0wO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMDwwKSBpMCArPSAoMHgwMDEwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsgaTE9MDsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpZihodWdlK3g+MC4wKSB7IAkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCWlmKGkwPDApIHsKKwkJICAgIGlmKGowPT0yMCkgaTArPTE7CisJCSAgICBlbHNlIHsKKwkJCWogPSBpMSsoMTw8KDUyLWowKSk7CisJCQlpZihqPGkxKSBpMCArPTEgOyAJLyogZ290IGEgY2FycnkgKi8KKwkJCWkxPWo7CisJCSAgICB9CisJCX0KKwkJaTEgJj0gKH5pKTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zsb29yZi5jIGIvbGlibS9zcmMvc19mbG9vcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE3MWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbG9vcmYuYwpAQCAtMCwwICsxLDYyIEBACisvKiBzX2Zsb29yZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19mbG9vci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbG9vcmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZsb29yZih4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gZmxvb3JmKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBodWdlID0gMS4wZTMwOworCitmbG9hdAorZmxvb3JmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4oZmxvYXQpMC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA+PTApIHtpMD0wO30KKwkJICAgIGVsc2UgaWYoKGkwJjB4N2ZmZmZmZmYpIT0wKQorCQkJeyBpMD0weGJmODAwMDAwO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDA3ZmZmZmYpPj5qMDsKKwkJaWYoKGkwJmkpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGlmKGkwPDApIGkwICs9ICgweDAwODAwMDAwKT4+ajA7CisJCSAgICBpMCAmPSAofmkpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0KKwlTRVRfRkxPQVRfV09SRCh4LGkwKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmxvb3JsLmMgYi9saWJtL3NyYy9zX2Zsb29ybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zsb29ybC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEZyb206IEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmxvb3JsLmMsdiAxLjQgMjAwNS8wNC8yOCAxOTo0NTo1NSBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmxvb3JsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBmbG9vcmwoeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCU1BTkhfU0laRQlMREJMX01BTkhfU0laRQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pIHsJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorCQl1LmJpdHMubWFuaCB8PSAxbGx1IDw8IChMREJMX01BTkhfU0laRSAtIDEpOwlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworbG9uZyBkb3VibGUKK2Zsb29ybChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdSA9IHsgLmUgPSB4IH07CisJaW50IGUgPSB1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMTsKKworCWlmIChlIDwgTUFOSF9TSVpFIC0gMSkgeworCQlpZiAoZSA8IDApIHsJCQkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKQorCQkJCWlmICh1LmJpdHMuZXhwID4gMCB8fAorCQkJCSAgICAodS5iaXRzLm1hbmggfCB1LmJpdHMubWFubCkgIT0gMCkKKwkJCQkJdS5lID0gdS5iaXRzLnNpZ24gPyAtMS4wIDogMC4wOworCQl9IGVsc2UgeworCQkJdWludDY0X3QgbSA9ICgoMWxsdSA8PCBNQU5IX1NJWkUpIC0gMSkgPj4gKGUgKyAxKTsKKwkJCWlmICgoKHUuYml0cy5tYW5oICYgbSkgfCB1LmJpdHMubWFubCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCQlpZiAodS5iaXRzLnNpZ24pIHsKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKwkJCQlpZiAoZSA9PSAwKQorCQkJCQl1LmJpdHMuZXhwKys7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJSU5DX01BTkgodSwgMWxsdSA8PCAoTUFOSF9TSVpFIC0gZSAtIDEpKTsKKwkJCX0KKwkJCWlmIChodWdlICsgeCA+IDAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCQl1LmJpdHMubWFuaCAmPSB+bTsKKwkJCQl1LmJpdHMubWFubCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGUgPCBMREJMX01BTlRfRElHIC0gMSkgeworCQl1aW50NjRfdCBtID0gKHVpbnQ2NF90KS0xID4+ICg2NCAtIExEQkxfTUFOVF9ESUcgKyBlICsgMSk7CisJCWlmICgodS5iaXRzLm1hbmwgJiBtKSA9PSAwKQorCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZiAodS5iaXRzLnNpZ24pIHsKKwkJCWlmIChlID09IE1BTkhfU0laRSAtIDEpCisJCQkJSU5DX01BTkgodSwgMSk7CisJCQllbHNlIHsKKwkJCQl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmw7CisJCQkJdS5iaXRzLm1hbmwgKz0gMWxsdSA8PCAoTERCTF9NQU5UX0RJRyAtIGUgLSAxKTsKKwkJCQlpZiAodS5iaXRzLm1hbmwgPCBvKQkvKiBnb3QgYSBjYXJyeSAqLworCQkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYS5jIGIvbGlibS9zcmMvc19mbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNjMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWEuYwpAQCAtMCwwICsxLDIwMiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWEuYyx2IDEuNCAyMDA1LzAzLzE4IDAyOjI3OjU5IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIFdlIHVzZSBzY2FsaW5nIHRvIGF2b2lkIG92ZXJmbG93L3VuZGVyZmxvdywgYWxvbmcgd2l0aCB0aGUKKyAqIGNhbm9uaWNhbCBwcmVjaXNpb24tZG91YmxpbmcgdGVjaG5pcXVlIGFkYXB0ZWQgZnJvbToKKyAqCisgKglEZWtrZXIsIFQuICBBIEZsb2F0aW5nLVBvaW50IFRlY2huaXF1ZSBmb3IgRXh0ZW5kaW5nIHRoZQorICoJQXZhaWxhYmxlIFByZWNpc2lvbi4gIE51bWVyLiBNYXRoLiAxOCwgMjI0LTI0MiAoMTk3MSkuCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgc2Vuc2l0aXZlIHRvIHRoZSByb3VuZGluZyBwcmVjaXNpb24uICBGUFVzIHN1Y2gKKyAqIGFzIHRoZSBpMzg3IG11c3QgYmUgc2V0IGluIGRvdWJsZS1wcmVjaXNpb24gbW9kZSBpZiB2YXJpYWJsZXMgYXJlCisgKiB0byBiZSBzdG9yZWQgaW4gRlAgcmVnaXN0ZXJzIGluIG9yZGVyIHRvIGF2b2lkIGluY29ycmVjdCByZXN1bHRzLgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBvbiBGcmVlQlNELCBidXQgbm90IG9uIG1hbnkgb3RoZXIgc3lzdGVtcy4KKyAqCisgKiBIYXJkd2FyZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIHVzZWQgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgaXQsCisgKiBzaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IGJlIHNldmVyYWwgdGltZXMgc2xvd2VyLgorICovCisjaWYgTERCTF9NQU5UX0RJRyAhPSAxMTMKK2RvdWJsZQorZm1hKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopCit7CisJc3RhdGljIGNvbnN0IGRvdWJsZSBzcGxpdCA9IDB4MXAyNyArIDEuMDsKKwlkb3VibGUgeHMsIHlzLCB6czsKKwlkb3VibGUgYywgY2MsIGh4LCBoeSwgcCwgcSwgdHgsIHR5OworCWRvdWJsZSByLCByciwgczsKKwlpbnQgb3JvdW5kOworCWludCBleCwgZXksIGV6OworCWludCBzcHJlYWQ7CisKKwlpZiAoeiA9PSAwLjApCisJCXJldHVybiAoeCAqIHkpOworCWlmICh4ID09IDAuMCB8fCB5ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJLyogUmVzdWx0cyBvZiBmcmV4cCgpIGFyZSB1bmRlZmluZWQgZm9yIHRoZXNlIGNhc2VzLiAqLworCWlmICghaXNmaW5pdGUoeCkgfHwgIWlzZmluaXRlKHkpIHx8ICFpc2Zpbml0ZSh6KSkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJeHMgPSBmcmV4cCh4LCAmZXgpOworCXlzID0gZnJleHAoeSwgJmV5KTsKKwl6cyA9IGZyZXhwKHosICZleik7CisJb3JvdW5kID0gZmVnZXRyb3VuZCgpOworCXNwcmVhZCA9IGV4ICsgZXkgLSBlejsKKworCS8qCisJICogSWYgeCAqIHkgYW5kIHogYXJlIG1hbnkgb3JkZXJzIG9mIG1hZ25pdHVkZSBhcGFydCwgdGhlIHNjYWxpbmcKKwkgKiB3aWxsIG92ZXJmbG93LCBzbyB3ZSBoYW5kbGUgdGhlc2UgY2FzZXMgc3BlY2lhbGx5LiAgUm91bmRpbmcKKwkgKiBtb2RlcyBvdGhlciB0aGFuIEZFX1RPTkVBUkVTVCBhcmUgcGFpbmZ1bC4KKwkgKi8KKwlpZiAoc3ByZWFkID4gREJMX01BTlRfRElHICogMikgeworCQlmZW52X3QgZW52OworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlzd2l0Y2gob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh4ICogeSk7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIDApOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQljYXNlIEZFX0RPV05XQVJEOgorCQkJaWYgKHogPiAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIC1JTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIElORklOSVRZKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJfQorCX0KKwlpZiAoc3ByZWFkIDwgLURCTF9NQU5UX0RJRykgeworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlpZiAoIWlzbm9ybWFsKHopKQorCQkJZmVyYWlzZWV4Y2VwdChGRV9VTkRFUkZMT1cpOworCQlzd2l0Y2ggKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeik7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcih6LCAwKSk7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcih6LCAtSU5GSU5JVFkpKTsKKwkJZGVmYXVsdDoJLyogRkVfVVBXQVJEICovCisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXIoeiwgSU5GSU5JVFkpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHopOworCQl9CisJfQorCisJLyoKKwkgKiBVc2UgRGVra2VyJ3MgYWxnb3JpdGhtIHRvIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9uIGFuZAorCSAqIHN1YnNlcXVlbnQgYWRkaXRpb24gaW4gdHdpY2UgdGhlIG1hY2hpbmUgcHJlY2lzaW9uLgorCSAqIEFycmFuZ2Ugc28gdGhhdCB4ICogeSA9IGMgKyBjYywgYW5kIHggKiB5ICsgeiA9IHIgKyByci4KKwkgKi8KKwlmZXNldHJvdW5kKEZFX1RPTkVBUkVTVCk7CisKKwlwID0geHMgKiBzcGxpdDsKKwloeCA9IHhzIC0gcDsKKwloeCArPSBwOworCXR4ID0geHMgLSBoeDsKKworCXAgPSB5cyAqIHNwbGl0OworCWh5ID0geXMgLSBwOworCWh5ICs9IHA7CisJdHkgPSB5cyAtIGh5OworCisJcCA9IGh4ICogaHk7CisJcSA9IGh4ICogdHkgKyB0eCAqIGh5OworCWMgPSBwICsgcTsKKwljYyA9IHAgLSBjICsgcSArIHR4ICogdHk7CisKKwl6cyA9IGxkZXhwKHpzLCAtc3ByZWFkKTsKKwlyID0gYyArIHpzOworCXMgPSByIC0gYzsKKwlyciA9IChjIC0gKHIgLSBzKSkgKyAoenMgLSBzKSArIGNjOworCisJc3ByZWFkID0gZXggKyBleTsKKwlpZiAoc3ByZWFkICsgaWxvZ2IocikgPiAtMTAyMykgeworCQlmZXNldHJvdW5kKG9yb3VuZCk7CisJCXIgPSByICsgcnI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHJlc3VsdCBpcyBzdWJub3JtYWwsIHNvIHdlIHJvdW5kIGJlZm9yZSBzY2FsaW5nIHRvCisJCSAqIGF2b2lkIGRvdWJsZSByb3VuZGluZy4KKwkJICovCisJCXAgPSBsZGV4cChjb3B5c2lnbigweDFwLTEwMjIsIHIpLCAtc3ByZWFkKTsKKwkJYyA9IHIgKyBwOworCQlzID0gYyAtIHI7CisJCWNjID0gKHIgLSAoYyAtIHMpKSArIChwIC0gcykgKyBycjsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gKGMgKyBjYykgLSBwOworCX0KKwlyZXR1cm4gKGxkZXhwKHIsIHNwcmVhZCkpOworfQorI2Vsc2UJLyogTERCTF9NQU5UX0RJRyA9PSAxMTMgKi8KKy8qCisgKiAxMTMgYml0cyBvZiBwcmVjaXNpb24gaXMgbW9yZSB0aGFuIHR3aWNlIHRoZSBwcmVjaXNpb24gb2YgYSBkb3VibGUsCisgKiBzbyBpdCBpcyBlbm91Z2ggdG8gcmVwcmVzZW50IHRoZSBpbnRlcm1lZGlhdGUgcHJvZHVjdCBleGFjdGx5LgorICovCitkb3VibGUKK2ZtYShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KQoreworCXJldHVybiAoKGxvbmcgZG91YmxlKXggKiB5ICsgeik7Cit9CisjZW5kaWYJLyogTERCTF9NQU5UX0RJRyAhPSAxMTMgKi8KKworI2lmIChMREJMX01BTlRfRElHID09IDUzKQorX193ZWFrX3JlZmVyZW5jZShmbWEsIGZtYWwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYWYuYyBiL2xpYm0vc3JjL3NfZm1hZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYWYuYwpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYWYuYyx2IDEuMSAyMDA1LzAxLzIyIDA5OjUzOjE4IGRhcyBFeHAgJCIpOyAqLworCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIEEgZG91YmxlIGhhcyBtb3JlIHRoYW4gdHdpY2UgYXMgbXVjaCBwcmVjaXNpb24gdGhhbiBhIGZsb2F0LCBzbworICogZGlyZWN0IGRvdWJsZS1wcmVjaXNpb24gYXJpdGhtZXRpYyBzdWZmaWNlcy4KKyAqCisgKiBYWFggV2UgYXJlIHJlbHlpbmcgb24gdGhlIGNvbXBpbGVyIHRvIGNvbnZlcnQgZnJvbSBkb3VibGUgdG8gZmxvYXQKKyAqICAgICB1c2luZyB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlIGFuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICogICAgIHNpZGUtZWZmZWN0cy4gIEJ1dCBvbiBhdCBsZWFzdCBvbmUgcGxhdGZvcm0gKGdjYyAzLjQuMi9zcGFyYzY0KSwKKyAqICAgICB0aGlzIGFwcGVhcnMgdG8gYmUgdG9vIG11Y2ggdG8gYXNrIGZvci4gIFRoZSBwcmVjaXNpb24KKyAqICAgICByZWR1Y3Rpb24gc2hvdWxkIGJlIGRvbmUgbWFudWFsbHkuCisgKi8KK2Zsb2F0CitmbWFmKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCit7CisKKwlyZXR1cm4gKChkb3VibGUpeCAqIHkgKyB6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1hbC5jIGIvbGlibS9zcmMvc19mbWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MzZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1hbC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYWwuYyx2IDEuMiAyMDA1LzAzLzE4IDAyOjI3OjU5IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIFdlIHVzZSBzY2FsaW5nIHRvIGF2b2lkIG92ZXJmbG93L3VuZGVyZmxvdywgYWxvbmcgd2l0aCB0aGUKKyAqIGNhbm9uaWNhbCBwcmVjaXNpb24tZG91YmxpbmcgdGVjaG5pcXVlIGFkYXB0ZWQgZnJvbToKKyAqCisgKglEZWtrZXIsIFQuICBBIEZsb2F0aW5nLVBvaW50IFRlY2huaXF1ZSBmb3IgRXh0ZW5kaW5nIHRoZQorICoJQXZhaWxhYmxlIFByZWNpc2lvbi4gIE51bWVyLiBNYXRoLiAxOCwgMjI0LTI0MiAoMTk3MSkuCisgKi8KK2xvbmcgZG91YmxlCitmbWFsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHksIGxvbmcgZG91YmxlIHopCit7CisjaWYgTERCTF9NQU5UX0RJRyA9PSA2NAorCXN0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBzcGxpdCA9IDB4MXAzMkwgKyAxLjA7CisjZWxpZiBMREJMX01BTlRfRElHID09IDExMworCXN0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBzcGxpdCA9IDB4MXA1N0wgKyAxLjA7CisjZW5kaWYKKwlsb25nIGRvdWJsZSB4cywgeXMsIHpzOworCWxvbmcgZG91YmxlIGMsIGNjLCBoeCwgaHksIHAsIHEsIHR4LCB0eTsKKwlsb25nIGRvdWJsZSByLCByciwgczsKKwlpbnQgb3JvdW5kOworCWludCBleCwgZXksIGV6OworCWludCBzcHJlYWQ7CisKKwlpZiAoeiA9PSAwLjApCisJCXJldHVybiAoeCAqIHkpOworCWlmICh4ID09IDAuMCB8fCB5ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJLyogUmVzdWx0cyBvZiBmcmV4cCgpIGFyZSB1bmRlZmluZWQgZm9yIHRoZXNlIGNhc2VzLiAqLworCWlmICghaXNmaW5pdGUoeCkgfHwgIWlzZmluaXRlKHkpIHx8ICFpc2Zpbml0ZSh6KSkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJeHMgPSBmcmV4cGwoeCwgJmV4KTsKKwl5cyA9IGZyZXhwbCh5LCAmZXkpOworCXpzID0gZnJleHBsKHosICZleik7CisJb3JvdW5kID0gZmVnZXRyb3VuZCgpOworCXNwcmVhZCA9IGV4ICsgZXkgLSBlejsKKworCS8qCisJICogSWYgeCAqIHkgYW5kIHogYXJlIG1hbnkgb3JkZXJzIG9mIG1hZ25pdHVkZSBhcGFydCwgdGhlIHNjYWxpbmcKKwkgKiB3aWxsIG92ZXJmbG93LCBzbyB3ZSBoYW5kbGUgdGhlc2UgY2FzZXMgc3BlY2lhbGx5LiAgUm91bmRpbmcKKwkgKiBtb2RlcyBvdGhlciB0aGFuIEZFX1RPTkVBUkVTVCBhcmUgcGFpbmZ1bC4KKwkgKi8KKwlpZiAoc3ByZWFkID4gTERCTF9NQU5UX0RJRyAqIDIpIHsKKwkJZmVudl90IGVudjsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsKKwkJc3dpdGNoKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeCAqIHkpOworCQljYXNlIEZFX1RPV0FSRFpFUk86CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjAgXiB6IDwgMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcmwociwgMCk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeiA+IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXJsKHIsIC1JTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVybChyLCBJTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCX0KKwl9CisJaWYgKHNwcmVhZCA8IC1MREJMX01BTlRfRElHKSB7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7CisJCWlmICghaXNub3JtYWwoeikpCisJCQlmZXJhaXNlZXhjZXB0KEZFX1VOREVSRkxPVyk7CisJCXN3aXRjaCAob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh6KTsKKwkJY2FzZSBGRV9UT1dBUkRaRVJPOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wIF4geiA8IDAuMCkKKwkJCQlyZXR1cm4gKHopOworCQkJZWxzZQorCQkJCXJldHVybiAobmV4dGFmdGVybCh6LCAwKSk7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcmwoeiwgLUlORklOSVRZKSk7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wKQorCQkJCXJldHVybiAobmV4dGFmdGVybCh6LCBJTkZJTklUWSkpOworCQkJZWxzZQorCQkJCXJldHVybiAoeik7CisJCX0KKwl9CisKKwkvKgorCSAqIFVzZSBEZWtrZXIncyBhbGdvcml0aG0gdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24gYW5kCisJICogc3Vic2VxdWVudCBhZGRpdGlvbiBpbiB0d2ljZSB0aGUgbWFjaGluZSBwcmVjaXNpb24uCisJICogQXJyYW5nZSBzbyB0aGF0IHggKiB5ID0gYyArIGNjLCBhbmQgeCAqIHkgKyB6ID0gciArIHJyLgorCSAqLworCWZlc2V0cm91bmQoRkVfVE9ORUFSRVNUKTsKKworCXAgPSB4cyAqIHNwbGl0OworCWh4ID0geHMgLSBwOworCWh4ICs9IHA7CisJdHggPSB4cyAtIGh4OworCisJcCA9IHlzICogc3BsaXQ7CisJaHkgPSB5cyAtIHA7CisJaHkgKz0gcDsKKwl0eSA9IHlzIC0gaHk7CisKKwlwID0gaHggKiBoeTsKKwlxID0gaHggKiB0eSArIHR4ICogaHk7CisJYyA9IHAgKyBxOworCWNjID0gcCAtIGMgKyBxICsgdHggKiB0eTsKKworCXpzID0gbGRleHBsKHpzLCAtc3ByZWFkKTsKKwlyID0gYyArIHpzOworCXMgPSByIC0gYzsKKwlyciA9IChjIC0gKHIgLSBzKSkgKyAoenMgLSBzKSArIGNjOworCisJc3ByZWFkID0gZXggKyBleTsKKwlpZiAoc3ByZWFkICsgaWxvZ2JsKHIpID4gLTE2MzgzKSB7CisJCWZlc2V0cm91bmQob3JvdW5kKTsKKwkJciA9IHIgKyBycjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcmVzdWx0IGlzIHN1Ym5vcm1hbCwgc28gd2Ugcm91bmQgYmVmb3JlIHNjYWxpbmcgdG8KKwkJICogYXZvaWQgZG91YmxlIHJvdW5kaW5nLgorCQkgKi8KKwkJcCA9IGxkZXhwbChjb3B5c2lnbmwoMHgxcC0xNjM4MkwsIHIpLCAtc3ByZWFkKTsKKwkJYyA9IHIgKyBwOworCQlzID0gYyAtIHI7CisJCWNjID0gKHIgLSAoYyAtIHMpKSArIChwIC0gcykgKyBycjsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gKGMgKyBjYykgLSBwOworCX0KKwlyZXR1cm4gKGxkZXhwbChyLCBzcHJlYWQpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1heC5jIGIvbGlibS9zcmMvc19mbWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1heC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1heC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZG91YmxlCitmbWF4KGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHVbMl07CisKKwl1WzBdLmQgPSB4OworCXVbMV0uZCA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjA0NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVswXS5iaXRzLnNpZ25dLmQpOworCisJcmV0dXJuICh4ID4geSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1heGYuYyBiL2xpYm0vc3JjL3NfZm1heGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdmNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWF4Zi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1heGYuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2Zsb2F0CitmbWF4ZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVuaW9uIElFRUVmMmJpdHMgdVsyXTsKKworCXVbMF0uZiA9IHg7CisJdVsxXS5mID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVswXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDI1NSAmJiB1WzFdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzBdLmJpdHMuc2lnbl0uZik7CisKKwlyZXR1cm4gKHggPiB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWF4bC5jIGIvbGlibS9zcmMvc19mbWF4bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTlkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYXhsLmMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWF4bC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2ZtYXhsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1WzJdOworCisJdVswXS5lID0geDsKKwltYXNrX25iaXRfbCh1WzBdKTsKKwl1WzFdLmUgPSB5OworCW1hc2tfbmJpdF9sKHVbMV0pOworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbMF0uYml0cy5zaWduID8geSA6IHgpOworCisJcmV0dXJuICh4ID4geSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1pbi5jIGIvbGlibS9zcmMvc19mbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliOWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1pbi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1pbi5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZG91YmxlCitmbWluKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHVbMl07CisKKwl1WzBdLmQgPSB4OworCXVbMV0uZCA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjA0NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVsxXS5iaXRzLnNpZ25dLmQpOworCisJcmV0dXJuICh4IDwgeSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1pbmYuYyBiL2xpYm0vc3JjL3NfZm1pbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmZiNTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWluZi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1pbmYuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2Zsb2F0CitmbWluZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVuaW9uIElFRUVmMmJpdHMgdVsyXTsKKworCXVbMF0uZiA9IHg7CisJdVsxXS5mID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVswXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDI1NSAmJiB1WzFdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzFdLmJpdHMuc2lnbl0uZik7CisKKwlyZXR1cm4gKHggPCB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWlubC5jIGIvbGlibS9zcmMvc19mbWlubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOGM1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtaW5sLmMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWlubC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2ZtaW5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1WzJdOworCisJdVswXS5lID0geDsKKwltYXNrX25iaXRfbCh1WzBdKTsKKwl1WzFdLmUgPSB5OworCW1hc2tfbmJpdF9sKHVbMV0pOworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbMV0uYml0cy5zaWduID8geSA6IHgpOworCisJcmV0dXJuICh4IDwgeSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZnJleHAuYyBiL2xpYm0vc3JjL3NfZnJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODllMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mcmV4cC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIEAoIylzX2ZyZXhwLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZyZXhwLmMsdiAxLjEwIDIwMDUvMDMvMDcgMjE6Mjc6MzcgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZm9yIG5vbi16ZXJvIHgKKyAqCXggPSBmcmV4cChhcmcsJmV4cCk7CisgKiByZXR1cm4gYSBkb3VibGUgZnAgcXVhbnRpdHkgeCBzdWNoIHRoYXQgMC41IDw9IHx4fCA8MS4wCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmluYXJ5IGV4cG9uZW50ICJleHAiLiBUaGF0IGlzCisgKglhcmcgPSB4KjJeZXhwLgorICogSWYgYXJnIGlzIGluZiwgMC4wLCBvciBOYU4sIHRoZW4gZnJleHAoYXJnLCZleHApIHJldHVybnMgYXJnCisgKiB3aXRoICpleHA9MC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTY7IC8qIDB4NDM1MDAwMDAsIDB4MDAwMDAwMDAgKi8KKworZG91YmxlCitmcmV4cChkb3VibGUgeCwgaW50ICplcHRyKQoreworCWludDMyX3QgaHgsIGl4LCBseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKwkqZXB0ciA9IDA7CisJaWYoaXg+PTB4N2ZmMDAwMDB8fCgoaXh8bHgpPT0wKSkgcmV0dXJuIHg7CS8qIDAsaW5mLG5hbiAqLworCWlmIChpeDwweDAwMTAwMDAwKSB7CQkvKiBzdWJub3JtYWwgKi8KKwkgICAgeCAqPSB0d281NDsKKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKwkgICAgaXggPSBoeCYweDdmZmZmZmZmOworCSAgICAqZXB0ciA9IC01NDsKKwl9CisJKmVwdHIgKz0gKGl4Pj4yMCktMTAyMjsKKwloeCA9IChoeCYweDgwMGZmZmZmKXwweDNmZTAwMDAwOworCVNFVF9ISUdIX1dPUkQoeCxoeCk7CisJcmV0dXJuIHg7Cit9CisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykKK19fd2Vha19yZWZlcmVuY2UoZnJleHAsIGZyZXhwbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZnJleHBmLmMgYi9saWJtL3NyYy9zX2ZyZXhwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDQ2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZyZXhwZi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHNfZnJleHBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2ZyZXhwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZyZXhwZi5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzI1ID0gIDMuMzU1NDQzMjAwMGUrMDc7IC8qIDB4NGMwMDAwMDAgKi8KKworZmxvYXQKK2ZyZXhwZihmbG9hdCB4LCBpbnQgKmVwdHIpCit7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisJKmVwdHIgPSAwOworCWlmKGl4Pj0weDdmODAwMDAwfHwoaXg9PTApKSByZXR1cm4geDsJLyogMCxpbmYsbmFuICovCisJaWYgKGl4PDB4MDA4MDAwMDApIHsJCS8qIHN1Ym5vcm1hbCAqLworCSAgICB4ICo9IHR3bzI1OworCSAgICBHRVRfRkxPQVRfV09SRChoeCx4KTsKKwkgICAgaXggPSBoeCYweDdmZmZmZmZmOworCSAgICAqZXB0ciA9IC0yNTsKKwl9CisJKmVwdHIgKz0gKGl4Pj4yMyktMTI2OworCWh4ID0gKGh4JjB4ODA3ZmZmZmYpfDB4M2YwMDAwMDA7CisJKihpbnQqKSZ4ID0gaHg7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZyZXhwbC5jIGIvbGlibS9zcmMvc19mcmV4cGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGIzMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mcmV4cGwuYwpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mcmV4cGwuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU0OjUxIGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworbG9uZyBkb3VibGUKK2ZyZXhwbChsb25nIGRvdWJsZSB4LCBpbnQgKmV4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IHg7CisJc3dpdGNoICh1LmJpdHMuZXhwKSB7CisJY2FzZSAwOgkJLyogMCBvciBzdWJub3JtYWwgKi8KKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKSB7CisJCQkqZXggPSAwOworCQl9IGVsc2UgeworCQkJdS5lICo9IDB4MS4wcDUxNDsKKwkJCSpleCA9IHUuYml0cy5leHAgLSAweDQyMDA7CisJCQl1LmJpdHMuZXhwID0gMHgzZmZlOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg3ZmZmOgkvKiBpbmZpbml0eSBvciBOYU47IHZhbHVlIG9mICpleCBpcyB1bnNwZWNpZmllZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgkvKiBub3JtYWwgKi8KKwkJKmV4ID0gdS5iaXRzLmV4cCAtIDB4M2ZmZTsKKwkJdS5iaXRzLmV4cCA9IDB4M2ZmZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaWxvZ2IuYyBiL2xpYm0vc3JjL3NfaWxvZ2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRhNDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pbG9nYi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEAoIylzX2lsb2diLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lsb2diLmMsdiAxLjkgMjAwNC8xMC8wOSAxNzoxNDoyOCBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKiBpbG9nYihkb3VibGUgeCkKKyAqIHJldHVybiB0aGUgYmluYXJ5IGV4cG9uZW50IG9mIG5vbi16ZXJvIHgKKyAqIGlsb2diKDApID0gRlBfSUxPR0IwCisgKiBpbG9nYihOYU4pID0gRlBfSUxPR0JOQU4gKG5vIHNpZ25hbCBpcyByYWlzZWQpCisgKiBpbG9nYihpbmYpID0gSU5UX01BWCAobm8gc2lnbmFsIGlzIHJhaXNlZCkKKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgaWxvZ2IoZG91YmxlIHgpCit7CisJaW50MzJfdCBoeCxseCxpeDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaHggJj0gMHg3ZmZmZmZmZjsKKwlpZihoeDwweDAwMTAwMDAwKSB7CisJICAgIGlmKChoeHxseCk9PTApCisJCXJldHVybiBGUF9JTE9HQjA7CisJICAgIGVsc2UJCQkvKiBzdWJub3JtYWwgeCAqLworCQlpZihoeD09MCkgeworCQkgICAgZm9yIChpeCA9IC0xMDQzOyBseD4wOyBseDw8PTEpIGl4IC09MTsKKwkJfSBlbHNlIHsKKwkJICAgIGZvciAoaXggPSAtMTAyMixoeDw8PTExOyBoeD4wOyBoeDw8PTEpIGl4IC09MTsKKwkJfQorCSAgICByZXR1cm4gaXg7CisJfQorCWVsc2UgaWYgKGh4PDB4N2ZmMDAwMDApIHJldHVybiAoaHg+PjIwKS0xMDIzOworCWVsc2UgaWYgKGh4PjB4N2ZmMDAwMDAgfHwgbHghPTApIHJldHVybiBGUF9JTE9HQk5BTjsKKwllbHNlIHJldHVybiBJTlRfTUFYOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pbG9nYmYuYyBiL2xpYm0vc3JjL3NfaWxvZ2JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YzRkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaWxvZ2JmLmMKQEAgLTAsMCArMSw0MSBAQAorLyogc19pbG9nYmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfaWxvZ2IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaWxvZ2JmLmMsdiAxLjcgMjAwNC8xMC8wOSAxNzoxNDoyOCBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgaWxvZ2JmKGZsb2F0IHgpCit7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWh4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaHg8MHgwMDgwMDAwMCkgeworCSAgICBpZihoeD09MCkKKwkJcmV0dXJuIEZQX0lMT0dCMDsKKwkgICAgZWxzZQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJICAgICAgICBmb3IgKGl4ID0gLTEyNixoeDw8PTg7IGh4PjA7IGh4PDw9MSkgaXggLT0xOworCSAgICByZXR1cm4gaXg7CisJfQorCWVsc2UgaWYgKGh4PDB4N2Y4MDAwMDApIHJldHVybiAoaHg+PjIzKS0xMjc7CisJZWxzZSBpZiAoaHg+MHg3ZjgwMDAwMCkgcmV0dXJuIEZQX0lMT0dCTkFOOworCWVsc2UgcmV0dXJuIElOVF9NQVg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lsb2dibC5jIGIvbGlibS9zcmMvc19pbG9nYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZhZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pbG9nYmwuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogRnJvbTogQCgjKXNfaWxvZ2IuYyA1LjEgOTMvMDkvMjQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pbG9nYmwuYyx2IDEuMSAyMDA0LzEwLzExIDE4OjEzOjUyIHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitpbnQKK2lsb2dibChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKwl1bnNpZ25lZCBsb25nIG07CisJaW50IGI7CisKKwl1LmUgPSB4OworCWlmICh1LmJpdHMuZXhwID09IDApIHsKKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKQorCQkJcmV0dXJuIChGUF9JTE9HQjApOworCQkvKiBkZW5vcm1hbGl6ZWQgKi8KKwkJaWYgKHUuYml0cy5tYW5oID09IDApIHsKKwkJCW0gPSAxbHUgPDwgKExEQkxfTUFOTF9TSVpFIC0gMSk7CisJCQlmb3IgKGIgPSBMREJMX01BTkhfU0laRTsgISh1LmJpdHMubWFubCAmIG0pOyBtID4+PSAxKQorCQkJCWIrKzsKKwkJfSBlbHNlIHsKKwkJCW0gPSAxbHUgPDwgKExEQkxfTUFOSF9TSVpFIC0gMSk7CisJCQlmb3IgKGIgPSAwOyAhKHUuYml0cy5tYW5oICYgbSk7IG0gPj49IDEpCisJCQkJYisrOworCQl9CisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisJCWIrKzsKKyNlbmRpZgorCQlyZXR1cm4gKExEQkxfTUlOX0VYUCAtIGIgLSAxKTsKKwl9IGVsc2UgaWYgKHUuYml0cy5leHAgPCAoTERCTF9NQVhfRVhQIDw8IDEpIC0gMSkKKwkJcmV0dXJuICh1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMSk7CisJZWxzZSBpZiAodS5iaXRzLm1hbmwgIT0gMCB8fCB1LmJpdHMubWFuaCAhPSAwKQorCQlyZXR1cm4gKEZQX0lMT0dCTkFOKTsKKwllbHNlCisJCXJldHVybiAoSU5UX01BWCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lzZmluaXRlLmMgYi9saWJtL3NyYy9zX2lzZmluaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaXNmaW5pdGUuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaXNmaW5pdGUuYyx2IDEuMSAyMDA0LzA3LzA5IDAzOjMyOjM5IGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitfX2lzZmluaXRlKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDIwNDcpOworfQorCitpbnQKK19faXNmaW5pdGVmKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMjU1KTsKK30KKworaW50CitfX2lzZmluaXRlbChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDMyNzY3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaXNuYW4uYyBiL2xpYm0vc3JjL3NfaXNuYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzYzNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pc25hbi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pc25hbi5jLHYgMS44IDIwMDQvMDgvMDUgMDE6NDY6MTEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisvKiBQcm92aWRlZCBieSBsaWJjICovCisjaWYgMQoraW50CisoaXNuYW4pKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDIwNDcgJiYgKHUuYml0cy5tYW5sICE9IDAgfHwgdS5iaXRzLm1hbmggIT0gMCkpOworfQorI2VuZGlmCisKK2ludAoraXNuYW5mKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5leHAgPT0gMjU1ICYmIHUuYml0cy5tYW4gIT0gMCk7Cit9CisKK2ludAorX19pc25hbmwobG9uZyBkb3VibGUgZSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSBlOworCW1hc2tfbmJpdF9sKHUpOworCXJldHVybiAodS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodS5iaXRzLm1hbmwgIT0gMCB8fCB1LmJpdHMubWFuaCAhPSAwKSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lzbm9ybWFsLmMgYi9saWJtL3NyYy9zX2lzbm9ybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NWRiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaXNub3JtYWwuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaXNub3JtYWwuYyx2IDEuMSAyMDA0LzA3LzA5IDAzOjMyOjM5IGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitfX2lzbm9ybWFsKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDAgJiYgdS5iaXRzLmV4cCAhPSAyMDQ3KTsKK30KKworaW50CitfX2lzbm9ybWFsZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDAgJiYgdS5iaXRzLmV4cCAhPSAyNTUpOworfQorCitpbnQKK19faXNub3JtYWxsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMCAmJiB1LmJpdHMuZXhwICE9IDMyNzY3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyaW50LmMgYi9saWJtL3NyYy9zX2xscmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjdmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscmludC5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyaW50LmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcmludAorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCWZuCQlsbHJpbnQKKworI2luY2x1ZGUgInNfbHJpbnQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyaW50Zi5jIGIvbGlibS9zcmMvc19sbHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NWUzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyaW50Zi5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyaW50Zi5jLHYgMS4xIDIwMDUvMDEvMTEgMjM6MTI6NTUgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZmxvYXQKKyNkZWZpbmUJcm91bmRpdAkJcmludGYKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlmbgkJbGxyaW50ZgorCisjaW5jbHVkZSAic19scmludC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJvdW5kLmMgYi9saWJtL3NyYy9zX2xscm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJvdW5kLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyb3VuZC5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MjcgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR0xPTkdfTUFYCisjZGVmaW5lCWZuCQlsbHJvdW5kCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJvdW5kZi5jIGIvbGlibS9zcmMvc19sbHJvdW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscm91bmRmLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyb3VuZGYuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjI3IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kZgorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdMT05HX01BWAorI2RlZmluZQlmbgkJbGxyb3VuZGYKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscm91bmRsLmMgYi9saWJtL3NyYy9zX2xscm91bmRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYWU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyb3VuZGwuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJvdW5kbC5jLHYgMS4xIDIwMDUvMDQvMDggMDE6MjQ6MDggZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJbG9uZyBkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRsCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR0xPTkdfTUFYCisjZGVmaW5lCWZuCQlsbHJvdW5kbAorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbG9nMXAuYyBiL2xpYm0vc3JjL3NfbG9nMXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUxNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sb2cxcC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiBAKCMpc19sb2cxcC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sb2cxcC5jLHYgMS44IDIwMDUvMTIvMDQgMTI6Mjg6MzMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBkb3VibGUgbG9nMXAoZG91YmxlIHgpCisgKgorICogTWV0aG9kIDoKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uOiBmaW5kIGsgYW5kIGYgc3VjaCB0aGF0CisgKgkJCTEreCA9IDJeayAqICgxK2YpLAorICoJICAgd2hlcmUgIHNxcnQoMikvMiA8IDErZiA8IHNxcnQoMikgLgorICoKKyAqICAgICAgTm90ZS4gSWYgaz0wLCB0aGVuIGY9eCBpcyBleGFjdC4gSG93ZXZlciwgaWYgayE9MCwgdGhlbiBmCisgKgltYXkgbm90IGJlIHJlcHJlc2VudGFibGUgZXhhY3RseS4gSW4gdGhhdCBjYXNlLCBhIGNvcnJlY3Rpb24KKyAqCXRlcm0gaXMgbmVlZC4gTGV0IHU9MSt4IHJvdW5kZWQuIExldCBjID0gKDEreCktdSwgdGhlbgorICoJbG9nKDEreCkgLSBsb2codSkgfiBjL3UuIFRodXMsIHdlIHByb2NlZWQgdG8gY29tcHV0ZSBsb2codSksCisgKglhbmQgYWRkIGJhY2sgdGhlIGNvcnJlY3Rpb24gdGVybSBjL3UuCisgKgkoTm90ZTogd2hlbiB4ID4gMioqNTMsIG9uZSBjYW4gc2ltcGx5IHJldHVybiBsb2coeCkpCisgKgorICogICAyLiBBcHByb3hpbWF0aW9uIG9mIGxvZzFwKGYpLgorICoJTGV0IHMgPSBmLygyK2YpIDsgYmFzZWQgb24gbG9nKDErZikgPSBsb2coMStzKSAtIGxvZygxLXMpCisgKgkJID0gMnMgKyAyLzMgcyoqMyArIDIvNSBzKio1ICsgLi4uLi4sCisgKgkgICAgIAkgPSAycyArIHMqUgorICogICAgICBXZSB1c2UgYSBzcGVjaWFsIFJlbWUgYWxnb3JpdGhtIG9uIFswLDAuMTcxNl0gdG8gZ2VuZXJhdGUKKyAqIAlhIHBvbHlub21pYWwgb2YgZGVncmVlIDE0IHRvIGFwcHJveGltYXRlIFIgVGhlIG1heGltdW0gZXJyb3IKKyAqCW9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQgYnkgMioqLTU4LjQ1LiBJbgorICoJb3RoZXIgd29yZHMsCisgKgkJICAgICAgICAyICAgICAgNCAgICAgIDYgICAgICA4ICAgICAgMTAgICAgICAxMiAgICAgIDE0CisgKgkgICAgUih6KSB+IExwMSpzICtMcDIqcyArTHAzKnMgK0xwNCpzICtMcDUqcyAgK0xwNipzICArTHA3KnMKKyAqICAJKHRoZSB2YWx1ZXMgb2YgTHAxIHRvIExwNyBhcmUgbGlzdGVkIGluIHRoZSBwcm9ncmFtKQorICoJYW5kCisgKgkgICAgfCAgICAgIDIgICAgICAgICAgMTQgICAgICAgICAgfCAgICAgLTU4LjQ1CisgKgkgICAgfCBMcDEqcyArLi4uK0xwNypzICAgIC0gIFIoeikgfCA8PSAyCisgKgkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICoJTm90ZSB0aGF0IDJzID0gZiAtIHMqZiA9IGYgLSBoZnNxICsgcypoZnNxLCB3aGVyZSBoZnNxID0gZipmLzIuCisgKglJbiBvcmRlciB0byBndWFyYW50ZWUgZXJyb3IgaW4gbG9nIGJlbG93IDF1bHAsIHdlIGNvbXB1dGUgbG9nCisgKglieQorICoJCWxvZzFwKGYpID0gZiAtIChoZnNxIC0gcyooaGZzcStSKSkuCisgKgorICoJMy4gRmluYWxseSwgbG9nMXAoeCkgPSBrKmxuMiArIGxvZzFwKGYpLgorICoJCSAJICAgICA9IGsqbG4yX2hpKyhmLShoZnNxLShzKihoZnNxK1IpK2sqbG4yX2xvKSkpCisgKgkgICBIZXJlIGxuMiBpcyBzcGxpdCBpbnRvIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXI6CisgKgkJCWxuMl9oaSArIGxuMl9sbywKKyAqCSAgIHdoZXJlIG4qbG4yX2hpIGlzIGFsd2F5cyBleGFjdCBmb3IgfG58IDwgMjAwMC4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJbG9nMXAoeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHggPCAtMSAoaW5jbHVkaW5nIC1JTkYpIDsKKyAqCWxvZzFwKCtJTkYpIGlzICtJTkY7IGxvZzFwKC0xKSBpcyAtSU5GIHdpdGggc2lnbmFsOworICoJbG9nMXAoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbC4KKyAqCisgKiBBY2N1cmFjeToKKyAqCWFjY29yZGluZyB0byBhbiBlcnJvciBhbmFseXNpcywgdGhlIGVycm9yIGlzIGFsd2F5cyBsZXNzIHRoYW4KKyAqCTEgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4KKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZworICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICoKKyAqIE5vdGU6IEFzc3VtaW5nIGxvZygpIHJldHVybiBhY2N1cmF0ZSBhbnN3ZXIsIHRoZSBmb2xsb3dpbmcKKyAqIAkgYWxnb3JpdGhtIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgbG9nMXAoeCkgdG8gd2l0aGluIGEgZmV3IFVMUDoKKyAqCisgKgkJdSA9IDEreDsKKyAqCQlpZih1PT0xLjApIHJldHVybiB4IDsgZWxzZQorICoJCQkgICByZXR1cm4gbG9nKHUpKih4Lyh1LTEuMCkpOworICoKKyAqCSBTZWUgSFAtMTVDIEFkdmFuY2VkIEZ1bmN0aW9ucyBIYW5kYm9vaywgcC4xOTMuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorbG4yX2hpICA9ICA2LjkzMTQ3MTgwMzY5MTIzODE2NDkwZS0wMSwJLyogM2ZlNjJlNDIgZmVlMDAwMDAgKi8KK2xuMl9sbyAgPSAgMS45MDgyMTQ5MjkyNzA1ODc3MDAwMmUtMTAsCS8qIDNkZWEzOWVmIDM1NzkzYzc2ICovCit0d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAgLyogNDM1MDAwMDAgMDAwMDAwMDAgKi8KK0xwMSA9IDYuNjY2NjY2NjY2NjY2NzM1MTMwZS0wMSwgIC8qIDNGRTU1NTU1IDU1NTU1NTkzICovCitMcDIgPSAzLjk5OTk5OTk5OTk0MDk0MTkwOGUtMDEsICAvKiAzRkQ5OTk5OSA5OTk3RkEwNCAqLworTHAzID0gMi44NTcxNDI4NzQzNjYyMzkxNDllLTAxLCAgLyogM0ZEMjQ5MjQgOTQyMjkzNTkgKi8KK0xwNCA9IDIuMjIyMjE5ODQzMjE0OTc4Mzk2ZS0wMSwgIC8qIDNGQ0M3MUM1IDFEOEU3OEFGICovCitMcDUgPSAxLjgxODM1NzIxNjE2MTgwNTAxMmUtMDEsICAvKiAzRkM3NDY2NCA5NkNCMDNERSAqLworTHA2ID0gMS41MzEzODM3Njk5MjA5MzczMzJlLTAxLCAgLyogM0ZDMzlBMDkgRDA3OEM2OUYgKi8KK0xwNyA9IDEuNDc5ODE5ODYwNTExNjU4NTkxZS0wMTsgIC8qIDNGQzJGMTEyIERGM0U1MjQ0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuMDsKKworZG91YmxlCitsb2cxcChkb3VibGUgeCkKK3sKKwlkb3VibGUgaGZzcSxmLGMscyx6LFIsdTsKKwlpbnQzMl90IGssaHgsaHUsYXg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWF4ID0gaHgmMHg3ZmZmZmZmZjsKKworCWsgPSAxOworCWlmIChoeCA8IDB4M0ZEQTgyN0EpIHsJCQkvKiAxK3ggPCBzcXJ0KDIpKyAqLworCSAgICBpZihheD49MHgzZmYwMDAwMCkgewkJLyogeCA8PSAtMS4wICovCisJCWlmKHg9PS0xLjApIHJldHVybiAtdHdvNTQvemVybzsgLyogbG9nMXAoLTEpPStpbmYgKi8KKwkJZWxzZSByZXR1cm4gKHgteCkvKHgteCk7CS8qIGxvZzFwKHg8LTEpPU5hTiAqLworCSAgICB9CisJICAgIGlmKGF4PDB4M2UyMDAwMDApIHsJCQkvKiB8eHwgPCAyKiotMjkgKi8KKwkJaWYodHdvNTQreD56ZXJvCQkJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICAgICAgICAgICYmYXg8MHgzYzkwMDAwMCkgCQkvKiB8eHwgPCAyKiotNTQgKi8KKwkJICAgIHJldHVybiB4OworCQllbHNlCisJCSAgICByZXR1cm4geCAtIHgqeCowLjU7CisJICAgIH0KKwkgICAgaWYoaHg+MHx8aHg8PSgoaW50MzJfdCkweGJmZDJiZWM0KSkgeworCQlrPTA7Zj14O2h1PTE7fQkJLyogc3FydCgyKS8yLSA8PSAxK3ggPCBzcXJ0KDIpKyAqLworCX0KKwlpZiAoaHggPj0gMHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihrIT0wKSB7CisJICAgIGlmKGh4PDB4NDM0MDAwMDApIHsKKwkJdSAgPSAxLjAreDsKKwkJR0VUX0hJR0hfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMCktMTAyMzsKKwkgICAgICAgIGMgID0gKGs+MCk/IDEuMC0odS14KTp4LSh1LTEuMCk7LyogY29ycmVjdGlvbiB0ZXJtICovCisJCWMgLz0gdTsKKwkgICAgfSBlbHNlIHsKKwkJdSAgPSB4OworCQlHRVRfSElHSF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIwKS0xMDIzOworCQljICA9IDA7CisJICAgIH0KKwkgICAgaHUgJj0gMHgwMDBmZmZmZjsKKwkgICAgLyoKKwkgICAgICogVGhlIGFwcHJveGltYXRpb24gdG8gc3FydCgyKSB1c2VkIGluIHRocmVzaG9sZHMgaXMgbm90CisJICAgICAqIGNyaXRpY2FsLiAgSG93ZXZlciwgdGhlIG9uZXMgdXNlZCBhYm92ZSBtdXN0IGdpdmUgbGVzcworCSAgICAgKiBzdHJpY3QgYm91bmRzIHRoYW4gdGhlIG9uZSBoZXJlIHNvIHRoYXQgdGhlIGs9PTAgY2FzZSBpcworCSAgICAgKiBuZXZlciByZWFjaGVkIGZyb20gaGVyZSwgc2luY2UgaGVyZSB3ZSBoYXZlIGNvbW1pdHRlZCB0bworCSAgICAgKiB1c2luZyB0aGUgY29ycmVjdGlvbiB0ZXJtIGJ1dCBkb24ndCB1c2UgaXQgaWYgaz09MC4KKwkgICAgICovCisJICAgIGlmKGh1PDB4NmEwOWUpIHsJCQkvKiB1IH48IHNxcnQoMikgKi8KKwkgICAgICAgIFNFVF9ISUdIX1dPUkQodSxodXwweDNmZjAwMDAwKTsJLyogbm9ybWFsaXplIHUgKi8KKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGsgKz0gMTsKKwkJU0VUX0hJR0hfV09SRCh1LGh1fDB4M2ZlMDAwMDApOwkvKiBub3JtYWxpemUgdS8yICovCisJICAgICAgICBodSA9ICgweDAwMTAwMDAwLWh1KT4+MjsKKwkgICAgfQorCSAgICBmID0gdS0xLjA7CisJfQorCWhmc3E9MC41KmYqZjsKKwlpZihodT09MCkgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87CisJCQllbHNlIHtjICs9IGsqbG4yX2xvOyByZXR1cm4gaypsbjJfaGkrYzt9CisJICAgIFIgPSBoZnNxKigxLjAtMC42NjY2NjY2NjY2NjY2NjY2NipmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZQorCSAgICAJICAgICByZXR1cm4gaypsbjJfaGktKChSLShrKmxuMl9sbytjKSktZik7CisJfQorIAlzID0gZi8oMi4wK2YpOworCXogPSBzKnM7CisJUiA9IHoqKExwMSt6KihMcDIreiooTHAzK3oqKExwNCt6KihMcDUreiooTHA2K3oqTHA3KSkpKSkpOworCWlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSByZXR1cm4gaypsbjJfaGktKChoZnNxLShzKihoZnNxK1IpKyhrKmxuMl9sbytjKSkpLWYpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2cxcGYuYyBiL2xpYm0vc3JjL3NfbG9nMXBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NGRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbG9nMXBmLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIHNfbG9nMXBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2xvZzFwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZzFwZi5jLHYgMS45IDIwMDUvMTIvMDQgMTI6MzA6NDQgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK2xuMl9oaSA9ICAgNi45MzEzODEyMjU2ZS0wMSwJLyogMHgzZjMxNzE4MCAqLworbG4yX2xvID0gICA5LjA1ODAwMDYxNDVlLTA2LAkvKiAweDM3MTdmN2QxICovCit0d28yNSA9ICAgIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLworTHAxID0gNi42NjY2NjY4NjUzZS0wMSwJLyogM0YyQUFBQUIgKi8KK0xwMiA9IDQuMDAwMDAwMDU5NmUtMDEsCS8qIDNFQ0NDQ0NEICovCitMcDMgPSAyLjg1NzE0Mjk4NDllLTAxLCAvKiAzRTkyNDkyNSAqLworTHA0ID0gMi4yMjIyMTk4NTQ2ZS0wMSwgLyogM0U2MzhFMjkgKi8KK0xwNSA9IDEuODE4MzU3MjU5MGUtMDEsIC8qIDNFM0EzMzI1ICovCitMcDYgPSAxLjUzMTM4Mzg0MjJlLTAxLCAvKiAzRTFDRDA0RiAqLworTHA3ID0gMS40Nzk4MTk4NjQwZS0wMTsgLyogM0UxNzg4OTcgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0Citsb2cxcGYoZmxvYXQgeCkKK3sKKwlmbG9hdCBoZnNxLGYsYyxzLHosUix1OworCWludDMyX3QgayxoeCxodSxheDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWF4ID0gaHgmMHg3ZmZmZmZmZjsKKworCWsgPSAxOworCWlmIChoeCA8IDB4M2VkNDEzZDApIHsJCQkvKiAxK3ggPCBzcXJ0KDIpKyAgKi8KKwkgICAgaWYoYXg+PTB4M2Y4MDAwMDApIHsJCS8qIHggPD0gLTEuMCAqLworCQlpZih4PT0oZmxvYXQpLTEuMCkgcmV0dXJuIC10d28yNS96ZXJvOyAvKiBsb2cxcCgtMSk9K2luZiAqLworCQllbHNlIHJldHVybiAoeC14KS8oeC14KTsJLyogbG9nMXAoeDwtMSk9TmFOICovCisJICAgIH0KKwkgICAgaWYoYXg8MHgzMTAwMDAwMCkgewkJCS8qIHx4fCA8IDIqKi0yOSAqLworCQlpZih0d28yNSt4Pnplcm8JCQkvKiByYWlzZSBpbmV4YWN0ICovCisJICAgICAgICAgICAgJiZheDwweDI0ODAwMDAwKSAJCS8qIHx4fCA8IDIqKi01NCAqLworCQkgICAgcmV0dXJuIHg7CisJCWVsc2UKKwkJICAgIHJldHVybiB4IC0geCp4KihmbG9hdCkwLjU7CisJICAgIH0KKwkgICAgaWYoaHg+MHx8aHg8PSgoaW50MzJfdCkweGJlOTVmNjE5KSkgeworCQlrPTA7Zj14O2h1PTE7fQkJLyogc3FydCgyKS8yLSA8PSAxK3ggPCBzcXJ0KDIpKyAqLworCX0KKwlpZiAoaHggPj0gMHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihrIT0wKSB7CisJICAgIGlmKGh4PDB4NWEwMDAwMDApIHsKKwkJKih2b2xhdGlsZSBmbG9hdCAqKSZ1ID0gKGZsb2F0KTEuMCt4OworCQlHRVRfRkxPQVRfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMyktMTI3OworCQkvKiBjb3JyZWN0aW9uIHRlcm0gKi8KKwkgICAgICAgIGMgID0gKGs+MCk/IChmbG9hdCkxLjAtKHUteCk6eC0odS0oZmxvYXQpMS4wKTsKKwkJYyAvPSB1OworCSAgICB9IGVsc2UgeworCQl1ICA9IHg7CisJCUdFVF9GTE9BVF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIzKS0xMjc7CisJCWMgID0gMDsKKwkgICAgfQorCSAgICBodSAmPSAweDAwN2ZmZmZmOworCSAgICAvKgorCSAgICAgKiBUaGUgYXBwcm94aW1hdGlvbiB0byBzcXJ0KDIpIHVzZWQgaW4gdGhyZXNob2xkcyBpcyBub3QKKwkgICAgICogY3JpdGljYWwuICBIb3dldmVyLCB0aGUgb25lcyB1c2VkIGFib3ZlIG11c3QgZ2l2ZSBsZXNzCisJICAgICAqIHN0cmljdCBib3VuZHMgdGhhbiB0aGUgb25lIGhlcmUgc28gdGhhdCB0aGUgaz09MCBjYXNlIGlzCisJICAgICAqIG5ldmVyIHJlYWNoZWQgZnJvbSBoZXJlLCBzaW5jZSBoZXJlIHdlIGhhdmUgY29tbWl0dGVkIHRvCisJICAgICAqIHVzaW5nIHRoZSBjb3JyZWN0aW9uIHRlcm0gYnV0IGRvbid0IHVzZSBpdCBpZiBrPT0wLgorCSAgICAgKi8KKwkgICAgaWYoaHU8MHgzNTA0ZjQpIHsJCQkvKiB1IDwgc3FydCgyKSAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQodSxodXwweDNmODAwMDAwKTsvKiBub3JtYWxpemUgdSAqLworCSAgICB9IGVsc2UgeworCSAgICAgICAgayArPSAxOworCQlTRVRfRkxPQVRfV09SRCh1LGh1fDB4M2YwMDAwMDApOwkvKiBub3JtYWxpemUgdS8yICovCisJICAgICAgICBodSA9ICgweDAwODAwMDAwLWh1KT4+MjsKKwkgICAgfQorCSAgICBmID0gdS0oZmxvYXQpMS4wOworCX0KKwloZnNxPShmbG9hdCkwLjUqZipmOworCWlmKGh1PT0wKSB7CS8qIHxmfCA8IDIqKi0yMCAqLworCSAgICBpZihmPT16ZXJvKSBpZihrPT0wKSByZXR1cm4gemVybzsKKwkJCWVsc2Uge2MgKz0gaypsbjJfbG87IHJldHVybiBrKmxuMl9oaStjO30KKwkgICAgUiA9IGhmc3EqKChmbG9hdCkxLjAtKGZsb2F0KTAuNjY2NjY2NjY2NjY2NjY2NjYqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2UKKwkgICAgCSAgICAgcmV0dXJuIGsqbG4yX2hpLSgoUi0oaypsbjJfbG8rYykpLWYpOworCX0KKyAJcyA9IGYvKChmbG9hdCkyLjArZik7CisJeiA9IHMqczsKKwlSID0geiooTHAxK3oqKExwMit6KihMcDMreiooTHA0K3oqKExwNSt6KihMcDYreipMcDcpKSkpKSk7CisJaWYoaz09MCkgcmV0dXJuIGYtKGhmc3EtcyooaGZzcStSKSk7IGVsc2UKKwkJIHJldHVybiBrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrKGsqbG4yX2xvK2MpKSktZik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xvZ2IuYyBiL2xpYm0vc3JjL3NfbG9nYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWRiODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZ2IuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBAKCMpc19sb2diLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZ2IuYyx2IDEuMTAgMjAwNS8xMi8wMyAxMTo1NzoxOSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBkb3VibGUgbG9nYih4KQorICogSUVFRSA3NTQgbG9nYi4gSW5jbHVkZWQgdG8gcGFzcyBJRUVFIHRlc3Qgc3VpdGUuIE5vdCByZWNvbW1lbmQuCisgKiBVc2UgaWxvZ2IgaW5zdGVhZC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCA9IDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2OwkvKiA0MzUwMDAwMCAwMDAwMDAwMCAqLworCitkb3VibGUKK2xvZ2IoZG91YmxlIHgpCit7CisJaW50MzJfdCBseCxpeDsKKwlFWFRSQUNUX1dPUkRTKGl4LGx4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CQkJLyogaGlnaCB8eHwgKi8KKwlpZigoaXh8bHgpPT0wKSByZXR1cm4gLTEuMC9mYWJzKHgpOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OworCWlmKGl4PDB4MDAxMDAwMDApIHsKKwkJeCAqPSB0d281NDsJCSAvKiBjb252ZXJ0IHN1Ym5vcm1hbCB4IHRvIG5vcm1hbCAqLworCQlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkJaXggJj0gMHg3ZmZmZmZmZjsKKwkJcmV0dXJuIChmbG9hdCkgKChpeD4+MjApLTEwMjMtNTQpOworCX0gZWxzZQorCQlyZXR1cm4gKGRvdWJsZSkgKChpeD4+MjApLTEwMjMpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2diZi5jIGIvbGlibS9zcmMvc19sb2diZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDkyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZ2JmLmMKQEAgLTAsMCArMSw0MSBAQAorLyogc19sb2diZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19sb2diLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZ2JmLmMsdiAxLjggMjAwNS8xMi8wMyAxMTo1NzoxOSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjUgPSAzLjM1NTQ0MzIwMGUrMDc7CQkvKiAweDRjMDAwMDAwICovCisKK2Zsb2F0Citsb2diZihmbG9hdCB4KQoreworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsJCQkvKiBoaWdoIHx4fCAqLworCWlmKGl4PT0wKSByZXR1cm4gKGZsb2F0KS0xLjAvZmFic2YoeCk7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4Kng7CisJaWYoaXg8MHgwMDgwMDAwMCkgeworCQl4ICo9IHR3bzI1OwkJIC8qIGNvbnZlcnQgc3Vibm9ybWFsIHggdG8gbm9ybWFsICovCisJCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCQlpeCAmPSAweDdmZmZmZmZmOworCQlyZXR1cm4gKGZsb2F0KSAoKGl4Pj4yMyktMTI3LTI1KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChmbG9hdCkgKChpeD4+MjMpLTEyNyk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyaW50LmMgYi9saWJtL3NyYy9zX2xyaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhMDlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJpbnQuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIHR5cGUKKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyaW50LmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJpbnQKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJZm4JCWxyaW50CisjZW5kaWYKKworLyoKKyAqIEM5OSBzYXlzIHdlIHNob3VsZCBub3QgcmFpc2UgYSBzcHVyaW91cyBpbmV4YWN0IGV4Y2VwdGlvbiB3aGVuIGFuCisgKiBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGUgc2V0IG9mIGlucHV0cworICogdGhhdCBvdmVyZmxvd3MgZGVwZW5kcyBvbiB0aGUgcm91bmRpbmcgbW9kZSB3aGVuICdkdHlwZScgaGFzIG1vcmUKKyAqIHNpZ25pZmljYW50IGJpdHMgdGhhbiAndHlwZScuICBIZW5jZSwgd2UgYmVuZCBvdmVyIGJhY2t3YXJkcyBmb3IgdGhlCisgKiBzYWtlIG9mIGNvcnJlY3RuZXNzOyBhbiBNRCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBtb3JlIGVmZmljaWVudC4KKyAqLworZHR5cGUKK2ZuKHR5cGUgeCkKK3sKKwlmZW52X3QgZW52OworCWR0eXBlIGQ7CisKKwlmZWhvbGRleGNlcHQoJmVudik7CisJZCA9IChkdHlwZSlyb3VuZGl0KHgpOworCWlmIChmZXRlc3RleGNlcHQoRkVfSU5WQUxJRCkpCisJCWZlY2xlYXJleGNlcHQoRkVfSU5FWEFDVCk7CisJZmV1cGRhdGVlbnYoJmVudik7CisJcmV0dXJuIChkKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJpbnRmLmMgYi9saWJtL3NyYy9zX2xyaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNThlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyaW50Zi5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJpbnRmLmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlmbG9hdAorI2RlZmluZQlyb3VuZGl0CQlyaW50ZgorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlmbgkJbHJpbnRmCisKKyNpbmNsdWRlICJzX2xyaW50LmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyb3VuZC5jIGIvbGlibS9zcmMvc19scm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlmNDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scm91bmQuYwpAQCAtMCwwICsxLDY2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIHR5cGUKKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyb3VuZC5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MTYgZGFzIEV4cCAkIik7ICovCisjZGVmaW5lIHR5cGUJCWRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyb3VuZAorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdfTUFYCisjZGVmaW5lCWZuCQlscm91bmQKKyNlbmRpZgorCisvKgorICogSWYgdHlwZSBoYXMgbW9yZSBwcmVjaXNpb24gdGhhbiBkdHlwZSwgdGhlIGVuZHBvaW50cyBkdHlwZV8obWlufG1heCkgYXJlCisgKiBvZiB0aGUgZm9ybSB4eHguNTsgdGhleSBhcmUgIm91dCBvZiByYW5nZSIgYmVjYXVzZSBscm91bmQoKSByb3VuZHMgYXdheQorICogZnJvbSAwLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHR5cGUgaGFzIGxlc3MgcHJlY2lzaW9uIHRoYW4gZHR5cGUsIHRoZW4KKyAqIGFsbCB2YWx1ZXMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlIGFyZSBpbnRlZ3JhbCwgc28gd2UgbWlnaHQgYXMgd2VsbCBhc3N1bWUKKyAqIHRoYXQgZXZlcnl0aGluZyBpcyBpbiByYW5nZS4gIEF0IGNvbXBpbGUgdGltZSwgSU5SQU5HRSh4KSBzaG91bGQgcmVkdWNlIHRvCisgKiB0d28gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMgaW4gdGhlIGZvcm1lciBjYXNlLCBvciBUUlVFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGNvbnN0IHR5cGUgZHR5cGVfbWluID0gRFRZUEVfTUlOIC0gMC41Oworc3RhdGljIGNvbnN0IHR5cGUgZHR5cGVfbWF4ID0gRFRZUEVfTUFYICsgMC41OworI2RlZmluZQlJTlJBTkdFKHgpCShkdHlwZV9tYXggLSBEVFlQRV9NQVggIT0gMC41IHx8IFwKKwkJCSAoKHgpID4gZHR5cGVfbWluICYmICh4KSA8IGR0eXBlX21heCkpCisKK2R0eXBlCitmbih0eXBlIHgpCit7CisKKwlpZiAoSU5SQU5HRSh4KSkgeworCQl4ID0gcm91bmRpdCh4KTsKKwkJcmV0dXJuICgoZHR5cGUpeCk7CisJfSBlbHNlIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKwkJcmV0dXJuIChEVFlQRV9NQVgpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJvdW5kZi5jIGIvbGlibS9zcmMvc19scm91bmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2OWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJvdW5kZi5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyb3VuZGYuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjI3IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kZgorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdfTUFYCisjZGVmaW5lCWZuCQlscm91bmRmCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scm91bmRsLmMgYi9saWJtL3NyYy9zX2xyb3VuZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzNmODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scm91bmRsLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJvdW5kbC5jLHYgMS4xIDIwMDUvMDQvMDggMDE6MjQ6MDggZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJbG9uZyBkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRsCisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxyb3VuZGwKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX21vZGYuYyBiL2xpYm0vc3JjL3NfbW9kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2ZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX21vZGYuYwpAQCAtMCwwICsxLDc1IEBACisvKiBAKCMpc19tb2RmLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX21vZGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIG1vZGYoZG91YmxlIHgsIGRvdWJsZSAqaXB0cikKKyAqIHJldHVybiBmcmFjdGlvbiBwYXJ0IG9mIHgsIGFuZCByZXR1cm4geCdzIGludGVncmFsIHBhcnQgaW4gKmlwdHIuCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICoKKyAqIEV4Y2VwdGlvbjoKKyAqCU5vIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMDsKKworZG91YmxlCittb2RmKGRvdWJsZSB4LCBkb3VibGUgKmlwdHIpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaTsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsJLyogZXhwb25lbnQgb2YgeCAqLworCWlmKGowPDIwKSB7CQkJLyogaW50ZWdlciBwYXJ0IGluIGhpZ2ggeCAqLworCSAgICBpZihqMDwwKSB7CQkJLyogfHh8PDEgKi8KKwkgICAgICAgIElOU0VSVF9XT1JEUygqaXB0cixpMCYweDgwMDAwMDAwLDApOwkvKiAqaXB0ciA9ICstMCAqLworCQlyZXR1cm4geDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSB7CQkvKiB4IGlzIGludGVncmFsICovCisJCSAgICB1X2ludDMyX3QgaGlnaDsKKwkJICAgICppcHRyID0geDsKKwkJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwkJICAgIElOU0VSVF9XT1JEUyh4LGhpZ2gmMHg4MDAwMDAwMCwwKTsJLyogcmV0dXJuICstMCAqLworCQkgICAgcmV0dXJuIHg7CisJCX0gZWxzZSB7CisJCSAgICBJTlNFUlRfV09SRFMoKmlwdHIsaTAmKH5pKSwwKTsKKwkJICAgIHJldHVybiB4IC0gKmlwdHI7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsJCS8qIG5vIGZyYWN0aW9uIHBhcnQgKi8KKwkgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgICppcHRyID0geCpvbmU7CisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwkgICAgSU5TRVJUX1dPUkRTKHgsaGlnaCYweDgwMDAwMDAwLDApOwkvKiByZXR1cm4gKy0wICovCisJICAgIHJldHVybiB4OworCX0gZWxzZSB7CQkJLyogZnJhY3Rpb24gcGFydCBpbiBsb3cgeCAqLworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSB7IAkJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJCSppcHRyID0geDsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHgpOworCQlJTlNFUlRfV09SRFMoeCxoaWdoJjB4ODAwMDAwMDAsMCk7CS8qIHJldHVybiArLTAgKi8KKwkJcmV0dXJuIHg7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBJTlNFUlRfV09SRFMoKmlwdHIsaTAsaTEmKH5pKSk7CisJCXJldHVybiB4IC0gKmlwdHI7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX21vZGZmLmMgYi9saWJtL3NyYy9zX21vZGZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3NWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbW9kZmYuYwpAQCAtMCwwICsxLDU2IEBACisvKiBzX21vZGZmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX21vZGYuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbW9kZmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMDsKKworZmxvYXQKK21vZGZmKGZsb2F0IHgsIGZsb2F0ICppcHRyKQoreworCWludDMyX3QgaTAsajA7CisJdV9pbnQzMl90IGk7CisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsJLyogZXhwb25lbnQgb2YgeCAqLworCWlmKGowPDIzKSB7CQkJLyogaW50ZWdlciBwYXJ0IGluIHggKi8KKwkgICAgaWYoajA8MCkgewkJCS8qIHx4fDwxICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCgqaXB0cixpMCYweDgwMDAwMDAwKTsJLyogKmlwdHIgPSArLTAgKi8KKwkJcmV0dXJuIHg7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHsJCQkvKiB4IGlzIGludGVncmFsICovCisJCSAgICB1X2ludDMyX3QgaXg7CisJCSAgICAqaXB0ciA9IHg7CisJCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkJICAgIFNFVF9GTE9BVF9XT1JEKHgsaXgmMHg4MDAwMDAwMCk7CS8qIHJldHVybiArLTAgKi8KKwkJICAgIHJldHVybiB4OworCQl9IGVsc2UgeworCQkgICAgU0VUX0ZMT0FUX1dPUkQoKmlwdHIsaTAmKH5pKSk7CisJCSAgICByZXR1cm4geCAtICppcHRyOworCQl9CisJICAgIH0KKwl9IGVsc2UgewkJCS8qIG5vIGZyYWN0aW9uIHBhcnQgKi8KKwkgICAgdV9pbnQzMl90IGl4OworCSAgICAqaXB0ciA9IHgqb25lOworCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCxpeCYweDgwMDAwMDAwKTsJLyogcmV0dXJuICstMCAqLworCSAgICByZXR1cm4geDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25lYXJieWludC5jIGIvbGlibS9zcmMvc19uZWFyYnlpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZkMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZWFyYnlpbnQuYwpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25lYXJieWludC5jLHYgMS4xIDIwMDQvMDcvMDYgMDQ6NDY6MDggZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogV2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgdG8gYXZvaWQgcmFpc2luZworICogYW4gaW5leGFjdCBleGNlcHRpb24uICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB1c2luZyBmZXNldGVudigpCisgKiBpbnN0ZWFkIG9mIGZlY2xlYXJleGNlcHQoKS9mZXVwZGF0ZWVudigpIHRvIHJlc3RvcmUgdGhlIGVudmlyb25tZW50CisgKiBiZWNhdXNlIHRoZSBvbmx5IGV4Y2VwdGlvbiBkZWZpbmVkIGZvciByaW50KCkgaXMgb3ZlcmZsb3csIGFuZAorICogcm91bmRpbmcgY2FuJ3Qgb3ZlcmZsb3cgYXMgbG9uZyBhcyBlbWF4ID49IHAuCisgKi8KKyNkZWZpbmUJREVDTCh0eXBlLCBmbiwgcmludCkJXAordHlwZQkJCQlcCitmbih0eXBlIHgpCQkJXAorewkJCQlcCisJdHlwZSByZXQ7CQlcCisJZmVudl90IGVudjsJCVwKKwkJCQlcCisJZmVnZXRlbnYoJmVudik7CQlcCisJcmV0ID0gcmludCh4KTsJCVwKKwlmZXNldGVudigmZW52KTsJCVwKKwlyZXR1cm4gKHJldCk7CQlcCit9CisKK0RFQ0woZG91YmxlLCBuZWFyYnlpbnQsIHJpbnQpCitERUNMKGZsb2F0LCBuZWFyYnlpbnRmLCByaW50ZikKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dGFmdGVyLmMgYi9saWJtL3NyYy9zX25leHRhZnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDAzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHRhZnRlci5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIEAoIylzX25leHRhZnRlci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0YWZ0ZXIuYyx2IDEuMTEgMjAwNS8wMy8wNyAyMToyNzozNyBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIElFRUUgZnVuY3Rpb25zCisgKgluZXh0YWZ0ZXIoeCx5KQorICoJcmV0dXJuIHRoZSBuZXh0IG1hY2hpbmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9mIHggaW4gdGhlCisgKglkaXJlY3Rpb24gdG93YXJkIHkuCisgKiAgIFNwZWNpYWwgY2FzZXM6CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorbmV4dGFmdGVyKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl2b2xhdGlsZSBkb3VibGUgdDsKKwlpbnQzMl90IGh4LGh5LGl4LGl5OworCXVfaW50MzJfdCBseCxseTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CQkvKiB8eXwgKi8KKworCWlmKCgoaXg+PTB4N2ZmMDAwMDApJiYoKGl4LTB4N2ZmMDAwMDApfGx4KSE9MCkgfHwgICAvKiB4IGlzIG5hbiAqLworCSAgICgoaXk+PTB4N2ZmMDAwMDApJiYoKGl5LTB4N2ZmMDAwMDApfGx5KSE9MCkpICAgICAvKiB5IGlzIG5hbiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoeD09eSkgcmV0dXJuIHk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoKGl4fGx4KT09MCkgewkJCS8qIHggPT0gMCAqLworCSAgICBJTlNFUlRfV09SRFMoeCxoeSYweDgwMDAwMDAwLDEpOwkvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4Pj0wKSB7CQkJCS8qIHggPiAwICovCisJICAgIGlmKGh4Pmh5fHwoKGh4PT1oeSkmJihseD5seSkpKSB7CS8qIHggPiB5LCB4IC09IHVscCAqLworCQlpZihseD09MCkgaHggLT0gMTsKKwkJbHggLT0gMTsKKwkgICAgfSBlbHNlIHsJCQkJLyogeCA8IHksIHggKz0gdWxwICovCisJCWx4ICs9IDE7CisJCWlmKGx4PT0wKSBoeCArPSAxOworCSAgICB9CisJfSBlbHNlIHsJCQkJLyogeCA8IDAgKi8KKwkgICAgaWYoaHk+PTB8fGh4Pmh5fHwoKGh4PT1oeSkmJihseD5seSkpKXsvKiB4IDwgeSwgeCAtPSB1bHAgKi8KKwkJaWYobHg9PTApIGh4IC09IDE7CisJCWx4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPiB5LCB4ICs9IHVscCAqLworCQlseCArPSAxOworCQlpZihseD09MCkgaHggKz0gMTsKKwkgICAgfQorCX0KKwloeSA9IGh4JjB4N2ZmMDAwMDA7CisJaWYoaHk+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGh5PDB4MDAxMDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgSU5TRVJUX1dPUkRTKHksaHgsbHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJcmV0dXJuIHg7Cit9CisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykKK19fd2Vha19yZWZlcmVuY2UobmV4dGFmdGVyLCBuZXh0dG93YXJkKTsKK19fd2Vha19yZWZlcmVuY2UobmV4dGFmdGVyLCBuZXh0dG93YXJkbCk7CitfX3dlYWtfcmVmZXJlbmNlKG5leHRhZnRlciwgbmV4dGFmdGVybCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dGFmdGVyZi5jIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlYWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVyZi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIHNfbmV4dGFmdGVyZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19uZXh0YWZ0ZXIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dGFmdGVyZi5jLHYgMS4xMCAyMDA1LzAzLzA3IDA0OjU1OjU4IGRhcyBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK25leHRhZnRlcmYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwl2b2xhdGlsZSBmbG9hdCB0OworCWludDMyX3QgaHgsaHksaXgsaXk7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CQkvKiB8eXwgKi8KKworCWlmKChpeD4weDdmODAwMDAwKSB8fCAgIC8qIHggaXMgbmFuICovCisJICAgKGl5PjB4N2Y4MDAwMDApKSAgICAgLyogeSBpcyBuYW4gKi8KKwkgICByZXR1cm4geCt5OworCWlmKHg9PXkpIHJldHVybiB5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKGl4PT0wKSB7CQkJCS8qIHggPT0gMCAqLworCSAgICBTRVRfRkxPQVRfV09SRCh4LChoeSYweDgwMDAwMDAwKXwxKTsvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4Pj0wKSB7CQkJCS8qIHggPiAwICovCisJICAgIGlmKGh4Pmh5KSB7CQkJCS8qIHggPiB5LCB4IC09IHVscCAqLworCQloeCAtPSAxOworCSAgICB9IGVsc2UgewkJCQkvKiB4IDwgeSwgeCArPSB1bHAgKi8KKwkJaHggKz0gMTsKKwkgICAgfQorCX0gZWxzZSB7CQkJCS8qIHggPCAwICovCisJICAgIGlmKGh5Pj0wfHxoeD5oeSl7CQkJLyogeCA8IHksIHggLT0gdWxwICovCisJCWh4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPiB5LCB4ICs9IHVscCAqLworCQloeCArPSAxOworCSAgICB9CisJfQorCWh5ID0gaHgmMHg3ZjgwMDAwMDsKKwlpZihoeT49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYoaHk8MHgwMDgwMDAwMCkgewkJLyogdW5kZXJmbG93ICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQhPXgpIHsJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCh5LGh4KTsKKwkJcmV0dXJuIHk7CisJICAgIH0KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHRhZnRlcmwuYyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHRhZnRlcmwuYwpAQCAtMCwwICsxLDgyIEBACisvKiBAKCMpc19uZXh0YWZ0ZXIuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dGFmdGVybC5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTY6NDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBJRUVFIGZ1bmN0aW9ucworICoJbmV4dGFmdGVyKHgseSkKKyAqCXJldHVybiB0aGUgbmV4dCBtYWNoaW5lIGZsb2F0aW5nLXBvaW50IG51bWJlciBvZiB4IGluIHRoZQorICoJZGlyZWN0aW9uIHRvd2FyZCB5LgorICogICBTcGVjaWFsIGNhc2VzOgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworbG9uZyBkb3VibGUKK25leHRhZnRlcmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl2b2xhdGlsZSBsb25nIGRvdWJsZSB0OworCXVuaW9uIElFRUVsMmJpdHMgdXgsIHV5OworCisJdXguZSA9IHg7CisJdXkuZSA9IHk7CisKKwlpZiAoKHV4LmJpdHMuZXhwID09IDB4N2ZmZiAmJgorCSAgICAgKCh1eC5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXguYml0cy5tYW5sKSAhPSAwKSB8fAorCSAgICAodXkuYml0cy5leHAgPT0gMHg3ZmZmICYmCisJICAgICAoKHV5LmJpdHMubWFuaCZ+TERCTF9OQklUKXx1eS5iaXRzLm1hbmwpICE9IDApKQorCSAgIHJldHVybiB4K3k7CS8qIHggb3IgeSBpcyBuYW4gKi8KKwlpZih4PT15KSByZXR1cm4geTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZih4PT0wLjApIHsKKwkgICAgdXguYml0cy5tYW5oID0gMDsJCQkvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdXguYml0cy5tYW5sID0gMTsKKwkgICAgdXguYml0cy5zaWduID0gdXkuYml0cy5zaWduOworCSAgICB0ID0gdXguZSp1eC5lOworCSAgICBpZih0PT11eC5lKSByZXR1cm4gdDsgZWxzZSByZXR1cm4gdXguZTsgLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoeD4wLjAgXiB4PHkpIHsJCQkvKiB4IC09IHVscCAqLworCSAgICBpZih1eC5iaXRzLm1hbmw9PTApIHsKKwkJaWYgKCh1eC5iaXRzLm1hbmgmfkxEQkxfTkJJVCk9PTApCisJCSAgICB1eC5iaXRzLmV4cCAtPSAxOworCQl1eC5iaXRzLm1hbmggPSAodXguYml0cy5tYW5oIC0gMSkgfCAodXguYml0cy5tYW5oICYgTERCTF9OQklUKTsKKwkgICAgfQorCSAgICB1eC5iaXRzLm1hbmwgLT0gMTsKKwl9IGVsc2UgewkJCQkvKiB4ICs9IHVscCAqLworCSAgICB1eC5iaXRzLm1hbmwgKz0gMTsKKwkgICAgaWYodXguYml0cy5tYW5sPT0wKSB7CisJCXV4LmJpdHMubWFuaCA9ICh1eC5iaXRzLm1hbmggKyAxKSB8ICh1eC5iaXRzLm1hbmggJiBMREJMX05CSVQpOworCQlpZiAoKHV4LmJpdHMubWFuaCZ+TERCTF9OQklUKT09MCkKKwkJICAgIHV4LmJpdHMuZXhwICs9IDE7CisJICAgIH0KKwl9CisJaWYodXguYml0cy5leHA9PTB4N2ZmZikgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYodXguYml0cy5leHA9PTApIHsJCQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgbWFza19uYml0X2wodXgpOworCSAgICB0ID0gdXguZSAqIHV4LmU7CisJICAgIGlmKHQhPXV4LmUpCQkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkJcmV0dXJuIHV4LmU7CisJfQorCXJldHVybiB1eC5lOworfQorCitfX3N0cm9uZ19yZWZlcmVuY2UobmV4dGFmdGVybCwgbmV4dHRvd2FyZGwpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0dG93YXJkLmMgYi9saWJtL3NyYy9zX25leHR0b3dhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRhNGFkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0dG93YXJkLmMKQEAgLTAsMCArMSw3MyBAQAorLyogQCgjKXNfbmV4dGFmdGVyLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHR0b3dhcmQuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU2OjQ2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IGEgbG9uZyBkb3VibGUgaGFzIGEgMTUtYml0IGV4cG9uZW50LiAgT24gc3lzdGVtcworICogd2hlcmUgbG9uZyBkb3VibGUgaXMgdGhlIHNhbWUgYXMgZG91YmxlLCBuZXh0dG93YXJkKCkgaXMgYW4gYWxpYXMKKyAqIGZvciBuZXh0YWZ0ZXIoKSwgc28gd2UgZG9uJ3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK2RvdWJsZQorbmV4dHRvd2FyZChkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHV5OworCXZvbGF0aWxlIGRvdWJsZSB0OworCWludDMyX3QgaHgsaXg7CisJdV9pbnQzMl90IGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwl1eS5lID0geTsKKworCWlmKCgoaXg+PTB4N2ZmMDAwMDApJiYoKGl4LTB4N2ZmMDAwMDApfGx4KSE9MCkgfHwKKwkgICAgKHV5LmJpdHMuZXhwID09IDB4N2ZmZiAmJgorCSAgICAgKCh1eS5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXkuYml0cy5tYW5sKSAhPSAwKSkKKwkgICByZXR1cm4geCt5OwkvKiB4IG9yIHkgaXMgbmFuICovCisJaWYoeD09eSkgcmV0dXJuIChkb3VibGUpeTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZih4PT0wLjApIHsKKwkgICAgSU5TRVJUX1dPUkRTKHgsdXkuYml0cy5zaWduPDwzMSwxKTsJLyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD4wLjAgXiB4IDwgeSkgewkJCS8qIHggLT0gdWxwICovCisJICAgIGlmKGx4PT0wKSBoeCAtPSAxOworCSAgICBseCAtPSAxOworCX0gZWxzZSB7CQkJCS8qIHggKz0gdWxwICovCisJICAgIGx4ICs9IDE7CisJICAgIGlmKGx4PT0wKSBoeCArPSAxOworCX0KKwlpeCA9IGh4JjB4N2ZmMDAwMDA7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGl4PDB4MDAxMDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgSU5TRVJUX1dPUkRTKHksaHgsbHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHR0b3dhcmRmLmMgYi9saWJtL3NyYy9zX25leHR0b3dhcmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dHRvd2FyZGYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHR0b3dhcmRmLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1NzozOCBkYXMgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjZGVmaW5lCUxEQkxfSU5GTkFOX0VYUAkoTERCTF9NQVhfRVhQICogMiAtIDEpCisKK2Zsb2F0CituZXh0dG93YXJkZihmbG9hdCB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdXk7CisJdm9sYXRpbGUgZmxvYXQgdDsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOwkJLyogfHh8ICovCisJdXkuZSA9IHk7CisKKwlpZigoaXg+MHg3ZjgwMDAwMCkgfHwKKwkgICAodXkuYml0cy5leHAgPT0gTERCTF9JTkZOQU5fRVhQICYmCisJICAgICgodXkuYml0cy5tYW5oJn5MREJMX05CSVQpfHV5LmJpdHMubWFubCkgIT0gMCkpCisJICAgcmV0dXJuIHgreTsJLyogeCBvciB5IGlzIG5hbiAqLworCWlmKHg9PXkpIHJldHVybiAoZmxvYXQpeTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZihpeD09MCkgewkJCQkvKiB4ID09IDAgKi8KKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCwodXkuYml0cy5zaWduPDwzMSl8MSk7LyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD49MCBeIHggPCB5KQkJCS8qIHggLT0gdWxwICovCisJICAgIGh4IC09IDE7CisJZWxzZQkJCQkJLyogeCArPSB1bHAgKi8KKwkgICAgaHggKz0gMTsKKwlpeCA9IGh4JjB4N2Y4MDAwMDA7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGl4PDB4MDA4MDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQoeSxoeCk7CisJCXJldHVybiB5OworCSAgICB9CisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaHgpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yZW1xdW8uYyBiL2xpYm0vc3JjL3NfcmVtcXVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfcmVtcXVvLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qLQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmVtcXVvLmMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBaZXJvW10gPSB7MC4wLCAtMC4wLH07CisKKy8qCisgKiBSZXR1cm4gdGhlIElFRUUgcmVtYWluZGVyIGFuZCBzZXQgKnF1byB0byB0aGUgbGFzdCBuIGJpdHMgb2YgdGhlCisgKiBxdW90aWVudCwgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAgV2UgY2hvb3NlIG49MzEgYmVjYXVzZQorICogd2Ugd2luZCB1cCBjb21wdXRpbmcgYWxsIHRoZSBpbnRlZ2VyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGFueXdheSBhcworICogYSBzaWRlLWVmZmVjdCBvZiBjb21wdXRpbmcgdGhlIHJlbWFpbmRlciBieSB0aGUgc2hpZnQgYW5kIHN1YnRyYWN0CisgKiBtZXRob2QuICBJbiBwcmFjdGljZSwgdGhpcyBpcyBmYXIgbW9yZSBiaXRzIHRoYW4gYXJlIG5lZWRlZCB0byB1c2UKKyAqIHJlbXF1byBpbiByZWR1Y3Rpb24gYWxnb3JpdGhtcy4KKyAqLworZG91YmxlCityZW1xdW8oZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgKnF1bykKK3sKKwlpbnQzMl90IG4saHgsaHksaHosaXgsaXksc3gsaTsKKwl1X2ludDMyX3QgbHgsbHksbHoscSxzeHk7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJc3h5ID0gKGh4IF4gaHkpICYgMHg4MDAwMDAwMDsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKChoeXxseSk9PTB8fChoeD49MHg3ZmYwMDAwMCl8fAkvKiB5PTAsb3IgeCBub3QgZmluaXRlICovCisJICAoKGh5fCgobHl8LWx5KT4+MzEpKT4weDdmZjAwMDAwKSkJLyogb3IgeSBpcyBOYU4gKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PD1oeSkgeworCSAgICBpZigoaHg8aHkpfHwobHg8bHkpKSB7CisJCXEgPSAwOworCQlnb3RvIGZpeHVwOwkvKiB8eHw8fHl8IHJldHVybiB4IG9yIHgteSAqLworCSAgICB9CisJICAgIGlmKGx4PT1seSkgeworCQkqcXVvID0gMTsKKwkJcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCSAgICB9CisJfQorCisgICAgLyogZGV0ZXJtaW5lIGl4ID0gaWxvZ2IoeCkgKi8KKwlpZihoeDwweDAwMTAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIGlmKGh4PT0wKSB7CisJCWZvciAoaXggPSAtMTA0MywgaT1seDsgaT4wOyBpPDw9MSkgaXggLT0xOworCSAgICB9IGVsc2UgeworCQlmb3IgKGl4ID0gLTEwMjIsaT0oaHg8PDExKTsgaT4wOyBpPDw9MSkgaXggLT0xOworCSAgICB9CisJfSBlbHNlIGl4ID0gKGh4Pj4yMCktMTAyMzsKKworICAgIC8qIGRldGVybWluZSBpeSA9IGlsb2diKHkpICovCisJaWYoaHk8MHgwMDEwMDAwMCkgewkvKiBzdWJub3JtYWwgeSAqLworCSAgICBpZihoeT09MCkgeworCQlmb3IgKGl5ID0gLTEwNDMsIGk9bHk7IGk+MDsgaTw8PTEpIGl5IC09MTsKKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpeSA9IC0xMDIyLGk9KGh5PDwxMSk7IGk+MDsgaTw8PTEpIGl5IC09MTsKKwkgICAgfQorCX0gZWxzZSBpeSA9IChoeT4+MjApLTEwMjM7CisKKyAgICAvKiBzZXQgdXAge2h4LGx4fSwge2h5LGx5fSBhbmQgYWxpZ24geSB0byB4ICovCisJaWYoaXggPj0gLTEwMjIpIAorCSAgICBoeCA9IDB4MDAxMDAwMDB8KDB4MDAwZmZmZmYmaHgpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHgsIHNoaWZ0IHggdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTAyMi1peDsKKwkgICAgaWYobjw9MzEpIHsKKwkgICAgICAgIGh4ID0gKGh4PDxuKXwobHg+PigzMi1uKSk7CisJICAgICAgICBseCA8PD0gbjsKKwkgICAgfSBlbHNlIHsKKwkJaHggPSBseDw8KG4tMzIpOworCQlseCA9IDA7CisJICAgIH0KKwl9CisJaWYoaXkgPj0gLTEwMjIpIAorCSAgICBoeSA9IDB4MDAxMDAwMDB8KDB4MDAwZmZmZmYmaHkpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHksIHNoaWZ0IHkgdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTAyMi1peTsKKwkgICAgaWYobjw9MzEpIHsKKwkgICAgICAgIGh5ID0gKGh5PDxuKXwobHk+PigzMi1uKSk7CisJICAgICAgICBseSA8PD0gbjsKKwkgICAgfSBlbHNlIHsKKwkJaHkgPSBseTw8KG4tMzIpOworCQlseSA9IDA7CisJICAgIH0KKwl9CisKKyAgICAvKiBmaXggcG9pbnQgZm1vZCAqLworCW4gPSBpeCAtIGl5OworCXEgPSAwOworCXdoaWxlKG4tLSkgeworCSAgICBoej1oeC1oeTtsej1seC1seTsgaWYobHg8bHkpIGh6IC09IDE7CisJICAgIGlmKGh6PDApe2h4ID0gaHgraHgrKGx4Pj4zMSk7IGx4ID0gbHgrbHg7fQorCSAgICBlbHNlIHtoeCA9IGh6K2h6Kyhsej4+MzEpOyBseCA9IGx6K2x6OyBxKys7fQorCSAgICBxIDw8PSAxOworCX0KKwloej1oeC1oeTtsej1seC1seTsgaWYobHg8bHkpIGh6IC09IDE7CisJaWYoaHo+PTApIHtoeD1oejtseD1sejtxKys7fQorCisgICAgLyogY29udmVydCBiYWNrIHRvIGZsb2F0aW5nIHZhbHVlIGFuZCByZXN0b3JlIHRoZSBzaWduICovCisJaWYoKGh4fGx4KT09MCkgewkJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkgICAgKnF1byA9IChzeHkgPyAtcSA6IHEpOworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJfQorCXdoaWxlKGh4PDB4MDAxMDAwMDApIHsJCS8qIG5vcm1hbGl6ZSB4ICovCisJICAgIGh4ID0gaHgraHgrKGx4Pj4zMSk7IGx4ID0gbHgrbHg7CisJICAgIGl5IC09IDE7CisJfQorCWlmKGl5Pj0gLTEwMjIpIHsJLyogbm9ybWFsaXplIG91dHB1dCAqLworCSAgICBoeCA9ICgoaHgtMHgwMDEwMDAwMCl8KChpeSsxMDIzKTw8MjApKTsKKwl9IGVsc2UgewkJLyogc3Vibm9ybWFsIG91dHB1dCAqLworCSAgICBuID0gLTEwMjIgLSBpeTsKKwkgICAgaWYobjw9MjApIHsKKwkJbHggPSAobHg+Pm4pfCgodV9pbnQzMl90KWh4PDwoMzItbikpOworCQloeCA+Pj0gbjsKKwkgICAgfSBlbHNlIGlmIChuPD0zMSkgeworCQlseCA9IChoeDw8KDMyLW4pKXwobHg+Pm4pOyBoeCA9IHN4OworCSAgICB9IGVsc2UgeworCQlseCA9IGh4Pj4obi0zMik7IGh4ID0gc3g7CisJICAgIH0KKwl9CitmaXh1cDoKKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJeSA9IGZhYnMoeSk7CisJaWYgKHkgPCAweDFwLTEwMjEpIHsKKwkgICAgaWYgKHgreD55IHx8ICh4K3g9PXkgJiYgKHEgJiAxKSkpIHsKKwkJcSsrOworCQl4LT15OworCSAgICB9CisJfSBlbHNlIGlmICh4PjAuNSp5IHx8ICh4PT0wLjUqeSAmJiAocSAmIDEpKSkgeworCSAgICBxKys7CisJICAgIHgtPXk7CisJfQorCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJU0VUX0hJR0hfV09SRCh4LGh4XnN4KTsKKwlxICY9IDB4N2ZmZmZmZmY7CisJKnF1byA9IChzeHkgPyAtcSA6IHEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yZW1xdW9mLmMgYi9saWJtL3NyYy9zX3JlbXF1b2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcyMmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yZW1xdW9mLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qLQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmVtcXVvZi5jLHYgMS4xIDIwMDUvMDMvMjUgMDQ6NDA6NDQgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBaZXJvW10gPSB7MC4wLCAtMC4wLH07CisKKy8qCisgKiBSZXR1cm4gdGhlIElFRUUgcmVtYWluZGVyIGFuZCBzZXQgKnF1byB0byB0aGUgbGFzdCBuIGJpdHMgb2YgdGhlCisgKiBxdW90aWVudCwgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAgV2UgY2hvb3NlIG49MzEgYmVjYXVzZQorICogd2Ugd2luZCB1cCBjb21wdXRpbmcgYWxsIHRoZSBpbnRlZ2VyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGFueXdheSBhcworICogYSBzaWRlLWVmZmVjdCBvZiBjb21wdXRpbmcgdGhlIHJlbWFpbmRlciBieSB0aGUgc2hpZnQgYW5kIHN1YnRyYWN0CisgKiBtZXRob2QuICBJbiBwcmFjdGljZSwgdGhpcyBpcyBmYXIgbW9yZSBiaXRzIHRoYW4gYXJlIG5lZWRlZCB0byB1c2UKKyAqIHJlbXF1byBpbiByZWR1Y3Rpb24gYWxnb3JpdGhtcy4KKyAqLworZmxvYXQKK3JlbXF1b2YoZmxvYXQgeCwgZmxvYXQgeSwgaW50ICpxdW8pCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisJdV9pbnQzMl90IHEsc3h5OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJc3h5ID0gKGh4IF4gaHkpICYgMHg4MDAwMDAwMDsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGh5PT0wfHxoeD49MHg3ZjgwMDAwMHx8aHk+MHg3ZjgwMDAwMCkgLyogeT0wLE5hTjtvciB4IG5vdCBmaW5pdGUgKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PGh5KSB7CisJICAgIHEgPSAwOworCSAgICBnb3RvIGZpeHVwOwkvKiB8eHw8fHl8IHJldHVybiB4IG9yIHgteSAqLworCX0gZWxzZSBpZihoeD09aHkpIHsKKwkgICAgKnF1byA9IDE7CisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsJLyogfHh8PXx5fCByZXR1cm4geCowKi8KKwl9CisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yIChpeCA9IC0xMjYsaT0oaHg8PDgpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJfSBlbHNlIGl4ID0gKGh4Pj4yMyktMTI3OworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGZvciAoaXkgPSAtMTI2LGk9KGh5PDw4KTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCX0gZWxzZSBpeSA9IChoeT4+MjMpLTEyNzsKKworICAgIC8qIHNldCB1cCB7aHgsbHh9LCB7aHksbHl9IGFuZCBhbGlnbiB5IHRvIHggKi8KKwlpZihpeCA+PSAtMTI2KQorCSAgICBoeCA9IDB4MDA4MDAwMDB8KDB4MDA3ZmZmZmYmaHgpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHgsIHNoaWZ0IHggdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTI2LWl4OworCSAgICBoeCA8PD0gbjsKKwl9CisJaWYoaXkgPj0gLTEyNikKKwkgICAgaHkgPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peTsKKwkgICAgaHkgPDw9IG47CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwlxID0gMDsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7CisJICAgIGlmKGh6PDApIGh4ID0gaHggPDwgMTsKKwkgICAgZWxzZSB7aHggPSBoeiA8PCAxOyBxKys7fQorCSAgICBxIDw8PSAxOworCX0KKwloej1oeC1oeTsKKwlpZihoej49MCkge2h4PWh6O3ErKzt9CisKKyAgICAvKiBjb252ZXJ0IGJhY2sgdG8gZmxvYXRpbmcgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHNpZ24gKi8KKwlpZihoeD09MCkgewkJCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJICAgICpxdW8gPSAoc3h5ID8gLXEgOiBxKTsKKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCX0KKwl3aGlsZShoeDwweDAwODAwMDAwKSB7CQkvKiBub3JtYWxpemUgeCAqLworCSAgICBoeCA8PD0gMTsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTI2KSB7CQkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwODAwMDAwKXwoKGl5KzEyNyk8PDIzKSk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMjYgLSBpeTsKKwkgICAgaHggPj49IG47CisJfQorZml4dXA6CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJeSA9IGZhYnNmKHkpOworCWlmICh5IDwgMHgxcC0xMjVmKSB7CisJICAgIGlmICh4K3g+eSB8fCAoeCt4PT15ICYmIChxICYgMSkpKSB7CisJCXErKzsKKwkJeC09eTsKKwkgICAgfQorCX0gZWxzZSBpZiAoeD4wLjVmKnkgfHwgKHg9PTAuNWYqeSAmJiAocSAmIDEpKSkgeworCSAgICBxKys7CisJICAgIHgtPXk7CisJfQorCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCVNFVF9GTE9BVF9XT1JEKHgsaHhec3gpOworCXEgJj0gMHg3ZmZmZmZmZjsKKwkqcXVvID0gKHN4eSA/IC1xIDogcSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JpbnQuYyBiL2xpYm0vc3JjL3NfcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JpbnQuYwpAQCAtMCwwICsxLDg3IEBACisvKiBAKCMpc19yaW50LmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JpbnQuYyx2IDEuMTMgMjAwNS8xMi8wMyAwNzozODozNSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiByaW50KHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvIGludGVncmFsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcHJldmFpbGluZworICogcm91bmRpbmcgbW9kZS4KKyAqIE1ldGhvZDoKKyAqCVVzaW5nIGZsb2F0aW5nIGFkZGl0aW9uLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byByaW50KHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK1RXTzUyWzJdPXsKKyAgNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4NDMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KKyAtNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4QzMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KK307CisKK2RvdWJsZQorcmludChkb3VibGUgeCkKK3sKKwlpbnQzMl90IGkwLGowLHN4OworCXVfaW50MzJfdCBpLGkxOworCWRvdWJsZSB3LHQ7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlzeCA9IChpMD4+MzEpJjE7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsKKwkJaWYoKChpMCYweDdmZmZmZmZmKXxpMSk9PTApIHJldHVybiB4OworCQlpMSB8PSAoaTAmMHgwZmZmZmYpOworCQlpMCAmPSAweGZmZmUwMDAwOworCQlpMCB8PSAoKGkxfC1pMSk+PjEyKSYweDgwMDAwOworCQlTRVRfSElHSF9XT1JEKHgsaTApOworCSAgICAgICAgdyA9IFRXTzUyW3N4XSt4OworCSAgICAgICAgdCA9ICB3LVRXTzUyW3N4XTsKKwkJR0VUX0hJR0hfV09SRChpMCx0KTsKKwkJU0VUX0hJR0hfV09SRCh0LChpMCYweDdmZmZmZmZmKXwoc3g8PDMxKSk7CisJICAgICAgICByZXR1cm4gdDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpPj49MTsKKwkJaWYoKChpMCZpKXxpMSkhPTApIHsKKwkJICAgIC8qCisJCSAgICAgKiBTb21lIGJpdCBpcyBzZXQgYWZ0ZXIgdGhlIDAuNSBiaXQuICBUbyBhdm9pZCB0aGUKKwkJICAgICAqIHBvc3NpYmlsaXR5IG9mIGVycm9ycyBmcm9tIGRvdWJsZSByb3VuZGluZyBpbgorCQkgICAgICogdyA9IFRXTzUyW3N4XSt4LCBhZGp1c3QgdGhlIDAuMjUgYml0IHRvIGEgbG93ZXIKKwkJICAgICAqIGd1YXJkIGJpdC4gIFdlIGRvIHRoaXMgZm9yIGFsbCBqMDw9NTEuICBUaGUKKwkJICAgICAqIGFkanVzdG1lbnQgaXMgdHJpY2tpZXN0IGZvciBqMD09MTggYW5kIGowPT0xOQorCQkgICAgICogc2luY2UgdGhlbiBpdCBzcGFucyB0aGUgd29yZCBib3VuZGFyeS4KKwkJICAgICAqLworCQkgICAgaWYoajA9PTE5KSBpMSA9IDB4NDAwMDAwMDA7IGVsc2UKKwkJICAgIGlmKGowPT0xOCkgaTEgPSAweDgwMDAwMDAwOyBlbHNlCisJCSAgICBpMCA9IChpMCYofmkpKXwoKDB4MjAwMDApPj5qMCk7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaT4+PTE7CisJICAgIGlmKChpMSZpKSE9MCkgaTEgPSAoaTEmKH5pKSl8KCgweDQwMDAwMDAwKT4+KGowLTIwKSk7CisJfQorCUlOU0VSVF9XT1JEUyh4LGkwLGkxKTsKKwkqKHZvbGF0aWxlIGRvdWJsZSAqKSZ3ID0gVFdPNTJbc3hdK3g7CS8qIGNsaXAgYW55IGV4dHJhIHByZWNpc2lvbiAqLworCXJldHVybiB3LVRXTzUyW3N4XTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfcmludGYuYyBiL2xpYm0vc3JjL3NfcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yaW50Zi5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHNfcmludGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfcmludC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yaW50Zi5jLHYgMS4xMCAyMDA1LzEyLzAzIDA5OjAwOjI5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitUV08yM1syXT17CisgIDguMzg4NjA4MDAwMGUrMDYsIC8qIDB4NGIwMDAwMDAgKi8KKyAtOC4zODg2MDgwMDAwZSswNiwgLyogMHhjYjAwMDAwMCAqLworfTsKKworZmxvYXQKK3JpbnRmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMCxzeDsKKwl2b2xhdGlsZSBmbG9hdCB3LHQ7CS8qIHZvbGF0aWxlIHdvcmtzIGFyb3VuZCBnY2MgYnVnICovCisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJc3ggPSAoaTA+PjMxKSYxOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CisJaWYoajA8MjMpIHsKKwkgICAgaWYoajA8MCkgeworCQlpZigoaTAmMHg3ZmZmZmZmZik9PTApIHJldHVybiB4OworCSAgICAgICAgdyA9IFRXTzIzW3N4XSt4OworCSAgICAgICAgdCA9ICB3LVRXTzIzW3N4XTsKKwkJR0VUX0ZMT0FUX1dPUkQoaTAsdCk7CisJCVNFVF9GTE9BVF9XT1JEKHQsKGkwJjB4N2ZmZmZmZmYpfChzeDw8MzEpKTsKKwkgICAgICAgIHJldHVybiB0OworCSAgICB9CisJICAgIHcgPSBUV08yM1tzeF0reDsKKwkgICAgcmV0dXJuIHctVFdPMjNbc3hdOworCX0KKwlpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCWVsc2UgcmV0dXJuIHg7CQkJLyogeCBpcyBpbnRlZ3JhbCAqLworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yb3VuZC5jIGIvbGlibS9zcmMvc19yb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGMxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JvdW5kLmMKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JvdW5kLmMsdiAxLjQgMjAwNS8xMi8wMiAxMzo0NTowNiBiZGUgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCityb3VuZChkb3VibGUgeCkKK3sKKwlkb3VibGUgdDsKKworCWlmICghaXNmaW5pdGUoeCkpCisJCXJldHVybiAoeCk7CisKKwlpZiAoeCA+PSAwLjApIHsKKwkJdCA9IGZsb29yKHgpOworCQlpZiAodCAtIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKHQpOworCX0gZWxzZSB7CisJCXQgPSBmbG9vcigteCk7CisJCWlmICh0ICsgeCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAoLXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfcm91bmRmLmMgYi9saWJtL3NyYy9zX3JvdW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyM2JlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JvdW5kZi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlIHVubW9kaWZpZWQsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yb3VuZGYuYyx2IDEuNCAyMDA1LzEyLzAyIDEzOjQ1OjA2IGJkZSBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitmbG9hdAorcm91bmRmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKworCWlmICghaXNmaW5pdGUoeCkpCisJCXJldHVybiAoeCk7CisKKwlpZiAoeCA+PSAwLjApIHsKKwkJdCA9IGZsb29yZih4KTsKKwkJaWYgKHQgLSB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICh0KTsKKwl9IGVsc2UgeworCQl0ID0gZmxvb3JmKC14KTsKKwkJaWYgKHQgKyB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICgtdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yb3VuZGwuYyBiL2xpYm0vc3JjL3Nfcm91bmRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfcm91bmRsLmMKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JvdW5kbC5jLHYgMS4yIDIwMDUvMTIvMDIgMTM6NDU6MDYgYmRlIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2xvbmcgZG91YmxlCityb3VuZGwobG9uZyBkb3VibGUgeCkKK3sKKwlsb25nIGRvdWJsZSB0OworCisJaWYgKCFpc2Zpbml0ZSh4KSkKKwkJcmV0dXJuICh4KTsKKworCWlmICh4ID49IDAuMCkgeworCQl0ID0gZmxvb3JsKHgpOworCQlpZiAodCAtIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKHQpOworCX0gZWxzZSB7CisJCXQgPSBmbG9vcmwoLXgpOworCQlpZiAodCArIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKC10KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NjYWxibG4uYyBiL2xpYm0vc3JjL3Nfc2NhbGJsbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTA4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibG4uYwpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NjYWxibG4uYyx2IDEuMiAyMDA1LzAzLzA3IDA0OjU3OjUwIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK3NjYWxibG4gKGRvdWJsZSB4LCBsb25nIG4pCit7CisJaW50IGluOworCisJaW4gPSAoaW50KW47CisJaWYgKGluICE9IG4pIHsKKwkJaWYgKG4gPiAwKQorCQkJaW4gPSBJTlRfTUFYOworCQllbHNlCisJCQlpbiA9IElOVF9NSU47CisJfQorCXJldHVybiAoc2NhbGJuKHgsIGluKSk7Cit9CisKK2Zsb2F0CitzY2FsYmxuZiAoZmxvYXQgeCwgbG9uZyBuKQoreworCWludCBpbjsKKworCWluID0gKGludCluOworCWlmIChpbiAhPSBuKSB7CisJCWlmIChuID4gMCkKKwkJCWluID0gSU5UX01BWDsKKwkJZWxzZQorCQkJaW4gPSBJTlRfTUlOOworCX0KKwlyZXR1cm4gKHNjYWxibmYoeCwgaW4pKTsKK30KKworbG9uZyBkb3VibGUKK3NjYWxibG5sIChsb25nIGRvdWJsZSB4LCBsb25nIG4pCit7CisJaW50IGluOworCisJaW4gPSAoaW50KW47CisJaWYgKGluICE9IG4pIHsKKwkJaWYgKG4gPiAwKQorCQkJaW4gPSBJTlRfTUFYOworCQllbHNlCisJCQlpbiA9IElOVF9NSU47CisJfQorCXJldHVybiAoc2NhbGJubCh4LCAoaW50KW4pKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJuLmMgYi9saWJtL3NyYy9zX3NjYWxibi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMThjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEAoIylzX3NjYWxibi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm4uYyx2IDEuMTEgMjAwNS8wMy8wNyAyMToyNzozNyBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBzY2FsYm4gKGRvdWJsZSB4LCBpbnQgbikKKyAqIHNjYWxibih4LG4pIHJldHVybnMgeCogMioqbiAgY29tcHV0ZWQgYnkgIGV4cG9uZW50CisgKiBtYW5pcHVsYXRpb24gcmF0aGVyIHRoYW4gYnkgYWN0dWFsbHkgcGVyZm9ybWluZyBhbgorICogZXhwb25lbnRpYXRpb24gb3IgYSBtdWx0aXBsaWNhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgICA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNiwgLyogMHg0MzUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvbTU0ICA9ICA1LjU1MTExNTEyMzEyNTc4MjcwMjEyZS0xNywgLyogMHgzQzkwMDAwMCwgMHgwMDAwMDAwMCAqLworaHVnZSAgID0gMS4wZSszMDAsCit0aW55ICAgPSAxLjBlLTMwMDsKKworZG91YmxlCitzY2FsYm4gKGRvdWJsZSB4LCBpbnQgbikKK3sKKwlpbnQzMl90IGssaHgsbHg7CisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKyAgICAgICAgayA9IChoeCYweDdmZjAwMDAwKT4+MjA7CQkvKiBleHRyYWN0IGV4cG9uZW50ICovCisgICAgICAgIGlmIChrPT0wKSB7CQkJCS8qIDAgb3Igc3Vibm9ybWFsIHggKi8KKyAgICAgICAgICAgIGlmICgobHh8KGh4JjB4N2ZmZmZmZmYpKT09MCkgcmV0dXJuIHg7IC8qICstMCAqLworCSAgICB4ICo9IHR3bzU0OworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworCSAgICBrID0gKChoeCYweDdmZjAwMDAwKT4+MjApIC0gNTQ7CisgICAgICAgICAgICBpZiAobjwgLTUwMDAwKSByZXR1cm4gdGlueSp4OyAJLyp1bmRlcmZsb3cqLworCSAgICB9CisgICAgICAgIGlmIChrPT0weDdmZikgcmV0dXJuIHgreDsJCS8qIE5hTiBvciBJbmYgKi8KKyAgICAgICAgayA9IGsrbjsKKyAgICAgICAgaWYgKGsgPiAgMHg3ZmUpIHJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7IC8qIG92ZXJmbG93ICAqLworICAgICAgICBpZiAoayA+IDApIAkJCQkvKiBub3JtYWwgcmVzdWx0ICovCisJICAgIHtTRVRfSElHSF9XT1JEKHgsKGh4JjB4ODAwZmZmZmYpfChrPDwyMCkpOyByZXR1cm4geDt9CisgICAgICAgIGlmIChrIDw9IC01NCkKKyAgICAgICAgICAgIGlmIChuID4gNTAwMDApIAkvKiBpbiBjYXNlIGludGVnZXIgb3ZlcmZsb3cgaW4gbitrICovCisJCXJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduKHRpbnkseCk7IAkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gNTQ7CQkJCS8qIHN1Ym5vcm1hbCByZXN1bHQgKi8KKwlTRVRfSElHSF9XT1JEKHgsKGh4JjB4ODAwZmZmZmYpfChrPDwyMCkpOworICAgICAgICByZXR1cm4geCp0d29tNTQ7Cit9CisKKy8vIHRoaXMgaXMgbm9ybWFsbHkgaW4gRnJlZUJTRCdzIGxpYmMuCitkb3VibGUKK2xkZXhwIChkb3VibGUgeCwgaW50IG4pCit7CisgICAgcmV0dXJuIHNjYWxibih4LG4pOworfQorCisjaWYgKExEQkxfTUFOVF9ESUcgPT0gNTMpICAgIC8vWFhYOiBicmlhbiBGSVhNRSBfX3dlYWtfcmVmZXJlbmNlIGRvZXNuIHdvcmsKK2xvbmcgZG91YmxlIGxkZXhwbCAobG9uZyBkb3VibGUgeCwgaW50IG4pIHsKKyAgICByZXR1cm4gc2NhbGJuKChkb3VibGUpeCxuKTsKK30KK2xvbmcgZG91YmxlIHNjYWxibmwgKGxvbmcgZG91YmxlIHgsIGludCBuKSB7CisgICAgcmV0dXJuIHNjYWxibigoZG91YmxlKXgsbik7Cit9CitfX3dlYWtfcmVmZXJlbmNlKHNjYWxibiwgbGRleHBsKTsKK19fd2Vha19yZWZlcmVuY2Uoc2NhbGJuLCBzY2FsYm5sKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zY2FsYm5mLmMgYi9saWJtL3NyYy9zX3NjYWxibmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM3YmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zY2FsYm5mLmMKQEAgLTAsMCArMSw1OCBAQAorLyogc19zY2FsYm5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3NjYWxibi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm5mLmMsdiAxLjggMjAwNS8wMy8wNyAwNDo1Mjo0MyBkYXMgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSAgID0gIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLwordHdvbTI1ICA9ICAyLjk4MDIzMjIzODhlLTA4LAkvKiAweDMzMDAwMDAwICovCitodWdlICAgPSAxLjBlKzMwLAordGlueSAgID0gMS4wZS0zMDsKKworZmxvYXQKK3NjYWxibmYgKGZsb2F0IHgsIGludCBuKQoreworCWludDMyX3QgayxpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKyAgICAgICAgayA9IChpeCYweDdmODAwMDAwKT4+MjM7CQkvKiBleHRyYWN0IGV4cG9uZW50ICovCisgICAgICAgIGlmIChrPT0wKSB7CQkJCS8qIDAgb3Igc3Vibm9ybWFsIHggKi8KKyAgICAgICAgICAgIGlmICgoaXgmMHg3ZmZmZmZmZik9PTApIHJldHVybiB4OyAvKiArLTAgKi8KKwkgICAgeCAqPSB0d28yNTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJICAgIGsgPSAoKGl4JjB4N2Y4MDAwMDApPj4yMykgLSAyNTsKKyAgICAgICAgICAgIGlmIChuPCAtNTAwMDApIHJldHVybiB0aW55Kng7IAkvKnVuZGVyZmxvdyovCisJICAgIH0KKyAgICAgICAgaWYgKGs9PTB4ZmYpIHJldHVybiB4K3g7CQkvKiBOYU4gb3IgSW5mICovCisgICAgICAgIGsgPSBrK247CisgICAgICAgIGlmIChrID4gIDB4ZmUpIHJldHVybiBodWdlKmNvcHlzaWduZihodWdlLHgpOyAvKiBvdmVyZmxvdyAgKi8KKyAgICAgICAgaWYgKGsgPiAwKSAJCQkJLyogbm9ybWFsIHJlc3VsdCAqLworCSAgICB7U0VUX0ZMT0FUX1dPUkQoeCwoaXgmMHg4MDdmZmZmZil8KGs8PDIzKSk7IHJldHVybiB4O30KKyAgICAgICAgaWYgKGsgPD0gLTI1KQorICAgICAgICAgICAgaWYgKG4gPiA1MDAwMCkgCS8qIGluIGNhc2UgaW50ZWdlciBvdmVyZmxvdyBpbiBuK2sgKi8KKwkJcmV0dXJuIGh1Z2UqY29weXNpZ25mKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduZih0aW55LHgpOwkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gMjU7CQkJCS8qIHN1Ym5vcm1hbCByZXN1bHQgKi8KKwlTRVRfRkxPQVRfV09SRCh4LChpeCYweDgwN2ZmZmZmKXwoazw8MjMpKTsKKyAgICAgICAgcmV0dXJuIHgqdHdvbTI1OworfQorCitfX3N0cm9uZ19yZWZlcmVuY2Uoc2NhbGJuZiwgbGRleHBmKTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJubC5jIGIvbGlibS9zcmMvc19zY2FsYm5sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0NWQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2NhbGJubC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIEAoIylzX3NjYWxibi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm5sLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Mjo1OCBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBzY2FsYm5sIChsb25nIGRvdWJsZSB4LCBpbnQgbikKKyAqIHNjYWxibmwoeCxuKSByZXR1cm5zIHgqIDIqKm4gIGNvbXB1dGVkIGJ5ICBleHBvbmVudAorICogbWFuaXB1bGF0aW9uIHJhdGhlciB0aGFuIGJ5IGFjdHVhbGx5IHBlcmZvcm1pbmcgYW4KKyAqIGV4cG9uZW50aWF0aW9uIG9yIGEgbXVsdGlwbGljYXRpb24uCisgKi8KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IGEgbG9uZyBkb3VibGUgaGFzIGEgMTUtYml0IGV4cG9uZW50LiAgT24gc3lzdGVtcworICogd2hlcmUgbG9uZyBkb3VibGUgaXMgdGhlIHNhbWUgYXMgZG91YmxlLCBzY2FsYm5sKCkgaXMgYW4gYWxpYXMKKyAqIGZvciBzY2FsYm4oKSwgc28gd2UgZG9uJ3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZQoraHVnZSA9IDB4MXAxNjAwMEwsCit0aW55ID0gMHgxcC0xNjAwMEw7CisKK2xvbmcgZG91YmxlCitzY2FsYm5sIChsb25nIGRvdWJsZSB4LCBpbnQgbikKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisJaW50IGs7CisJdS5lID0geDsKKyAgICAgICAgayA9IHUuYml0cy5leHA7CQkJCS8qIGV4dHJhY3QgZXhwb25lbnQgKi8KKyAgICAgICAgaWYgKGs9PTApIHsJCQkJLyogMCBvciBzdWJub3JtYWwgeCAqLworICAgICAgICAgICAgaWYgKCh1LmJpdHMubWFuaHx1LmJpdHMubWFubCk9PTApIHJldHVybiB4OwkvKiArLTAgKi8KKwkgICAgdS5lICo9IDB4MXArMTI4OworCSAgICBrID0gdS5iaXRzLmV4cCAtIDEyODsKKyAgICAgICAgICAgIGlmIChuPCAtNTAwMDApIHJldHVybiB0aW55Kng7IAkvKnVuZGVyZmxvdyovCisJICAgIH0KKyAgICAgICAgaWYgKGs9PTB4N2ZmZikgcmV0dXJuIHgreDsJCS8qIE5hTiBvciBJbmYgKi8KKyAgICAgICAgayA9IGsrbjsKKyAgICAgICAgaWYgKGsgPj0gMHg3ZmZmKSByZXR1cm4gaHVnZSpjb3B5c2lnbmwoaHVnZSx4KTsgLyogb3ZlcmZsb3cgICovCisgICAgICAgIGlmIChrID4gMCkgCQkJCS8qIG5vcm1hbCByZXN1bHQgKi8KKwkgICAge3UuYml0cy5leHAgPSBrOyByZXR1cm4gdS5lO30KKyAgICAgICAgaWYgKGsgPD0gLTEyOCkKKyAgICAgICAgICAgIGlmIChuID4gNTAwMDApIAkvKiBpbiBjYXNlIGludGVnZXIgb3ZlcmZsb3cgaW4gbitrICovCisJCXJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduKHRpbnkseCk7IAkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gMTI4OwkJCQkvKiBzdWJub3JtYWwgcmVzdWx0ICovCisJdS5iaXRzLmV4cCA9IGs7CisgICAgICAgIHJldHVybiB1LmUqMHgxcC0xMjg7Cit9CisKK19fc3Ryb25nX3JlZmVyZW5jZShzY2FsYm5sLCBsZGV4cGwpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaWduYml0LmMgYi9saWJtL3NyYy9zX3NpZ25iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduYml0LmMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWlrZSBCYXJjcm9mdCA8bWlrZUBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaWduYml0LmMsdiAxLjEgMjAwNC8wNy8xOSAwODoxNjoxMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2ludAorX19zaWduYml0KGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CisKK2ludAorX19zaWduYml0ZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CisKK2ludAorX19zaWduYml0bChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25nYW0uYyBiL2xpYm0vc3JjL3Nfc2lnbmdhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2Q1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpZ25nYW0uYwpAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCitpbnQgc2lnbmdhbSA9IDA7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25pZmljYW5kLmMgYi9saWJtL3NyYy9zX3NpZ25pZmljYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiYjMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmQuYwpAQCAtMCwwICsxLDMwIEBACisvKiBAKCMpc19zaWduaWYuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2lnbmlmaWNhbmQuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ3IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogc2lnbmlmaWNhbmQoeCkgY29tcHV0ZXMganVzdAorICogCXNjYWxiKHgsIChkb3VibGUpIC1pbG9nYih4KSksCisgKiBmb3IgZXhlcmNpc2luZyB0aGUgZnJhY3Rpb24tcGFydChGKSBJRUVFIDc1NC0xOTg1IHRlc3QgdmVjdG9yLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorc2lnbmlmaWNhbmQoZG91YmxlIHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9zY2FsYih4LChkb3VibGUpIC1pbG9nYih4KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25pZmljYW5kZi5jIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzNDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZGYuYwpAQCAtMCwwICsxLDI3IEBACisvKiBzX3NpZ25pZmljYW5kZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19zaWduaWZpY2FuZC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaWduaWZpY2FuZGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK3NpZ25pZmljYW5kZihmbG9hdCB4KQoreworCXJldHVybiBfX2llZWU3NTRfc2NhbGJmKHgsKGZsb2F0KSAtaWxvZ2JmKHgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2luLmMgYi9saWJtL3NyYy9zX3Npbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTNlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3Npbi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIEAoIylzX3Npbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaW4uYyx2IDEuMTAgMjAwNS8xMC8yNCAxNDowODozNiBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIHNpbih4KQorICogUmV0dXJuIHNpbmUgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBrZXJuZWwgZnVuY3Rpb246CisgKglfX2tlcm5lbF9zaW4JCS4uLiBzaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19rZXJuZWxfY29zCQkuLi4gY29zZSBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9faWVlZTc1NF9yZW1fcGlvMgkuLi4gYXJndW1lbnQgcmVkdWN0aW9uIHJvdXRpbmUKKyAqCisgKiBNZXRob2QuCisgKiAgICAgIExldCBTLEMgYW5kIFQgZGVub3RlIHRoZSBzaW4sIGNvcyBhbmQgdGFuIHJlc3BlY3RpdmVseSBvbgorICoJWy1QSS80LCArUEkvNF0uIFJlZHVjZSB0aGUgYXJndW1lbnQgeCB0byB5MSt5MiA9IHgtaypwaS8yCisgKglpbiBbLXBpLzQgLCArcGkvNF0sIGFuZCBsZXQgbiA9IGsgbW9kIDQuCisgKglXZSBoYXZlCisgKgorICogICAgICAgICAgbiAgICAgICAgc2luKHgpICAgICAgY29zKHgpICAgICAgICB0YW4oeCkKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgMAkgICAgICAgUwkgICBDCQkgVAorICoJICAgIDEJICAgICAgIEMJICAtUwkJLTEvVAorICoJICAgIDIJICAgICAgLVMJICAtQwkJIFQKKyAqCSAgICAzCSAgICAgIC1DCSAgIFMJCS0xL1QKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqICAgICAgTGV0IHRyaWcgYmUgYW55IG9mIHNpbiwgY29zLCBvciB0YW4uCisgKiAgICAgIHRyaWcoKy1JTkYpICBpcyBOYU4sIHdpdGggc2lnbmFsczsKKyAqICAgICAgdHJpZyhOYU4pICAgIGlzIHRoYXQgTmFOOworICoKKyAqIEFjY3VyYWN5OgorICoJVFJJRyh4KSByZXR1cm5zIHRyaWcoeCkgbmVhcmx5IHJvdW5kZWQKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK3Npbihkb3VibGUgeCkKK3sKKwlkb3VibGUgeVsyXSx6PTAuMDsKKwlpbnQzMl90IG4sIGl4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHguICovCisJR0VUX0hJR0hfV09SRChpeCx4KTsKKworICAgIC8qIHx4fCB+PCBwaS80ICovCisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeCA8PSAweDNmZTkyMWZiKSB7CisJICAgIGlmKGl4PDB4M2U0MDAwMDApCQkJLyogfHh8IDwgMioqLTI3ICovCisJICAgICAgIHtpZigoaW50KXg9PTApIHJldHVybiB4O30JLyogZ2VuZXJhdGUgaW5leGFjdCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfc2luKHgseiwwKTsKKwl9CisKKyAgICAvKiBzaW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkJY2FzZSAxOiByZXR1cm4gIF9fa2VybmVsX2Nvcyh5WzBdLHlbMV0pOworCQljYXNlIDI6IHJldHVybiAtX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpbmYuYyBiL2xpYm0vc3JjL3Nfc2luZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzNjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpbmYuYwpAQCAtMCwwICsxLDgyIEBACisvKiBzX3NpbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfc2luLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NpbmYuYyx2IDEuMTQgMjAwNS8xMS8yOCAwNjoxNToxMCBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjZGVmaW5lCUlOTElORV9LRVJORUxfQ09TREYKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9TSU5ERgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImtfY29zZi5jIgorI2luY2x1ZGUgImtfc2luZi5jIgorCisvKiBTbWFsbCBtdWx0aXBsZXMgb2YgcGkvMiByb3VuZGVkIHRvIGRvdWJsZSBwcmVjaXNpb24uICovCitzdGF0aWMgY29uc3QgZG91YmxlCitzMXBpbzIgPSAxKk1fUElfMiwJCQkvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitzMnBpbzIgPSAyKk1fUElfMiwJCQkvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitzM3BpbzIgPSAzKk1fUElfMiwJCQkvKiAweDQwMTJEOTdDLCAweDdGMzMyMUQyICovCitzNHBpbzIgPSA0Kk1fUElfMjsJCQkvKiAweDQwMTkyMUZCLCAweDU0NDQyRDE4ICovCisKK2Zsb2F0CitzaW5mKGZsb2F0IHgpCit7CisJZmxvYXQgeVsyXTsKKwlpbnQzMl90IG4sIGh4LCBpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOworCisJaWYoaXggPD0gMHgzZjQ5MGZkYSkgewkJLyogfHh8IH48PSBwaS80ICovCisJICAgIGlmKGl4PDB4Mzk4MDAwMDApCQkvKiB8eHwgPCAyKiotMTIgKi8KKwkJaWYoKChpbnQpeCk9PTApIHJldHVybiB4OwkvKiB4IHdpdGggaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHgpOworCX0KKwlpZihpeDw9MHg0MDdiNTNkMSkgewkJLyogfHh8IH48PSA1KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDAxNmNiZTMpIHsJLyogfHh8IH48PSAzcGkvNCAqLworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHggLSBzMXBpbzIpOworCQllbHNlCisJCSAgICByZXR1cm4gLV9fa2VybmVsX2Nvc2RmKHggKyBzMXBpbzIpOworCSAgICB9IGVsc2UKKwkJcmV0dXJuIF9fa2VybmVsX3NpbmRmKChoeCA+IDAgPyBzMnBpbzIgOiAtczJwaW8yKSAtIHgpOworCX0KKwlpZihpeDw9MHg0MGUyMzFkNSkgewkJLyogfHh8IH48PSA5KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDBhZmVkZGYpIHsJLyogfHh8IH48PSA3KnBpLzQgKi8KKwkJaWYoaHg+MCkKKwkJICAgIHJldHVybiAtX19rZXJuZWxfY29zZGYoeCAtIHMzcGlvMik7CisJCWVsc2UKKwkJICAgIHJldHVybiBfX2tlcm5lbF9jb3NkZih4ICsgczNwaW8yKTsKKwkgICAgfSBlbHNlCisJCXJldHVybiBfX2tlcm5lbF9zaW5kZih4ICsgKGh4ID4gMCA/IC1zNHBpbzIgOiBzNHBpbzIpKTsKKwl9CisKKyAgICAvKiBzaW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBnZW5lcmFsIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMmYoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfc2luZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQljYXNlIDE6IHJldHVybiAgX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQljYXNlIDI6IHJldHVybiAgX19rZXJuZWxfc2luZGYoLShkb3VibGUpeVswXS15WzFdKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW4uYyBiL2xpYm0vc3JjL3NfdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuLmMKQEAgLTAsMCArMSw3NiBAQAorLyogQCgjKXNfdGFuLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3Rhbi5jLHYgMS4xMCAyMDA1LzExLzAyIDE0OjAxOjQ1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogdGFuKHgpCisgKiBSZXR1cm4gdGFuZ2VudCBmdW5jdGlvbiBvZiB4LgorICoKKyAqIGtlcm5lbCBmdW5jdGlvbjoKKyAqCV9fa2VybmVsX3RhbgkJLi4uIHRhbmdlbnQgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2llZWU3NTRfcmVtX3BpbzIJLi4uIGFyZ3VtZW50IHJlZHVjdGlvbiByb3V0aW5lCisgKgorICogTWV0aG9kLgorICogICAgICBMZXQgUyxDIGFuZCBUIGRlbm90ZSB0aGUgc2luLCBjb3MgYW5kIHRhbiByZXNwZWN0aXZlbHkgb24KKyAqCVstUEkvNCwgK1BJLzRdLiBSZWR1Y2UgdGhlIGFyZ3VtZW50IHggdG8geTEreTIgPSB4LWsqcGkvMgorICoJaW4gWy1waS80ICwgK3BpLzRdLCBhbmQgbGV0IG4gPSBrIG1vZCA0LgorICoJV2UgaGF2ZQorICoKKyAqICAgICAgICAgIG4gICAgICAgIHNpbih4KSAgICAgIGNvcyh4KSAgICAgICAgdGFuKHgpCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgIDAJICAgICAgIFMJICAgQwkJIFQKKyAqCSAgICAxCSAgICAgICBDCSAgLVMJCS0xL1QKKyAqCSAgICAyCSAgICAgIC1TCSAgLUMJCSBUCisgKgkgICAgMwkgICAgICAtQwkgICBTCQktMS9UCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKiAgICAgIExldCB0cmlnIGJlIGFueSBvZiBzaW4sIGNvcywgb3IgdGFuLgorICogICAgICB0cmlnKCstSU5GKSAgaXMgTmFOLCB3aXRoIHNpZ25hbHM7CisgKiAgICAgIHRyaWcoTmFOKSAgICBpcyB0aGF0IE5hTjsKKyAqCisgKiBBY2N1cmFjeToKKyAqCVRSSUcoeCkgcmV0dXJucyB0cmlnKHgpIG5lYXJseSByb3VuZGVkCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCit0YW4oZG91YmxlIHgpCit7CisJZG91YmxlIHlbMl0sej0wLjA7CisJaW50MzJfdCBuLCBpeDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB4LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisKKyAgICAvKiB8eHwgfjwgcGkvNCAqLworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXggPD0gMHgzZmU5MjFmYikgeworCSAgICBpZihpeDwweDNlMzAwMDAwKQkJCS8qIHggPCAyKiotMjggKi8KKwkJaWYoKGludCl4PT0wKSByZXR1cm4geDsJCS8qIGdlbmVyYXRlIGluZXhhY3QgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3Rhbih4LHosMSk7CisJfQorCisgICAgLyogdGFuKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geC14OwkJLyogTmFOICovCisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgcmV0dXJuIF9fa2VybmVsX3Rhbih5WzBdLHlbMV0sMS0oKG4mMSk8PDEpKTsgLyogICAxIC0tIG4gZXZlbgorCQkJCQkJCS0xIC0tIG4gb2RkICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW5mLmMgYi9saWJtL3NyYy9zX3RhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW5mLmMKQEAgLTAsMCArMSw2OSBAQAorLyogc190YW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3Rhbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW5mLmMsdiAxLjE0IDIwMDUvMTEvMjggMDU6MzU6MzIgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX1RBTkRGCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisjaW5jbHVkZSAia190YW5mLmMiCisKKy8qIFNtYWxsIG11bHRpcGxlcyBvZiBwaS8yIHJvdW5kZWQgdG8gZG91YmxlIHByZWNpc2lvbi4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK3QxcGlvMiA9IDEqTV9QSV8yLAkJCS8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3QycGlvMiA9IDIqTV9QSV8yLAkJCS8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3QzcGlvMiA9IDMqTV9QSV8yLAkJCS8qIDB4NDAxMkQ5N0MsIDB4N0YzMzIxRDIgKi8KK3Q0cGlvMiA9IDQqTV9QSV8yOwkJCS8qIDB4NDAxOTIxRkIsIDB4NTQ0NDJEMTggKi8KKworZmxvYXQKK3RhbmYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5WzJdOworCWludDMyX3QgbiwgaHgsIGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CisKKwlpZihpeCA8PSAweDNmNDkwZmRhKSB7CQkvKiB8eHwgfjw9IHBpLzQgKi8KKwkgICAgaWYoaXg8MHgzOTgwMDAwMCkJCS8qIHx4fCA8IDIqKi0xMiAqLworCQlpZigoKGludCl4KT09MCkgcmV0dXJuIHg7CS8qIHggd2l0aCBpbmV4YWN0IGlmIHggIT0gMCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfdGFuZGYoeCwxKTsKKwl9CisJaWYoaXg8PTB4NDA3YjUzZDEpIHsJCS8qIHx4fCB+PD0gNSpwaS80ICovCisJICAgIGlmKGl4PD0weDQwMTZjYmUzKQkJLyogfHh8IH48PSAzcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQxcGlvMiA6IHQxcGlvMiksIC0xKTsKKwkgICAgZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQycGlvMiA6IHQycGlvMiksIDEpOworCX0KKwlpZihpeDw9MHg0MGUyMzFkNSkgewkJLyogfHh8IH48PSA5KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDBhZmVkZGYpCQkvKiB8eHwgfjw9IDcqcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQzcGlvMiA6IHQzcGlvMiksIC0xKTsKKwkgICAgZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQ0cGlvMiA6IHQ0cGlvMiksIDEpOworCX0KKworICAgIC8qIHRhbihJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGdlbmVyYWwgYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yZih4LHkpOworCSAgICAvKiBpbnRlZ2VyIHBhcmFtZXRlcjogMSAtLSBuIGV2ZW47IC0xIC0tIG4gb2RkICovCisJICAgIHJldHVybiBfX2tlcm5lbF90YW5kZigoZG91YmxlKXlbMF0reVsxXSwxLSgobiYxKTw8MSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuaC5jIGIvbGlibS9zcmMvc190YW5oLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyOTE0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuaC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIEAoIylzX3RhbmguYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdGFuaC5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBUYW5oKHgpCisgKiBSZXR1cm4gdGhlIEh5cGVyYm9saWMgVGFuZ2VudCBvZiB4CisgKgorICogTWV0aG9kIDoKKyAqCQkJCSAgICAgICB4ICAgIC14CisgKgkJCQkgICAgICBlICAtIGUKKyAqCTAuIHRhbmgoeCkgaXMgZGVmaW5lZCB0byBiZSAtLS0tLS0tLS0tLQorICoJCQkJICAgICAgIHggICAgLXgKKyAqCQkJCSAgICAgIGUgICsgZQorICoJMS4gcmVkdWNlIHggdG8gbm9uLW5lZ2F0aXZlIGJ5IHRhbmgoLXgpID0gLXRhbmgoeCkuCisgKgkyLiAgMCAgICAgIDw9IHggPD0gMioqLTU1IDogdGFuaCh4KSA6PSB4KihvbmUreCkKKyAqCQkJCQkgICAgICAgIC10CisgKgkgICAgMioqLTU1IDwgIHggPD0gIDEgICAgIDogdGFuaCh4KSA6PSAtLS0tLTsgdCA9IGV4cG0xKC0yeCkKKyAqCQkJCQkgICAgICAgdCArIDIKKyAqCQkJCQkJICAgICAyCisgKgkgICAgMSAgICAgIDw9IHggPD0gIDIyLjAgIDogdGFuaCh4KSA6PSAxLSAgLS0tLS0gOyB0PWV4cG0xKDJ4KQorICoJCQkJCQkgICB0ICsgMgorICoJICAgIDIyLjAgICA8ICB4IDw9IElORiAgICA6IHRhbmgoeCkgOj0gMS4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJdGFuaChOYU4pIGlzIE5hTjsKKyAqCW9ubHkgdGFuaCgwKT0wIGlzIGV4YWN0IGZvciBmaW5pdGUgYXJndW1lbnQuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmU9MS4wLCB0d289Mi4wLCB0aW55ID0gMS4wZS0zMDA7CisKK2RvdWJsZQordGFuaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx6OworCWludDMyX3QgangsaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHsKKwkgICAgaWYgKGp4Pj0wKSByZXR1cm4gb25lL3grb25lOyAgICAvKiB0YW5oKCstaW5mKT0rLTEgKi8KKwkgICAgZWxzZSAgICAgICByZXR1cm4gb25lL3gtb25lOyAgICAvKiB0YW5oKE5hTikgPSBOYU4gKi8KKwl9CisKKyAgICAvKiB8eHwgPCAyMiAqLworCWlmIChpeCA8IDB4NDAzNjAwMDApIHsJCS8qIHx4fDwyMiAqLworCSAgICBpZiAoaXg8MHgzYzgwMDAwMCkgCQkvKiB8eHw8MioqLTU1ICovCisJCXJldHVybiB4KihvbmUreCk7ICAgIAkvKiB0YW5oKHNtYWxsKSA9IHNtYWxsICovCisJICAgIGlmIChpeD49MHgzZmYwMDAwMCkgewkvKiB8eHw+PTEgICovCisJCXQgPSBleHBtMSh0d28qZmFicyh4KSk7CisJCXogPSBvbmUgLSB0d28vKHQrdHdvKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHQgPSBleHBtMSgtdHdvKmZhYnMoeCkpOworCSAgICAgICAgej0gLXQvKHQrdHdvKTsKKwkgICAgfQorICAgIC8qIHx4fCA+IDIyLCByZXR1cm4gKy0xICovCisJfSBlbHNlIHsKKwkgICAgeiA9IG9uZSAtIHRpbnk7CQkvKiByYWlzZWQgaW5leGFjdCBmbGFnICovCisJfQorCXJldHVybiAoang+PTApPyB6OiAtejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuaGYuYyBiL2xpYm0vc3JjL3NfdGFuaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNhNmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW5oZi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHNfdGFuaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfdGFuaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW5oZi5jLHYgMS44IDIwMDUvMTIvMTEgMTE6NDA6NTUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lPTEuMCwgdHdvPTIuMCwgdGlueSA9IDEuMGUtMzAsIGh1Z2UgPSAxLjBlMzA7CitmbG9hdAordGFuaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHo7CisJaW50MzJfdCBqeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGp4LHgpOworCWl4ID0gangmMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmODAwMDAwKSB7CisJICAgIGlmIChqeD49MCkgcmV0dXJuIG9uZS94K29uZTsgICAgLyogdGFuaCgrLWluZik9Ky0xICovCisJICAgIGVsc2UgICAgICAgcmV0dXJuIG9uZS94LW9uZTsgICAgLyogdGFuaChOYU4pID0gTmFOICovCisJfQorCisgICAgLyogfHh8IDwgOSAqLworCWlmIChpeCA8IDB4NDExMDAwMDApIHsJCS8qIHx4fDw5ICovCisJICAgIGlmIChpeDwweDM5ODAwMDAwKSB7CS8qIHx4fDwyKiotMTIgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7IC8qIHRhbmgodGlueSkgPSB0aW55IHdpdGggaW5leGFjdCAqLworCSAgICB9CisJICAgIGlmIChpeD49MHgzZjgwMDAwMCkgewkvKiB8eHw+PTEgICovCisJCXQgPSBleHBtMWYodHdvKmZhYnNmKHgpKTsKKwkJeiA9IG9uZSAtIHR3by8odCt0d28pOworCSAgICB9IGVsc2UgeworCSAgICAgICAgdCA9IGV4cG0xZigtdHdvKmZhYnNmKHgpKTsKKwkgICAgICAgIHo9IC10Lyh0K3R3byk7CisJICAgIH0KKyAgICAvKiB8eHwgPj0gOSwgcmV0dXJuICstMSAqLworCX0gZWxzZSB7CisJICAgIHogPSBvbmUgLSB0aW55OwkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJfQorCXJldHVybiAoang+PTApPyB6OiAtejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdHJ1bmMuYyBiL2xpYm0vc3JjL3NfdHJ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI4N2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuYy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RydW5jLmMsdiAxLjEgMjAwNC8wNi8yMCAwOToyNTo0MyBkYXMgRXhwICQiKTsgKi8KKworLyoKKyAqIHRydW5jKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuYyh4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK3RydW5jKGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGksajsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wKSB7LyogfHh8PDEsIHNvIHJldHVybiAwKnNpZ24oeCkgKi8KKwkJICAgIGkwICY9IDB4ODAwMDAwMDBVOworCQkgICAgaTEgPSAwOworCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PjAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGkwICY9ICh+aSk7IGkxPTA7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaWYoaHVnZSt4PjAuMCkJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQlpMSAmPSAofmkpOworCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RydW5jZi5jIGIvbGlibS9zcmMvc190cnVuY2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI3MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuY2YuYwpAQCAtMCwwICsxLDUzIEBACisvKiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190cnVuY2YuYyx2IDEuMSAyMDA0LzA2LzIwIDA5OjI1OjQzIGRhcyBFeHAgJCIpOyAqLworCisvKgorICogdHJ1bmNmKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuY2YoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IGh1Z2UgPSAxLjBlMzBGOworCitmbG9hdAordHJ1bmNmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjBGKQkJLyogfHh8PDEsIHNvIHJldHVybiAwKnNpZ24oeCkgKi8KKwkJICAgIGkwICY9IDB4ODAwMDAwMDA7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjBGKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpMCAmPSAofmkpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxpMCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RydW5jbC5jIGIvbGlibS9zcmMvc190cnVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTkyNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuY2wuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEZyb206IEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdHJ1bmNsLmMsdiAxLjQgMjAwNS8wNC8yOCAxOTo0NTo1NSBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogdHJ1bmNsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuY2woeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZWxzZQorI2RlZmluZQlNQU5IX1NJWkUJTERCTF9NQU5IX1NJWkUKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2xvbmcgZG91YmxlCit0cnVuY2wobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHUgPSB7IC5lID0geCB9OworCWludCBlID0gdS5iaXRzLmV4cCAtIExEQkxfTUFYX0VYUCArIDE7CisKKwlpZiAoZSA8IE1BTkhfU0laRSAtIDEpIHsKKwkJaWYgKGUgPCAwKSB7CQkJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkKKwkJCQl1LmUgPSAwLjA7CisJCX0gZWxzZSB7CisJCQl1aW50NjRfdCBtID0gKCgxbGx1IDw8IE1BTkhfU0laRSkgLSAxKSA+PiAoZSArIDEpOworCQkJaWYgKCgodS5iaXRzLm1hbmggJiBtKSB8IHUuYml0cy5tYW5sKSA9PSAwKQorCQkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCQl1LmJpdHMubWFuaCAmPSB+bTsKKwkJCQl1LmJpdHMubWFubCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGUgPCBMREJMX01BTlRfRElHIC0gMSkgeworCQl1aW50NjRfdCBtID0gKHVpbnQ2NF90KS0xID4+ICg2NCAtIExEQkxfTUFOVF9ESUcgKyBlICsgMSk7CisJCWlmICgodS5iaXRzLm1hbmwgJiBtKSA9PSAwKQorCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2NhYnMuYyBiL2xpYm0vc3JjL3dfY2Ficy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2U1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2NhYnMuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogY2FicygpIHdyYXBwZXIgZm9yIGh5cG90KCkuCisgKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIDxqdGNAd2ltc2V5LmNvbT4KKyAqIFBsYWNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLCAxOTk0LgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9CisgICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy93X2NhYnMuYyx2IDEuNCAyMDAxLzA2LzEzIDE1OjE2OjMwIHJ1IEV4cCAkIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCitjYWJzKHopCisJZG91YmxlIGNvbXBsZXggejsKK3sKKwlyZXR1cm4gaHlwb3QoY3JlYWwoeiksIGNpbWFnKHopKTsKK30KKworZG91YmxlCit6X2Ficyh6KQorCWRvdWJsZSBjb21wbGV4ICp6OworeworCXJldHVybiBoeXBvdChjcmVhbCgqeiksIGNpbWFnKCp6KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2NhYnNmLmMgYi9saWJtL3NyYy93X2NhYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMTUyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3dfY2Fic2YuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogY2Fic2YoKSB3cmFwcGVyIGZvciBoeXBvdGYoKS4KKyAqCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgPGp0Y0B3aW1zZXkuY29tPgorICogUGxhY2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4sIDE5OTQuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KKyAgIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3dfY2Fic2YuYyx2IDEuMyAyMDAxLzA2LzEzIDE1OjE2OjMwIHJ1IEV4cCAkIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2NhYnNmKHopCisJZmxvYXQgY29tcGxleCB6OworeworCisJcmV0dXJuIGh5cG90ZihjcmVhbGYoeiksIGNpbWFnZih6KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2RyZW0uYyBiL2xpYm0vc3JjL3dfZHJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjg0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2RyZW0uYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogZHJlbSgpIHdyYXBwZXIgZm9yIHJlbWFpbmRlcigpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK2RyZW0oeCwgeSkKKwlkb3VibGUgeCwgeTsKK3sKKwlyZXR1cm4gcmVtYWluZGVyKHgsIHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvd19kcmVtZi5jIGIvbGlibS9zcmMvd19kcmVtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2FjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2RyZW1mLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGRyZW1mKCkgd3JhcHBlciBmb3IgcmVtYWluZGVyZigpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworLyogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvd19kcmVtZi5jLHYgMS4zIDIwMDQvMDcvMjggMDU6NTM6MTgga2FuIEV4cCAkICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitkcmVtZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXJldHVybiByZW1haW5kZXJmKHgsIHkpOworfQo=