LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNmcmVldHlwZS5jLHYgMS4xMSAyMDAyLzA4LzMxIDIyOjE3OjMyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAgQ29weXJpZ2h0IKkgMjAwMi0yMDAzIGJ5IEp1bGl1c3ogQ2hyb2JvY3plawoKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICBUSEUgU09GVFdBUkUuCiovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAojaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICiNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICiNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICgojaWYgSEFWRV9GVF9HRVRfQkRGX1BST1BFUlRZCiNpbmNsdWRlIEZUX0JERl9ICiNpbmNsdWRlIEZUX01PRFVMRV9ICiNkZWZpbmUgSEFTX0JERl9QUk9QRVJUWShmKSAoKGYpICYmIChmKS0+ZHJpdmVyICYmIFwKCQkJICAgICAoZiktPmRyaXZlci0+cm9vdC5jbGF6ei0+Z2V0X2ludGVyZmFjZSkKI2RlZmluZSBNWV9HZXRfQkRGX1Byb3BlcnR5KGYsbixwKSAoSEFTX0JERl9QUk9QRVJUWShmKSA/IFwKCQkJCSAgICBGVF9HZXRfQkRGX1Byb3BlcnR5KGYsbixwKSA6IFwKCQkJCSAgICBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCkKI2VuZGlmCgojaWYgIUhBVkVfRlRfR0VUX0JERl9QUk9QRVJUWQojd2FybmluZyAiTm8gRlRfR2V0X0JERl9Qcm9wZXJ0eSIKI2VuZGlmCgojaWYgIUhBVkVfRlRfR0VUX1BTX0ZPTlRfSU5GTwojd2FybmluZyAiTm8gRlRfR2V0X0ZvbnRfSW5mbyIKI2VuZGlmCgovKgogKiBLZWVwIEhhbiBsYW5ndWFnZXMgc2VwYXJhdGVkIGJ5IGVsaW1pbmF0aW5nIGxhbmd1YWdlcwogKiB0aGF0IHRoZSBjb2RlUGFnZVJhbmdlIGJpdHMgc2F5cyBhcmVuJ3Qgc3VwcG9ydGVkCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBpbnQJCSAgICBiaXQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKmxhbmc7Cn0gRmNDb2RlUGFnZVJhbmdlW10gPSB7CiAgICB7IDE3LAkoY29uc3QgRmNDaGFyOCAqKSAiamEiIH0sCiAgICB7IDE4LAkoY29uc3QgRmNDaGFyOCAqKSAiemgtY24iIH0sCiAgICB7IDE5LAkoY29uc3QgRmNDaGFyOCAqKSAia28iIH0sCiAgICB7IDIwLAkoY29uc3QgRmNDaGFyOCAqKSAiemgtdHciIH0sCn07CgojZGVmaW5lIE5VTV9DT0RFX1BBR0VfUkFOR0UgKHNpemVvZiBGY0NvZGVQYWdlUmFuZ2UgLyBzaXplb2YgRmNDb2RlUGFnZVJhbmdlWzBdKQoKRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKQp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKICAgIHsKCWlmIChGY0xhbmdDb21wYXJlIChsYW5nLCBGY0NvZGVQYWdlUmFuZ2VbaV0ubGFuZykgIT0gRmNMYW5nRGlmZmVyZW50TGFuZykKCSAgICByZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkcJICAgIDB4MGYwMAojZGVmaW5lIEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0ggICAweDAyMDAKI2RlZmluZSBGQ19OQU1FX1BSSU9fTEFOR19MQVRJTgkgICAgMHgwMTAwCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkdfTk9ORQkgICAgMHgwMDAwCgojZGVmaW5lIEZDX05BTUVfUFJJT19FTkMJICAgIDB4MDBmMAojZGVmaW5lIEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERSAgICAweDAwMTAKI2RlZmluZSBGQ19OQU1FX1BSSU9fRU5DX05PTkUJICAgIDB4MDAwMAoKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRQkgICAgMHgwMDBmCiNkZWZpbmUgRkNfTkFNRV9QUklPX05BTUVfRkFNSUxZICAgIDB4MDAwMgojZGVmaW5lIEZDX05BTUVfUFJJT19OQU1FX1BTCSAgICAweDAwMDEKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRV9OT05FCSAgICAweDAwMDAKCnN0YXRpYyBGY0Jvb2wKRmNVY3M0SXNMYXRpbiAoRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyMzIJcGFnZSA9IHVjczQgPj4gODsKICAgIAogICAgaWYgKHBhZ2UgPD0gMikKCXJldHVybiBGY1RydWU7CiAgICBpZiAocGFnZSA9PSAweDFlKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgweDIwIDw9IHBhZ2UgJiYgcGFnZSA8PSAweDIzKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmIChwYWdlID09IDB4ZmIpCglyZXR1cm4gRmNUcnVlOwogICAgLyogaGFsZndpZHRoIGZvcm1zLCBkb24ndCBpbmNsdWRlIGthbmEgb3Igd2hpdGUgcGFyZW5zICovCiAgICBpZiAoMHhmZjAxIDw9IHVjczQgJiYgdWNzNCA8PSAweGZmNWUpCglyZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNVdGY4SXNMYXRpbiAoRmNDaGFyOCAqc3RyLCBpbnQgbGVuKQp7CiAgICB3aGlsZSAobGVuKQogICAgewoJRmNDaGFyMzIgICAgdWNzNDsKCWludAkgICAgY2xlbiA9IEZjVXRmOFRvVWNzNCAoc3RyLCAmdWNzNCwgbGVuKTsKCWlmIChjbGVuIDw9IDApCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoIUZjVWNzNElzTGF0aW4gKHVjczQpKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJbGVuIC09IGNsZW47CglzdHIgKz0gY2xlbjsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCi8qIE9yZGVyIGlzIHNpZ25pZmljYW50LiAgRm9yIGV4YW1wbGUsIHNvbWUgQiZIIGZvbnRzIGFyZSBoaW50ZWQgYnkKICAgVVJXKyssIGFuZCBib3RoIHN0cmluZ3MgYXBwZWFyIGluIHRoZSBub3RpY2UuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZUX1N0cmluZyAqbm90aWNlOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjTm90aWNlRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkJpZ2Vsb3ciLAkoY29uc3QgRmNDaGFyOCAqKSAiYiZoIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJBZG9iZSIsCShjb25zdCBGY0NoYXI4ICopICJhZG9iZSIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiQml0c3RyZWFtIiwJKGNvbnN0IEZjQ2hhcjggKikgImJpdHN0cmVhbSIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiTW9ub3R5cGUiLAkoY29uc3QgRmNDaGFyOCAqKSAibW9ub3R5cGUiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkxpbm90eXBlIiwJKGNvbnN0IEZjQ2hhcjggKikgImxpbm90eXBlIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJMSU5PVFlQRS1IRUxMIiwKCQkJCQkoY29uc3QgRmNDaGFyOCAqKSAibGlub3R5cGUiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIklCTSIsCShjb25zdCBGY0NoYXI4ICopICJpYm0iIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIlVSVyIsCShjb25zdCBGY0NoYXI4ICopICJ1cnciIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkludGVybmF0aW9uYWwgVHlwZWZhY2UgQ29ycG9yYXRpb24iLCAKCQkJCQkoY29uc3QgRmNDaGFyOCAqKSAiaXRjIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJUaXJvIFR5cGV3b3JrcyIsCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgInRpcm8iIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIlhGcmVlODYiLAkoY29uc3QgRmNDaGFyOCAqKSAieGZyZWU4NiIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiTWljcm9zb2Z0IiwJKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiT21lZ2EiLAkoY29uc3QgRmNDaGFyOCAqKSAib21lZ2EiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkZvbnQyMSIsCShjb25zdCBGY0NoYXI4ICopICJod2FuIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJIYW5ZYW5nIFN5c3RlbSIsCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgImhhbnlhbmciIH0KfTsKCiNkZWZpbmUgTlVNX05PVElDRV9GT1VORFJJRVMJKHNpemVvZiAoRmNOb3RpY2VGb3VuZHJpZXMpIC8gc2l6ZW9mIChGY05vdGljZUZvdW5kcmllc1swXSkpCgpzdGF0aWMgY29uc3QgRmNDaGFyOCAqCkZjTm90aWNlRm91bmRyeShjb25zdCBGVF9TdHJpbmcgKm5vdGljZSkKewogICAgaW50IGk7CgogICAgaWYgKG5vdGljZSkKCWZvcihpID0gMDsgaSA8IE5VTV9OT1RJQ0VfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKHN0cnN0ciAoKGNvbnN0IGNoYXIgKikgbm90aWNlLCAoY29uc3QgY2hhciAqKSBGY05vdGljZUZvdW5kcmllc1tpXS5ub3RpY2UpKQoJCXJldHVybiBGY05vdGljZUZvdW5kcmllc1tpXS5mb3VuZHJ5OwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWZW5kb3JNYXRjaChjb25zdCBGVF9DaGFyIHZlbmRvcls0XSwgY29uc3QgRlRfQ2hhciAqdmVuZG9yX3N0cmluZykKewogICAgLyogdmVuZG9yIGlzIG5vdCBuZWNlc3NhcmlseSBOVUwtdGVybWluYXRlZC4gKi8KICAgIGludCBpLCBsZW47CiAgICAKICAgIGxlbiA9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKICAgIGlmIChtZW1jbXAodmVuZG9yLCB2ZW5kb3Jfc3RyaW5nLCBsZW4pICE9IDApCiAgICAgICAgcmV0dXJuIEZjRmFsc2U7CiAgICBmb3IgKGkgPSBsZW47IGkgPCA0OyBpKyspCiAgICAgICAgaWYgKHZlbmRvcltpXSAhPSAnICcgJiYgdmVuZG9yW2ldICE9ICdcMCcpCiAgICAgICAgICAgIHJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKLyogVGhpcyB0YWJsZSBpcyBwYXJ0bHkgdGFrZW4gZnJvbSB0dG1rZmRpciBieSBKb2VyZyBQb21tbml0ei4gKi8KCi8qIEl0IHNob3VsZCBub3QgY29udGFpbiB1c2VsZXNzIGVudHJpZXMgKHN1Y2ggYXMgVU5LTikgbm9yIGR1cGxpY2F0ZQogICBlbnRyaWVzIGZvciBwYWRkaW5nIGJvdGggd2l0aCBzcGFjZXMgYW5kIE5VTHMuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZUX0NoYXIgICAqdmVuZG9yOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjVmVuZG9yRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGVF9DaGFyICopICJBREJFIiwgKGNvbnN0IEZjQ2hhcjggKikgImFkb2JlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBR0ZBIiwgKGNvbnN0IEZjQ2hhcjggKikgImFnZmEifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkFMVFMiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWx0c3lzIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBUFBMIiwgKGNvbnN0IEZjQ2hhcjggKikgImFwcGxlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBUlBIIiwgKGNvbnN0IEZjQ2hhcjggKikgImFycGhpYyJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiQVRFQyIsIChjb25zdCBGY0NoYXI4ICopICJhbGx0eXBlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJCJkgiLCAgKGNvbnN0IEZjQ2hhcjggKikgImImaCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiQklUUyIsIChjb25zdCBGY0NoYXI4ICopICJiaXRzdHJlYW0ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkNBTk8iLCAoY29uc3QgRmNDaGFyOCAqKSAiY2Fubm9uIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJEWU5BIiwgKGNvbnN0IEZjQ2hhcjggKikgImR5bmFsYWIifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkVQU04iLCAoY29uc3QgRmNDaGFyOCAqKSAiZXBzb24ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkZKIiwgICAoY29uc3QgRmNDaGFyOCAqKSAiZnVqaXRzdSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiSUJNIiwgIChjb25zdCBGY0NoYXI4ICopICJpYm0ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIklUQyIsICAoY29uc3QgRmNDaGFyOCAqKSAiaXRjIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJJTVBSIiwgKGNvbnN0IEZjQ2hhcjggKikgImltcHJlc3MifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkxBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAibGFyYWJpZWZvbnRzIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJMRUFGIiwgKGNvbnN0IEZjQ2hhcjggKikgImludGVybGVhZiJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTEVUUiIsIChjb25zdCBGY0NoYXI4ICopICJsZXRyYXNldCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTElOTyIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTUFDUiIsIChjb25zdCBGY0NoYXI4ICopICJtYWNyb21lZGlhIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJNT05PIiwgKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJNUyIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTVQiLCAgIChjb25zdCBGY0NoYXI4ICopICJtb25vdHlwZSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTkVDIiwgIChjb25zdCBGY0NoYXI4ICopICJuZWMifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIlBBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAicGFyYXR5cGUifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIlFNU0kiLCAoY29uc3QgRmNDaGFyOCAqKSAicW1zIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJSSUNPIiwgKGNvbnN0IEZjQ2hhcjggKikgInJpY29oIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJVUlciLCAgKGNvbnN0IEZjQ2hhcjggKikgInVydyJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiWSZZIiwgIChjb25zdCBGY0NoYXI4ICopICJ5JnkifQp9OwoKI2RlZmluZSBOVU1fVkVORE9SX0ZPVU5EUklFUwkoc2l6ZW9mIChGY1ZlbmRvckZvdW5kcmllcykgLyBzaXplb2YgKEZjVmVuZG9yRm91bmRyaWVzWzBdKSkKCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNWZW5kb3JGb3VuZHJ5KGNvbnN0IEZUX0NoYXIgdmVuZG9yWzRdKQp7CiAgICBpbnQgaTsKICAgIAogICAgaWYgKHZlbmRvcikKCWZvcihpID0gMDsgaSA8IE5VTV9WRU5ET1JfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKEZjVmVuZG9yTWF0Y2ggKHZlbmRvciwgRmNWZW5kb3JGb3VuZHJpZXNbaV0udmVuZG9yKSkKCQlyZXR1cm4gRmNWZW5kb3JGb3VuZHJpZXNbaV0uZm91bmRyeTsKICAgIHJldHVybiAwOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNTdHJpbmdDb25zdCB7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBpbnQJCSAgICB2YWx1ZTsKfSBGY1N0cmluZ0NvbnN0OwoKc3RhdGljIGludApGY1N0cmluZ0lzQ29uc3QgKGNvbnN0IEZjQ2hhcjgJCSpzdHJpbmcsCgkJIGNvbnN0IEZjU3RyaW5nQ29uc3QJKmMsCgkJIGludAkJCW5jKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykKCWlmIChGY1N0ckNtcElnbm9yZUJsYW5rc0FuZENhc2UgKHN0cmluZywgY1tpXS5uYW1lKSA9PSAwKQoJICAgIHJldHVybiBjW2ldLnZhbHVlOwogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50CkZjU3RyaW5nQ29udGFpbnNDb25zdCAoY29uc3QgRmNDaGFyOAkgICAgKnN0cmluZywKCQkgICAgICAgY29uc3QgRmNTdHJpbmdDb25zdCAgKmMsCgkJICAgICAgIGludAkJICAgIG5jKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykKCWlmIChGY1N0ckNvbnRhaW5zSWdub3JlQmxhbmtzQW5kQ2FzZSAoc3RyaW5nLCBjW2ldLm5hbWUpKQoJICAgIHJldHVybiBjW2ldLnZhbHVlOwogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgd2VpZ2h0Q29uc3RzW10gPSB7CiAgICB7ICJ0aGluIiwJCUZDX1dFSUdIVF9USElOIH0sCiAgICB7ICJleHRyYWxpZ2h0IiwJRkNfV0VJR0hUX0VYVFJBTElHSFQgfSwKICAgIHsgInVsdHJhbGlnaHQiLAlGQ19XRUlHSFRfVUxUUkFMSUdIVCB9LAogICAgeyAibGlnaHQiLAkJRkNfV0VJR0hUX0xJR0hUIH0sCiAgICB7ICJib29rIiwJCUZDX1dFSUdIVF9CT09LIH0sCiAgICB7ICJyZWd1bGFyIiwJRkNfV0VJR0hUX1JFR1VMQVIgfSwKICAgIHsgIm5vcm1hbCIsCQlGQ19XRUlHSFRfTk9STUFMIH0sCiAgICB7ICJtZWRpdW0iLAkJRkNfV0VJR0hUX01FRElVTSB9LAogICAgeyAiZGVtaWJvbGQiLAlGQ19XRUlHSFRfREVNSUJPTEQgfSwKICAgIHsgImRlbWkiLAkJRkNfV0VJR0hUX0RFTUlCT0xEIH0sCiAgICB7ICJzZW1pYm9sZCIsCUZDX1dFSUdIVF9TRU1JQk9MRCB9LAogICAgeyAiYm9sZCIsCQlGQ19XRUlHSFRfQk9MRCB9LAogICAgeyAiZXh0cmFib2xkIiwJRkNfV0VJR0hUX0VYVFJBQk9MRCB9LAogICAgeyAidWx0cmFib2xkIiwJRkNfV0VJR0hUX1VMVFJBQk9MRCB9LAogICAgeyAiYmxhY2siLAkJRkNfV0VJR0hUX0JMQUNLIH0sCiAgICB7ICJoZWF2eSIsCQlGQ19XRUlHSFRfSEVBVlkgfSwKfTsKCiNkZWZpbmUgTlVNX1dFSUdIVF9DT05TVFMgIChzaXplb2YgKHdlaWdodENvbnN0cykgLyBzaXplb2YgKHdlaWdodENvbnN0c1swXSkpCgojZGVmaW5lIEZjSXNXZWlnaHQocykJICAgIEZjU3RyaW5nSXNDb25zdChzLHdlaWdodENvbnN0cyxOVU1fV0VJR0hUX0NPTlNUUykKI2RlZmluZSBGY0NvbnRhaW5zV2VpZ2h0KHMpIEZjU3RyaW5nQ29udGFpbnNDb25zdCAocyx3ZWlnaHRDb25zdHMsTlVNX1dFSUdIVF9DT05TVFMpCgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgd2lkdGhDb25zdHNbXSA9IHsKICAgIHsgInVsdHJhY29uZGVuc2VkIiwJRkNfV0lEVEhfVUxUUkFDT05ERU5TRUQgfSwKICAgIHsgImV4dHJhY29uZGVuc2VkIiwJRkNfV0lEVEhfRVhUUkFDT05ERU5TRUQgfSwKICAgIHsgInNlbWljb25kZW5zZWQiLCAgRkNfV0lEVEhfU0VNSUNPTkRFTlNFRCB9LAogICAgeyAiY29uZGVuc2VkIiwJRkNfV0lEVEhfQ09OREVOU0VEIH0sCS8qIG11c3QgYmUgYWZ0ZXIgKmNvbmRlbnNlZCAqLwogICAgeyAibm9ybWFsIiwJCUZDX1dJRFRIX05PUk1BTCB9LAogICAgeyAic2VtaWV4cGFuZGVkIiwJRkNfV0lEVEhfU0VNSUVYUEFOREVEIH0sCiAgICB7ICJleHRyYWV4cGFuZGVkIiwJRkNfV0lEVEhfRVhUUkFFWFBBTkRFRCB9LAogICAgeyAidWx0cmFleHBhbmRlZCIsCUZDX1dJRFRIX1VMVFJBRVhQQU5ERUQgfSwKICAgIHsgImV4cGFuZGVkIiwJRkNfV0lEVEhfRVhQQU5ERUQgfSwJLyogbXVzdCBiZSBhZnRlciAqZXhwYW5kZWQgKi8KfTsKCiNkZWZpbmUgTlVNX1dJRFRIX0NPTlNUUyAgICAoc2l6ZW9mICh3aWR0aENvbnN0cykgLyBzaXplb2YgKHdpZHRoQ29uc3RzWzBdKSkKCiNkZWZpbmUgRmNJc1dpZHRoKHMpCSAgICBGY1N0cmluZ0lzQ29uc3Qocyx3aWR0aENvbnN0cyxOVU1fV0lEVEhfQ09OU1RTKQojZGVmaW5lIEZjQ29udGFpbnNXaWR0aChzKSAgRmNTdHJpbmdDb250YWluc0NvbnN0IChzLHdpZHRoQ29uc3RzLE5VTV9XSURUSF9DT05TVFMpCgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgc2xhbnRDb25zdHNbXSA9IHsKICAgIHsgIml0YWxpYyIsCQlGQ19TTEFOVF9JVEFMSUMgfSwKICAgIHsgIm9ibGlxdWUiLAlGQ19TTEFOVF9PQkxJUVVFIH0sCn07CgojZGVmaW5lIE5VTV9TTEFOVF9DT05TVFMgICAgKHNpemVvZiAoc2xhbnRDb25zdHMpIC8gc2l6ZW9mIChzbGFudENvbnN0c1swXSkpCgojZGVmaW5lIEZjSXNTbGFudChzKQkgICAgRmNTdHJpbmdJc0NvbnN0KHMsc2xhbnRDb25zdHMsTlVNX1NMQU5UX0NPTlNUUykKI2RlZmluZSBGY0NvbnRhaW5zU2xhbnQocykgIEZjU3RyaW5nQ29udGFpbnNDb25zdCAocyxzbGFudENvbnN0cyxOVU1fU0xBTlRfQ09OU1RTKQoKc3RhdGljIGRvdWJsZQpGY0dldFBpeGVsU2l6ZSAoRlRfRmFjZSBmYWNlLCBpbnQgaSkKewojaWYgSEFWRV9GVF9HRVRfQkRGX1BST1BFUlRZCiAgICBpZiAoZmFjZS0+bnVtX2ZpeGVkX3NpemVzID09IDEpCiAgICB7CglCREZfUHJvcGVydHlSZWMJcHJvcDsKCWludAkJcmM7CgoJcmMgPSBNWV9HZXRfQkRGX1Byb3BlcnR5IChmYWNlLCAiUElYRUxfU0laRSIsICZwcm9wKTsKCWlmIChyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSKQoJICAgIHJldHVybiAoZG91YmxlKSBwcm9wLnUuaW50ZWdlcjsKICAgIH0KI2VuZGlmCiNpZiBIQVZFX0ZUX0JJVE1BUF9TSVpFX1lfUFBFTQogICAgcmV0dXJuIChkb3VibGUpIGZhY2UtPmF2YWlsYWJsZV9zaXplc1tpXS55X3BwZW0gLyA2NC4wOwojZWxzZQogICAgcmV0dXJuIChkb3VibGUpIGZhY2UtPmF2YWlsYWJsZV9zaXplc1tpXS5oZWlnaHQ7CiNlbmRpZgp9CgpGY1BhdHRlcm4gKgpGY0ZyZWVUeXBlUXVlcnkgKGNvbnN0IEZjQ2hhcjgJKmZpbGUsCgkJIGludAkJaWQsCgkJIEZjQmxhbmtzCSpibGFua3MsCgkJIGludAkJKmNvdW50KQp7CiAgICBGVF9GYWNlCSAgICBmYWNlOwogICAgRmNQYXR0ZXJuCSAgICAqcGF0OwogICAgaW50CQkgICAgc2xhbnQgPSAtMTsKICAgIGludAkJICAgIHdlaWdodCA9IC0xOwogICAgaW50CQkgICAgd2lkdGggPSAtMTsKICAgIGludAkJICAgIGk7CiAgICBGY0NoYXJTZXQJICAgICpjczsKICAgIEZjTGFuZ1NldAkgICAgKmxzOwogICAgRlRfTGlicmFyeQkgICAgZnRMaWJyYXJ5OwogICAgRmNDaGFyOAkgICAgKmZhbWlseSA9IDA7CiAgICBGY0NoYXI4CSAgICAqc3R5bGUgPSAwOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5ID0gMDsKICAgIGludAkJICAgIHNwYWNpbmc7CiAgICBUVF9PUzIJICAgICpvczI7CiNpZiBIQVZFX0ZUX0dFVF9QU19GT05UX0lORk8KICAgIFBTX0ZvbnRJbmZvUmVjICBwc2ZvbnRpbmZvOwojZW5kaWYKI2lmIEhBVkVfRlRfR0VUX0JERl9QUk9QRVJUWQogICAgQkRGX1Byb3BlcnR5UmVjIHByb3A7CiNlbmRpZgogICAgVFRfSGVhZGVyCSAgICAqaGVhZDsKICAgIGNvbnN0IEZjQ2hhcjggICAqZXhjbHVzaXZlTGFuZyA9IDA7CiAgICBGVF9TZm50TmFtZQkgICAgc25hbWU7CiAgICBGVF9VSW50ICAgIAkgICAgc25hbWVpLCBzbmFtZWM7CiAgICBGY0Jvb2wJICAgIGZhbWlseV9hbGxvY2F0ZWQgPSBGY0ZhbHNlOwogICAgRmNCb29sCSAgICBzdHlsZV9hbGxvY2F0ZWQgPSBGY0ZhbHNlOwogICAgaW50CQkgICAgZmFtaWx5X3ByaW8gPSAwOwogICAgaW50CQkgICAgc3R5bGVfcHJpbyA9IDA7CgogICAgaWYgKEZUX0luaXRfRnJlZVR5cGUgKCZmdExpYnJhcnkpKQoJcmV0dXJuIDA7CiAgICAKICAgIGlmIChGVF9OZXdfRmFjZSAoZnRMaWJyYXJ5LCAoY2hhciAqKSBmaWxlLCBpZCwgJmZhY2UpKQoJZ290byBiYWlsOwoKICAgICpjb3VudCA9IGZhY2UtPm51bV9mYWNlczsKCiAgICBwYXQgPSBGY1BhdHRlcm5DcmVhdGUgKCk7CiAgICBpZiAoIXBhdCkKCWdvdG8gYmFpbDA7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX09VVExJTkUsCgkJCSAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSAhPSAwKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX1NDQUxBQkxFLAoJCQkgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkgIT0gMCkpCglnb3RvIGJhaWwxOwoKCiAgICAvKgogICAgICogR2V0IHRoZSBPUy8yIHRhYmxlCiAgICAgKi8KICAgIG9zMiA9IChUVF9PUzIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfb3MyKTsKCiAgICAvKgogICAgICogTG9vayBmaXJzdCBpbiB0aGUgT1MvMiB0YWJsZSBmb3IgdGhlIGZvdW5kcnksIGlmCiAgICAgKiBub3QgZm91bmQgaGVyZSwgdGhlIHZhcmlvdXMgbm90aWNlcyB3aWxsIGJlIHNlYXJjaGVkIGZvcgogICAgICogdGhhdCBpbmZvcm1hdGlvbiwgZWl0aGVyIGZyb20gdGhlIHNmbnQgbmFtZSB0YWJsZXMgb3IKICAgICAqIHRoZSBQb3N0c2NyaXB0IEZvbnRJbmZvIGRpY3Rpb25hcnkuICBGaW5hbGx5LCB0aGUKICAgICAqIEJERiBwcm9wZXJ0aWVzIHdpbGwgcXVlcmllZC4KICAgICAqLwogICAgCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgICAgICBmb3VuZHJ5ID0gRmNWZW5kb3JGb3VuZHJ5KG9zMi0+YWNoVmVuZElEKTsKCiAgICAvKgogICAgICogR3J1YiB0aHJvdWdoIHRoZSBuYW1lIHRhYmxlIGxvb2tpbmcgZm9yIGZhbWlseQogICAgICogYW5kIHN0eWxlIG5hbWVzLiAgRnJlZVR5cGUgbWFrZXMgcXVpdGUgYSBoYXNoCiAgICAgKiBvZiB0aGVtCiAgICAgKi8KICAgIHNuYW1lYyA9IEZUX0dldF9TZm50X05hbWVfQ291bnQgKGZhY2UpOwogICAgZm9yIChzbmFtZWkgPSAwOyBzbmFtZWkgPCBzbmFtZWM7IHNuYW1laSsrKQogICAgewoJRmNDaGFyOAkJKnV0Zjg7CglpbnQJCWxlbjsKCWludAkJd2NoYXI7CglGY0NoYXI4CQkqc3JjOwoJaW50CQlzcmNfbGVuOwoJRmNDaGFyOAkJKnU4OwoJRmNDaGFyMzIJdWNzNDsKCWludAkJaWxlbiwgb2xlbjsKCWludAkJcHJpbyA9IDA7CgkKCWNvbnN0IEZjQ2hhck1hcAkqbWFwOwoJZW51bSB7CgkgICAgRmNOYW1lRW5jb2RpbmdVdGYxNiwgCgkgICAgRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuLAoJICAgIEZjTmFtZUVuY29kaW5nTGF0aW4xIAoJfSBlbmNvZGluZzsKCQoJCglpZiAoRlRfR2V0X1NmbnRfTmFtZSAoZmFjZSwgc25hbWVpLCAmc25hbWUpICE9IDApCgkgICAgYnJlYWs7CgkKCS8qCgkgKiBMb29rIGZvciBVbmljb2RlIHN0cmluZ3MKCSAqLwoJc3dpdGNoIChzbmFtZS5wbGF0Zm9ybV9pZCkgewoJY2FzZSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFOgoJICAgIC8qCgkgICAgICogQWxsIEFQUExFX1VOSUNPREUgZW5jb2RpbmdzIGFyZSBVdGYxNiBCRQoJICAgICAqCgkgICAgICogQmVjYXVzZSB0aGVyZSdzIG5vIGxhbmd1YWdlIGlkIGZvciBVbmljb2RlLAoJICAgICAqIGFzc3VtZSBpdCdzIEVuZ2xpc2gKCSAgICAgKi8KCSAgICBwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fRU5DX1VOSUNPREU7CgkgICAgZW5jb2RpbmcgPSBGY05hbWVFbmNvZGluZ1V0ZjE2OwoJICAgIGJyZWFrOwoJY2FzZSBUVF9QTEFURk9STV9NQUNJTlRPU0g6CgkgICAgc3dpdGNoIChzbmFtZS5lbmNvZGluZ19pZCkgewoJICAgIGNhc2UgVFRfTUFDX0lEX1JPTUFOOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJY29udGludWU7CgkgICAgfQoJICAgIHN3aXRjaCAoc25hbWUubGFuZ3VhZ2VfaWQpIHsKCSAgICBjYXNlIFRUX01BQ19MQU5HSURfRU5HTElTSDoKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQkvKgoJCSAqIFNvbWV0aW1lcyBNaWNyb3NvZnQgbGFuZ3VhZ2UgaWRzCgkJICogZW5kIHVwIGluIHRoZSBtYWNpbnRvc2ggdGFibGUuICBUaGlzCgkJICogaXMgb2Z0ZW4gYWNjb21wYW5pZWQgYnkgZGF0YSBpbgoJCSAqIHNvbWUgbXlzdGljIGVuY29kaW5nLiAgSWdub3JlIHRoZXNlIG5hbWVzCgkJICovCgkJaWYgKHNuYW1lLmxhbmd1YWdlX2lkID49IDB4MTAwKQoJCSAgICBjb250aW51ZTsKCQlicmVhazsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFRUX1BMQVRGT1JNX01JQ1JPU09GVDoKCSAgICBzd2l0Y2ggKHNuYW1lLmVuY29kaW5nX2lkKSB7CgkgICAgY2FzZSBUVF9NU19JRF9VTklDT0RFX0NTOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdVdGYxNjsKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERTsKCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBzd2l0Y2ggKHNuYW1lLmxhbmd1YWdlX2lkICYgMHhmZikgewoJICAgIGNhc2UgMHgwOToKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0g7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlicmVhazsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFRUX1BMQVRGT1JNX0lTTzoKCSAgICBzd2l0Y2ggKHNuYW1lLmVuY29kaW5nX2lkKSB7CgkgICAgY2FzZSBUVF9JU09fSURfMTA2NDY6CgkJZW5jb2RpbmcgPSBGY05hbWVFbmNvZGluZ1V0ZjE2OwoJCXByaW8gfD0gRkNfTkFNRV9QUklPX0VOQ19VTklDT0RFOwoJCWJyZWFrOwoJICAgIGNhc2UgVFRfSVNPX0lEXzdCSVRfQVNDSUk6CgkgICAgY2FzZSBUVF9JU09fSURfODg1OV8xOgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdMYXRpbjE7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQljb250aW51ZTsKCSAgICB9CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJCgkvKgoJICogTG9vayBmb3IgZmFtaWx5IGFuZCBzdHlsZSBuYW1lcyAKCSAqLwoJc3dpdGNoIChzbmFtZS5uYW1lX2lkKSB7CgljYXNlIFRUX05BTUVfSURfRk9OVF9GQU1JTFk6CgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fTkFNRV9GQU1JTFk7CgkgICAgYnJlYWs7CgljYXNlIFRUX05BTUVfSURfUFNfTkFNRToKCSAgICBwcmlvIHw9IEZDX05BTUVfUFJJT19OQU1FX1BTOwoJICAgIGJyZWFrOwoJY2FzZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZOgogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9UUkFERU1BUks6CiAgICAgICAgY2FzZSBUVF9OQU1FX0lEX01BTlVGQUNUVVJFUjoKICAgICAgICAgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJICAgIAogICAgICAgIHNyYyA9IChGY0NoYXI4ICopIHNuYW1lLnN0cmluZzsKICAgICAgICBzcmNfbGVuID0gc25hbWUuc3RyaW5nX2xlbjsKCQoJc3dpdGNoIChlbmNvZGluZykgewoJY2FzZSBGY05hbWVFbmNvZGluZ1V0ZjE2OgoJICAgIC8qCgkgICAgICogQ29udmVydCBVdGYxNiB0byBVdGY4CgkgICAgICovCgkgICAgCgkgICAgaWYgKCFGY1V0ZjE2TGVuIChzcmMsIEZjRW5kaWFuQmlnLCBzcmNfbGVuLCAmbGVuLCAmd2NoYXIpKQoJCWNvbnRpbnVlOwogICAgCgkgICAgLyoKCSAgICAgKiBBbGxvY2F0ZSBwbGVudHkgb2Ygc3BhY2UuICBGcmVlZCBiZWxvdwoJICAgICAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKGxlbiAqIEZDX1VURjhfTUFYX0xFTiArIDEpOwoJICAgIGlmICghdXRmOCkKCQljb250aW51ZTsKCQkKCSAgICB1OCA9IHV0Zjg7CgkgICAgCgkgICAgd2hpbGUgKChpbGVuID0gRmNVdGYxNlRvVWNzNCAoc3JjLCBGY0VuZGlhbkJpZywgJnVjczQsIHNyY19sZW4pKSA+IDApCgkgICAgewoJCXNyY19sZW4gLT0gaWxlbjsKCQlzcmMgKz0gaWxlbjsKCQlvbGVuID0gRmNVY3M0VG9VdGY4ICh1Y3M0LCB1OCk7CgkJdTggKz0gb2xlbjsKCSAgICB9CgkgICAgKnU4ID0gJ1wwJzsKCSAgICBicmVhazsKCWNhc2UgRmNOYW1lRW5jb2RpbmdMYXRpbjE6CgkgICAgLyoKCSAgICAgKiBDb252ZXJ0IExhdGluMSB0byBVdGY4LiBGcmVlZCBiZWxvdwoJICAgICAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKHNyY19sZW4gKiAyICsgMSk7CgkgICAgaWYgKCF1dGY4KQoJCWNvbnRpbnVlOwoKCSAgICB1OCA9IHV0Zjg7CgkgICAgd2hpbGUgKHNyY19sZW4gPiAwKQoJICAgIHsKCQl1Y3M0ID0gKnNyYysrOwoJCXNyY19sZW4tLTsKCQlvbGVuID0gRmNVY3M0VG9VdGY4ICh1Y3M0LCB1OCk7CgkJdTggKz0gb2xlbjsKCSAgICB9CgkgICAgKnU4ID0gJ1wwJzsKCSAgICBicmVhazsKCWNhc2UgRmNOYW1lRW5jb2RpbmdBcHBsZVJvbWFuOgoJICAgIC8qCgkgICAgICogQ29udmVydCBBcHBsZVJvbWFuIHRvIFV0ZjgKCSAgICAgKi8KCSAgICBtYXAgPSBGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4pOwoJICAgIGlmICghbWFwKQoJCWNvbnRpbnVlOwoKCSAgICAvKiBmcmVlZCBiZWxvdyAqLwoJICAgIHV0ZjggPSBtYWxsb2MgKHNyY19sZW4gKiAzICsgMSk7CgkgICAgaWYgKCF1dGY4KQoJCWNvbnRpbnVlOwoKCSAgICB1OCA9IHV0Zjg7CgkgICAgd2hpbGUgKHNyY19sZW4gPiAwKQoJICAgIHsKCQl1Y3M0ID0gRmNGcmVlVHlwZVByaXZhdGVUb1VjczQgKCpzcmMrKywgbWFwKTsKCQlzcmNfbGVuLS07CgkJb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJCXU4ICs9IG9sZW47CgkgICAgfQoJICAgICp1OCA9ICdcMCc7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKChwcmlvICYgRkNfTkFNRV9QUklPX0xBTkcpID09IEZDX05BTUVfUFJJT19MQU5HX05PTkUpCgkgICAgaWYgKEZjVXRmOElzTGF0aW4gKHV0ZjgsIHN0cmxlbiAoKGNoYXIgKikgdXRmOCkpKQoJCXByaW8gfD0gRkNfTkFNRV9QUklPX0xBTkdfTEFUSU47CgkJCSAgICAgICAKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU5WKQoJICAgIHByaW50ZiAoIlxuZm91bmQgbmFtZSAobmFtZSAlZCBwbGF0Zm9ybSAlZCBlbmNvZGluZyAlZCBsYW5ndWFnZSAweCV4IHByaW8gMHgleCkgJXNcbiIsCgkJICAgIHNuYW1lLm5hbWVfaWQsIHNuYW1lLnBsYXRmb3JtX2lkLAoJCSAgICBzbmFtZS5lbmNvZGluZ19pZCwgc25hbWUubGFuZ3VhZ2VfaWQsCgkJICAgIHByaW8sIHV0ZjgpOwogICAgCglzd2l0Y2ggKHNuYW1lLm5hbWVfaWQpIHsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWToKCWNhc2UgVFRfTkFNRV9JRF9QU19OQU1FOgoJICAgIGlmICghZmFtaWx5IHx8IHByaW8gPiBmYW1pbHlfcHJpbykKCSAgICB7CgkJaWYgKGZhbWlseSkKCQkgICAgZnJlZSAoZmFtaWx5KTsKCQlmYW1pbHkgPSB1dGY4OwoJCXV0ZjggPSAwOwoJCWZhbWlseV9hbGxvY2F0ZWQgPSBGY1RydWU7CgkJZmFtaWx5X3ByaW8gPSBwcmlvOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWToKCSAgICBpZiAoIXN0eWxlIHx8IHByaW8gPiBzdHlsZV9wcmlvKQoJICAgIHsKCQlpZiAoc3R5bGUpCgkJICAgIGZyZWUgKHN0eWxlKTsKCQlzdHlsZSA9IHV0Zjg7CgkJdXRmOCA9IDA7CgkJc3R5bGVfYWxsb2NhdGVkID0gRmNUcnVlOwoJCXN0eWxlX3ByaW8gPSBwcmlvOwoJICAgIH0KCSAgICBicmVhazsKICAgICAgICBjYXNlIFRUX05BTUVfSURfVFJBREVNQVJLOgogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9NQU5VRkFDVFVSRVI6CgkgICAgLyogSWYgdGhlIGZvdW5kcnkgd2Fzbid0IGZvdW5kIGluIHRoZSBPUy8yIHRhYmxlLCBsb29rIGhlcmUgKi8KICAgICAgICAgICAgaWYoIWZvdW5kcnkpCiAgICAgICAgICAgICAgICBmb3VuZHJ5ID0gRmNOb3RpY2VGb3VuZHJ5KChGVF9TdHJpbmcgKikgdXRmOCk7CiAgICAgICAgICAgIGJyZWFrOwoJfQoJaWYgKHV0ZjgpCgkgICAgZnJlZSAodXRmOCk7CiAgICB9CiAgICAKICAgIGlmICghZmFtaWx5KQoJZmFtaWx5ID0gKEZjQ2hhcjggKikgZmFjZS0+ZmFtaWx5X25hbWU7CiAgICAKICAgIGlmICghc3R5bGUpCglzdHlsZSA9IChGY0NoYXI4ICopIGZhY2UtPnN0eWxlX25hbWU7CiAgICAKICAgIGlmICghZmFtaWx5KQogICAgewoJRmNDaGFyOAkqc3RhcnQsICplbmQ7CgkKCXN0YXJ0ID0gKEZjQ2hhcjggKikgc3RycmNociAoKGNoYXIgKikgZmlsZSwgJy8nKTsKCWlmIChzdGFydCkKCSAgICBzdGFydCsrOwoJZWxzZQoJICAgIHN0YXJ0ID0gKEZjQ2hhcjggKikgZmlsZTsKCWVuZCA9IChGY0NoYXI4ICopIHN0cnJjaHIgKChjaGFyICopIHN0YXJ0LCAnLicpOwoJaWYgKCFlbmQpCgkgICAgZW5kID0gc3RhcnQgKyBzdHJsZW4gKChjaGFyICopIHN0YXJ0KTsKCS8qIGZyZWVkIGJlbG93ICovCglmYW1pbHkgPSBtYWxsb2MgKGVuZCAtIHN0YXJ0ICsgMSk7CglzdHJuY3B5ICgoY2hhciAqKSBmYW1pbHksIChjaGFyICopIHN0YXJ0LCBlbmQgLSBzdGFydCk7CglmYW1pbHlbZW5kIC0gc3RhcnRdID0gJ1wwJzsKCWZhbWlseV9hbGxvY2F0ZWQgPSBGY1RydWU7CiAgICB9CgogICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19TQ0FOKQoJcHJpbnRmICgiXG5cIiVzXCIgXCIlc1wiXG4iLCBmYW1pbHksIHN0eWxlID8gc3R5bGUgOiAoRmNDaGFyOCAqKSAiPG5vbmU+Iik7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRkFNSUxZLCBmYW1pbHkpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoc3R5bGUpCiAgICB7CglpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TVFlMRSwgc3R5bGUpKQoJICAgIGdvdG8gYmFpbDE7CiAgICB9CgogICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRklMRSwgZmlsZSkpCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19JTkRFWCwgaWQpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TT1VSQ0UsIChGY0NoYXI4ICopICJGcmVlVHlwZSIpKQoJZ290byBiYWlsMTsKCiNpZiAwCiAgICAvKgogICAgICogZG9uJ3QgZXZlbiB0cnkgdGhpcyAtLSBDSksgJ21vbm9zcGFjZScgZm9udHMgYXJlIHJlYWxseQogICAgICogZHVhbCB3aWR0aCwgYW5kIG1vc3Qgb3RoZXIgZm9udHMgZG9uJ3QgYm90aGVyIHRvIHNldAogICAgICogdGhlIGF0dHJpYnV0ZS4gIFNpZ2guCiAgICAgKi8KICAgIGlmICgoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCkgIT0gMCkKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19TUEFDSU5HLCBGQ19NT05PKSkKCSAgICBnb3RvIGJhaWwxOwojZW5kaWYKCiAgICAvKgogICAgICogRmluZCB0aGUgZm9udCByZXZpc2lvbiAoaWYgYXZhaWxhYmxlKQogICAgICovCiAgICBoZWFkID0gKFRUX0hlYWRlciAqKSBGVF9HZXRfU2ZudF9UYWJsZSAoZmFjZSwgZnRfc2ZudF9oZWFkKTsKICAgIGlmIChoZWFkKQogICAgewoJaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX0ZPTlRWRVJTSU9OLCBoZWFkLT5Gb250X1JldmlzaW9uKSkKCSAgICBnb3RvIGJhaWwxOwogICAgfQogICAgZWxzZQogICAgewoJaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX0ZPTlRWRVJTSU9OLCAwKSkKCSAgICBnb3RvIGJhaWwxOwogICAgfQoKICAgIGlmIChvczIgJiYgb3MyLT52ZXJzaW9uID49IDB4MDAwMSAmJiBvczItPnZlcnNpb24gIT0gMHhmZmZmKQogICAgewoJZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKCXsKCSAgICBGVF9VTG9uZwliaXRzOwoJICAgIGludAkJYml0OwoJICAgIGlmIChGY0NvZGVQYWdlUmFuZ2VbaV0uYml0IDwgMzIpCgkgICAgewoJCWJpdHMgPSBvczItPnVsQ29kZVBhZ2VSYW5nZTE7CgkJYml0ID0gRmNDb2RlUGFnZVJhbmdlW2ldLmJpdDsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQliaXRzID0gb3MyLT51bENvZGVQYWdlUmFuZ2UyOwoJCWJpdCA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQgLSAzMjsKCSAgICB9CgkgICAgaWYgKGJpdHMgJiAoMSA8PCBiaXQpKQoJICAgIHsKCQkvKiAKCQkgKiBJZiB0aGUgZm9udCBhZHZlcnRpc2VzIHN1cHBvcnQgZm9yIG11bHRpcGxlCgkJICogImV4Y2x1c2l2ZSIgbGFuZ3VhZ2VzLCB0aGVuIGluY2x1ZGUgc3VwcG9ydAoJCSAqIGZvciBhbnkgbGFuZ3VhZ2UgZm91bmQgdG8gaGF2ZSBjb3ZlcmFnZQoJCSAqLwoJCWlmIChleGNsdXNpdmVMYW5nKQoJCXsKCQkgICAgZXhjbHVzaXZlTGFuZyA9IDA7CgkJICAgIGJyZWFrOwoJCX0KCQlleGNsdXNpdmVMYW5nID0gRmNDb2RlUGFnZVJhbmdlW2ldLmxhbmc7CgkgICAgfQoJfQogICAgfQoKICAgIGlmIChvczIgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgIHsKCWlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPT0gMCkKCSAgICA7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAxNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX1RISU47CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAyNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0VYVFJBTElHSFQ7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCAzNTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0xJR0hUOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNDUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9SRUdVTEFSOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9NRURJVU07CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCA2NTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX1NFTUlCT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNzUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9CT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgODUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9FWFRSQUJPTEQ7CgllbHNlIGlmIChvczItPnVzV2VpZ2h0Q2xhc3MgPCA5NTApCgkgICAgd2VpZ2h0ID0gRkNfV0VJR0hUX0JMQUNLOwoKCXN3aXRjaCAob3MyLT51c1dpZHRoQ2xhc3MpIHsKCWNhc2UgMToJd2lkdGggPSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDI6CXdpZHRoID0gRkNfV0lEVEhfRVhUUkFDT05ERU5TRUQ7IGJyZWFrOwoJY2FzZSAzOgl3aWR0aCA9IEZDX1dJRFRIX0NPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDQ6CXdpZHRoID0gRkNfV0lEVEhfU0VNSUNPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDU6CXdpZHRoID0gRkNfV0lEVEhfTk9STUFMOyBicmVhazsKCWNhc2UgNjoJd2lkdGggPSBGQ19XSURUSF9TRU1JRVhQQU5ERUQ7IGJyZWFrOwoJY2FzZSA3Ogl3aWR0aCA9IEZDX1dJRFRIX0VYUEFOREVEOyBicmVhazsKCWNhc2UgODoJd2lkdGggPSBGQ19XSURUSF9FWFRSQUVYUEFOREVEOyBicmVhazsKCWNhc2UgOToJd2lkdGggPSBGQ19XSURUSF9VTFRSQUVYUEFOREVEOyBicmVhazsKCX0KICAgIH0KCiAgICAvKgogICAgICogVHlwZSAxOiBDaGVjayBmb3IgRm9udEluZm8gZGljdGlvbmFyeSBpbmZvcm1hdGlvbgogICAgICogQ29kZSBmcm9tIGcyQG1hZ2VzdHVkaW9zLm5ldCAoR2VyYXJkIEVzY2FsYW50ZSkKICAgICAqLwogICAgCiNpZiBIQVZFX0ZUX0dFVF9QU19GT05UX0lORk8KICAgIGlmIChGVF9HZXRfUFNfRm9udF9JbmZvKGZhY2UsICZwc2ZvbnRpbmZvKSA9PSAwKQogICAgewoJaWYgKHdlaWdodCA9PSAtMSAmJiBwc2ZvbnRpbmZvLndlaWdodCkKCXsKCSAgICB3ZWlnaHQgPSBGY0lzV2VpZ2h0IChwc2ZvbnRpbmZvLndlaWdodCk7CiAgICAJICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfU0NBTlYpCiAgICAJCXByaW50ZiAoIlx0VHlwZTEgd2VpZ2h0ICVzIG1hcHMgdG8gJWRcbiIsCgkJCXBzZm9udGluZm8ud2VpZ2h0LCB3ZWlnaHQpOwoJfQogICAgIAojaWYgMAoJLyogCgkgKiBEb24ndCBib3RoZXIgd2l0aCBpdGFsaWNfYW5nbGU7IEZyZWVUeXBlIGFscmVhZHkgZXh0cmFjdHMgdGhhdAoJICogaW5mb3JtYXRpb24gZm9yIHVzIGFuZCBzdGlja3MgaXQgaW50byBzdHlsZV9mbGFncwoJICovCiAgICAgICAgaWYgKHBzZm9udGluZm8uaXRhbGljX2FuZ2xlKQogICAgICAgICAgICBzbGFudCA9IEZDX1NMQU5UX0lUQUxJQzsgCiAgICAgICAgZWxzZQogICAgICAgICAgICBzbGFudCA9IEZDX1NMQU5UX1JPTUFOOyAKI2VuZGlmCgogICAgICAgIGlmKCFmb3VuZHJ5KQogICAgICAgICAgICBmb3VuZHJ5ID0gRmNOb3RpY2VGb3VuZHJ5KHBzZm9udGluZm8ubm90aWNlKTsKICAgIH0KI2VuZGlmIC8qIEhBVkVfRlRfR0VUX1BTX0ZPTlRfSU5GTyAqLwogICAgCiNpZiBIQVZFX0ZUX0dFVF9CREZfUFJPUEVSVFkKICAgIC8qCiAgICAgKiBGaW5hbGx5LCBsb29rIGZvciBhIEZPVU5EUlkgQkRGIHByb3BlcnR5IGlmIG5vIG90aGVyCiAgICAgKiBtZWNoYW5pc20gaGFzIG1hbmFnZWQgdG8gbG9jYXRlIGEgZm91bmRyeQogICAgICovCgogICAgaWYgKCFmb3VuZHJ5KQogICAgewoJaW50ICAgICAgICAgICAgIHJjOwoJQkRGX1Byb3BlcnR5UmVjIHByb3A7CglyYyA9IE1ZX0dldF9CREZfUHJvcGVydHkoZmFjZSwgIkZPVU5EUlkiLCAmcHJvcCk7CglpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NKQoJICAgIGZvdW5kcnkgPSBwcm9wLnUuYXRvbTsKICAgIH0KCiAgICBpZiAod2lkdGggPT0gLTEpCiAgICB7CglpZiAoTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiUkVMQVRJVkVfU0VUV0lEVEgiLCAmcHJvcCkgPT0gMCAmJgoJICAgIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiB8fAoJICAgICBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwpKQoJewoJICAgIEZUX0ludDMyCXZhbHVlOwoJICAgIAoJICAgIGlmIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUikKCQl2YWx1ZSA9IHByb3AudS5pbnRlZ2VyOwoJICAgIGVsc2UKCQl2YWx1ZSA9IChGVF9JbnQzMikgcHJvcC51LmNhcmRpbmFsOwoJICAgIHN3aXRjaCAoKHZhbHVlICsgNSkgLyAxMCkgewoJICAgIGNhc2UgMTogd2lkdGggPSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSAyOiB3aWR0aCA9IEZDX1dJRFRIX0VYVFJBQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDM6IHdpZHRoID0gRkNfV0lEVEhfQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDQ6IHdpZHRoID0gRkNfV0lEVEhfU0VNSUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSA1OiB3aWR0aCA9IEZDX1dJRFRIX05PUk1BTDsgYnJlYWs7CgkgICAgY2FzZSA2OiB3aWR0aCA9IEZDX1dJRFRIX1NFTUlFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA3OiB3aWR0aCA9IEZDX1dJRFRIX0VYUEFOREVEOyBicmVhazsKCSAgICBjYXNlIDg6IHdpZHRoID0gRkNfV0lEVEhfRVhUUkFFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA5OiB3aWR0aCA9IEZDX1dJRFRIX1VMVFJBRVhQQU5ERUQ7IGJyZWFrOwoJICAgIH0KCX0KCWlmICh3aWR0aCA9PSAtMSAmJgoJICAgIE1ZX0dldF9CREZfUHJvcGVydHkgKGZhY2UsICJTRVRXSURUSF9OQU1FIiwgJnByb3ApID09IDAgJiYKCSAgICBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTSkKCXsKCSAgICB3aWR0aCA9IEZjSXNXaWR0aCAocHJvcC51LmF0b20pOwoJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU5WKQoJCXByaW50ZiAoIlx0c2V0d2lkdGggJXMgbWFwcyB0byAlZFxuIiwgcHJvcC51LmF0b20sIHdpZHRoKTsKCX0KICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIExvb2sgZm9yIHdlaWdodCwgd2lkdGggYW5kIHNsYW50IG5hbWVzIGluIHRoZSBzdHlsZSB2YWx1ZQogICAgICovCiAgICBpZiAoc3R5bGUpCiAgICB7CglpZiAod2VpZ2h0ID09IC0xKQoJewoJICAgIHdlaWdodCA9IEZjQ29udGFpbnNXZWlnaHQgKHN0eWxlKTsKCSAgICBpZiAoRmNEZWJ1ZygpICYgRkNfREJHX1NDQU5WKQoJCXByaW50ZiAoIlx0U3R5bGUgJXMgbWFwcyB0byB3ZWlnaHQgJWRcbiIsIHN0eWxlLCB3ZWlnaHQpOwoJfQoJaWYgKHdpZHRoID09IC0xKQoJewoJICAgIHdpZHRoID0gRmNDb250YWluc1dpZHRoIChzdHlsZSk7CgkgICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19TQ0FOVikKCQlwcmludGYgKCJcdFN0eWxlICVzIG1hcHMgdG8gd2lkdGggJWRcbiIsIHN0eWxlLCB3aWR0aCk7Cgl9CglpZiAoc2xhbnQgPT0gLTEpCgl7CgkgICAgc2xhbnQgPSBGY0NvbnRhaW5zU2xhbnQgKHN0eWxlKTsKCSAgICBpZiAoRmNEZWJ1ZygpICYgRkNfREJHX1NDQU5WKQoJCXByaW50ZiAoIlx0U3R5bGUgJXMgbWFwcyB0byBzbGFudCAlZFxuIiwgc3R5bGUsIHNsYW50KTsKCX0KICAgIH0KICAgIC8qCiAgICAgKiBQdWxsIGRlZmF1bHQgdmFsdWVzIGZyb20gdGhlIEZyZWVUeXBlIGZsYWdzIGlmIG1vcmUKICAgICAqIHNwZWNpZmljIHZhbHVlcyBub3QgZm91bmQgYWJvdmUKICAgICAqLwogICAgaWYgKHNsYW50ID09IC0xKQogICAgewoJc2xhbnQgPSBGQ19TTEFOVF9ST01BTjsKCWlmIChmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDKQoJICAgIHNsYW50ID0gRkNfU0xBTlRfSVRBTElDOwogICAgfQoKICAgIGlmICh3ZWlnaHQgPT0gLTEpCiAgICB7Cgl3ZWlnaHQgPSBGQ19XRUlHSFRfTUVESVVNOwoJaWYgKGZhY2UtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9CT0xEOwogICAgfQoKICAgIGlmICh3aWR0aCA9PSAtMSkKCXdpZHRoID0gRkNfV0lEVEhfTk9STUFMOwoKICAgIGlmIChmb3VuZHJ5ID09IDApCglmb3VuZHJ5ID0gInVua25vd24iOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19TTEFOVCwgc2xhbnQpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfV0VJR0hULCB3ZWlnaHQpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfV0lEVEgsIHdpZHRoKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRk9VTkRSWSwgZm91bmRyeSkpCglnb3RvIGJhaWwxOwoKICAgIC8qCiAgICAgKiBDb21wdXRlIHRoZSB1bmljb2RlIGNvdmVyYWdlIGZvciB0aGUgZm9udAogICAgICovCiAgICBjcyA9IEZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoZmFjZSwgYmxhbmtzLCAmc3BhY2luZyk7CiAgICBpZiAoIWNzKQoJZ290byBiYWlsMTsKCiNpZiBIQVZFX0ZUX0dFVF9CREZfUFJPUEVSVFkKICAgIC8qIEZvciBQQ0YgZm9udHMsIG92ZXJyaWRlIHRoZSBjb21wdXRlZCBzcGFjaW5nIHdpdGggdGhlIG9uZSBmcm9tCiAgICAgICB0aGUgcHJvcGVydHkgKi8KICAgIGlmKE1ZX0dldF9CREZfUHJvcGVydHkoZmFjZSwgIlNQQUNJTkciLCAmcHJvcCkgPT0gMCAmJgogICAgICAgcHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0FUT00pIHsKICAgICAgICBpZighc3RyY21wKHByb3AudS5hdG9tLCAiYyIpIHx8ICFzdHJjbXAocHJvcC51LmF0b20sICJDIikpCiAgICAgICAgICAgIHNwYWNpbmcgPSBGQ19DSEFSQ0VMTDsKICAgICAgICBlbHNlIGlmKCFzdHJjbXAocHJvcC51LmF0b20sICJtIikgfHwgIXN0cmNtcChwcm9wLnUuYXRvbSwgIk0iKSkKICAgICAgICAgICAgc3BhY2luZyA9IEZDX01PTk87CiAgICAgICAgZWxzZSBpZighc3RyY21wKHByb3AudS5hdG9tLCAicCIpIHx8ICFzdHJjbXAocHJvcC51LmF0b20sICJQIikpCiAgICAgICAgICAgIHNwYWNpbmcgPSBGQ19QUk9QT1JUSU9OQUw7CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBTa2lwIG92ZXIgUENGIGZvbnRzIHRoYXQgaGF2ZSBubyBlbmNvZGVkIGNoYXJhY3RlcnM7IHRoZXkncmUKICAgICAqIHVzdWFsbHkganVzdCBVbmljb2RlIGZvbnRzIHRyYW5zY29kZWQgdG8gc29tZSBsZWdhY3kgZW5jb2RpbmcKICAgICAqLwogICAgaWYgKEZjQ2hhclNldENvdW50IChjcykgPT0gMCkKICAgIHsKCWlmICghc3RyY21wKEZUX01PRFVMRV9DTEFTUygmZmFjZS0+ZHJpdmVyLT5yb290KS0+bW9kdWxlX25hbWUsICJwY2YiKSkKCSAgICBnb3RvIGJhaWwyOwogICAgfQoKICAgIGlmICghRmNQYXR0ZXJuQWRkQ2hhclNldCAocGF0LCBGQ19DSEFSU0VULCBjcykpCglnb3RvIGJhaWwyOwoKICAgIGxzID0gRmNGcmVlVHlwZUxhbmdTZXQgKGNzLCBleGNsdXNpdmVMYW5nKTsKICAgIGlmICghbHMpCglnb3RvIGJhaWwyOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkTGFuZ1NldCAocGF0LCBGQ19MQU5HLCBscykpCiAgICB7CglGY0xhbmdTZXREZXN0cm95IChscyk7Cglnb3RvIGJhaWwyOwogICAgfQoKICAgIEZjTGFuZ1NldERlc3Ryb3kgKGxzKTsKCiAgICBpZiAoc3BhY2luZyAhPSBGQ19QUk9QT1JUSU9OQUwpCglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU1BBQ0lORywgc3BhY2luZykpCgkgICAgZ290byBiYWlsMjsKCiAgICBpZiAoIShmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBmYWNlLT5udW1fZml4ZWRfc2l6ZXM7IGkrKykKCSAgICBpZiAoIUZjUGF0dGVybkFkZERvdWJsZSAocGF0LCBGQ19QSVhFTF9TSVpFLAoJCQkJICAgICBGY0dldFBpeGVsU2l6ZSAoZmFjZSwgaSkpKQoJCWdvdG8gYmFpbDE7CglpZiAoIUZjUGF0dGVybkFkZEJvb2wgKHBhdCwgRkNfQU5USUFMSUFTLCBGY0ZhbHNlKSkKCSAgICBnb3RvIGJhaWwxOwojaWYgSEFWRV9GVF9HRVRfQkRGX1BST1BFUlRZCiAgICAgICAgaWYoZmFjZS0+bnVtX2ZpeGVkX3NpemVzID09IDEpIHsKICAgICAgICAgICAgaW50IHJjOwogICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyBwcm9wOwoKICAgICAgICAgICAgcmMgPSBNWV9HZXRfQkRGX1Byb3BlcnR5KGZhY2UsICJQT0lOVF9TSVpFIiwgJnByb3ApOwogICAgICAgICAgICBpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSKQogICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wLnUuaW50ZWdlcjsKICAgICAgICAgICAgZWxzZSBpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCkKICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcC51LmNhcmRpbmFsOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIG5ldmVybWluZDsKICAgICAgICAgICAgaWYoIUZjUGF0dGVybkFkZERvdWJsZShwYXQsIEZDX1NJWkUsIHZhbHVlIC8gMTAuMCkpCiAgICAgICAgICAgICAgICBnb3RvIG5ldmVybWluZDsKCiAgICAgICAgICAgIHJjID0gTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiUkVTT0xVVElPTl9ZIiwgJnByb3ApOwogICAgICAgICAgICBpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSKQogICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wLnUuaW50ZWdlcjsKICAgICAgICAgICAgZWxzZSBpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCkKICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcC51LmNhcmRpbmFsOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIG5ldmVybWluZDsKICAgICAgICAgICAgaWYoIUZjUGF0dGVybkFkZERvdWJsZShwYXQsIEZDX0RQSSwgKGRvdWJsZSl2YWx1ZSkpCiAgICAgICAgICAgICAgICBnb3RvIG5ldmVybWluZDsKCiAgICAgICAgfQogICAgbmV2ZXJtaW5kOgogICAgICAgIDsKI2VuZGlmCiAgICB9CgogICAgLyoKICAgICAqIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgY2hhcnNldAogICAgICovCiAgICBGY0NoYXJTZXREZXN0cm95IChjcyk7CiAgICAKICAgIC8qCiAgICAgKiBEZWFsbG9jYXRlIGZhbWlseS9zdHlsZSB2YWx1ZXMKICAgICAqLwogICAgCiAgICBpZiAoZmFtaWx5X2FsbG9jYXRlZCkKCWZyZWUgKGZhbWlseSk7CiAgICBpZiAoc3R5bGVfYWxsb2NhdGVkKQoJZnJlZSAoc3R5bGUpOwogICAgCiAgICBGVF9Eb25lX0ZhY2UgKGZhY2UpOwogICAgRlRfRG9uZV9GcmVlVHlwZSAoZnRMaWJyYXJ5KTsKICAgIHJldHVybiBwYXQ7CgpiYWlsMjoKICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKYmFpbDE6CiAgICBGY1BhdHRlcm5EZXN0cm95IChwYXQpOwogICAgaWYgKGZhbWlseV9hbGxvY2F0ZWQpCglmcmVlIChmYW1pbHkpOwogICAgaWYgKHN0eWxlX2FsbG9jYXRlZCkKCWZyZWUgKHN0eWxlKTsKYmFpbDA6CiAgICBGVF9Eb25lX0ZhY2UgKGZhY2UpOwpiYWlsOgogICAgRlRfRG9uZV9GcmVlVHlwZSAoZnRMaWJyYXJ5KTsKICAgIHJldHVybiAwOwp9CgoKLyoKICogRm9yIG91ciBwdXJwb3NlcywgdGhpcyBhcHByb3hpbWF0aW9uIGlzIHN1ZmZpY2llbnQKICovCiNpZiAhSEFWRV9GVF9HRVRfTkVYVF9DSEFSCiNkZWZpbmUgRlRfR2V0X05leHRfQ2hhcihmYWNlLCB1Y3M0LCBnaSkgKCh1Y3M0KSA+PSAweGZmZmZmZiA/IFwKCQkJCQkgICgqKGdpKSA9IDApLCAwIDogXAoJCQkJCSAgKCooZ2kpID0gMSksICh1Y3M0KSArIDEpCiN3YXJuaW5nICJObyBGVF9HZXRfTmV4dF9DaGFyIgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJFbnQgewogICAgRmNDaGFyMTYJICAgIGJtcDsKICAgIHVuc2lnbmVkIGNoYXIgICBlbmNvZGU7Cn0gRmNDaGFyRW50OwoKc3RydWN0IF9GY0NoYXJNYXAgewogICAgY29uc3QgRmNDaGFyRW50ICplbnQ7CiAgICBpbnQJCSAgICBuZW50Owp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udERlY29kZSB7CiAgICBGVF9FbmNvZGluZwkgICAgZW5jb2Rpbmc7CiAgICBjb25zdCBGY0NoYXJNYXAgKm1hcDsKICAgIEZjQ2hhcjMyCSAgICBtYXg7Cn0gRmNGb250RGVjb2RlOwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBcHBsZVJvbWFuRW50W10gPSB7CiAgICB7IDB4MDAyMCwgMHgyMCB9LCAvKiBTUEFDRSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSyAqLwogICAgeyAweDAwMjIsIDB4MjIgfSwgLyogUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMDIzLCAweDIzIH0sIC8qIE5VTUJFUiBTSUdOICovCiAgICB7IDB4MDAyNCwgMHgyNCB9LCAvKiBET0xMQVIgU0lHTiAqLwogICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQgKi8KICAgIHsgMHgwMDI3LCAweDI3IH0sIC8qIEFQT1NUUk9QSEUgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTICovCiAgICB7IDB4MDAyQSwgMHgyQSB9LCAvKiBBU1RFUklTSyAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOICovCiAgICB7IDB4MDAyQywgMHgyQyB9LCAvKiBDT01NQSAqLwogICAgeyAweDAwMkQsIDB4MkQgfSwgLyogSFlQSEVOLU1JTlVTICovCiAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AgKi8KICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMgKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8gKi8KICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORSAqLwogICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPICovCiAgICB7IDB4MDAzMywgMHgzMyB9LCAvKiBESUdJVCBUSFJFRSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUiAqLwogICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRSAqLwogICAgeyAweDAwMzYsIDB4MzYgfSwgLyogRElHSVQgU0lYICovCiAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTiAqLwogICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUgKi8KICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOICovCiAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTiAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04gKi8KICAgIHsgMHgwMDNGLCAweDNGIH0sIC8qIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMDQwLCAweDQwIH0sIC8qIENPTU1FUkNJQUwgQVQgKi8KICAgIHsgMHgwMDQxLCAweDQxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KICAgIHsgMHgwMDQyLCAweDQyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDQzLCAweDQzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi8KICAgIHsgMHgwMDQ0LCAweDQ0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KICAgIHsgMHgwMDQ1LCAweDQ1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDQ2LCAweDQ2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEYgKi8KICAgIHsgMHgwMDQ3LCAweDQ3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KICAgIHsgMHgwMDQ4LCAweDQ4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDQ5LCAweDQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgKi8KICAgIHsgMHgwMDRBLCAweDRBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEogKi8KICAgIHsgMHgwMDRCLCAweDRCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDRDLCAweDRDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEwgKi8KICAgIHsgMHgwMDRELCAweDREIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi8KICAgIHsgMHgwMDRFLCAweDRFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDRGLCAweDRGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gKi8KICAgIHsgMHgwMDUwLCAweDUwIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi8KICAgIHsgMHgwMDUxLCAweDUxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDUyLCAweDUyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFIgKi8KICAgIHsgMHgwMDUzLCAweDUzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KICAgIHsgMHgwMDU0LCAweDU0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDU1LCAweDU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgKi8KICAgIHsgMHgwMDU2LCAweDU2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KICAgIHsgMHgwMDU3LCAweDU3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDU4LCAweDU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFggKi8KICAgIHsgMHgwMDU5LCAweDU5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KICAgIHsgMHgwMDVBLCAweDVBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVDLCAweDVDIH0sIC8qIFJFVkVSU0UgU09MSURVUyAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVFLCAweDVFIH0sIC8qIENJUkNVTUZMRVggQUNDRU5UICovCiAgICB7IDB4MDA1RiwgMHg1RiB9LCAvKiBMT1cgTElORSAqLwogICAgeyAweDAwNjAsIDB4NjAgfSwgLyogR1JBVkUgQUNDRU5UICovCiAgICB7IDB4MDA2MSwgMHg2MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLwogICAgeyAweDAwNjIsIDB4NjIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDYzLCAweDYzIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDICovCiAgICB7IDB4MDA2NCwgMHg2NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLwogICAgeyAweDAwNjUsIDB4NjUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDY2LCAweDY2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGICovCiAgICB7IDB4MDA2NywgMHg2NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLwogICAgeyAweDAwNjgsIDB4NjggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDY5LCAweDY5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJICovCiAgICB7IDB4MDA2QSwgMHg2QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLwogICAgeyAweDAwNkIsIDB4NkIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDZDLCAweDZDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBMICovCiAgICB7IDB4MDA2RCwgMHg2RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLwogICAgeyAweDAwNkUsIDB4NkUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDZGLCAweDZGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPICovCiAgICB7IDB4MDA3MCwgMHg3MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLwogICAgeyAweDAwNzEsIDB4NzEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDcyLCAweDcyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBSICovCiAgICB7IDB4MDA3MywgMHg3MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLwogICAgeyAweDAwNzQsIDB4NzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDc1LCAweDc1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVICovCiAgICB7IDB4MDA3NiwgMHg3NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLwogICAgeyAweDAwNzcsIDB4NzcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDc4LCAweDc4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBYICovCiAgICB7IDB4MDA3OSwgMHg3OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLwogICAgeyAweDAwN0EsIDB4N0EgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORSAqLwogICAgeyAweDAwN0QsIDB4N0QgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0UsIDB4N0UgfSwgLyogVElMREUgKi8KICAgIHsgMHgwMEEwLCAweENBIH0sIC8qIE5PLUJSRUFLIFNQQUNFICovCiAgICB7IDB4MDBBMSwgMHhDMSB9LCAvKiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCiAgICB7IDB4MDBBMiwgMHhBMiB9LCAvKiBDRU5UIFNJR04gKi8KICAgIHsgMHgwMEEzLCAweEEzIH0sIC8qIFBPVU5EIFNJR04gKi8KICAgIHsgMHgwMEE1LCAweEI0IH0sIC8qIFlFTiBTSUdOICovCiAgICB7IDB4MDBBNywgMHhBNCB9LCAvKiBTRUNUSU9OIFNJR04gKi8KICAgIHsgMHgwMEE4LCAweEFDIH0sIC8qIERJQUVSRVNJUyAqLwogICAgeyAweDAwQTksIDB4QTkgfSwgLyogQ09QWVJJR0hUIFNJR04gKi8KICAgIHsgMHgwMEFBLCAweEJCIH0sIC8qIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBBQiwgMHhDNyB9LCAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwQUMsIDB4QzIgfSwgLyogTk9UIFNJR04gKi8KICAgIHsgMHgwMEFFLCAweEE4IH0sIC8qIFJFR0lTVEVSRUQgU0lHTiAqLwogICAgeyAweDAwQUYsIDB4RjggfSwgLyogTUFDUk9OICovCiAgICB7IDB4MDBCMCwgMHhBMSB9LCAvKiBERUdSRUUgU0lHTiAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOICovCiAgICB7IDB4MDBCNCwgMHhBQiB9LCAvKiBBQ1VURSBBQ0NFTlQgKi8KICAgIHsgMHgwMEI1LCAweEI1IH0sIC8qIE1JQ1JPIFNJR04gKi8KICAgIHsgMHgwMEI2LCAweEE2IH0sIC8qIFBJTENST1cgU0lHTiAqLwogICAgeyAweDAwQjcsIDB4RTEgfSwgLyogTUlERExFIERPVCAqLwogICAgeyAweDAwQjgsIDB4RkMgfSwgLyogQ0VESUxMQSAqLwogICAgeyAweDAwQkEsIDB4QkMgfSwgLyogTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBCQiwgMHhDOCB9LCAvKiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEJGLCAweEMwIH0sIC8qIElOVkVSVEVEIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMEMwLCAweENCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQzEsIDB4RTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDMiwgMHhFNSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQzMsIDB4Q0MgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBDNCwgMHg4MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBDNSwgMHg4MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLwogICAgeyAweDAwQzYsIDB4QUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEM3LCAweDgyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCiAgICB7IDB4MDBDOCwgMHhFOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEM5LCAweDgzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQ0EsIDB4RTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMENCLCAweEU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMENDLCAweEVEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQ0QsIDB4RUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDRSwgMHhFQiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQ0YsIDB4RUMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDEsIDB4ODQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCiAgICB7IDB4MDBEMiwgMHhGMSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEQzLCAweEVFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRDQsIDB4RUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEQ1LCAweENEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRDYsIDB4ODUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDgsIDB4QUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLwogICAgeyAweDAwRDksIDB4RjQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBEQSwgMHhGMiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMERCLCAweEYzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBEQywgMHg4NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBERiwgMHhBNyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAqLwogICAgeyAweDAwRTAsIDB4ODggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTEsIDB4ODcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRTIsIDB4ODkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFMywgMHg4QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBFNCwgMHg4QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRTUsIDB4OEMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDBFNiwgMHhCRSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEU3LCAweDhEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLwogICAgeyAweDAwRTgsIDB4OEYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTksIDB4OEUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUEsIDB4OTAgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFQiwgMHg5MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRUMsIDB4OTMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRUQsIDB4OTIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUUsIDB4OTQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFRiwgMHg5NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjEsIDB4OTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRjIsIDB4OTggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRjMsIDB4OTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRjQsIDB4OTkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBGNSwgMHg5QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCiAgICB7IDB4MDBGNiwgMHg5QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjcsIDB4RDYgfSwgLyogRElWSVNJT04gU0lHTiAqLwogICAgeyAweDAwRjgsIDB4QkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KICAgIHsgMHgwMEY5LCAweDlEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEZBLCAweDlDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEZCLCAweDlFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRkMsIDB4OUYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEZGLCAweEQ4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDEzMSwgMHhGNSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJICovCiAgICB7IDB4MDE1MiwgMHhDRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FICovCiAgICB7IDB4MDE1MywgMHhDRiB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLwogICAgeyAweDAxNzgsIDB4RDkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAxOTIsIDB4QzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCiAgICB7IDB4MDJDNiwgMHhGNiB9LCAvKiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KICAgIHsgMHgwMkM3LCAweEZGIH0sIC8qIENBUk9OICovCiAgICB7IDB4MDJEOCwgMHhGOSB9LCAvKiBCUkVWRSAqLwogICAgeyAweDAyRDksIDB4RkEgfSwgLyogRE9UIEFCT1ZFICovCiAgICB7IDB4MDJEQSwgMHhGQiB9LCAvKiBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDJEQiwgMHhGRSB9LCAvKiBPR09ORUsgKi8KICAgIHsgMHgwMkRDLCAweEY3IH0sIC8qIFNNQUxMIFRJTERFICovCiAgICB7IDB4MDJERCwgMHhGRCB9LCAvKiBET1VCTEUgQUNVVEUgQUNDRU5UICovCiAgICB7IDB4MDNBOSwgMHhCRCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSAqLwogICAgeyAweDAzQzAsIDB4QjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBJICovCiAgICB7IDB4MjAxMywgMHhEMCB9LCAvKiBFTiBEQVNIICovCiAgICB7IDB4MjAxNCwgMHhEMSB9LCAvKiBFTSBEQVNIICovCiAgICB7IDB4MjAxOCwgMHhENCB9LCAvKiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMTksIDB4RDUgfSwgLyogUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxQSwgMHhFMiB9LCAvKiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFDLCAweEQyIH0sIC8qIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxRCwgMHhEMyB9LCAvKiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFFLCAweEUzIH0sIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMjAsIDB4QTAgfSwgLyogREFHR0VSICovCiAgICB7IDB4MjAyMSwgMHhFMCB9LCAvKiBET1VCTEUgREFHR0VSICovCiAgICB7IDB4MjAyMiwgMHhBNSB9LCAvKiBCVUxMRVQgKi8KICAgIHsgMHgyMDI2LCAweEM5IH0sIC8qIEhPUklaT05UQUwgRUxMSVBTSVMgKi8KICAgIHsgMHgyMDMwLCAweEU0IH0sIC8qIFBFUiBNSUxMRSBTSUdOICovCiAgICB7IDB4MjAzOSwgMHhEQyB9LCAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwM0EsIDB4REQgfSwgLyogU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjA0NCwgMHhEQSB9LCAvKiBGUkFDVElPTiBTTEFTSCAqLwogICAgeyAweDIwQUMsIDB4REIgfSwgLyogRVVSTyBTSUdOICovCiAgICB7IDB4MjEyMiwgMHhBQSB9LCAvKiBUUkFERSBNQVJLIFNJR04gKi8KICAgIHsgMHgyMjAyLCAweEI2IH0sIC8qIFBBUlRJQUwgRElGRkVSRU5USUFMICovCiAgICB7IDB4MjIwNiwgMHhDNiB9LCAvKiBJTkNSRU1FTlQgKi8KICAgIHsgMHgyMjBGLCAweEI4IH0sIC8qIE4tQVJZIFBST0RVQ1QgKi8KICAgIHsgMHgyMjExLCAweEI3IH0sIC8qIE4tQVJZIFNVTU1BVElPTiAqLwogICAgeyAweDIyMUEsIDB4QzMgfSwgLyogU1FVQVJFIFJPT1QgKi8KICAgIHsgMHgyMjFFLCAweEIwIH0sIC8qIElORklOSVRZICovCiAgICB7IDB4MjIyQiwgMHhCQSB9LCAvKiBJTlRFR1JBTCAqLwogICAgeyAweDIyNDgsIDB4QzUgfSwgLyogQUxNT1NUIEVRVUFMIFRPICovCiAgICB7IDB4MjI2MCwgMHhBRCB9LCAvKiBOT1QgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjY0LCAweEIyIH0sIC8qIExFU1MtVEhBTiBPUiBFUVVBTCBUTyAqLwogICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPICovCiAgICB7IDB4MjVDQSwgMHhENyB9LCAvKiBMT1pFTkdFICovCiAgICB7IDB4RjhGRiwgMHhGMCB9LCAvKiBBcHBsZSBsb2dvICovCiAgICB7IDB4RkIwMSwgMHhERSB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSSAqLwogICAgeyAweEZCMDIsIDB4REYgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgRkwgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQXBwbGVSb21hbiA9IHsKICAgIEFwcGxlUm9tYW5FbnQsCiAgICBzaXplb2YgKEFwcGxlUm9tYW5FbnQpIC8gc2l6ZW9mIChBcHBsZVJvbWFuRW50WzBdKQp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBZG9iZVN5bWJvbEVudFtdID0gewogICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSwkjIGV4Y2xhbSAqLwogICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04JIyBudW1iZXJzaWduICovCiAgICB7IDB4MDAyNSwgMHgyNSB9LCAvKiBQRVJDRU5UIFNJR04JIyBwZXJjZW50ICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQJIyBhbXBlcnNhbmQgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMJIyBwYXJlbmxlZnQgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTCSMgcGFyZW5yaWdodCAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOCSMgcGx1cyAqLwogICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEJIyBjb21tYSAqLwogICAgeyAweDAwMkUsIDB4MkUgfSwgLyogRlVMTCBTVE9QCSMgcGVyaW9kICovCiAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTCSMgc2xhc2ggKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8JIyB6ZXJvICovCiAgICB7IDB4MDAzMSwgMHgzMSB9LCAvKiBESUdJVCBPTkUJIyBvbmUgKi8KICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTwkjIHR3byAqLwogICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUJIyB0aHJlZSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUgkjIGZvdXIgKi8KICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUJIyBmaXZlICovCiAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVgJIyBzaXggKi8KICAgIHsgMHgwMDM3LCAweDM3IH0sIC8qIERJR0lUIFNFVkVOCSMgc2V2ZW4gKi8KICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUCSMgZWlnaHQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUJIyBuaW5lICovCiAgICB7IDB4MDAzQSwgMHgzQSB9LCAvKiBDT0xPTgkjIGNvbG9uICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04JIyBzZW1pY29sb24gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOCSMgbGVzcyAqLwogICAgeyAweDAwM0QsIDB4M0QgfSwgLyogRVFVQUxTIFNJR04JIyBlcXVhbCAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04JIyBncmVhdGVyICovCiAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLCSMgcXVlc3Rpb24gKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0bGVmdCAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0cmlnaHQgKi8KICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FCSMgdW5kZXJzY29yZSAqLwogICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VsZWZ0ICovCiAgICB7IDB4MDA3QywgMHg3QyB9LCAvKiBWRVJUSUNBTCBMSU5FCSMgYmFyICovCiAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VyaWdodCAqLwogICAgeyAweDAwQTAsIDB4MjAgfSwgLyogTk8tQlJFQUsgU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwQUMsIDB4RDggfSwgLyogTk9UIFNJR04JIyBsb2dpY2Fsbm90ICovCiAgICB7IDB4MDBCMCwgMHhCMCB9LCAvKiBERUdSRUUgU0lHTgkjIGRlZ3JlZSAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOCSMgcGx1c21pbnVzICovCiAgICB7IDB4MDBCNSwgMHg2RCB9LCAvKiBNSUNSTyBTSUdOCSMgbXUgKi8KICAgIHsgMHgwMEQ3LCAweEI0IH0sIC8qIE1VTFRJUExJQ0FUSU9OIFNJR04JIyBtdWx0aXBseSAqLwogICAgeyAweDAwRjcsIDB4QjggfSwgLyogRElWSVNJT04gU0lHTgkjIGRpdmlkZSAqLwogICAgeyAweDAxOTIsIDB4QTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCSMgZmxvcmluICovCiAgICB7IDB4MDM5MSwgMHg0MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQkjIEFscGhhICovCiAgICB7IDB4MDM5MiwgMHg0MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCSMgQmV0YSAqLwogICAgeyAweDAzOTMsIDB4NDcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEJIyBHYW1tYSAqLwogICAgeyAweDAzOTQsIDB4NDQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEJIyBEZWx0YSAqLwogICAgeyAweDAzOTUsIDB4NDUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgkjIEVwc2lsb24gKi8KICAgIHsgMHgwMzk2LCAweDVBIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEJIyBaZXRhICovCiAgICB7IDB4MDM5NywgMHg0OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEJIyBFdGEgKi8KICAgIHsgMHgwMzk4LCAweDUxIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCSMgVGhldGEgKi8KICAgIHsgMHgwMzk5LCAweDQ5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEJIyBJb3RhICovCiAgICB7IDB4MDM5QSwgMHg0QiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQkjIEthcHBhICovCiAgICB7IDB4MDM5QiwgMHg0QyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQkjIExhbWJkYSAqLwogICAgeyAweDAzOUMsIDB4NEQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUJIyBNdSAqLwogICAgeyAweDAzOUQsIDB4NEUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUJIyBOdSAqLwogICAgeyAweDAzOUUsIDB4NTggfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkJIyBYaSAqLwogICAgeyAweDAzOUYsIDB4NEYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgkjIE9taWNyb24gKi8KICAgIHsgMHgwM0EwLCAweDUwIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCSMgUGkgKi8KICAgIHsgMHgwM0ExLCAweDUyIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITwkjIFJobyAqLwogICAgeyAweDAzQTMsIDB4NTMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEJIyBTaWdtYSAqLwogICAgeyAweDAzQTQsIDB4NTQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCSMgVGF1ICovCiAgICB7IDB4MDNBNSwgMHg1NSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCSMgVXBzaWxvbiAqLwogICAgeyAweDAzQTYsIDB4NDYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCSMgUGhpICovCiAgICB7IDB4MDNBNywgMHg0MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkJIyBDaGkgKi8KICAgIHsgMHgwM0E4LCAweDU5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQkjIFBzaSAqLwogICAgeyAweDAzQTksIDB4NTcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EJIyBPbWVnYSAqLwogICAgeyAweDAzQjEsIDB4NjEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCSMgYWxwaGEgKi8KICAgIHsgMHgwM0IyLCAweDYyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCSMgYmV0YSAqLwogICAgeyAweDAzQjMsIDB4NjcgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCSMgZ2FtbWEgKi8KICAgIHsgMHgwM0I0LCAweDY0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQkjIGRlbHRhICovCiAgICB7IDB4MDNCNSwgMHg2NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgkjIGVwc2lsb24gKi8KICAgIHsgMHgwM0I2LCAweDdBIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCSMgemV0YSAqLwogICAgeyAweDAzQjcsIDB4NjggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVUQQkjIGV0YSAqLwogICAgeyAweDAzQjgsIDB4NzEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCSMgdGhldGEgKi8KICAgIHsgMHgwM0I5LCAweDY5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCSMgaW90YSAqLwogICAgeyAweDAzQkEsIDB4NkIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCSMga2FwcGEgKi8KICAgIHsgMHgwM0JCLCAweDZDIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQkjIGxhbWJkYSAqLwogICAgeyAweDAzQkMsIDB4NkQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE1VCSMgbXUgKi8KICAgIHsgMHgwM0JELCAweDZFIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBOVQkjIG51ICovCiAgICB7IDB4MDNCRSwgMHg3OCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgWEkJIyB4aSAqLwogICAgeyAweDAzQkYsIDB4NkYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04JIyBvbWljcm9uICovCiAgICB7IDB4MDNDMCwgMHg3MCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkJIyBwaSAqLwogICAgeyAweDAzQzEsIDB4NzIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFJITwkjIHJobyAqLwogICAgeyAweDAzQzIsIDB4NTYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCSMgc2lnbWExICovCiAgICB7IDB4MDNDMywgMHg3MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEJIyBzaWdtYSAqLwogICAgeyAweDAzQzQsIDB4NzQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRBVQkjIHRhdSAqLwogICAgeyAweDAzQzUsIDB4NzUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04JIyB1cHNpbG9uICovCiAgICB7IDB4MDNDNiwgMHg2NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCSMgcGhpICovCiAgICB7IDB4MDNDNywgMHg2MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCSMgY2hpICovCiAgICB7IDB4MDNDOCwgMHg3OSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCSMgcHNpICovCiAgICB7IDB4MDNDOSwgMHg3NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EJIyBvbWVnYSAqLwogICAgeyAweDAzRDEsIDB4NEEgfSwgLyogR1JFRUsgVEhFVEEgU1lNQk9MCSMgdGhldGExICovCiAgICB7IDB4MDNEMiwgMHhBMSB9LCAvKiBHUkVFSyBVUFNJTE9OIFdJVEggSE9PSyBTWU1CT0wJIyBVcHNpbG9uMSAqLwogICAgeyAweDAzRDUsIDB4NkEgfSwgLyogR1JFRUsgUEhJIFNZTUJPTAkjIHBoaTEgKi8KICAgIHsgMHgwM0Q2LCAweDc2IH0sIC8qIEdSRUVLIFBJIFNZTUJPTAkjIG9tZWdhMSAqLwogICAgeyAweDIwMjIsIDB4QjcgfSwgLyogQlVMTEVUCSMgYnVsbGV0ICovCiAgICB7IDB4MjAyNiwgMHhCQyB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTCSMgZWxsaXBzaXMgKi8KICAgIHsgMHgyMDMyLCAweEEyIH0sIC8qIFBSSU1FCSMgbWludXRlICovCiAgICB7IDB4MjAzMywgMHhCMiB9LCAvKiBET1VCTEUgUFJJTUUJIyBzZWNvbmQgKi8KICAgIHsgMHgyMDQ0LCAweEE0IH0sIC8qIEZSQUNUSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KICAgIHsgMHgyMEFDLCAweEEwIH0sIC8qIEVVUk8gU0lHTgkjIEV1cm8gKi8KICAgIHsgMHgyMTExLCAweEMxIH0sIC8qIEJMQUNLLUxFVFRFUiBDQVBJVEFMIEkJIyBJZnJha3R1ciAqLwogICAgeyAweDIxMTgsIDB4QzMgfSwgLyogU0NSSVBUIENBUElUQUwgUAkjIHdlaWVyc3RyYXNzICovCiAgICB7IDB4MjExQywgMHhDMiB9LCAvKiBCTEFDSy1MRVRURVIgQ0FQSVRBTCBSCSMgUmZyYWt0dXIgKi8KICAgIHsgMHgyMTI2LCAweDU3IH0sIC8qIE9ITSBTSUdOCSMgT21lZ2EgKi8KICAgIHsgMHgyMTM1LCAweEMwIH0sIC8qIEFMRUYgU1lNQk9MCSMgYWxlcGggKi8KICAgIHsgMHgyMTkwLCAweEFDIH0sIC8qIExFRlRXQVJEUyBBUlJPVwkjIGFycm93bGVmdCAqLwogICAgeyAweDIxOTEsIDB4QUQgfSwgLyogVVBXQVJEUyBBUlJPVwkjIGFycm93dXAgKi8KICAgIHsgMHgyMTkyLCAweEFFIH0sIC8qIFJJR0hUV0FSRFMgQVJST1cJIyBhcnJvd3JpZ2h0ICovCiAgICB7IDB4MjE5MywgMHhBRiB9LCAvKiBET1dOV0FSRFMgQVJST1cJIyBhcnJvd2Rvd24gKi8KICAgIHsgMHgyMTk0LCAweEFCIH0sIC8qIExFRlQgUklHSFQgQVJST1cJIyBhcnJvd2JvdGggKi8KICAgIHsgMHgyMUI1LCAweEJGIH0sIC8qIERPV05XQVJEUyBBUlJPVyBXSVRIIENPUk5FUiBMRUZUV0FSRFMJIyBjYXJyaWFnZXJldHVybiAqLwogICAgeyAweDIxRDAsIDB4REMgfSwgLyogTEVGVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsbGVmdCAqLwogICAgeyAweDIxRDEsIDB4REQgfSwgLyogVVBXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibHVwICovCiAgICB7IDB4MjFEMiwgMHhERSB9LCAvKiBSSUdIVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJscmlnaHQgKi8KICAgIHsgMHgyMUQzLCAweERGIH0sIC8qIERPV05XQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGRvd24gKi8KICAgIHsgMHgyMUQ0LCAweERCIH0sIC8qIExFRlQgUklHSFQgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxib3RoICovCiAgICB7IDB4MjIwMCwgMHgyMiB9LCAvKiBGT1IgQUxMCSMgdW5pdmVyc2FsICovCiAgICB7IDB4MjIwMiwgMHhCNiB9LCAvKiBQQVJUSUFMIERJRkZFUkVOVElBTAkjIHBhcnRpYWxkaWZmICovCiAgICB7IDB4MjIwMywgMHgyNCB9LCAvKiBUSEVSRSBFWElTVFMJIyBleGlzdGVudGlhbCAqLwogICAgeyAweDIyMDUsIDB4QzYgfSwgLyogRU1QVFkgU0VUCSMgZW1wdHlzZXQgKi8KICAgIHsgMHgyMjA2LCAweDQ0IH0sIC8qIElOQ1JFTUVOVAkjIERlbHRhICovCiAgICB7IDB4MjIwNywgMHhEMSB9LCAvKiBOQUJMQQkjIGdyYWRpZW50ICovCiAgICB7IDB4MjIwOCwgMHhDRSB9LCAvKiBFTEVNRU5UIE9GCSMgZWxlbWVudCAqLwogICAgeyAweDIyMDksIDB4Q0YgfSwgLyogTk9UIEFOIEVMRU1FTlQgT0YJIyBub3RlbGVtZW50ICovCiAgICB7IDB4MjIwQiwgMHgyNyB9LCAvKiBDT05UQUlOUyBBUyBNRU1CRVIJIyBzdWNodGhhdCAqLwogICAgeyAweDIyMEYsIDB4RDUgfSwgLyogTi1BUlkgUFJPRFVDVAkjIHByb2R1Y3QgKi8KICAgIHsgMHgyMjExLCAweEU1IH0sIC8qIE4tQVJZIFNVTU1BVElPTgkjIHN1bW1hdGlvbiAqLwogICAgeyAweDIyMTIsIDB4MkQgfSwgLyogTUlOVVMgU0lHTgkjIG1pbnVzICovCiAgICB7IDB4MjIxNSwgMHhBNCB9LCAvKiBESVZJU0lPTiBTTEFTSAkjIGZyYWN0aW9uICovCiAgICB7IDB4MjIxNywgMHgyQSB9LCAvKiBBU1RFUklTSyBPUEVSQVRPUgkjIGFzdGVyaXNrbWF0aCAqLwogICAgeyAweDIyMUEsIDB4RDYgfSwgLyogU1FVQVJFIFJPT1QJIyByYWRpY2FsICovCiAgICB7IDB4MjIxRCwgMHhCNSB9LCAvKiBQUk9QT1JUSU9OQUwgVE8JIyBwcm9wb3J0aW9uYWwgKi8KICAgIHsgMHgyMjFFLCAweEE1IH0sIC8qIElORklOSVRZCSMgaW5maW5pdHkgKi8KICAgIHsgMHgyMjIwLCAweEQwIH0sIC8qIEFOR0xFCSMgYW5nbGUgKi8KICAgIHsgMHgyMjI3LCAweEQ5IH0sIC8qIExPR0lDQUwgQU5ECSMgbG9naWNhbGFuZCAqLwogICAgeyAweDIyMjgsIDB4REEgfSwgLyogTE9HSUNBTCBPUgkjIGxvZ2ljYWxvciAqLwogICAgeyAweDIyMjksIDB4QzcgfSwgLyogSU5URVJTRUNUSU9OCSMgaW50ZXJzZWN0aW9uICovCiAgICB7IDB4MjIyQSwgMHhDOCB9LCAvKiBVTklPTgkjIHVuaW9uICovCiAgICB7IDB4MjIyQiwgMHhGMiB9LCAvKiBJTlRFR1JBTAkjIGludGVncmFsICovCiAgICB7IDB4MjIzNCwgMHg1QyB9LCAvKiBUSEVSRUZPUkUJIyB0aGVyZWZvcmUgKi8KICAgIHsgMHgyMjNDLCAweDdFIH0sIC8qIFRJTERFIE9QRVJBVE9SCSMgc2ltaWxhciAqLwogICAgeyAweDIyNDUsIDB4NDAgfSwgLyogQVBQUk9YSU1BVEVMWSBFUVVBTCBUTwkjIGNvbmdydWVudCAqLwogICAgeyAweDIyNDgsIDB4QkIgfSwgLyogQUxNT1NUIEVRVUFMIFRPCSMgYXBwcm94ZXF1YWwgKi8KICAgIHsgMHgyMjYwLCAweEI5IH0sIC8qIE5PVCBFUVVBTCBUTwkjIG5vdGVxdWFsICovCiAgICB7IDB4MjI2MSwgMHhCQSB9LCAvKiBJREVOVElDQUwgVE8JIyBlcXVpdmFsZW5jZSAqLwogICAgeyAweDIyNjQsIDB4QTMgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPCSMgbGVzc2VxdWFsICovCiAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8JIyBncmVhdGVyZXF1YWwgKi8KICAgIHsgMHgyMjgyLCAweENDIH0sIC8qIFNVQlNFVCBPRgkjIHByb3BlcnN1YnNldCAqLwogICAgeyAweDIyODMsIDB4QzkgfSwgLyogU1VQRVJTRVQgT0YJIyBwcm9wZXJzdXBlcnNldCAqLwogICAgeyAweDIyODQsIDB4Q0IgfSwgLyogTk9UIEEgU1VCU0VUIE9GCSMgbm90c3Vic2V0ICovCiAgICB7IDB4MjI4NiwgMHhDRCB9LCAvKiBTVUJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdWJzZXQgKi8KICAgIHsgMHgyMjg3LCAweENBIH0sIC8qIFNVUEVSU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3VwZXJzZXQgKi8KICAgIHsgMHgyMjk1LCAweEM1IH0sIC8qIENJUkNMRUQgUExVUwkjIGNpcmNsZXBsdXMgKi8KICAgIHsgMHgyMjk3LCAweEM0IH0sIC8qIENJUkNMRUQgVElNRVMJIyBjaXJjbGVtdWx0aXBseSAqLwogICAgeyAweDIyQTUsIDB4NUUgfSwgLyogVVAgVEFDSwkjIHBlcnBlbmRpY3VsYXIgKi8KICAgIHsgMHgyMkM1LCAweEQ3IH0sIC8qIERPVCBPUEVSQVRPUgkjIGRvdG1hdGggKi8KICAgIHsgMHgyMzIwLCAweEYzIH0sIC8qIFRPUCBIQUxGIElOVEVHUkFMCSMgaW50ZWdyYWx0cCAqLwogICAgeyAweDIzMjEsIDB4RjUgfSwgLyogQk9UVE9NIEhBTEYgSU5URUdSQUwJIyBpbnRlZ3JhbGJ0ICovCiAgICB7IDB4MjMyOSwgMHhFMSB9LCAvKiBMRUZULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZWxlZnQgKi8KICAgIHsgMHgyMzJBLCAweEYxIH0sIC8qIFJJR0hULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZXJpZ2h0ICovCiAgICB7IDB4MjVDQSwgMHhFMCB9LCAvKiBMT1pFTkdFCSMgbG96ZW5nZSAqLwogICAgeyAweDI2NjAsIDB4QUEgfSwgLyogQkxBQ0sgU1BBREUgU1VJVAkjIHNwYWRlICovCiAgICB7IDB4MjY2MywgMHhBNyB9LCAvKiBCTEFDSyBDTFVCIFNVSVQJIyBjbHViICovCiAgICB7IDB4MjY2NSwgMHhBOSB9LCAvKiBCTEFDSyBIRUFSVCBTVUlUCSMgaGVhcnQgKi8KICAgIHsgMHgyNjY2LCAweEE4IH0sIC8qIEJMQUNLIERJQU1PTkQgU1VJVAkjIGRpYW1vbmQgKi8KICAgIHsgMHhGNkQ5LCAweEQzIH0sIC8qIENPUFlSSUdIVCBTSUdOIFNFUklGCSMgY29weXJpZ2h0c2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRBLCAweEQyIH0sIC8qIFJFR0lTVEVSRUQgU0lHTiBTRVJJRgkjIHJlZ2lzdGVyc2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRCLCAweEQ0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTRVJJRgkjIHRyYWRlbWFya3NlcmlmIChDVVMpICovCiAgICB7IDB4RjhFNSwgMHg2MCB9LCAvKiBSQURJQ0FMIEVYVEVOREVSCSMgcmFkaWNhbGV4IChDVVMpICovCiAgICB7IDB4RjhFNiwgMHhCRCB9LCAvKiBWRVJUSUNBTCBBUlJPVyBFWFRFTkRFUgkjIGFycm93dmVydGV4IChDVVMpICovCiAgICB7IDB4RjhFNywgMHhCRSB9LCAvKiBIT1JJWk9OVEFMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3dob3JpemV4IChDVVMpICovCiAgICB7IDB4RjhFOCwgMHhFMiB9LCAvKiBSRUdJU1RFUkVEIFNJR04gU0FOUyBTRVJJRgkjIHJlZ2lzdGVyc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RTksIDB4RTMgfSwgLyogQ09QWVJJR0hUIFNJR04gU0FOUyBTRVJJRgkjIGNvcHlyaWdodHNhbnMgKENVUykgKi8KICAgIHsgMHhGOEVBLCAweEU0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTQU5TIFNFUklGCSMgdHJhZGVtYXJrc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RUIsIDB4RTYgfSwgLyogTEVGVCBQQVJFTiBUT1AJIyBwYXJlbmxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RUMsIDB4RTcgfSwgLyogTEVGVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVubGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhFRCwgMHhFOCB9LCAvKiBMRUZUIFBBUkVOIEJPVFRPTQkjIHBhcmVubGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhFRSwgMHhFOSB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRsZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEVGLCAweEVBIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0bGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhGMCwgMHhFQiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRsZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEYxLCAweEVDIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZWxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RjIsIDB4RUQgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlbGVmdG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RjMsIDB4RUUgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlbGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhGNCwgMHhFRiB9LCAvKiBDVVJMWSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2VleCAoQ1VTKSAqLwogICAgeyAweEY4RjUsIDB4RjQgfSwgLyogSU5URUdSQUwgRVhURU5ERVIJIyBpbnRlZ3JhbGV4IChDVVMpICovCiAgICB7IDB4RjhGNiwgMHhGNiB9LCAvKiBSSUdIVCBQQVJFTiBUT1AJIyBwYXJlbnJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEY3LCAweEY3IH0sIC8qIFJJR0hUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5yaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGOCwgMHhGOCB9LCAvKiBSSUdIVCBQQVJFTiBCT1RUT00JIyBwYXJlbnJpZ2h0YnQgKENVUykgKi8KICAgIHsgMHhGOEY5LCAweEY5IH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRyaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGQSwgMHhGQSB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRyaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGQiwgMHhGQiB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBCT1RUT00JIyBicmFja2V0cmlnaHRidCAoQ1VTKSAqLwogICAgeyAweEY4RkMsIDB4RkMgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZXJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEZELCAweEZEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VyaWdodG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RkUsIDB4RkUgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBCT1RUT00JIyBicmFjZXJpZ2h0YnQgKENVUykgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQWRvYmVTeW1ib2wgPSB7CiAgICBBZG9iZVN5bWJvbEVudCwKICAgIHNpemVvZiAoQWRvYmVTeW1ib2xFbnQpIC8gc2l6ZW9mIChBZG9iZVN5bWJvbEVudFswXSksCn07CiAgICAKc3RhdGljIGNvbnN0IEZjRm9udERlY29kZSBmY0ZvbnREZWNvZGVyc1tdID0gewogICAgeyBmdF9lbmNvZGluZ191bmljb2RlLAkwLAkJKDEgPDwgMjEpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19zeW1ib2wsCSZBZG9iZVN5bWJvbCwJKDEgPDwgMTYpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiwJJkFwcGxlUm9tYW4sCSgxIDw8IDE2KSAtIDEgfSwKfTsKCiNkZWZpbmUgTlVNX0RFQ09ERSAgKHNpemVvZiAoZmNGb250RGVjb2RlcnMpIC8gc2l6ZW9mIChmY0ZvbnREZWNvZGVyc1swXSkpCgpGY0NoYXIzMgpGY0ZyZWVUeXBlVWNzNFRvUHJpdmF0ZSAoRmNDaGFyMzIgdWNzNCwgY29uc3QgRmNDaGFyTWFwICptYXApCnsKICAgIGludAkJbG93LCBoaWdoLCBtaWQ7CiAgICBGY0NoYXIxNglibXA7CgogICAgbG93ID0gMDsKICAgIGhpZ2ggPSBtYXAtPm5lbnQgLSAxOwogICAgaWYgKHVjczQgPCBtYXAtPmVudFtsb3ddLmJtcCB8fCBtYXAtPmVudFtoaWdoXS5ibXAgPCB1Y3M0KQoJcmV0dXJuIH4wOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKQogICAgewoJbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7CglibXAgPSBtYXAtPmVudFttaWRdLmJtcDsKCWlmICh1Y3M0ID09IGJtcCkKCSAgICByZXR1cm4gKEZUX1VMb25nKSBtYXAtPmVudFttaWRdLmVuY29kZTsKCWlmICh1Y3M0IDwgYm1wKQoJICAgIGhpZ2ggPSBtaWQgLSAxOwoJZWxzZQoJICAgIGxvdyA9IG1pZCArIDE7CiAgICB9CiAgICByZXR1cm4gfjA7Cn0KCkZjQ2hhcjMyCkZjRnJlZVR5cGVQcml2YXRlVG9VY3M0IChGY0NoYXIzMiBwcml2YXRlLCBjb25zdCBGY0NoYXJNYXAgKm1hcCkKewogICAgaW50CSAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPm5lbnQ7IGkrKykKCWlmIChtYXAtPmVudFtpXS5lbmNvZGUgPT0gcHJpdmF0ZSkKCSAgICByZXR1cm4gKEZjQ2hhcjMyKSBtYXAtPmVudFtpXS5ibXA7CiAgICByZXR1cm4gfjA7Cn0KCmNvbnN0IEZjQ2hhck1hcCAqCkZjRnJlZVR5cGVHZXRQcml2YXRlTWFwIChGVF9FbmNvZGluZyBlbmNvZGluZykKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9ERUNPREU7IGkrKykKCWlmIChmY0ZvbnREZWNvZGVyc1tpXS5lbmNvZGluZyA9PSBlbmNvZGluZykKCSAgICByZXR1cm4gZmNGb250RGVjb2RlcnNbaV0ubWFwOwogICAgcmV0dXJuIDA7Cn0KCiNpbmNsdWRlICIuLi9mYy1nbHlwaG5hbWUvZmNnbHlwaG5hbWUuaCIKCnN0YXRpYyBGY0NoYXIzMgpGY0hhc2hHbHlwaE5hbWUgKGNvbnN0IEZjQ2hhcjggKm5hbWUpCnsKICAgIEZjQ2hhcjMyCWggPSAwOwogICAgRmNDaGFyOAljOwoKICAgIHdoaWxlICgoYyA9ICpuYW1lKyspKQogICAgewoJaCA9ICgoaCA8PCAxKSB8IChoID4+IDMxKSkgXiBjOwogICAgfQogICAgcmV0dXJuIGg7Cn0KCiNpZiBIQVZFX0ZUX0hBU19QU19HTFlQSF9OQU1FUwovKgogKiBVc2UgVHlwZTEgZ2x5cGggbmFtZXMgZm9yIGZvbnRzIHdoaWNoIGhhdmUgcmVsaWFibGUgbmFtZXMKICogYW5kIHdoaWNoIGV4cG9ydCBhbiBBZG9iZSBDdXN0b20gbWFwcGluZwogKi8Kc3RhdGljIEZjQm9vbApGY0ZyZWVUeXBlVXNlTmFtZXMgKEZUX0ZhY2UgZmFjZSkKewogICAgRlRfSW50ICBtYXA7CiAgICAKICAgIGlmICghRlRfSGFzX1BTX0dseXBoX05hbWVzIChmYWNlKSkKCXJldHVybiBGY0ZhbHNlOwogICAgZm9yIChtYXAgPSAwOyBtYXAgPCBmYWNlLT5udW1fY2hhcm1hcHM7IG1hcCsrKQoJaWYgKGZhY2UtPmNoYXJtYXBzW21hcF0tPmVuY29kaW5nID09IGZ0X2VuY29kaW5nX2Fkb2JlX2N1c3RvbSkKCSAgICByZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0NoYXI4ICoKRmNVY3M0VG9HbHlwaE5hbWUgKEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJaSA9IChpbnQpICh1Y3M0ICUgRkNfR0xZUEhOQU1FX0hBU0gpOwogICAgaW50CQlyID0gMDsKICAgIEZjR2x5cGhOYW1lCSpnbjsKCiAgICB3aGlsZSAoKGduID0gdWNzX3RvX25hbWVbaV0pKQogICAgewoJaWYgKGduLT51Y3MgPT0gdWNzNCkKCSAgICByZXR1cm4gZ24tPm5hbWU7CglpZiAoIXIpIAoJewoJICAgIHIgPSAoaW50KSAodWNzNCAlIEZDX0dMWVBITkFNRV9SRUhBU0gpOwoJICAgIGlmICghcikKCQlyID0gMTsKCX0KCWkgKz0gcjsKCWlmIChpID49IEZDX0dMWVBITkFNRV9IQVNIKQoJICAgIGkgLT0gRkNfR0xZUEhOQU1FX0hBU0g7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZjQ2hhcjMyCkZjR2x5cGhOYW1lVG9VY3M0IChGY0NoYXI4ICpuYW1lKQp7CiAgICBGY0NoYXIzMgloID0gRmNIYXNoR2x5cGhOYW1lIChuYW1lKTsKICAgIGludAkJaSA9IChpbnQpIChoICUgRkNfR0xZUEhOQU1FX0hBU0gpOwogICAgaW50CQlyID0gMDsKICAgIEZjR2x5cGhOYW1lCSpnbjsKCiAgICB3aGlsZSAoKGduID0gbmFtZV90b191Y3NbaV0pKQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIG5hbWUsIChjaGFyICopIGduLT5uYW1lKSkKCSAgICByZXR1cm4gZ24tPnVjczsKCWlmICghcikgCgl7CgkgICAgciA9IChpbnQpIChoICUgRkNfR0xZUEhOQU1FX1JFSEFTSCk7CgkgICAgaWYgKCFyKQoJCXIgPSAxOwoJfQoJaSArPSByOwoJaWYgKGkgPj0gRkNfR0xZUEhOQU1FX0hBU0gpCgkgICAgaSAtPSBGQ19HTFlQSE5BTUVfSEFTSDsKICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCi8qCiAqIFNlYXJjaCB0aHJvdWdoIGEgZm9udCBmb3IgYSBnbHlwaCBieSBuYW1lLiAgVGhpcyBpcwogKiBjdXJyZW50bHkgYSBsaW5lYXIgc2VhcmNoIGFzIHRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlCiAqIGFueSBkZWZpbmVkIG9yZGVyIHdpdGhpbiB0aGUgZm9udAogKi8Kc3RhdGljIEZUX1VJbnQKRmNGcmVlVHlwZUdseXBoTmFtZUluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjggKm5hbWUpCnsKICAgIEZUX1VJbnQgZ2luZGV4OwogICAgRmNDaGFyOCBuYW1lX2J1ZltGQ19HTFlQSE5BTUVfTUFYTEVOICsgMl07CgogICAgZm9yIChnaW5kZXggPSAwOyBnaW5kZXggPCBmYWNlLT5udW1fZ2x5cGhzOyBnaW5kZXgrKykKICAgIHsKCWlmIChGVF9HZXRfR2x5cGhfTmFtZSAoZmFjZSwgZ2luZGV4LCBuYW1lX2J1ZiwgRkNfR0xZUEhOQU1FX01BWExFTisxKSA9PSAwKQoJICAgIGlmICghc3RyY21wICgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuYW1lX2J1ZikpCgkJcmV0dXJuIGdpbmRleDsKICAgIH0KICAgIHJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogTWFwIGEgVUNTNCBnbHlwaCB0byBhIGdseXBoIGluZGV4LiAgVXNlIGFsbCBhdmFpbGFibGUgZW5jb2RpbmcKICogdGFibGVzIHRvIHRyeSBhbmQgZmluZCBvbmUgdGhhdCB3b3Jrcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQKICogdG8gYmUgY2FjaGVkIGJ5IGhpZ2hlciBsZXZlbHMsIHNvIHBlcmZvcm1hbmNlIGlzbid0IGNyaXRpY2FsCiAqLwoKRlRfVUludApGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJICAgIGluaXRpYWwsIG9mZnNldCwgZGVjb2RlOwogICAgRlRfVUludAkgICAgZ2x5cGhpbmRleDsKICAgIEZjQ2hhcjMyCSAgICBjaGFyY29kZTsKCiAgICBpbml0aWFsID0gMDsKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBjdXJyZW50IGVuY29kaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5jaGFybWFwKQogICAgewoJZm9yICg7IGluaXRpYWwgPCBOVU1fREVDT0RFOyBpbml0aWFsKyspCgkgICAgaWYgKGZjRm9udERlY29kZXJzW2luaXRpYWxdLmVuY29kaW5nID09IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nKQoJCWJyZWFrOwoJaWYgKGluaXRpYWwgPT0gTlVNX0RFQ09ERSkKCSAgICBpbml0aWFsID0gMDsKICAgIH0KICAgIC8qCiAgICAgKiBDaGVjayBlYWNoIGVuY29kaW5nIGZvciB0aGUgZ2x5cGgsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgb25lCiAgICAgKi8KICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgTlVNX0RFQ09ERTsgb2Zmc2V0KyspCiAgICB7CglkZWNvZGUgPSAoaW5pdGlhbCArIG9mZnNldCkgJSBOVU1fREVDT0RFOwoJaWYgKCFmYWNlLT5jaGFybWFwIHx8IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nICE9IGZjRm9udERlY29kZXJzW2RlY29kZV0uZW5jb2RpbmcpCgkgICAgaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKSAhPSAwKQoJCWNvbnRpbnVlOwoJaWYgKGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKQoJewoJICAgIGNoYXJjb2RlID0gRmNGcmVlVHlwZVVjczRUb1ByaXZhdGUgKHVjczQsIGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKTsKCSAgICBpZiAoY2hhcmNvZGUgPT0gfjApCgkJY29udGludWU7Cgl9CgllbHNlCgkgICAgY2hhcmNvZGUgPSB1Y3M0OwoJZ2x5cGhpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCAoRlRfVUxvbmcpIGNoYXJjb2RlKTsKCWlmIChnbHlwaGluZGV4KQoJICAgIHJldHVybiBnbHlwaGluZGV4OwogICAgfQojaWYgSEFWRV9GVF9IQVNfUFNfR0xZUEhfTkFNRVMKICAgIC8qCiAgICAgKiBDaGVjayBwb3N0c2NyaXB0IG5hbWUgdGFibGUgaWYgcHJlc2VudAogICAgICovCiAgICBpZiAoRmNGcmVlVHlwZVVzZU5hbWVzIChmYWNlKSkKICAgIHsKCUZjQ2hhcjgJKm5hbWUgPSBGY1VjczRUb0dseXBoTmFtZSAodWNzNCk7CglpZiAobmFtZSkKCXsKCSAgICBnbHlwaGluZGV4ID0gRmNGcmVlVHlwZUdseXBoTmFtZUluZGV4IChmYWNlLCBuYW1lKTsKCSAgICBpZiAoZ2x5cGhpbmRleCkKCQlyZXR1cm4gZ2x5cGhpbmRleDsKCX0KICAgIH0KI2VuZGlmCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZjQm9vbApGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0LCAKCQkgICAgICBGVF9VSW50IGdseXBoLCBGY0JsYW5rcyAqYmxhbmtzLAoJCSAgICAgIEZUX1BvcyAqYWR2YW5jZSkKewogICAgRlRfSW50CSAgICBsb2FkX2ZsYWdzID0gRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggfCBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwogICAgRlRfR2x5cGhTbG90ICAgIHNsb3Q7CiAgICAKICAgIC8qCiAgICAgKiBGb3IgYml0bWFwLW9ubHkgZm9udHMsIGFzc3VtZSB0aGF0IHRoZXkncmUgT0suCiAgICAgKi8KICAgIGlmICgoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkgPT0gMCkKCXJldHVybiBGY1RydWU7CgogICAgLyoKICAgICAqIFdoZW4gdXNpbmcgc2NhbGFibGUgZm9udHMsIG9ubHkgcmVwb3J0IHRob3NlIGdseXBocwogICAgICogd2hpY2ggY2FuIGJlIHNjYWxlZDsgb3RoZXJ3aXNlIHRob3NlIGZvbnRzIHdpbGwKICAgICAqIG9ubHkgYmUgYXZhaWxhYmxlIGF0IHNvbWUgc2l6ZXMsIGFuZCBuZXZlciB3aGVuCiAgICAgKiB0cmFuc2Zvcm1lZC4gIEF2b2lkIHRoaXMgYnkgc2ltcGx5IHJlcG9ydGluZyBiaXRtYXAtb25seQogICAgICogZ2x5cGhzIGFzIG1pc3NpbmcKICAgICAqLwogICAgaWYgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpCglsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fQklUTUFQOwogICAgCiAgICBpZiAoRlRfTG9hZF9HbHlwaCAoZmFjZSwgZ2x5cGgsIGxvYWRfZmxhZ3MpKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgIHNsb3QgPSBmYWNlLT5nbHlwaDsKICAgIGlmICghZ2x5cGgpCglyZXR1cm4gRmNGYWxzZTsKICAgIAogICAgKmFkdmFuY2UgPSBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlOwoKICAgIHN3aXRjaCAoc2xvdC0+Zm9ybWF0KSB7CiAgICBjYXNlIGZ0X2dseXBoX2Zvcm1hdF9iaXRtYXA6CgkvKgoJICogQml0bWFwcyBhcmUgYXNzdW1lZCB0byBiZSByZWFzb25hYmxlOyBpZgoJICogdGhpcyBwcm92ZXMgdG8gYmUgYSByYXNoIGFzc3VtcHRpb24sIHRoaXMKCSAqIGNvZGUgY2FuIGJlIGVhc2lseSBtb2RpZmllZAoJICovCglyZXR1cm4gRmNUcnVlOwogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZToKCS8qCgkgKiBHbHlwaHMgd2l0aCBjb250b3VycyBhcmUgYWx3YXlzIE9LCgkgKi8KCWlmIChzbG90LT5vdXRsaW5lLm5fY29udG91cnMgIT0gMCkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyoKCSAqIEdseXBocyB3aXRoIG5vIGNvbnRvdXJzIGFyZSBvbmx5IE9LIGlmCgkgKiB0aGV5J3JlIG1lbWJlcnMgb2YgdGhlIEJsYW5rcyBzZXQgc3BlY2lmaWVkCgkgKiBpbiB0aGUgY29uZmlndXJhdGlvbi4gIElmIGJsYW5rcyBpc24ndCBzZXQsCgkgKiB0aGVuIGFsbG93IGFueSBnbHlwaCB0byBiZSBibGFuawoJICovCglpZiAoIWJsYW5rcyB8fCBGY0JsYW5rc0lzTWVtYmVyIChibGFua3MsIHVjczQpKQoJICAgIHJldHVybiBGY1RydWU7CgkvKiBmYWxsIHRocm91Z2ggLi4uICovCiAgICBkZWZhdWx0OgoJYnJlYWs7CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKI2RlZmluZSBBUFBST1hJTUFURUxZX0VRVUFMKHgseSkgKEFCUyAoKHgpIC0gKHkpKSA8PSBNQVggKEFCUyAoeCksIEFCUyAoeSkpIC8gMzMpCgpGY0NoYXJTZXQgKgpGY0ZyZWVUeXBlQ2hhclNldEFuZFNwYWNpbmcgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcywgaW50ICpzcGFjaW5nKQp7CiAgICBGY0NoYXIzMgkgICAgcGFnZSwgb2ZmLCBtYXgsIHVjczQ7CiNpZmRlZiBDSEVDSwogICAgRmNDaGFyMzIJICAgIGZvbnRfbWF4ID0gMDsKI2VuZGlmCiAgICBGY0NoYXJTZXQJICAgICpmY3M7CiAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKICAgIGNvbnN0IEZjQ2hhck1hcCAqbWFwOwogICAgaW50CQkgICAgbzsKICAgIGludAkJICAgIGk7CiAgICBGVF9VSW50CSAgICBnbHlwaDsKICAgIEZUX1BvcwkgICAgYWR2YW5jZSwgYWR2YW5jZV9vbmUgPSAwLCBhZHZhbmNlX3R3byA9IDA7CiAgICBGY0Jvb2wJICAgIGhhc19hZHZhbmNlID0gRmNGYWxzZSwgZml4ZWRfYWR2YW5jZSA9IEZjVHJ1ZSwgZHVhbF9hZHZhbmNlID0gRmNGYWxzZTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICAKI2lmZGVmIENIRUNLCiAgICBwcmludGYgKCJGYW1pbHkgJXMgc3R5bGUgJXNcbiIsIGZhY2UtPmZhbWlseV9uYW1lLCBmYWNlLT5zdHlsZV9uYW1lKTsKI2VuZGlmCiAgICBmb3IgKG8gPSAwOyBvIDwgTlVNX0RFQ09ERTsgbysrKQogICAgewoJaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tvXS5lbmNvZGluZykgIT0gMCkKCSAgICBjb250aW51ZTsKCW1hcCA9IGZjRm9udERlY29kZXJzW29dLm1hcDsKCWlmIChtYXApCgl7CgkgICAgLyoKCSAgICAgKiBOb24tVW5pY29kZSB0YWJsZXMgYXJlIGVhc3k7IHRoZXJlJ3MgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZQoJICAgICAqIGNoYXJhY3RlcnMKCSAgICAgKi8KCSAgICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5uZW50OyBpKyspCgkgICAgewoJCXVjczQgPSBtYXAtPmVudFtpXS5ibXA7CgkJZ2x5cGggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgbWFwLT5lbnRbaV0uZW5jb2RlKTsKCQlpZiAoZ2x5cGggJiYgCgkJICAgIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCBnbHlwaCwgYmxhbmtzLCAmYWR2YW5jZSkpCgkJewoJCSAgICBpZiAoIWhhc19hZHZhbmNlKQoJCSAgICB7CgkJCWhhc19hZHZhbmNlID0gRmNUcnVlOwoJCQlhZHZhbmNlX29uZSA9IGFkdmFuY2U7CgkJICAgIH0KCQkgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2Vfb25lKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZF9hZHZhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY1RydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9hZHZhbmNlID0gRmNGYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VfdHdvID0gYWR2YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQVBQUk9YSU1BVEVMWV9FUVVBTCAoYWR2YW5jZSwgYWR2YW5jZV90d28pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbF9hZHZhbmNlID0gRmNGYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgoJCSAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CgkJICAgIGlmICghbGVhZikKCQkJZ290byBiYWlsMTsKCQkgICAgbGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiNpZmRlZiBDSEVDSwoJCSAgICBpZiAodWNzNCA+IGZvbnRfbWF4KQoJCQlmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCX0KCSAgICB9Cgl9CgllbHNlCgl7CgkgICAgRlRfVUludCBnaW5kZXg7CgkgIAoJICAgIG1heCA9IGZjRm9udERlY29kZXJzW29dLm1heDsKCSAgICAvKgoJICAgICAqIEZpbmQgdGhlIGZpcnN0IGVuY29kZWQgY2hhcmFjdGVyIGluIHRoZSBmb250CgkgICAgICovCgkgICAgaWYgKEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCAwKSkKCSAgICB7CgkJdWNzNCA9IDA7CgkJZ2luZGV4ID0gMTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgMCwgJmdpbmRleCk7CgkJaWYgKCF1Y3M0KQoJCSAgICBnaW5kZXggPSAwOwoJICAgIH0KCgkgICAgd2hpbGUgKGdpbmRleCkKCSAgICB7CgkJcGFnZSA9IHVjczQgPj4gODsKCQlsZWFmID0gMDsKCQl3aGlsZSAoKHVjczQgPj4gOCkgPT0gcGFnZSkKCQl7CgkJICAgIGdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIHVjczQpOwoJCSAgICBpZiAoZ2x5cGggJiYgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIAoJCQkJCQkgICAgICAgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCSAgICB7CgkJCWlmICghaGFzX2FkdmFuY2UpCgkJCXsKCQkJICAgIGhhc19hZHZhbmNlID0gRmNUcnVlOwoJCQkgICAgYWR2YW5jZV9vbmUgPSBhZHZhbmNlOwoJCQl9CgkJICAgICAgICBlbHNlIGlmICghQVBQUk9YSU1BVEVMWV9FUVVBTCAoYWR2YW5jZSwgYWR2YW5jZV9vbmUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRfYWR2YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY1RydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZV90d28gPSBhZHZhbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2VfdHdvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY0ZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoJCQlpZiAoIWxlYWYpCgkJCXsKCQkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKCQkJICAgIGlmICghbGVhZikKCQkJCWdvdG8gYmFpbDE7CgkJCX0KCQkJb2ZmID0gdWNzNCAmIDB4ZmY7CgkJCWxlYWYtPm1hcFtvZmYgPj4gNV0gfD0gKDEgPDwgKG9mZiAmIDB4MWYpKTsKI2lmZGVmIENIRUNLCgkJCWlmICh1Y3M0ID4gZm9udF9tYXgpCgkJCSAgICBmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCSAgICB9CgkJICAgIHVjczQrKzsKCQl9CgkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIHVjczQgLSAxLCAmZ2luZGV4KTsKCQlpZiAoIXVjczQpCgkJICAgIGdpbmRleCA9IDA7CgkgICAgfQojaWZkZWYgQ0hFQ0sKCSAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDwgMHgxMDAwMDsgdWNzNCsrKQoJICAgIHsKCQlGY0Jvb2wJICAgIEZUX0hhcywgRkNfSGFzOwoKCQlGVF9IYXMgPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgdWNzNCkgIT0gMDsKCQlGQ19IYXMgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoJCWlmIChGVF9IYXMgIT0gRkNfSGFzKQoJCXsKCQkgICAgcHJpbnRmICgiMHglMDh4IEZUIHNheXMgJWQgRkMgc2F5cyAlZFxuIiwgdWNzNCwgRlRfSGFzLCBGQ19IYXMpOwoJCX0KCSAgICB9CiNlbmRpZgoJfQogICAgfQojaWYgSEFWRV9GVF9IQVNfUFNfR0xZUEhfTkFNRVMKICAgIC8qCiAgICAgKiBBZGQgbWFwcGluZyBmcm9tIFBTIGdseXBoIG5hbWVzIGlmIGF2YWlsYWJsZQogICAgICovCiAgICBpZiAoRmNGcmVlVHlwZVVzZU5hbWVzIChmYWNlKSkKICAgIHsKCUZjQ2hhcjggbmFtZV9idWZbRkNfR0xZUEhOQU1FX01BWExFTiArIDJdOwoKCWZvciAoZ2x5cGggPSAwOyBnbHlwaCA8IGZhY2UtPm51bV9nbHlwaHM7IGdseXBoKyspCgl7CgkgICAgaWYgKEZUX0dldF9HbHlwaF9OYW1lIChmYWNlLCBnbHlwaCwgbmFtZV9idWYsIEZDX0dMWVBITkFNRV9NQVhMRU4rMSkgPT0gMCkKCSAgICB7CgkJdWNzNCA9IEZjR2x5cGhOYW1lVG9VY3M0IChuYW1lX2J1Zik7CgkJaWYgKHVjczQgIT0gMHhmZmZmICYmIAoJCSAgICBGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCXsKCQkgICAgaWYgKCFoYXNfYWR2YW5jZSkKCQkgICAgewoJCQloYXNfYWR2YW5jZSA9IEZjVHJ1ZTsKCQkJYWR2YW5jZV9vbmUgPSBhZHZhbmNlOwoJCSAgICB9CgkJICAgIGVsc2UgaWYgKCFBUFBST1hJTUFURUxZX0VRVUFMIChhZHZhbmNlLCBhZHZhbmNlX29uZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRfYWR2YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbF9hZHZhbmNlID0gRmNUcnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlX3R3byA9IGFkdmFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2VfdHdvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1YWxfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQoJCSAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CgkJICAgIGlmICghbGVhZikKCQkJZ290byBiYWlsMTsKCQkgICAgbGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiNpZmRlZiBDSEVDSwoJCSAgICBpZiAodWNzNCA+IGZvbnRfbWF4KQoJCQlmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCX0KCSAgICB9Cgl9CiAgICB9CiNlbmRpZgojaWZkZWYgQ0hFQ0sKICAgIHByaW50ZiAoIiVkIGdseXBocyAlZCBlbmNvZGVkXG4iLCAoaW50KSBmYWNlLT5udW1fZ2x5cGhzLCBGY0NoYXJTZXRDb3VudCAoZmNzKSk7CiAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDw9IGZvbnRfbWF4OyB1Y3M0KyspCiAgICB7CglGY0Jvb2wJaGFzX2NoYXIgPSAoZ2x5cGggPSBGY0ZyZWVUeXBlQ2hhckluZGV4IChmYWNlLCB1Y3M0KSkgIT0gMDsKCUZjQm9vbAloYXNfYml0ID0gRmNDaGFyU2V0SGFzQ2hhciAoZmNzLCB1Y3M0KTsKCglpZiAoaGFzX2NoYXIgJiYgIWhhc19iaXQpCgl7CgkgICAgaWYgKCFGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCXByaW50ZiAoIkJpdG1hcCBtaXNzaW5nIGJyb2tlbiBjaGFyIDB4JXhcbiIsIHVjczQpOwoJICAgIGVsc2UKCQlwcmludGYgKCJCaXRtYXAgbWlzc2luZyBjaGFyIDB4JXhcbiIsIHVjczQpOwoJfQoJZWxzZSBpZiAoIWhhc19jaGFyICYmIGhhc19iaXQpCgkgICAgcHJpbnRmICgiQml0bWFwIGV4dHJhIGNoYXIgMHgleFxuIiwgdWNzNCk7CiAgICB9CiNlbmRpZgogICAgaWYgKGZpeGVkX2FkdmFuY2UpCgkqc3BhY2luZyA9IEZDX01PTk87CiAgICBlbHNlIGlmIChkdWFsX2FkdmFuY2UgJiYgQVBQUk9YSU1BVEVMWV9FUVVBTCAoMiAqIE1JTiAoYWR2YW5jZV9vbmUsIGFkdmFuY2VfdHdvKSwgTUFYIChhZHZhbmNlX29uZSwgYWR2YW5jZV90d28pKSkKICAgICAgICAqc3BhY2luZyA9IEZDX0RVQUw7CiAgICBlbHNlCgkqc3BhY2luZyA9IEZDX1BST1BPUlRJT05BTDsKICAgIHJldHVybiBmY3M7CmJhaWwxOgogICAgRmNDaGFyU2V0RGVzdHJveSAoZmNzKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKRmNDaGFyU2V0ICoKRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykKewogICAgaW50IHNwYWNpbmc7CgogICAgcmV0dXJuIEZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoZmFjZSwgYmxhbmtzLCAmc3BhY2luZyk7Cn0K