I2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KCiNpZiBkZWZpbmVkKE9QRU5TU0xfWDg2XzY0KSAmJiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCgojaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKCi8qIHg4Nl82NCBCSUdOVU0gYWNjZWxlcmF0b3IgdmVyc2lvbiAwLjEsIERlY2VtYmVyIDIwMDIuCiAqCiAqIEltcGxlbWVudGVkIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKICogcHJvamVjdC4KICoKICogUmlnaHRzIGZvciByZWRpc3RyaWJ1dGlvbiBhbmQgdXNhZ2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlCiAqIGdyYW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBPcGVuU1NMIGxpY2Vuc2UuIFdhcnJhbnR5IG9mIGFueSBraW5kIGlzCiAqIGRpc2NsYWltZWQuCiAqCiAqIFEuIFZlcnNpb24gMC4xPyBJdCBkb2Vzbid0IHNvdW5kIGxpa2UgQW5keSwgaGUgdXNlZCB0byBhc3NpZ24gcmVhbAogKiAgICB2ZXJzaW9ucywgbGlrZSAxLjAuLi4KICogQS4gV2VsbCwgdGhhdCdzIGJlY2F1c2UgdGhpcyBjb2RlIGlzIGJhc2ljYWxseSBhIHF1aWNrLW4tZGlydHkKICogICAgcHJvb2Ytb2YtY29uY2VwdCBoYWNrLiBBcyB5b3UgY2FuIHNlZSBpdCdzIGltcGxlbWVudGVkIHdpdGgKICogICAgaW5saW5lIGFzc2VtYmxlciwgd2hpY2ggbWVhbnMgdGhhdCB5b3UncmUgYm91bmQgdG8gR0NDIGFuZCB0aGF0CiAqICAgIHRoZXJlIG1pZ2h0IGJlIGVub3VnaCByb29tIGZvciBmdXJ0aGVyIGltcHJvdmVtZW50LgogKgogKiBRLiBXaHkgaW5saW5lIGFzc2VtYmxlcj8KICogQS4geDg2XzY0IGZlYXR1cmVzIG93biBBQkkgd2hpY2ggSSdtIG5vdCBmYW1pbGlhciB3aXRoLiBUaGlzIGlzCiAqICAgIHdoeSBJIGRlY2lkZWQgdG8gbGV0IHRoZSBjb21waWxlciB0YWtlIGNhcmUgb2Ygc3Vicm91dGluZQogKiAgICBwcm9sb2d1ZS9lcGlsb2d1ZSBhcyB3ZWxsIGFzIHJlZ2lzdGVyIGFsbG9jYXRpb24uIEZvciByZWZlcmVuY2UuCiAqICAgIFdpbjY0IGltcGxlbWVudHMgZGlmZmVyZW50IEFCSSBmb3IgQU1ENjQsIGRpZmZlcmVudCBmcm9tIExpbnV4LgogKgogKiBRLiBIb3cgbXVjaCBmYXN0ZXIgZG9lcyBpdCBnZXQ/CiAqIEEuICdhcHBzL29wZW5zc2wgc3BlZWQgcnNhIGRzYScgb3V0cHV0IHdpdGggbm8tYXNtOgogKgogKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKICoJcnNhICA1MTIgYml0cyAgIDAuMDAwNnMgICAwLjAwMDFzICAgMTY4My44ICAxODQ1Ni4yCiAqCXJzYSAxMDI0IGJpdHMgICAwLjAwMjhzICAgMC4wMDAycyAgICAzNTYuMCAgIDY0MDcuMAogKglyc2EgMjA0OCBiaXRzICAgMC4wMTcycyAgIDAuMDAwNXMgICAgIDU4LjAgICAxOTU3LjgKICoJcnNhIDQwOTYgYml0cyAgIDAuMTE1NXMgICAwLjAwMThzICAgICAgOC43ICAgIDU1NS42CiAqCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcwogKglkc2EgIDUxMiBiaXRzICAgMC4wMDA1cyAgIDAuMDAwNnMgICAyMTAwLjggICAxNzY4LjMKICoJZHNhIDEwMjQgYml0cyAgIDAuMDAxNHMgICAwLjAwMThzICAgIDY5Mi4zICAgIDU1OS4yCiAqCWRzYSAyMDQ4IGJpdHMgICAwLjAwNDlzICAgMC4wMDYxcyAgICAyMDQuNyAgICAxNjUuMAogKgogKiAgICAnYXBwcy9vcGVuc3NsIHNwZWVkIHJzYSBkc2EnIG91dHB1dCB3aXRoIHRoaXMgbW9kdWxlOgogKgogKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKICoJcnNhICA1MTIgYml0cyAgIDAuMDAwNHMgICAwLjAwMDBzICAgMjc2Ny4xICAzMzI5Ny45CiAqCXJzYSAxMDI0IGJpdHMgICAwLjAwMTJzICAgMC4wMDAxcyAgICA4NjcuNCAgMTQ2NzQuNwogKglyc2EgMjA0OCBiaXRzICAgMC4wMDYxcyAgIDAuMDAwMnMgICAgMTY0LjAgICA1MjcwLjAKICoJcnNhIDQwOTYgYml0cyAgIDAuMDM4NHMgICAwLjAwMDZzICAgICAyNi4xICAgMTY1MC44CiAqCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcwogKglkc2EgIDUxMiBiaXRzICAgMC4wMDAycyAgIDAuMDAwM3MgICA0NDQyLjIgICAzNzg2LjMKICoJZHNhIDEwMjQgYml0cyAgIDAuMDAwNXMgICAwLjAwMDdzICAgMTgzNS4xICAgMTQ5Ny40CiAqCWRzYSAyMDQ4IGJpdHMgICAwLjAwMTZzICAgMC4wMDIwcyAgICA2MjAuNCAgICA1MDQuNgogKgogKiAgICBGb3IgdGhlIHJlZmVyZW5jZS4gSUEtMzIgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCiAqICAgIHZlcnkgbXVjaCBsaWtlIDY0LWJpdCBjb2RlIGNvbXBpbGVkIHdpdGggbm8tYXNtIG9uIHRoZSBzYW1lCiAqICAgIG1hY2hpbmUuCiAqLwoKIC8qIFRPRE8oZGF2aWRiZW4pOiBHZXQgdGhpcyBmaWxlIHdvcmtpbmcgb24gV2luZG93cyB4NjQuICovCgojdW5kZWYgbXVsCiN1bmRlZiBtdWxfYWRkCgojZGVmaW5lIGFzbSBfX2FzbV9fCgovKgogKiAibSIoYSksICIrbSIocikJaXMgdGhlIHdheSB0byBmYXZvciBEaXJlY3RQYXRoILUtY29kZTsKICogImciKDApCQlsZXQgdGhlIGNvbXBpbGVyIHRvIGRlY2lkZSB3aGVyZSBkb2VzIGl0CiAqCQkJd2FudCB0byBrZWVwIHRoZSB2YWx1ZSBvZiB6ZXJvOwogKi8KI2RlZmluZSBtdWxfYWRkKHIsIGEsIHdvcmQsIGNhcnJ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgcmVnaXN0ZXIgQk5fVUxPTkcgaGlnaCwgbG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGFzbSgibXVscSAlMyIgOiAiPWEiKGxvdyksICI9ZCIoaGlnaCkgOiAiYSIod29yZCksICJtIihhKSA6ICJjYyIpOyBcCiAgICBhc20oImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIDogIityIihjYXJyeSksICIrZCIoaGlnaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICA6ICJhIihsb3cpLCAiZyIoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICA6ICIrbSIociksICIrZCIoaGlnaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgOiAiciIoY2FycnkpLCAiZyIoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGNhcnJ5ID0gaGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSAoMCkKCiNkZWZpbmUgbXVsKHIsIGEsIHdvcmQsIGNhcnJ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHJlZ2lzdGVyIEJOX1VMT05HIGhpZ2gsIGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBhc20oIm11bHEgJTMiIDogIj1hIihsb3cpLCAiPWQiKGhpZ2gpIDogImEiKHdvcmQpLCAiZyIoYSkgOiAiY2MiKTsgXAogICAgYXNtKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICA6ICIrciIoY2FycnkpLCAiK2QiKGhpZ2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgOiAiYSIobG93KSwgImciKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChyKSA9IGNhcnJ5LCBjYXJyeSA9IGhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSAoMCkKI3VuZGVmIHNxcgojZGVmaW5lIHNxcihyMCwgcjEsIGEpIGFzbSgibXVscSAlMiIgOiAiPWEiKHIwKSwgIj1kIihyMSkgOiAiYSIoYSkgOiAiY2MiKTsKCkJOX1VMT05HIGJuX211bF9hZGRfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fVUxPTkcgdykgewogIEJOX1VMT05HIGMxID0gMDsKCiAgaWYgKG51bSA8PSAwKQogICAgcmV0dXJuIChjMSk7CgogIHdoaWxlIChudW0gJiB+MykgewogICAgbXVsX2FkZChycFswXSwgYXBbMF0sIHcsIGMxKTsKICAgIG11bF9hZGQocnBbMV0sIGFwWzFdLCB3LCBjMSk7CiAgICBtdWxfYWRkKHJwWzJdLCBhcFsyXSwgdywgYzEpOwogICAgbXVsX2FkZChycFszXSwgYXBbM10sIHcsIGMxKTsKICAgIGFwICs9IDQ7CiAgICBycCArPSA0OwogICAgbnVtIC09IDQ7CiAgfQogIGlmIChudW0pIHsKICAgIG11bF9hZGQocnBbMF0sIGFwWzBdLCB3LCBjMSk7CiAgICBpZiAoLS1udW0gPT0gMCkKICAgICAgcmV0dXJuIGMxOwogICAgbXVsX2FkZChycFsxXSwgYXBbMV0sIHcsIGMxKTsKICAgIGlmICgtLW51bSA9PSAwKQogICAgICByZXR1cm4gYzE7CiAgICBtdWxfYWRkKHJwWzJdLCBhcFsyXSwgdywgYzEpOwogICAgcmV0dXJuIGMxOwogIH0KCiAgcmV0dXJuIChjMSk7Cn0KCkJOX1VMT05HIGJuX211bF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykgewogIEJOX1VMT05HIGMxID0gMDsKCiAgaWYgKG51bSA8PSAwKQogICAgcmV0dXJuIChjMSk7CgogIHdoaWxlIChudW0gJiB+MykgewogICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOwogICAgbXVsKHJwWzFdLCBhcFsxXSwgdywgYzEpOwogICAgbXVsKHJwWzJdLCBhcFsyXSwgdywgYzEpOwogICAgbXVsKHJwWzNdLCBhcFszXSwgdywgYzEpOwogICAgYXAgKz0gNDsKICAgIHJwICs9IDQ7CiAgICBudW0gLT0gNDsKICB9CiAgaWYgKG51bSkgewogICAgbXVsKHJwWzBdLCBhcFswXSwgdywgYzEpOwogICAgaWYgKC0tbnVtID09IDApCiAgICAgIHJldHVybiBjMTsKICAgIG11bChycFsxXSwgYXBbMV0sIHcsIGMxKTsKICAgIGlmICgtLW51bSA9PSAwKQogICAgICByZXR1cm4gYzE7CiAgICBtdWwocnBbMl0sIGFwWzJdLCB3LCBjMSk7CiAgfQogIHJldHVybiAoYzEpOwp9Cgp2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGludCBuKSB7CiAgaWYgKG4gPD0gMCkKICAgIHJldHVybjsKCiAgd2hpbGUgKG4gJiB+MykgewogICAgc3FyKHJbMF0sIHJbMV0sIGFbMF0pOwogICAgc3FyKHJbMl0sIHJbM10sIGFbMV0pOwogICAgc3FyKHJbNF0sIHJbNV0sIGFbMl0pOwogICAgc3FyKHJbNl0sIHJbN10sIGFbM10pOwogICAgYSArPSA0OwogICAgciArPSA4OwogICAgbiAtPSA0OwogIH0KICBpZiAobikgewogICAgc3FyKHJbMF0sIHJbMV0sIGFbMF0pOwogICAgaWYgKC0tbiA9PSAwKQogICAgICByZXR1cm47CiAgICBzcXIoclsyXSwgclszXSwgYVsxXSk7CiAgICBpZiAoLS1uID09IDApCiAgICAgIHJldHVybjsKICAgIHNxcihyWzRdLCByWzVdLCBhWzJdKTsKICB9Cn0KCkJOX1VMT05HIGJuX2Rpdl93b3JkcyhCTl9VTE9ORyBoLCBCTl9VTE9ORyBsLCBCTl9VTE9ORyBkKSB7CiAgQk5fVUxPTkcgcmV0LCB3YXN0ZTsKCiAgYXNtKCJkaXZxCSU0IiA6ICI9YSIocmV0KSwgIj1kIih3YXN0ZSkgOiAiYSIobCksICJkIihoKSwgImciKGQpIDogImNjIik7CgogIHJldHVybiByZXQ7Cn0KCkJOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLAogICAgICAgICAgICAgICAgICAgICAgaW50IG4pIHsKICBCTl9VTE9ORyByZXQ7CiAgc2l6ZV90IGkgPSAwOwoKICBpZiAobiA8PSAwKQogICAgcmV0dXJuIDA7CgogIGFzbSB2b2xhdGlsZSAoCiAgICAgICIJc3VicQklMCwlMAkJXG4iIC8qIGNsZWFyIGNhcnJ5ICovCiAgICAgICIJam1wCTFmCQlcbiIKICAgICAgIi5wMmFsaWduIDQJCQlcbiIKICAgICAgIjE6CW1vdnEJKCU0LCUyLDgpLCUwCVxuIgogICAgICAiCWFkY3EJKCU1LCUyLDgpLCUwCVxuIgogICAgICAiCW1vdnEJJTAsKCUzLCUyLDgpCVxuIgogICAgICAiCWxlYQkxKCUyKSwlMglcbiIKICAgICAgIglsb29wCTFiCQlcbiIKICAgICAgIglzYmJxCSUwLCUwCQlcbiIKICAgICAgOiAiPSZyIihyZXQpLCAiK2MiKG4pLCAiK3IiKGkpCiAgICAgIDogInIiKHJwKSwgInIiKGFwKSwgInIiKGJwKQogICAgICA6ICJjYyIsICJtZW1vcnkiKTsKCiAgcmV0dXJuIHJldCAmIDE7Cn0KCiNpZm5kZWYgU0lNSUNTCkJOX1VMT05HIGJuX3N1Yl93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLAogICAgICAgICAgICAgICAgICAgICAgaW50IG4pIHsKICBCTl9VTE9ORyByZXQ7CiAgc2l6ZV90IGkgPSAwOwoKICBpZiAobiA8PSAwKQogICAgcmV0dXJuIDA7CgogIGFzbSB2b2xhdGlsZSAoCiAgICAgICIJc3VicQklMCwlMAkJXG4iIC8qIGNsZWFyIGJvcnJvdyAqLwogICAgICAiCWptcAkxZgkJXG4iCiAgICAgICIucDJhbGlnbiA0CQkJXG4iCiAgICAgICIxOgltb3ZxCSglNCwlMiw4KSwlMAlcbiIKICAgICAgIglzYmJxCSglNSwlMiw4KSwlMAlcbiIKICAgICAgIgltb3ZxCSUwLCglMywlMiw4KQlcbiIKICAgICAgIglsZWEJMSglMiksJTIJXG4iCiAgICAgICIJbG9vcAkxYgkJXG4iCiAgICAgICIJc2JicQklMCwlMAkJXG4iCiAgICAgIDogIj0mciIocmV0KSwgIitjIihuKSwgIityIihpKQogICAgICA6ICJyIihycCksICJyIihhcCksICJyIihicCkKICAgICAgOiAiY2MiLCAibWVtb3J5Iik7CgogIHJldHVybiByZXQgJiAxOwp9CiNlbHNlCi8qIFNpbWljcyAxLjQ8NyBoYXMgYnVnZ3kgc2JicTotKCAqLwojZGVmaW5lIEJOX01BU0syIDB4ZmZmZmZmZmZmZmZmZmZmZkwKQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuKSB7CiAgQk5fVUxPTkcgdDEsIHQyOwogIGludCBjID0gMDsKCiAgaWYgKG4gPD0gMCkKICAgIHJldHVybiAoKEJOX1VMT05HKTApOwoKICBmb3IgKDs7KSB7CiAgICB0MSA9IGFbMF07CiAgICB0MiA9IGJbMF07CiAgICByWzBdID0gKHQxIC0gdDIgLSBjKSAmIEJOX01BU0syOwogICAgaWYgKHQxICE9IHQyKQogICAgICBjID0gKHQxIDwgdDIpOwogICAgaWYgKC0tbiA8PSAwKQogICAgICBicmVhazsKCiAgICB0MSA9IGFbMV07CiAgICB0MiA9IGJbMV07CiAgICByWzFdID0gKHQxIC0gdDIgLSBjKSAmIEJOX01BU0syOwogICAgaWYgKHQxICE9IHQyKQogICAgICBjID0gKHQxIDwgdDIpOwogICAgaWYgKC0tbiA8PSAwKQogICAgICBicmVhazsKCiAgICB0MSA9IGFbMl07CiAgICB0MiA9IGJbMl07CiAgICByWzJdID0gKHQxIC0gdDIgLSBjKSAmIEJOX01BU0syOwogICAgaWYgKHQxICE9IHQyKQogICAgICBjID0gKHQxIDwgdDIpOwogICAgaWYgKC0tbiA8PSAwKQogICAgICBicmVhazsKCiAgICB0MSA9IGFbM107CiAgICB0MiA9IGJbM107CiAgICByWzNdID0gKHQxIC0gdDIgLSBjKSAmIEJOX01BU0syOwogICAgaWYgKHQxICE9IHQyKQogICAgICBjID0gKHQxIDwgdDIpOwogICAgaWYgKC0tbiA8PSAwKQogICAgICBicmVhazsKCiAgICBhICs9IDQ7CiAgICBiICs9IDQ7CiAgICByICs9IDQ7CiAgfQogIHJldHVybiAoYyk7Cn0KI2VuZGlmCgovKiBtdWxfYWRkX2MoYSxiLGMwLGMxLGMyKSAgLS0gYys9YSpiIGZvciB0aHJlZSB3b3JkIG51bWJlciBjPShjMixjMSxjMCkgKi8KLyogbXVsX2FkZF9jMihhLGIsYzAsYzEsYzIpIC0tIGMrPTIqYSpiIGZvciB0aHJlZSB3b3JkIG51bWJlciBjPShjMixjMSxjMCkgKi8KLyogc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgIC0tIGMrPWFbaV1eMiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCi8qIHNxcl9hZGRfYzIoYSxpLGMwLGMxLGMyKSAtLSBjKz0yKmFbaV0qYVtqXSBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApCiAqLwoKLyogS2VlcCBpbiBtaW5kIHRoYXQgY2FycnlpbmcgaW50byBoaWdoIHBhcnQgb2YgbXVsdGlwbGljYXRpb24gcmVzdWx0IGNhbiBub3QKICogb3ZlcmZsb3csIGJlY2F1c2UgaXQgY2Fubm90IGJlIGFsbC1vbmVzLiAqLwojZGVmaW5lIG11bF9hZGRfYyhhLCBiLCBjMCwgYzEsIGMyKSAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIEJOX1VMT05HIHQxLCB0MjsgICAgICAgICAgICAgICAgXAogICAgYXNtKCJtdWxxICUzIiA6ICI9YSIodDEpLCAiPWQiKHQyKSA6ICJhIihhKSwgIm0iKGIpIDogImNjIik7IFwKICAgIGFzbSgiYWRkcSAlMywlMDsgYWRjcSAlNCwlMTsgYWRjcSAlNSwlMiIgXAogICAgICAgIDogIityIihjMCksICIrciIoYzEpLCAiK3IiKGMyKSAgICAgICBcCiAgICAgICAgOiAiciIodDEpLCAiciIodDIpLCAiZyIoMCkgICAgICAgICAgIFwKICAgICAgICA6ICJjYyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIH0gd2hpbGUgKDApCgojZGVmaW5lIHNxcl9hZGRfYyhhLCBpLCBjMCwgYzEsIGMyKSAgICAgICAgICBcCiAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIEJOX1VMT05HIHQxLCB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgYXNtKCJtdWxxICUyIiA6ICI9YSIodDEpLCAiPWQiKHQyKSA6ICJhIihhW2ldKSA6ICJjYyIpOyBcCiAgICBhc20oImFkZHEgJTMsJTA7IGFkY3EgJTQsJTE7IGFkY3EgJTUsJTIiIFwKICAgICAgICA6ICIrciIoYzApLCAiK3IiKGMxKSwgIityIihjMikgICAgICAgXAogICAgICAgIDogInIiKHQxKSwgInIiKHQyKSwgImciKDApICAgICAgICAgICBcCiAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlICgwKQoKI2RlZmluZSBtdWxfYWRkX2MyKGEsIGIsIGMwLCBjMSwgYzIpICAgICAgICAgXAogIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBCTl9VTE9ORyB0MSwgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGFzbSgibXVscSAlMyIgOiAiPWEiKHQxKSwgIj1kIih0MikgOiAiYSIoYSksICJtIihiKSA6ICJjYyIpOyAgICAgICAgXAogICAgYXNtKCJhZGRxICUzLCUwOyBhZGNxICU0LCUxOyBhZGNxICU1LCUyIiBcCiAgICAgICAgOiAiK3IiKGMwKSwgIityIihjMSksICIrciIoYzIpICAgICAgIFwKICAgICAgICA6ICJyIih0MSksICJyIih0MiksICJnIigwKSAgICAgICAgICAgXAogICAgICAgIDogImNjIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBhc20oImFkZHEgJTMsJTA7IGFkY3EgJTQsJTE7IGFkY3EgJTUsJTIiIFwKICAgICAgICA6ICIrciIoYzApLCAiK3IiKGMxKSwgIityIihjMikgICAgICAgXAogICAgICAgIDogInIiKHQxKSwgInIiKHQyKSwgImciKDApICAgICAgICAgICBcCiAgICAgICAgOiAiY2MiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlICgwKQoKI2RlZmluZSBzcXJfYWRkX2MyKGEsIGksIGosIGMwLCBjMSwgYzIpIG11bF9hZGRfYzIoKGEpW2ldLCAoYSlbal0sIGMwLCBjMSwgYzIpCgp2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikgewogIEJOX1VMT05HIGMxLCBjMiwgYzM7CgogIGMxID0gMDsKICBjMiA9IDA7CiAgYzMgPSAwOwogIG11bF9hZGRfYyhhWzBdLCBiWzBdLCBjMSwgYzIsIGMzKTsKICByWzBdID0gYzE7CiAgYzEgPSAwOwogIG11bF9hZGRfYyhhWzBdLCBiWzFdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVsxXSwgYlswXSwgYzIsIGMzLCBjMSk7CiAgclsxXSA9IGMyOwogIGMyID0gMDsKICBtdWxfYWRkX2MoYVsyXSwgYlswXSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbMV0sIGJbMV0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzBdLCBiWzJdLCBjMywgYzEsIGMyKTsKICByWzJdID0gYzM7CiAgYzMgPSAwOwogIG11bF9hZGRfYyhhWzBdLCBiWzNdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVsxXSwgYlsyXSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbMl0sIGJbMV0sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzNdLCBiWzBdLCBjMSwgYzIsIGMzKTsKICByWzNdID0gYzE7CiAgYzEgPSAwOwogIG11bF9hZGRfYyhhWzRdLCBiWzBdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVszXSwgYlsxXSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbMl0sIGJbMl0sIGMyLCBjMywgYzEpOwogIG11bF9hZGRfYyhhWzFdLCBiWzNdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVswXSwgYls0XSwgYzIsIGMzLCBjMSk7CiAgcls0XSA9IGMyOwogIGMyID0gMDsKICBtdWxfYWRkX2MoYVswXSwgYls1XSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbMV0sIGJbNF0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzJdLCBiWzNdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVszXSwgYlsyXSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbNF0sIGJbMV0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzVdLCBiWzBdLCBjMywgYzEsIGMyKTsKICByWzVdID0gYzM7CiAgYzMgPSAwOwogIG11bF9hZGRfYyhhWzZdLCBiWzBdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVs1XSwgYlsxXSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbNF0sIGJbMl0sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzNdLCBiWzNdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVsyXSwgYls0XSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbMV0sIGJbNV0sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzBdLCBiWzZdLCBjMSwgYzIsIGMzKTsKICByWzZdID0gYzE7CiAgYzEgPSAwOwogIG11bF9hZGRfYyhhWzBdLCBiWzddLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVsxXSwgYls2XSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbMl0sIGJbNV0sIGMyLCBjMywgYzEpOwogIG11bF9hZGRfYyhhWzNdLCBiWzRdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVs0XSwgYlszXSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbNV0sIGJbMl0sIGMyLCBjMywgYzEpOwogIG11bF9hZGRfYyhhWzZdLCBiWzFdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVs3XSwgYlswXSwgYzIsIGMzLCBjMSk7CiAgcls3XSA9IGMyOwogIGMyID0gMDsKICBtdWxfYWRkX2MoYVs3XSwgYlsxXSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbNl0sIGJbMl0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzVdLCBiWzNdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVs0XSwgYls0XSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbM10sIGJbNV0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzJdLCBiWzZdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVsxXSwgYls3XSwgYzMsIGMxLCBjMik7CiAgcls4XSA9IGMzOwogIGMzID0gMDsKICBtdWxfYWRkX2MoYVsyXSwgYls3XSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbM10sIGJbNl0sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzRdLCBiWzVdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVs1XSwgYls0XSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbNl0sIGJbM10sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzddLCBiWzJdLCBjMSwgYzIsIGMzKTsKICByWzldID0gYzE7CiAgYzEgPSAwOwogIG11bF9hZGRfYyhhWzddLCBiWzNdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVs2XSwgYls0XSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbNV0sIGJbNV0sIGMyLCBjMywgYzEpOwogIG11bF9hZGRfYyhhWzRdLCBiWzZdLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVszXSwgYls3XSwgYzIsIGMzLCBjMSk7CiAgclsxMF0gPSBjMjsKICBjMiA9IDA7CiAgbXVsX2FkZF9jKGFbNF0sIGJbN10sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzVdLCBiWzZdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVs2XSwgYls1XSwgYzMsIGMxLCBjMik7CiAgbXVsX2FkZF9jKGFbN10sIGJbNF0sIGMzLCBjMSwgYzIpOwogIHJbMTFdID0gYzM7CiAgYzMgPSAwOwogIG11bF9hZGRfYyhhWzddLCBiWzVdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVs2XSwgYls2XSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbNV0sIGJbN10sIGMxLCBjMiwgYzMpOwogIHJbMTJdID0gYzE7CiAgYzEgPSAwOwogIG11bF9hZGRfYyhhWzZdLCBiWzddLCBjMiwgYzMsIGMxKTsKICBtdWxfYWRkX2MoYVs3XSwgYls2XSwgYzIsIGMzLCBjMSk7CiAgclsxM10gPSBjMjsKICBjMiA9IDA7CiAgbXVsX2FkZF9jKGFbN10sIGJbN10sIGMzLCBjMSwgYzIpOwogIHJbMTRdID0gYzM7CiAgclsxNV0gPSBjMTsKfQoKdm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpIHsKICBCTl9VTE9ORyBjMSwgYzIsIGMzOwoKICBjMSA9IDA7CiAgYzIgPSAwOwogIGMzID0gMDsKICBtdWxfYWRkX2MoYVswXSwgYlswXSwgYzEsIGMyLCBjMyk7CiAgclswXSA9IGMxOwogIGMxID0gMDsKICBtdWxfYWRkX2MoYVswXSwgYlsxXSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbMV0sIGJbMF0sIGMyLCBjMywgYzEpOwogIHJbMV0gPSBjMjsKICBjMiA9IDA7CiAgbXVsX2FkZF9jKGFbMl0sIGJbMF0sIGMzLCBjMSwgYzIpOwogIG11bF9hZGRfYyhhWzFdLCBiWzFdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVswXSwgYlsyXSwgYzMsIGMxLCBjMik7CiAgclsyXSA9IGMzOwogIGMzID0gMDsKICBtdWxfYWRkX2MoYVswXSwgYlszXSwgYzEsIGMyLCBjMyk7CiAgbXVsX2FkZF9jKGFbMV0sIGJbMl0sIGMxLCBjMiwgYzMpOwogIG11bF9hZGRfYyhhWzJdLCBiWzFdLCBjMSwgYzIsIGMzKTsKICBtdWxfYWRkX2MoYVszXSwgYlswXSwgYzEsIGMyLCBjMyk7CiAgclszXSA9IGMxOwogIGMxID0gMDsKICBtdWxfYWRkX2MoYVszXSwgYlsxXSwgYzIsIGMzLCBjMSk7CiAgbXVsX2FkZF9jKGFbMl0sIGJbMl0sIGMyLCBjMywgYzEpOwogIG11bF9hZGRfYyhhWzFdLCBiWzNdLCBjMiwgYzMsIGMxKTsKICByWzRdID0gYzI7CiAgYzIgPSAwOwogIG11bF9hZGRfYyhhWzJdLCBiWzNdLCBjMywgYzEsIGMyKTsKICBtdWxfYWRkX2MoYVszXSwgYlsyXSwgYzMsIGMxLCBjMik7CiAgcls1XSA9IGMzOwogIGMzID0gMDsKICBtdWxfYWRkX2MoYVszXSwgYlszXSwgYzEsIGMyLCBjMyk7CiAgcls2XSA9IGMxOwogIHJbN10gPSBjMjsKfQoKdm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSkgewogIEJOX1VMT05HIGMxLCBjMiwgYzM7CgogIGMxID0gMDsKICBjMiA9IDA7CiAgYzMgPSAwOwogIHNxcl9hZGRfYyhhLCAwLCBjMSwgYzIsIGMzKTsKICByWzBdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYzIoYSwgMSwgMCwgYzIsIGMzLCBjMSk7CiAgclsxXSA9IGMyOwogIGMyID0gMDsKICBzcXJfYWRkX2MoYSwgMSwgYzMsIGMxLCBjMik7CiAgc3FyX2FkZF9jMihhLCAyLCAwLCBjMywgYzEsIGMyKTsKICByWzJdID0gYzM7CiAgYzMgPSAwOwogIHNxcl9hZGRfYzIoYSwgMywgMCwgYzEsIGMyLCBjMyk7CiAgc3FyX2FkZF9jMihhLCAyLCAxLCBjMSwgYzIsIGMzKTsKICByWzNdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYyhhLCAyLCBjMiwgYzMsIGMxKTsKICBzcXJfYWRkX2MyKGEsIDMsIDEsIGMyLCBjMywgYzEpOwogIHNxcl9hZGRfYzIoYSwgNCwgMCwgYzIsIGMzLCBjMSk7CiAgcls0XSA9IGMyOwogIGMyID0gMDsKICBzcXJfYWRkX2MyKGEsIDUsIDAsIGMzLCBjMSwgYzIpOwogIHNxcl9hZGRfYzIoYSwgNCwgMSwgYzMsIGMxLCBjMik7CiAgc3FyX2FkZF9jMihhLCAzLCAyLCBjMywgYzEsIGMyKTsKICByWzVdID0gYzM7CiAgYzMgPSAwOwogIHNxcl9hZGRfYyhhLCAzLCBjMSwgYzIsIGMzKTsKICBzcXJfYWRkX2MyKGEsIDQsIDIsIGMxLCBjMiwgYzMpOwogIHNxcl9hZGRfYzIoYSwgNSwgMSwgYzEsIGMyLCBjMyk7CiAgc3FyX2FkZF9jMihhLCA2LCAwLCBjMSwgYzIsIGMzKTsKICByWzZdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYzIoYSwgNywgMCwgYzIsIGMzLCBjMSk7CiAgc3FyX2FkZF9jMihhLCA2LCAxLCBjMiwgYzMsIGMxKTsKICBzcXJfYWRkX2MyKGEsIDUsIDIsIGMyLCBjMywgYzEpOwogIHNxcl9hZGRfYzIoYSwgNCwgMywgYzIsIGMzLCBjMSk7CiAgcls3XSA9IGMyOwogIGMyID0gMDsKICBzcXJfYWRkX2MoYSwgNCwgYzMsIGMxLCBjMik7CiAgc3FyX2FkZF9jMihhLCA1LCAzLCBjMywgYzEsIGMyKTsKICBzcXJfYWRkX2MyKGEsIDYsIDIsIGMzLCBjMSwgYzIpOwogIHNxcl9hZGRfYzIoYSwgNywgMSwgYzMsIGMxLCBjMik7CiAgcls4XSA9IGMzOwogIGMzID0gMDsKICBzcXJfYWRkX2MyKGEsIDcsIDIsIGMxLCBjMiwgYzMpOwogIHNxcl9hZGRfYzIoYSwgNiwgMywgYzEsIGMyLCBjMyk7CiAgc3FyX2FkZF9jMihhLCA1LCA0LCBjMSwgYzIsIGMzKTsKICByWzldID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYyhhLCA1LCBjMiwgYzMsIGMxKTsKICBzcXJfYWRkX2MyKGEsIDYsIDQsIGMyLCBjMywgYzEpOwogIHNxcl9hZGRfYzIoYSwgNywgMywgYzIsIGMzLCBjMSk7CiAgclsxMF0gPSBjMjsKICBjMiA9IDA7CiAgc3FyX2FkZF9jMihhLCA3LCA0LCBjMywgYzEsIGMyKTsKICBzcXJfYWRkX2MyKGEsIDYsIDUsIGMzLCBjMSwgYzIpOwogIHJbMTFdID0gYzM7CiAgYzMgPSAwOwogIHNxcl9hZGRfYyhhLCA2LCBjMSwgYzIsIGMzKTsKICBzcXJfYWRkX2MyKGEsIDcsIDUsIGMxLCBjMiwgYzMpOwogIHJbMTJdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYzIoYSwgNywgNiwgYzIsIGMzLCBjMSk7CiAgclsxM10gPSBjMjsKICBjMiA9IDA7CiAgc3FyX2FkZF9jKGEsIDcsIGMzLCBjMSwgYzIpOwogIHJbMTRdID0gYzM7CiAgclsxNV0gPSBjMTsKfQoKdm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSkgewogIEJOX1VMT05HIGMxLCBjMiwgYzM7CgogIGMxID0gMDsKICBjMiA9IDA7CiAgYzMgPSAwOwogIHNxcl9hZGRfYyhhLCAwLCBjMSwgYzIsIGMzKTsKICByWzBdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYzIoYSwgMSwgMCwgYzIsIGMzLCBjMSk7CiAgclsxXSA9IGMyOwogIGMyID0gMDsKICBzcXJfYWRkX2MoYSwgMSwgYzMsIGMxLCBjMik7CiAgc3FyX2FkZF9jMihhLCAyLCAwLCBjMywgYzEsIGMyKTsKICByWzJdID0gYzM7CiAgYzMgPSAwOwogIHNxcl9hZGRfYzIoYSwgMywgMCwgYzEsIGMyLCBjMyk7CiAgc3FyX2FkZF9jMihhLCAyLCAxLCBjMSwgYzIsIGMzKTsKICByWzNdID0gYzE7CiAgYzEgPSAwOwogIHNxcl9hZGRfYyhhLCAyLCBjMiwgYzMsIGMxKTsKICBzcXJfYWRkX2MyKGEsIDMsIDEsIGMyLCBjMywgYzEpOwogIHJbNF0gPSBjMjsKICBjMiA9IDA7CiAgc3FyX2FkZF9jMihhLCAzLCAyLCBjMywgYzEsIGMyKTsKICByWzVdID0gYzM7CiAgYzMgPSAwOwogIHNxcl9hZGRfYyhhLCAzLCBjMSwgYzIsIGMzKTsKICByWzZdID0gYzE7CiAgcls3XSA9IGMyOwp9CgojZW5kaWYgIC8qIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpICYmICFkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykgKi8K