LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6dHJhY2VSb3V0ZUN0bFRhYmxlLmMKICpGaWxlIERlc2NyaXB0aW9uOlJvd3Mgb2YgdHJhY2VSb3V0ZUN0bFRhYmxlIE1JQiBhZGQgZGVsZXRlIGFucyByZWFkLgogKiAgICAgICAgICAgICAgUm93cyBvZiB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZUhvcHNUYWJsZSBNSUIgYWRkIGFuZCBkZWxldGUuCiAqICAgICAgICAgICAgICBUaGUgbWFpbiBmdW5jdGlvbiBpcyBhbHNvIGhlcmUuCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUgInRyYWNlUm91dGVDdGxUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlLmgiCiNpbmNsdWRlICJ0cmFjZVJvdXRlSG9wc1RhYmxlLmgiCiNpbmNsdWRlICJoZWFkZXJfY29tcGxleC5oIgoKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkW10gPQogICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgMiB9OwoKLyogdHJhcCAqLwpvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZVBhdGhDaGFuZ2VbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgODEsIDAsIDEgfTsKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVUZXN0RmFpbGVkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAwLCAyIH07Cm9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMCwgMyB9OwoKc3RydWN0IHZhcmlhYmxlMiB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzW10gPSB7CiAgICAvKgogICAgICogbWFnaWMgbnVtYmVyICAgICAgICAsIHZhcmlhYmxlIHR5cGUgLCByby9ydyAsIGNhbGxiYWNrIGZuICAsIEwsIG9pZHN1ZmZpeCAKICAgICAqLwoKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1NUWVBFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTLCAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgNH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMQllQQVNTUk9VVEVUQUJMRSwgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERBVEFTSVpFLCAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRJTUVPVVQsICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDd9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFBST0JFU1BFUkhPUCwgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDh9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFBPUlQsICAgICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDl9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFRUTCwgICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDEwfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExEU0ZJRUxELCAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDEyfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTLCAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTN9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTElGSU5ERVgsICAgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNSVNDT1BUSU9OUywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxNX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYRkFJTFVSRVMsICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERPTlRGUkFHTUVOVCwgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE3fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExJTklUSUFMVFRMLCAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxOH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMRlJFUVVFTkNZLCAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTl9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFNUT1JBR0VUWVBFLCAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIwfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExBRE1JTlNUQVRVUywgICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyMX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMREVTQ1IsICAgICAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjJ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFJPV1MsICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUUkFQR0VORVJBVElPTiwgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjR9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTENSRUFURUhPUFNFTlRSSUVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyNX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMVFlQRSwgICAgICAgIEFTTl9PQkpFQ1RfSUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFJPV1NUQVRVUywgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI3fX0KCn07CgovKgogKiBnbG9iYWwgc3RvcmFnZSBvZiBvdXIgZGF0YSwgc2F2ZWQgaW4gYW5kIGNvbmZpZ3VyZWQgYnkgaGVhZGVyX2NvbXBsZXgoKSAKICovCgpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSA9IE5VTEw7CgppbnQKdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKTsKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSk7Cgp2b2lkCmluaXRfdHJhY2VSb3V0ZUN0bFRhYmxlKHZvaWQpCnsKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiaW5pdGlhbGl6aW5nLi4uICAiKSk7CiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidHJhY2VSb3V0ZUN0bFRhYmxlIiwgdHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlcywKICAgICAgICAgICAgICAgICB2YXJpYWJsZTIsIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3VyIGNvbmZpZyBoYW5kbGVyKHMpIHRvIGRlYWwgd2l0aCByZWdpc3RyYXRpb25zIAogICAgICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3RyYWNlUm91dGVDdGxUYWJsZSwgTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgdG8gc3RvcmUgb3VyIGRhdGEgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3RyYWNlUm91dGVDdGxUYWJsZSwgTlVMTCk7CgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJkb25lLlxuIikpOwp9CgoKdm9pZAppbml0X3RyUmVzdWx0c1RhYmxlKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqaXRlbSkKewogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKmhvc3QgPSBOVUxMOwoKICAgIGhvc3QgPQogICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKSk7CgogICAgaWYgKGhvc3QgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiaG9zdCBjYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBtZW1zZXQoaG9zdCwgJ1wwJywKCSAgIHNpemVvZihjaGFyKSAqIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpKTsKICAgIHN0cmNweShob3N0LCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICBob3N0W2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgU3RvcmFnZVRtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEpOwogICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiU3RvcmFnZVRtcCBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqCiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVDdGxPd25lckluZGV4IG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAnXDAnOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqCiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKSk7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZUN0bFRlc3ROYW1lIG1hbGxvYyAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXSA9CiAgICAgICAgJ1wwJzsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9IGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSAxOwoKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMQogICAgICAgIHx8IGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxNikgewogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZXRvOyAgICAgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqdG8gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZXRvOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0aW5mbyAqaGkgPSBOVUxMOwogICAgICAgIGhpID0gZ2V0aG9zdGluZm8oaG9zdCk7CiAgICAgICAgaWYgKGhpID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJoaSBjYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgc2V0c2luKHRvLCBoaS0+YWRkcnNbMF0pOwogICAgICAgIGlmIChpbmV0X250b2EodG8tPnNpbl9hZGRyKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDA7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDE7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0KICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpICsgMSkpOwogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsCiAgICAgICAgICAgICAgICAgICBpbmV0X250b2EodG8tPnNpbl9hZGRyKSwKICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b2EodG8tPnNpbl9hZGRyKSkgKyAxKTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpXQogICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkckxlbiA9CiAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMikgewoKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdoZXJldG87ICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp0byA9CiAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZ3aGVyZXRvOwogICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICAgICAgLyogc3RydWN0IGhvc3RlbnYgaHA7ICovCiAgICAgICAgY2hhciAgICAgICAgICAgIHBhWzY0XTsKICAgICAgICBtZW1zZXQocGEsICdcMCcsIDY0KTsKCiAgICAgICAgdG8tPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgdG8tPnNpbjZfcG9ydCA9IGh0b25zKDMzNDM0KTsKCiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdCwgJnRvLT5zaW42X2FkZHIpID4gMCkgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAyOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogKHN0cmxlbihob3N0KSArIDEpKTsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyIG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZW1zZXQoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsICdcMCcsCiAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwgaG9zdCwKICAgICAgICAgICAgICAgICAgIHN0cmxlbihob3N0KSArIDEpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaG9zdCldID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSBzdHJsZW4oaG9zdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lMihob3N0LCBBRl9JTkVUNik7CiAgICAgICAgICAgIGlmIChocCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqaG9zdG5hbWU7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDI7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdG5hbWUpICsgMSkpOwogICAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1zZXQoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsICdcMCcsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcikgKiAoc3RybGVuKGhvc3QpICsgMSkpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyLCBob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaG9zdG5hbWUpICsgMSk7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaG9zdG5hbWUpXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaG9zdG5hbWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogdW5rbm93biBob3N0ICVzXG4iLCBob3N0KSk7CgogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMDsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0N1ckhvcENvdW50ID0gMDsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9IDA7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9IDA7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPSAwOwoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuID0gMDsKCiAgICBpdGVtLT50cmFjZVJvdXRlUmVzdWx0cyA9IFN0b3JhZ2VUbXA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgIGlmICgoaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKSkgIT0gTlVMTCkgewogICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKGl0ZW0pOwogICAgfQogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUmVzdWx0cyAhPSBOVUxMKSB7CiAgICAgICAgaWYgKHRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbml0IGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgfQogICAgfQoKfQoKCgppbnQKbW9kaWZ5X3RyUmVzdWx0c09wZXIoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhLCBsb25nIHZhbCkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycykpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKICAgIH0gZWxzZSB7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gdmFsOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMiLCAiZG9uZS5cbiIpKTsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfQp9CgoKc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICoKY3JlYXRlX3RyYWNlUm91dGVDdGxUYWJsZV9kYXRhKHZvaWQpCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZU5ldyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3ID0gU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpIHsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID0gMTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gMjsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGltZU91dCA9IDM7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gMzsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxQb3J0ID0gMzM0MzQ7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gMzA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUgPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSA1OwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCA9IDI7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9IDE7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID0gMjsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oIjAwIikgKyAxKTsKICAgIGlmIChTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3IgPT0gTlVMTCkgewogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyLCAiMDAiLCBzdHJsZW4oIjAwIikgKyAxKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjcltzdHJsZW4oIjAwIildID0gJ1wwJzsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9CiAgICAgICAgc3RybGVuKFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjcik7CgogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSA1MDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzID0gMjsKCiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHlwZSA9IGNhbGxvYygxLCBzaXplb2Yob2lkKSAqIHNpemVvZigyKSk7IC8qIDAuMCAqLwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSAyOwoKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVSZXN1bHRzID0gTlVMTDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVQcm9iZUhpcyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlSG9wcyA9IE5VTEw7CgogICAgU3RvcmFnZU5ldy0+c3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIC8qIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleD0wOyAqLwogICAgcmV0dXJuIFN0b3JhZ2VOZXc7Cn0KCgovKgogKiB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKCk6IGFkZHMgYSBzdHJ1Y3R1cmUgbm9kZSB0byBvdXIgZGF0YSBzZXQgCiAqLwppbnQKdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgIC8qCiAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgKi8KCgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3BlcmF0aW9uTmFtZSAqLwoKICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgdmFycywgdGhlZGF0YSkKICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfSBlbHNlIHsKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJyZWdpc3RlcmVkIGFuIGVudHJ5XG4iKSk7CgoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgIH0KfQoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqcCA9IE5VTEw7CiAgICBwID0gdGhlZGF0YS0+dHJhY2VSb3V0ZVJlc3VsdHM7CiAgICBpZiAodGhlZGF0YS0+dHJhY2VSb3V0ZVJlc3VsdHMgIT0gTlVMTCkgewogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAvKgogICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICovCgogICAgICAgIGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhKCZ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwogICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfSBlbHNlIHsKICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgImVycm9yLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQp9CgoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIGlmICh0aGVkYXRhICE9IE5VTEwpIHsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4KSk7ICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXgpKTsgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCAqLwoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgKCZ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsCiAgICAgICAgICAgICB0aGVkYXRhKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CgogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICB9Cn0KCmludAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpwID0gTlVMTDsKICAgIHAgPSB0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXM7CiAgICBpZiAodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpCiAgICAgICAgZG8gewogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgsIHNpemVvZihwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgpKTsgICAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4KSk7ICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggKi8KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwKICAgICAgICAgICAgICAgICBwKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0ZW1wID0gTlVMTDsKICAgICAgICAgICAgICAgIHRlbXAgPSB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOwogICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEsdmFyc19vaWQ9IikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR09JRCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPm5hbWUsIHRlbXAtPm5hbWVsZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gTlVMTCk7CgogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsKICAgIGVsc2UgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQoKfQoKCgppbnQKdHJhY2VSb3V0ZUhvcHNUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwoKICAgIGlmICh0aGVkYXRhICE9IE5VTEwpIHsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgpKTsgICAgICAgLyogdHJhY2VSb3V0ZUhvcHNIb3BJbmRleCAqLwoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgIC8qCiAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgdGhlZGF0YSkgPT0gTlVMTCkgewogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7Cn0KCmludAp0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZGFsbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgdmFyc19saXN0ID0gTlVMTDsKICAgIHAgPSB0aGVkYXRhLT50cmFjZVJvdXRlSG9wczsKICAgIGlmICh0aGVkYXRhLT50cmFjZVJvdXRlSG9wcyAhPSBOVUxMKSB7CiAgICAgICAgZG8gewogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4LCBzaXplb2YocC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlSG9wc0hvcEluZGV4ICovCgogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgcCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGVtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICB0ZW1wID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEsdmFyc19vaWQ9IikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR09JRCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPm5hbWUsIHRlbXAtPm5hbWVsZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKCiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KCn0KCgp1bnNpZ25lZCBsb25nCnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgdmFycyA9IE5VTEw7CiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKCgp1bnNpZ25lZCBsb25nCnRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CiAgICB1bnNpZ25lZCBsb25nICAgY291bnQgPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgdmFycyA9IE5VTEw7CiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCgoKdm9pZAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaWxhc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKICAgIHRpbWVfdCAgICAgICAgICBsYXN0X3RpbWUgPSAyMTQ3NDgzNjQ3OwogICAgdGltZV90ICAgICAgICAgIHRwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaWxhc3QgPSBoY2lwdHIyID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsKICAgICAgICAgaGNpcHRyMiAhPSBOVUxMOyBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewoKICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXRfZnJvbV9vaWQKICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgIGhjaXB0cjItPm5hbWVsZW4pOwogICAgICAgICAgICB0cCA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lX3RpbWU7CgogICAgICAgICAgICBpZiAobGFzdF90aW1lID4gdHApIHsKICAgICAgICAgICAgICAgIGxhc3RfdGltZSA9IHRwOwogICAgICAgICAgICAgICAgaGNpbGFzdCA9IGhjaXB0cjI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfQogICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgaGNpbGFzdCk7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICJkZWxldGUgdGhlIGxhc3Qgb25lIHN1Y2Nlc3MhXG4iKSk7CiAgICB2YXJzID0gTlVMTDsKfQoKCgp2b2lkCnRyYWNlUm91dGVDdGxUYWJsZV9jbGVhbmVyKHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGhlc3R1ZmYpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImNsZWFuZXJvdXQgICIpKTsKICAgIGZvciAoaGNpcHRyID0gdGhlc3R1ZmY7IGhjaXB0ciAhPSBOVUxMOyBoY2lwdHIgPSBoY2lwdHItPm5leHQpIHsKICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIpOwogICAgICAgIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiY2xlYW5lciAgIikpOwogICAgfQp9CgoKLyoKICogcGFyc2VfbXRlT2JqZWN0c1RhYmxlKCk6CiAqICAgcGFyc2VzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwp2b2lkCnBhcnNlX3RyYWNlUm91dGVDdGxUYWJsZShjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgc2l6ZV90ICAgICAgICAgIHRtcGludDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9CiAgICAgICAgU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhKTsKCiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgInBhcnNpbmcgY29uZmlnLi4uICAiKSk7CgoKICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtYWxsb2MgZmFpbHVyZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUZXN0TmFtZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUcmFwRGVzY3IiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09CSkVDVF9JRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUeXBlIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VUbXApOwogICAgLyogICAgIHRyYWNlUm91dGVDdGxUYWJsZV9jbGVhbmVyKHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UpOyAqLwoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKfQoKCgovKgogKiBzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUoKToKICogICBzdG9yZXMgLmNvbmYgZmlsZSBlbnRyaWVzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIG1pYi4KICovCmludApzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIGNoYXIgICAgICAgICAgICBsaW5lW1NOTVBfTUFYQlVGXTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2luZGV4ID0gTlVMTDsKCgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJzdG9yaW5nIGRhdGEuLi4gICIpKTsKCgogICAgZm9yIChoY2luZGV4ID0gdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZTsgaGNpbmRleCAhPSBOVUxMOwogICAgICAgICBoY2luZGV4ID0gaGNpbmRleC0+bmV4dCkgewogICAgICAgIFN0b3JhZ2VUbXAgPSAoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICopIGhjaW5kZXgtPmRhdGE7CgogICAgICAgIGlmIChTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSAhPSBTVF9SRUFET05MWSkgewogICAgICAgICAgICBtZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKICAgICAgICAgICAgc3RyY2F0KGxpbmUsICJ0cmFjZVJvdXRlQ3RsVGFibGUgIik7CiAgICAgICAgICAgIGNwdHIgPSBsaW5lICsgc3RybGVuKGxpbmUpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxBZG1pblN0YXR1cywgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09CSkVDVF9JRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKCgogICAgICAgICAgICBzbm1wZF9zdG9yZV9jb25maWcobGluZSk7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJkb25lLlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCgoKLyoKICogdmFyX3RyYWNlUm91dGVDdGxUYWJsZSgpOgogKiAgIEhhbmRsZSB0aGlzIHRhYmxlIHNlcGFyYXRlbHkgZnJvbSB0aGUgc2NhbGFyIHZhbHVlIGNhc2UuCiAqICAgVGhlIHdvcmtpbmdzIG9mIHRoaXMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmb3IgdmFyX210ZU9iamVjdHNUYWJsZSBhYm92ZS4KICovCnVuc2lnbmVkIGNoYXIgICoKdmFyX3RyYWNlUm91dGVDdGxUYWJsZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CgogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICAvKgogICAgICogdGhpcyBhc3N1bWVzIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYWxsIHlvdXIgZGF0YSBwcm9wZXJseQogICAgICovCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCB2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSkgPT0gTlVMTCkgewogICAgICAgIGlmICh2cC0+bWFnaWMgPT0gQ09MVU1OX1RSQUNFUk9VVEVDVExST1dTVEFUVVMpCiAgICAgICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwoKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKgogICAgICogdGhpcyBpcyB3aGVyZSB3ZSBkbyB0aGUgdmFsdWUgYXNzaWdubWVudHMgZm9yIHRoZSBtaWIgcmVzdWx0cy4KICAgICAqLwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKCgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1NUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3M7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTEJZUEFTU1JPVVRFVEFCTEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMREFUQVNJWkU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMVElNRU9VVDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFRpbWVPdXQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExQUk9CRVNQRVJIT1A6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3A7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUE9SVDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFBvcnQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhUVEw6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhUdGw7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRFNGSUVMRDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bERTRmllbGQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExJRklOREVYOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsSWZJbmRleDsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXg7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTE1JU0NPUFRJT05TOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnM7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhGQUlMVVJFUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExET05URlJBR01FTlQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMSU5JVElBTFRUTDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExGUkVRVUVOQ1k6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxGcmVxdWVuY3k7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU1RPUkFHRVRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMQURNSU5TVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMREVTQ1I6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEZXNjcjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3I7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFJPV1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93czsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMVFJBUEdFTkVSQVRJT046CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTENSRUFURUhPUFNFTlRSSUVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXM7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXM7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUeXBlOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKSAqIHNpemVvZihvaWQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUk9XU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXM7CgogICAgZGVmYXVsdDoKICAgICAgICBFUlJPUl9NU0coIiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIG1lbXNldChuZXdvaWQsICdcMCcsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCgoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW4gPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlbGV0ZSAgc3VjY2VzcyFcbiIpKTsKCiAgICAgICAgfQogICAgfQogICAgdmFycyA9IE5VTEw7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnRyYWNlUm91dGVIb3BzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIG1lbXNldChuZXdvaWQsICdcMCcsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwoKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwgaGNpcHRyMik7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImRlbGV0ZSAgc3VjY2VzcyFcbiIpKTsKCiAgICAgICAgfQogICAgfQogICAgdmFycyA9IE5VTEw7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiBzZW5kIHRyYXAgCiAqLwoKdm9pZApzZW5kX3RyYWNlUm91dGVfdHJhcChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0sCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIHRyYXBfb2lkLCBzaXplX3QgdHJhcF9vaWRfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAgb2JqaWRfc25tcHRyYXBbXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMSwgMSwgNCwgMSwgMCB9OyAgICAgLyogc25tcFRyYXBJT0QuMCAqLwogICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqU3RvcmFnZUhvcHMgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJfbGlzdCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJfaG9wcyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBvaWQgICAgICAgICAgICAgaW5kZXhvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIGluZGV4b2lkX2xlbiA9IDA7CgogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHI7CiAgICBvaWQgICAgICAgICAgICAgdGVtcG9pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgdGVtcG9pZF9sZW4gPSAwOwoKICAgIG9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1tdID0KICAgICAgICB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAxLCAyLCAxLCA0IH07CiAgICBvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRnQWRkcmVzc1tdID0KICAgICAgICB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAxLCA1LCAxLCAzIH07CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIC8qCiAgICAgKiBzbm1wVHJhcCBvaWQgCiAgICAgKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcl9saXN0LCBvYmppZF9zbm1wdHJhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9iamlkX3NubXB0cmFwKSAvIHNpemVvZihvaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0JKRUNUX0lELCAodV9jaGFyICopIHRyYXBfb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFwX29pZF9sZW4gKiBzaXplb2Yob2lkKSk7CgogICAgLyoKICAgICAqIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcykgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgZm9yIChoY2lwdHIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0ciA9IGhjaXB0ci0+bmV4dCkgewoJbWVtc2V0KGluZGV4b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQoaW5kZXhvaWQsICZpbmRleG9pZF9sZW4sIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMpOwogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgIChpbmRleG9pZCwgaW5kZXhvaWRfbGVuLCBoY2lwdHItPm5hbWUsIGluZGV4b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICBTdG9yYWdlSG9wcyA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqKQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0X2Zyb21fb2lkKHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0ci0+bmFtZSwgaGNpcHRyLT5uYW1lbGVuKTsKICAgICAgICAgICAgbWVtc2V0KHRlbXBvaWQsICdcMCcsIE1BWF9PSURfTEVOICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQodGVtcG9pZCwgJnRlbXBvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRnQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlSG9wc0lwVGdBZGRyZXNzKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSwgdmFycyk7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcl9ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZTdG9yYWdlSG9wcy0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCwgc2l6ZW9mKFN0b3JhZ2VIb3BzLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4KSk7ICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgICAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIHRlbXBvaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb2lkX2xlbiwgdmFyX2hvcHMpOwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLCBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBTdG9yYWdlSG9wcy0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUhvcHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuKTsKCiAgICAgICAgICAgIHZhcl9ob3BzID0gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFhYWDogc3R1ZmYgYmFzZWQgb24gZXZlbnQgdGFibGUgCiAgICAgKi8KCiAgICBERUJVR01TRygoInBpbmdUZXN0OnNlbmRfdHJhY2VSb3V0ZV90cmFwIiwgInN1Y2Nlc3MhXG4iKSk7CgogICAgc2VuZF92MnRyYXAodmFyX2xpc3QpOwogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcl9saXN0KTsKICAgIHZhcl9saXN0ID0gTlVMTDsKfQoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cgp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERhdGFTaXplKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemU7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSA2NTUwNykKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IDU2OwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxUaW1lT3V0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0OwoKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDYwKQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9IDM7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxMCkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gMzsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUG9ydChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1heFR0bChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGw7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAyNTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9IDMwOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERTRmllbGQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bElmSW5kZXgoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXg7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMCAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSAxOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsTWF4Um93cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50OwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAyNTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gMTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRnJlcXVlbmN5KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBpbnQgICAgICAgICAgICAgc2V0X3ZhbHVlOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKCiAgICBzZXRfdmFsdWUgPSAqKChsb25nICopIHZhcl92YWwpOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQoKICAgICAgICBpZiAoKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9PSAyCiAgICAgICAgICAgICB8fCBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPT0gMykKICAgICAgICAgICAgJiYgKHNldF92YWx1ZSA9PSA0IHx8IHNldF92YWx1ZSA9PSA1KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxBZG1pblN0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxJZkluZGV4IG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCgogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIFN0b3JhZ2VOZXcgPQogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnMpOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID09IDEKICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGluaXRfdHJSZXN1bHRzVGFibGUoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHMtPgogICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICBtb2RpZnlfdHJSZXN1bHRzT3BlcihTdG9yYWdlVG1wLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSAhPSAwKQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwgcnVuX3RyYWNlUm91dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPSBzbm1wX2FsYXJtX3JlZ2lzdGVyKDEsIDAsIHJ1bl90cmFjZVJvdXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwoKICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9PSAyCiAgICAgICAgICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICBzbm1wX2FsYXJtX3VucmVnaXN0ZXIoU3RvcmFnZVRtcC0+dGltZXJfaWQpOwogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyA9PSBOVUxMKQogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gMjsKICAgICAgICAgICAgICAgIG1vZGlmeV90clJlc3VsdHNPcGVyKFN0b3JhZ2VUbXAsIDIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRGVzY3IoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3I7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuOwoKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPSAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRFNGaWVsZCBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERTRmllbGQgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUeXBlIG5vdCBBU05fT0JKRUNUX0lEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGU7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID0gKG9pZCAqKSBtYWxsb2ModmFyX3ZhbF9sZW4pOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuID0gdmFyX3ZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzdGF0aWMgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkX3ZhbHVlOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0YXRpYyBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIgPSBOVUxMOwoKICAgIFN0b3JhZ2VUbXAgPQogICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsIE5VTEwpOwoKICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIgfHwgdmFyX3ZhbCA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzZXRfdmFsdWUgPSAqKChsb25nICopIHZhcl92YWwpOwoKCiAgICAvKgogICAgICogY2hlY2sgbGVnYWwgcmFuZ2UsIGFuZCBub3RSZWFkeSBpcyByZXNlcnZlZCBmb3IgdXMsIG5vdCBhIHVzZXIgCiAgICAgKi8KICAgIGlmIChzZXRfdmFsdWUgPCAxIHx8IHNldF92YWx1ZSA+IDYgfHwgc2V0X3ZhbHVlID09IFJTX05PVFJFQURZKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKCgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgLyoKICAgICAgICAgKiBzdGFnZSBvbmU6IHRlc3QgdmFsaWRpdHkgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGUgdGhlIHJvdyBub3c/IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRpdGNoIGlsbGVnYWwgdmFsdWVzIG5vdyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3lpbmcgYSBub24tZXhpc3RlbnQgcm93IGlzIGFjdHVhbGx5IGxlZ2FsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpbGxlZ2FsIGNyZWF0aW9uIHZhbHVlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBleGlzdHMuICBDaGVjayBmb3IgYSB2YWxpZCBzdGF0ZSBjaGFuZ2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0NSRUFURUFOREdPCiAgICAgICAgICAgICAgICB8fCBzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGNhbid0IGNyZWF0ZSBhIHJvdyB0aGF0IGV4aXN0cyAKICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBpbnRlcmFjdGlvbiB3aXRoIHJvdyBzdG9yYWdlIHR5cGUgbmVlZGVkIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSAmJgogICAgICAgICAgICAgICAgc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAiT25jZSBtYWRlIGFjdGl2ZSBhbiBlbnRyeSBtYXkgbm90IGJlIG1vZGlmaWVkIGV4Y2VwdCB0byAKICAgICAgICAgICAgICAgICAqIGRlbGV0ZSBpdC4iICBYWFg6IGRvZXNuJ3QgdGhpcyBpbiBmYWN0IGFwcGx5IHRvIEFMTAogICAgICAgICAgICAgICAgICogY29sdW1ucyBvZiB0aGUgdGFibGUgYW5kIG5vdCBqdXN0IHRoaXMgb25lPyAgCiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlICE9IFNUX05PTlZPTEFUSUxFKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewoKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGlvbiAKICAgICAgICAgICAgICovCgoKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCBOVUxMLCAwKTsgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X3BhcnNlX29pZAogICAgICAgICAgICAgICAgKCYKICAgICAgICAgICAgICAgICAobmFtZQogICAgICAgICAgICAgICAgICBbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgIDJdKSwgbmV3bGVuLCB2YXJzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTdG9yYWdlTmV3ID0gY3JlYXRlX3RyYWNlUm91dGVDdGxUYWJsZV9kYXRhKCk7CiAgICAgICAgICAgIGlmICh2YXJzLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHZhcnMtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4W3ZhcnMtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0gdmFycy0+dmFsX2xlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCAzMik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFszMl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPSAzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFycyA9IHZhcnMtPm5leHRfdmFyaWFibGU7CgogICAgICAgICAgICBpZiAodmFycy0+dmFsX2xlbiA8PSAzMikgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICBtYWxsb2ModmFycy0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdmFycy0+dmFsLnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZVt2YXJzLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSB2YXJzLT52YWxfbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHZhcnMtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgMzIpOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lWzMyXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSAzMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXJzID0gdmFycy0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IHNldF92YWx1ZTsKCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycywgbm8gbG9uZ2VyIG5lZWRlZD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgKi8KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIHNldF92YWx1ZSBmb3IgeW91IHRvCiAgICAgICAgICogdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbgogICAgICAgICAqIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCgogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIGFkZCBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ICE9IE5VTEwpIHsKI2lmIDEKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMgZW50ZXJpbmcgbmV3PSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pKTsKI2VuZGlmCiAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VOZXcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGFjaywgYW5kIGlmIGl0IGlzIE5VTEw/IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB0aGUgZmxhZz8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbGRfdmFsdWUgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkZXN0cm95Li4uICBleHRyYWN0IGl0IGZvciBub3cgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgc25tcF9hbGFybV91bnJlZ2lzdGVyKFN0b3JhZ2VEZWwtPnRpbWVyX2lkKTsKCiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBjcmVhdGlvbiwgc28gcmVtb3ZlIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmcmVlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgZGVsZXRpb24sIHNvIGFkZCBpdCBhZ2FpbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZGFsbChTdG9yYWdlRGVsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gb2xkX3ZhbHVlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQsIGl0cyBkZWFkIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcAogICAgICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19DUkVBVEVBTkRHTykgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IFJTX0FDVElWRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlVG1wICYmCiAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PQogICAgICAgICAgICAgICAgICAgICAgIFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiNpZiAxCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBlbnRlcmluZyBydW5iZWZvcmU9JWxkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSkpOwoKI2VuZGlmCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ICE9IDApCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3RyYWNlUm91dGUsIFN0b3JhZ2VUbXApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCnZvaWQKcnVuX3RyYWNlUm91dGUodW5zaWduZWQgaW50IGNsaWVudHJlZywgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0gPSBjbGllbnRhcmc7CiAgICB1X3Nob3J0ICAgICAgICAgcG9ydCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxQb3J0OyAgICAgLyogc3RhcnQgdWRwIGRlc3QgcG9ydCAjIGZvciBwcm9iZSBwYWNrZXRzIM/gtbHT2mN0bHBvcnQgKi8KICAgIGludCAgICAgICAgICAgICB3YWl0dGltZSA9IGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0OyAgICAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpIM/gtcjT2mN0bHRpbWVvdXQgKi8KICAgIGludCAgICAgICAgICAgICBucHJvYmVzID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPiBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgImZpcnN0IHR0bCAoJWx1KSBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXggdHRsICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgY2hhciAgICAgICAgICAgKm9sZF9Ib3BzQWRkcmVzc1syNTVdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDEKICAgICAgICB8fCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMTYpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgY29kZSwgbjsKICAgICAgICBjb25zdCAgICBjaGFyICAqY3A7CiAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyOwogICAgICAgIHJlZ2lzdGVyIHVfY2hhciAqb3V0cDsKICAgICAgICByZWdpc3RlciB1X2ludDMyX3QgKmFwOwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZXRvOyAgICAgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZWZyb207ICAgICAgLyogV2hvIHdlIGFyZSAqLwoKICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb20gPQogICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZWZyb207CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICp0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJndoZXJldG87CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaTsKICAgICAgICBpbnQgICAgICAgICAgICAgb24gPSAxOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBwcm90b2VudCAqcGU7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHR0bCwgcHJvYmUsIGk7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHNlcSA9IDA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRvcyA9IDAsIHNldHRvcyA9IDA7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGxzcnIgPSAwOwogICAgICAgIHJlZ2lzdGVyIHVfc2hvcnQgb2ZmID0gMDsKICAgICAgICBzdHJ1Y3QgaWZhZGRybGlzdCAqYWw7CiAgICAgICAgY2hhciAgICAgICAgICAgIGVycmJ1ZlsxMzJdOwogICAgICAgIGludCAgICAgICAgICAgICBtaW5wYWNrZXQgPSAwOyAgLyogbWluIGlwIHBhY2tldCBzaXplICovCgoKICAgICAgICBzdHJ1Y3QgaXAgICAgICAqb3V0aXA7ICAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBzdHJ1Y3QgdWRwaGRyICAqb3V0dWRwOyAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgcGFja2xlbiA9IDA7ICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0bGVuID0gMDsgICAgIC8qIGxlbmd0aCBvZiBpcCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIG9wdGlvbnMgPSAwOyAgICAvKiBzb2NrZXQgb3B0aW9ucyAqLwogICAgICAgIGludCAgICAgICAgICAgICBzOyAgICAgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jazsgICAgICAgIC8qIHNlbmQgKHVkcC9pY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCgogICAgICAgIHVfc2hvcnQgICAgICAgICBpZGVudDsKICAgICAgICAvKgogICAgICAgICAqIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5IGxpc3QgKGluY2x1ZGluZyByb29tIGZvciBmaW5hbCBkZXN0aW5hdGlvbikgCiAgICAgICAgICovCiAgICAgICAgdV9pbnQzMl90ICAgICAgIGd3bGlzdFtOR0FURVdBWVMgKyAxXTsKICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZXZudWxsW10gPSAiL2Rldi9udWxsIjsKICAgICAgICBjaGFyICAgICAgICAgICAqZGV2aWNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqc291cmNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWU7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHBhdXNlbXNlY3MgPSAwOwogICAgICAgIHVfY2hhciAgICAgICAgICBwYWNrZXRbNTEyXTsgICAgLyogbGFzdCBpbmJvdW5kIChpY21wKSBwYWNrZXQgKi8KCiAgICAgICAgaW50ICAgICAgICAgICAgIHBtdHUgPSAwOyAgICAgICAvKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCgogICAgICAgIHN0cnVjdCBvdXRkYXRhICpvdXRkYXRhOyAgICAgICAgLyogbGFzdCBvdXRwdXQgKHVkcCkgcGFja2V0ICovCgogICAgICAgIG1pbnBhY2tldCA9IHNpemVvZigqb3V0aXApICsgc2l6ZW9mKCpvdXRkYXRhKSArIG9wdGxlbjsKICAgICAgICBtaW5wYWNrZXQgKz0gc2l6ZW9mKCpvdXR1ZHApOwogICAgICAgIHBhY2tsZW4gPSBtaW5wYWNrZXQ7ICAgIC8qIG1pbmltdW0gc2l6ZWQgcGFja2V0ICovCgogICAgICAgIGhvc3RuYW1lID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaWYgKGhvc3RuYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBtZW1jcHkoaG9zdG5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGhvc3RuYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgICAgIGhpID0gZ2V0aG9zdGluZm8oaG9zdG5hbWUpOwogICAgICAgIHNldHNpbih0bywgaGktPmFkZHJzWzBdKTsKICAgICAgICBpZiAoaGktPm4gPiAxKQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpKTsKICAgICAgICBob3N0bmFtZSA9IGhpLT5uYW1lOwogICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwoKCiAgICAgICAgbmV0c25tcF9zZXRfbGluZV9idWZmZXJpbmcoc3Rkb3V0KTsKCiAgICAgICAgb3V0aXAgPSAoc3RydWN0IGlwICopIG1hbGxvYyhwYWNrbGVuKTsKICAgICAgICBpZiAob3V0aXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1hbGxvYzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoKGNoYXIgKikgb3V0aXAsIDAsIHBhY2tsZW4pOwoKICAgICAgICBvdXRpcC0+aXBfdiA9IElQVkVSU0lPTjsKICAgICAgICBpZiAoc2V0dG9zKQogICAgICAgICAgICBvdXRpcC0+aXBfdG9zID0gdG9zOwojaWZkZWYgQllURVNXQVBfSVBfSERSCiAgICAgICAgb3V0aXAtPmlwX2xlbiA9IGh0b25zKHBhY2tsZW4pOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBodG9ucyhvZmYpOwojZWxzZQogICAgICAgIG91dGlwLT5pcF9sZW4gPSBwYWNrbGVuOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBvZmY7CiNlbmRpZgogICAgICAgIG91dHAgPSAodV9jaGFyICopIChvdXRpcCArIDEpOwojaWZkZWYgSEFWRV9SQVdfT1BUSU9OUwogICAgICAgIGlmIChsc3JyID4gMCkgewogICAgICAgICAgICByZWdpc3RlciB1X2NoYXIgKm9wdGxpc3Q7CgogICAgICAgICAgICBvcHRsaXN0ID0gb3V0cDsKICAgICAgICAgICAgb3V0cCArPSBvcHRsZW47CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmaW5hbCBob3AgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnd2xpc3RbbHNycl0gPSB0by0+c2luX2FkZHIuc19hZGRyOwoKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdC5zX2FkZHIgPSBnd2xpc3RbMF07CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFswXSA9IElQT1BUX05PUDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOwogICAgICAgICAgICBpID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOwogICAgICAgICAgICBvcHRsaXN0WzJdID0gaSArIDM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOwogICAgICAgICAgICBtZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCArIDEsIGkpOwogICAgICAgIH0gZWxzZQojZW5kaWYKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdCA9IHRvLT5zaW5fYWRkcjsKICAgICAgICBvdXRpcC0+aXBfaGwgPSAob3V0cCAtICh1X2NoYXIgKikgb3V0aXApID4+IDI7CiAgICAgICAgaWRlbnQgPSAoZ2V0cGlkKCkgJiAweGZmZmYpIHwgMHg4MDAwOwoKICAgICAgICBvdXRpcC0+aXBfcCA9IElQUFJPVE9fVURQOwoKICAgICAgICBvdXR1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSBvdXRwOwogICAgICAgIG91dHVkcC0+c291cmNlID0gaHRvbnMoaWRlbnQpOwogICAgICAgIG91dHVkcC0+bGVuID0KICAgICAgICAgICAgaHRvbnMoKHVfc2hvcnQpIChwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSkpOwogICAgICAgIG91dGRhdGEgPSAoc3RydWN0IG91dGRhdGEgKikgKG91dHVkcCArIDEpOwoKICAgICAgICBjcCA9ICJpY21wIjsKICAgICAgICBpZiAoKHBlID0gZ2V0cHJvdG9ieW5hbWUoY3ApKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCAlc1xuIiwgY3ApKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogSW5zdXJlIHRoZSBzb2NrZXQgZmRzIHdvbid0IGJlIDAsIDEgb3IgMiAKICAgICAgICAgKi8KICAgICAgICBpZiAob3BlbihkZXZudWxsLCBPX1JET05MWSkgPCAwIHx8CiAgICAgICAgICAgIG9wZW4oZGV2bnVsbCwgT19SRE9OTFkpIDwgMCB8fCBvcGVuKGRldm51bGwsIE9fUkRPTkxZKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIFwiJXNcIjogJXNcbiIsIGRldm51bGwsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAoKHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIHBlLT5wX3Byb3RvKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaWNtcCBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKI2lmbmRlZiBfX2hwdXgKICAgICAgICBwcmludGYoInJhd1xuIik7CiAgICAgICAgc25kc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOwojZWxzZQogICAgICAgIHByaW50ZigidWRwXG4iKTsKICAgICAgICBzbmRzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1VEUCk7CiNlbmRpZgogICAgICAgIGlmIChzbmRzb2NrIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJhdyBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNpZiBkZWZpbmVkKElQX09QVElPTlMpICYmICFkZWZpbmVkKEhBVkVfUkFXX09QVElPTlMpCiAgICAgICAgaWYgKGxzcnIgPiAwKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBvcHRsaXN0W01BWF9JUE9QVExFTl07CgogICAgICAgICAgICBjcCA9ICJpcCI7CiAgICAgICAgICAgIGlmICgocGUgPSBnZXRwcm90b2J5bmFtZShjcCkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgJXNcbiIsIGNwKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZpbmFsIGhvcCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGd3bGlzdFtsc3JyXSA9IHRvLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICsrbHNycjsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzBdID0gSVBPUFRfTk9QOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBsb29zZSBzb3VyY2Ugcm91dGUgb3B0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFsxXSA9IElQT1BUX0xTUlI7CiAgICAgICAgICAgIGkgPSBsc3JyICogc2l6ZW9mKGd3bGlzdFswXSk7CiAgICAgICAgICAgIG9wdGxpc3RbMl0gPSBpICsgMzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUG9pbnRlciB0byBMU1JSIGFkZHJlc3NlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbM10gPSBJUE9QVF9NSU5PRkY7CiAgICAgICAgICAgIG1lbWNweShvcHRsaXN0ICsgNCwgZ3dsaXN0LCBpKTsKCiAgICAgICAgICAgIGlmICgoc2V0c29ja29wdChzbmRzb2NrLCBwZS0+cF9wcm90bywgSVBfT1BUSU9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG9wdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgc2l6ZW9mKGd3bGlzdFswXSkpKSA8IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiSVBfT1BUSU9OUzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgU09fU05EQlVGCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSAmcGFja2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFja2xlbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlNPX1NOREJVRjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfSERSSU5DTCwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIklQX0hEUklOQ0w6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbHNlCiNpZmRlZiBJUF9UT1MKICAgICAgICBpZiAoc2V0dG9zICYmIHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVE9TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdG9zLCBzaXplb2YodG9zKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAic2V0c29ja29wdCB0b3MgJWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgojZW5kaWYKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIC8qCiAgICAgICAgICogR2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBsaXN0IAogICAgICAgICAqLwogICAgICAgIG4gPSBpZmFkZHJsaXN0KCZhbCwgZXJyYnVmKTsKICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgaWZhZGRybGlzdDogJXNcbiIsIGVycmJ1ZikpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgYW55IG5ldHdvcmsgaW50ZXJmYWNlc1xuIikpOwoKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTG9vayBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyAtLWksICsrYWwpCiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGRldmljZSwgYWwtPmRldmljZSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGkgPD0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgaW50ZXJmYWNlICUuMzJzXG4iLCBkZXZpY2UpKTsKCiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogRGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcyAKICAgICAgICAgKi8KICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgYSBkZXZpY2Ugd2FzIHNwZWNpZmllZCwgdXNlIHRoZSBpbnRlcmZhY2UgYWRkcmVzcy4KICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gZGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBhbC0+YWRkcik7CiAgICAgICAgICAgIGVsc2UgaWYgKChlcnIgPSBmaW5kc2FkZHIodG8sIGZyb20pKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmluZHNhZGRyOiAlc1xuIiwgZXJyKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhpID0gZ2V0aG9zdGluZm8oc291cmNlKTsKICAgICAgICAgICAgc291cmNlID0gaGktPm5hbWU7CiAgICAgICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIGRldmljZSB3YXMgc3BlY2lmaWVkIG1ha2Ugc3VyZSBpdAogICAgICAgICAgICAgKiBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGFkZHJlc3Mgc3BlY2lmaWVkLgogICAgICAgICAgICAgKiBPdGhlcndpc2UsIHVzZSB0aGUgZmlyc3QgYWRkcmVzcyAoYW5kIHdhcm4gaWYKICAgICAgICAgICAgICogdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBoaS0+biwgYXAgPSBoaS0+YWRkcnM7IGkgPiAwOyAtLWksICsrYXApCiAgICAgICAgICAgICAgICAgICAgaWYgKCphcCA9PSBhbC0+YWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAoaSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyBpcyBub3Qgb24gaW50ZXJmYWNlICUuMzJzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgZGV2aWNlKSk7CgogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgKmFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBoaS0+YWRkcnNbMF0pOwogICAgICAgICAgICAgICAgaWYgKGhpLT5uID4gMSkKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIFJldmVydCB0byBub24tcHJpdmlsZWdlZCB1c2VyIGFmdGVyIG9wZW5pbmcgc29ja2V0cyAKICAgICAgICAgKi8KICAgICAgICBzZXRnaWQoZ2V0Z2lkKCkpOwogICAgICAgIHNldHVpZChnZXR1aWQoKSk7CgogICAgICAgIG91dGlwLT5pcF9zcmMgPSBmcm9tLT5zaW5fYWRkcjsKI2lmbmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBmcm9tLCBzaXplb2YoKmZyb20pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiB0byAlcyAoJXMpIiwgaG9zdG5hbWUsIGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSk7CgogICAgICAgIGlmIChzb3VyY2UpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiIGZyb20gJXMiLCBzb3VyY2UpKTsKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCwgcGFja2xlbikpOwogICAgICAgICh2b2lkKSBmZmx1c2goc3RkZXJyKTsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVJlc3VsdHMgPSBOVUxMOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudF90ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgdW5zaWduZWQgbG9uZyAgIGluZGV4ID0gMDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0ZW1wX2hpcyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXBfaGlzID0gTlVMTDsKCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIGlmICgoU3RvcmFnZVJlc3VsdHMgPQogICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfcmVzdWx0cykpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX3Jlc3VsdHMpOwogICAgICAgIHZhcnNfcmVzdWx0cyA9IE5VTEw7CgoKICAgICAgICBmb3IgKHR0bCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgICAgICAgdHRsIDw9IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGw7ICsrdHRsKSB7CgogICAgICAgICAgICB1X2ludDMyX3QgICAgICAgbGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290bGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlbnRmaXJzdCA9IDA7CiAgICAgICAgICAgIHRpbWVfdCAgICAgICAgICB0aW1lcCA9IDA7CgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgICAgICAgICAgICAgIGNvdW50ID0gdHJhY2VSb3V0ZUhvcHNUYWJsZV9jb3VudChpdGVtKTsKCgogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHZhcnMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWR1cCgodV9jaGFyICoqKSAmIG9sZF9Ib3BzQWRkcmVzc1trXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCA9ICsraW5kZXg7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KCgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWluUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWF4UnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzQXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1NlbnRQcm9iZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNQcm9iZVJlc3BvbnNlcyA9IDA7CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuID0gMDsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVIb3BzID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1heFJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWluUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3BvbnNlUHJvYmUgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bU9mU3F1YXJlID0gMDsKICAgICAgICAgICAgZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGNjOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHQxLCB0MjsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXAgPSBOVUxMOwogICAgICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBSdHQgPSAwOwoKICAgICAgICAgICAgICAgIGlmIChzZW50Zmlyc3QgJiYgcGF1c2Vtc2VjcyA+IDApCiAgICAgICAgICAgICAgICAgICAgdXNsZWVwKHBhdXNlbXNlY3MgKiAxMDAwKTsKICAgICAgICAgICAgICAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOwogICAgICAgICAgICAgICAgc2VuZF9wcm9iZSh0bywgKytzZXEsIHR0bCwgJnQxLCBvdXRpcCwgb3V0dWRwLCBwYWNrbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRsZW4sIGhvc3RuYW1lLCBpZGVudCwgc25kc29jaywgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSk7CiAgICAgICAgICAgICAgICArK3NlbnRmaXJzdDsKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseShzLCBmcm9tLCAmdDEsIHBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpID0gcGFja2V0X29rKHBhY2tldCwgY2MsIGZyb20sIHNlcSwgaWRlbnQsIHBtdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFNraXAgc2hvcnQgcGFja2V0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmICghZ290bGFzdGFkZHIgfHwgZnJvbS0+c2luX2FkZHIuc19hZGRyICE9IGxhc3RhZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCAgICBobGVuOwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBobGVuID0gaXAtPmlwX2hsIDw8IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGhsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzIiwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RhZGRyID0gZnJvbS0+c2luX2FkZHIuc19hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICArK2dvdGxhc3RhZGRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSdHQgPSBkZWx0YVQoJnQxLCAmdDIpOwogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvYmUgPSByZXNwb25zZVByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0IDwgbWluUnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1SdHQgPSAoc3VtUnR0KSArIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZCgoZG91YmxlKSAoc3VtUnR0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSByZXNwb25zZVByb2JlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0N1clByb2JlQ291bnQgPQogICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gLTIpIHsKI2lmbmRlZiBBUkNIQUlDCiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC0+aXBfdHRsIDw9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICArK2dvdF90aGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogdGltZSBleGNlZWRlZCBpbiB0cmFuc2l0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjb2RlID0gaSAtIDE7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BPUlQ6CiNpZm5kZWYgQVJDSEFJQwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAtPmlwX3R0bCA8PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgISIpOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFOIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9IT1NUOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhSCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUFJPVE9DT0w6CiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfTkVFREZSQUc6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFGLSVkIiwgcG10dSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9TUkNGQUlMOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfRklMVEVSX1BST0hJQjoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRToKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhQyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgITwlZD4iLCBjb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIFByaW50ZigiICoiKTsKICAgICAgICAgICAgICAgICAgICBSdHQgPSAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpICogMTAwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cyAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzID0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9NQUxMT0NfU1RSVUNUCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgICAgIC8qIGFkZCBsb2NrIHRvIHByb3RlY3QgKi8KICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID49CiAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAoMjE0NzQ4MzY0NykpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgICsrKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIC8qIGVuZHNhZHNhZHNhZCAqLwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggPSB0dGw7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4ID0gcHJvYmUgKyAxOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyVHlwZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyb20tPnNpbl9hZGRyKSldID0KICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVJlc3BvbnNlID0gUnR0OwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJCSAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIG1lbWR1cCgmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRlX25fdGltZSgmdGltZXAsCgkJCSAgICAmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lTGVuKSwgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXMgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpLT5uZXh0ID0gdGVtcF9oaXM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzID0gdGVtcF9oaXM7CgogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSArIDEgPj0gbnByb2JlcykgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzLT5uZXh0ID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfaG9wcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbS0+c2luX2FkZHIpKV0gPQogICAgICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBtZW1kdXAoJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksIDExKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlCiAgICAgICAgICAgICAgICB8fCAodW5yZWFjaGFibGUgPiAwICYmIHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSkgewoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCgkJICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aF90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgbWVtZHVwKCZTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfbl90aW1lKCZ0aW1lcCwKCQkJICAgICZTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhMZW4pLCAxMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVENPTVBMRVRFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgY29tcGxldGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgRmFpbGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwKICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvYmUgKyAxKSA9PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBGYWlsZWQhXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xvc2Uoc25kc29jayk7CgogICAgICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJwYXRoIGNoYW5nZWQhXG4iKSk7CiAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVQYXRoQ2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVBhdGhDaGFuZ2UpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgIH0KCiAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CiAgICAgICAgICAgIGZyZWUob2xkX0hvcHNBZGRyZXNzW2tdKTsKICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDIpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaWNtcF9zb2NrID0gMDsgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jayA9IDA7ICAgIC8qIHNlbmQgKHVkcCkgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwoKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdoZXJldG87ICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBzYWRkcjsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZpcnN0aG9wOwogICAgICAgIGNoYXIgICAgICAgICAgICpzb3VyY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpkZXZpY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpob3N0bmFtZSA9IE5VTEw7CgogICAgICAgIHBpZF90ICAgICAgICAgICBpZGVudCA9IDA7CiAgICAgICAgdV9zaG9ydCAgICAgICAgIHBvcnQgPSAzMjc2OCArIDY2NjsgICAgIC8qIHN0YXJ0IHVkcCBkZXN0IHBvcnQgIyBmb3IgcHJvYmUgcGFja2V0cyAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRpb25zID0gMDsgICAgLyogc29ja2V0IG9wdGlvbnMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgd2FpdHRpbWUgPSA1OyAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpICovCgogICAgICAgIGNoYXIgICAgICAgICAgICpzZW5kYnVmZiA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpOwoKICAgICAgICB1X2NoYXIgICAgICAgICAgcGFja2V0WzUxMl07ICAgIC8qIGxhc3QgaW5ib3VuZCAoaWNtcCkgcGFja2V0ICovCgogICAgICAgIGNoYXIgICAgICAgICAgICBwYVs2NF07CiAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZyb20sICp0byA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBvbiA9IDAsIHByb2JlID0gMCwgc2VxID0gMCwgdG9zID0KICAgICAgICAgICAgMCwgdHRsID0gMDsKICAgICAgICBpbnQgICAgICAgICAgICAgc29ja2V0X2Vycm5vID0gMDsKCiAgICAgICAgaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOwogICAgICAgIHNvY2tldF9lcnJubyA9IGVycm5vOwoKICAgICAgICBzZXR1aWQoZ2V0dWlkKCkpOwoKICAgICAgICBvbiA9IDE7CiAgICAgICAgc2VxID0gdG9zID0gMDsKICAgICAgICB0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZ3aGVyZXRvOwoKICAgICAgICBob3N0bmFtZSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIG1lbWNweShob3N0bmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaG9zdG5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW5dID0gJ1wwJzsKCiAgICAgICAgc2V0bGluZWJ1ZihzdGRvdXQpOwoKICAgICAgICBtZW1zZXQoJndoZXJldG8sICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CgogICAgICAgIHRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgIHRvLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKCiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZ0by0+c2luNl9hZGRyKSA8PSAwKSB7CiAgICAgICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdG5hbWUsIEFGX0lORVQ2KTsKICAgICAgICAgICAgaWYgKGhwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG1lbW1vdmUoKGNhZGRyX3QpICYgdG8tPnNpbjZfYWRkciwgaHAtPmhfYWRkciwgMTYpOwogICAgICAgICAgICAgICAgaG9zdG5hbWUgPSAoY2hhciAqKSBocC0+aF9uYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHVua25vd24gaG9zdCAlc1xuIiwgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpcnN0aG9wID0gKnRvOwoKICAgICAgICBkYXRhbGVuID0gaXRlbS0+dHJhY2VSb3V0ZUN0bERhdGFTaXplOwogICAgICAgIGlmIChkYXRhbGVuIDwgKGludCkgc2l6ZW9mKHN0cnVjdCBwa3RfZm9ybWF0KQogICAgICAgICAgICB8fCBkYXRhbGVuID49IE1BWFBBQ0tFVCkgewogICAgICAgICAgICBGcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogcGFja2V0IHNpemUgbXVzdCBiZSAlZCA8PSBzIDwgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZihzdHJ1Y3QgcGt0X2Zvcm1hdCksIE1BWFBBQ0tFVCk7CiAgICAgICAgICAgIGRhdGFsZW4gPSAxNjsKICAgICAgICB9CgogICAgICAgIGlkZW50ID0gZ2V0cGlkKCk7CgogICAgICAgIHNlbmRidWZmID0gbWFsbG9jKGRhdGFsZW4pOwogICAgICAgIGlmIChzZW5kYnVmZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChpY21wX3NvY2sgPCAwKSB7CiAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOwogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU2OiBpY21wIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwoKICAgICAgICBpZiAoKHNuZHNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBVRFAgc29ja2V0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNpZmRlZiBTT19TTkRCVUYKICAgICAgICBpZiAoc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyICopICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkYXRhbGVuKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogU09fU05EQlVGIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU09fU05EQlVGICovCgogICAgICAgIGlmIChvcHRpb25zICYgU09fREVCVUcpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIGlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZvbiwgc2l6ZW9mKG9uKSk7CgogICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICBzb2NrbGVuX3QgICAgICAgYWxlbjsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHByb2JlX2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKCiAgICAgICAgICAgIGlmIChwcm9iZV9mZCA8IDApIHsKICAgICAgICAgICAgICAgIHBlcnJvcigic29ja2V0Iik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRldmljZSkgewogICAgICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQKICAgICAgICAgICAgICAgICAgICAocHJvYmVfZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZGV2aWNlKSArIDEpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHBlcnJvcigiV0FSTklORzogaW50ZXJmYWNlIGlzIGlnbm9yZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaXJzdGhvcC5zaW42X3BvcnQgPSBodG9ucygxMDI1KTsKICAgICAgICAgICAgaWYgKGNvbm5lY3QKICAgICAgICAgICAgICAgIChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZmlyc3Rob3AsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpcnN0aG9wKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFsZW4gPSBzaXplb2Yoc2FkZHIpOwogICAgICAgICAgICBpZiAoZ2V0c29ja25hbWUocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmYWxlbikgPT0KICAgICAgICAgICAgICAgIC0xKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoImdldHNvY2tuYW1lIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2FkZHIuc2luNl9wb3J0ID0gMDsKICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lbXNldCgmc2FkZHIsICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CiAgICAgICAgICAgIHNhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIHNvdXJjZSwgJnNhZGRyLnNpbjZfYWRkcikgPCAwKSB7CiAgICAgICAgICAgICAgICBQcmludGYoInRyYWNlcm91dGU6IHVua25vd24gYWRkciAlc1xuIiwgc291cmNlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU6IGJpbmQgc2VuZGluZyBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYmluZChpY21wX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBiaW5kIGljbXA2IHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgInRyYWNlcm91dGUgdG8gJXMgKCVzKSIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KSk7CgogICAgICAgIEZwcmludGYoc3RkZXJyLCAiIGZyb20gJXMiLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmc2FkZHIuc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsLCBkYXRhbGVuKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZGVycik7CgoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlUmVzdWx0cyA9IE5VTEw7CiAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX3Jlc3VsdHMgPSBOVUxMOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICp0ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50X3RlbXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKmN1cnJlbnQgPSBOVUxMOwoKICAgICAgICB1bnNpZ25lZCBsb25nICAgaW5kZXggPSAwOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXBfaGlzID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcF9oaXMgPSBOVUxMOwoKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX3Jlc3VsdHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7IC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgaWYgKChTdG9yYWdlUmVzdWx0cyA9CiAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19yZXN1bHRzKSkgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfcmVzdWx0cyk7CiAgICAgICAgdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgZm9yICh0dGwgPSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICAgICAgIHR0bCA8PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsOyArK3R0bCkgewogICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgbGFzdGFkZHIgPSB7IHt7MCx9fSB9OwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgdGltZV90ICAgICAgICAgIHRpbWVwID0gMDsKICAgICAgICAgICAgUHJpbnRmKCIlMmQgIiwgdHRsKTsKCgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CgogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdmFycyk7CgogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgICAgICAgICAgICAgIHZhcnMgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWR1cCgodV9jaGFyICoqKSAmIG9sZF9Ib3BzQWRkcmVzc1trXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kZWwoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QodHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXggPSArK2luZGV4OwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCgoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNSdHRTdW1PZlNxdWFyZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSAwOwoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMSkKICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlSG9wcyA9IHRlbXA7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wKS0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudF90ZW1wID0gdGVtcDsKCiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXhSdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1pblJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3VtUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXNwb25zZVByb2JlID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1PZlNxdWFyZSA9IDA7CiAgICAgICAgICAgIGZvciAocHJvYmUgPSAwOyBwcm9iZSA8IG5wcm9iZXM7ICsrcHJvYmUpIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjYyA9IDAsIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0MSwgdDI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIFJ0dCA9IDA7CgogICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0MSwgJnR6KTsKCiAgICAgICAgICAgICAgICBzZW5kX3Byb2JlX3Y2KCsrc2VxLCB0dGwsIHNlbmRidWZmLCBpZGVudCwgJnR6LCBzbmRzb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCAmd2hlcmV0bywgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAxOwoKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseV92NihpY21wX3NvY2ssICZmcm9tLCByZXNldF90aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUsIGljbXBfc29jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0KSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPQogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X29rX3Y2KHBhY2tldCwgY2MsICZmcm9tLCBzZXEsICZ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZmcm9tLnNpbjZfYWRkciwgJmxhc3RhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbGFzdGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgUnR0ID0gZGVsdGFUKCZ0MSwgJnQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9iZSA9IHJlc3BvbnNlUHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bU9mU3F1YXJlID0gUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJ0dCA8IG1pblJ0dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IChzdW1SdHQpICsgUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoKGRvdWJsZSkgKHN1bVJ0dCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHJlc3BvbnNlUHJvYmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CgoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIU4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIUgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAqIik7CiAgICAgICAgICAgICAgICAgICAgUnR0ID0gKGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0KSAqIDEwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QKICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKysoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCA9IHR0bDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggPSBwcm9iZSArIDE7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHN0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZXRfbnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKSArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsIHBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkckxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlSZXNwb25zZSA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlMYXN0UkMgPSAwOwoKCQkgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBtZW1kdXAoJnRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJnRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcyktPm5leHQgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMgPSB0ZW1wX2hpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlICsgMSA+PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfY291bnQoaXRlbSkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFJvd3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RlbExhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLCBwYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CgogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBtZW1kdXAoJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19ob3BzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlIHx8IHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSB7CgoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCQkgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBtZW1kdXAoJlN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJlN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aExlbiksIDExKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGl0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFUk9VVEVUUkFQR0VORVJBVElPTl9URVNUQ09NUExFVEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVEVTVCBjb21wbGV0ZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0ZXN0IEZhaWxlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwKICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvYmUgKyAxKSA9PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoInRlc3QgRmFpbGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xvc2Uoc25kc29jayk7CgogICAgICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJwYXRoIGNoYW5nZWQhXG4iKTsKICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVBhdGhDaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlUGF0aENoYW5nZSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgICAgICAgICAgICAgayA9IDA7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNvdW50OyBrKyspIHsKICAgICAgICAgICAgZnJlZShvbGRfSG9wc0FkZHJlc3Nba10pOwogICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBOVUxMOwogICAgICAgIH0KCiAgICB9CiAgICByZXR1cm47Cn0KCgppbnQKd2FpdF9mb3JfcmVwbHkocmVnaXN0ZXIgaW50IHNvY2ssIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbXAsCiAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0cCwgdV9jaGFyICogcGFja2V0LAogICAgICAgICAgICAgICBpbnQgd2FpdHRpbWUpCnsKICAgIGZkX3NldCAgICAgICAgICBmZHM7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93LCB3YWl0OwogICAgc3RydWN0IHRpbWV6b25lIHR6OwogICAgcmVnaXN0ZXIgaW50ICAgIGNjID0gMDsKICAgIHNvY2tsZW5fdCAgICAgICBmcm9tbGVuID0gc2l6ZW9mKCpmcm9tcCk7CgogICAgRkRfWkVSTygmZmRzKTsKICAgIEZEX1NFVChzb2NrLCAmZmRzKTsKICAgIHdhaXQudHZfc2VjID0gdHAtPnR2X3NlYyArIHdhaXR0aW1lOwogICAgd2FpdC50dl91c2VjID0gdHAtPnR2X3VzZWM7CiAgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZub3csICZ0eik7CiAgICB0dnN1Yigmd2FpdCwgJm5vdyk7CiAgICBpZiAoc2VsZWN0KHNvY2sgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmd2FpdCkgPiAwKQogICAgICAgIGNjID0gcmVjdmZyb20oc29jaywgKGNoYXIgKikgcGFja2V0LCA1MTIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopIGZyb21wLCAmZnJvbWxlbik7CiAgICByZXR1cm4gKGNjKTsKfQoKCmludAp3YWl0X2Zvcl9yZXBseV92NihpbnQgc29jaywgc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbSwgaW50IHJlc2V0X3RpbWVyLAogICAgICAgICAgICAgICAgICBpbnQgd2FpdHRpbWUsIGludCBpY21wX3NvY2ssIHVfY2hhciAqIHBhY2tldCkKewogICAgZmRfc2V0ICAgICAgICAgIGZkczsKICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB3YWl0OwogICAgaW50ICAgICAgICAgICAgIGNjID0gMDsKICAgIHNvY2tsZW5fdCAgICAgICBmcm9tbGVuID0gc2l6ZW9mKCpmcm9tKTsKCiAgICBGRF9aRVJPKCZmZHMpOwogICAgRkRfU0VUKHNvY2ssICZmZHMpOwogICAgaWYgKHJlc2V0X3RpbWVyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0cmFjZXJvdXRlIGNvdWxkIGhhbmcgaWYgc29tZW9uZSBlbHNlIGhhcyBhIHBpbmcKICAgICAgICAgKiBydW5uaW5nIGFuZCBvdXIgSUNNUCByZXBseSBnZXRzIGRyb3BwZWQgYnV0IHdlIGRvbid0CiAgICAgICAgICogcmVhbGl6ZSBpdCBiZWNhdXNlIHdlIGtlZXAgd2FraW5nIHVwIHRvIGhhbmRsZSB0aG9zZQogICAgICAgICAqIG90aGVyIElDTVAgcGFja2V0cyB0aGF0IGtlZXAgY29taW5nIGluLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICogInJlc2V0X3RpbWVyIiB3aWxsIG9ubHkgYmUgdHJ1ZSBpZiB0aGUgbGFzdCBwYWNrZXQgdGhhdAogICAgICAgICAqIGNhbWUgaW4gd2FzIGZvciB1cyBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlCiAgICAgICAgICogd2FpdGluZyBmb3IgYSByZXBseSBzaW5jZSBzZW5kaW5nIG91dCBhIHByb2JlLiAgTm90ZQogICAgICAgICAqIHRoYXQgdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHNlbGVjdCgpIGZlYXR1cmUgb24KICAgICAgICAgKiBMaW51eCB3aGVyZSB0aGUgcmVtYWluaW5nIHRpbWVvdXQgaXMgd3JpdHRlbiB0byB0aGUKICAgICAgICAgKiBzdHJ1Y3QgdGltZXZhbCBhcmVhLgogICAgICAgICAqLwogICAgICAgIHdhaXQudHZfc2VjID0gd2FpdHRpbWU7CiAgICAgICAgd2FpdC50dl91c2VjID0gMDsKICAgIH0KCiAgICBpZiAoc2VsZWN0KHNvY2sgKyAxLCAmZmRzLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgJndhaXQpID4gMCkgewogICAgICAgIGNjID0gcmVjdmZyb20oaWNtcF9zb2NrLCAoY2hhciAqKSBwYWNrZXQsIDUxMiwgMCwKICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbSwgJmZyb21sZW4pOwogICAgfQoKICAgIHJldHVybiAoY2MpOwp9CgovKgogKiBzZW5kX3Byb2JlKCkgdXNlcyB0aGUgQlNELWlzaCB1ZHBpcGhkci4KICogRGVmaW5lIHNvbWV0aGluZyB0aGF0IGxvb2tzIGVub3VnaCBsaWtlIGl0IHRvIHdvcmsuCiAqLwpzdHJ1Y3QgdWRwaXBoZHIgewogICBzdHJ1Y3QgaXBoZHIgdWlfaTsKICAgc3RydWN0IHVkcGhkciB1aV91Owp9OwojZGVmaW5lIHVpX3NyYyB1aV9pLnNhZGRyCiNkZWZpbmUgdWlfZHN0IHVpX2kuZGFkZHIKI2RlZmluZSB1aV9wciB1aV9pLnByb3RvY29sCiNkZWZpbmUgdWlfbGVuIHVpX2kudG90X2xlbgoKdm9pZApzZW5kX3Byb2JlKHN0cnVjdCBzb2NrYWRkcl9pbiAqd2hlcmV0bywgcmVnaXN0ZXIgaW50IHNlcSwgaW50IHR0bCwKICAgICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqdHAsIHJlZ2lzdGVyIHN0cnVjdCBpcCAqb3V0aXAsCiAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHVkcGhkciAqb3V0dWRwLCBpbnQgcGFja2xlbiwgaW50IG9wdGxlbiwKICAgICAgICAgICBjaGFyICpob3N0bmFtZSwgdV9zaG9ydCBpZGVudCwgaW50IHNuZHNvY2ssIHVfc2hvcnQgcG9ydCwKICAgICAgICAgICBzdHJ1Y3Qgb3V0ZGF0YSAqb3V0ZGF0YSkKewogICAgcmVnaXN0ZXIgaW50ICAgIGNjID0gMDsKICAgIHJlZ2lzdGVyIHN0cnVjdCB1ZHBpcGhkciAqdWkgPSBOVUxMLCAqb3VpID0gTlVMTDsKICAgIHN0cnVjdCBpcCAgICAgICB0aXA7CgogICAgb3V0aXAtPmlwX3R0bCA9IHR0bDsKI2lmbmRlZiBfX2hwdXgKICAgIG91dGlwLT5pcF9pZCA9IGh0b25zKGlkZW50ICsgc2VxKTsKI2VuZGlmCgogICAgLyoKICAgICAqIEluIG1vc3QgY2FzZXMsIHRoZSBrZXJuZWwgd2lsbCByZWNhbGN1bGF0ZSB0aGUgaXAgY2hlY2tzdW0uCiAgICAgKiBCdXQgd2UgbXVzdCBkbyBpdCBhbnl3YXkgc28gdGhhdCB0aGUgdWRwIGNoZWNrc3VtIGNvbWVzIG91dAogICAgICogcmlnaHQuCiAgICAgKi8KCiAgICBvdXRpcC0+aXBfc3VtID0KICAgICAgICBpbl9jaGVja3N1bSgodV9zaG9ydCAqKSBvdXRpcCwgc2l6ZW9mKCpvdXRpcCkgKyBvcHRsZW4pOwogICAgaWYgKG91dGlwLT5pcF9zdW0gPT0gMCkKICAgICAgICBvdXRpcC0+aXBfc3VtID0gMHhmZmZmOwoKCiAgICAvKgogICAgICogUGF5bG9hZCAKICAgICAqLwogICAgb3V0ZGF0YS0+c2VxID0gc2VxOwogICAgb3V0ZGF0YS0+dHRsID0gdHRsOwogICAgb3V0ZGF0YS0+dHYgPSAqdHA7CgoKICAgIG91dHVkcC0+ZGVzdCA9IGh0b25zKHBvcnQgKyBzZXEpOwoKCiAgICAvKgogICAgICogQ2hlY2tzdW0gKHdlIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSBpcCBoZWFkZXIpIAogICAgICovCiAgICB0aXAgPSAqb3V0aXA7CiAgICB1aSA9IChzdHJ1Y3QgdWRwaXBoZHIgKikgb3V0aXA7CiAgICBvdWkgPSAoc3RydWN0IHVkcGlwaGRyICopICZ0aXA7CiAgICAvKgogICAgICogRWFzaWVyIHRvIHplcm8gYW5kIHB1dCBiYWNrIHRoaW5ncyB0aGF0IGFyZSBvayAKICAgICAqLwogICAgbWVtc2V0KChjaGFyICopIHVpLCAwLCBzaXplb2YodWktPnVpX2kpKTsKICAgIHVpLT51aV9zcmMgPSBvdWktPnVpX3NyYzsKICAgIHVpLT51aV9kc3QgPSBvdWktPnVpX2RzdDsKICAgIHVpLT51aV9wciA9IG91aS0+dWlfcHI7CiAgICB1aS0+dWlfbGVuID0gb3V0dWRwLT5sZW47CiAgICBvdXR1ZHAtPmNoZWNrID0gMDsKICAgIG91dHVkcC0+Y2hlY2sgPSBpbl9jaGVja3N1bSgodV9zaG9ydCAqKSB1aSwgcGFja2xlbik7CiAgICBpZiAob3V0dWRwLT5jaGVjayA9PSAwKQogICAgICAgIG91dHVkcC0+Y2hlY2sgPSAweGZmZmY7CiAgICAqb3V0aXAgPSB0aXA7CgoKICAgIC8qCiAgICAgKiBYWFggdW5kb2N1bWVudGVkIGRlYnVnZ2luZyBoYWNrIAogICAgICovCgoKI2lmICFkZWZpbmVkKElQX0hEUklOQ0wpICYmIGRlZmluZWQoSVBfVFRMKQogICAgcHJpbnRmKCJ0dGxcbiIpOwogICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVFRMLAogICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnR0bCwgc2l6ZW9mKHR0bCkpIDwgMCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IHNldHNvY2tvcHQgdHRsICVkOiAlc1xuIiwKICAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlIiwgdHRsLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiNlbmRpZgoKI2lmZGVmIF9faHB1eAoKICAgIFByaW50Zigid2hlcmV0bz0lc1xuIiwKICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgd2hlcmV0byktPnNpbl9hZGRyKSk7CiAgICBjYyA9IHNlbmR0byhzbmRzb2NrLCAoY2hhciAqKSBvdXR1ZHAsCiAgICAgICAgICAgICAgICBwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSwgMCwgd2hlcmV0bywKICAgICAgICAgICAgICAgIHNpemVvZigqd2hlcmV0bykpOwogICAgaWYgKGNjID4gMCkKICAgICAgICBjYyArPSBzaXplb2YoKm91dGlwKSArIG9wdGxlbjsKI2Vsc2UKCiAgICBjYyA9IHNlbmR0byhzbmRzb2NrLCAoY2hhciAqKSBvdXRpcCwKICAgICAgICAgICAgICAgIHBhY2tsZW4sIDAsIHdoZXJldG8sIHNpemVvZigqd2hlcmV0bykpOwojZW5kaWYKICAgIGlmIChjYyA8IDAgfHwgY2MgIT0gcGFja2xlbikgewogICAgICAgIGlmIChjYyA8IDApCiAgICAgICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IHNlbmR0bzogJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBQcmludGYoIiVzOiB3cm90ZSAlcyAlZCBjaGFycywgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lLCBwYWNrbGVuLCBjYyk7CiAgICAgICAgKHZvaWQpIGZmbHVzaChzdGRvdXQpOwogICAgfQp9CgoKCnZvaWQKc2VuZF9wcm9iZV92NihpbnQgc2VxLCBpbnQgdHRsLCBjaGFyICpzZW5kYnVmZiwgcGlkX3QgaWRlbnQsCiAgICAgICAgICAgICAgc3RydWN0IHRpbWV6b25lICp0eiwgaW50IHNuZHNvY2ssIGludCBkYXRhbGVuLAogICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndoZXJldG8sIGNoYXIgKmhvc3RuYW1lKQp7CiAgICBzdHJ1Y3QgcGt0X2Zvcm1hdCAqcGt0ID0gKHN0cnVjdCBwa3RfZm9ybWF0ICopIHNlbmRidWZmOwogICAgaW50ICAgICAgICAgICAgIGkgPSAwOwoKICAgIHBrdC0+aWRlbnQgPSBodG9ubChpZGVudCk7CiAgICBwa3QtPnNlcSA9IGh0b25sKHNlcSk7CiAgICBnZXR0aW1lb2ZkYXkoJnBrdC0+dHYsIHR6KTsKCiAgICBpID0gc2V0c29ja29wdChzbmRzb2NrLCBTT0xfSVBWNiwgSVBWNl9VTklDQVNUX0hPUFMsICZ0dGwsCiAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSk7CiAgICBpZiAoaSA8IDApIHsKICAgICAgICBwZXJyb3IoInNldHNvY2tvcHQiKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIGRvIHsKICAgICAgICBpID0gc2VuZHRvKHNuZHNvY2ssIHNlbmRidWZmLCBkYXRhbGVuLCAwLAogICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSB3aGVyZXRvLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKICAgIH0gd2hpbGUgKGkgPCAwICYmIGVycm5vID09IEVDT05OUkVGVVNFRCk7CgogICAgaWYgKGkgPCAwIHx8IGkgIT0gZGF0YWxlbikgewogICAgICAgIGlmIChpIDwgMCkKICAgICAgICAgICAgcGVycm9yKCJzZW5kdG8iKTsKICAgICAgICBQcmludGYoInRyYWNlcm91dGU6IHdyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICBkYXRhbGVuLCBpKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICB9Cn0KCgp1bnNpZ25lZCBsb25nCmRlbHRhVChzdHJ1Y3QgdGltZXZhbCAqdDFwLCBzdHJ1Y3QgdGltZXZhbCAqdDJwKQp7CiAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGR0OwoKICAgIGR0ID0gKHVuc2lnbmVkIGxvbmcpICgobG9uZykgKHQycC0+dHZfc2VjIC0gdDFwLT50dl9zZWMpICogMTAwMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICh0MnAtPnR2X3VzZWMgLSB0MXAtPnR2X3VzZWMpIC8gMTAwMCk7CiAgICByZXR1cm4gKGR0KTsKfQoKCmludApwYWNrZXRfb2socmVnaXN0ZXIgdV9jaGFyICogYnVmLCBpbnQgY2MsIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSwKICAgICAgICAgIHJlZ2lzdGVyIGludCBzZXEsIHVfc2hvcnQgaWRlbnQsIGludCBwbXR1LCB1X3Nob3J0IHBvcnQpCnsKICAgIHJlZ2lzdGVyIHN0cnVjdCBpY21wICppY3AgPSBOVUxMOwogICAgcmVnaXN0ZXIgdV9jaGFyIHR5cGUsIGNvZGU7CiAgICByZWdpc3RlciBpbnQgICAgaGxlbiA9IDA7CiNpZm5kZWYgQVJDSEFJQwogICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IE5VTEw7CgogICAgaXAgPSAoc3RydWN0IGlwICopIGJ1ZjsKICAgIGhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKICAgIGlmIChjYyA8IGhsZW4gKyBJQ01QX01JTkxFTikgewoKICAgICAgICByZXR1cm4gKDApOwogICAgfQogICAgY2MgLT0gaGxlbjsKICAgIGljcCA9IChzdHJ1Y3QgaWNtcCAqKSAoYnVmICsgaGxlbik7CiNlbHNlCiAgICBpY3AgPSAoc3RydWN0IGljbXAgKikgYnVmOwojZW5kaWYKICAgIHR5cGUgPSBpY3AtPmljbXBfdHlwZTsKICAgIGNvZGUgPSBpY3AtPmljbXBfY29kZTsKICAgIC8qCiAgICAgKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpIAogICAgICovCiAgICBpZiAoY29kZSAhPSBJQ01QX1VOUkVBQ0hfTkVFREZSQUcpCiAgICAgICAgcG10dSA9IDA7CiAgICBlbHNlIHsKI2lmZGVmIEhBVkVfSUNNUF9ORVhUTVRVCiAgICAgICAgcG10dSA9IG50b2hzKGljcC0+aWNtcF9uZXh0bXR1KTsKI2Vsc2UKICAgICAgICBwbXR1ID0gbnRvaHMoKChzdHJ1Y3QgbXlfcG10dSAqKSAmaWNwLT5pY21wX3ZvaWQpLT5pcG1fbmV4dG10dSk7CiNlbmRpZgogICAgfQogICAgaWYgKCh0eXBlID09IElDTVBfVElNWENFRUQgJiYgY29kZSA9PSBJQ01QX1RJTVhDRUVEX0lOVFJBTlMpIHx8CiAgICAgICAgdHlwZSA9PSBJQ01QX1VOUkVBQ0ggfHwgdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgewogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaGlwOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB1ZHBoZHIgKnVwOwoKICAgICAgICBoaXAgPSAmaWNwLT5pY21wX2lwOwogICAgICAgIGhsZW4gPSBoaXAtPmlwX2hsIDw8IDI7CiAgICAgICAgdXAgPSAoc3RydWN0IHVkcGhkciAqKSAoKHVfY2hhciAqKSBoaXAgKyBobGVuKTsKICAgICAgICAvKgogICAgICAgICAqIFhYWCA4IGlzIGEgbWFnaWMgbnVtYmVyIAogICAgICAgICAqLwogICAgICAgIGlmIChobGVuICsgMTIgPD0gY2MgJiYKICAgICAgICAgICAgaGlwLT5pcF9wID09IElQUFJPVE9fVURQICYmCiAgICAgICAgICAgIHVwLT5zb3VyY2UgPT0gaHRvbnMoaWRlbnQpICYmIHVwLT5kZXN0ID09IGh0b25zKHBvcnQgKyBzZXEpKQogICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gSUNNUF9USU1YQ0VFRCA/IC0xIDogY29kZSArIDEpOwogICAgfQoKCiAgICByZXR1cm4gKDApOwp9CgoKCgppbnQKcGFja2V0X29rX3Y2KHVfY2hhciAqIGJ1ZiwgaW50IGNjLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLCBpbnQgc2VxLAogICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnR2LCBwaWRfdCBpZGVudCkKewogICAgc3RydWN0IGljbXA2X2hkciAqaWNwID0gTlVMTDsKICAgIHVfY2hhciAgICAgICAgICB0eXBlLCBjb2RlOwoKICAgIGljcCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIGJ1ZjsKCiAgICB0eXBlID0gaWNwLT5pY21wNl90eXBlOwogICAgY29kZSA9IGljcC0+aWNtcDZfY29kZTsKCiAgICBpZiAoKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCAmJiBjb2RlID09IElDTVA2X1RJTUVfRVhDRUVEX1RSQU5TSVQpIHx8CiAgICAgICAgdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSCkgewogICAgICAgIHN0cnVjdCBpcDZfaGRyICAqaGlwID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdWRwaGRyICAqdXAgPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBuZXh0aGRyID0gMDsKCiAgICAgICAgaGlwID0gKHN0cnVjdCBpcDZfaGRyICopIChpY3AgKyAxKTsKICAgICAgICB1cCA9IChzdHJ1Y3QgdWRwaGRyICopIChoaXAgKyAxKTsKICAgICAgICBuZXh0aGRyID0gaGlwLT5pcDZfbnh0OwoKICAgICAgICBpZiAobmV4dGhkciA9PSA0NCkgewogICAgICAgICAgICBuZXh0aGRyID0gKih1bnNpZ25lZCBjaGFyICopIHVwOwogICAgICAgICAgICB1cCsrOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dGhkciA9PSBJUFBST1RPX1VEUCkgewogICAgICAgICAgICBzdHJ1Y3QgcGt0X2Zvcm1hdCAqcGt0OwoKICAgICAgICAgICAgcGt0ID0gKHN0cnVjdCBwa3RfZm9ybWF0ICopICh1cCArIDEpOwoKICAgICAgICAgICAgaWYgKG50b2hsKHBrdC0+aWRlbnQpID09IGlkZW50ICYmIG50b2hsKHBrdC0+c2VxKSA9PSBzZXEpIHsKICAgICAgICAgICAgICAgICp0diA9IHBrdC0+dHY7CiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCA/IC0xIDogY29kZSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gKDApOwp9CgoKLyoKICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKEMgVmVyc2lvbikKICovCgp1X3Nob3J0CmluX2NoZWNrc3VtKHJlZ2lzdGVyIHVfc2hvcnQgKiBhZGRyLCByZWdpc3RlciBpbnQgbGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgbmxlZnQgPSBsZW47CiAgICByZWdpc3RlciB1X3Nob3J0ICp3ID0gYWRkcjsKICAgIHJlZ2lzdGVyIHVfc2hvcnQgYW5zd2VyOwogICAgcmVnaXN0ZXIgaW50ICAgIHN1bSA9IDA7CgogICAgLyoKICAgICAqICBPdXIgYWxnb3JpdGhtIGlzIHNpbXBsZSwgdXNpbmcgYSAzMiBiaXQgYWNjdW11bGF0b3IgKHN1bSksCiAgICAgKiAgd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAogICAgICogIGJhY2sgYWxsIHRoZSBjYXJyeSBiaXRzIGZyb20gdGhlIHRvcCAxNiBiaXRzIGludG8gdGhlIGxvd2VyCiAgICAgKiAgMTYgYml0cy4KICAgICAqLwogICAgd2hpbGUgKG5sZWZ0ID4gMSkgewogICAgICAgIHN1bSArPSAqdysrOwogICAgICAgIG5sZWZ0IC09IDI7CiAgICB9CgogICAgLyoKICAgICAqIG1vcCB1cCBhbiBvZGQgYnl0ZSwgaWYgbmVjZXNzYXJ5IAogICAgICovCiAgICBpZiAobmxlZnQgPT0gMSkKICAgICAgICBzdW0gKz0gKih1X2NoYXIgKikgdzsKCiAgICAvKgogICAgICogYWRkIGJhY2sgY2Fycnkgb3V0cyBmcm9tIHRvcCAxNiBiaXRzIHRvIGxvdyAxNiBiaXRzCiAgICAgKi8KICAgIHN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7IC8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KICAgIHN1bSArPSAoc3VtID4+IDE2KTsgICAgICAgICAvKiBhZGQgY2FycnkgKi8KICAgIGFuc3dlciA9IH5zdW07ICAgICAgICAgICAgICAvKiB0cnVuY2F0ZSB0byAxNiBiaXRzICovCiAgICByZXR1cm4gKGFuc3dlcik7Cn0KCi8qCiAqIFN1YnRyYWN0IDIgdGltZXZhbCBzdHJ1Y3RzOiAgb3V0ID0gb3V0IC0gaW4uCiAqIE91dCBpcyBhc3N1bWVkIHRvIGJlID49IGluLgogKi8Kdm9pZAp0dnN1YihyZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqb3V0LCByZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqaW4pCnsKCiAgICBpZiAoKG91dC0+dHZfdXNlYyAtPSBpbi0+dHZfdXNlYykgPCAwKSB7CiAgICAgICAgLS1vdXQtPnR2X3NlYzsKICAgICAgICBvdXQtPnR2X3VzZWMgKz0gMTAwMDAwMDsKICAgIH0KICAgIG91dC0+dHZfc2VjIC09IGluLT50dl9zZWM7Cn0KCgpzdHJ1Y3QgaG9zdGluZm8gKgpnZXRob3N0aW5mbyhyZWdpc3RlciBjaGFyICpob3N0bmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIG47CiAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaSA9IE5VTEw7CiAgICByZWdpc3RlciBjaGFyICoqcCA9IE5VTEw7CiAgICByZWdpc3RlciB1X2ludDMyX3QgYWRkciwgKmFwID0gTlVMTDsKCiAgICBpZiAoc3RybGVuKGhvc3RuYW1lKSA+IDY0KSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogaG9zdG5hbWUgXCIlLjMycy4uLlwiIGlzIHRvbyBsb25nXG4iLAogICAgICAgICAgICAgICAgInRyYWNlcm91dGUiLCBob3N0bmFtZSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGhpID0gY2FsbG9jKDEsIHNpemVvZigqaGkpKTsKICAgIGlmIChoaSA9PSBOVUxMKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogY2FsbG9jICVzXG4iLCAidHJhY2Vyb3V0ZSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGFkZHIgPSBpbmV0X2FkZHIoaG9zdG5hbWUpOwogICAgaWYgKChpbnQzMl90KSBhZGRyICE9IC0xKSB7CiAgICAgICAgaGktPm5hbWUgPSBzdHJkdXAoaG9zdG5hbWUpOwogICAgICAgIGhpLT5uID0gMTsKICAgICAgICBoaS0+YWRkcnMgPSBjYWxsb2MoMSwgc2l6ZW9mKGhpLT5hZGRyc1swXSkpOwogICAgICAgIGlmIChoaS0+YWRkcnMgPT0gTlVMTCkgewogICAgICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBjYWxsb2MgJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaGktPmFkZHJzWzBdID0gYWRkcjsKICAgICAgICByZXR1cm4gKGhpKTsKICAgIH0KCiAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIGhvc3QgJXNcbiIsICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUpOwogICAgICAgIHByaW50ZigiaHA9TlVMTFxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUIHx8IGhwLT5oX2xlbmd0aCAhPSA0KSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogYmFkIGhvc3QgJXNcbiIsICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBoaS0+bmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKICAgIGZvciAobiA9IDAsIHAgPSBocC0+aF9hZGRyX2xpc3Q7ICpwICE9IE5VTEw7ICsrbiwgKytwKQogICAgICAgIGNvbnRpbnVlOwogICAgaGktPm4gPSBuOwogICAgaGktPmFkZHJzID0gY2FsbG9jKG4sIHNpemVvZihoaS0+YWRkcnNbMF0pKTsKICAgIGlmIChoaS0+YWRkcnMgPT0gTlVMTCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IGNhbGxvYyAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBmb3IgKGFwID0gaGktPmFkZHJzLCBwID0gaHAtPmhfYWRkcl9saXN0OyAqcCAhPSBOVUxMOyArK2FwLCArK3ApCiAgICAgICAgbWVtY3B5KGFwLCAqcCwgc2l6ZW9mKCphcCkpOwogICAgcmV0dXJuIChoaSk7Cn0KCnZvaWQKZnJlZWhvc3RpbmZvKHJlZ2lzdGVyIHN0cnVjdCBob3N0aW5mbyAqaGkpCnsKICAgIGlmIChoaS0+bmFtZSAhPSBOVUxMKSB7CiAgICAgICAgZnJlZShoaS0+bmFtZSk7CiAgICAgICAgaGktPm5hbWUgPSBOVUxMOwogICAgfQogICAgZnJlZSgoY2hhciAqKSBoaS0+YWRkcnMpOwogICAgZnJlZSgoY2hhciAqKSBoaSk7Cn0KCnZvaWQKc2V0c2luKHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCByZWdpc3RlciB1X2ludDMyX3QgYWRkcikKewoKICAgIG1lbXNldChzaW4sIDAsIHNpemVvZigqc2luKSk7CiNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgogICAgc2luLT5zaW5fbGVuID0gc2l6ZW9mKCpzaW4pOwojZW5kaWYKICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Cn0KCgovKgogKiBSZXR1cm4gdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gYWRkcmVzcwogKi8KY29uc3QgY2hhciAgICAgKgpmaW5kc2FkZHIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICp0bywKICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSkKewogICAgcmVnaXN0ZXIgaW50ICAgIGksIG47CiAgICByZWdpc3RlciBGSUxFICAqZjsKICAgIHJlZ2lzdGVyIHVfaW50MzJfdCBtYXNrOwogICAgdV9pbnQzMl90ICAgICAgIGRlc3QsIHRtYXNrOwogICAgc3RydWN0IGlmYWRkcmxpc3QgKmFsOwogICAgY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdLCB0ZGV2aWNlWzI1Nl0sIGRldmljZVsyNTZdOwogICAgc3RhdGljIGNoYXIgICAgIGVycmJ1ZlsxMzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXIgcm91dGVbXSA9ICIvcHJvYy9uZXQvcm91dGUiOwoKICAgIGlmICgoZiA9IGZvcGVuKHJvdXRlLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgc3ByaW50ZihlcnJidWYsICJvcGVuICVzOiAlLjEyOHMiLCByb3V0ZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICByZXR1cm4gKGVycmJ1Zik7CiAgICB9CgogICAgLyoKICAgICAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSAKICAgICAqLwogICAgbiA9IDA7CiAgICBtYXNrID0gMDsKICAgIGRldmljZVswXSA9ICdcMCc7CiAgICB3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgIT0gTlVMTCkgewogICAgICAgICsrbjsKICAgICAgICBpZiAobiA9PSAxICYmIHN0cm5jbXAoYnVmLCAiSWZhY2UiLCA1KSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoKGkgPSBzc2NhbmYoYnVmLCAiJXMgJXggJSpzICUqcyAlKnMgJSpzICUqcyAleCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRkZXZpY2UsICZkZXN0LCAmdG1hc2spKSAhPSAzKQogICAgICAgICAgICByZXR1cm4gKCJqdW5rIGluIGJ1ZmZlciIpOwogICAgICAgIGlmICgodG8tPnNpbl9hZGRyLnNfYWRkciAmIHRtYXNrKSA9PSBkZXN0ICYmCiAgICAgICAgICAgICh0bWFzayA+IG1hc2sgfHwgbWFzayA9PSAwKSkgewogICAgICAgICAgICBtYXNrID0gdG1hc2s7CiAgICAgICAgICAgIHN0cmNweShkZXZpY2UsIHRkZXZpY2UpOwogICAgICAgIH0KICAgIH0KICAgIGZjbG9zZShmKTsKCiAgICBpZiAoZGV2aWNlWzBdID09ICdcMCcpCiAgICAgICAgcmV0dXJuICgiQ2FuJ3QgZmluZCBpbnRlcmZhY2UiKTsKCiAgICAvKgogICAgICogR2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBsaXN0IAogICAgICovCiAgICBpZiAoKG4gPSBpZmFkZHJsaXN0KCZhbCwgZXJyYnVmKSkgPCAwKQogICAgICAgIHJldHVybiAoZXJyYnVmKTsKCiAgICBpZiAobiA9PSAwKQogICAgICAgIHJldHVybiAoIkNhbid0IGZpbmQgYW55IG5ldHdvcmsgaW50ZXJmYWNlcyIpOwoKICAgIC8qCiAgICAgKiBGaW5kIG91ciBhcHByb3ByaWF0ZSBzb3VyY2UgYWRkcmVzcyAKICAgICAqLwogICAgZm9yIChpID0gbjsgaSA+IDA7IC0taSwgKythbCkKICAgICAgICBpZiAoc3RyY21wKGRldmljZSwgYWwtPmRldmljZSkgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICBpZiAoaSA8PSAwKSB7CiAgICAgICAgc3ByaW50ZihlcnJidWYsICJDYW4ndCBmaW5kIGludGVyZmFjZSBcIiUuMzJzXCIiLCBkZXZpY2UpOwogICAgICAgIHJldHVybiAoZXJyYnVmKTsKICAgIH0KCiAgICBzZXRzaW4oZnJvbSwgYWwtPmFkZHIpOwogICAgcmV0dXJuIChOVUxMKTsKfQoKaW50CmlmYWRkcmxpc3QocmVnaXN0ZXIgc3RydWN0IGlmYWRkcmxpc3QgKippcGFkZHJwLCByZWdpc3RlciBjaGFyICplcnJidWYpCnsKICAgIHJlZ2lzdGVyIGludCAgICBmZCwgbmlwYWRkcjsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAgICByZWdpc3RlciBpbnQgICAgbjsKI2VuZGlmCiAgICByZWdpc3RlciBzdHJ1Y3QgaWZyZXEgKmlmcnAsICppZmVuZCwgKmlmbmV4dDsKICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOwogICAgcmVnaXN0ZXIgc3RydWN0IGlmYWRkcmxpc3QgKmFsOwogICAgc3RydWN0IGlmY29uZiAgIGlmYzsKICAgIHN0cnVjdCBpZnJlcSAgICBpYnVmWygzMiAqIDEwMjQpIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSldLCBpZnI7CiNkZWZpbmUgTUFYX0lQQUREUiAoc2l6ZW9mKGlidWYpIC8gc2l6ZW9mKGlidWZbMF0pKQogICAgc3RhdGljIHN0cnVjdCBpZmFkZHJsaXN0IGlmYWRkcmxpc3RbTUFYX0lQQUREUl07CiAgICBjaGFyICAgICAgICAgICAgZGV2aWNlW3NpemVvZihpZnIuaWZyX25hbWUpICsgMV07CgogICAgZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZmMuaWZjX2xlbiA9IHNpemVvZihpYnVmKTsKICAgIGlmYy5pZmNfYnVmID0gKGNhZGRyX3QpIGlidWY7CgogICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikgJmlmYykgPCAwIHx8CiAgICAgICAgaWZjLmlmY19sZW4gPCBzaXplb2Yoc3RydWN0IGlmcmVxKSkgewogICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJT0NHSUZDT05GOiBpZnJlcSBzdHJ1Y3QgdG9vIHNtYWxsICglZCBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZihpYnVmKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJTSU9DR0lGQ09ORjogJXMiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZnJwID0gaWJ1ZjsKICAgIGlmZW5kID0gKHN0cnVjdCBpZnJlcSAqKSAoKGNoYXIgKikgaWJ1ZiArIGlmYy5pZmNfbGVuKTsKCiAgICBhbCA9IGlmYWRkcmxpc3Q7CiAgICBuaXBhZGRyID0gMDsKICAgIGZvciAoOyBpZnJwIDwgaWZlbmQ7IGlmcnAgPSBpZm5leHQpIHsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAgICAgICAgbiA9IGlmcnAtPmlmcl9hZGRyLnNhX2xlbiArIHNpemVvZihpZnJwLT5pZnJfbmFtZSk7CiAgICAgICAgaWYgKG4gPCBzaXplb2YoKmlmcnApKQogICAgICAgICAgICBpZm5leHQgPSBpZnJwICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGlmbmV4dCA9IChzdHJ1Y3QgaWZyZXEgKikgKChjaGFyICopIGlmcnAgKyBuKTsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCiAgICAgICAgICAgIGNvbnRpbnVlOwojZWxzZQogICAgICAgIGlmbmV4dCA9IGlmcnAgKyAxOwojZW5kaWYKICAgICAgICAvKgogICAgICAgICAqIE5lZWQgYSB0ZW1wbGF0ZSB0byBwcmVzZXJ2ZSBhZGRyZXNzIGluZm8gdGhhdCBpcwogICAgICAgICAqIHVzZWQgYmVsb3cgdG8gbG9jYXRlIHRoZSBuZXh0IGVudHJ5LiAgKE90aGVyd2lzZSwKICAgICAgICAgKiBTSU9DR0lGRkxBR1Mgc3RvbXBzIG92ZXIgaXQgYmVjYXVzZSB0aGUgcmVxdWVzdHMKICAgICAgICAgKiBhcmUgcmV0dXJuZWQgaW4gYSB1bmlvbi4pCiAgICAgICAgICovCiAgICAgICAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmcnAtPmlmcl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopICZpZnIpIDwgMCkgewogICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5YSU8pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAiU0lPQ0dJRkZMQUdTOiAlLipzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZihpZnIuaWZyX25hbWUpLCBpZnIuaWZyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBNdXN0IGJlIHVwIAogICAgICAgICAqLwogICAgICAgIGlmICgoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgPT0gMCkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHNwcmludGYoZGV2aWNlLCAiJS4qcyIsIChpbnQpIHNpemVvZihpZnIuaWZyX25hbWUpLCBpZnIuaWZyX25hbWUpOwojaWZkZWYgc3VuCiAgICAgICAgLyoKICAgICAgICAgKiBJZ25vcmUgc3VuIHZpcnR1YWwgaW50ZXJmYWNlcyAKICAgICAgICAgKi8KICAgICAgICBpZiAoc3RyY2hyKGRldmljZSwgJzonKSAhPSBOVUxMKQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmCiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQUREUiwgKGNoYXIgKikgJmlmcikgPCAwKSB7CiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgIlNJT0NHSUZBRERSOiAlczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5pcGFkZHIgPj0gTUFYX0lQQUREUikgewogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJUb28gbWFueSBpbnRlcmZhY2VzICglZCkiLCBuaXBhZGRyKTsKICAgICAgICAgICAgKHZvaWQpIGNsb3NlKGZkKTsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgICAgIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmlmci5pZnJfYWRkcjsKICAgICAgICBhbC0+YWRkciA9IHNpbi0+c2luX2FkZHIuc19hZGRyOwogICAgICAgIGFsLT5kZXZpY2UgPSBzdHJkdXAoZGV2aWNlKTsKICAgICAgICArK2FsOwogICAgICAgICsrbmlwYWRkcjsKICAgIH0KICAgICh2b2lkKSBjbG9zZShmZCk7CgogICAgKmlwYWRkcnAgPSBpZmFkZHJsaXN0OwogICAgcmV0dXJuIChuaXBhZGRyKTsKfQo=