CTsKLyoKICogV3JpdHRlbiBieSBKb3PpIEZvbnNlY2EgPGpfcl9mb25zZWNhQHlhaG9vLmNvLnVrPgogKi8KCgojaWZkZWYgVVNFX01NWF9BU00KI2luY2x1ZGUgIm1hdHlwZXMuaCIKCi8qIGludGVnZXIgbXVsdGlwbGljYXRpb24gLSBhbHBoYSBwbHVzIG9uZQogKgogKiBtYWtlcyB0aGUgZm9sbG93aW5nIGFwcHJveGltYXRpb24gdG8gdGhlIGRpdmlzaW9uIChTcmVlKQogKgogKiAgIHJnYiphLzI1NSB+PSAocmdiKihhKzEpKSA+PiAyNTYKICoKICogd2hpY2ggaXMgdGhlIGZhc3Rlc3QgbWV0aG9kIHRoYXQgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgT3BlbkdMIGNyaXRlcmlhCiAqCiAqICAgMCowID0gMCBhbmQgMjU1KjI1NSA9IDI1NQogKgogKiBub3RlIHRoYXQgTVgxIGlzIGEgcmVnaXN0ZXIgd2l0aCAweGZmZmZmZmZmZmZmZmZmZmYgY29uc3RhbnQgd2hpY2ggY2FuIGJlIGVhc2lseSBvYnRhaW5lZCBtYWtpbmcKICoKICogICBQQ01QRVFXICAgICggTVgxLCBNWDEgKQogKi8KI2RlZmluZSBHTUJfTVVMVF9BUDEoIE1QMSwgTUExLCBNUDIsIE1BMiwgTVgxICkgXAogICAgUFNVQlcgICAgICAoIE1YMSwgTUExICkJCQkvKiAgIGExICsgMSAgfCAgIGExICsgMSAgfCAgIGExICsgMSAgfCAgIGExICsgMSAgKi8JO1wKICAgIFBNVUxMVyAgICAgKCBNUDEsIE1BMSApCQkJLyogICAgICAgICAgICAgICAgICB0MSA9IHAxKmExICAgICAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XApUV08oUFNVQlcgICAgICAoIE1YMSwgTUEyICkpCQkJLyogICBhMiArIDEgIHwgICBhMiArIDEgIHwgICBhMiArIDEgIHwgICBhMiArIDEgICovCTtcClRXTyhQTVVMTFcgICAgICggTVAyLCBNQTIgKSkJCQkvKiAgICAgICAgICAgICAgICAgIHQyID0gcDIqYTIgICAgICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMSApCQkvKiAgICAgICAgICAgICAgIHQxID4+IDggfj0gdDEvMjU1ICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUEyICkpCQkvKiAgICAgICAgICAgICAgIHQyID4+IDggfj0gdDIvMjU1ICAgICAgICAgICAgICAgKi8JCgoKLyogaW50ZWdlciBtdWx0aXBsaWNhdGlvbiAtIGdlb21ldHJpYyBzZXJpZXMKICoKICogdGFrZXMgdGhlIGdlb21ldHJpYyBzZXJpZXMgYXBwcm94aW1hdGlvbiB0byB0aGUgZGl2aXNpb24KICoKICogICB0LzI1NSA9ICh0ID4+IDgpICsgKHQgPj4gMTYpICsgKHQgPj4gMjQpIC4uCiAqCiAqIGluIHRoaXMgY2FzZSBqdXN0IHRoZSBmaXJzdCB0d28gdGVybXMgdG8gZml0IGluIDE2Yml0IGFyaXRobWV0aWMKICoKICogICB0LzI1NSB+PSAodCArICh0ID4+IDgpKSA+PiA4CiAqCiAqIG5vdGUgdGhhdCBqdXN0IGJ5IGl0c2VsZiBpdCBkb2Vzbid0IHNhdGlzZmllcyB0aGUgT3BlbkdMIGNyaXRlcmlhLCBhcyAyNTUqMjU1ID0gMjU0LCAKICogc28gdGhlIHNwZWNpYWwgY2FzZSBhID0gMjU1IG11c3QgYmUgYWNjb3VudGVkIG9yIHJvdW5kb2ZmIG11c3QgYmUgdXNlZAogKi8KI2RlZmluZSBHTUJfTVVMVF9HUyggTVAxLCBNQTEsIE1QMiwgTUEyICkgXAogICAgUE1VTExXICAgICAoIE1QMSwgTUExICkJCQkvKiAgICAgICAgICAgICAgICAgIHQxID0gcDEqYTEgICAgICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBNVUxMVyAgICAgKCBNUDIsIE1BMiApKQkJCS8qICAgICAgICAgICAgICAgICAgdDIgPSBwMiphMiAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIE1PVlEgICAgICAgKCBNQTEsIE1QMSApCQkJCQkJCQkJCTtcCiAgICBQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMSApCQkvKiAgICAgICAgICAgICAgICAgICAgdDEgPj4gOCAgICAgICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcClRXTyhNT1ZRICAgICAgICggTUEyLCBNUDIgKSkJCQkJCQkJCQkJO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUEyICkpCQkvKiAgICAgICAgICAgICAgICAgICAgdDIgPj4gOCAgICAgICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQQUREVyAgICAgICggTVAxLCBNQTEgKQkJCS8qICAgICAgICB0MSArICh0MSA+PiA4KSB+PSAodDEvMjU1KSA8PCA4ICAgICAgICAqLwk7XAogICAgUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTEgKQkJLyogICAgc2ExICAgIHwgICAgc2IxICAgIHwgICAgc2cxICAgIHwgICAgc3IxICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XApUV08oUEFERFcgICAgICAoIE1QMiwgTUEyICkpCQkJLyogICAgICAgIHQyICsgKHQyID4+IDgpIH49ICh0Mi8yNTUpIDw8IDggICAgICAgICovCTtcClRXTyhQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMiApKQkJLyogICAgc2EyICAgIHwgICAgc2IyICAgIHwgICAgc2cyICAgIHwgICAgc3IyICAgICovCgoKLyogaW50ZWdlciBtdWx0aXBsaWNhdGlvbiAtIGdlb21ldHJpYyBzZXJpZXMgcGx1cyByb3VuZGluZwogKgogKiB3aGVuIHVzaW5nIGEgZ2VvbWV0cmljIHNlcmllcyBkaXZpc2lvbiBpbnN0ZWFkIG9mIHRydW5jYXRpbmcgdGhlIHJlc3VsdCAKICogdXNlIHJvdW5kb2ZmIGluIHRoZSBhcHByb3hpbWF0aW9uIChKaW0gQmxpbm4pCiAqCiAqICAgdCA9IHJnYiphICsgMHg4MAogKgogKiBhY2hpZXZpbmcgdGhlIGV4YWN0IHJlc3VsdHMKICoKICogbm90ZSB0aGF0IE04MCBpcyByZWdpc3RlciB3aXRoIHRoZSAweDAwODAwMDgwMDA4MDAwODAgY29uc3RhbnQKICovCiNkZWZpbmUgR01CX01VTFRfR1NSKCBNUDEsIE1BMSwgTVAyLCBNQTIsIE04MCApIFwKICAgIFBNVUxMVyAgICAgKCBNUDEsIE1BMSApCQkJLyogICAgICAgICAgICAgICAgICB0MSA9IHAxKmExICAgICAgICAgICAgICAgICAgICovCTtcCiAgICBQQUREVyAgICAgICggTTgwLCBNQTEgKQkJCS8qICAgICAgICAgICAgICAgICB0MSArPSAweDgwICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKFBNVUxMVyAgICAgKCBNUDIsIE1BMiApKQkJCS8qICAgICAgICAgICAgICAgICAgdDIgPSBwMiphMiAgICAgICAgICAgICAgICAgICAqLwk7XApUV08oUEFERFcgICAgICAoIE04MCwgTUEyICkpCQkJLyogICAgICAgICAgICAgICAgIHQyICs9IDB4ODAgICAgICAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgTU9WUSAgICAgICAoIE1BMSwgTVAxICkJCQkJCQkJCQkJO1wKICAgIFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUExICkJCS8qICAgICAgICAgICAgICAgICAgICB0MSA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKE1PVlEgICAgICAgKCBNQTIsIE1QMiApKQkJCQkJCQkJCQk7XApUV08oUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTIgKSkJCS8qICAgICAgICAgICAgICAgICAgICB0MiA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBBRERXICAgICAgKCBNUDEsIE1BMSApCQkJLyogICAgICAgIHQxICsgKHQxID4+IDgpIH49ICh0MS8yNTUpIDw8IDggICAgICAgICovCTtcCiAgICBQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMSApCQkvKiAgICBzYTEgICAgfCAgICBzYjEgICAgfCAgICBzZzEgICAgfCAgICBzcjEgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcClRXTyhQQUREVyAgICAgICggTVAyLCBNQTIgKSkJCQkvKiAgICAgICAgdDIgKyAodDIgPj4gOCkgfj0gKHQyLzI1NSkgPDwgOCAgICAgICAgKi8JO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUEyICkpCQkvKiAgICBzYTIgICAgfCAgICBzYjIgICAgfCAgICBzZzIgICAgfCAgICBzcjIgICAgKi8KCgovKiBsaW5lYXIgaW50ZXJwb2xhdGlvbiAtIGdlb21ldHJpYyBzZXJpZXMgCiAqLwojZGVmaW5lIEdNQl9MRVJQX0dTKCBNUDEsIE1RMSwgTUExLCBNUDIsIE1RMiwgTUEyKSBcCiAgICBQU1VCVyAgICAgICggTVExLCBNUDEgKSAgICAgICAgICAgICAgICAgICAgIC8qIHBhMSAtIHFhMSB8IHBiMSAtIHFiMSB8IHBnMSAtIHFnMSB8IHByMSAtIHFyMSAqLwk7XAogICAgUFNMTFcgICAgICAoIENPTlNUKDgpLCBNUTEgKQkJLyogICAgICAgICAgICAgICAgICAgIHExIDw8IDggICAgICAgICAgICAgICAgICAgICovCTtcCiAgICBQTVVMTFcgICAgICggTVAxLCBNQTEgKQkJCS8qICAgICAgICAgICAgICB0MSA9IChxMSAtIHAxKSpwYTEgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKFBTVUJXICAgICAgKCBNUTIsIE1QMiApKSAgICAgICAgICAgICAgICAgICAgLyogcGEyIC0gcWEyIHwgcGIyIC0gcWIyIHwgcGcyIC0gcWcyIHwgcHIyIC0gcXIyICovCTtcClRXTyhQU0xMVyAgICAgICggQ09OU1QoOCksIE1RMiApKQkJLyogICAgICAgICAgICAgICAgICAgIHEyIDw8IDggICAgICAgICAgICAgICAgICAgICovCTtcClRXTyhQTVVMTFcgICAgICggTVAyLCBNQTIgKSkJCQkvKiAgICAgICAgICAgICAgdDIgPSAocTIgLSBwMikqcGEyICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBNT1ZRICAgICAgICggTUExLCBNUDEgKQkJCQkJCQkJCQk7XAogICAgUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTEgKQkJLyogICAgICAgICAgICAgICAgICAgIHQxID4+IDggICAgICAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XApUV08oTU9WUSAgICAgICAoIE1BMiwgTVAyICkpCQkJCQkJCQkJCTtcClRXTyhQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMiApKQkJLyogICAgICAgICAgICAgICAgICAgIHQyID4+IDggICAgICAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgUEFERFcgICAgICAoIE1QMSwgTUExICkJCQkvKiAgICAgICAgdDEgKyAodDEgPj4gOCkgfj0gKHQxLzI1NSkgPDwgOCAgICAgICAgKi8JO1wKVFdPKFBBRERXICAgICAgKCBNUDIsIE1BMiApKQkJCS8qICAgICAgICB0MiArICh0MiA+PiA4KSB+PSAodDIvMjU1KSA8PCA4ICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBBRERXICAgICAgKCBNUTEsIE1BMSApCQkJLyogICAgICAgICAgICAgICh0MS8yNTUgKyBxMSkgPDwgOCAgICAgICAgICAgICAgICovCTtcClRXTyhQQUREVyAgICAgICggTVEyLCBNQTIgKSkJCQkvKiAgICAgICAgICAgICAgKHQyLzI1NSArIHEyKSA8PCA4ICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMSApCQkvKiAgICBzYTEgICAgfCAgICBzYjEgICAgfCAgICBzZzEgICAgfCAgICBzcjEgICAgKi8JO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUEyICkpCQkvKiAgICBzYTIgICAgfCAgICBzYjIgICAgfCAgICBzZzIgICAgfCAgICBzcjIgICAgKi8KCgovKiBsaW5lYXIgaW50ZXJwb2xhdGlvbiAtIGdlb21ldHJpYyBzZXJpZXMgd2l0aCByb3VuZG9mZgogKgogKiB0aGlzIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgQmxpbm4ncyBmb3JtdWxhIHRvIHNpZ25lZCBhcml0aG1ldGljCiAqCiAqIG5vdGUgdGhhdCBNODAgaXMgYSByZWdpc3RlciB3aXRoIHRoZSAweDAwODAwMDgwMDA4MDAwODAgY29uc3RhbnQKICovCiNkZWZpbmUgR01CX0xFUlBfR1NSKCBNUDEsIE1RMSwgTUExLCBNUDIsIE1RMiwgTUEyLCBNODApIFwKICAgIFBTVUJXICAgICAgKCBNUTEsIE1QMSApICAgICAgICAgICAgICAgICAgICAgLyogcGExIC0gcWExIHwgcGIxIC0gcWIxIHwgcGcxIC0gcWcxIHwgcHIxIC0gcXIxICovCTtcCiAgICBQU0xMVyAgICAgICggQ09OU1QoOCksIE1RMSApCQkvKiAgICAgICAgICAgICAgICAgICAgcTEgPDwgOCAgICAgICAgICAgICAgICAgICAgKi8JO1wKICAgIFBNVUxMVyAgICAgKCBNUDEsIE1BMSApCQkJLyogICAgICAgICAgICAgIHQxID0gKHExIC0gcDEpKnBhMSAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XApUV08oUFNVQlcgICAgICAoIE1RMiwgTVAyICkpICAgICAgICAgICAgICAgICAgICAvKiBwYTIgLSBxYTIgfCBwYjIgLSBxYjIgfCBwZzIgLSBxZzIgfCBwcjIgLSBxcjIgKi8JO1wKVFdPKFBTTExXICAgICAgKCBDT05TVCg4KSwgTVEyICkpCQkvKiAgICAgICAgICAgICAgICAgICAgcTIgPDwgOCAgICAgICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBNVUxMVyAgICAgKCBNUDIsIE1BMiApKQkJCS8qICAgICAgICAgICAgICB0MiA9IChxMiAtIHAyKSpwYTIgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBTUkxXICAgICAgKCBDT05TVCgxNSksIE1QMSApCQkvKiAgICAgICAgICAgICAgICAgcTEgPiBwMSA/IDEgOiAwICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCgxNSksIE1QMiApKQkJLyogICAgICAgICAgICAgICAgIHEyID4gcTIgPyAxIDogMCAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgUFNMTFcgICAgICAoIENPTlNUKDgpLCBNUDEgKQkJLyogICAgICAgICAgICAgcTEgPiBwMSA/IDB4MTAwIDogMCAgICAgICAgICAgICAgICovCTtcClRXTyhQU0xMVyAgICAgICggQ09OU1QoOCksIE1QMiApKQkJLyogICAgICAgICAgICAgcTIgPiBxMiA/IDB4MTAwIDogMCAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgUFNVQlcgICAgICAoIE1QMSwgTUExICkJCQkvKiAgICAgICAgICAgICAgICAgIHQxIC09PyAweDEwMCAgICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBTVUJXICAgICAgKCBNUDIsIE1BMiApKQkJCS8qICAgICAgICAgICAgICAgICAgdDIgLT0/IDB4MTAwICAgICAgICAgICAgICAgICAqLwk7XAogCQkJCQkJCQkJCQkJCTtcCiAgICBQQUREVyAgICAgICggTTgwLCBNQTEgKQkJCS8qICAgICAgICAgICAgICAgICB0MSArPSAweDgwICAgICAgICAgICAgICAgICAgICAqLwk7XApUV08oUEFERFcgICAgICAoIE04MCwgTUEyICkpCQkJLyogICAgICAgICAgICAgICAgIHQyICs9IDB4ODAgICAgICAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgTU9WUSAgICAgICAoIE1BMSwgTVAxICkJCQkJCQkJCQkJO1wKICAgIFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUExICkJCS8qICAgICAgICAgICAgICAgICAgICB0MSA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKE1PVlEgICAgICAgKCBNQTIsIE1QMiApKQkJCQkJCQkJCQk7XApUV08oUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTIgKSkJCS8qICAgICAgICAgICAgICAgICAgICB0MiA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBBRERXICAgICAgKCBNUDEsIE1BMSApCQkJLyogICAgICAgIHQxICsgKHQxID4+IDgpIH49ICh0MS8yNTUpIDw8IDggICAgICAgICovCTtcClRXTyhQQUREVyAgICAgICggTVAyLCBNQTIgKSkJCQkvKiAgICAgICAgdDIgKyAodDIgPj4gOCkgfj0gKHQyLzI1NSkgPDwgOCAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQQUREVyAgICAgICggTVExLCBNQTEgKQkJCS8qICAgICAgICAgICAgICAodDEvMjU1ICsgcTEpIDw8IDggICAgICAgICAgICAgICAqLwk7XApUV08oUEFERFcgICAgICAoIE1RMiwgTUEyICkpCQkJLyogICAgICAgICAgICAgICh0Mi8yNTUgKyBxMikgPDwgOCAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTEgKQkJLyogICAgc2ExICAgIHwgICAgc2IxICAgIHwgICAgc2cxICAgIHwgICAgc3IxICAgICovCTtcClRXTyhQU1JMVyAgICAgICggQ09OU1QoOCksIE1BMiApKQkJLyogICAgc2EyICAgIHwgICAgc2IyICAgIHwgICAgc2cyICAgIHwgICAgc3IyICAgICovCgoKLyogbGluZWFyIGludGVycG9sYXRpb24gLSBnZW9tZXRyaWMgc2VyaWVzIHdpdGggY29ycmVjdGlvbgogKgogKiBpbnN0ZWFkIG9mIHRoZSByb3VuZG9mZiB0aGlzIGFkZHMgYSBzbWFsbCBjb3JyZWN0aW9uIHRvIHNhdGlzZnkgdGhlIE9wZW5HTCBjcml0ZXJpYQogKgogKiAgIHQvMjU1IH49ICh0ICsgKHQgPj4gOCkgKyAodCA+PiAxNSkpID4+IDgKICoKICogbm90ZSB0aGF0IGFsdGhvdWdoIGlzIGZhc3RlciB0aGFuIHJvdW5kaW5nIG9mZiBpdCBkb2Vzbid0IGdpdmUgYWx3YXlzIHRoZSBleGFjdCByZXN1bHRzCiAqLwojZGVmaW5lIEdNQl9MRVJQX0dTQyggTVAxLCBNUTEsIE1BMSwgTVAyLCBNUTIsIE1BMikgXAogICAgUFNVQlcgICAgICAoIE1RMSwgTVAxICkgICAgICAgICAgICAgICAgICAgICAvKiBwYTEgLSBxYTEgfCBwYjEgLSBxYjEgfCBwZzEgLSBxZzEgfCBwcjEgLSBxcjEgKi8JO1wKICAgIFBTTExXICAgICAgKCBDT05TVCg4KSwgTVExICkJCS8qICAgICAgICAgICAgICAgICAgICBxMSA8PCA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAogICAgUE1VTExXICAgICAoIE1QMSwgTUExICkJCQkvKiAgICAgICAgICAgICAgdDEgPSAocTEgLSBwMSkqcGExICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcClRXTyhQU1VCVyAgICAgICggTVEyLCBNUDIgKSkgICAgICAgICAgICAgICAgICAgIC8qIHBhMiAtIHFhMiB8IHBiMiAtIHFiMiB8IHBnMiAtIHFnMiB8IHByMiAtIHFyMiAqLwk7XApUV08oUFNMTFcgICAgICAoIENPTlNUKDgpLCBNUTIgKSkJCS8qICAgICAgICAgICAgICAgICAgICBxMiA8PCA4ICAgICAgICAgICAgICAgICAgICAqLwk7XApUV08oUE1VTExXICAgICAoIE1QMiwgTUEyICkpCQkJLyogICAgICAgICAgICAgIHQyID0gKHEyIC0gcDIpKnBhMiAgICAgICAgICAgICAgICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgTU9WUSAgICAgICAoIE1BMSwgTVAxICkJCQkJCQkJCQkJO1wKICAgIFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUExICkJCS8qICAgICAgICAgICAgICAgICAgICB0MSA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKE1PVlEgICAgICAgKCBNQTIsIE1QMiApKQkJCQkJCQkJCQk7XApUV08oUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTIgKSkJCS8qICAgICAgICAgICAgICAgICAgICB0MiA+PiA4ICAgICAgICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBBRERXICAgICAgKCBNQTEsIE1QMSApCQkJLyogICAgICAgIHQxICsgKHQxID4+IDgpIH49ICh0MS8yNTUpIDw8IDggICAgICAgICovCTtcCiAgICBQU1JMVyAgICAgICggQ09OU1QoNyksIE1BMSApCQkvKiAgICAgICAgICAgICAgICAgICAgdDEgPj4gMTUgICAgICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcClRXTyhQQUREVyAgICAgICggTUEyLCBNUDIgKSkJCQkvKiAgICAgICAgdDIgKyAodDIgPj4gOCkgfj0gKHQyLzI1NSkgPDwgOCAgICAgICAgKi8JO1wKVFdPKFBTUkxXICAgICAgKCBDT05TVCg3KSwgTUEyICkpCQkvKiAgICAgICAgICAgICAgICAgICAgdDIgPj4gMTUgICAgICAgICAgICAgICAgICAgKi8JO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQQUREVyAgICAgICggTVAxLCBNQTEgKQkJCS8qICB0MSArICh0MSA+PiA4KSArICh0MSA+PjE1KSB+PSAodDEvMjU1KSA8PCA4ICAqLwk7XApUV08oUEFERFcgICAgICAoIE1QMiwgTUEyICkpCQkJLyogIHQyICsgKHQyID4+IDgpICsgKHQyID4+MTUpIH49ICh0Mi8yNTUpIDw8IDggICovCTtcCgkJCQkJCQkJCQkJCQk7XAogICAgUEFERFcgICAgICAoIE1RMSwgTUExICkJCQkvKiAgICAgICAgICAgICAgKHQxLzI1NSArIHExKSA8PCA4ICAgICAgICAgICAgICAgKi8JO1wKVFdPKFBBRERXICAgICAgKCBNUTIsIE1BMiApKQkJCS8qICAgICAgICAgICAgICAodDIvMjU1ICsgcTIpIDw8IDggICAgICAgICAgICAgICAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBTUkxXICAgICAgKCBDT05TVCg4KSwgTUExICkJCS8qICAgIHNhMSAgICB8ICAgIHNiMSAgICB8ICAgIHNnMSAgICB8ICAgIHNyMSAgICAqLwk7XApUV08oUFNSTFcgICAgICAoIENPTlNUKDgpLCBNQTIgKSkJCS8qICAgIHNhMiAgICB8ICAgIHNiMiAgICB8ICAgIHNnMiAgICB8ICAgIHNyMiAgICAqLwoKCi8qIGNvbW1vbiBibGVuZGluZyBzZXR1cCBjb2RlCiAqCiAqIG5vdGUgdGhhdCBNMDAgaXMgYSByZWdpc3RlciB3aXRoIDB4MDAwMDAwMDAwMDAwMDAwMCBjb25zdGFudCB3aGljaCBjYW4gYmUgZWFzaWx5IG9idGFpbmVkIG1ha2luZwogKgogKiAgIFBYT1IgICAgICAoIE0wMCwgTTAwICkKICovCiNkZWZpbmUgR01CX0xPQUQocmdiYSwgZGVzdCwgTVBQLCBNUVEpIFwKT05FKE1PVkQgICAgICAgKCBSRUdJTkQocmdiYSksIE1QUCApKQkJLyogICAgIHwgICAgIHwgICAgIHwgICAgIHwgcWExIHwgcWIxIHwgcWcxIHwgcXIxICovCTtcCk9ORShNT1ZEICAgICAgICggUkVHSU5EKGRlc3QpLCBNUVEgKSkJCS8qICAgICB8ICAgICB8ICAgICB8ICAgICB8IHBhMSB8IHBiMSB8IHBnMSB8IHByMSAqLwk7XAoJCQkJCQkJCQkJCQkJO1wKVFdPKE1PVlEgICAgICAgKCBSRUdJTkQocmdiYSksIE1QUCApKQkJLyogcWEyIHwgcWIyIHwgcWcyIHwgcXIyIHwgcWExIHwgcWIxIHwgcWcxIHwgcXIxICovCTtcClRXTyhNT1ZRICAgICAgICggUkVHSU5EKGRlc3QpLCBNUVEgKSkJCS8qIHBhMiB8IHBiMiB8IHBnMiB8IHByMiB8IHBhMSB8IHBiMSB8IHBnMSB8IHByMSAqLwoKI2RlZmluZSBHTUJfVU5QQUNLKE1QMSwgTVExLCBNUDIsIE1RMiwgTTAwKSBcClRXTyhNT1ZRICAgICAgICggTVAxLCBNUDIgKSkJCQkJCQkJCQkJO1wKVFdPKE1PVlEgICAgICAgKCBNUTEsIE1RMiApKQkJCQkJCQkJCQk7XAoJCQkJCQkJCQkJCQkJO1wKICAgIFBVTlBDS0xCVyAgKCBNMDAsIE1RMSApCQkJLyogICAgcWExICAgIHwgICAgcWIxICAgIHwgICAgcWcxICAgIHwgICAgcXIxICAgICovCTtcClRXTyhQVU5QQ0tIQlcgICggTTAwLCBNUTIgKSkgICAgICAgICAgICAgICAgICAgIC8qICAgIHFhMiAgICB8ICAgIHFiMiAgICB8ICAgIHFnMiAgICB8ICAgIHFyMiAgICAqLwk7XAogICAgUFVOUENLTEJXICAoIE0wMCwgTVAxICkJCQkvKiAgICBwYTEgICAgfCAgICBwYjEgICAgfCAgICBwZzEgICAgfCAgICBwcjEgICAgKi8JO1wKVFdPKFBVTlBDS0hCVyAgKCBNMDAsIE1QMiApKSAgICAgICAgICAgICAgICAgICAgLyogICAgcGEyICAgIHwgICAgcGIyICAgIHwgICAgcGcyICAgIHwgICAgcHIyICAgICovCgojZGVmaW5lIEdNQl9BTFBIQShNUDEsIE1BMSwgTVAyLCBNQTIpIFwKICAgIE1PVlEgICAgICAgKCBNUDEsIE1BMSApCQkJCQkJCQkJCTtcClRXTyhNT1ZRICAgICAgICggTVAyLCBNQTIgKSkJCQkJCQkJCQkJO1wKCQkJCQkJCQkJCQkJCTtcCiAgICBQVU5QQ0tIV0QgICggTUExLCBNQTEgKQkJCS8qICAgIHBhMSAgICB8ICAgIHBhMSAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAqLwk7XApUV08oUFVOUENLSFdEICAoIE1BMiwgTUEyICkpCQkJLyogICAgcGEyICAgIHwgICAgcGEyICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICovCTtcCiAgICBQVU5QQ0tIRFEgICggTUExLCBNQTEgKSAgICAgICAgICAgICAgICAgICAgIC8qICAgIHBhMSAgICB8ICAgIHBhMSAgICB8ICAgIHBhMSAgICB8ICAgIHBhMSAgICAqLwk7XApUV08oUFVOUENLSERRICAoIE1BMiwgTUEyICkpICAgICAgICAgICAgICAgICAgICAvKiAgICBwYTIgICAgfCAgICBwYTIgICAgfCAgICBwYTIgICAgfCAgICBwYTIgICAgKi8KCiNkZWZpbmUgR01CX1BBQ0soIE1TMSwgTVMyICkgXAogICAgUEFDS1VTV0IgICAoIE1TMiwgTVMxICkJCQkvKiBzYTIgfCBzYjIgfCBzZzIgfCBzcjIgfCBzYTEgfCBzYjEgfCBzZzEgfCBzcjEgKi8JO1wKCiNkZWZpbmUgR01CX1NUT1JFKHJnYmEsIE1TUyApIFwKT05FKE1PVkQgICAgICAgKCBNU1MsIFJFR0lORChyZ2JhKSApKQkJLyogICAgIHwgICAgIHwgICAgIHwgICAgIHwgc2ExIHwgc2IxIHwgc2cxIHwgc3IxICovCTtcClRXTyhNT1ZRICAgICAgICggTVNTLCBSRUdJTkQocmdiYSkgKSkJCS8qIHNhMiB8IHNiMiB8IHNnMiB8IHNyMiB8IHNhMSB8IHNiMSB8IHNnMSB8IHNyMSAqLwoKLyogS2V2aW4gRi4gUXVpbm4gPGtldnF1aW5uQGdlbnRvby5vcmc+IDIgSnVseSAyMDA2CiAqIFJlcGxhY2UgZGF0YSBzZWdtZW50IGNvbnN0YW50cyB3aXRoIHRleHQtc2VnbWVudAogKiBjb25zdGFudHMgKHZpYSBwdXNobC9tb3ZxKQogICAgU0VHX0RBVEEKCkFMSUdOREFUQTgKY29uc3RfMDA4MDoKICAgIERfTE9ORyAweDAwODAwMDgwLCAweDAwODAwMDgwCgpjb25zdF84MDoKICAgIERfTE9ORyAweDgwODA4MDgwLCAweDgwODA4MDgwCiovCiNkZWZpbmUgY29uc3RfMDA4MF9sIDB4MDA4MDAwODAKI2RlZmluZSBjb25zdF8wMDgwX2ggMHgwMDgwMDA4MAojZGVmaW5lIGNvbnN0XzgwX2wgMHg4MDgwODA4MAojZGVmaW5lIGNvbnN0XzgwX2ggMHg4MDgwODA4MAoKICAgIFNFR19URVhUCgoKLyogQmxlbmQgdHJhbnNwYXJlbmN5IGZ1bmN0aW9uCiAqLwoKI2RlZmluZSBUQUcoeCkgQ09OQ0FUKHgsX3RyYW5zcGFyZW5jeSkKI2RlZmluZSBMTFRBRyh4KSBMTEJMMih4LF90cmFuc3BhcmVuY3kpCgojZGVmaW5lIElOSVQgXAogICAgUFhPUiAgICAgICAoIE1NMCwgTU0wICkJCQkvKiAgIDB4MDAwMCAgfCAgIDB4MDAwMCAgfCAgIDB4MDAwMCAgfCAgIDB4MDAwMCAgKi8KCiNkZWZpbmUgTUFJTiggcmdiYSwgZGVzdCApIFwKICAgIEdNQl9MT0FEKCByZ2JhLCBkZXN0LCBNTTEsIE1NMiApCQkJCQkJCQkJO1wKICAgIEdNQl9VTlBBQ0soIE1NMSwgTU0yLCBNTTQsIE1NNSwgTU0wICkJCQkJCQkJCTtcCiAgICBHTUJfQUxQSEEoIE1NMSwgTU0zLCBNTTQsIE1NNiApCQkJCQkJCQkJO1wKICAgIEdNQl9MRVJQX0dTQyggTU0xLCBNTTIsIE1NMywgTU00LCBNTTUsIE1NNiApCQkJCQkJCTtcCiAgICBHTUJfUEFDSyggTU0zLCBNTTYgKQkJCQkJCQkJCQk7XAogICAgR01CX1NUT1JFKCByZ2JhLCBNTTMgKQoKI2luY2x1ZGUgIm1teF9ibGVuZHRtcC5oIgoKCi8qIEJsZW5kIGFkZCBmdW5jdGlvbgogKgogKiBGSVhNRTogQWRkIHNvbWUgbG9vcCB1bnJvbGxpbmcgaGVyZS4uLgogKi8KCiNkZWZpbmUgVEFHKHgpIENPTkNBVCh4LF9hZGQpCiNkZWZpbmUgTExUQUcoeCkgTExCTDIoeCxfYWRkKQoKI2RlZmluZSBJTklUCgojZGVmaW5lIE1BSU4oIHJnYmEsIGRlc3QgKSBcCk9ORShNT1ZEICAgICAgICggUkVHSU5EKHJnYmEpLCBNTTEgKSkJCS8qICAgICB8ICAgICB8ICAgICB8ICAgICB8IHFhMSB8IHFiMSB8IHFnMSB8IHFyMSAqLwk7XApPTkUoTU9WRCAgICAgICAoIFJFR0lORChkZXN0KSwgTU0yICkpCQkvKiAgICAgfCAgICAgfCAgICAgfCAgICAgfCBwYTEgfCBwYjEgfCBwZzEgfCBwcjEgKi8JO1wKT05FKFBBRERVU0IgICAgKCBNTTIsIE1NMSApKQkJCQkJCQkJCQk7XApPTkUoTU9WRCAgICAgICAoIE1NMSwgUkVHSU5EKHJnYmEpICkpCQkvKiAgICAgfCAgICAgfCAgICAgfCAgICAgfCBzYTEgfCBzYjEgfCBzZzEgfCBzcjEgKi8JO1wKCQkJCQkJCQkJCQkJCTtcClRXTyhNT1ZRICAgICAgICggUkVHSU5EKHJnYmEpLCBNTTEgKSkJCS8qIHFhMiB8IHFiMiB8IHFnMiB8IHFyMiB8IHFhMSB8IHFiMSB8IHFnMSB8IHFyMSAqLwk7XApUV08oUEFERFVTQiAgICAoIFJFR0lORChkZXN0KSwgTU0xICkpCQkvKiBzYTIgfCBzYjIgfCBzZzIgfCBzcjIgfCBzYTEgfCBzYjEgfCBzZzEgfCBzcjEgKi8JO1wKVFdPKE1PVlEgICAgICAgKCBNTTEsIFJFR0lORChyZ2JhKSApKQoKI2luY2x1ZGUgIm1teF9ibGVuZHRtcC5oIgoKCi8qIEJsZW5kIG1pbiBmdW5jdGlvbgogKi8KCiNkZWZpbmUgVEFHKHgpIENPTkNBVCh4LF9taW4pCiNkZWZpbmUgTExUQUcoeCkgTExCTDIoeCxfbWluKQoKLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgogKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCiNkZWZpbmUgSU5JVCBcCiAgICBNT1ZRICAgICAgICggQ09OVEVOVChjb25zdF84MCksIE1NNyApCiAqLwojZGVmaW5lIElOSVQgXAogICAgUFVTSF9MICAgICAoIENPTlNUKGNvbnN0XzgwX2gpICkgCQkvKiAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwKi8JO1wKICAgIFBVU0hfTCAgICAgKCBDT05TVChjb25zdF84MF9sKSApIAkJCQkJCQkJCTtcCiAgICBNT1ZRICAgICAgICggUkVHSU5EKEVTUCksIE1NNyApIAkJCQkJCQkJCTtcCiAgICBBRERfTCAgICAgICggQ09OU1QoOCksIEVTUCkKCiNkZWZpbmUgTUFJTiggcmdiYSwgZGVzdCApIFwKICAgIEdNQl9MT0FEKCByZ2JhLCBkZXN0LCBNTTEsIE1NMiApCQkJCQkJCQkJO1wKICAgIE1PVlEgICAgICAgKCBNTTEsIE1NMyApCQkJCQkJCQkJCTtcCiAgICBNT1ZRICAgICAgICggTU0yLCBNTTQgKQkJCQkJCQkJCQk7XAogICAgUFhPUiAgICAgICAoIE1NNywgTU0zICkJCQkvKiAgICAgICAgICAgICAgdW5zaWduZWQgLT4gc2lnbmVkICAgICAgICAgICAgICAgKi8JO1wKICAgIFBYT1IgICAgICAgKCBNTTcsIE1NNCApCQkJLyogICAgICAgICAgICAgIHVuc2lnbmVkIC0+IHNpZ25lZCAgICAgICAgICAgICAgICovCTtcCiAgICBQQ01QR1RCICAgICggTU0zLCBNTTQgKQkJCS8qICAgICAgICAgICAgICAgICBxID4gcCA/IDB4ZmYgOiAweDAwICAgICAgICAgICAqLwk7XAogICAgUEFORCAgICAgICAoIE1NNCwgTU0xICkJCQkvKiAgICAgICAgICAgICAgICAgcSA+IHAgPyBwIDogMCAgICAgICAgICAgICAgICAgKi8JO1wKICAgIFBBTkROICAgICAgKCBNTTIsIE1NNCApCQkJLyogICAgICAgICAgICAgICAgIHEgPiBwID8gMCA6IHEgICAgICAgICAgICAgICAgICovCTtcCiAgICBQT1IgICAgICAgICggTU0xLCBNTTQgKQkJCS8qICAgICAgICAgICAgICAgICBxID4gcCA/IHAgOiBxICAgICAgICAgICAgICAgICAqLwk7XAogICAgR01CX1NUT1JFKCByZ2JhLCBNTTQgKQoKI2luY2x1ZGUgIm1teF9ibGVuZHRtcC5oIgoKCi8qIEJsZW5kIG1heCBmdW5jdGlvbgogKi8KCiNkZWZpbmUgVEFHKHgpIENPTkNBVCh4LF9tYXgpCiNkZWZpbmUgTExUQUcoeCkgTExCTDIoeCxfbWF4KQoKLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgogKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCiNkZWZpbmUgSU5JVCBcCiAgICBNT1ZRICAgICAgICggQ09OVEVOVChjb25zdF84MCksIE1NNyApCiAqLwojZGVmaW5lIElOSVQgXAogICAgUFVTSF9MICAgICAoIENPTlNUKGNvbnN0XzgwX2wpICkgCQkvKiAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwfCAweDgwKi8JO1wKICAgIFBVU0hfTCAgICAgKCBDT05TVChjb25zdF84MF9oKSApIAkJCQkJCQkJCTtcCiAgICBNT1ZRICAgICAgICggUkVHSU5EKEVTUCksIE1NNyApIAkJCQkJCQkJCTtcCiAgICBBRERfTCAgICAgICggQ09OU1QoOCksIEVTUCkKCiNkZWZpbmUgTUFJTiggcmdiYSwgZGVzdCApIFwKICAgIEdNQl9MT0FEKCByZ2JhLCBkZXN0LCBNTTEsIE1NMiApCQkJCQkJCQkJO1wKICAgIE1PVlEgICAgICAgKCBNTTEsIE1NMyApCQkJCQkJCQkJCTtcCiAgICBNT1ZRICAgICAgICggTU0yLCBNTTQgKQkJCQkJCQkJCQk7XAogICAgUFhPUiAgICAgICAoIE1NNywgTU0zICkJCQkvKiAgICAgICAgICAgICAgdW5zaWduZWQgLT4gc2lnbmVkICAgICAgICAgICAgICAgKi8JO1wKICAgIFBYT1IgICAgICAgKCBNTTcsIE1NNCApCQkJLyogICAgICAgICAgICAgIHVuc2lnbmVkIC0+IHNpZ25lZCAgICAgICAgICAgICAgICovCTtcCiAgICBQQ01QR1RCICAgICggTU0zLCBNTTQgKQkJCS8qICAgICAgICAgICAgICAgICBxID4gcCA/IDB4ZmYgOiAweDAwICAgICAgICAgICAqLwk7XAogICAgUEFORCAgICAgICAoIE1NNCwgTU0yICkJCQkvKiAgICAgICAgICAgICAgICAgcSA+IHAgPyBxIDogMCAgICAgICAgICAgICAgICAgKi8JO1wKICAgIFBBTkROICAgICAgKCBNTTEsIE1NNCApCQkJLyogICAgICAgICAgICAgICAgIHEgPiBwID8gMCA6IHAgICAgICAgICAgICAgICAgICovCTtcCiAgICBQT1IgICAgICAgICggTU0yLCBNTTQgKQkJCS8qICAgICAgICAgICAgICAgICBxID4gcCA/IHAgOiBxICAgICAgICAgICAgICAgICAqLwk7XAogICAgR01CX1NUT1JFKCByZ2JhLCBNTTQgKQoKI2luY2x1ZGUgIm1teF9ibGVuZHRtcC5oIgoKCi8qIEJsZW5kIG1vZHVsYXRlIGZ1bmN0aW9uCiAqLwoKI2RlZmluZSBUQUcoeCkgQ09OQ0FUKHgsX21vZHVsYXRlKQojZGVmaW5lIExMVEFHKHgpIExMQkwyKHgsX21vZHVsYXRlKQoKLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgogKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCiNkZWZpbmUgSU5JVCBcCiAgICBNT1ZRICAgICAgICggQ09OVEVOVChjb25zdF8wMDgwKSwgTU03ICkKICovCiNkZWZpbmUgSU5JVCBcCiAgICBQWE9SICAgICAgICggTU0wLCBNTTAgKQkJCS8qICAgMHgwMDAwICB8ICAgMHgwMDAwICB8ICAgMHgwMDAwICB8ICAgMHgwMDAwICAqLwk7XAogICAgUFVTSF9MICAgICAoIENPTlNUKGNvbnN0XzAwODBfbCkgKSAJLyogICAweDAwODAgIHwgICAweDAwODAgIHwgICAweDAwODAgIHwgICAweDAwODAgICovCTtcCiAgICBQVVNIX0wgICAgICggQ09OU1QoY29uc3RfMDA4MF9oKSApIAkJCQkJCQkJO1wKICAgIE1PVlEgICAgICAgKCBSRUdJTkQoRVNQKSwgTU03ICkgCQkJCQkJCQkJO1wKICAgIEFERF9MICAgICAgKCBDT05TVCg4KSwgRVNQKQoKI2RlZmluZSBNQUlOKCByZ2JhLCBkZXN0ICkgXAogICAgR01CX0xPQUQoIHJnYmEsIGRlc3QsIE1NMSwgTU0yICkJCQkJCQkJCQk7XAogICAgR01CX1VOUEFDSyggTU0xLCBNTTIsIE1NNCwgTU01LCBNTTAgKQkJCQkJCQkJO1wKICAgIEdNQl9NVUxUX0dTUiggTU0xLCBNTTIsIE1NNCwgTU01LCBNTTcgKQkJCQkJCQkJO1wKICAgIEdNQl9QQUNLKCBNTTIsIE1NNSApCQkJCQkJCQkJCTtcCiAgICBHTUJfU1RPUkUoIHJnYmEsIE1NMiApCgojaW5jbHVkZSAibW14X2JsZW5kdG1wLmgiCgojZW5kaWYKCQojaWYgZGVmaW5lZCAoX19FTEZfXykgJiYgZGVmaW5lZCAoX19saW51eF9fKQoJLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cwojZW5kaWYK