LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2NoYXJzZXQuYyx2IDEuMyAyMDAyLzAyLzE4IDIyOjI5OjI4IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKLyogI2RlZmluZSBDSEVDSyAqLwoKc3RhdGljIGludApGY0NoYXJTZXRMZXZlbHMgKEZjQ2hhcjMyIHVjczQpCnsKICAgIGlmICh1Y3M0IDw9IDB4ZmYpCglyZXR1cm4gMTsKICAgIGlmICh1Y3M0IDw9IDB4ZmZmZikKCXJldHVybiAyOwogICAgaWYgKHVjczQgPD0gMHhmZmZmZmYpCglyZXR1cm4gMzsKICAgIHJldHVybiA0Owp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldENoZWNrTGV2ZWwgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJbGV2ZWwgPSBGY0NoYXJTZXRMZXZlbHMgKHVjczQpOwogICAgCiAgICBpZiAobGV2ZWwgPD0gZmNzLT5sZXZlbHMpCglyZXR1cm4gRmNUcnVlOwogICAgd2hpbGUgKGZjcy0+bGV2ZWxzIDwgbGV2ZWwpCiAgICB7CglpZiAoZmNzLT5sZXZlbHMgPT0gMCkKCXsKCSAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKCgkgICAgbGVhZiA9IChGY0NoYXJMZWFmICopIGNhbGxvYyAoMSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CgkgICAgaWYgKCFsZWFmKQoJCXJldHVybiBGY0ZhbHNlOwoJICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CgkgICAgZmNzLT5ub2RlLmxlYWYgPSBsZWFmOwoJfQoJZWxzZQoJewoJICAgIEZjQ2hhckJyYW5jaCAgICAqYnJhbmNoOwogICAgCgkgICAgYnJhbmNoID0gKEZjQ2hhckJyYW5jaCAqKSBjYWxsb2MgKDEsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CgkgICAgaWYgKCFicmFuY2gpCgkJcmV0dXJuIEZjRmFsc2U7CgkgICAgRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckJyYW5jaCkpOwoJICAgIGJyYW5jaC0+bm9kZXNbMF0gPSBmY3MtPm5vZGU7CgkgICAgZmNzLT5ub2RlLmJyYW5jaCA9IGJyYW5jaDsKCX0KCSsrZmNzLT5sZXZlbHM7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDcmVhdGUgKHZvaWQpCnsKICAgIEZjQ2hhclNldAkqZmNzOwoKICAgIGZjcyA9IChGY0NoYXJTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjQ2hhclNldCkpOwogICAgaWYgKCFmY3MpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOwogICAgZmNzLT5yZWYgPSAxOwogICAgZmNzLT5sZXZlbHMgPSAwOwogICAgZmNzLT5ub2RlLmxlYWYgPSAwOwogICAgZmNzLT5jb25zdGFudCA9IEZjRmFsc2U7CiAgICByZXR1cm4gZmNzOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXROZXcgKHZvaWQpOwogICAgCkZjQ2hhclNldCAqCkZjQ2hhclNldE5ldyAodm9pZCkKewogICAgcmV0dXJuIEZjQ2hhclNldENyZWF0ZSAoKTsKfQoKc3RhdGljIHZvaWQKRmNDaGFyTm9kZURlc3Ryb3kgKEZjQ2hhck5vZGUgbm9kZSwgaW50IGxldmVsKQp7CiAgICBpbnQJaTsKCiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICBjYXNlIDA6CglicmVhazsKICAgIGNhc2UgMToKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCWZyZWUgKG5vZGUubGVhZik7CglicmVhazsKICAgIGRlZmF1bHQ6Cglmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCgkgICAgaWYgKG5vZGUuYnJhbmNoLT5ub2Rlc1tpXS5icmFuY2gpCgkJRmNDaGFyTm9kZURlc3Ryb3kgKG5vZGUuYnJhbmNoLT5ub2Rlc1tpXSwgbGV2ZWwgLSAxKTsKICAgICAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJCcmFuY2gpKTsKCWZyZWUgKG5vZGUuYnJhbmNoKTsKICAgIH0KfQoKdm9pZApGY0NoYXJTZXREZXN0cm95IChGY0NoYXJTZXQgKmZjcykKewogICAgaWYgKGZjcy0+Y29uc3RhbnQpCglyZXR1cm47CiAgICBpZiAoLS1mY3MtPnJlZiA8PSAwKQogICAgewoJRmNDaGFyTm9kZURlc3Ryb3kgKGZjcy0+bm9kZSwgZmNzLT5sZXZlbHMpOwoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKCWZyZWUgKGZjcyk7CiAgICB9Cn0KCi8qCiAqIExvY2F0ZSB0aGUgbGVhZiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgY2hhciwgcmV0dXJuaW5nCiAqIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdAogKi8KCnN0YXRpYyBGY0NoYXJMZWFmICoKRmNDaGFyU2V0RmluZExlYWYgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCQlsOwogICAgY29uc3QgRmNDaGFyTm9kZQkqcHJldjsKICAgIEZjQ2hhck5vZGUJCW5vZGU7CiAgICBGY0NoYXIzMiAgICAJaTsKCiAgICBwcmV2ID0gJmZjcy0+bm9kZTsKICAgIGwgPSBmY3MtPmxldmVsczsKICAgIHdoaWxlICgtLWwgPiAwKQogICAgewoJbm9kZSA9ICpwcmV2OwoJaWYgKCFub2RlLmJyYW5jaCkKCSAgICByZXR1cm4gMDsKCWkgPSAodWNzNCA+PiAobCA8PCAzKSkgJiAweGZmOwoJcHJldiA9ICZub2RlLmJyYW5jaC0+bm9kZXNbaV07CiAgICB9CiAgICByZXR1cm4gcHJldi0+bGVhZjsKfQoKLyoKICogTG9jYXRlIHRoZSBsZWFmIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyLCBjcmVhdGluZyBpdAogKiBpZiBkZXNpcmVkCiAqLwoKc3RhdGljIEZjQ2hhckxlYWYgKgpGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJICAgIGw7CiAgICBGY0NoYXJOb2RlCSAgICAqcHJldiwgbm9kZTsKICAgIEZjQ2hhcjMyCSAgICBpOwoKICAgIGlmICghRmNDaGFyU2V0Q2hlY2tMZXZlbCAoZmNzLCB1Y3M0KSkKCXJldHVybiBGY0ZhbHNlOwogICAgcHJldiA9ICZmY3MtPm5vZGU7CiAgICBsID0gZmNzLT5sZXZlbHM7CiAgICB3aGlsZSAoLS1sID4gMCkKICAgIHsKCW5vZGUgPSAqcHJldjsKCWlmICghbm9kZS5icmFuY2gpCgl7CgkgICAgbm9kZS5icmFuY2ggPSBjYWxsb2MgKDEsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CgkgICAgaWYgKCFub2RlLmJyYW5jaCkKCQlyZXR1cm4gMDsKCSAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CgkgICAgKnByZXYgPSBub2RlOwoJfQoJaSA9ICh1Y3M0ID4+IChsIDw8IDMpKSAmIDB4ZmY7CglwcmV2ID0gJm5vZGUuYnJhbmNoLT5ub2Rlc1tpXTsKICAgIH0KICAgIG5vZGUgPSAqcHJldjsKICAgIGlmICghbm9kZS5sZWFmKQogICAgewoJbm9kZS5sZWFmID0gY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCWlmICghbm9kZS5sZWFmKQoJICAgIHJldHVybiAwOwoJRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCSpwcmV2ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlLmxlYWY7Cn0KCkZjQm9vbApGY0NoYXJTZXRBZGRDaGFyIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhcjMyCSpiOwogICAgCiAgICBpZiAoZmNzLT5jb25zdGFudCkKCXJldHVybiBGY0ZhbHNlOwogICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwogICAgaWYgKCFsZWFmKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBiID0gJmxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdOwogICAgKmIgfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBBbiBpdGVyYXRvciBmb3IgdGhlIGxlYXZlcyBvZiBhIGNoYXJzZXQKICovCgp0eXBlZGVmIHN0cnVjdCBfZmNDaGFyU2V0SXRlciB7CiAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKICAgIEZjQ2hhcjMyCSAgICB1Y3M0Owp9IEZjQ2hhclNldEl0ZXI7CgovKgogKiBGaW5kIHRoZSBuZWFyZXN0IGxlYWYgYXQgb3IgYmV5b25kICp1Y3M0LCByZXR1cm4gMCBpZiBubyBsZWFmCiAqIGV4aXN0cwogKi8Kc3RhdGljIEZjQ2hhckxlYWYgKgpGY0NoYXJTZXRJdGVyTGVhZiAoRmNDaGFyTm9kZSBub2RlLCBpbnQgbGV2ZWwsIEZjQ2hhcjMyICp1Y3M0KQp7CiAgICBpZiAobGV2ZWwgPD0gMSkKICAgICAgICByZXR1cm4gbm9kZS5sZWFmOwogICAgZWxzZSBpZiAoIW5vZGUuYnJhbmNoKQoJcmV0dXJuIDA7CiAgICBlbHNlCiAgICB7CglpbnQJICAgIHNoaWZ0ID0gKChsZXZlbCAtIDEpIDw8IDMpOwoJRmNDaGFyMzIgICAgaW5jID0gMSA8PCBzaGlmdDsKCUZjQ2hhcjMyICAgIG1hc2sgPSB+KGluYyAtIDEpOwoJRmNDaGFyMzIgICAgYnl0ZSA9ICgqdWNzNCA+PiBzaGlmdCkgJiAweGZmOwoJRmNDaGFyTGVhZiAgKmxlYWY7CgoJZm9yICg7OykKCXsKCSAgICBsZWFmID0gRmNDaGFyU2V0SXRlckxlYWYgKG5vZGUuYnJhbmNoLT5ub2Rlc1tieXRlXSwgCgkJCQkgICAgICBsZXZlbCAtIDEsIAoJCQkJICAgICAgdWNzNCk7CgkgICAgaWYgKGxlYWYpCgkJYnJlYWs7CgkgICAgLyogc3RlcCB0byBuZXh0IGJyYW5jaCwgcmVzZXR0aW5nIGxvd2VyIGluZGljZXMgKi8KCSAgICAqdWNzNCA9ICgqdWNzNCAmIG1hc2spICsgaW5jOwoJICAgIGJ5dGUgPSAoYnl0ZSArIDEpICYgMHhmZjsKCSAgICBpZiAoYnl0ZSA9PSAwKQoJCWJyZWFrOwoJfQoJcmV0dXJuIGxlYWY7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjQ2hhclNldEl0ZXJTZXQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpZiAoRmNDaGFyU2V0TGV2ZWxzIChpdGVyLT51Y3M0KSA+IGZjcy0+bGV2ZWxzKQoJaXRlci0+bGVhZiA9IDA7CiAgICBlbHNlCglpdGVyLT5sZWFmID0gRmNDaGFyU2V0SXRlckxlYWYgKGZjcy0+bm9kZSwgZmNzLT5sZXZlbHMsCgkJCQkJJml0ZXItPnVjczQpOwogICAgaWYgKCFpdGVyLT5sZWFmKQoJaXRlci0+dWNzNCA9IH4wOwp9CgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyTmV4dCAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhclNldEl0ZXIgKml0ZXIpCnsKICAgIGl0ZXItPnVjczQgKz0gMHgxMDA7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChmY3MsIGl0ZXIpOwp9CgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyU3RhcnQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpdGVyLT51Y3M0ID0gMDsKICAgIEZjQ2hhclNldEl0ZXJTZXQgKGZjcywgaXRlcik7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKQp7CiAgICBzcmMtPnJlZisrOwogICAgcmV0dXJuIHNyYzsKfQoKRmNCb29sCkZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKICAgIGludAkJICAgIGk7CiAgICAKICAgIGlmIChhID09IGIpCglyZXR1cm4gRmNUcnVlOwogICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKCSBhaS5sZWFmICYmIGJpLmxlYWY7CgkgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpKQogICAgewoJaWYgKGFpLnVjczQgIT0gYmkudWNzNCkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCSAgICBpZiAoYWkubGVhZi0+bWFwW2ldICE9IGJpLmxlYWYtPm1hcFtpXSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBhaS5sZWFmID09IGJpLmxlYWY7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0QWRkTGVhZiAoRmNDaGFyU2V0CSpmY3MsCgkJICBGY0NoYXIzMgl1Y3M0LAoJCSAgRmNDaGFyTGVhZgkqbGVhZikKewogICAgRmNDaGFyTGVhZiAgICpuZXcgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICAqbmV3ID0gKmxlYWY7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0T3BlcmF0ZSAoY29uc3QgRmNDaGFyU2V0ICAgKmEsCgkJICBjb25zdCBGY0NoYXJTZXQgICAqYiwKCQkgIEZjQm9vbAkgICAgKCpvdmVybGFwKSAoRmNDaGFyTGVhZgkgICAgKnJlc3VsdCwKCQkJCQkJY29uc3QgRmNDaGFyTGVhZiAgICAqYWwsCgkJCQkJCWNvbnN0IEZjQ2hhckxlYWYgICAgKmJsKSwKCQkgIEZjQm9vbAlhb25seSwKCQkgIEZjQm9vbAlib25seSkKewogICAgRmNDaGFyU2V0CSAgICAqZmNzOwogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CiAgICB3aGlsZSAoKGFpLmxlYWYgfHwgYm9ubHkpICYmIChiaS5sZWFmIHx8IGFvbmx5KSkKICAgIHsKCWlmIChhaS51Y3M0IDwgYmkudWNzNCkKCXsKCSAgICBpZiAoYW9ubHkpCgkgICAgewoJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBhaS51Y3M0LCBhaS5sZWFmKSkKCQkgICAgZ290byBiYWlsMTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlhaS51Y3M0ID0gYmkudWNzNDsKCQlGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwoJICAgIH0KCX0KCWVsc2UgaWYgKGJpLnVjczQgPCBhaS51Y3M0ICkKCXsKCSAgICBpZiAoYm9ubHkpCgkgICAgewoJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBiaS51Y3M0LCBiaS5sZWFmKSkKCQkgICAgZ290byBiYWlsMTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoYiwgJmJpKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQliaS51Y3M0ID0gYWkudWNzNDsKCQlGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBGY0NoYXJMZWFmICBsZWFmOwoKCSAgICBpZiAoKCpvdmVybGFwKSAoJmxlYWYsIGFpLmxlYWYsIGJpLmxlYWYpKQoJICAgIHsKCQlpZiAoIUZjQ2hhclNldEFkZExlYWYgKGZjcywgYWkudWNzNCwgJmxlYWYpKQoJCSAgICBnb3RvIGJhaWwxOwoJICAgIH0KCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYiwgJmJpKTsKCX0KICAgIH0KICAgIHJldHVybiBmY3M7CmJhaWwxOgogICAgRmNDaGFyU2V0RGVzdHJveSAoZmNzKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRJbnRlcnNlY3RMZWFmIChGY0NoYXJMZWFmICpyZXN1bHQsCgkJCWNvbnN0IEZjQ2hhckxlYWYgKmFsLAoJCQljb25zdCBGY0NoYXJMZWFmICpibCkKewogICAgaW50CSAgICBpOwogICAgRmNCb29sICBub25lbXB0eSA9IEZjRmFsc2U7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJaWYgKChyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gJiBibC0+bWFwW2ldKSkKCSAgICBub25lbXB0eSA9IEZjVHJ1ZTsKICAgIHJldHVybiBub25lbXB0eTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldEludGVyc2VjdExlYWYsIEZjRmFsc2UsIEZjRmFsc2UpOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFVuaW9uTGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAoJCSAgICBjb25zdCBGY0NoYXJMZWFmICphbCwKCQkgICAgY29uc3QgRmNDaGFyTGVhZiAqYmwpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCXJlc3VsdC0+bWFwW2ldID0gYWwtPm1hcFtpXSB8IGJsLT5tYXBbaV07CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRVbmlvbiAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIHJldHVybiBGY0NoYXJTZXRPcGVyYXRlIChhLCBiLCBGY0NoYXJTZXRVbmlvbkxlYWYsIEZjVHJ1ZSwgRmNUcnVlKTsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRTdWJ0cmFjdExlYWYgKEZjQ2hhckxlYWYgKnJlc3VsdCwKCQkgICAgICAgY29uc3QgRmNDaGFyTGVhZiAqYWwsCgkJICAgICAgIGNvbnN0IEZjQ2hhckxlYWYgKmJsKQp7CiAgICBpbnQJICAgIGk7CiAgICBGY0Jvb2wgIG5vbmVtcHR5ID0gRmNGYWxzZTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCglpZiAoKHJlc3VsdC0+bWFwW2ldID0gYWwtPm1hcFtpXSAmIH5ibC0+bWFwW2ldKSkKCSAgICBub25lbXB0eSA9IEZjVHJ1ZTsKICAgIHJldHVybiBub25lbXB0eTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICByZXR1cm4gRmNDaGFyU2V0T3BlcmF0ZSAoYSwgYiwgRmNDaGFyU2V0U3VidHJhY3RMZWFmLCBGY1RydWUsIEZjRmFsc2UpOwp9CgpGY0Jvb2wKRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpCnsKICAgIEZjQ2hhckxlYWYJKmxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZiAoZmNzLCB1Y3M0KTsKICAgIGlmICghbGVhZikKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIChsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XSAmICgxIDw8ICh1Y3M0ICYgMHgxZikpKSAhPSAwOwp9CgpzdGF0aWMgRmNDaGFyMzIKRmNDaGFyU2V0UG9wQ291bnQgKEZjQ2hhcjMyIGMxKQp7CiAgICAvKiBoYWNrbWVtIDE2OSAqLwogICAgRmNDaGFyMzIJYzIgPSAoYzEgPj4gMSkgJiAwMzMzMzMzMzMzMzM7CiAgICBjMiA9IGMxIC0gYzIgLSAoKGMyID4+IDEpICYgMDMzMzMzMzMzMzMzKTsKICAgIHJldHVybiAoKChjMiArIChjMiA+PiAzKSkgJiAwMzA3MDcwNzA3MDcpICUgMDc3KTsKfQoKRmNDaGFyMzIKRmNDaGFyU2V0SW50ZXJzZWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwogICAgRmNDaGFyMzIJICAgIGNvdW50ID0gMDsKICAgIAogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOwogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChiLCAmYmkpOwogICAgd2hpbGUgKGFpLmxlYWYgJiYgYmkubGVhZikKICAgIHsKCWlmIChhaS51Y3M0ID09IGJpLnVjczQpCgl7CgkgICAgRmNDaGFyMzIJKmFtID0gYWkubGVhZi0+bWFwOwoJICAgIEZjQ2hhcjMyCSpibSA9IGJpLmxlYWYtPm1hcDsKCSAgICBpbnQJCWkgPSAyNTYvMzI7CgkgICAgd2hpbGUgKGktLSkKCQljb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKysgJiAqYm0rKyk7CgkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7Cgl9IAoJZWxzZSBpZiAoYWkudWNzNCA8IGJpLnVjczQpCgl7CgkgICAgYWkudWNzNCA9IGJpLnVjczQ7CgkgICAgRmNDaGFyU2V0SXRlclNldCAoYSwgJmFpKTsKCX0KCWlmIChiaS51Y3M0IDwgYWkudWNzNCkKCXsKCSAgICBiaS51Y3M0ID0gYWkudWNzNDsKCSAgICBGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgpGY0NoYXIzMgpGY0NoYXJTZXRDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWk7CiAgICBGY0NoYXIzMgkgICAgY291bnQgPSAwOwogICAgCiAgICBmb3IgKEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsgYWkubGVhZjsgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSkpCiAgICB7CglpbnQJCSAgICBpID0gMjU2LzMyOwoJRmNDaGFyMzIJICAgICphbSA9IGFpLmxlYWYtPm1hcDsKCgl3aGlsZSAoaS0tKQoJICAgIGNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCkZjQ2hhcjMyCkZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwogICAgRmNDaGFyMzIJICAgIGNvdW50ID0gMDsKICAgIAogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOwogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChiLCAmYmkpOwogICAgd2hpbGUgKGFpLmxlYWYpCiAgICB7CglpZiAoYWkudWNzNCA8PSBiaS51Y3M0KQoJewoJICAgIEZjQ2hhcjMyCSphbSA9IGFpLmxlYWYtPm1hcDsKCSAgICBpbnQJCWkgPSAyNTYvMzI7CgkgICAgaWYgKGFpLnVjczQgPT0gYmkudWNzNCkKCSAgICB7CgkJRmNDaGFyMzIJKmJtID0gYmkubGVhZi0+bWFwOzsKCQl3aGlsZSAoaS0tKQoJCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKysgJiB+KmJtKyspOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCXdoaWxlIChpLS0pCgkJICAgIGNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyk7CgkgICAgfQoJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJfQoJZWxzZSBpZiAoYmkubGVhZikKCXsKCSAgICBiaS51Y3M0ID0gYWkudWNzNDsKCSAgICBGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgpGY0NoYXIzMgpGY0NoYXJTZXRDb3ZlcmFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCBGY0NoYXIzMiBwYWdlLCBGY0NoYXIzMiAqcmVzdWx0KQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWk7CgogICAgYWkudWNzNCA9IHBhZ2U7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwogICAgaWYgKCFhaS5sZWFmKQogICAgewoJbWVtc2V0IChyZXN1bHQsICdcMCcsIDI1NiAvIDgpOwoJcGFnZSA9IDA7CiAgICB9CiAgICBlbHNlCiAgICB7CgltZW1jcHkgKHJlc3VsdCwgYWkubGVhZi0+bWFwLCBzaXplb2YgKGFpLmxlYWYtPm1hcCkpOwoJRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CglwYWdlID0gYWkudWNzNDsKICAgIH0KICAgIHJldHVybiBwYWdlOwp9CgovKgogKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBjaGFyc2V0cy4KICogCiAqIEVhY2ggbGVhZiBpcyByZXByZXNlbnRlZCBhcyA5IDMyLWJpdCB2YWx1ZXMsIHRoZSBjb2RlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93ZWQKICogYnkgOCAzMiBiaXQgdmFsdWVzIGZvciB0aGUgbGVhZiBpdHNlbGYuICBFYWNoIHZhbHVlIGlzIGVuY29kZWQgYXMgNSBBU0NJSSBjaGFyYWN0ZXJzLAogKiBvbmx5IDg1IGRpZmZlcmVudCB2YWx1ZXMgYXJlIHVzZWQgdG8gYXZvaWQgY29udHJvbCBjaGFyYWN0ZXJzIGFzIHdlbGwgYXMgdGhlIG90aGVyCiAqIGNoYXJhY3RlcnMgdXNlZCB0byBlbmNvZGUgZm9udCBuYW1lcy4gIDg1Kio1ID4gMl4zMiBzbyB0aGluZ3Mgd29yayBvdXQsIGJ1dAogKiBpdCdzIG5vdCBleGFjdGx5IGh1bWFuIHJlYWRhYmxlIG91dHB1dC4gIEFzIGEgc3BlY2lhbCBjYXNlLCAwIGlzIGVuY29kZWQgYXMgYSBzcGFjZQogKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyCWNoYXJUb1ZhbHVlWzI1Nl0gPSB7CiAgICAvKiAgICAgIiIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAiXGIiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMDIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDAzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAgIiAiICovIDB4ZmYsICAweDAwLCAgMHhmZiwgIDB4MDEsICAweDAyLCAgMHgwMywgIDB4MDQsICAweGZmLCAKICAgIC8qICAgICIoIiAqLyAweDA1LCAgMHgwNiwgIDB4MDcsICAweDA4LCAgMHhmZiwgIDB4ZmYsICAweDA5LCAgMHgwYSwgCiAgICAvKiAgICAiMCIgKi8gMHgwYiwgIDB4MGMsICAweDBkLCAgMHgwZSwgIDB4MGYsICAweDEwLCAgMHgxMSwgIDB4MTIsIAogICAgLyogICAgIjgiICovIDB4MTMsICAweDE0LCAgMHhmZiwgIDB4MTUsICAweDE2LCAgMHhmZiwgIDB4MTcsICAweDE4LCAKICAgIC8qICAgICJAIiAqLyAweDE5LCAgMHgxYSwgIDB4MWIsICAweDFjLCAgMHgxZCwgIDB4MWUsICAweDFmLCAgMHgyMCwgCiAgICAvKiAgICAiSCIgKi8gMHgyMSwgIDB4MjIsICAweDIzLCAgMHgyNCwgIDB4MjUsICAweDI2LCAgMHgyNywgIDB4MjgsIAogICAgLyogICAgIlAiICovIDB4MjksICAweDJhLCAgMHgyYiwgIDB4MmMsICAweDJkLCAgMHgyZSwgIDB4MmYsICAweDMwLCAKICAgIC8qICAgICJYIiAqLyAweDMxLCAgMHgzMiwgIDB4MzMsICAweDM0LCAgMHhmZiwgIDB4MzUsICAweDM2LCAgMHhmZiwgCiAgICAvKiAgICAiYCIgKi8gMHhmZiwgIDB4MzcsICAweDM4LCAgMHgzOSwgIDB4M2EsICAweDNiLCAgMHgzYywgIDB4M2QsIAogICAgLyogICAgImgiICovIDB4M2UsICAweDNmLCAgMHg0MCwgIDB4NDEsICAweDQyLCAgMHg0MywgIDB4NDQsICAweDQ1LCAKICAgIC8qICAgICJwIiAqLyAweDQ2LCAgMHg0NywgIDB4NDgsICAweDQ5LCAgMHg0YSwgIDB4NGIsICAweDRjLCAgMHg0ZCwgCiAgICAvKiAgICAieCIgKi8gMHg0ZSwgIDB4NGYsICAweDUwLCAgMHg1MSwgIDB4NTIsICAweDUzLCAgMHg1NCwgIDB4ZmYsIAogICAgLyogIlwyMDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjEwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDIyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjQwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI1MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjcwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMwMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzUwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM2MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKfTsKCnN0YXRpYyBGY0NoYXI4IHZhbHVlVG9DaGFyWzB4NTVdID0gewogICAgLyogMHgwMCAqLyAnIScsICcjJywgJyQnLCAnJScsICcmJywgJygnLCAnKScsICcqJywKICAgIC8qIDB4MDggKi8gJysnLCAnLicsICcvJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsCiAgICAvKiAweDEwICovICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnOycsICc8JywgJz4nLAogICAgLyogMHgxOCAqLyAnPycsICdAJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywKICAgIC8qIDB4MjAgKi8gJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsCiAgICAvKiAweDI4ICovICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLAogICAgLyogMHgzMCAqLyAnVycsICdYJywgJ1knLCAnWicsICdbJywgJ10nLCAnXicsICdhJywKICAgIC8qIDB4MzggKi8gJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsCiAgICAvKiAweDQwICovICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAogICAgLyogMHg0OCAqLyAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywKICAgIC8qIDB4NTAgKi8gJ3onLCAneycsICd8JywgJ30nLCAnficsCn07CgpzdGF0aWMgRmNDaGFyOCAqCkZjQ2hhclNldFBhcnNlVmFsdWUgKEZjQ2hhcjggKnN0cmluZywgRmNDaGFyMzIgKnZhbHVlKQp7CiAgICBpbnQJCWk7CiAgICBGY0NoYXIzMgl2OwogICAgRmNDaGFyMzIJYzsKICAgIAogICAgaWYgKCpzdHJpbmcgPT0gJyAnKQogICAgewoJdiA9IDA7CglzdHJpbmcrKzsKICAgIH0KICAgIGVsc2UKICAgIHsKCXYgPSAwOwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKCXsKCSAgICBpZiAoIShjID0gKEZjQ2hhcjMyKSAodW5zaWduZWQgY2hhcikgKnN0cmluZysrKSkKCQlyZXR1cm4gMDsKCSAgICBjID0gY2hhclRvVmFsdWVbY107CgkgICAgaWYgKGMgPT0gMHhmZikKCQlyZXR1cm4gMDsKCSAgICB2ID0gdiAqIDg1ICsgYzsKCX0KICAgIH0KICAgICp2YWx1ZSA9IHY7CiAgICByZXR1cm4gc3RyaW5nOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFVucGFyc2VWYWx1ZSAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyMzIgdmFsdWUpCnsKICAgIGludAkgICAgaTsKICAgIGlmICh2YWx1ZSA9PSAwKQogICAgewoJcmV0dXJuIEZjU3RyQnVmQ2hhciAoYnVmLCAnICcpOwogICAgfQogICAgZWxzZQogICAgewoJRmNDaGFyOAlzdHJpbmdbNl07CglGY0NoYXI4CSpzID0gc3RyaW5nICsgNTsKCXN0cmluZ1s1XSA9ICdcMCc7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJewoJICAgICotLXMgPSB2YWx1ZVRvQ2hhclt2YWx1ZSAlIDg1XTsKCSAgICB2YWx1ZSAvPSA4NTsKCX0KCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCgkgICAgaWYgKCFGY1N0ckJ1ZkNoYXIgKGJ1ZiwgKnMrKykpCgkJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZykKewogICAgRmNDaGFyU2V0CSpjOwogICAgRmNDaGFyMzIJdWNzNDsKICAgIEZjQ2hhckxlYWYJKmxlYWY7CiAgICBpbnQJCWk7CgogICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghYykKCWdvdG8gYmFpbDA7CiAgICB3aGlsZSAoKnN0cmluZykKICAgIHsKCXN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnVjczQpOwoJaWYgKCFzdHJpbmcpCgkgICAgZ290byBiYWlsMTsKCWxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoYywgdWNzNCk7CglpZiAoIWxlYWYpCgkgICAgZ290byBiYWlsMTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCXsKCSAgICBzdHJpbmcgPSBGY0NoYXJTZXRQYXJzZVZhbHVlIChzdHJpbmcsICZsZWFmLT5tYXBbaV0pOwoJICAgIGlmICghc3RyaW5nKQoJCWdvdG8gYmFpbDE7Cgl9CiAgICB9CiAgICByZXR1cm4gYzsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChjKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKRmNCb29sCkZjTmFtZVVucGFyc2VDaGFyU2V0IChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXJTZXQgKmMpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBjaTsKICAgIGludAkJICAgIGk7CiNpZmRlZiBDSEVDSwogICAgaW50CQkgICAgbGVuID0gYnVmLT5sZW47CiNlbmRpZgoKICAgIGZvciAoRmNDaGFyU2V0SXRlclN0YXJ0IChjLCAmY2kpOwoJIGNpLmxlYWY7CgkgRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSkpCiAgICB7CglpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS51Y3M0KSkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCSAgICBpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS5sZWFmLT5tYXBbaV0pKQoJCXJldHVybiBGY0ZhbHNlOwogICAgfQojaWZkZWYgQ0hFQ0sKICAgIHsKCUZjQ2hhclNldAkqY2hlY2s7CglGY0NoYXIzMgltaXNzaW5nOwoJRmNDaGFyU2V0SXRlcgljaSwgY2hlY2tpOwoJCgkvKiBudWxsIHRlcm1pbmF0ZSBmb3IgcGFyc2VyICovCglGY1N0ckJ1ZkNoYXIgKGJ1ZiwgJ1wwJyk7CgkvKiBzdGVwIGJhY2sgb3ZlciBudWxsIGZvciBsaWZlIGFmdGVyIHRlc3QgKi8KCWJ1Zi0+bGVuLS07CgljaGVjayA9IEZjTmFtZVBhcnNlQ2hhclNldCAoYnVmLT5idWYgKyBsZW4pOwoJRmNDaGFyU2V0SXRlclN0YXJ0IChjLCAmY2kpOwoJRmNDaGFyU2V0SXRlclN0YXJ0IChjaGVjaywgJmNoZWNraSk7Cgl3aGlsZSAoY2kubGVhZiB8fCBjaGVja2kubGVhZikKCXsKCSAgICBpZiAoY2kudWNzNCA8IGNoZWNraS51Y3M0KQoJICAgIHsKCQlwcmludGYgKCJNaXNzaW5nIGxlYWYgbm9kZSBhdCAweCV4XG4iLCBjaS51Y3M0KTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoY2hlY2tpLnVjczQgPCBjaS51Y3M0KQoJICAgIHsKCQlwcmludGYgKCJFeHRyYSBsZWFmIG5vZGUgYXQgMHgleFxuIiwgY2hlY2tpLnVjczQpOwoJCUZjQ2hhclNldEl0ZXJOZXh0IChjaGVjaywgJmNoZWNraSk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJaW50CSAgICBpID0gMjU2LzMyOwoJCUZjQ2hhcjMyICAgICpjbSA9IGNpLmxlYWYtPm1hcDsKCQlGY0NoYXIzMiAgICAqY2hlY2ttID0gY2hlY2tpLmxlYWYtPm1hcDsKCgkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSAzMikKCQl7CgkJICAgIGlmICgqY20gIT0gKmNoZWNrbSkKCQkJcHJpbnRmICgiTWlzbWF0Y2hpbmcgc2V0cyBhdCAweCUwOHg6IDB4JTA4eCAhPSAweCUwOHhcbiIsCgkJCQljaS51Y3M0ICsgaSwgKmNtLCAqY2hlY2ttKTsKCQkgICAgY20rKzsKCQkgICAgY2hlY2ttKys7CgkJfQoJCUZjQ2hhclNldEl0ZXJOZXh0IChjLCAmY2kpOwoJCUZjQ2hhclNldEl0ZXJOZXh0IChjaGVjaywgJmNoZWNraSk7CgkgICAgfQoJfQoJaWYgKChtaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoYywgY2hlY2spKSkKCSAgICBwcmludGYgKCIlZCBtaXNzaW5nIGluIHJlcGFyc2VkIHJlc3VsdFxuIiwgbWlzc2luZyk7CglpZiAoKG1pc3NpbmcgPSBGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjaGVjaywgYykpKQoJICAgIHByaW50ZiAoIiVkIGV4dHJhIGluIHJlcGFyc2VkIHJlc3VsdFxuIiwgbWlzc2luZyk7CglGY0NoYXJTZXREZXN0cm95IChjaGVjayk7CiAgICB9CiNlbmRpZgogICAgCiAgICByZXR1cm4gRmNUcnVlOwp9CgojaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgoKLyoKICogRmlndXJlIG91dCB3aGV0aGVyIHRoZSBhdmFpbGFibGUgZnJlZXR5cGUgaGFzIEZUX0dldF9OZXh0X0NoYXIKICovCgojaWYgRlJFRVRZUEVfTUFKT1IgPiAyCiMgZGVmaW5lIEhBU19ORVhUX0NIQVIKI2Vsc2UKIyBpZiBGUkVFVFlQRV9NQUpPUiA9PSAyCiMgIGlmIEZSRUVUWVBFX01JTk9SID4gMAojICAgZGVmaW5lIEhBU19ORVhUX0NIQVIKIyAgZWxzZQojICAgaWYgRlJFRVRZUEVfTUlOT1IgPT0gMAojICAgIGlmIEZSRUVUWVBFX1BBVENIID49IDgKIyAgICAgZGVmaW5lIEhBU19ORVhUX0NIQVIKIyAgICBlbmRpZgojICAgZW5kaWYKIyAgZW5kaWYKIyBlbmRpZgojZW5kaWYKCi8qCiAqIEZvciBvdXIgcHVycG9zZXMsIHRoaXMgYXBwcm94aW1hdGlvbiBpcyBzdWZmaWNpZW50CiAqLwojaWZuZGVmIEhBU19ORVhUX0NIQVIKI2RlZmluZSBGVF9HZXRfTmV4dF9DaGFyKGZhY2UsIHVjczQpICgodWNzNCkgPj0gMHhmZmZmZmYgPyAwIDogKHVjczQpICsgMSkKI3dhcm5pbmcgIk5vIEZUX0dldF9OZXh0X0NoYXIiCiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhckVudCB7CiAgICBGY0NoYXIxNgkgICAgYm1wOwogICAgdW5zaWduZWQgY2hhciAgIGVuY29kZTsKfSBGY0NoYXJFbnQ7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTWFwIHsKICAgIGNvbnN0IEZjQ2hhckVudCAqZW50OwogICAgaW50CQkgICAgbmVudDsKfSBGY0NoYXJNYXA7Cgp0eXBlZGVmIHN0cnVjdCBfRmNGb250RGVjb2RlIHsKICAgIEZUX0VuY29kaW5nCSAgICBlbmNvZGluZzsKICAgIGNvbnN0IEZjQ2hhck1hcCAqbWFwOwogICAgRmNDaGFyMzIJICAgIG1heDsKfSBGY0ZvbnREZWNvZGU7CgpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFwcGxlUm9tYW47CnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQWRvYmVTeW1ib2w7CiAgICAKc3RhdGljIGNvbnN0IEZjRm9udERlY29kZSBmY0ZvbnREZWNvZGVyc1tdID0gewogICAgeyBmdF9lbmNvZGluZ191bmljb2RlLAkwLAkJKDEgPDwgMjEpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19zeW1ib2wsCSZBZG9iZVN5bWJvbCwJKDEgPDwgMTYpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiwJJkFwcGxlUm9tYW4sCSgxIDw8IDE2KSAtIDEgfSwKfTsKCiNkZWZpbmUgTlVNX0RFQ09ERSAgKHNpemVvZiAoZmNGb250RGVjb2RlcnMpIC8gc2l6ZW9mIChmY0ZvbnREZWNvZGVyc1swXSkpCgpzdGF0aWMgRlRfVUxvbmcKRmNGcmVlVHlwZU1hcENoYXIgKEZjQ2hhcjMyIHVjczQsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKQp7CiAgICBpbnQJCWxvdywgaGlnaCwgbWlkOwogICAgRmNDaGFyMTYJYm1wOwoKICAgIGxvdyA9IDA7CiAgICBoaWdoID0gbWFwLT5uZW50IC0gMTsKICAgIGlmICh1Y3M0IDwgbWFwLT5lbnRbbG93XS5ibXAgfHwgbWFwLT5lbnRbaGlnaF0uYm1wIDwgdWNzNCkKCXJldHVybiB+MDsKICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkKICAgIHsKCW1pZCA9IChoaWdoICsgbG93KSA+PiAxOwoJYm1wID0gbWFwLT5lbnRbbWlkXS5ibXA7CglpZiAodWNzNCA9PSBibXApCgkgICAgcmV0dXJuIChGVF9VTG9uZykgbWFwLT5lbnRbbWlkXS5lbmNvZGU7CglpZiAodWNzNCA8IGJtcCkKCSAgICBoaWdoID0gbWlkOwoJZWxzZQoJICAgIGxvdyA9IG1pZDsKICAgIH0KICAgIGZvciAobWlkID0gbG93OyBtaWQgPD0gaGlnaDsgbWlkKyspCiAgICB7CglpZiAodWNzNCA9PSBtYXAtPmVudFttaWRdLmJtcCkKCSAgICByZXR1cm4gKEZUX1VMb25nKSBtYXAtPmVudFttaWRdLmVuY29kZTsKICAgIH0KICAgIHJldHVybiB+MDsKfQoKLyoKICogTWFwIGEgVUNTNCBnbHlwaCB0byBhIGdseXBoIGluZGV4LiAgVXNlIGFsbCBhdmFpbGFibGUgZW5jb2RpbmcKICogdGFibGVzIHRvIHRyeSBhbmQgZmluZCBvbmUgdGhhdCB3b3Jrcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQKICogdG8gYmUgY2FjaGVkIGJ5IGhpZ2hlciBsZXZlbHMsIHNvIHBlcmZvcm1hbmNlIGlzbid0IGNyaXRpY2FsCiAqLwoKRlRfVUludApGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJICAgIGluaXRpYWwsIG9mZnNldCwgZGVjb2RlOwogICAgRlRfVUludAkgICAgZ2x5cGhpbmRleDsKICAgIEZUX1VMb25nCSAgICBjaGFyY29kZTsKCiAgICBpbml0aWFsID0gMDsKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBjdXJyZW50IGVuY29kaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5jaGFybWFwKQogICAgewoJZm9yICg7IGluaXRpYWwgPCBOVU1fREVDT0RFOyBpbml0aWFsKyspCgkgICAgaWYgKGZjRm9udERlY29kZXJzW2luaXRpYWxdLmVuY29kaW5nID09IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nKQoJCWJyZWFrOwoJaWYgKGluaXRpYWwgPT0gTlVNX0RFQ09ERSkKCSAgICBpbml0aWFsID0gMDsKICAgIH0KICAgIC8qCiAgICAgKiBDaGVjayBlYWNoIGVuY29kaW5nIGZvciB0aGUgZ2x5cGgsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgb25lCiAgICAgKi8KICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgTlVNX0RFQ09ERTsgb2Zmc2V0KyspCiAgICB7CglkZWNvZGUgPSAoaW5pdGlhbCArIG9mZnNldCkgJSBOVU1fREVDT0RFOwoJaWYgKCFmYWNlLT5jaGFybWFwIHx8IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nICE9IGZjRm9udERlY29kZXJzW2RlY29kZV0uZW5jb2RpbmcpCgkgICAgaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKSAhPSAwKQoJCWNvbnRpbnVlOwoJaWYgKGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKQoJewoJICAgIGNoYXJjb2RlID0gRmNGcmVlVHlwZU1hcENoYXIgKHVjczQsIGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKTsKCSAgICBpZiAoY2hhcmNvZGUgPT0gfjApCgkJY29udGludWU7Cgl9CgllbHNlCgkgICAgY2hhcmNvZGUgPSAoRlRfVUxvbmcpIHVjczQ7CglnbHlwaGluZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIGNoYXJjb2RlKTsKCWlmIChnbHlwaGluZGV4KQoJICAgIHJldHVybiBnbHlwaGluZGV4OwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNGcmVlVHlwZUNoZWNrR2x5cGggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCwgCgkJICAgICAgRlRfVUludCBnbHlwaCwgRmNCbGFua3MgKmJsYW5rcykKewogICAgRlRfSW50CSAgICBsb2FkX2ZsYWdzID0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKICAgIEZUX0dseXBoU2xvdCAgICBzbG90OwogICAgCiAgICAvKgogICAgICogV2hlbiB1c2luZyBzY2FsYWJsZSBmb250cywgb25seSByZXBvcnQgdGhvc2UgZ2x5cGhzCiAgICAgKiB3aGljaCBjYW4gYmUgc2NhbGVkOyBvdGhlcndpc2UgdGhvc2UgZm9udHMgd2lsbAogICAgICogb25seSBiZSBhdmFpbGFibGUgYXQgc29tZSBzaXplcywgYW5kIG5ldmVyIHdoZW4KICAgICAqIHRyYW5zZm9ybWVkLiAgQXZvaWQgdGhpcyBieSBzaW1wbHkgcmVwb3J0aW5nIGJpdG1hcC1vbmx5CiAgICAgKiBnbHlwaHMgYXMgbWlzc2luZwogICAgICovCiAgICBpZiAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkKCWxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVA7CiAgICAKICAgIGlmIChGVF9Mb2FkX0dseXBoIChmYWNlLCBnbHlwaCwgbG9hZF9mbGFncykpCglyZXR1cm4gRmNGYWxzZTsKICAgIAogICAgc2xvdCA9IGZhY2UtPmdseXBoOwogICAgaWYgKCFnbHlwaCkKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBzd2l0Y2ggKHNsb3QtPmZvcm1hdCkgewogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgoJLyoKCSAqIEJpdG1hcHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVhc29uYWJsZTsgaWYKCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCgkgKiBjb2RlIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKCSAqLwoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmU6CgkvKgoJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSwoJICovCglpZiAoc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICE9IDApCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qCgkgKiBHbHlwaHMgd2l0aCBubyBjb250b3VycyBhcmUgb25seSBPSyBpZgoJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAoJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBJZiBibGFua3MgaXNuJ3Qgc2V0LAoJICogdGhlbiBhbGxvdyBhbnkgZ2x5cGggdG8gYmUgYmxhbmsKCSAqLwoJaWYgKCFibGFua3MgfHwgRmNCbGFua3NJc01lbWJlciAoYmxhbmtzLCB1Y3M0KSkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyogZmFsbCB0aHJvdWdoIC4uLiAqLwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQ2hhclNldCAqCkZjRnJlZVR5cGVDaGFyU2V0IChGVF9GYWNlIGZhY2UsIEZjQmxhbmtzICpibGFua3MpCnsKICAgIEZjQ2hhcjMyCSAgICBwYWdlLCBvZmYsIG1heCwgdWNzNDsKI2lmZGVmIENIRUNLCiAgICBGY0NoYXIzMgkgICAgZm9udF9tYXggPSAwOwojZW5kaWYKICAgIEZjQ2hhclNldAkgICAgKmZjczsKICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOwogICAgY29uc3QgRmNDaGFyTWFwICptYXA7CiAgICBpbnQJCSAgICBvOwogICAgaW50CQkgICAgaTsKICAgIEZUX1VJbnQJICAgIGdseXBoOwoKICAgIGZjcyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghZmNzKQoJZ290byBiYWlsMDsKICAgIAogICAgZm9yIChvID0gMDsgbyA8IE5VTV9ERUNPREU7IG8rKykKICAgIHsKCWlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbb10uZW5jb2RpbmcpICE9IDApCgkgICAgY29udGludWU7CgltYXAgPSBmY0ZvbnREZWNvZGVyc1tvXS5tYXA7CglpZiAobWFwKQoJewoJICAgIC8qCgkgICAgICogTm9uLVVuaWNvZGUgdGFibGVzIGFyZSBlYXN5OyB0aGVyZSdzIGEgbGlzdCBvZiBhbGwgcG9zc2libGUKCSAgICAgKiBjaGFyYWN0ZXJzCgkgICAgICovCgkgICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bmVudDsgaSsrKQoJICAgIHsKCQl1Y3M0ID0gbWFwLT5lbnRbaV0uYm1wOwoJCWdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIG1hcC0+ZW50W2ldLmVuY29kZSk7CgkJaWYgKGdseXBoICYmIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCBnbHlwaCwgYmxhbmtzKSkKCQl7CgkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKCQkgICAgaWYgKCFsZWFmKQoJCQlnb3RvIGJhaWwxOwoJCSAgICBsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XSB8PSAoMSA8PCAodWNzNCAmIDB4MWYpKTsKI2lmZGVmIENIRUNLCgkJICAgIGlmICh1Y3M0ID4gZm9udF9tYXgpCgkJCWZvbnRfbWF4ID0gdWNzNDsKI2VuZGlmCgkJfQoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBtYXggPSBmY0ZvbnREZWNvZGVyc1tvXS5tYXg7CgkgIAoJICAgIC8qCgkgICAgICogRmluZCB0aGUgZmlyc3QgZW5jb2RlZCBjaGFyYWN0ZXIgaW4gdGhlIGZvbnQKCSAgICAgKi8KCSAgICB1Y3M0ID0gMDsKCSAgICBpZiAoRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIDApKQoJCXVjczQgPSAwOwoJICAgIGVsc2UKCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgMCk7CgoJICAgIGZvciAoOzspCgkgICAgewoJCXBhZ2UgPSB1Y3M0ID4+IDg7CgkJbGVhZiA9IDA7CgkJd2hpbGUgKCh1Y3M0ID4+IDgpID09IHBhZ2UpCgkJewoJCSAgICBnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KTsKCQkgICAgaWYgKGdseXBoICYmIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCAKCQkJCQkJICAgICAgIGdseXBoLCBibGFua3MpKQoJCSAgICB7CgkJCWlmICghbGVhZikKCQkJewoJCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCQkgICAgaWYgKCFsZWFmKQoJCQkJZ290byBiYWlsMTsKCQkJfQoJCQlvZmYgPSB1Y3M0ICYgMHhmZjsKCQkJbGVhZi0+bWFwW29mZiA+PiA1XSB8PSAoMSA8PCAob2ZmICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkJaWYgKHVjczQgPiBmb250X21heCkKCQkJICAgIGZvbnRfbWF4ID0gdWNzNDsKI2VuZGlmCgkJICAgIH0KCQkgICAgdWNzNCsrOwoJCX0KCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgdWNzNCAtIDEpOwoJCWlmICghdWNzNCkKCQkgICAgYnJlYWs7CgkgICAgfQojaWZkZWYgQ0hFQ0sKCSAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDwgMHgxMDAwMDsgdWNzNCsrKQoJICAgIHsKCQlGY0Jvb2wJICAgIEZUX0hhcywgRkNfSGFzOwoKCQlGVF9IYXMgPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgdWNzNCkgIT0gMDsKCQlGQ19IYXMgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoJCWlmIChGVF9IYXMgIT0gRkNfSGFzKQoJCXsKCQkgICAgcHJpbnRmICgiMHglMDh4IEZUIHNheXMgJWQgRkMgc2F5cyAlZFxuIiwgdWNzNCwgRlRfSGFzLCBGQ19IYXMpOwoJCX0KCSAgICB9CiNlbmRpZgoJfQogICAgfQojaWZkZWYgQ0hFQ0sKICAgIHByaW50ZiAoIiVkIGdseXBocyAlZCBlbmNvZGVkXG4iLCAoaW50KSBmYWNlLT5udW1fZ2x5cGhzLCBGY0NoYXJTZXRDb3VudCAoZmNzKSk7CiAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDw9IGZvbnRfbWF4OyB1Y3M0KyspCiAgICB7CglGY0Jvb2wJaGFzX2NoYXIgPSBGY0ZyZWVUeXBlQ2hhckluZGV4IChmYWNlLCB1Y3M0KSAhPSAwOwoJRmNCb29sCWhhc19iaXQgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoKCWlmIChoYXNfY2hhciAmJiAhaGFzX2JpdCkKCSAgICBwcmludGYgKCJCaXRtYXAgbWlzc2luZyBjaGFyIDB4JXhcbiIsIHVjczQpOwoJZWxzZSBpZiAoIWhhc19jaGFyICYmIGhhc19iaXQpCgkgICAgcHJpbnRmICgiQml0bWFwIGV4dHJhIGNoYXIgMHgleFxuIiwgdWNzNCk7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIGZjczsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChmY3MpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgY29uc3QgRmNDaGFyRW50IEFwcGxlUm9tYW5FbnRbXSA9IHsKICAgIHsgMHgwMDIwLCAweDIwIH0sIC8qIFNQQUNFICovCiAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLICovCiAgICB7IDB4MDAyMiwgMHgyMiB9LCAvKiBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04gKi8KICAgIHsgMHgwMDI0LCAweDI0IH0sIC8qIERPTExBUiBTSUdOICovCiAgICB7IDB4MDAyNSwgMHgyNSB9LCAvKiBQRVJDRU5UIFNJR04gKi8KICAgIHsgMHgwMDI2LCAweDI2IH0sIC8qIEFNUEVSU0FORCAqLwogICAgeyAweDAwMjcsIDB4MjcgfSwgLyogQVBPU1RST1BIRSAqLwogICAgeyAweDAwMjgsIDB4MjggfSwgLyogTEVGVCBQQVJFTlRIRVNJUyAqLwogICAgeyAweDAwMjksIDB4MjkgfSwgLyogUklHSFQgUEFSRU5USEVTSVMgKi8KICAgIHsgMHgwMDJBLCAweDJBIH0sIC8qIEFTVEVSSVNLICovCiAgICB7IDB4MDAyQiwgMHgyQiB9LCAvKiBQTFVTIFNJR04gKi8KICAgIHsgMHgwMDJDLCAweDJDIH0sIC8qIENPTU1BICovCiAgICB7IDB4MDAyRCwgMHgyRCB9LCAvKiBIWVBIRU4tTUlOVVMgKi8KICAgIHsgMHgwMDJFLCAweDJFIH0sIC8qIEZVTEwgU1RPUCAqLwogICAgeyAweDAwMkYsIDB4MkYgfSwgLyogU09MSURVUyAqLwogICAgeyAweDAwMzAsIDB4MzAgfSwgLyogRElHSVQgWkVSTyAqLwogICAgeyAweDAwMzEsIDB4MzEgfSwgLyogRElHSVQgT05FICovCiAgICB7IDB4MDAzMiwgMHgzMiB9LCAvKiBESUdJVCBUV08gKi8KICAgIHsgMHgwMDMzLCAweDMzIH0sIC8qIERJR0lUIFRIUkVFICovCiAgICB7IDB4MDAzNCwgMHgzNCB9LCAvKiBESUdJVCBGT1VSICovCiAgICB7IDB4MDAzNSwgMHgzNSB9LCAvKiBESUdJVCBGSVZFICovCiAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVggKi8KICAgIHsgMHgwMDM3LCAweDM3IH0sIC8qIERJR0lUIFNFVkVOICovCiAgICB7IDB4MDAzOCwgMHgzOCB9LCAvKiBESUdJVCBFSUdIVCAqLwogICAgeyAweDAwMzksIDB4MzkgfSwgLyogRElHSVQgTklORSAqLwogICAgeyAweDAwM0EsIDB4M0EgfSwgLyogQ09MT04gKi8KICAgIHsgMHgwMDNCLCAweDNCIH0sIC8qIFNFTUlDT0xPTiAqLwogICAgeyAweDAwM0MsIDB4M0MgfSwgLyogTEVTUy1USEFOIFNJR04gKi8KICAgIHsgMHgwMDNELCAweDNEIH0sIC8qIEVRVUFMUyBTSUdOICovCiAgICB7IDB4MDAzRSwgMHgzRSB9LCAvKiBHUkVBVEVSLVRIQU4gU0lHTiAqLwogICAgeyAweDAwM0YsIDB4M0YgfSwgLyogUVVFU1RJT04gTUFSSyAqLwogICAgeyAweDAwNDAsIDB4NDAgfSwgLyogQ09NTUVSQ0lBTCBBVCAqLwogICAgeyAweDAwNDEsIDB4NDEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSAqLwogICAgeyAweDAwNDIsIDB4NDIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiAqLwogICAgeyAweDAwNDMsIDB4NDMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyAqLwogICAgeyAweDAwNDQsIDB4NDQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCAqLwogICAgeyAweDAwNDUsIDB4NDUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSAqLwogICAgeyAweDAwNDYsIDB4NDYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiAqLwogICAgeyAweDAwNDcsIDB4NDcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyAqLwogICAgeyAweDAwNDgsIDB4NDggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCAqLwogICAgeyAweDAwNDksIDB4NDkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSAqLwogICAgeyAweDAwNEEsIDB4NEEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSiAqLwogICAgeyAweDAwNEIsIDB4NEIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyAqLwogICAgeyAweDAwNEMsIDB4NEMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCAqLwogICAgeyAweDAwNEQsIDB4NEQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSAqLwogICAgeyAweDAwNEUsIDB4NEUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiAqLwogICAgeyAweDAwNEYsIDB4NEYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyAqLwogICAgeyAweDAwNTAsIDB4NTAgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCAqLwogICAgeyAweDAwNTEsIDB4NTEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUSAqLwogICAgeyAweDAwNTIsIDB4NTIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiAqLwogICAgeyAweDAwNTMsIDB4NTMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyAqLwogICAgeyAweDAwNTQsIDB4NTQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCAqLwogICAgeyAweDAwNTUsIDB4NTUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSAqLwogICAgeyAweDAwNTYsIDB4NTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgViAqLwogICAgeyAweDAwNTcsIDB4NTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyAqLwogICAgeyAweDAwNTgsIDB4NTggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCAqLwogICAgeyAweDAwNTksIDB4NTkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSAqLwogICAgeyAweDAwNUEsIDB4NUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiAqLwogICAgeyAweDAwNUIsIDB4NUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCAqLwogICAgeyAweDAwNUMsIDB4NUMgfSwgLyogUkVWRVJTRSBTT0xJRFVTICovCiAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqLwogICAgeyAweDAwNUUsIDB4NUUgfSwgLyogQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FICovCiAgICB7IDB4MDA2MCwgMHg2MCB9LCAvKiBHUkFWRSBBQ0NFTlQgKi8KICAgIHsgMHgwMDYxLCAweDYxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBICovCiAgICB7IDB4MDA2MiwgMHg2MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQiAqLwogICAgeyAweDAwNjMsIDB4NjMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgKi8KICAgIHsgMHgwMDY0LCAweDY0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBEICovCiAgICB7IDB4MDA2NSwgMHg2NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSAqLwogICAgeyAweDAwNjYsIDB4NjYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgKi8KICAgIHsgMHgwMDY3LCAweDY3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBHICovCiAgICB7IDB4MDA2OCwgMHg2OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSCAqLwogICAgeyAweDAwNjksIDB4NjkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgKi8KICAgIHsgMHgwMDZBLCAweDZBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBKICovCiAgICB7IDB4MDA2QiwgMHg2QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqLwogICAgeyAweDAwNkMsIDB4NkMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEwgKi8KICAgIHsgMHgwMDZELCAweDZEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBNICovCiAgICB7IDB4MDA2RSwgMHg2RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiAqLwogICAgeyAweDAwNkYsIDB4NkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gKi8KICAgIHsgMHgwMDcwLCAweDcwIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBQICovCiAgICB7IDB4MDA3MSwgMHg3MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUSAqLwogICAgeyAweDAwNzIsIDB4NzIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFIgKi8KICAgIHsgMHgwMDczLCAweDczIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBTICovCiAgICB7IDB4MDA3NCwgMHg3NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVCAqLwogICAgeyAweDAwNzUsIDB4NzUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgKi8KICAgIHsgMHgwMDc2LCAweDc2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBWICovCiAgICB7IDB4MDA3NywgMHg3NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVyAqLwogICAgeyAweDAwNzgsIDB4NzggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFggKi8KICAgIHsgMHgwMDc5LCAweDc5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBZICovCiAgICB7IDB4MDA3QSwgMHg3QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWiAqLwogICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUICovCiAgICB7IDB4MDA3QywgMHg3QyB9LCAvKiBWRVJUSUNBTCBMSU5FICovCiAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUICovCiAgICB7IDB4MDA3RSwgMHg3RSB9LCAvKiBUSUxERSAqLwogICAgeyAweDAwQTAsIDB4Q0EgfSwgLyogTk8tQlJFQUsgU1BBQ0UgKi8KICAgIHsgMHgwMEExLCAweEMxIH0sIC8qIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEEyLCAweEEyIH0sIC8qIENFTlQgU0lHTiAqLwogICAgeyAweDAwQTMsIDB4QTMgfSwgLyogUE9VTkQgU0lHTiAqLwogICAgeyAweDAwQTUsIDB4QjQgfSwgLyogWUVOIFNJR04gKi8KICAgIHsgMHgwMEE3LCAweEE0IH0sIC8qIFNFQ1RJT04gU0lHTiAqLwogICAgeyAweDAwQTgsIDB4QUMgfSwgLyogRElBRVJFU0lTICovCiAgICB7IDB4MDBBOSwgMHhBOSB9LCAvKiBDT1BZUklHSFQgU0lHTiAqLwogICAgeyAweDAwQUEsIDB4QkIgfSwgLyogRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KICAgIHsgMHgwMEFCLCAweEM3IH0sIC8qIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDBBQywgMHhDMiB9LCAvKiBOT1QgU0lHTiAqLwogICAgeyAweDAwQUUsIDB4QTggfSwgLyogUkVHSVNURVJFRCBTSUdOICovCiAgICB7IDB4MDBBRiwgMHhGOCB9LCAvKiBNQUNST04gKi8KICAgIHsgMHgwMEIwLCAweEExIH0sIC8qIERFR1JFRSBTSUdOICovCiAgICB7IDB4MDBCMSwgMHhCMSB9LCAvKiBQTFVTLU1JTlVTIFNJR04gKi8KICAgIHsgMHgwMEI0LCAweEFCIH0sIC8qIEFDVVRFIEFDQ0VOVCAqLwogICAgeyAweDAwQjUsIDB4QjUgfSwgLyogTUlDUk8gU0lHTiAqLwogICAgeyAweDAwQjYsIDB4QTYgfSwgLyogUElMQ1JPVyBTSUdOICovCiAgICB7IDB4MDBCNywgMHhFMSB9LCAvKiBNSURETEUgRE9UICovCiAgICB7IDB4MDBCOCwgMHhGQyB9LCAvKiBDRURJTExBICovCiAgICB7IDB4MDBCQSwgMHhCQyB9LCAvKiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KICAgIHsgMHgwMEJCLCAweEM4IH0sIC8qIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwQkYsIDB4QzAgfSwgLyogSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqLwogICAgeyAweDAwQzAsIDB4Q0IgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDMSwgMHhFNyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEMyLCAweEU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDMywgMHhDQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEM0LCAweDgwIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEM1LCAweDgxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDBDNiwgMHhBRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLwogICAgeyAweDAwQzcsIDB4ODIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KICAgIHsgMHgwMEM4LCAweEU5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQzksIDB4ODMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDQSwgMHhFNiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQ0IsIDB4RTggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwQ0MsIDB4RUQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDRCwgMHhFQSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMENFLCAweEVCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDRiwgMHhFQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBEMSwgMHg4NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEQyLCAweEYxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRDMsIDB4RUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBENCwgMHhFRiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRDUsIDB4Q0QgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFICovCiAgICB7IDB4MDBENiwgMHg4NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBEOCwgMHhBRiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovCiAgICB7IDB4MDBEOSwgMHhGNCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMERBLCAweEYyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwREIsIDB4RjMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMERDLCAweDg2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMERGLCAweEE3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTICovCiAgICB7IDB4MDBFMCwgMHg4OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFMSwgMHg4NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFMiwgMHg4OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEUzLCAweDhCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEU0LCAweDhBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBFNSwgMHg4QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMEU2LCAweEJFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBRSAqLwogICAgeyAweDAwRTcsIDB4OEQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCiAgICB7IDB4MDBFOCwgMHg4RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFOSwgMHg4RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFQSwgMHg5MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEVCLCAweDkxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBFQywgMHg5MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFRCwgMHg5MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFRSwgMHg5NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEVGLCAweDk1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGMSwgMHg5NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFICovCiAgICB7IDB4MDBGMiwgMHg5OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBGMywgMHg5NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBGNCwgMHg5OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEY1LCAweDlCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEY2LCAweDlBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGNywgMHhENiB9LCAvKiBESVZJU0lPTiBTSUdOICovCiAgICB7IDB4MDBGOCwgMHhCRiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLwogICAgeyAweDAwRjksIDB4OUQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRkEsIDB4OUMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRkIsIDB4OUUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBGQywgMHg5RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRkYsIDB4RDggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMTMxLCAweEY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkgKi8KICAgIHsgMHgwMTUyLCAweENFIH0sIC8qIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UgKi8KICAgIHsgMHgwMTUzLCAweENGIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIE9FICovCiAgICB7IDB4MDE3OCwgMHhEOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDE5MiwgMHhDNCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sgKi8KICAgIHsgMHgwMkM2LCAweEY2IH0sIC8qIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVCAqLwogICAgeyAweDAyQzcsIDB4RkYgfSwgLyogQ0FST04gKi8KICAgIHsgMHgwMkQ4LCAweEY5IH0sIC8qIEJSRVZFICovCiAgICB7IDB4MDJEOSwgMHhGQSB9LCAvKiBET1QgQUJPVkUgKi8KICAgIHsgMHgwMkRBLCAweEZCIH0sIC8qIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMkRCLCAweEZFIH0sIC8qIE9HT05FSyAqLwogICAgeyAweDAyREMsIDB4RjcgfSwgLyogU01BTEwgVElMREUgKi8KICAgIHsgMHgwMkRELCAweEZEIH0sIC8qIERPVUJMRSBBQ1VURSBBQ0NFTlQgKi8KICAgIHsgMHgwM0E5LCAweEJEIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBICovCiAgICB7IDB4MDNDMCwgMHhCOSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkgKi8KICAgIHsgMHgyMDEzLCAweEQwIH0sIC8qIEVOIERBU0ggKi8KICAgIHsgMHgyMDE0LCAweEQxIH0sIC8qIEVNIERBU0ggKi8KICAgIHsgMHgyMDE4LCAweEQ0IH0sIC8qIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxOSwgMHhENSB9LCAvKiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFBLCAweEUyIH0sIC8qIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUMsIDB4RDIgfSwgLyogTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFELCAweEQzIH0sIC8qIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUUsIDB4RTMgfSwgLyogRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAyMCwgMHhBMCB9LCAvKiBEQUdHRVIgKi8KICAgIHsgMHgyMDIxLCAweEUwIH0sIC8qIERPVUJMRSBEQUdHRVIgKi8KICAgIHsgMHgyMDIyLCAweEE1IH0sIC8qIEJVTExFVCAqLwogICAgeyAweDIwMjYsIDB4QzkgfSwgLyogSE9SSVpPTlRBTCBFTExJUFNJUyAqLwogICAgeyAweDIwMzAsIDB4RTQgfSwgLyogUEVSIE1JTExFIFNJR04gKi8KICAgIHsgMHgyMDM5LCAweERDIH0sIC8qIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAzQSwgMHhERCB9LCAvKiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDQ0LCAweERBIH0sIC8qIEZSQUNUSU9OIFNMQVNIICovCiAgICB7IDB4MjBBQywgMHhEQiB9LCAvKiBFVVJPIFNJR04gKi8KICAgIHsgMHgyMTIyLCAweEFBIH0sIC8qIFRSQURFIE1BUksgU0lHTiAqLwogICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KICAgIHsgMHgyMjA2LCAweEM2IH0sIC8qIElOQ1JFTUVOVCAqLwogICAgeyAweDIyMEYsIDB4QjggfSwgLyogTi1BUlkgUFJPRFVDVCAqLwogICAgeyAweDIyMTEsIDB4QjcgfSwgLyogTi1BUlkgU1VNTUFUSU9OICovCiAgICB7IDB4MjIxQSwgMHhDMyB9LCAvKiBTUVVBUkUgUk9PVCAqLwogICAgeyAweDIyMUUsIDB4QjAgfSwgLyogSU5GSU5JVFkgKi8KICAgIHsgMHgyMjJCLCAweEJBIH0sIC8qIElOVEVHUkFMICovCiAgICB7IDB4MjI0OCwgMHhDNSB9LCAvKiBBTE1PU1QgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjYwLCAweEFEIH0sIC8qIE5PVCBFUVVBTCBUTyAqLwogICAgeyAweDIyNjQsIDB4QjIgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPICovCiAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8gKi8KICAgIHsgMHgyNUNBLCAweEQ3IH0sIC8qIExPWkVOR0UgKi8KICAgIHsgMHhGOEZGLCAweEYwIH0sIC8qIEFwcGxlIGxvZ28gKi8KICAgIHsgMHhGQjAxLCAweERFIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEZJICovCiAgICB7IDB4RkIwMiwgMHhERiB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGTCAqLwp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBcHBsZVJvbWFuID0gewogICAgQXBwbGVSb21hbkVudCwKICAgIHNpemVvZiAoQXBwbGVSb21hbkVudCkgLyBzaXplb2YgKEFwcGxlUm9tYW5FbnRbMF0pCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyRW50IEFkb2JlU3ltYm9sRW50W10gPSB7CiAgICB7IDB4MDAyMCwgMHgyMCB9LCAvKiBTUEFDRQkjIHNwYWNlICovCiAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLCSMgZXhjbGFtICovCiAgICB7IDB4MDAyMywgMHgyMyB9LCAvKiBOVU1CRVIgU0lHTgkjIG51bWJlcnNpZ24gKi8KICAgIHsgMHgwMDI1LCAweDI1IH0sIC8qIFBFUkNFTlQgU0lHTgkjIHBlcmNlbnQgKi8KICAgIHsgMHgwMDI2LCAweDI2IH0sIC8qIEFNUEVSU0FORAkjIGFtcGVyc2FuZCAqLwogICAgeyAweDAwMjgsIDB4MjggfSwgLyogTEVGVCBQQVJFTlRIRVNJUwkjIHBhcmVubGVmdCAqLwogICAgeyAweDAwMjksIDB4MjkgfSwgLyogUklHSFQgUEFSRU5USEVTSVMJIyBwYXJlbnJpZ2h0ICovCiAgICB7IDB4MDAyQiwgMHgyQiB9LCAvKiBQTFVTIFNJR04JIyBwbHVzICovCiAgICB7IDB4MDAyQywgMHgyQyB9LCAvKiBDT01NQQkjIGNvbW1hICovCiAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AJIyBwZXJpb2QgKi8KICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMJIyBzbGFzaCAqLwogICAgeyAweDAwMzAsIDB4MzAgfSwgLyogRElHSVQgWkVSTwkjIHplcm8gKi8KICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORQkjIG9uZSAqLwogICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPCSMgdHdvICovCiAgICB7IDB4MDAzMywgMHgzMyB9LCAvKiBESUdJVCBUSFJFRQkjIHRocmVlICovCiAgICB7IDB4MDAzNCwgMHgzNCB9LCAvKiBESUdJVCBGT1VSCSMgZm91ciAqLwogICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRQkjIGZpdmUgKi8KICAgIHsgMHgwMDM2LCAweDM2IH0sIC8qIERJR0lUIFNJWAkjIHNpeCAqLwogICAgeyAweDAwMzcsIDB4MzcgfSwgLyogRElHSVQgU0VWRU4JIyBzZXZlbiAqLwogICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQJIyBlaWdodCAqLwogICAgeyAweDAwMzksIDB4MzkgfSwgLyogRElHSVQgTklORQkjIG5pbmUgKi8KICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OCSMgY29sb24gKi8KICAgIHsgMHgwMDNCLCAweDNCIH0sIC8qIFNFTUlDT0xPTgkjIHNlbWljb2xvbiAqLwogICAgeyAweDAwM0MsIDB4M0MgfSwgLyogTEVTUy1USEFOIFNJR04JIyBsZXNzICovCiAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTgkjIGVxdWFsICovCiAgICB7IDB4MDAzRSwgMHgzRSB9LCAvKiBHUkVBVEVSLVRIQU4gU0lHTgkjIGdyZWF0ZXIgKi8KICAgIHsgMHgwMDNGLCAweDNGIH0sIC8qIFFVRVNUSU9OIE1BUksJIyBxdWVzdGlvbiAqLwogICAgeyAweDAwNUIsIDB4NUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVAkjIGJyYWNrZXRsZWZ0ICovCiAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAkjIGJyYWNrZXRyaWdodCAqLwogICAgeyAweDAwNUYsIDB4NUYgfSwgLyogTE9XIExJTkUJIyB1bmRlcnNjb3JlICovCiAgICB7IDB4MDA3QiwgMHg3QiB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQJIyBicmFjZWxlZnQgKi8KICAgIHsgMHgwMDdDLCAweDdDIH0sIC8qIFZFUlRJQ0FMIExJTkUJIyBiYXIgKi8KICAgIHsgMHgwMDdELCAweDdEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQJIyBicmFjZXJpZ2h0ICovCiAgICB7IDB4MDBBMCwgMHgyMCB9LCAvKiBOTy1CUkVBSyBTUEFDRQkjIHNwYWNlICovCiAgICB7IDB4MDBBQywgMHhEOCB9LCAvKiBOT1QgU0lHTgkjIGxvZ2ljYWxub3QgKi8KICAgIHsgMHgwMEIwLCAweEIwIH0sIC8qIERFR1JFRSBTSUdOCSMgZGVncmVlICovCiAgICB7IDB4MDBCMSwgMHhCMSB9LCAvKiBQTFVTLU1JTlVTIFNJR04JIyBwbHVzbWludXMgKi8KICAgIHsgMHgwMEI1LCAweDZEIH0sIC8qIE1JQ1JPIFNJR04JIyBtdSAqLwogICAgeyAweDAwRDcsIDB4QjQgfSwgLyogTVVMVElQTElDQVRJT04gU0lHTgkjIG11bHRpcGx5ICovCiAgICB7IDB4MDBGNywgMHhCOCB9LCAvKiBESVZJU0lPTiBTSUdOCSMgZGl2aWRlICovCiAgICB7IDB4MDE5MiwgMHhBNiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sJIyBmbG9yaW4gKi8KICAgIHsgMHgwMzkxLCAweDQxIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCSMgQWxwaGEgKi8KICAgIHsgMHgwMzkyLCAweDQyIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEJIyBCZXRhICovCiAgICB7IDB4MDM5MywgMHg0NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQkjIEdhbW1hICovCiAgICB7IDB4MDM5NCwgMHg0NCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQkjIERlbHRhICovCiAgICB7IDB4MDM5NSwgMHg0NSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCSMgRXBzaWxvbiAqLwogICAgeyAweDAzOTYsIDB4NUEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQkjIFpldGEgKi8KICAgIHsgMHgwMzk3LCAweDQ4IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQkjIEV0YSAqLwogICAgeyAweDAzOTgsIDB4NTEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEJIyBUaGV0YSAqLwogICAgeyAweDAzOTksIDB4NDkgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQkjIElvdGEgKi8KICAgIHsgMHgwMzlBLCAweDRCIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCSMgS2FwcGEgKi8KICAgIHsgMHgwMzlCLCAweDRDIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCSMgTGFtYmRhICovCiAgICB7IDB4MDM5QywgMHg0RCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQkjIE11ICovCiAgICB7IDB4MDM5RCwgMHg0RSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQkjIE51ICovCiAgICB7IDB4MDM5RSwgMHg1OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQkjIFhpICovCiAgICB7IDB4MDM5RiwgMHg0RiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCSMgT21pY3JvbiAqLwogICAgeyAweDAzQTAsIDB4NTAgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkJIyBQaSAqLwogICAgeyAweDAzQTEsIDB4NTIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCSMgUmhvICovCiAgICB7IDB4MDNBMywgMHg1MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQkjIFNpZ21hICovCiAgICB7IDB4MDNBNCwgMHg1NCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUJIyBUYXUgKi8KICAgIHsgMHgwM0E1LCAweDU1IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04JIyBVcHNpbG9uICovCiAgICB7IDB4MDNBNiwgMHg0NiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkJIyBQaGkgKi8KICAgIHsgMHgwM0E3LCAweDQzIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQkjIENoaSAqLwogICAgeyAweDAzQTgsIDB4NTkgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCSMgUHNpICovCiAgICB7IDB4MDNBOSwgMHg1NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQkjIE9tZWdhICovCiAgICB7IDB4MDNCMSwgMHg2MSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEJIyBhbHBoYSAqLwogICAgeyAweDAzQjIsIDB4NjIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEJIyBiZXRhICovCiAgICB7IDB4MDNCMywgMHg2NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEJIyBnYW1tYSAqLwogICAgeyAweDAzQjQsIDB4NjQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCSMgZGVsdGEgKi8KICAgIHsgMHgwM0I1LCAweDY1IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCSMgZXBzaWxvbiAqLwogICAgeyAweDAzQjYsIDB4N0EgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEJIyB6ZXRhICovCiAgICB7IDB4MDNCNywgMHg2OCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCSMgZXRhICovCiAgICB7IDB4MDNCOCwgMHg3MSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEJIyB0aGV0YSAqLwogICAgeyAweDAzQjksIDB4NjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIElPVEEJIyBpb3RhICovCiAgICB7IDB4MDNCQSwgMHg2QiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEJIyBrYXBwYSAqLwogICAgeyAweDAzQkIsIDB4NkMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCSMgbGFtYmRhICovCiAgICB7IDB4MDNCQywgMHg2RCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTVUJIyBtdSAqLwogICAgeyAweDAzQkQsIDB4NkUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE5VCSMgbnUgKi8KICAgIHsgMHgwM0JFLCAweDc4IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBYSQkjIHhpICovCiAgICB7IDB4MDNCRiwgMHg2RiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgkjIG9taWNyb24gKi8KICAgIHsgMHgwM0MwLCAweDcwIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSQkjIHBpICovCiAgICB7IDB4MDNDMSwgMHg3MiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCSMgcmhvICovCiAgICB7IDB4MDNDMiwgMHg1NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEJIyBzaWdtYTEgKi8KICAgIHsgMHgwM0MzLCAweDczIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQkjIHNpZ21hICovCiAgICB7IDB4MDNDNCwgMHg3NCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCSMgdGF1ICovCiAgICB7IDB4MDNDNSwgMHg3NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgkjIHVwc2lsb24gKi8KICAgIHsgMHgwM0M2LCAweDY2IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkJIyBwaGkgKi8KICAgIHsgMHgwM0M3LCAweDYzIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkJIyBjaGkgKi8KICAgIHsgMHgwM0M4LCAweDc5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kJIyBwc2kgKi8KICAgIHsgMHgwM0M5LCAweDc3IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQkjIG9tZWdhICovCiAgICB7IDB4MDNEMSwgMHg0QSB9LCAvKiBHUkVFSyBUSEVUQSBTWU1CT0wJIyB0aGV0YTEgKi8KICAgIHsgMHgwM0QyLCAweEExIH0sIC8qIEdSRUVLIFVQU0lMT04gV0lUSCBIT09LIFNZTUJPTAkjIFVwc2lsb24xICovCiAgICB7IDB4MDNENSwgMHg2QSB9LCAvKiBHUkVFSyBQSEkgU1lNQk9MCSMgcGhpMSAqLwogICAgeyAweDAzRDYsIDB4NzYgfSwgLyogR1JFRUsgUEkgU1lNQk9MCSMgb21lZ2ExICovCiAgICB7IDB4MjAyMiwgMHhCNyB9LCAvKiBCVUxMRVQJIyBidWxsZXQgKi8KICAgIHsgMHgyMDI2LCAweEJDIH0sIC8qIEhPUklaT05UQUwgRUxMSVBTSVMJIyBlbGxpcHNpcyAqLwogICAgeyAweDIwMzIsIDB4QTIgfSwgLyogUFJJTUUJIyBtaW51dGUgKi8KICAgIHsgMHgyMDMzLCAweEIyIH0sIC8qIERPVUJMRSBQUklNRQkjIHNlY29uZCAqLwogICAgeyAweDIwNDQsIDB4QTQgfSwgLyogRlJBQ1RJT04gU0xBU0gJIyBmcmFjdGlvbiAqLwogICAgeyAweDIwQUMsIDB4QTAgfSwgLyogRVVSTyBTSUdOCSMgRXVybyAqLwogICAgeyAweDIxMTEsIDB4QzEgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgSQkjIElmcmFrdHVyICovCiAgICB7IDB4MjExOCwgMHhDMyB9LCAvKiBTQ1JJUFQgQ0FQSVRBTCBQCSMgd2VpZXJzdHJhc3MgKi8KICAgIHsgMHgyMTFDLCAweEMyIH0sIC8qIEJMQUNLLUxFVFRFUiBDQVBJVEFMIFIJIyBSZnJha3R1ciAqLwogICAgeyAweDIxMjYsIDB4NTcgfSwgLyogT0hNIFNJR04JIyBPbWVnYSAqLwogICAgeyAweDIxMzUsIDB4QzAgfSwgLyogQUxFRiBTWU1CT0wJIyBhbGVwaCAqLwogICAgeyAweDIxOTAsIDB4QUMgfSwgLyogTEVGVFdBUkRTIEFSUk9XCSMgYXJyb3dsZWZ0ICovCiAgICB7IDB4MjE5MSwgMHhBRCB9LCAvKiBVUFdBUkRTIEFSUk9XCSMgYXJyb3d1cCAqLwogICAgeyAweDIxOTIsIDB4QUUgfSwgLyogUklHSFRXQVJEUyBBUlJPVwkjIGFycm93cmlnaHQgKi8KICAgIHsgMHgyMTkzLCAweEFGIH0sIC8qIERPV05XQVJEUyBBUlJPVwkjIGFycm93ZG93biAqLwogICAgeyAweDIxOTQsIDB4QUIgfSwgLyogTEVGVCBSSUdIVCBBUlJPVwkjIGFycm93Ym90aCAqLwogICAgeyAweDIxQjUsIDB4QkYgfSwgLyogRE9XTldBUkRTIEFSUk9XIFdJVEggQ09STkVSIExFRlRXQVJEUwkjIGNhcnJpYWdlcmV0dXJuICovCiAgICB7IDB4MjFEMCwgMHhEQyB9LCAvKiBMRUZUV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxsZWZ0ICovCiAgICB7IDB4MjFEMSwgMHhERCB9LCAvKiBVUFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsdXAgKi8KICAgIHsgMHgyMUQyLCAweERFIH0sIC8qIFJJR0hUV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxyaWdodCAqLwogICAgeyAweDIxRDMsIDB4REYgfSwgLyogRE9XTldBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsZG93biAqLwogICAgeyAweDIxRDQsIDB4REIgfSwgLyogTEVGVCBSSUdIVCBET1VCTEUgQVJST1cJIyBhcnJvd2RibGJvdGggKi8KICAgIHsgMHgyMjAwLCAweDIyIH0sIC8qIEZPUiBBTEwJIyB1bml2ZXJzYWwgKi8KICAgIHsgMHgyMjAyLCAweEI2IH0sIC8qIFBBUlRJQUwgRElGRkVSRU5USUFMCSMgcGFydGlhbGRpZmYgKi8KICAgIHsgMHgyMjAzLCAweDI0IH0sIC8qIFRIRVJFIEVYSVNUUwkjIGV4aXN0ZW50aWFsICovCiAgICB7IDB4MjIwNSwgMHhDNiB9LCAvKiBFTVBUWSBTRVQJIyBlbXB0eXNldCAqLwogICAgeyAweDIyMDYsIDB4NDQgfSwgLyogSU5DUkVNRU5UCSMgRGVsdGEgKi8KICAgIHsgMHgyMjA3LCAweEQxIH0sIC8qIE5BQkxBCSMgZ3JhZGllbnQgKi8KICAgIHsgMHgyMjA4LCAweENFIH0sIC8qIEVMRU1FTlQgT0YJIyBlbGVtZW50ICovCiAgICB7IDB4MjIwOSwgMHhDRiB9LCAvKiBOT1QgQU4gRUxFTUVOVCBPRgkjIG5vdGVsZW1lbnQgKi8KICAgIHsgMHgyMjBCLCAweDI3IH0sIC8qIENPTlRBSU5TIEFTIE1FTUJFUgkjIHN1Y2h0aGF0ICovCiAgICB7IDB4MjIwRiwgMHhENSB9LCAvKiBOLUFSWSBQUk9EVUNUCSMgcHJvZHVjdCAqLwogICAgeyAweDIyMTEsIDB4RTUgfSwgLyogTi1BUlkgU1VNTUFUSU9OCSMgc3VtbWF0aW9uICovCiAgICB7IDB4MjIxMiwgMHgyRCB9LCAvKiBNSU5VUyBTSUdOCSMgbWludXMgKi8KICAgIHsgMHgyMjE1LCAweEE0IH0sIC8qIERJVklTSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KICAgIHsgMHgyMjE3LCAweDJBIH0sIC8qIEFTVEVSSVNLIE9QRVJBVE9SCSMgYXN0ZXJpc2ttYXRoICovCiAgICB7IDB4MjIxQSwgMHhENiB9LCAvKiBTUVVBUkUgUk9PVAkjIHJhZGljYWwgKi8KICAgIHsgMHgyMjFELCAweEI1IH0sIC8qIFBST1BPUlRJT05BTCBUTwkjIHByb3BvcnRpb25hbCAqLwogICAgeyAweDIyMUUsIDB4QTUgfSwgLyogSU5GSU5JVFkJIyBpbmZpbml0eSAqLwogICAgeyAweDIyMjAsIDB4RDAgfSwgLyogQU5HTEUJIyBhbmdsZSAqLwogICAgeyAweDIyMjcsIDB4RDkgfSwgLyogTE9HSUNBTCBBTkQJIyBsb2dpY2FsYW5kICovCiAgICB7IDB4MjIyOCwgMHhEQSB9LCAvKiBMT0dJQ0FMIE9SCSMgbG9naWNhbG9yICovCiAgICB7IDB4MjIyOSwgMHhDNyB9LCAvKiBJTlRFUlNFQ1RJT04JIyBpbnRlcnNlY3Rpb24gKi8KICAgIHsgMHgyMjJBLCAweEM4IH0sIC8qIFVOSU9OCSMgdW5pb24gKi8KICAgIHsgMHgyMjJCLCAweEYyIH0sIC8qIElOVEVHUkFMCSMgaW50ZWdyYWwgKi8KICAgIHsgMHgyMjM0LCAweDVDIH0sIC8qIFRIRVJFRk9SRQkjIHRoZXJlZm9yZSAqLwogICAgeyAweDIyM0MsIDB4N0UgfSwgLyogVElMREUgT1BFUkFUT1IJIyBzaW1pbGFyICovCiAgICB7IDB4MjI0NSwgMHg0MCB9LCAvKiBBUFBST1hJTUFURUxZIEVRVUFMIFRPCSMgY29uZ3J1ZW50ICovCiAgICB7IDB4MjI0OCwgMHhCQiB9LCAvKiBBTE1PU1QgRVFVQUwgVE8JIyBhcHByb3hlcXVhbCAqLwogICAgeyAweDIyNjAsIDB4QjkgfSwgLyogTk9UIEVRVUFMIFRPCSMgbm90ZXF1YWwgKi8KICAgIHsgMHgyMjYxLCAweEJBIH0sIC8qIElERU5USUNBTCBUTwkjIGVxdWl2YWxlbmNlICovCiAgICB7IDB4MjI2NCwgMHhBMyB9LCAvKiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8JIyBsZXNzZXF1YWwgKi8KICAgIHsgMHgyMjY1LCAweEIzIH0sIC8qIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTwkjIGdyZWF0ZXJlcXVhbCAqLwogICAgeyAweDIyODIsIDB4Q0MgfSwgLyogU1VCU0VUIE9GCSMgcHJvcGVyc3Vic2V0ICovCiAgICB7IDB4MjI4MywgMHhDOSB9LCAvKiBTVVBFUlNFVCBPRgkjIHByb3BlcnN1cGVyc2V0ICovCiAgICB7IDB4MjI4NCwgMHhDQiB9LCAvKiBOT1QgQSBTVUJTRVQgT0YJIyBub3RzdWJzZXQgKi8KICAgIHsgMHgyMjg2LCAweENEIH0sIC8qIFNVQlNFVCBPRiBPUiBFUVVBTCBUTwkjIHJlZmxleHN1YnNldCAqLwogICAgeyAweDIyODcsIDB4Q0EgfSwgLyogU1VQRVJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdXBlcnNldCAqLwogICAgeyAweDIyOTUsIDB4QzUgfSwgLyogQ0lSQ0xFRCBQTFVTCSMgY2lyY2xlcGx1cyAqLwogICAgeyAweDIyOTcsIDB4QzQgfSwgLyogQ0lSQ0xFRCBUSU1FUwkjIGNpcmNsZW11bHRpcGx5ICovCiAgICB7IDB4MjJBNSwgMHg1RSB9LCAvKiBVUCBUQUNLCSMgcGVycGVuZGljdWxhciAqLwogICAgeyAweDIyQzUsIDB4RDcgfSwgLyogRE9UIE9QRVJBVE9SCSMgZG90bWF0aCAqLwogICAgeyAweDIzMjAsIDB4RjMgfSwgLyogVE9QIEhBTEYgSU5URUdSQUwJIyBpbnRlZ3JhbHRwICovCiAgICB7IDB4MjMyMSwgMHhGNSB9LCAvKiBCT1RUT00gSEFMRiBJTlRFR1JBTAkjIGludGVncmFsYnQgKi8KICAgIHsgMHgyMzI5LCAweEUxIH0sIC8qIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVAkjIGFuZ2xlbGVmdCAqLwogICAgeyAweDIzMkEsIDB4RjEgfSwgLyogUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVAkjIGFuZ2xlcmlnaHQgKi8KICAgIHsgMHgyNUNBLCAweEUwIH0sIC8qIExPWkVOR0UJIyBsb3plbmdlICovCiAgICB7IDB4MjY2MCwgMHhBQSB9LCAvKiBCTEFDSyBTUEFERSBTVUlUCSMgc3BhZGUgKi8KICAgIHsgMHgyNjYzLCAweEE3IH0sIC8qIEJMQUNLIENMVUIgU1VJVAkjIGNsdWIgKi8KICAgIHsgMHgyNjY1LCAweEE5IH0sIC8qIEJMQUNLIEhFQVJUIFNVSVQJIyBoZWFydCAqLwogICAgeyAweDI2NjYsIDB4QTggfSwgLyogQkxBQ0sgRElBTU9ORCBTVUlUCSMgZGlhbW9uZCAqLwogICAgeyAweEY2RDksIDB4RDMgfSwgLyogQ09QWVJJR0hUIFNJR04gU0VSSUYJIyBjb3B5cmlnaHRzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY2REEsIDB4RDIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNFUklGCSMgcmVnaXN0ZXJzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY2REIsIDB4RDQgfSwgLyogVFJBREUgTUFSSyBTSUdOIFNFUklGCSMgdHJhZGVtYXJrc2VyaWYgKENVUykgKi8KICAgIHsgMHhGOEU1LCAweDYwIH0sIC8qIFJBRElDQUwgRVhURU5ERVIJIyByYWRpY2FsZXggKENVUykgKi8KICAgIHsgMHhGOEU2LCAweEJEIH0sIC8qIFZFUlRJQ0FMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3d2ZXJ0ZXggKENVUykgKi8KICAgIHsgMHhGOEU3LCAweEJFIH0sIC8qIEhPUklaT05UQUwgQVJST1cgRVhURU5ERVIJIyBhcnJvd2hvcml6ZXggKENVUykgKi8KICAgIHsgMHhGOEU4LCAweEUyIH0sIC8qIFJFR0lTVEVSRUQgU0lHTiBTQU5TIFNFUklGCSMgcmVnaXN0ZXJzYW5zIChDVVMpICovCiAgICB7IDB4RjhFOSwgMHhFMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTQU5TIFNFUklGCSMgY29weXJpZ2h0c2FucyAoQ1VTKSAqLwogICAgeyAweEY4RUEsIDB4RTQgfSwgLyogVFJBREUgTUFSSyBTSUdOIFNBTlMgU0VSSUYJIyB0cmFkZW1hcmtzYW5zIChDVVMpICovCiAgICB7IDB4RjhFQiwgMHhFNiB9LCAvKiBMRUZUIFBBUkVOIFRPUAkjIHBhcmVubGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhFQywgMHhFNyB9LCAvKiBMRUZUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5sZWZ0ZXggKENVUykgKi8KICAgIHsgMHhGOEVELCAweEU4IH0sIC8qIExFRlQgUEFSRU4gQk9UVE9NCSMgcGFyZW5sZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEVFLCAweEU5IH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgVE9QCSMgYnJhY2tldGxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RUYsIDB4RUEgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRsZWZ0ZXggKENVUykgKi8KICAgIHsgMHhGOEYwLCAweEVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2tldGxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RjEsIDB4RUMgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIFRPUAkjIGJyYWNlbGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhGMiwgMHhFRCB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VsZWZ0bWlkIChDVVMpICovCiAgICB7IDB4RjhGMywgMHhFRSB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2VsZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEY0LCAweEVGIH0sIC8qIENVUkxZIEJSQUNLRVQgRVhURU5ERVIJIyBicmFjZWV4IChDVVMpICovCiAgICB7IDB4RjhGNSwgMHhGNCB9LCAvKiBJTlRFR1JBTCBFWFRFTkRFUgkjIGludGVncmFsZXggKENVUykgKi8KICAgIHsgMHhGOEY2LCAweEY2IH0sIC8qIFJJR0hUIFBBUkVOIFRPUAkjIHBhcmVucmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RjcsIDB4RjcgfSwgLyogUklHSFQgUEFSRU4gRVhURU5ERVIJIyBwYXJlbnJpZ2h0ZXggKENVUykgKi8KICAgIHsgMHhGOEY4LCAweEY4IH0sIC8qIFJJR0hUIFBBUkVOIEJPVFRPTQkjIHBhcmVucmlnaHRidCAoQ1VTKSAqLwogICAgeyAweEY4RjksIDB4RjkgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgVE9QCSMgYnJhY2tldHJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEZBLCAweEZBIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2tldHJpZ2h0ZXggKENVUykgKi8KICAgIHsgMHhGOEZCLCAweEZCIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRyaWdodGJ0IChDVVMpICovCiAgICB7IDB4RjhGQywgMHhGQyB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIFRPUAkjIGJyYWNlcmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RkQsIDB4RkQgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBNSUQJIyBicmFjZXJpZ2h0bWlkIChDVVMpICovCiAgICB7IDB4RjhGRSwgMHhGRSB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlcmlnaHRidCAoQ1VTKSAqLwp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBZG9iZVN5bWJvbCA9IHsKICAgIEFkb2JlU3ltYm9sRW50LAogICAgc2l6ZW9mIChBZG9iZVN5bWJvbEVudCkgLyBzaXplb2YgKEFkb2JlU3ltYm9sRW50WzBdKSwKfTsK