LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNmcmVldHlwZS5jLHYgMS4xMSAyMDAyLzA4LzMxIDIyOjE3OjMyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAgQ29weXJpZ2h0IKkgMjAwMi0yMDAzIGJ5IEp1bGl1c3ogQ2hyb2JvY3plawoKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICBUSEUgU09GVFdBUkUuCiovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAojaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICiNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICiNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICgojaWYgKEZSRUVUWVBFX01JTk9SID4gMSB8fCAoRlJFRVRZUEVfTUlOT1IgPT0gMSAmJiBGUkVFVFlQRV9QQVRDSCA+PSA0KSkKI2luY2x1ZGUgRlRfQkRGX0gKI2luY2x1ZGUgRlRfTU9EVUxFX0gKI2RlZmluZSBVU0VfRlRCREYKI2RlZmluZSBIQVNfQkRGX1BST1BFUlRZKGYpICgoZikgJiYgKGYpLT5kcml2ZXIgJiYgXAoJCQkgICAgIChmKS0+ZHJpdmVyLT5yb290LmNsYXp6LT5nZXRfaW50ZXJmYWNlKQojZGVmaW5lIE1ZX0dldF9CREZfUHJvcGVydHkoZixuLHApIChIQVNfQkRGX1BST1BFUlRZKGYpID8gXAoJCQkJICAgIEZUX0dldF9CREZfUHJvcGVydHkoZixuLHApIDogXAoJCQkJICAgIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50KQojZW5kaWYKCgovKgogKiBLZWVwIEhhbiBsYW5ndWFnZXMgc2VwYXJhdGVkIGJ5IGVsaW1pbmF0aW5nIGxhbmd1YWdlcwogKiB0aGF0IHRoZSBjb2RlUGFnZVJhbmdlIGJpdHMgc2F5cyBhcmVuJ3Qgc3VwcG9ydGVkCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBpbnQJCSAgICBiaXQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKmxhbmc7Cn0gRmNDb2RlUGFnZVJhbmdlW10gPSB7CiAgICB7IDE3LAkoY29uc3QgRmNDaGFyOCAqKSAiamEiIH0sCiAgICB7IDE4LAkoY29uc3QgRmNDaGFyOCAqKSAiemgtY24iIH0sCiAgICB7IDE5LAkoY29uc3QgRmNDaGFyOCAqKSAia28iIH0sCiAgICB7IDIwLAkoY29uc3QgRmNDaGFyOCAqKSAiemgtdHciIH0sCn07CgojZGVmaW5lIE5VTV9DT0RFX1BBR0VfUkFOR0UgKHNpemVvZiBGY0NvZGVQYWdlUmFuZ2UgLyBzaXplb2YgRmNDb2RlUGFnZVJhbmdlWzBdKQoKRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKQp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKICAgIHsKCWlmIChGY0xhbmdDb21wYXJlIChsYW5nLCBGY0NvZGVQYWdlUmFuZ2VbaV0ubGFuZykgIT0gRmNMYW5nRGlmZmVyZW50TGFuZykKCSAgICByZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkcJICAgIDB4MGYwMAojZGVmaW5lIEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0ggICAweDAyMDAKI2RlZmluZSBGQ19OQU1FX1BSSU9fTEFOR19MQVRJTgkgICAgMHgwMTAwCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkdfTk9ORQkgICAgMHgwMDAwCgojZGVmaW5lIEZDX05BTUVfUFJJT19FTkMJICAgIDB4MDBmMAojZGVmaW5lIEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERSAgICAweDAwMTAKI2RlZmluZSBGQ19OQU1FX1BSSU9fRU5DX05PTkUJICAgIDB4MDAwMAoKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRQkgICAgMHgwMDBmCiNkZWZpbmUgRkNfTkFNRV9QUklPX05BTUVfRkFNSUxZICAgIDB4MDAwMgojZGVmaW5lIEZDX05BTUVfUFJJT19OQU1FX1BTCSAgICAweDAwMDEKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRV9OT05FCSAgICAweDAwMDAKCnN0YXRpYyBGY0Jvb2wKRmNVY3M0SXNMYXRpbiAoRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyMzIJcGFnZSA9IHVjczQgPj4gODsKICAgIAogICAgaWYgKHBhZ2UgPD0gMikKCXJldHVybiBGY1RydWU7CiAgICBpZiAocGFnZSA9PSAweDFlKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgweDIwIDw9IHBhZ2UgJiYgcGFnZSA8PSAweDIzKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmIChwYWdlID09IDB4ZmIpCglyZXR1cm4gRmNUcnVlOwogICAgLyogaGFsZndpZHRoIGZvcm1zLCBkb24ndCBpbmNsdWRlIGthbmEgb3Igd2hpdGUgcGFyZW5zICovCiAgICBpZiAoMHhmZjAxIDw9IHVjczQgJiYgdWNzNCA8PSAweGZmNWUpCglyZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNVdGY4SXNMYXRpbiAoRmNDaGFyOCAqc3RyLCBpbnQgbGVuKQp7CiAgICB3aGlsZSAobGVuKQogICAgewoJRmNDaGFyMzIgICAgdWNzNDsKCWludAkgICAgY2xlbiA9IEZjVXRmOFRvVWNzNCAoc3RyLCAmdWNzNCwgbGVuKTsKCWlmIChjbGVuIDw9IDApCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoIUZjVWNzNElzTGF0aW4gKHVjczQpKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJbGVuIC09IGNsZW47CglzdHIgKz0gY2xlbjsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCi8qIE9yZGVyIGlzIHNpZ25pZmljYW50LiAgRm9yIGV4YW1wbGUsIHNvbWUgQiZIIGZvbnRzIGFyZSBoaW50ZWQgYnkKICAgVVJXKyssIGFuZCBib3RoIHN0cmluZ3MgYXBwZWFyIGluIHRoZSBub3RpY2UuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZjQ2hhcjggICAqbm90aWNlOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjTm90aWNlRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGY0NoYXI4KikgIkJpZ2Vsb3ciLAkoY29uc3QgRmNDaGFyOCAqKSAiYiZoIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBZG9iZSIsCQkoY29uc3QgRmNDaGFyOCAqKSAiYWRvYmUiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkJpdHN0cmVhbSIsCShjb25zdCBGY0NoYXI4ICopICJiaXRzdHJlYW0iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk1vbm90eXBlIiwJKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJMaW5vdHlwZSIsCShjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTElOT1RZUEUtSEVMTCIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSUJNIiwJCShjb25zdCBGY0NoYXI4ICopICJpYm0iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIlVSVyIsCQkoY29uc3QgRmNDaGFyOCAqKSAidXJ3IiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJJbnRlcm5hdGlvbmFsIFR5cGVmYWNlIENvcnBvcmF0aW9uIiwgCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgIml0YyIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiVGlybyBUeXBld29ya3MiLChjb25zdCBGY0NoYXI4ICopICJ0aXJvIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJYRnJlZTg2IiwJKGNvbnN0IEZjQ2hhcjggKikgInhmcmVlODYiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk1pY3Jvc29mdCIsCShjb25zdCBGY0NoYXI4ICopICJtaWNyb3NvZnQiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk9tZWdhIiwJCShjb25zdCBGY0NoYXI4ICopICJvbWVnYSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiRm9udDIxIiwJKGNvbnN0IEZjQ2hhcjggKikgImh3YW4iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkhhbllhbmcgU3lzdGVtIiwoY29uc3QgRmNDaGFyOCAqKSAiaGFueWFuZyIgfQp9OwoKI2RlZmluZSBOVU1fTk9USUNFX0ZPVU5EUklFUwkoc2l6ZW9mIChGY05vdGljZUZvdW5kcmllcykgLyBzaXplb2YgKEZjTm90aWNlRm91bmRyaWVzWzBdKSkKCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNOb3RpY2VGb3VuZHJ5KGNvbnN0IGNoYXIgKm5vdGljZSkKewogICAgaW50IGk7CgogICAgaWYgKG5vdGljZSkKCWZvcihpID0gMDsgaSA8IE5VTV9OT1RJQ0VfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKHN0cnN0ciAoKGNvbnN0IGNoYXIgKikgbm90aWNlLCAoY29uc3QgY2hhciAqKSBGY05vdGljZUZvdW5kcmllc1tpXS5ub3RpY2UpKQoJCXJldHVybiBGY05vdGljZUZvdW5kcmllc1tpXS5mb3VuZHJ5OwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWZW5kb3JNYXRjaChjb25zdCBjaGFyICp2ZW5kb3IsIGNvbnN0IGNoYXIgKnZlbmRvcl9zdHJpbmcpCnsKICAgIC8qIHZlbmRvciBpcyBub3QgbmVjZXNzYXJpbHkgTlVMLXRlcm1pbmF0ZWQuICovCiAgICBpbnQgaSwgbGVuOwogICAgCiAgICBsZW4gPSBzdHJsZW4odmVuZG9yX3N0cmluZyk7CiAgICBpZiAobWVtY21wKHZlbmRvciwgdmVuZG9yX3N0cmluZywgbGVuKSAhPSAwKQogICAgICAgIHJldHVybiBGY0ZhbHNlOwogICAgZm9yIChpID0gbGVuOyBpIDwgNDsgaSsrKQogICAgICAgIGlmICh2ZW5kb3JbaV0gIT0gJyAnICYmIHZlbmRvcltpXSAhPSAnXDAnKQogICAgICAgICAgICByZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCi8qIFRoaXMgdGFibGUgaXMgcGFydGx5IHRha2VuIGZyb20gdHRta2ZkaXIgYnkgSm9lcmcgUG9tbW5pdHouICovCgovKiBJdCBzaG91bGQgbm90IGNvbnRhaW4gdXNlbGVzcyBlbnRyaWVzIChzdWNoIGFzIFVOS04pIG5vciBkdXBsaWNhdGUKICAgZW50cmllcyBmb3IgcGFkZGluZyBib3RoIHdpdGggc3BhY2VzIGFuZCBOVUxzLiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBGY0NoYXI4ICAgKnZlbmRvcjsKICAgIGNvbnN0IEZjQ2hhcjggICAqZm91bmRyeTsKfSBGY1ZlbmRvckZvdW5kcmllc1tdID0gewogICAgeyAoY29uc3QgRmNDaGFyOCopICJBREJFIiwgKGNvbnN0IEZjQ2hhcjggKikgImFkb2JlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFHRkEiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWdmYSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBTFRTIiwgKGNvbnN0IEZjQ2hhcjggKikgImFsdHN5cyJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBUFBMIiwgKGNvbnN0IEZjQ2hhcjggKikgImFwcGxlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFSUEgiLCAoY29uc3QgRmNDaGFyOCAqKSAiYXJwaGljIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFURUMiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWxsdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJCJkgiLCAgKGNvbnN0IEZjQ2hhcjggKikgImImaCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJCSVRTIiwgKGNvbnN0IEZjQ2hhcjggKikgImJpdHN0cmVhbSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJDQU5PIiwgKGNvbnN0IEZjQ2hhcjggKikgImNhbm5vbiJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJEWU5BIiwgKGNvbnN0IEZjQ2hhcjggKikgImR5bmFsYWIifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiRVBTTiIsIChjb25zdCBGY0NoYXI4ICopICJlcHNvbiJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJGSiIsICAgKGNvbnN0IEZjQ2hhcjggKikgImZ1aml0c3UifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSUJNIiwgIChjb25zdCBGY0NoYXI4ICopICJpYm0ifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSVRDIiwgIChjb25zdCBGY0NoYXI4ICopICJpdGMifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSU1QUiIsIChjb25zdCBGY0NoYXI4ICopICJpbXByZXNzIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAibGFyYWJpZWZvbnRzIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxFQUYiLCAoY29uc3QgRmNDaGFyOCAqKSAiaW50ZXJsZWFmIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxFVFIiLCAoY29uc3QgRmNDaGFyOCAqKSAibGV0cmFzZXQifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTElOTyIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNQUNSIiwgKGNvbnN0IEZjQ2hhcjggKikgIm1hY3JvbWVkaWEifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTU9OTyIsIChjb25zdCBGY0NoYXI4ICopICJtb25vdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNUyIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNVCIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk5FQyIsICAoY29uc3QgRmNDaGFyOCAqKSAibmVjIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIlBBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAicGFyYXR5cGUifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiUU1TSSIsIChjb25zdCBGY0NoYXI4ICopICJxbXMifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiUklDTyIsIChjb25zdCBGY0NoYXI4ICopICJyaWNvaCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJVUlciLCAgKGNvbnN0IEZjQ2hhcjggKikgInVydyJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJZJlkiLCAgKGNvbnN0IEZjQ2hhcjggKikgInkmeSJ9Cn07CgojZGVmaW5lIE5VTV9WRU5ET1JfRk9VTkRSSUVTCShzaXplb2YgKEZjVmVuZG9yRm91bmRyaWVzKSAvIHNpemVvZiAoRmNWZW5kb3JGb3VuZHJpZXNbMF0pKQoKc3RhdGljIGNvbnN0IEZjQ2hhcjggKgpGY1ZlbmRvckZvdW5kcnkoY29uc3QgY2hhciAqdmVuZG9yKQp7CiAgICBpbnQgaTsKICAgIAogICAgaWYgKHZlbmRvcikKCWZvcihpID0gMDsgaSA8IE5VTV9WRU5ET1JfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKEZjVmVuZG9yTWF0Y2ggKHZlbmRvciwgRmNWZW5kb3JGb3VuZHJpZXNbaV0udmVuZG9yKSkKCQlyZXR1cm4gRmNWZW5kb3JGb3VuZHJpZXNbaV0uZm91bmRyeTsKICAgIHJldHVybiAwOwp9CgoKRmNQYXR0ZXJuICoKRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBGY0NoYXI4CSpmaWxlLAoJCSBpbnQJCWlkLAoJCSBGY0JsYW5rcwkqYmxhbmtzLAoJCSBpbnQJCSpjb3VudCkKewogICAgRlRfRmFjZQkgICAgZmFjZTsKICAgIEZjUGF0dGVybgkgICAgKnBhdDsKICAgIGludAkJICAgIHNsYW50OwogICAgaW50CQkgICAgd2VpZ2h0OwogICAgaW50CQkgICAgd2lkdGggPSAtMTsKICAgIGludAkJICAgIGk7CiAgICBGY0NoYXJTZXQJICAgICpjczsKICAgIEZjTGFuZ1NldAkgICAgKmxzOwogICAgRlRfTGlicmFyeQkgICAgZnRMaWJyYXJ5OwogICAgRmNDaGFyOAkgICAgKmZhbWlseSA9IDA7CiAgICBGY0NoYXI4CSAgICAqc3R5bGUgPSAwOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5ID0gMDsKICAgIGludAkJICAgIHNwYWNpbmc7CiAgICBUVF9PUzIJICAgICpvczI7CiAgICBQU19Gb250SW5mb1JlYyAgcHNmb250aW5mbzsKICAgIFRUX0hlYWRlcgkgICAgKmhlYWQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKmV4Y2x1c2l2ZUxhbmcgPSAwOwogICAgRlRfU2ZudE5hbWUJICAgIHNuYW1lOwogICAgRlRfVUludCAgICAJICAgIHNuYW1laSwgc25hbWVjOwogICAgRmNCb29sCSAgICBmYW1pbHlfYWxsb2NhdGVkID0gRmNGYWxzZTsKICAgIEZjQm9vbAkgICAgc3R5bGVfYWxsb2NhdGVkID0gRmNGYWxzZTsKICAgIGludAkJICAgIGZhbWlseV9wcmlvID0gMDsKICAgIGludAkJICAgIHN0eWxlX3ByaW8gPSAwOwoKICAgIGlmIChGVF9Jbml0X0ZyZWVUeXBlICgmZnRMaWJyYXJ5KSkKCXJldHVybiAwOwogICAgCiAgICBpZiAoRlRfTmV3X0ZhY2UgKGZ0TGlicmFyeSwgKGNoYXIgKikgZmlsZSwgaWQsICZmYWNlKSkKCWdvdG8gYmFpbDsKCiAgICAqY291bnQgPSBmYWNlLT5udW1fZmFjZXM7CgogICAgcGF0ID0gRmNQYXR0ZXJuQ3JlYXRlICgpOwogICAgaWYgKCFwYXQpCglnb3RvIGJhaWwwOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkQm9vbCAocGF0LCBGQ19PVVRMSU5FLAoJCQkgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkgIT0gMCkpCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkQm9vbCAocGF0LCBGQ19TQ0FMQUJMRSwKCQkJICAgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpICE9IDApKQoJZ290byBiYWlsMTsKCgogICAgc2xhbnQgPSBGQ19TTEFOVF9ST01BTjsKICAgIGlmIChmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDKQoJc2xhbnQgPSBGQ19TTEFOVF9JVEFMSUM7CgoKICAgIHdlaWdodCA9IEZDX1dFSUdIVF9NRURJVU07CiAgICBpZiAoZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0JPTEQpCgl3ZWlnaHQgPSBGQ19XRUlHSFRfQk9MRDsKCiAgICAvKgogICAgICogR2V0IHRoZSBPUy8yIHRhYmxlCiAgICAgKi8KICAgIG9zMiA9IChUVF9PUzIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfb3MyKTsKCiAgICAvKgogICAgICogTG9vayBmaXJzdCBpbiB0aGUgT1MvMiB0YWJsZSBmb3IgdGhlIGZvdW5kcnksIGlmCiAgICAgKiBub3QgZm91bmQgaGVyZSwgdGhlIHZhcmlvdXMgbm90aWNlcyB3aWxsIGJlIHNlYXJjaGVkIGZvcgogICAgICogdGhhdCBpbmZvcm1hdGlvbiwgZWl0aGVyIGZyb20gdGhlIHNmbnQgbmFtZSB0YWJsZXMgb3IKICAgICAqIHRoZSBQb3N0c2NyaXB0IEZvbnRJbmZvIGRpY3Rpb25hcnkuICBGaW5hbGx5LCB0aGUKICAgICAqIEJERiBwcm9wZXJ0aWVzIHdpbGwgcXVlcmllZC4KICAgICAqLwogICAgCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgICAgICBmb3VuZHJ5ID0gRmNWZW5kb3JGb3VuZHJ5KG9zMi0+YWNoVmVuZElEKTsKCiAgICAvKgogICAgICogR3J1YiB0aHJvdWdoIHRoZSBuYW1lIHRhYmxlIGxvb2tpbmcgZm9yIGZhbWlseQogICAgICogYW5kIHN0eWxlIG5hbWVzLiAgRnJlZVR5cGUgbWFrZXMgcXVpdGUgYSBoYXNoCiAgICAgKiBvZiB0aGVtCiAgICAgKi8KICAgIHNuYW1lYyA9IEZUX0dldF9TZm50X05hbWVfQ291bnQgKGZhY2UpOwogICAgZm9yIChzbmFtZWkgPSAwOyBzbmFtZWkgPCBzbmFtZWM7IHNuYW1laSsrKQogICAgewoJRmNDaGFyOAkJKnV0Zjg7CglpbnQJCWxlbjsKCWludAkJd2NoYXI7CglGY0NoYXI4CQkqc3JjOwoJaW50CQlzcmNfbGVuOwoJRmNDaGFyOAkJKnU4OwoJRmNDaGFyMzIJdWNzNDsKCWludAkJaWxlbiwgb2xlbjsKCWludAkJcHJpbyA9IDA7CgkKCWNvbnN0IEZjQ2hhck1hcAkqbWFwOwoJZW51bSB7CgkgICAgRmNOYW1lRW5jb2RpbmdVdGYxNiwgCgkgICAgRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuLAoJICAgIEZjTmFtZUVuY29kaW5nTGF0aW4xIAoJfSBlbmNvZGluZzsKCQoJCglpZiAoRlRfR2V0X1NmbnRfTmFtZSAoZmFjZSwgc25hbWVpLCAmc25hbWUpICE9IDApCgkgICAgYnJlYWs7CgkKCS8qCgkgKiBMb29rIGZvciBVbmljb2RlIHN0cmluZ3MKCSAqLwoJc3dpdGNoIChzbmFtZS5wbGF0Zm9ybV9pZCkgewoJY2FzZSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFOgoJICAgIC8qCgkgICAgICogQWxsIEFQUExFX1VOSUNPREUgZW5jb2RpbmdzIGFyZSBVdGYxNiBCRQoJICAgICAqCgkgICAgICogQmVjYXVzZSB0aGVyZSdzIG5vIGxhbmd1YWdlIGlkIGZvciBVbmljb2RlLAoJICAgICAqIGFzc3VtZSBpdCdzIEVuZ2xpc2gKCSAgICAgKi8KCSAgICBwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fRU5DX1VOSUNPREU7CgkgICAgZW5jb2RpbmcgPSBGY05hbWVFbmNvZGluZ1V0ZjE2OwoJICAgIGJyZWFrOwoJY2FzZSBUVF9QTEFURk9STV9NQUNJTlRPU0g6CgkgICAgc3dpdGNoIChzbmFtZS5lbmNvZGluZ19pZCkgewoJICAgIGNhc2UgVFRfTUFDX0lEX1JPTUFOOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJY29udGludWU7CgkgICAgfQoJICAgIHN3aXRjaCAoc25hbWUubGFuZ3VhZ2VfaWQpIHsKCSAgICBjYXNlIFRUX01BQ19MQU5HSURfRU5HTElTSDoKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQkvKgoJCSAqIFNvbWV0aW1lcyBNaWNyb3NvZnQgbGFuZ3VhZ2UgaWRzCgkJICogZW5kIHVwIGluIHRoZSBtYWNpbnRvc2ggdGFibGUuICBUaGlzCgkJICogaXMgb2Z0ZW4gYWNjb21wYW5pZWQgYnkgZGF0YSBpbgoJCSAqIHNvbWUgbXlzdGljIGVuY29kaW5nLiAgSWdub3JlIHRoZXNlIG5hbWVzCgkJICovCgkJaWYgKHNuYW1lLmxhbmd1YWdlX2lkID49IDB4MTAwKQoJCSAgICBjb250aW51ZTsKCQlicmVhazsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFRUX1BMQVRGT1JNX01JQ1JPU09GVDoKCSAgICBzd2l0Y2ggKHNuYW1lLmVuY29kaW5nX2lkKSB7CgkgICAgY2FzZSBUVF9NU19JRF9VTklDT0RFX0NTOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdVdGYxNjsKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERTsKCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBzd2l0Y2ggKHNuYW1lLmxhbmd1YWdlX2lkICYgMHhmZikgewoJICAgIGNhc2UgMHgwOToKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlicmVhazsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFRUX1BMQVRGT1JNX0lTTzoKCSAgICBzd2l0Y2ggKHNuYW1lLmVuY29kaW5nX2lkKSB7CgkgICAgY2FzZSBUVF9JU09fSURfMTA2NDY6CgkJZW5jb2RpbmcgPSBGY05hbWVFbmNvZGluZ1V0ZjE2OwoJCXByaW8gfD0gRkNfTkFNRV9QUklPX0VOQ19VTklDT0RFOwoJCWJyZWFrOwoJICAgIGNhc2UgVFRfSVNPX0lEXzdCSVRfQVNDSUk6CgkgICAgY2FzZSBUVF9JU09fSURfODg1OV8xOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdMYXRpbjE7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQljb250aW51ZTsKCSAgICB9CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJCgkvKgoJICogTG9vayBmb3IgZmFtaWx5IGFuZCBzdHlsZSBuYW1lcyAKCSAqLwoJc3dpdGNoIChzbmFtZS5uYW1lX2lkKSB7CgljYXNlIFRUX05BTUVfSURfRk9OVF9GQU1JTFk6CgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fTkFNRV9GQU1JTFk7CgkgICAgYnJlYWs7CgljYXNlIFRUX05BTUVfSURfUFNfTkFNRToKCSAgICBwcmlvIHw9IEZDX05BTUVfUFJJT19OQU1FX1BTOwoJICAgIGJyZWFrOwoJY2FzZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZOgogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9UUkFERU1BUks6CiAgICAgICAgY2FzZSBUVF9OQU1FX0lEX01BTlVGQUNUVVJFUjoKICAgICAgICAgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJICAgIAogICAgICAgIHNyYyA9IChGY0NoYXI4ICopIHNuYW1lLnN0cmluZzsKICAgICAgICBzcmNfbGVuID0gc25hbWUuc3RyaW5nX2xlbjsKCQoJc3dpdGNoIChlbmNvZGluZykgewoJY2FzZSBGY05hbWVFbmNvZGluZ1V0ZjE2OgoJICAgIC8qCgkgICAgICogQ29udmVydCBVdGYxNiB0byBVdGY4CgkgICAgICovCgkgICAgCgkgICAgaWYgKCFGY1V0ZjE2TGVuIChzcmMsIEZjRW5kaWFuQmlnLCBzcmNfbGVuLCAmbGVuLCAmd2NoYXIpKQoJCWNvbnRpbnVlOwogICAgCgkgICAgLyoKCSAgICAgKiBBbGxvY2F0ZSBwbGVudHkgb2Ygc3BhY2UuICBGcmVlZCBiZWxvdwoJICAgICAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKGxlbiAqIEZDX1VURjhfTUFYX0xFTiArIDEpOwoJICAgIGlmICghdXRmOCkKCQljb250aW51ZTsKCQkKCSAgICB1OCA9IHV0Zjg7CgkgICAgCgkgICAgd2hpbGUgKChpbGVuID0gRmNVdGYxNlRvVWNzNCAoc3JjLCBGY0VuZGlhbkJpZywgJnVjczQsIHNyY19sZW4pKSA+IDApCgkgICAgewoJCXNyY19sZW4gLT0gaWxlbjsKCQlzcmMgKz0gaWxlbjsKCQlvbGVuID0gRmNVY3M0VG9VdGY4ICh1Y3M0LCB1OCk7CgkJdTggKz0gb2xlbjsKCSAgICB9CgkgICAgKnU4ID0gJ1wwJzsKCSAgICBicmVhazsKCWNhc2UgRmNOYW1lRW5jb2RpbmdMYXRpbjE6CgkgICAgLyoKCSAgICAgKiBDb252ZXJ0IExhdGluMSB0byBVdGY4LiBGcmVlZCBiZWxvdwoJICAgICAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKHNyY19sZW4gKiAyICsgMSk7CgkgICAgaWYgKCF1dGY4KQoJCWNvbnRpbnVlOwoKCSAgICB1OCA9IHV0Zjg7CgkgICAgd2hpbGUgKHNyY19sZW4gPiAwKQoJICAgIHsKCQl1Y3M0ID0gKnNyYysrOwoJCXNyY19sZW4tLTsKCQlvbGVuID0gRmNVY3M0VG9VdGY4ICh1Y3M0LCB1OCk7CgkJdTggKz0gb2xlbjsKCSAgICB9CgkgICAgKnU4ID0gJ1wwJzsKCSAgICBicmVhazsKCWNhc2UgRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuOgoJICAgIC8qCgkgICAgICogQ29udmVydCBBcHBsZVJvbWFuIHRvIFV0ZjgKCSAgICAgKi8KCSAgICBtYXAgPSBGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4pOwoJICAgIGlmICghbWFwKQoJCWNvbnRpbnVlOwoKCSAgICAvKiBmcmVlZCBiZWxvdyAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKHNyY19sZW4gKiAzICsgMSk7CgkgICAgaWYgKCF1dGY4KQoJCWNvbnRpbnVlOwoKCSAgICB1OCA9IHV0Zjg7CgkgICAgd2hpbGUgKHNyY19sZW4gPiAwKQoJICAgIHsKCQl1Y3M0ID0gRmNGcmVlVHlwZVByaXZhdGVUb1VjczQgKCpzcmMrKywgbWFwKTsKCQlzcmNfbGVuLS07CgkJb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJCXU4ICs9IG9sZW47CgkgICAgfQoJICAgICp1OCA9ICdcMCc7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKChwcmlvICYgRkNfTkFNRV9QUklPX0xBTkcpID09IEZDX05BTUVfUFJJT19MQU5HX05PTkUpCgkgICAgaWYgKEZjVXRmOElzTGF0aW4gKHV0ZjgsIHN0cmxlbiAoKGNoYXIgKikgdXRmOCkpKQoJCXByaW8gfD0gRkNfTkFNRV9QUklPX0xBTkdfTEFUSU47CgkJCSAgICAgICAKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU5WKQoJICAgIHByaW50ZiAoIlxuZm91bmQgbmFtZSAobmFtZSAlZCBwbGF0Zm9ybSAlZCBlbmNvZGluZyAlZCBsYW5ndWFnZSAweCV4IHByaW8gMHgleCkgJXNcbiIsCgkJICAgIHNuYW1lLm5hbWVfaWQsIHNuYW1lLnBsYXRmb3JtX2lkLAoJCSAgICBzbmFtZS5lbmNvZGluZ19pZCwgc25hbWUubGFuZ3VhZ2VfaWQsCgkJICAgIHByaW8sIHV0ZjgpOwogICAgCglzd2l0Y2ggKHNuYW1lLm5hbWVfaWQpIHsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWToKCWNhc2UgVFRfTkFNRV9JRF9QU19OQU1FOgoJICAgIGlmICghZmFtaWx5IHx8IHByaW8gPiBmYW1pbHlfcHJpbykKCSAgICB7CgkJaWYgKGZhbWlseSkKCQkgICAgZnJlZSAoZmFtaWx5KTsKCQlmYW1pbHkgPSB1dGY4OwoJCXV0ZjggPSAwOwoJCWZhbWlseV9hbGxvY2F0ZWQgPSBGY1RydWU7CgkJZmFtaWx5X3ByaW8gPSBwcmlvOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWToKCSAgICBpZiAoIXN0eWxlIHx8IHByaW8gPiBzdHlsZV9wcmlvKQoJICAgIHsKCQlpZiAoc3R5bGUpCgkJICAgIGZyZWUgKHN0eWxlKTsKCQlzdHlsZSA9IHV0Zjg7CgkJdXRmOCA9IDA7CgkJc3R5bGVfYWxsb2NhdGVkID0gRmNUcnVlOwoJCXN0eWxlX3ByaW8gPSBwcmlvOwoJICAgIH0KCSAgICBicmVhazsKICAgICAgICBjYXNlIFRUX05BTUVfSURfVFJBREVNQVJLOgogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9NQU5VRkFDVFVSRVI6CgkgICAgLyogSWYgdGhlIGZvdW5kcnkgd2Fzbid0IGZvdW5kIGluIHRoZSBPUy8yIHRhYmxlLCBsb29rIGhlcmUgKi8KICAgICAgICAgICAgaWYoIWZvdW5kcnkpCiAgICAgICAgICAgICAgICBmb3VuZHJ5ID0gRmNOb3RpY2VGb3VuZHJ5KHV0ZjgpOwogICAgICAgICAgICBicmVhazsKCX0KCWlmICh1dGY4KQoJICAgIGZyZWUgKHV0ZjgpOwogICAgfQogICAgCiAgICBpZiAoIWZhbWlseSkKCWZhbWlseSA9IChGY0NoYXI4ICopIGZhY2UtPmZhbWlseV9uYW1lOwogICAgCiAgICBpZiAoIXN0eWxlKQoJc3R5bGUgPSAoRmNDaGFyOCAqKSBmYWNlLT5zdHlsZV9uYW1lOwogICAgCiAgICBpZiAoIWZhbWlseSkKICAgIHsKCUZjQ2hhcjgJKnN0YXJ0LCAqZW5kOwoJCglzdGFydCA9IChGY0NoYXI4ICopIHN0cnJjaHIgKChjaGFyICopIGZpbGUsICcvJyk7CglpZiAoc3RhcnQpCgkgICAgc3RhcnQrKzsKCWVsc2UKCSAgICBzdGFydCA9IChGY0NoYXI4ICopIGZpbGU7CgllbmQgPSAoRmNDaGFyOCAqKSBzdHJyY2hyICgoY2hhciAqKSBzdGFydCwgJy4nKTsKCWlmICghZW5kKQoJICAgIGVuZCA9IHN0YXJ0ICsgc3RybGVuICgoY2hhciAqKSBzdGFydCk7CgkvKiBmcmVlZCBiZWxvdyAqLwoJZmFtaWx5ID0gbWFsbG9jIChlbmQgLSBzdGFydCArIDEpOwoJc3RybmNweSAoKGNoYXIgKikgZmFtaWx5LCAoY2hhciAqKSBzdGFydCwgZW5kIC0gc3RhcnQpOwoJZmFtaWx5W2VuZCAtIHN0YXJ0XSA9ICdcMCc7CglmYW1pbHlfYWxsb2NhdGVkID0gRmNUcnVlOwogICAgfQoKICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfU0NBTikKCXByaW50ZiAoIlwiJXNcIiBcIiVzXCIgIiwgZmFtaWx5LCBzdHlsZSA/IHN0eWxlIDogKEZjQ2hhcjggKikgIjxub25lPiIpOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZBTUlMWSwgZmFtaWx5KSkKICAgIHsKCWlmIChmYW1pbHlfYWxsb2NhdGVkKQoJICAgIGZyZWUgKGZhbWlseSk7CglpZiAoc3R5bGVfYWxsb2NhdGVkKQoJICAgIGZyZWUgKHN0eWxlKTsKCWdvdG8gYmFpbDE7CiAgICB9CgogICAgaWYgKGZhbWlseV9hbGxvY2F0ZWQpCglmcmVlIChmYW1pbHkpOwoKICAgIGlmIChzdHlsZSkKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX1NUWUxFLCBzdHlsZSkpCgl7CgkgICAgaWYgKHN0eWxlX2FsbG9jYXRlZCkKCQlmcmVlIChzdHlsZSk7CgkgICAgZ290byBiYWlsMTsKCX0KCWlmIChzdHlsZV9hbGxvY2F0ZWQpCgkgICAgZnJlZSAoc3R5bGUpOwogICAgfQoKICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZJTEUsIGZpbGUpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfSU5ERVgsIGlkKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfU09VUkNFLCAoRmNDaGFyOCAqKSAiRnJlZVR5cGUiKSkKCWdvdG8gYmFpbDE7CgojaWYgMAogICAgLyoKICAgICAqIGRvbid0IGV2ZW4gdHJ5IHRoaXMgLS0gQ0pLICdtb25vc3BhY2UnIGZvbnRzIGFyZSByZWFsbHkKICAgICAqIGR1YWwgd2lkdGgsIGFuZCBtb3N0IG90aGVyIGZvbnRzIGRvbid0IGJvdGhlciB0byBzZXQKICAgICAqIHRoZSBhdHRyaWJ1dGUuICBTaWdoLgogICAgICovCiAgICBpZiAoKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEgpICE9IDApCglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU1BBQ0lORywgRkNfTU9OTykpCgkgICAgZ290byBiYWlsMTsKI2VuZGlmCgogICAgLyoKICAgICAqIEZpbmQgdGhlIGZvbnQgcmV2aXNpb24gKGlmIGF2YWlsYWJsZSkKICAgICAqLwogICAgaGVhZCA9IChUVF9IZWFkZXIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfaGVhZCk7CiAgICBpZiAoaGVhZCkKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19GT05UVkVSU0lPTiwgaGVhZC0+Rm9udF9SZXZpc2lvbikpCgkgICAgZ290byBiYWlsMTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19GT05UVkVSU0lPTiwgMCkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09ERV9QQUdFX1JBTkdFOyBpKyspCgl7CgkgICAgRlRfVUxvbmcJYml0czsKCSAgICBpbnQJCWJpdDsKCSAgICBpZiAoRmNDb2RlUGFnZVJhbmdlW2ldLmJpdCA8IDMyKQoJICAgIHsKCQliaXRzID0gb3MyLT51bENvZGVQYWdlUmFuZ2UxOwoJCWJpdCA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQ7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJYml0cyA9IG9zMi0+dWxDb2RlUGFnZVJhbmdlMjsKCQliaXQgPSBGY0NvZGVQYWdlUmFuZ2VbaV0uYml0IC0gMzI7CgkgICAgfQoJICAgIGlmIChiaXRzICYgKDEgPDwgYml0KSkKCSAgICB7CgkJLyogCgkJICogSWYgdGhlIGZvbnQgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciBtdWx0aXBsZQoJCSAqICJleGNsdXNpdmUiIGxhbmd1YWdlcywgdGhlbiBpbmNsdWRlIHN1cHBvcnQKCQkgKiBmb3IgYW55IGxhbmd1YWdlIGZvdW5kIHRvIGhhdmUgY292ZXJhZ2UKCQkgKi8KCQlpZiAoZXhjbHVzaXZlTGFuZykKCQl7CgkJICAgIGV4Y2x1c2l2ZUxhbmcgPSAwOwoJCSAgICBicmVhazsKCQl9CgkJZXhjbHVzaXZlTGFuZyA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5sYW5nOwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiAhPSAweGZmZmYpCiAgICB7CglpZiAob3MyLT51c1dlaWdodENsYXNzID09IDApCgkgICAgd2VpZ2h0ID0gLTE7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAxNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX1RISU47CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAyNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0VYVFJBTElHSFQ7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAzNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0xJR0hUOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNDUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9SRUdVTEFSOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9NRURJVU07CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCA2NTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX1NFTUlCT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNzUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9CT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgODUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9FWFRSQUJPTEQ7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCA5NTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0JMQUNLOwoJZWxzZQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9NRURJVU07CgoJc3dpdGNoIChvczItPnVzV2lkdGhDbGFzcykgewoJY2FzZSAxOgl3aWR0aCA9IEZDX1dJRFRIX1VMVFJBQ09OREVOU0VEOyBicmVhazsKCWNhc2UgMjoJd2lkdGggPSBGQ19XSURUSF9FWFRSQUNPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDM6CXdpZHRoID0gRkNfV0lEVEhfQ09OREVOU0VEOyBicmVhazsKCWNhc2UgNDoJd2lkdGggPSBGQ19XSURUSF9TRU1JQ09OREVOU0VEOyBicmVhazsKCWNhc2UgNToJd2lkdGggPSBGQ19XSURUSF9OT1JNQUw7IGJyZWFrOwoJY2FzZSA2Ogl3aWR0aCA9IEZDX1dJRFRIX1NFTUlFWFBBTkRFRDsgYnJlYWs7CgljYXNlIDc6CXdpZHRoID0gRkNfV0lEVEhfRVhQQU5ERUQ7IGJyZWFrOwoJY2FzZSA4Ogl3aWR0aCA9IEZDX1dJRFRIX0VYVFJBRVhQQU5ERUQ7IGJyZWFrOwoJY2FzZSA5Ogl3aWR0aCA9IEZDX1dJRFRIX1VMVFJBRVhQQU5ERUQ7IGJyZWFrOwoJfQogICAgfQoKICAgIC8qCiAgICAgKiBUeXBlIDE6IENoZWNrIGZvciBGb250SW5mbyBkaWN0aW9uYXJ5IGluZm9ybWF0aW9uCiAgICAgKiBDb2RlIGZyb20gZzJAbWFnZXN0dWRpb3MubmV0IChHZXJhcmQgRXNjYWxhbnRlKQogICAgICovCiAgICAKICAgIGlmIChGVF9HZXRfUFNfRm9udF9JbmZvKGZhY2UsICZwc2ZvbnRpbmZvKSA9PSAwKQogICAgewoJaWYgKHBzZm9udGluZm8ud2VpZ2h0KQoJewoJICAgIHN0YXRpYyBzdHJ1Y3QgewoJCWNoYXIgICAgKm5hbWU7CgkJaW50CXZhbHVlOwoJICAgIH0gcHNfd2VpZ2h0c1tdID0gewoJCXsgInRoaW4iLAkJRkNfV0VJR0hUX1RISU4gfSwKCQl7ICJleHRyYWxpZ2h0IiwJCUZDX1dFSUdIVF9FWFRSQUxJR0hUIH0sCgkJeyAidWx0cmFsaWdodCIsCQlGQ19XRUlHSFRfVUxUUkFMSUdIVCB9LAoJCXsgImxpZ2h0IiwJCUZDX1dFSUdIVF9MSUdIVCB9LAoJCXsgInJlZ3VsYXIiLAkJRkNfV0VJR0hUX1JFR1VMQVIgfSwKCQl7ICJub3JtYWwiLAkJRkNfV0VJR0hUX05PUk1BTCB9LAoJCXsgIm1lZGl1bSIsCQlGQ19XRUlHSFRfTUVESVVNIH0sCgkJeyAiZGVtaWJvbGQiLAkJRkNfV0VJR0hUX0RFTUlCT0xEIH0sCgkJeyAic2VtaWJvbGQiLAkJRkNfV0VJR0hUX1NFTUlCT0xEIH0sCgkJeyAiYm9sZCIsCQlGQ19XRUlHSFRfQk9MRCB9LAoJCXsgImV4dHJhYm9sZCIsCQlGQ19XRUlHSFRfRVhUUkFCT0xEIH0sCgkJeyAidWx0cmFib2xkIiwJCUZDX1dFSUdIVF9VTFRSQUJPTEQgfSwKCQl7ICJibGFjayIsCQlGQ19XRUlHSFRfQkxBQ0sgfSwKCQl7ICJoZWF2eSIsCQlGQ19XRUlHSFRfSEVBVlkgfSwKCSAgICB9OwojZGVmaW5lIE5VTV9QU19XRUlHSFRTCShzaXplb2YgKHBzX3dlaWdodHMpIC8gc2l6ZW9mIChwc193ZWlnaHRzWzBdKSkKCSAgICBpbnQJdzsKCSAgICBmb3IgKHcgPSAwOyB3IDwgTlVNX1BTX1dFSUdIVFM7IHcrKykKCQlpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAoKEZjQ2hhcjggKikgcHNfd2VpZ2h0c1t3XS5uYW1lLAoJCQkJCSAoRmNDaGFyOCAqKSBwc2ZvbnRpbmZvLndlaWdodCkpCgkJewoJCSAgICB3ZWlnaHQgPSBwc193ZWlnaHRzW3ddLnZhbHVlOwoJCSAgICBicmVhazsKCQl9Cgl9CiAgICAgCiNpZiAwCgkvKiAKCSAqIERvbid0IGJvdGhlciB3aXRoIGl0YWxpY19hbmdsZTsgRnJlZVR5cGUgYWxyZWFkeSBleHRyYWN0cyB0aGF0CgkgKiBpbmZvcm1hdGlvbiBmb3IgdXMgYW5kIHN0aWNrcyBpdCBpbnRvIHN0eWxlX2ZsYWdzCgkgKi8KICAgICAgICBpZiAocHNmb250aW5mby5pdGFsaWNfYW5nbGUgPCAwKSAKICAgICAgICAgICAgc2xhbnQgPSBGQ19TTEFOVF9JVEFMSUM7IAogICAgICAgIGVsc2UgaWYgKHBzZm9udGluZm8uaXRhbGljX2FuZ2xlID49IDApIAogICAgICAgICAgICBzbGFudCA9IEZDX1NMQU5UX1JPTUFOOyAKI2VuZGlmCgogICAgICAgIGlmKCFmb3VuZHJ5KQogICAgICAgICAgICBmb3VuZHJ5ID0gRmNOb3RpY2VGb3VuZHJ5KHBzZm9udGluZm8ubm90aWNlKTsKICAgIH0KICAgIAojaWZkZWYgVVNFX0ZUQkRGCiAgICAvKgogICAgICogRmluYWxseSwgbG9vayBmb3IgYSBGT1VORFJZIEJERiBwcm9wZXJ0eSBpZiBubyBvdGhlcgogICAgICogbWVjaGFuaXNtIGhhcyBtYW5hZ2VkIHRvIGxvY2F0ZSBhIGZvdW5kcnkKICAgICAqLwoKICAgIGlmICghZm91bmRyeSkKICAgIHsKCWludCAgICAgICAgICAgICByYzsKCUJERl9Qcm9wZXJ0eVJlYyBwcm9wOwoJcmMgPSBNWV9HZXRfQkRGX1Byb3BlcnR5KGZhY2UsICJGT1VORFJZIiwgJnByb3ApOwoJaWYocmMgPT0gMCAmJiBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTSkKCSAgICBmb3VuZHJ5ID0gcHJvcC51LmF0b207CiAgICB9CgogICAgaWYgKHdpZHRoID09IC0xKQogICAgewoJQkRGX1Byb3BlcnR5UmVjIHByb3A7CglpZiAoTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiUkVMQVRJVkVfU0VUV0lEVEgiLCAmcHJvcCkgPT0gMCAmJgoJICAgIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiB8fAoJICAgICBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwpKQoJewoJICAgIEZUX0ludDMyCXZhbHVlOwoJICAgIAoJICAgIGlmIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUikKCQl2YWx1ZSA9IHByb3AudS5pbnRlZ2VyOwoJICAgIGVsc2UKCQl2YWx1ZSA9IChGVF9JbnQzMikgcHJvcC51LmNhcmRpbmFsOwoJICAgIHN3aXRjaCAoKHZhbHVlICsgNSkgLyAxMCkgewoJICAgIGNhc2UgMTogd2lkdGggPSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSAyOiB3aWR0aCA9IEZDX1dJRFRIX0VYVFJBQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDM6IHdpZHRoID0gRkNfV0lEVEhfQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDQ6IHdpZHRoID0gRkNfV0lEVEhfU0VNSUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSA1OiB3aWR0aCA9IEZDX1dJRFRIX05PUk1BTDsgYnJlYWs7CgkgICAgY2FzZSA2OiB3aWR0aCA9IEZDX1dJRFRIX1NFTUlFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA3OiB3aWR0aCA9IEZDX1dJRFRIX0VYUEFOREVEOyBicmVhazsKCSAgICBjYXNlIDg6IHdpZHRoID0gRkNfV0lEVEhfRVhUUkFFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA5OiB3aWR0aCA9IEZDX1dJRFRIX1VMVFJBRVhQQU5ERUQ7IGJyZWFrOwoJICAgIH0KCX0KCWVsc2UgaWYgKE1ZX0dldF9CREZfUHJvcGVydHkgKGZhY2UsICJTRVRXSURUSF9OQU1FIiwgJnByb3ApID09IDAgJiYKCQkgcHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0FUT00pCgl7CgkgICAgc3RhdGljIHN0cnVjdCB7CgkJRmNDaGFyOAkgICAgKndpZHRoX25hbWU7CgkJaW50CSAgICB3aWR0aDsKCSAgICB9IEZjU2V0V2lkdGhzW10gPSB7CgkJeyAiQ29uZGVuc2VkIiwJICAgIEZDX1dJRFRIX0NPTkRFTlNFRCB9LAoJCXsgIlNlbWlDb25kZW5zZWQiLCAgRkNfV0lEVEhfU0VNSUNPTkRFTlNFRCB9LAoJCXsgIk5vcm1hbCIsCSAgICBGQ19XSURUSF9OT1JNQUwgfSwKCSAgICB9OwoJICAgIGludAlpOwoKCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOVikKCQlwcmludGYgKCJcbnNldHdpZHRoOiAlc1xuIiwgcHJvcC51LmF0b20pOwoJICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKEZjU2V0V2lkdGhzKSAvIHNpemVvZiAoRmNTZXRXaWR0aHNbMF0pOyBpKyspCgkJaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKChGY0NoYXI4ICopIHByb3AudS5hdG9tLAoJCQkJCSBGY1NldFdpZHRoc1tpXS53aWR0aF9uYW1lKSkKCQl7CgkJICAgIHdpZHRoID0gRmNTZXRXaWR0aHNbaV0ud2lkdGg7CgkJICAgIGJyZWFrOwoJCX0KCX0KICAgIH0KCiNlbmRpZgoKICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19TTEFOVCwgc2xhbnQpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfV0VJR0hULCB3ZWlnaHQpKQoJZ290byBiYWlsMTsKCiAgICBpZiAod2lkdGggIT0gLTEpCglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfV0lEVEgsIHdpZHRoKSkKCSAgICBnb3RvIGJhaWwxOwoKICAgIGlmKGZvdW5kcnkpIAogICAgewogICAgICAgIGlmKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRk9VTkRSWSwgZm91bmRyeSkpCiAgICAgICAgICAgIGdvdG8gYmFpbDE7CiAgICB9CgogICAgLyoKICAgICAqIENvbXB1dGUgdGhlIHVuaWNvZGUgY292ZXJhZ2UgZm9yIHRoZSBmb250CiAgICAgKi8KICAgIGNzID0gRmNGcmVlVHlwZUNoYXJTZXRBbmRTcGFjaW5nIChmYWNlLCBibGFua3MsICZzcGFjaW5nKTsKICAgIGlmICghY3MpCglnb3RvIGJhaWwxOwoKICAgIC8qCiAgICAgKiBTa2lwIG92ZXIgUENGIGZvbnRzIHRoYXQgaGF2ZSBubyBlbmNvZGVkIGNoYXJhY3RlcnM7IHRoZXkncmUKICAgICAqIHVzdWFsbHkganVzdCBVbmljb2RlIGZvbnRzIHRyYW5zY29kZWQgdG8gc29tZSBsZWdhY3kgZW5jb2RpbmcKICAgICAqLwogICAgaWYgKEZjQ2hhclNldENvdW50IChjcykgPT0gMCkKICAgIHsKCWlmICghc3RyY21wKEZUX01PRFVMRV9DTEFTUygmZmFjZS0+ZHJpdmVyLT5yb290KS0+bW9kdWxlX25hbWUsICJwY2YiKSkKCSAgICBnb3RvIGJhaWwyOwogICAgfQoKICAgIGlmICghRmNQYXR0ZXJuQWRkQ2hhclNldCAocGF0LCBGQ19DSEFSU0VULCBjcykpCglnb3RvIGJhaWwyOwoKICAgIGxzID0gRmNGcmVlVHlwZUxhbmdTZXQgKGNzLCBleGNsdXNpdmVMYW5nKTsKICAgIGlmICghbHMpCglnb3RvIGJhaWwyOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkTGFuZ1NldCAocGF0LCBGQ19MQU5HLCBscykpCglnb3RvIGJhaWwyOwoKICAgIGlmIChzcGFjaW5nICE9IEZDX1BST1BPUlRJT05BTCkKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19TUEFDSU5HLCBzcGFjaW5nKSkKCSAgICBnb3RvIGJhaWwyOwoKICAgIC8qCiAgICAgKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGNoYXJzZXQKICAgICAqLwogICAgRmNDaGFyU2V0RGVzdHJveSAoY3MpOwogICAgCiAgICBpZiAoIShmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBmYWNlLT5udW1fZml4ZWRfc2l6ZXM7IGkrKykKCSAgICBpZiAoIUZjUGF0dGVybkFkZERvdWJsZSAocGF0LCBGQ19QSVhFTF9TSVpFLAoJCQkJICAgICAoZG91YmxlKSBmYWNlLT5hdmFpbGFibGVfc2l6ZXNbaV0uaGVpZ2h0KSkKCQlnb3RvIGJhaWwxOwoJaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX0FOVElBTElBUywgRmNGYWxzZSkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KCiAgICBGVF9Eb25lX0ZhY2UgKGZhY2UpOwogICAgRlRfRG9uZV9GcmVlVHlwZSAoZnRMaWJyYXJ5KTsKICAgIHJldHVybiBwYXQ7CgpiYWlsMjoKICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKYmFpbDE6CiAgICBGY1BhdHRlcm5EZXN0cm95IChwYXQpOwpiYWlsMDoKICAgIEZUX0RvbmVfRmFjZSAoZmFjZSk7CmJhaWw6CiAgICBGVF9Eb25lX0ZyZWVUeXBlIChmdExpYnJhcnkpOwogICAgcmV0dXJuIDA7Cn0KCgovKgogKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIGF2YWlsYWJsZSBmcmVldHlwZSBoYXMgRlRfR2V0X05leHRfQ2hhcgogKi8KCiNpZiBGUkVFVFlQRV9NQUpPUiA+IDIKIyBkZWZpbmUgSEFTX05FWFRfQ0hBUgojZWxzZQojIGlmIEZSRUVUWVBFX01BSk9SID09IDIKIyAgaWYgRlJFRVRZUEVfTUlOT1IgPiAwCiMgICBkZWZpbmUgSEFTX05FWFRfQ0hBUgojICBlbHNlCiMgICBpZiBGUkVFVFlQRV9NSU5PUiA9PSAwCiMgICAgaWYgRlJFRVRZUEVfUEFUQ0ggPj0gOQojICAgICBkZWZpbmUgSEFTX05FWFRfQ0hBUgojICAgIGVuZGlmCiMgICBlbmRpZgojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKLyoKICogRm9yIG91ciBwdXJwb3NlcywgdGhpcyBhcHByb3hpbWF0aW9uIGlzIHN1ZmZpY2llbnQKICovCiNpZm5kZWYgSEFTX05FWFRfQ0hBUgojZGVmaW5lIEZUX0dldF9GaXJzdF9DaGFyKGZhY2UsIGdpKSAoKCooZ2kpID0gMSksIDEpCiNkZWZpbmUgRlRfR2V0X05leHRfQ2hhcihmYWNlLCB1Y3M0LCBnaSkgKCh1Y3M0KSA+PSAweGZmZmZmZiA/IFwKCQkJCQkgICgqKGdpKSA9IDApLCAwIDogXAoJCQkJCSAgKCooZ2kpID0gMSksICh1Y3M0KSArIDEpCiN3YXJuaW5nICJObyBGVF9HZXRfTmV4dF9DaGFyIgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJFbnQgewogICAgRmNDaGFyMTYJICAgIGJtcDsKICAgIHVuc2lnbmVkIGNoYXIgICBlbmNvZGU7Cn0gRmNDaGFyRW50OwoKc3RydWN0IF9GY0NoYXJNYXAgewogICAgY29uc3QgRmNDaGFyRW50ICplbnQ7CiAgICBpbnQJCSAgICBuZW50Owp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udERlY29kZSB7CiAgICBGVF9FbmNvZGluZwkgICAgZW5jb2Rpbmc7CiAgICBjb25zdCBGY0NoYXJNYXAgKm1hcDsKICAgIEZjQ2hhcjMyCSAgICBtYXg7Cn0gRmNGb250RGVjb2RlOwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBcHBsZVJvbWFuRW50W10gPSB7CiAgICB7IDB4MDAyMCwgMHgyMCB9LCAvKiBTUEFDRSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSyAqLwogICAgeyAweDAwMjIsIDB4MjIgfSwgLyogUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMDIzLCAweDIzIH0sIC8qIE5VTUJFUiBTSUdOICovCiAgICB7IDB4MDAyNCwgMHgyNCB9LCAvKiBET0xMQVIgU0lHTiAqLwogICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQgKi8KICAgIHsgMHgwMDI3LCAweDI3IH0sIC8qIEFQT1NUUk9QSEUgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTICovCiAgICB7IDB4MDAyQSwgMHgyQSB9LCAvKiBBU1RFUklTSyAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOICovCiAgICB7IDB4MDAyQywgMHgyQyB9LCAvKiBDT01NQSAqLwogICAgeyAweDAwMkQsIDB4MkQgfSwgLyogSFlQSEVOLU1JTlVTICovCiAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AgKi8KICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMgKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8gKi8KICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORSAqLwogICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPICovCiAgICB7IDB4MDAzMywgMHgzMyB9LCAvKiBESUdJVCBUSFJFRSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUiAqLwogICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRSAqLwogICAgeyAweDAwMzYsIDB4MzYgfSwgLyogRElHSVQgU0lYICovCiAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTiAqLwogICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUgKi8KICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOICovCiAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTiAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04gKi8KICAgIHsgMHgwMDNGLCAweDNGIH0sIC8qIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMDQwLCAweDQwIH0sIC8qIENPTU1FUkNJQUwgQVQgKi8KICAgIHsgMHgwMDQxLCAweDQxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KICAgIHsgMHgwMDQyLCAweDQyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDQzLCAweDQzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi8KICAgIHsgMHgwMDQ0LCAweDQ0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KICAgIHsgMHgwMDQ1LCAweDQ1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDQ2LCAweDQ2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEYgKi8KICAgIHsgMHgwMDQ3LCAweDQ3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KICAgIHsgMHgwMDQ4LCAweDQ4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDQ5LCAweDQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgKi8KICAgIHsgMHgwMDRBLCAweDRBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEogKi8KICAgIHsgMHgwMDRCLCAweDRCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDRDLCAweDRDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEwgKi8KICAgIHsgMHgwMDRELCAweDREIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi8KICAgIHsgMHgwMDRFLCAweDRFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDRGLCAweDRGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gKi8KICAgIHsgMHgwMDUwLCAweDUwIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi8KICAgIHsgMHgwMDUxLCAweDUxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDUyLCAweDUyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFIgKi8KICAgIHsgMHgwMDUzLCAweDUzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KICAgIHsgMHgwMDU0LCAweDU0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDU1LCAweDU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgKi8KICAgIHsgMHgwMDU2LCAweDU2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KICAgIHsgMHgwMDU3LCAweDU3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDU4LCAweDU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFggKi8KICAgIHsgMHgwMDU5LCAweDU5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KICAgIHsgMHgwMDVBLCAweDVBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVDLCAweDVDIH0sIC8qIFJFVkVSU0UgU09MSURVUyAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVFLCAweDVFIH0sIC8qIENJUkNVTUZMRVggQUNDRU5UICovCiAgICB7IDB4MDA1RiwgMHg1RiB9LCAvKiBMT1cgTElORSAqLwogICAgeyAweDAwNjAsIDB4NjAgfSwgLyogR1JBVkUgQUNDRU5UICovCiAgICB7IDB4MDA2MSwgMHg2MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLwogICAgeyAweDAwNjIsIDB4NjIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDYzLCAweDYzIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDICovCiAgICB7IDB4MDA2NCwgMHg2NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLwogICAgeyAweDAwNjUsIDB4NjUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDY2LCAweDY2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGICovCiAgICB7IDB4MDA2NywgMHg2NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLwogICAgeyAweDAwNjgsIDB4NjggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDY5LCAweDY5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJICovCiAgICB7IDB4MDA2QSwgMHg2QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLwogICAgeyAweDAwNkIsIDB4NkIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDZDLCAweDZDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBMICovCiAgICB7IDB4MDA2RCwgMHg2RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLwogICAgeyAweDAwNkUsIDB4NkUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDZGLCAweDZGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPICovCiAgICB7IDB4MDA3MCwgMHg3MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLwogICAgeyAweDAwNzEsIDB4NzEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDcyLCAweDcyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBSICovCiAgICB7IDB4MDA3MywgMHg3MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLwogICAgeyAweDAwNzQsIDB4NzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDc1LCAweDc1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVICovCiAgICB7IDB4MDA3NiwgMHg3NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLwogICAgeyAweDAwNzcsIDB4NzcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDc4LCAweDc4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBYICovCiAgICB7IDB4MDA3OSwgMHg3OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLwogICAgeyAweDAwN0EsIDB4N0EgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORSAqLwogICAgeyAweDAwN0QsIDB4N0QgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0UsIDB4N0UgfSwgLyogVElMREUgKi8KICAgIHsgMHgwMEEwLCAweENBIH0sIC8qIE5PLUJSRUFLIFNQQUNFICovCiAgICB7IDB4MDBBMSwgMHhDMSB9LCAvKiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCiAgICB7IDB4MDBBMiwgMHhBMiB9LCAvKiBDRU5UIFNJR04gKi8KICAgIHsgMHgwMEEzLCAweEEzIH0sIC8qIFBPVU5EIFNJR04gKi8KICAgIHsgMHgwMEE1LCAweEI0IH0sIC8qIFlFTiBTSUdOICovCiAgICB7IDB4MDBBNywgMHhBNCB9LCAvKiBTRUNUSU9OIFNJR04gKi8KICAgIHsgMHgwMEE4LCAweEFDIH0sIC8qIERJQUVSRVNJUyAqLwogICAgeyAweDAwQTksIDB4QTkgfSwgLyogQ09QWVJJR0hUIFNJR04gKi8KICAgIHsgMHgwMEFBLCAweEJCIH0sIC8qIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBBQiwgMHhDNyB9LCAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwQUMsIDB4QzIgfSwgLyogTk9UIFNJR04gKi8KICAgIHsgMHgwMEFFLCAweEE4IH0sIC8qIFJFR0lTVEVSRUQgU0lHTiAqLwogICAgeyAweDAwQUYsIDB4RjggfSwgLyogTUFDUk9OICovCiAgICB7IDB4MDBCMCwgMHhBMSB9LCAvKiBERUdSRUUgU0lHTiAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOICovCiAgICB7IDB4MDBCNCwgMHhBQiB9LCAvKiBBQ1VURSBBQ0NFTlQgKi8KICAgIHsgMHgwMEI1LCAweEI1IH0sIC8qIE1JQ1JPIFNJR04gKi8KICAgIHsgMHgwMEI2LCAweEE2IH0sIC8qIFBJTENST1cgU0lHTiAqLwogICAgeyAweDAwQjcsIDB4RTEgfSwgLyogTUlERExFIERPVCAqLwogICAgeyAweDAwQjgsIDB4RkMgfSwgLyogQ0VESUxMQSAqLwogICAgeyAweDAwQkEsIDB4QkMgfSwgLyogTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBCQiwgMHhDOCB9LCAvKiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEJGLCAweEMwIH0sIC8qIElOVkVSVEVEIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMEMwLCAweENCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQzEsIDB4RTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDMiwgMHhFNSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQzMsIDB4Q0MgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBDNCwgMHg4MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBDNSwgMHg4MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLwogICAgeyAweDAwQzYsIDB4QUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEM3LCAweDgyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCiAgICB7IDB4MDBDOCwgMHhFOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEM5LCAweDgzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQ0EsIDB4RTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMENCLCAweEU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMENDLCAweEVEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQ0QsIDB4RUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDRSwgMHhFQiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQ0YsIDB4RUMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDEsIDB4ODQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCiAgICB7IDB4MDBEMiwgMHhGMSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEQzLCAweEVFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRDQsIDB4RUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEQ1LCAweENEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRDYsIDB4ODUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDgsIDB4QUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLwogICAgeyAweDAwRDksIDB4RjQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBEQSwgMHhGMiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMERCLCAweEYzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBEQywgMHg4NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBERiwgMHhBNyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAqLwogICAgeyAweDAwRTAsIDB4ODggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTEsIDB4ODcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRTIsIDB4ODkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFMywgMHg4QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBFNCwgMHg4QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRTUsIDB4OEMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDBFNiwgMHhCRSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEU3LCAweDhEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLwogICAgeyAweDAwRTgsIDB4OEYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTksIDB4OEUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUEsIDB4OTAgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFQiwgMHg5MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRUMsIDB4OTMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRUQsIDB4OTIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUUsIDB4OTQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFRiwgMHg5NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjEsIDB4OTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRjIsIDB4OTggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRjMsIDB4OTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRjQsIDB4OTkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBGNSwgMHg5QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCiAgICB7IDB4MDBGNiwgMHg5QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjcsIDB4RDYgfSwgLyogRElWSVNJT04gU0lHTiAqLwogICAgeyAweDAwRjgsIDB4QkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KICAgIHsgMHgwMEY5LCAweDlEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEZBLCAweDlDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEZCLCAweDlFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRkMsIDB4OUYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEZGLCAweEQ4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDEzMSwgMHhGNSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJICovCiAgICB7IDB4MDE1MiwgMHhDRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FICovCiAgICB7IDB4MDE1MywgMHhDRiB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLwogICAgeyAweDAxNzgsIDB4RDkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAxOTIsIDB4QzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCiAgICB7IDB4MDJDNiwgMHhGNiB9LCAvKiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KICAgIHsgMHgwMkM3LCAweEZGIH0sIC8qIENBUk9OICovCiAgICB7IDB4MDJEOCwgMHhGOSB9LCAvKiBCUkVWRSAqLwogICAgeyAweDAyRDksIDB4RkEgfSwgLyogRE9UIEFCT1ZFICovCiAgICB7IDB4MDJEQSwgMHhGQiB9LCAvKiBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDJEQiwgMHhGRSB9LCAvKiBPR09ORUsgKi8KICAgIHsgMHgwMkRDLCAweEY3IH0sIC8qIFNNQUxMIFRJTERFICovCiAgICB7IDB4MDJERCwgMHhGRCB9LCAvKiBET1VCTEUgQUNVVEUgQUNDRU5UICovCiAgICB7IDB4MDNBOSwgMHhCRCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSAqLwogICAgeyAweDAzQzAsIDB4QjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBJICovCiAgICB7IDB4MjAxMywgMHhEMCB9LCAvKiBFTiBEQVNIICovCiAgICB7IDB4MjAxNCwgMHhEMSB9LCAvKiBFTSBEQVNIICovCiAgICB7IDB4MjAxOCwgMHhENCB9LCAvKiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMTksIDB4RDUgfSwgLyogUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxQSwgMHhFMiB9LCAvKiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFDLCAweEQyIH0sIC8qIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxRCwgMHhEMyB9LCAvKiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFFLCAweEUzIH0sIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMjAsIDB4QTAgfSwgLyogREFHR0VSICovCiAgICB7IDB4MjAyMSwgMHhFMCB9LCAvKiBET1VCTEUgREFHR0VSICovCiAgICB7IDB4MjAyMiwgMHhBNSB9LCAvKiBCVUxMRVQgKi8KICAgIHsgMHgyMDI2LCAweEM5IH0sIC8qIEhPUklaT05UQUwgRUxMSVBTSVMgKi8KICAgIHsgMHgyMDMwLCAweEU0IH0sIC8qIFBFUiBNSUxMRSBTSUdOICovCiAgICB7IDB4MjAzOSwgMHhEQyB9LCAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwM0EsIDB4REQgfSwgLyogU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjA0NCwgMHhEQSB9LCAvKiBGUkFDVElPTiBTTEFTSCAqLwogICAgeyAweDIwQUMsIDB4REIgfSwgLyogRVVSTyBTSUdOICovCiAgICB7IDB4MjEyMiwgMHhBQSB9LCAvKiBUUkFERSBNQVJLIFNJR04gKi8KICAgIHsgMHgyMjAyLCAweEI2IH0sIC8qIFBBUlRJQUwgRElGRkVSRU5USUFMICovCiAgICB7IDB4MjIwNiwgMHhDNiB9LCAvKiBJTkNSRU1FTlQgKi8KICAgIHsgMHgyMjBGLCAweEI4IH0sIC8qIE4tQVJZIFBST0RVQ1QgKi8KICAgIHsgMHgyMjExLCAweEI3IH0sIC8qIE4tQVJZIFNVTU1BVElPTiAqLwogICAgeyAweDIyMUEsIDB4QzMgfSwgLyogU1FVQVJFIFJPT1QgKi8KICAgIHsgMHgyMjFFLCAweEIwIH0sIC8qIElORklOSVRZICovCiAgICB7IDB4MjIyQiwgMHhCQSB9LCAvKiBJTlRFR1JBTCAqLwogICAgeyAweDIyNDgsIDB4QzUgfSwgLyogQUxNT1NUIEVRVUFMIFRPICovCiAgICB7IDB4MjI2MCwgMHhBRCB9LCAvKiBOT1QgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjY0LCAweEIyIH0sIC8qIExFU1MtVEhBTiBPUiBFUVVBTCBUTyAqLwogICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPICovCiAgICB7IDB4MjVDQSwgMHhENyB9LCAvKiBMT1pFTkdFICovCiAgICB7IDB4RjhGRiwgMHhGMCB9LCAvKiBBcHBsZSBsb2dvICovCiAgICB7IDB4RkIwMSwgMHhERSB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSSAqLwogICAgeyAweEZCMDIsIDB4REYgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgRkwgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQXBwbGVSb21hbiA9IHsKICAgIEFwcGxlUm9tYW5FbnQsCiAgICBzaXplb2YgKEFwcGxlUm9tYW5FbnQpIC8gc2l6ZW9mIChBcHBsZVJvbWFuRW50WzBdKQp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBZG9iZVN5bWJvbEVudFtdID0gewogICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSwkjIGV4Y2xhbSAqLwogICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04JIyBudW1iZXJzaWduICovCiAgICB7IDB4MDAyNSwgMHgyNSB9LCAvKiBQRVJDRU5UIFNJR04JIyBwZXJjZW50ICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQJIyBhbXBlcnNhbmQgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMJIyBwYXJlbmxlZnQgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTCSMgcGFyZW5yaWdodCAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOCSMgcGx1cyAqLwogICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEJIyBjb21tYSAqLwogICAgeyAweDAwMkUsIDB4MkUgfSwgLyogRlVMTCBTVE9QCSMgcGVyaW9kICovCiAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTCSMgc2xhc2ggKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8JIyB6ZXJvICovCiAgICB7IDB4MDAzMSwgMHgzMSB9LCAvKiBESUdJVCBPTkUJIyBvbmUgKi8KICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTwkjIHR3byAqLwogICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUJIyB0aHJlZSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUgkjIGZvdXIgKi8KICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUJIyBmaXZlICovCiAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVgJIyBzaXggKi8KICAgIHsgMHgwMDM3LCAweDM3IH0sIC8qIERJR0lUIFNFVkVOCSMgc2V2ZW4gKi8KICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUCSMgZWlnaHQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUJIyBuaW5lICovCiAgICB7IDB4MDAzQSwgMHgzQSB9LCAvKiBDT0xPTgkjIGNvbG9uICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04JIyBzZW1pY29sb24gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOCSMgbGVzcyAqLwogICAgeyAweDAwM0QsIDB4M0QgfSwgLyogRVFVQUxTIFNJR04JIyBlcXVhbCAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04JIyBncmVhdGVyICovCiAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLCSMgcXVlc3Rpb24gKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0bGVmdCAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0cmlnaHQgKi8KICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FCSMgdW5kZXJzY29yZSAqLwogICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VsZWZ0ICovCiAgICB7IDB4MDA3QywgMHg3QyB9LCAvKiBWRVJUSUNBTCBMSU5FCSMgYmFyICovCiAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VyaWdodCAqLwogICAgeyAweDAwQTAsIDB4MjAgfSwgLyogTk8tQlJFQUsgU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwQUMsIDB4RDggfSwgLyogTk9UIFNJR04JIyBsb2dpY2Fsbm90ICovCiAgICB7IDB4MDBCMCwgMHhCMCB9LCAvKiBERUdSRUUgU0lHTgkjIGRlZ3JlZSAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOCSMgcGx1c21pbnVzICovCiAgICB7IDB4MDBCNSwgMHg2RCB9LCAvKiBNSUNSTyBTSUdOCSMgbXUgKi8KICAgIHsgMHgwMEQ3LCAweEI0IH0sIC8qIE1VTFRJUExJQ0FUSU9OIFNJR04JIyBtdWx0aXBseSAqLwogICAgeyAweDAwRjcsIDB4QjggfSwgLyogRElWSVNJT04gU0lHTgkjIGRpdmlkZSAqLwogICAgeyAweDAxOTIsIDB4QTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCSMgZmxvcmluICovCiAgICB7IDB4MDM5MSwgMHg0MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQkjIEFscGhhICovCiAgICB7IDB4MDM5MiwgMHg0MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCSMgQmV0YSAqLwogICAgeyAweDAzOTMsIDB4NDcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEJIyBHYW1tYSAqLwogICAgeyAweDAzOTQsIDB4NDQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEJIyBEZWx0YSAqLwogICAgeyAweDAzOTUsIDB4NDUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgkjIEVwc2lsb24gKi8KICAgIHsgMHgwMzk2LCAweDVBIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEJIyBaZXRhICovCiAgICB7IDB4MDM5NywgMHg0OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEJIyBFdGEgKi8KICAgIHsgMHgwMzk4LCAweDUxIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCSMgVGhldGEgKi8KICAgIHsgMHgwMzk5LCAweDQ5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEJIyBJb3RhICovCiAgICB7IDB4MDM5QSwgMHg0QiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQkjIEthcHBhICovCiAgICB7IDB4MDM5QiwgMHg0QyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQkjIExhbWJkYSAqLwogICAgeyAweDAzOUMsIDB4NEQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUJIyBNdSAqLwogICAgeyAweDAzOUQsIDB4NEUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUJIyBOdSAqLwogICAgeyAweDAzOUUsIDB4NTggfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkJIyBYaSAqLwogICAgeyAweDAzOUYsIDB4NEYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgkjIE9taWNyb24gKi8KICAgIHsgMHgwM0EwLCAweDUwIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCSMgUGkgKi8KICAgIHsgMHgwM0ExLCAweDUyIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITwkjIFJobyAqLwogICAgeyAweDAzQTMsIDB4NTMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEJIyBTaWdtYSAqLwogICAgeyAweDAzQTQsIDB4NTQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCSMgVGF1ICovCiAgICB7IDB4MDNBNSwgMHg1NSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCSMgVXBzaWxvbiAqLwogICAgeyAweDAzQTYsIDB4NDYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCSMgUGhpICovCiAgICB7IDB4MDNBNywgMHg0MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkJIyBDaGkgKi8KICAgIHsgMHgwM0E4LCAweDU5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQkjIFBzaSAqLwogICAgeyAweDAzQTksIDB4NTcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EJIyBPbWVnYSAqLwogICAgeyAweDAzQjEsIDB4NjEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCSMgYWxwaGEgKi8KICAgIHsgMHgwM0IyLCAweDYyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCSMgYmV0YSAqLwogICAgeyAweDAzQjMsIDB4NjcgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCSMgZ2FtbWEgKi8KICAgIHsgMHgwM0I0LCAweDY0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQkjIGRlbHRhICovCiAgICB7IDB4MDNCNSwgMHg2NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgkjIGVwc2lsb24gKi8KICAgIHsgMHgwM0I2LCAweDdBIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCSMgemV0YSAqLwogICAgeyAweDAzQjcsIDB4NjggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVUQQkjIGV0YSAqLwogICAgeyAweDAzQjgsIDB4NzEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCSMgdGhldGEgKi8KICAgIHsgMHgwM0I5LCAweDY5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCSMgaW90YSAqLwogICAgeyAweDAzQkEsIDB4NkIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCSMga2FwcGEgKi8KICAgIHsgMHgwM0JCLCAweDZDIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQkjIGxhbWJkYSAqLwogICAgeyAweDAzQkMsIDB4NkQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE1VCSMgbXUgKi8KICAgIHsgMHgwM0JELCAweDZFIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBOVQkjIG51ICovCiAgICB7IDB4MDNCRSwgMHg3OCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgWEkJIyB4aSAqLwogICAgeyAweDAzQkYsIDB4NkYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04JIyBvbWljcm9uICovCiAgICB7IDB4MDNDMCwgMHg3MCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkJIyBwaSAqLwogICAgeyAweDAzQzEsIDB4NzIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFJITwkjIHJobyAqLwogICAgeyAweDAzQzIsIDB4NTYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCSMgc2lnbWExICovCiAgICB7IDB4MDNDMywgMHg3MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEJIyBzaWdtYSAqLwogICAgeyAweDAzQzQsIDB4NzQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRBVQkjIHRhdSAqLwogICAgeyAweDAzQzUsIDB4NzUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04JIyB1cHNpbG9uICovCiAgICB7IDB4MDNDNiwgMHg2NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCSMgcGhpICovCiAgICB7IDB4MDNDNywgMHg2MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCSMgY2hpICovCiAgICB7IDB4MDNDOCwgMHg3OSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCSMgcHNpICovCiAgICB7IDB4MDNDOSwgMHg3NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EJIyBvbWVnYSAqLwogICAgeyAweDAzRDEsIDB4NEEgfSwgLyogR1JFRUsgVEhFVEEgU1lNQk9MCSMgdGhldGExICovCiAgICB7IDB4MDNEMiwgMHhBMSB9LCAvKiBHUkVFSyBVUFNJTE9OIFdJVEggSE9PSyBTWU1CT0wJIyBVcHNpbG9uMSAqLwogICAgeyAweDAzRDUsIDB4NkEgfSwgLyogR1JFRUsgUEhJIFNZTUJPTAkjIHBoaTEgKi8KICAgIHsgMHgwM0Q2LCAweDc2IH0sIC8qIEdSRUVLIFBJIFNZTUJPTAkjIG9tZWdhMSAqLwogICAgeyAweDIwMjIsIDB4QjcgfSwgLyogQlVMTEVUCSMgYnVsbGV0ICovCiAgICB7IDB4MjAyNiwgMHhCQyB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTCSMgZWxsaXBzaXMgKi8KICAgIHsgMHgyMDMyLCAweEEyIH0sIC8qIFBSSU1FCSMgbWludXRlICovCiAgICB7IDB4MjAzMywgMHhCMiB9LCAvKiBET1VCTEUgUFJJTUUJIyBzZWNvbmQgKi8KICAgIHsgMHgyMDQ0LCAweEE0IH0sIC8qIEZSQUNUSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KICAgIHsgMHgyMEFDLCAweEEwIH0sIC8qIEVVUk8gU0lHTgkjIEV1cm8gKi8KICAgIHsgMHgyMTExLCAweEMxIH0sIC8qIEJMQUNLLUxFVFRFUiBDQVBJVEFMIEkJIyBJZnJha3R1ciAqLwogICAgeyAweDIxMTgsIDB4QzMgfSwgLyogU0NSSVBUIENBUElUQUwgUAkjIHdlaWVyc3RyYXNzICovCiAgICB7IDB4MjExQywgMHhDMiB9LCAvKiBCTEFDSy1MRVRURVIgQ0FQSVRBTCBSCSMgUmZyYWt0dXIgKi8KICAgIHsgMHgyMTI2LCAweDU3IH0sIC8qIE9ITSBTSUdOCSMgT21lZ2EgKi8KICAgIHsgMHgyMTM1LCAweEMwIH0sIC8qIEFMRUYgU1lNQk9MCSMgYWxlcGggKi8KICAgIHsgMHgyMTkwLCAweEFDIH0sIC8qIExFRlRXQVJEUyBBUlJPVwkjIGFycm93bGVmdCAqLwogICAgeyAweDIxOTEsIDB4QUQgfSwgLyogVVBXQVJEUyBBUlJPVwkjIGFycm93dXAgKi8KICAgIHsgMHgyMTkyLCAweEFFIH0sIC8qIFJJR0hUV0FSRFMgQVJST1cJIyBhcnJvd3JpZ2h0ICovCiAgICB7IDB4MjE5MywgMHhBRiB9LCAvKiBET1dOV0FSRFMgQVJST1cJIyBhcnJvd2Rvd24gKi8KICAgIHsgMHgyMTk0LCAweEFCIH0sIC8qIExFRlQgUklHSFQgQVJST1cJIyBhcnJvd2JvdGggKi8KICAgIHsgMHgyMUI1LCAweEJGIH0sIC8qIERPV05XQVJEUyBBUlJPVyBXSVRIIENPUk5FUiBMRUZUV0FSRFMJIyBjYXJyaWFnZXJldHVybiAqLwogICAgeyAweDIxRDAsIDB4REMgfSwgLyogTEVGVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsbGVmdCAqLwogICAgeyAweDIxRDEsIDB4REQgfSwgLyogVVBXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibHVwICovCiAgICB7IDB4MjFEMiwgMHhERSB9LCAvKiBSSUdIVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJscmlnaHQgKi8KICAgIHsgMHgyMUQzLCAweERGIH0sIC8qIERPV05XQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGRvd24gKi8KICAgIHsgMHgyMUQ0LCAweERCIH0sIC8qIExFRlQgUklHSFQgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxib3RoICovCiAgICB7IDB4MjIwMCwgMHgyMiB9LCAvKiBGT1IgQUxMCSMgdW5pdmVyc2FsICovCiAgICB7IDB4MjIwMiwgMHhCNiB9LCAvKiBQQVJUSUFMIERJRkZFUkVOVElBTAkjIHBhcnRpYWxkaWZmICovCiAgICB7IDB4MjIwMywgMHgyNCB9LCAvKiBUSEVSRSBFWElTVFMJIyBleGlzdGVudGlhbCAqLwogICAgeyAweDIyMDUsIDB4QzYgfSwgLyogRU1QVFkgU0VUCSMgZW1wdHlzZXQgKi8KICAgIHsgMHgyMjA2LCAweDQ0IH0sIC8qIElOQ1JFTUVOVAkjIERlbHRhICovCiAgICB7IDB4MjIwNywgMHhEMSB9LCAvKiBOQUJMQQkjIGdyYWRpZW50ICovCiAgICB7IDB4MjIwOCwgMHhDRSB9LCAvKiBFTEVNRU5UIE9GCSMgZWxlbWVudCAqLwogICAgeyAweDIyMDksIDB4Q0YgfSwgLyogTk9UIEFOIEVMRU1FTlQgT0YJIyBub3RlbGVtZW50ICovCiAgICB7IDB4MjIwQiwgMHgyNyB9LCAvKiBDT05UQUlOUyBBUyBNRU1CRVIJIyBzdWNodGhhdCAqLwogICAgeyAweDIyMEYsIDB4RDUgfSwgLyogTi1BUlkgUFJPRFVDVAkjIHByb2R1Y3QgKi8KICAgIHsgMHgyMjExLCAweEU1IH0sIC8qIE4tQVJZIFNVTU1BVElPTgkjIHN1bW1hdGlvbiAqLwogICAgeyAweDIyMTIsIDB4MkQgfSwgLyogTUlOVVMgU0lHTgkjIG1pbnVzICovCiAgICB7IDB4MjIxNSwgMHhBNCB9LCAvKiBESVZJU0lPTiBTTEFTSAkjIGZyYWN0aW9uICovCiAgICB7IDB4MjIxNywgMHgyQSB9LCAvKiBBU1RFUklTSyBPUEVSQVRPUgkjIGFzdGVyaXNrbWF0aCAqLwogICAgeyAweDIyMUEsIDB4RDYgfSwgLyogU1FVQVJFIFJPT1QJIyByYWRpY2FsICovCiAgICB7IDB4MjIxRCwgMHhCNSB9LCAvKiBQUk9QT1JUSU9OQUwgVE8JIyBwcm9wb3J0aW9uYWwgKi8KICAgIHsgMHgyMjFFLCAweEE1IH0sIC8qIElORklOSVRZCSMgaW5maW5pdHkgKi8KICAgIHsgMHgyMjIwLCAweEQwIH0sIC8qIEFOR0xFCSMgYW5nbGUgKi8KICAgIHsgMHgyMjI3LCAweEQ5IH0sIC8qIExPR0lDQUwgQU5ECSMgbG9naWNhbGFuZCAqLwogICAgeyAweDIyMjgsIDB4REEgfSwgLyogTE9HSUNBTCBPUgkjIGxvZ2ljYWxvciAqLwogICAgeyAweDIyMjksIDB4QzcgfSwgLyogSU5URVJTRUNUSU9OCSMgaW50ZXJzZWN0aW9uICovCiAgICB7IDB4MjIyQSwgMHhDOCB9LCAvKiBVTklPTgkjIHVuaW9uICovCiAgICB7IDB4MjIyQiwgMHhGMiB9LCAvKiBJTlRFR1JBTAkjIGludGVncmFsICovCiAgICB7IDB4MjIzNCwgMHg1QyB9LCAvKiBUSEVSRUZPUkUJIyB0aGVyZWZvcmUgKi8KICAgIHsgMHgyMjNDLCAweDdFIH0sIC8qIFRJTERFIE9QRVJBVE9SCSMgc2ltaWxhciAqLwogICAgeyAweDIyNDUsIDB4NDAgfSwgLyogQVBQUk9YSU1BVEVMWSBFUVVBTCBUTwkjIGNvbmdydWVudCAqLwogICAgeyAweDIyNDgsIDB4QkIgfSwgLyogQUxNT1NUIEVRVUFMIFRPCSMgYXBwcm94ZXF1YWwgKi8KICAgIHsgMHgyMjYwLCAweEI5IH0sIC8qIE5PVCBFUVVBTCBUTwkjIG5vdGVxdWFsICovCiAgICB7IDB4MjI2MSwgMHhCQSB9LCAvKiBJREVOVElDQUwgVE8JIyBlcXVpdmFsZW5jZSAqLwogICAgeyAweDIyNjQsIDB4QTMgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPCSMgbGVzc2VxdWFsICovCiAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8JIyBncmVhdGVyZXF1YWwgKi8KICAgIHsgMHgyMjgyLCAweENDIH0sIC8qIFNVQlNFVCBPRgkjIHByb3BlcnN1YnNldCAqLwogICAgeyAweDIyODMsIDB4QzkgfSwgLyogU1VQRVJTRVQgT0YJIyBwcm9wZXJzdXBlcnNldCAqLwogICAgeyAweDIyODQsIDB4Q0IgfSwgLyogTk9UIEEgU1VCU0VUIE9GCSMgbm90c3Vic2V0ICovCiAgICB7IDB4MjI4NiwgMHhDRCB9LCAvKiBTVUJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdWJzZXQgKi8KICAgIHsgMHgyMjg3LCAweENBIH0sIC8qIFNVUEVSU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3VwZXJzZXQgKi8KICAgIHsgMHgyMjk1LCAweEM1IH0sIC8qIENJUkNMRUQgUExVUwkjIGNpcmNsZXBsdXMgKi8KICAgIHsgMHgyMjk3LCAweEM0IH0sIC8qIENJUkNMRUQgVElNRVMJIyBjaXJjbGVtdWx0aXBseSAqLwogICAgeyAweDIyQTUsIDB4NUUgfSwgLyogVVAgVEFDSwkjIHBlcnBlbmRpY3VsYXIgKi8KICAgIHsgMHgyMkM1LCAweEQ3IH0sIC8qIERPVCBPUEVSQVRPUgkjIGRvdG1hdGggKi8KICAgIHsgMHgyMzIwLCAweEYzIH0sIC8qIFRPUCBIQUxGIElOVEVHUkFMCSMgaW50ZWdyYWx0cCAqLwogICAgeyAweDIzMjEsIDB4RjUgfSwgLyogQk9UVE9NIEhBTEYgSU5URUdSQUwJIyBpbnRlZ3JhbGJ0ICovCiAgICB7IDB4MjMyOSwgMHhFMSB9LCAvKiBMRUZULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZWxlZnQgKi8KICAgIHsgMHgyMzJBLCAweEYxIH0sIC8qIFJJR0hULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZXJpZ2h0ICovCiAgICB7IDB4MjVDQSwgMHhFMCB9LCAvKiBMT1pFTkdFCSMgbG96ZW5nZSAqLwogICAgeyAweDI2NjAsIDB4QUEgfSwgLyogQkxBQ0sgU1BBREUgU1VJVAkjIHNwYWRlICovCiAgICB7IDB4MjY2MywgMHhBNyB9LCAvKiBCTEFDSyBDTFVCIFNVSVQJIyBjbHViICovCiAgICB7IDB4MjY2NSwgMHhBOSB9LCAvKiBCTEFDSyBIRUFSVCBTVUlUCSMgaGVhcnQgKi8KICAgIHsgMHgyNjY2LCAweEE4IH0sIC8qIEJMQUNLIERJQU1PTkQgU1VJVAkjIGRpYW1vbmQgKi8KICAgIHsgMHhGNkQ5LCAweEQzIH0sIC8qIENPUFlSSUdIVCBTSUdOIFNFUklGCSMgY29weXJpZ2h0c2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRBLCAweEQyIH0sIC8qIFJFR0lTVEVSRUQgU0lHTiBTRVJJRgkjIHJlZ2lzdGVyc2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRCLCAweEQ0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTRVJJRgkjIHRyYWRlbWFya3NlcmlmIChDVVMpICovCiAgICB7IDB4RjhFNSwgMHg2MCB9LCAvKiBSQURJQ0FMIEVYVEVOREVSCSMgcmFkaWNhbGV4IChDVVMpICovCiAgICB7IDB4RjhFNiwgMHhCRCB9LCAvKiBWRVJUSUNBTCBBUlJPVyBFWFRFTkRFUgkjIGFycm93dmVydGV4IChDVVMpICovCiAgICB7IDB4RjhFNywgMHhCRSB9LCAvKiBIT1JJWk9OVEFMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3dob3JpemV4IChDVVMpICovCiAgICB7IDB4RjhFOCwgMHhFMiB9LCAvKiBSRUdJU1RFUkVEIFNJR04gU0FOUyBTRVJJRgkjIHJlZ2lzdGVyc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RTksIDB4RTMgfSwgLyogQ09QWVJJR0hUIFNJR04gU0FOUyBTRVJJRgkjIGNvcHlyaWdodHNhbnMgKENVUykgKi8KICAgIHsgMHhGOEVBLCAweEU0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTQU5TIFNFUklGCSMgdHJhZGVtYXJrc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RUIsIDB4RTYgfSwgLyogTEVGVCBQQVJFTiBUT1AJIyBwYXJlbmxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RUMsIDB4RTcgfSwgLyogTEVGVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVubGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhFRCwgMHhFOCB9LCAvKiBMRUZUIFBBUkVOIEJPVFRPTQkjIHBhcmVubGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhFRSwgMHhFOSB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRsZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEVGLCAweEVBIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0bGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhGMCwgMHhFQiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRsZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEYxLCAweEVDIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZWxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RjIsIDB4RUQgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlbGVmdG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RjMsIDB4RUUgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlbGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhGNCwgMHhFRiB9LCAvKiBDVVJMWSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2VleCAoQ1VTKSAqLwogICAgeyAweEY4RjUsIDB4RjQgfSwgLyogSU5URUdSQUwgRVhURU5ERVIJIyBpbnRlZ3JhbGV4IChDVVMpICovCiAgICB7IDB4RjhGNiwgMHhGNiB9LCAvKiBSSUdIVCBQQVJFTiBUT1AJIyBwYXJlbnJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEY3LCAweEY3IH0sIC8qIFJJR0hUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5yaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGOCwgMHhGOCB9LCAvKiBSSUdIVCBQQVJFTiBCT1RUT00JIyBwYXJlbnJpZ2h0YnQgKENVUykgKi8KICAgIHsgMHhGOEY5LCAweEY5IH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRyaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGQSwgMHhGQSB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRyaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGQiwgMHhGQiB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBCT1RUT00JIyBicmFja2V0cmlnaHRidCAoQ1VTKSAqLwogICAgeyAweEY4RkMsIDB4RkMgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZXJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEZELCAweEZEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VyaWdodG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RkUsIDB4RkUgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBCT1RUT00JIyBicmFjZXJpZ2h0YnQgKENVUykgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQWRvYmVTeW1ib2wgPSB7CiAgICBBZG9iZVN5bWJvbEVudCwKICAgIHNpemVvZiAoQWRvYmVTeW1ib2xFbnQpIC8gc2l6ZW9mIChBZG9iZVN5bWJvbEVudFswXSksCn07CiAgICAKc3RhdGljIGNvbnN0IEZjRm9udERlY29kZSBmY0ZvbnREZWNvZGVyc1tdID0gewogICAgeyBmdF9lbmNvZGluZ191bmljb2RlLAkwLAkJKDEgPDwgMjEpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19zeW1ib2wsCSZBZG9iZVN5bWJvbCwJKDEgPDwgMTYpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiwJJkFwcGxlUm9tYW4sCSgxIDw8IDE2KSAtIDEgfSwKfTsKCiNkZWZpbmUgTlVNX0RFQ09ERSAgKHNpemVvZiAoZmNGb250RGVjb2RlcnMpIC8gc2l6ZW9mIChmY0ZvbnREZWNvZGVyc1swXSkpCgpGY0NoYXIzMgpGY0ZyZWVUeXBlVWNzNFRvUHJpdmF0ZSAoRmNDaGFyMzIgdWNzNCwgY29uc3QgRmNDaGFyTWFwICptYXApCnsKICAgIGludAkJbG93LCBoaWdoLCBtaWQ7CiAgICBGY0NoYXIxNglibXA7CgogICAgbG93ID0gMDsKICAgIGhpZ2ggPSBtYXAtPm5lbnQgLSAxOwogICAgaWYgKHVjczQgPCBtYXAtPmVudFtsb3ddLmJtcCB8fCBtYXAtPmVudFtoaWdoXS5ibXAgPCB1Y3M0KQoJcmV0dXJuIH4wOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKQogICAgewoJbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7CglibXAgPSBtYXAtPmVudFttaWRdLmJtcDsKCWlmICh1Y3M0ID09IGJtcCkKCSAgICByZXR1cm4gKEZUX1VMb25nKSBtYXAtPmVudFttaWRdLmVuY29kZTsKCWlmICh1Y3M0IDwgYm1wKQoJICAgIGhpZ2ggPSBtaWQgLSAxOwoJZWxzZQoJICAgIGxvdyA9IG1pZCArIDE7CiAgICB9CiAgICByZXR1cm4gfjA7Cn0KCkZjQ2hhcjMyCkZjRnJlZVR5cGVQcml2YXRlVG9VY3M0IChGY0NoYXIzMiBwcml2YXRlLCBjb25zdCBGY0NoYXJNYXAgKm1hcCkKewogICAgaW50CSAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPm5lbnQ7IGkrKykKCWlmIChtYXAtPmVudFtpXS5lbmNvZGUgPT0gcHJpdmF0ZSkKCSAgICByZXR1cm4gKEZjQ2hhcjMyKSBtYXAtPmVudFtpXS5ibXA7CiAgICByZXR1cm4gfjA7Cn0KCmNvbnN0IEZjQ2hhck1hcCAqCkZjRnJlZVR5cGVHZXRQcml2YXRlTWFwIChGVF9FbmNvZGluZyBlbmNvZGluZykKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9ERUNPREU7IGkrKykKCWlmIChmY0ZvbnREZWNvZGVyc1tpXS5lbmNvZGluZyA9PSBlbmNvZGluZykKCSAgICByZXR1cm4gZmNGb250RGVjb2RlcnNbaV0ubWFwOwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIE1hcCBhIFVDUzQgZ2x5cGggdG8gYSBnbHlwaCBpbmRleC4gIFVzZSBhbGwgYXZhaWxhYmxlIGVuY29kaW5nCiAqIHRhYmxlcyB0byB0cnkgYW5kIGZpbmQgb25lIHRoYXQgd29ya3MuICBUaGlzIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkCiAqIHRvIGJlIGNhY2hlZCBieSBoaWdoZXIgbGV2ZWxzLCBzbyBwZXJmb3JtYW5jZSBpc24ndCBjcml0aWNhbAogKi8KCkZUX1VJbnQKRmNGcmVlVHlwZUNoYXJJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCSAgICBpbml0aWFsLCBvZmZzZXQsIGRlY29kZTsKICAgIEZUX1VJbnQJICAgIGdseXBoaW5kZXg7CiAgICBGY0NoYXIzMgkgICAgY2hhcmNvZGU7CgogICAgaW5pdGlhbCA9IDA7CiAgICAvKgogICAgICogRmluZCB0aGUgY3VycmVudCBlbmNvZGluZwogICAgICovCiAgICBpZiAoZmFjZS0+Y2hhcm1hcCkKICAgIHsKCWZvciAoOyBpbml0aWFsIDwgTlVNX0RFQ09ERTsgaW5pdGlhbCsrKQoJICAgIGlmIChmY0ZvbnREZWNvZGVyc1tpbml0aWFsXS5lbmNvZGluZyA9PSBmYWNlLT5jaGFybWFwLT5lbmNvZGluZykKCQlicmVhazsKCWlmIChpbml0aWFsID09IE5VTV9ERUNPREUpCgkgICAgaW5pdGlhbCA9IDA7CiAgICB9CiAgICAvKgogICAgICogQ2hlY2sgZWFjaCBlbmNvZGluZyBmb3IgdGhlIGdseXBoLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50IG9uZQogICAgICovCiAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IE5VTV9ERUNPREU7IG9mZnNldCsrKQogICAgewoJZGVjb2RlID0gKGluaXRpYWwgKyBvZmZzZXQpICUgTlVNX0RFQ09ERTsKCWlmICghZmFjZS0+Y2hhcm1hcCB8fCBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyAhPSBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKQoJICAgIGlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbZGVjb2RlXS5lbmNvZGluZykgIT0gMCkKCQljb250aW51ZTsKCWlmIChmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCkKCXsKCSAgICBjaGFyY29kZSA9IEZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlICh1Y3M0LCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCk7CgkgICAgaWYgKGNoYXJjb2RlID09IH4wKQoJCWNvbnRpbnVlOwoJfQoJZWxzZQoJICAgIGNoYXJjb2RlID0gdWNzNDsKCWdseXBoaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgKEZUX1VMb25nKSBjaGFyY29kZSk7CglpZiAoZ2x5cGhpbmRleCkKCSAgICByZXR1cm4gZ2x5cGhpbmRleDsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjRnJlZVR5cGVDaGVja0dseXBoIChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQsIAoJCSAgICAgIEZUX1VJbnQgZ2x5cGgsIEZjQmxhbmtzICpibGFua3MsCgkJICAgICAgRlRfUG9zICphZHZhbmNlKQp7CiAgICBGVF9JbnQJICAgIGxvYWRfZmxhZ3MgPSBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwogICAgRlRfR2x5cGhTbG90ICAgIHNsb3Q7CiAgICAKICAgIC8qCiAgICAgKiBXaGVuIHVzaW5nIHNjYWxhYmxlIGZvbnRzLCBvbmx5IHJlcG9ydCB0aG9zZSBnbHlwaHMKICAgICAqIHdoaWNoIGNhbiBiZSBzY2FsZWQ7IG90aGVyd2lzZSB0aG9zZSBmb250cyB3aWxsCiAgICAgKiBvbmx5IGJlIGF2YWlsYWJsZSBhdCBzb21lIHNpemVzLCBhbmQgbmV2ZXIgd2hlbgogICAgICogdHJhbnNmb3JtZWQuICBBdm9pZCB0aGlzIGJ5IHNpbXBseSByZXBvcnRpbmcgYml0bWFwLW9ubHkKICAgICAqIGdseXBocyBhcyBtaXNzaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKQoJbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0JJVE1BUDsKICAgIAogICAgaWYgKEZUX0xvYWRfR2x5cGggKGZhY2UsIGdseXBoLCBsb2FkX2ZsYWdzKSkKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBzbG90ID0gZmFjZS0+Z2x5cGg7CiAgICBpZiAoIWdseXBoKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgICphZHZhbmNlID0gc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZTsKCiAgICBzd2l0Y2ggKHNsb3QtPmZvcm1hdCkgewogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgoJLyoKCSAqIEJpdG1hcHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVhc29uYWJsZTsgaWYKCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCgkgKiBjb2RlIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKCSAqLwoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmU6CgkvKgoJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSwoJICovCglpZiAoc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICE9IDApCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qCgkgKiBHbHlwaHMgd2l0aCBubyBjb250b3VycyBhcmUgb25seSBPSyBpZgoJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAoJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBJZiBibGFua3MgaXNuJ3Qgc2V0LAoJICogdGhlbiBhbGxvdyBhbnkgZ2x5cGggdG8gYmUgYmxhbmsKCSAqLwoJaWYgKCFibGFua3MgfHwgRmNCbGFua3NJc01lbWJlciAoYmxhbmtzLCB1Y3M0KSkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyogZmFsbCB0aHJvdWdoIC4uLiAqLwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQ2hhclNldCAqCkZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKnNwYWNpbmcpCnsKICAgIEZjQ2hhcjMyCSAgICBwYWdlLCBvZmYsIG1heCwgdWNzNDsKI2lmZGVmIENIRUNLCiAgICBGY0NoYXIzMgkgICAgZm9udF9tYXggPSAwOwojZW5kaWYKICAgIEZjQ2hhclNldAkgICAgKmZjczsKICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOwogICAgY29uc3QgRmNDaGFyTWFwICptYXA7CiAgICBpbnQJCSAgICBvOwogICAgaW50CQkgICAgaTsKICAgIEZUX1VJbnQJICAgIGdseXBoOwogICAgRlRfUG9zCSAgICBhZHZhbmNlLCBhbGxfYWR2YW5jZSA9IDA7CiAgICBGY0Jvb2wJICAgIGhhc19hZHZhbmNlID0gRmNGYWxzZSwgZml4ZWRfYWR2YW5jZSA9IEZjVHJ1ZTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICAKICAgIGZvciAobyA9IDA7IG8gPCBOVU1fREVDT0RFOyBvKyspCiAgICB7CglpZiAoRlRfU2VsZWN0X0NoYXJtYXAgKGZhY2UsIGZjRm9udERlY29kZXJzW29dLmVuY29kaW5nKSAhPSAwKQoJICAgIGNvbnRpbnVlOwoJbWFwID0gZmNGb250RGVjb2RlcnNbb10ubWFwOwoJaWYgKG1hcCkKCXsKCSAgICAvKgoJICAgICAqIE5vbi1Vbmljb2RlIHRhYmxlcyBhcmUgZWFzeTsgdGhlcmUncyBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlCgkgICAgICogY2hhcmFjdGVycwoJICAgICAqLwoJICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPm5lbnQ7IGkrKykKCSAgICB7CgkJdWNzNCA9IG1hcC0+ZW50W2ldLmJtcDsKCQlnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCBtYXAtPmVudFtpXS5lbmNvZGUpOwoJCWlmIChnbHlwaCAmJiAKCQkgICAgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIGdseXBoLCBibGFua3MsICZhZHZhbmNlKSkKCQl7CgkJICAgIGlmICghaGFzX2FkdmFuY2UpCgkJICAgIHsKCQkJaGFzX2FkdmFuY2UgPSBGY1RydWU7CgkJCWFsbF9hZHZhbmNlID0gYWR2YW5jZTsKCQkgICAgfQoJCSAgICBlbHNlIGlmIChhZHZhbmNlICE9IGFsbF9hZHZhbmNlKQoJCQlmaXhlZF9hZHZhbmNlID0gRmNGYWxzZTsKCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCSAgICBpZiAoIWxlYWYpCgkJCWdvdG8gYmFpbDE7CgkJICAgIGxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdIHw9ICgxIDw8ICh1Y3M0ICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkgICAgaWYgKHVjczQgPiBmb250X21heCkKCQkJZm9udF9tYXggPSB1Y3M0OwojZW5kaWYKCQl9CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIEZUX1VJbnQgZ2luZGV4OwoJICAKCSAgICBtYXggPSBmY0ZvbnREZWNvZGVyc1tvXS5tYXg7CgkgICAgLyoKCSAgICAgKiBGaW5kIHRoZSBmaXJzdCBlbmNvZGVkIGNoYXJhY3RlciBpbiB0aGUgZm9udAoJICAgICAqLwoJICAgIGlmIChGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgMCkpCgkgICAgewoJCXVjczQgPSAwOwoJCWdpbmRleCA9IDE7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIDAsICZnaW5kZXgpOwoJCWlmICghdWNzNCkKCQkgICAgZ2luZGV4ID0gMDsKCSAgICB9CgoJICAgIHdoaWxlIChnaW5kZXgpCgkgICAgewoJCXBhZ2UgPSB1Y3M0ID4+IDg7CgkJbGVhZiA9IDA7CgkJd2hpbGUgKCh1Y3M0ID4+IDgpID09IHBhZ2UpCgkJewoJCSAgICBnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KTsKCQkgICAgaWYgKGdseXBoICYmIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCAKCQkJCQkJICAgICAgIGdseXBoLCBibGFua3MsICZhZHZhbmNlKSkKCQkgICAgewoJCQlpZiAoIWhhc19hZHZhbmNlKQoJCQl7CgkJCSAgICBoYXNfYWR2YW5jZSA9IEZjVHJ1ZTsKCQkJICAgIGFsbF9hZHZhbmNlID0gYWR2YW5jZTsKCQkJfQoJCQllbHNlIGlmIChhZHZhbmNlICE9IGFsbF9hZHZhbmNlKQoJCQkgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CgkJCWlmICghbGVhZikKCQkJewoJCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCQkgICAgaWYgKCFsZWFmKQoJCQkJZ290byBiYWlsMTsKCQkJfQoJCQlvZmYgPSB1Y3M0ICYgMHhmZjsKCQkJbGVhZi0+bWFwW29mZiA+PiA1XSB8PSAoMSA8PCAob2ZmICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkJaWYgKHVjczQgPiBmb250X21heCkKCQkJICAgIGZvbnRfbWF4ID0gdWNzNDsKI2VuZGlmCgkJICAgIH0KCQkgICAgdWNzNCsrOwoJCX0KCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgdWNzNCAtIDEsICZnaW5kZXgpOwoJCWlmICghdWNzNCkKCQkgICAgZ2luZGV4ID0gMDsKCSAgICB9CiNpZmRlZiBDSEVDSwoJICAgIGZvciAodWNzNCA9IDA7IHVjczQgPCAweDEwMDAwOyB1Y3M0KyspCgkgICAgewoJCUZjQm9vbAkgICAgRlRfSGFzLCBGQ19IYXM7CgoJCUZUX0hhcyA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KSAhPSAwOwoJCUZDX0hhcyA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgkJaWYgKEZUX0hhcyAhPSBGQ19IYXMpCgkJewoJCSAgICBwcmludGYgKCIweCUwOHggRlQgc2F5cyAlZCBGQyBzYXlzICVkXG4iLCB1Y3M0LCBGVF9IYXMsIEZDX0hhcyk7CgkJfQoJICAgIH0KI2VuZGlmCgl9CiAgICB9CiNpZmRlZiBDSEVDSwogICAgcHJpbnRmICgiJWQgZ2x5cGhzICVkIGVuY29kZWRcbiIsIChpbnQpIGZhY2UtPm51bV9nbHlwaHMsIEZjQ2hhclNldENvdW50IChmY3MpKTsKICAgIGZvciAodWNzNCA9IDA7IHVjczQgPD0gZm9udF9tYXg7IHVjczQrKykKICAgIHsKCUZjQm9vbAloYXNfY2hhciA9IEZjRnJlZVR5cGVDaGFySW5kZXggKGZhY2UsIHVjczQpICE9IDA7CglGY0Jvb2wJaGFzX2JpdCA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgoJaWYgKGhhc19jaGFyICYmICFoYXNfYml0KQoJICAgIHByaW50ZiAoIkJpdG1hcCBtaXNzaW5nIGNoYXIgMHgleFxuIiwgdWNzNCk7CgllbHNlIGlmICghaGFzX2NoYXIgJiYgaGFzX2JpdCkKCSAgICBwcmludGYgKCJCaXRtYXAgZXh0cmEgY2hhciAweCV4XG4iLCB1Y3M0KTsKICAgIH0KI2VuZGlmCiAgICBpZiAoZml4ZWRfYWR2YW5jZSkKCSpzcGFjaW5nID0gRkNfTU9OTzsKICAgIGVsc2UKCSpzcGFjaW5nID0gRkNfUFJPUE9SVElPTkFMOwogICAgcmV0dXJuIGZjczsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChmY3MpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpGY0NoYXJTZXQgKgpGY0ZyZWVUeXBlQ2hhclNldCAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzKQp7CiAgICBpbnQgc3BhY2luZzsKCiAgICByZXR1cm4gRmNGcmVlVHlwZUNoYXJTZXRBbmRTcGFjaW5nIChmYWNlLCBibGFua3MsICZzcGFjaW5nKTsKfQo=