LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6dHJhY2VSb3V0ZUN0bFRhYmxlLmMKICpGaWxlIERlc2NyaXB0aW9uOlJvd3Mgb2YgdHJhY2VSb3V0ZUN0bFRhYmxlIE1JQiBhZGQgZGVsZXRlIGFucyByZWFkLgogKiAgICAgICAgICAgICAgUm93cyBvZiB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZUhvcHNUYWJsZSBNSUIgYWRkIGFuZCBkZWxldGUuCiAqICAgICAgICAgICAgICBUaGUgbWFpbiBmdW5jdGlvbiBpcyBhbHNvIGhlcmUuCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUgInRyYWNlUm91dGVDdGxUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlLmgiCiNpbmNsdWRlICJ0cmFjZVJvdXRlSG9wc1RhYmxlLmgiCiNpbmNsdWRlICJoZWFkZXJfY29tcGxleC5oIgoKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkW10gPQogICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgMiB9OwoKLyogdHJhcCAqLwpvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZVBhdGhDaGFuZ2VbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgODEsIDAsIDEgfTsKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVUZXN0RmFpbGVkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAwLCAyIH07Cm9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMCwgMyB9OwoKc3RydWN0IHZhcmlhYmxlMiB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzW10gPSB7CiAgICAvKgogICAgICogbWFnaWMgbnVtYmVyICAgICAgICAsIHZhcmlhYmxlIHR5cGUgLCByby9ydyAsIGNhbGxiYWNrIGZuICAsIEwsIG9pZHN1ZmZpeCAKICAgICAqLwoKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1NUWVBFLCBBU05fSU5URUdFUiwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgM319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMVEFSR0VUQUREUkVTUywgICBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExCWVBBU1NST1VURVRBQkxFLCAgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERBVEFTSVpFLCAgICAgQVNOX1VOU0lHTkVELCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA2fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUSU1FT1VULCAgICAgIEFTTl9VTlNJR05FRCwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgN319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMUFJPQkVTUEVSSE9QLCBBU05fVU5TSUdORUQsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDh9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFBPUlQsICAgICAgICAgQVNOX1VOU0lHTkVELCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA5fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNQVhUVEwsICAgICAgIEFTTl9VTlNJR05FRCwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTB9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERTRklFTEQsICAgICAgQVNOX1VOU0lHTkVELCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMn19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTUywgICBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxM319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMSUZJTkRFWCwgICAgICAgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNSVNDT1BUSU9OUywgQVNOX09DVEVUX1NUUiwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWEZBSUxVUkVTLCAgQVNOX1VOU0lHTkVELCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxNn19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMRE9OVEZSQUdNRU5ULCAgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE3fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExJTklUSUFMVFRMLCAgIEFTTl9VTlNJR05FRCwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTh9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTEZSRVFVRU5DWSwgICAgQVNOX1VOU0lHTkVELCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxOX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU1RPUkFHRVRZUEUsICAgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIwfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExBRE1JTlNUQVRVUywgICBBU05fSU5URUdFUiwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjF9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERFU0NSLCAgICAgICBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyMn19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYUk9XUywgICAgICBBU05fVU5TSUdORUQsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUUkFQR0VORVJBVElPTiwgIEFTTl9PQ1RFVF9TVFIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExDUkVBVEVIT1BTRU5UUklFUywgQVNOX0lOVEVHRVIsIFJXUklURSwgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI1fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUWVBFLCAgICAgICAgQVNOX09CSkVDVF9JRCwgUldSSVRFLCB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFJPV1NUQVRVUywgICAgIEFTTl9JTlRFR0VSLCBSV1JJVEUsIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyN319Cgp9OwoKLyoKICogZ2xvYmFsIHN0b3JhZ2Ugb2Ygb3VyIGRhdGEsIHNhdmVkIGluIGFuZCBjb25maWd1cmVkIGJ5IGhlYWRlcl9jb21wbGV4KCkgCiAqLwoKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSA9IE5VTEw7CnN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSA9IE5VTEw7CnN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UgPSBOVUxMOwoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSk7CmludAp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpOwoKdm9pZAppbml0X3RyYWNlUm91dGVDdGxUYWJsZSh2b2lkKQp7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImluaXRpYWxpemluZy4uLiAgIikpOwogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoInRyYWNlUm91dGVDdGxUYWJsZSIsIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXMsCiAgICAgICAgICAgICAgICAgdmFyaWFibGUyLCB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCk7CgogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91ciBjb25maWcgaGFuZGxlcihzKSB0byBkZWFsIHdpdGggcmVnaXN0cmF0aW9ucyAKICAgICAqLwogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV90cmFjZVJvdXRlQ3RsVGFibGUsIE5VTEwsIE5VTEwpOwoKICAgIC8qCiAgICAgKiB3ZSBuZWVkIHRvIGJlIGNhbGxlZCBiYWNrIGxhdGVyIHRvIHN0b3JlIG91ciBkYXRhIAogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19TVE9SRV9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUsIE5VTEwpOwoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKfQoKCnZvaWQKaW5pdF90clJlc3VsdHNUYWJsZShzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0pCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpob3N0ID0gTlVMTDsKCiAgICBob3N0ID0KICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICoKICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSkpOwoKICAgIGlmIChob3N0ID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImhvc3QgY2FsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgYnplcm8oaG9zdCwgc2l6ZW9mKGNoYXIpICogKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSkpOwogICAgc3RyY3B5KGhvc3QsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgIGhvc3RbaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW5dID0gJ1wwJzsKCiAgICBTdG9yYWdlVG1wID0gU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSk7CiAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJTdG9yYWdlVG1wIG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICoKICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSkpOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZUN0bE93bmVySW5kZXggbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICdcMCc7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICoKICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICJ0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgbWFsbG9jICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dID0KICAgICAgICAnXDAnOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuOwoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyA9IDE7CgogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxCiAgICAgICAgfHwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDE2KSB7CiAgICAgICAgc3RydWN0IHNvY2thZGRyIHdoZXJldG87ICAgICAgICAvKiBXaG8gdG8gdHJ5IHRvIHJlYWNoICovCiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICp0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJndoZXJldG87CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaSA9IE5VTEw7CiAgICAgICAgaGkgPSBnZXRob3N0aW5mbyhob3N0KTsKICAgICAgICBpZiAoaGkgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImhpIGNhbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICBzZXRzaW4odG8sIGhpLT5hZGRyc1swXSk7CiAgICAgICAgaWYgKGluZXRfbnRvYSh0by0+c2luX2FkZHIpID09IE5VTEwpIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMDsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPSBzdHJkdXAoIiIpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkckxlbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihpbmV0X250b2EodG8tPnNpbl9hZGRyKSkgKyAxKSk7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwKICAgICAgICAgICAgICAgICAgIGluZXRfbnRvYSh0by0+c2luX2FkZHIpLAogICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSArIDEpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyW3N0cmxlbihpbmV0X250b2EodG8tPnNpbl9hZGRyKSldCiAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0KICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b2EodG8tPnNpbl9hZGRyKSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAyKSB7CgogICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgd2hlcmV0bzsgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnRvID0KICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJndoZXJldG87CiAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgICAgICAvKiBzdHJ1Y3QgaG9zdGVudiBocDsgKi8KICAgICAgICBjaGFyICAgICAgICAgICAgcGFbNjRdOwogICAgICAgIGJ6ZXJvKHBhLCA2NCk7CgogICAgICAgIHRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgIHRvLT5zaW42X3BvcnQgPSBodG9ucygzMzQzNCk7CgogICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGhvc3QsICZ0by0+c2luNl9hZGRyKSA+IDApIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMjsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnplcm8oU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsCiAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwgaG9zdCwKICAgICAgICAgICAgICAgICAgIHN0cmxlbihob3N0KSArIDEpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaG9zdCldID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSBzdHJsZW4oaG9zdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lMihob3N0LCBBRl9JTkVUNik7CiAgICAgICAgICAgIGlmIChocCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqaG9zdG5hbWU7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDI7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdG5hbWUpICsgMSkpOwogICAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiemVybyhTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihob3N0bmFtZSkgKyAxKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyW3N0cmxlbihob3N0bmFtZSldID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPQogICAgICAgICAgICAgICAgICAgIHN0cmxlbihob3N0bmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlOiB1bmtub3duIGhvc3QgJXNcbiIsIGhvc3QpKTsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAwOwogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPSBzdHJkdXAoIiIpOwogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzQ3VySG9wQ291bnQgPSAwOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJQcm9iZUNvdW50ID0gMDsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0gMDsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzVGVzdFN1Y2Nlc3NlcyA9IDA7CgogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhMZW4gPSAwOwoKICAgIGl0ZW0tPnRyYWNlUm91dGVSZXN1bHRzID0gU3RvcmFnZVRtcDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgaWYgKChoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnMpKSAhPSBOVUxMKSB7CiAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kZWwoaXRlbSk7CiAgICB9CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgIHZhcnMgPSBOVUxMOwogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVSZXN1bHRzICE9IE5VTEwpIHsKICAgICAgICBpZiAodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9hZGQoaXRlbSkgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImluaXQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICB9CiAgICB9Cgp9CgoKCmludAptb2RpZnlfdHJSZXN1bHRzT3BlcihzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEsIGxvbmcgdmFsKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzKSkgPT0gTlVMTCkgewogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwogICAgfSBlbHNlIHsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSB2YWw7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyIsICJkb25lLlxuIikpOwogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICB9Cn0KCgpzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKgpjcmVhdGVfdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEodm9pZCkKewogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIFN0b3JhZ2VOZXcgPSBTTk1QX01BTExPQ19TVFJVQ1QodHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEpOwogICAgaWYgKFN0b3JhZ2VOZXcgPT0gTlVMTCkgewogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAxOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUgPSAyOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gMzsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3AgPSAzOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFBvcnQgPSAzMzQzNDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNYXhUdGwgPSAzMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEU0ZpZWxkID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsSWZJbmRleCA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9IDU7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50ID0gMjsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gMTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPSAyOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbigiMDAiKSArIDEpOwogICAgaWYgKFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjciA9PSBOVUxMKSB7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3IsICIwMCIsIHN0cmxlbigiMDAiKSArIDEpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyW3N0cmxlbigiMDAiKV0gPSAnXDAnOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuID0KICAgICAgICBzdHJsZW4oU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyKTsKCiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWF4Um93cyA9IDUwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPSAyOwoKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUeXBlID0gY2FsbG9jKDEsIHNpemVvZihvaWQpICogc2l6ZW9mKDIpKTsgLyogMC4wICovCiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHlwZUxlbiA9IDI7CgogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZVJlc3VsdHMgPSBOVUxMOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZVByb2JlSGlzID0gTlVMTDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVIb3BzID0gTlVMTDsKCiAgICBTdG9yYWdlTmV3LT5zdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgLyogU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4PTA7ICovCiAgICByZXR1cm4gU3RvcmFnZU5ldzsKfQoKCi8qCiAqIHRyYWNlUm91dGVDdGxUYWJsZV9hZGQoKTogYWRkcyBhIHN0cnVjdHVyZSBub2RlIHRvIG91ciBkYXRhIHNldCAKICovCmludAp0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKCgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgLyoKICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAqLwoKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxPcGVyYXRpb25OYW1lICovCgogICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhKCZ0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCB2YXJzLCB0aGVkYXRhKQogICAgICAgID09IE5VTEwpIHsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9IGVsc2UgewoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgInJlZ2lzdGVyZWQgYW4gZW50cnlcbiIpKTsKCgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfQp9CgppbnQKdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpwID0gTlVMTDsKICAgIHAgPSB0aGVkYXRhLT50cmFjZVJvdXRlUmVzdWx0czsKICAgIGlmICh0aGVkYXRhLT50cmFjZVJvdXRlUmVzdWx0cyAhPSBOVUxMKSB7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgIC8qCiAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgKi8KCiAgICAgICAgaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEoJnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCk7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICB9IGVsc2UgewogICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiZXJyb3IuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICB9Cn0KCgppbnQKdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZChzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgaWYgKHRoZWRhdGEgIT0gTlVMTCkgewogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZ0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgsIHNpemVvZih0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgpKTsgICAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4KSk7ICAgICAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXgsIHNpemVvZih0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCkpOyAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4ICovCgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAvKgogICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICovCgogICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YQogICAgICAgICAgICAoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwKICAgICAgICAgICAgIHRoZWRhdGEpID09IE5VTEwpIHsKICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKCiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CgogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KfQoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGRhbGwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgcCA9IHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpczsKICAgIGlmICh0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXMgIT0gTlVMTCkKICAgICAgICBkbyB7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCkpOyAgICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmcC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4LCBzaXplb2YocC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4KSk7ICAgICAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4LCBzaXplb2YocC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXgpKTsgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCAqLwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgdmFyc19saXN0LAogICAgICAgICAgICAgICAgIHApID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRlbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgdGVtcCA9IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpbmcgZGF0YSx2YXJzX29pZD0iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHT0lEKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC0+bmFtZSwgdGVtcC0+bmFtZWxlbikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodGVtcCAhPSBOVUxMKTsKCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgZmluaXNoZWRcbiIpKTsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwID0gcC0+bmV4dDsKICAgICAgICB9IHdoaWxlIChwICE9IE5VTEwpOwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICB9Cgp9CgoKCmludAp0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CgogICAgaWYgKHRoZWRhdGEgIT0gTlVMTCkgewogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZ0aGVkYXRhLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlSG9wc0hvcEluZGV4ICovCgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgKCZ0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LCB0aGVkYXRhKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKfQoKaW50CnRyYWNlUm91dGVIb3BzVGFibGVfYWRkYWxsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqcCA9IE5VTEw7CiAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgcCA9IHRoZWRhdGEtPnRyYWNlUm91dGVIb3BzOwogICAgaWYgKHRoZWRhdGEtPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpIHsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnAtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgsIHNpemVvZihwLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4KSk7ICAgICAgIC8qIHRyYWNlUm91dGVIb3BzSG9wSW5kZXggKi8KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YQogICAgICAgICAgICAgICAgKCZ0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LCBwKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0ZW1wID0gTlVMTDsKICAgICAgICAgICAgICAgIHRlbXAgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpbmcgZGF0YSx2YXJzX29pZD0iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHT0lEKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC0+bmFtZSwgdGVtcC0+bmFtZWxlbikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodGVtcCAhPSBOVUxMKTsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwoKICAgICAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQoKfQoKCnVuc2lnbmVkIGxvbmcKdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2NvdW50KHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwogICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICB2YXJzID0gTlVMTDsKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgoKCnVuc2lnbmVkIGxvbmcKdHJhY2VSb3V0ZUhvcHNUYWJsZV9jb3VudChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3BlcmF0aW9uTmFtZSAqLwoKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICB2YXJzID0gTlVMTDsKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKCgp2b2lkCnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWxMYXN0KHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpbGFzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW4gPSAwOwogICAgdGltZV90ICAgICAgICAgIGxhc3RfdGltZSA9IDIxNDc0ODM2NDc7CiAgICB0aW1lX3QgICAgICAgICAgdHA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3BlcmF0aW9uTmFtZSAqLwoKICAgIGJ6ZXJvKG5ld29pZCwgc2l6ZW9mKG9pZCkgKiBNQVhfT0lEX0xFTik7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lsYXN0ID0gaGNpcHRyMiA9IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2U7CiAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKCiAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0X2Zyb21fb2lkCiAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgaGNpcHRyMi0+bmFtZSwKICAgICAgICAgICAgICAgICBoY2lwdHIyLT5uYW1lbGVuKTsKICAgICAgICAgICAgdHAgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZV90aW1lOwoKICAgICAgICAgICAgaWYgKGxhc3RfdGltZSA+IHRwKSB7CiAgICAgICAgICAgICAgICBsYXN0X3RpbWUgPSB0cDsKICAgICAgICAgICAgICAgIGhjaWxhc3QgPSBoY2lwdHIyOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIGhjaWxhc3QpOwogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAiZGVsZXRlIHRoZSBsYXN0IG9uZSBzdWNjZXNzIVxuIikpOwogICAgdmFycyA9IE5VTEw7Cn0KCgoKdm9pZAp0cmFjZVJvdXRlQ3RsVGFibGVfY2xlYW5lcihzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRoZXN0dWZmKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJjbGVhbmVyb3V0ICAiKSk7CiAgICBmb3IgKGhjaXB0ciA9IHRoZXN0dWZmOyBoY2lwdHIgIT0gTlVMTDsgaGNpcHRyID0gaGNpcHRyLT5uZXh0KSB7CiAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CgogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImNsZWFuZXIgICIpKTsKICAgIH0KfQoKCi8qCiAqIHBhcnNlX210ZU9iamVjdHNUYWJsZSgpOgogKiAgIHBhcnNlcyAuY29uZiBmaWxlIGVudHJpZXMgbmVlZGVkIHRvIGNvbmZpZ3VyZSB0aGUgbWliLgogKi8Kdm9pZApwYXJzZV90cmFjZVJvdXRlQ3RsVGFibGUoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPQogICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSk7CgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJwYXJzaW5nIGNvbmZpZy4uLiAgIikpOwoKCiAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWFsbG9jIGZhaWx1cmUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXgiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHJhcERlc2NyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cywgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQkpFQ1RfSUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHlwZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChTdG9yYWdlVG1wKTsKICAgIC8qICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfY2xlYW5lcih0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlKTsgKi8KCiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImRvbmUuXG4iKSk7Cn0KCgoKLyoKICogc3RvcmVfdHJhY2VSb3V0ZUN0bFRhYmxlKCk6CiAqICAgc3RvcmVzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwppbnQKc3RvcmVfdHJhY2VSb3V0ZUN0bFRhYmxlKGludCBtYWpvcklELCBpbnQgbWlub3JJRCwgdm9pZCAqc2VydmVyYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBjaGFyICAgICAgICAgICAgbGluZVtTTk1QX01BWEJVRl07CiAgICBjaGFyICAgICAgICAgICAqY3B0ciA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpbmRleCA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAic3RvcmluZyBkYXRhLi4uICAiKSk7CgoKICAgIGZvciAoaGNpbmRleCA9IHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2U7IGhjaW5kZXggIT0gTlVMTDsKICAgICAgICAgaGNpbmRleCA9IGhjaW5kZXgtPm5leHQpIHsKICAgICAgICBTdG9yYWdlVG1wID0gKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqKSBoY2luZGV4LT5kYXRhOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgIT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICAgICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CiAgICAgICAgICAgIHN0cmNhdChsaW5lLCAidHJhY2VSb3V0ZUN0bFRhYmxlICIpOwogICAgICAgICAgICBjcHRyID0gbGluZSArIHN0cmxlbihsaW5lKTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxJbml0aWFsVHRsLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQkpFQ1RfSUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCgoKICAgICAgICAgICAgc25tcGRfc3RvcmVfY29uZmlnKGxpbmUpOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgoKCi8qCiAqIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUoKToKICogICBIYW5kbGUgdGhpcyB0YWJsZSBzZXBhcmF0ZWx5IGZyb20gdGhlIHNjYWxhciB2YWx1ZSBjYXNlLgogKiAgIFRoZSB3b3JraW5ncyBvZiB0aGlzIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgZm9yIHZhcl9tdGVPYmplY3RzVGFibGUgYWJvdmUuCiAqLwp1bnNpZ25lZCBjaGFyICAqCnZhcl90cmFjZVJvdXRlQ3RsVGFibGUoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewoKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgLyoKICAgICAqIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSByZWdpc3RlcmVkIGFsbCB5b3VyIGRhdGEgcHJvcGVybHkKICAgICAqLwogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgdnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkpID09IE5VTEwpIHsKICAgICAgICBpZiAodnAtPm1hZ2ljID09IENPTFVNTl9UUkFDRVJPVVRFQ1RMUk9XU1RBVFVTKQogICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1czsKCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIHRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHZhbHVlIGFzc2lnbm1lbnRzIGZvciB0aGUgbWliIHJlc3VsdHMuCiAgICAgKi8KICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CgoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExCWVBBU1NST1VURVRBQkxFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERBVEFTSVpFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRGF0YVNpemU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRJTUVPVVQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUaW1lT3V0OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUFJPQkVTUEVSSE9QOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3ApOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3A7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFBPUlQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxQb3J0OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYVFRMOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWF4VHRsOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGw7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERTRklFTEQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEU0ZpZWxkOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTU1RZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMSUZJTkRFWDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bElmSW5kZXg7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNSVNDT1BUSU9OUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYRkFJTFVSRVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhGYWlsdXJlczsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRE9OVEZSQUdNRU5UOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTElOSVRJQUxUVEw6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRlJFUVVFTkNZOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRnJlcXVlbmN5OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3k7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFNUT1JBR0VUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTEFETUlOU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXM7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXM7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERFU0NSOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRGVzY3I7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhST1dTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWF4Um93czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRSQVBHRU5FUkFUSU9OOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExDUkVBVEVIT1BTRU5UUklFUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZUxlbikgKiBzaXplb2Yob2lkKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFJPV1NUQVRVUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRVJST1JfTVNHKCIiKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKCmludAp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBiemVybyhuZXdvaWQsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCgoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW4gPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBiemVybyhuZXdvaWQsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwoKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyMik7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRlICBzdWNjZXNzIVxuIikpOwoKICAgICAgICB9CiAgICB9CiAgICB2YXJzID0gTlVMTDsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKdHJhY2VSb3V0ZUhvcHNUYWJsZV9kZWwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW4gPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgYnplcm8obmV3b2lkLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogc2VuZCB0cmFwIAogKi8KCnZvaWQKc2VuZF90cmFjZVJvdXRlX3RyYXAoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICppdGVtLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiB0cmFwX29pZCwgc2l6ZV90IHRyYXBfb2lkX2xlbikKewogICAgc3RhdGljIG9pZCAgICAgIG9iamlkX3NubXB0cmFwW10gPSB7IDEsIDMsIDYsIDEsIDYsIDMsIDEsIDEsIDQsIDEsIDAgfTsgICAgIC8qIHNubXBUcmFwSU9ELjAgKi8KICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VIb3BzID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyX2xpc3QgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyX2hvcHMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CgogICAgb2lkICAgICAgICAgICAgIGluZGV4b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBpbmRleG9pZF9sZW4gPSAwOwoKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyOwogICAgb2lkICAgICAgICAgICAgIHRlbXBvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIHRlbXBvaWRfbGVuID0gMDsKCiAgICBvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgMiwgMSwgNCB9OwogICAgb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ0FkZHJlc3NbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgNSwgMSwgMyB9OwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAvKgogICAgICogc25tcFRyYXAgb2lkIAogICAgICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgb2JqaWRfc25tcHRyYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvYmppZF9zbm1wdHJhcCkgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09CSkVDVF9JRCwgKHVfY2hhciAqKSB0cmFwX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhcF9vaWRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIC8qCiAgICAgKiB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyAKICAgICAqLwogICAgYnplcm8obmV3b2lkLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcykgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgZm9yIChoY2lwdHIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0ciA9IGhjaXB0ci0+bmV4dCkgewogICAgICAgIGJ6ZXJvKGluZGV4b2lkLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQoaW5kZXhvaWQsICZpbmRleG9pZF9sZW4sIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMpOwogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgIChpbmRleG9pZCwgaW5kZXhvaWRfbGVuLCBoY2lwdHItPm5hbWUsIGluZGV4b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICBTdG9yYWdlSG9wcyA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqKQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0X2Zyb21fb2lkKHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0ci0+bmFtZSwgaGNpcHRyLT5uYW1lbGVuKTsKICAgICAgICAgICAgYnplcm8odGVtcG9pZCwgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZCh0ZW1wb2lkLCAmdGVtcG9pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGdBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVIb3BzSXBUZ0FkZHJlc3MpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2hvcHMsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJlN0b3JhZ2VIb3BzLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4LCBzaXplb2YoU3RvcmFnZUhvcHMtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgpKTsgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgICAgIGJ6ZXJvKG5ld29pZCwgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCB0ZW1wb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9pZF9sZW4sIHZhcl9ob3BzKTsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgU3RvcmFnZUhvcHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VIb3BzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbik7CgogICAgICAgICAgICB2YXJfaG9wcyA9IE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBYWFg6IHN0dWZmIGJhc2VkIG9uIGV2ZW50IHRhYmxlIAogICAgICovCgogICAgREVCVUdNU0coKCJwaW5nVGVzdDpzZW5kX3RyYWNlUm91dGVfdHJhcCIsICJzdWNjZXNzIVxuIikpOwoKICAgIHNlbmRfdjJ0cmFwKHZhcl9saXN0KTsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJfbGlzdCk7CiAgICB2YXJfbGlzdCA9IE5VTEw7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLCB2YXJfdmFsLAogICAgICAgICAgICAgICB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyA9IE5VTEw7CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gdG1wbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRSh0bXB2YXIpOwogICAgICAgIHRtcHZhciA9IE5VTEw7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cgp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERhdGFTaXplKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemU7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSA2NTUwNykKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IDU2OwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxUaW1lT3V0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0OwoKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDYwKQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9IDM7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxMCkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gMzsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUG9ydChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhUdGwoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsOwogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMSAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMjU1KQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwgPSAzMDsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxEU0ZpZWxkKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzLCB2YXJfdmFsLAogICAgICAgICAgICAgICB2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4gPSB2YXJfdmFsX2xlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bElmSW5kZXgoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXg7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICB0bXB2YXIgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXM7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxNSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9IDE7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxEb250RnJhZ21lbnQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxJbml0aWFsVHRsKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDAgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDI1NSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSAxOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxGcmVxdWVuY3koaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5OwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIGludCAgICAgICAgICAgICBzZXRfdmFsdWU7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgoKICAgIHNldF92YWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CgogICAgICAgIGlmICgoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID09IDIKICAgICAgICAgICAgIHx8IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9PSAzKQogICAgICAgICAgICAmJiAoc2V0X3ZhbHVlID09IDQgfHwgc2V0X3ZhbHVlID09IDUpKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bElmSW5kZXggbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgU3RvcmFnZU5ldyA9CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycyk7CgogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMQogICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyA9PSBOVUxMKQogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gMTsKICAgICAgICAgICAgICAgIG1vZGlmeV90clJlc3VsdHNPcGVyKFN0b3JhZ2VUbXAsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ICE9IDApCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgc25tcF9hbGFybV9yZWdpc3RlcihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3RyYWNlUm91dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CgogICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID09IDIKICAgICAgICAgICAgICAgICAgICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fdW5yZWdpc3RlcihTdG9yYWdlVG1wLT50aW1lcl9pZCk7CiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpCiAgICAgICAgICAgICAgICBpbml0X3RyUmVzdWx0c1RhYmxlKFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSAyOwogICAgICAgICAgICAgICAgbW9kaWZ5X3RyUmVzdWx0c09wZXIoU3RvcmFnZVRtcCwgMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxEZXNjcihpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjcjsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9IChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyLCB2YXJfdmFsLCB2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjclt2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuID0gdG1wbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRSh0bXB2YXIpOwogICAgICAgIHRtcHZhciA9IE5VTEw7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWF4Um93cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERTRmllbGQgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbihpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24sIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPSBOVUxMOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERTRmllbGQgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUeXBlIG5vdCBBU05fT0JKRUNUX0lEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGU7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID0gKG9pZCAqKSBtYWxsb2ModmFyX3ZhbF9sZW4pOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuID0gdmFyX3ZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgc3RhdGljIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKICAgIHN0YXRpYyBpbnQgICAgICBvbGRfdmFsdWU7CiAgICBpbnQgICAgICAgICAgICAgc2V0X3ZhbHVlOwogICAgc3RhdGljIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciA9IE5VTEw7CgogICAgU3RvcmFnZVRtcCA9CiAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwgTlVMTCk7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUiB8fCB2YXJfdmFsID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsUm93U3RhdHVzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgIH0KICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHNldF92YWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CgoKICAgIC8qCiAgICAgKiBjaGVjayBsZWdhbCByYW5nZSwgYW5kIG5vdFJlYWR5IGlzIHJlc2VydmVkIGZvciB1cywgbm90IGEgdXNlciAKICAgICAqLwogICAgaWYgKHNldF92YWx1ZSA8IDEgfHwgc2V0X3ZhbHVlID4gNiB8fCBzZXRfdmFsdWUgPT0gUlNfTk9UUkVBRFkpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwoKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAvKgogICAgICAgICAqIHN0YWdlIG9uZTogdGVzdCB2YWxpZGl0eSAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNyZWF0ZSB0aGUgcm93IG5vdz8gCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGl0Y2ggaWxsZWdhbCB2YWx1ZXMgbm93IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19BQ1RJVkUgfHwgc2V0X3ZhbHVlID09IFJTX05PVElOU0VSVklDRSkgewoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVzdHJveWluZyBhIG5vbi1leGlzdGVudCByb3cgaXMgYWN0dWFsbHkgbGVnYWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlsbGVnYWwgY3JlYXRpb24gdmFsdWVzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19BQ1RJVkUgfHwgc2V0X3ZhbHVlID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGV4aXN0cy4gIENoZWNrIGZvciBhIHZhbGlkIHN0YXRlIGNoYW5nZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5ER08KICAgICAgICAgICAgICAgIHx8IHNldF92YWx1ZSA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogY2FuJ3QgY3JlYXRlIGEgcm93IHRoYXQgZXhpc3RzIAogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGludGVyYWN0aW9uIHdpdGggcm93IHN0b3JhZ2UgdHlwZSBuZWVkZWQgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFICYmCiAgICAgICAgICAgICAgICBzZXRfdmFsdWUgIT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICJPbmNlIG1hZGUgYWN0aXZlIGFuIGVudHJ5IG1heSBub3QgYmUgbW9kaWZpZWQgZXhjZXB0IHRvIAogICAgICAgICAgICAgICAgICogZGVsZXRlIGl0LiIgIFhYWDogZG9lc24ndCB0aGlzIGluIGZhY3QgYXBwbHkgdG8gQUxMCiAgICAgICAgICAgICAgICAgKiBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhbmQgbm90IGp1c3QgdGhpcyBvbmU/ICAKICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgIT0gU1RfTk9OVk9MQVRJTEUpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CgogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNyZWF0aW9uIAogICAgICAgICAgICAgKi8KCgogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCBOVUxMLCAwKTsgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIE5VTEwsIDApOyAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfcGFyc2Vfb2lkCiAgICAgICAgICAgICAgICAoJgogICAgICAgICAgICAgICAgIChuYW1lCiAgICAgICAgICAgICAgICAgIFtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgMl0pLCBuZXdsZW4sIHZhcnMpICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFN0b3JhZ2VOZXcgPSBjcmVhdGVfdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEoKTsKICAgICAgICAgICAgaWYgKHZhcnMtPnZhbF9sZW4gPD0gMzIpIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICBtYWxsb2ModmFycy0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIHZhcnMtPnZhbC5zdHJpbmcsIHZhcnMtPnZhbF9sZW4pOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbdmFycy0+dmFsX2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPSB2YXJzLT52YWxfbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPSBtYWxsb2MoMzMpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIHZhcnMtPnZhbC5zdHJpbmcsIDMyKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4WzMyXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9IDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXJzID0gdmFycy0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIGlmICh2YXJzLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIG1hbGxvYyh2YXJzLT52YWxfbGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB2YXJzLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgIHZhcnMtPnZhbF9sZW4pOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW3ZhcnMtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9IHZhcnMtPnZhbF9sZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPSBtYWxsb2MoMzMpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdmFycy0+dmFsLnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAzMik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbMzJdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9IDMyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhcnMgPSB2YXJzLT5uZXh0X3ZhcmlhYmxlOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmaWxsIGluIGRlZmF1bHQgcm93IHZhbHVlcyBoZXJlIGludG8gU3RvcmFnZU5ldyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gc2V0X3ZhbHVlOwoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzLCBubyBsb25nZXIgbmVlZGVkPyAKICAgICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzIAogICAgICAgICAqLwogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gc2V0X3ZhbHVlIGZvciB5b3UgdG8KICAgICAgICAgKiB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluCiAgICAgICAgICogdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBjcmVhdGlvbiwgc28gYWRkIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXcgIT0gTlVMTCkgewojaWYgMQogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBlbnRlcmluZyBuZXc9JWQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbikpOwojZW5kaWYKICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV9hZGQoU3RvcmFnZU5ldyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogYWNrLCBhbmQgaWYgaXQgaXMgTlVMTD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSBpZiAoc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogc2V0IHRoZSBmbGFnPyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9sZF92YWx1ZSA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXM7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3kuLi4gIGV4dHJhY3QgaXQgZm9yIG5vdyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBoY2lwdHIgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZmluZF9lbnRyeSh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIpOwogICAgICAgICAgICBzbm1wX2FsYXJtX3VucmVnaXN0ZXIoU3RvcmFnZURlbC0+dGltZXJfaWQpOwoKICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kZWwoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWwoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzVGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGNyZWF0aW9uLCBzbyByZW1vdmUgaXQgYWdhaW4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoY2lwdHIgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZmluZF9lbnRyeSh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBkZWxldGlvbiwgc28gYWRkIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChTdG9yYWdlRGVsKTsKICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGRhbGwoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzVGFibGVfYWRkYWxsKFN0b3JhZ2VEZWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPSBvbGRfdmFsdWU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSBpdCwgaXRzIGRlYWQgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wCiAgICAgICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0NSRUFURUFOREdPKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gUlNfQUNUSVZFOwogICAgICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VUbXAgJiYKICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09CiAgICAgICAgICAgICAgICAgICAgICAgUlNfQ1JFQVRFQU5EV0FJVCkgewoKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKI2lmIDEKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzIGVudGVyaW5nIHJ1bmJlZm9yZT0lbGQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlKSk7CgojZW5kaWYKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpbml0X3RyUmVzdWx0c1RhYmxlKFN0b3JhZ2VUbXApOwogICAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgIT0gMCkKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQV9SRVBFQVQsIHJ1bl90cmFjZVJvdXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRpbWVyX2lkID0KICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9hbGFybV9yZWdpc3RlcigxLCAwLCBydW5fdHJhY2VSb3V0ZSwgU3RvcmFnZVRtcCk7CgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKdm9pZApydW5fdHJhY2VSb3V0ZSh1bnNpZ25lZCBpbnQgY2xpZW50cmVnLCB2b2lkICpjbGllbnRhcmcpCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqaXRlbSA9IGNsaWVudGFyZzsKICAgIHVfc2hvcnQgICAgICAgICBwb3J0ID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFBvcnQ7ICAgICAvKiBzdGFydCB1ZHAgZGVzdCBwb3J0ICMgZm9yIHByb2JlIHBhY2tldHMgz+C1sdPaY3RscG9ydCAqLwogICAgaW50ICAgICAgICAgICAgIHdhaXR0aW1lID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQ7ICAgICAgLyogdGltZSB0byB3YWl0IGZvciByZXNwb25zZSAoaW4gc2Vjb25kcykgz+C1yNPaY3RsdGltZW91dCAqLwogICAgaW50ICAgICAgICAgICAgIG5wcm9iZXMgPSBpdGVtLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wOwoKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA+IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAiZmlyc3QgdHRsICglbHUpIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIG1heCB0dGwgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwsCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBjaGFyICAgICAgICAgICAqb2xkX0hvcHNBZGRyZXNzWzI1NV07CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIGZsYWcgPSAwOwoKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMQogICAgICAgIHx8IGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxNikgewogICAgICAgIHJlZ2lzdGVyIGludCAgICBjb2RlLCBuOwogICAgICAgIGNvbnN0ICAgIGNoYXIgICpjcDsKICAgICAgICByZWdpc3RlciBjb25zdCBjaGFyICplcnI7CiAgICAgICAgcmVnaXN0ZXIgdV9jaGFyICpvdXRwOwogICAgICAgIHJlZ2lzdGVyIHVfaW50MzJfdCAqYXA7CiAgICAgICAgc3RydWN0IHNvY2thZGRyIHdoZXJldG87ICAgICAgICAvKiBXaG8gdG8gdHJ5IHRvIHJlYWNoICovCiAgICAgICAgc3RydWN0IHNvY2thZGRyIHdoZXJlZnJvbTsgICAgICAvKiBXaG8gd2UgYXJlICovCgogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSA9CiAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJndoZXJlZnJvbTsKICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRvID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmd2hlcmV0bzsKICAgICAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGluZm8gKmhpOwogICAgICAgIGludCAgICAgICAgICAgICBvbiA9IDE7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHByb3RvZW50ICpwZTsKICAgICAgICByZWdpc3RlciBpbnQgICAgdHRsLCBwcm9iZSwgaTsKICAgICAgICByZWdpc3RlciBpbnQgICAgc2VxID0gMDsKICAgICAgICBpbnQgICAgICAgICAgICAgdG9zID0gMCwgc2V0dG9zID0gMDsKICAgICAgICByZWdpc3RlciBpbnQgICAgbHNyciA9IDA7CiAgICAgICAgcmVnaXN0ZXIgdV9zaG9ydCBvZmYgPSAwOwogICAgICAgIHN0cnVjdCBpZmFkZHJsaXN0ICphbDsKICAgICAgICBjaGFyICAgICAgICAgICAgZXJyYnVmWzEzMl07CiAgICAgICAgaW50ICAgICAgICAgICAgIG1pbnBhY2tldCA9IDA7ICAvKiBtaW4gaXAgcGFja2V0IHNpemUgKi8KCgogICAgICAgIHN0cnVjdCBpcCAgICAgICpvdXRpcDsgIC8qIGxhc3Qgb3V0cHV0ICh1ZHApIHBhY2tldCAqLwogICAgICAgIHN0cnVjdCB1ZHBoZHIgICpvdXR1ZHA7IC8qIGxhc3Qgb3V0cHV0ICh1ZHApIHBhY2tldCAqLwogICAgICAgIGludCAgICAgICAgICAgICBwYWNrbGVuID0gMDsgICAgLyogdG90YWwgbGVuZ3RoIG9mIHBhY2tldCAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRsZW4gPSAwOyAgICAgLyogbGVuZ3RoIG9mIGlwIG9wdGlvbnMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0aW9ucyA9IDA7ICAgIC8qIHNvY2tldCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHM7ICAgICAgLyogcmVjZWl2ZSAoaWNtcCkgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwogICAgICAgIGludCAgICAgICAgICAgICBzbmRzb2NrOyAgICAgICAgLyogc2VuZCAodWRwL2ljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KCiAgICAgICAgdV9zaG9ydCAgICAgICAgIGlkZW50OwogICAgICAgIC8qCiAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIGdhdGV3YXkgbGlzdCAoaW5jbHVkaW5nIHJvb20gZm9yIGZpbmFsIGRlc3RpbmF0aW9uKSAKICAgICAgICAgKi8KICAgICAgICB1X2ludDMyX3QgICAgICAgZ3dsaXN0W05HQVRFV0FZUyArIDFdOwogICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRldm51bGxbXSA9ICIvZGV2L251bGwiOwogICAgICAgIGNoYXIgICAgICAgICAgICpkZXZpY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpzb3VyY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpob3N0bmFtZTsKICAgICAgICB1X2ludCAgICAgICAgICAgcGF1c2Vtc2VjcyA9IDA7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHBhY2tldFs1MTJdOyAgICAvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLwoKICAgICAgICBpbnQgICAgICAgICAgICAgcG10dSA9IDA7ICAgICAgIC8qIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KCiAgICAgICAgc3RydWN0IG91dGRhdGEgKm91dGRhdGE7ICAgICAgICAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KCiAgICAgICAgbWlucGFja2V0ID0gc2l6ZW9mKCpvdXRpcCkgKyBzaXplb2YoKm91dGRhdGEpICsgb3B0bGVuOwogICAgICAgIG1pbnBhY2tldCArPSBzaXplb2YoKm91dHVkcCk7CiAgICAgICAgcGFja2xlbiA9IG1pbnBhY2tldDsgICAgLyogbWluaW11bSBzaXplZCBwYWNrZXQgKi8KCiAgICAgICAgaG9zdG5hbWUgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKTsKICAgICAgICBpZiAoaG9zdG5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIG1lbWNweShob3N0bmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaG9zdG5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW5dID0gJ1wwJzsKCiAgICAgICAgaGkgPSBnZXRob3N0aW5mbyhob3N0bmFtZSk7CiAgICAgICAgc2V0c2luKHRvLCBoaS0+YWRkcnNbMF0pOwogICAgICAgIGlmIChoaS0+biA+IDEpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogJXMgaGFzIG11bHRpcGxlIGFkZHJlc3NlczsgdXNpbmcgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lLCBpbmV0X250b2EodG8tPnNpbl9hZGRyKSkpOwogICAgICAgIGhvc3RuYW1lID0gaGktPm5hbWU7CiAgICAgICAgaGktPm5hbWUgPSBOVUxMOwogICAgICAgIGZyZWVob3N0aW5mbyhoaSk7CgoKI2lmZGVmIEhBVkVfU0VUTElORUJVRgogICAgICAgIHNldGxpbmVidWYoc3Rkb3V0KTsKI2Vsc2UKICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTEJGLCAwKTsKI2VuZGlmCgogICAgICAgIG91dGlwID0gKHN0cnVjdCBpcCAqKSBtYWxsb2MocGFja2xlbik7CiAgICAgICAgaWYgKG91dGlwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYWxsb2M6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KChjaGFyICopIG91dGlwLCAwLCBwYWNrbGVuKTsKCiAgICAgICAgb3V0aXAtPmlwX3YgPSBJUFZFUlNJT047CiAgICAgICAgaWYgKHNldHRvcykKICAgICAgICAgICAgb3V0aXAtPmlwX3RvcyA9IHRvczsKI2lmZGVmIEJZVEVTV0FQX0lQX0hEUgogICAgICAgIG91dGlwLT5pcF9sZW4gPSBodG9ucyhwYWNrbGVuKTsKICAgICAgICBvdXRpcC0+aXBfb2ZmID0gaHRvbnMob2ZmKTsKI2Vsc2UKICAgICAgICBvdXRpcC0+aXBfbGVuID0gcGFja2xlbjsKICAgICAgICBvdXRpcC0+aXBfb2ZmID0gb2ZmOwojZW5kaWYKICAgICAgICBvdXRwID0gKHVfY2hhciAqKSAob3V0aXAgKyAxKTsKI2lmZGVmIEhBVkVfUkFXX09QVElPTlMKICAgICAgICBpZiAobHNyciA+IDApIHsKICAgICAgICAgICAgcmVnaXN0ZXIgdV9jaGFyICpvcHRsaXN0OwoKICAgICAgICAgICAgb3B0bGlzdCA9IG91dHA7CiAgICAgICAgICAgIG91dHAgKz0gb3B0bGVuOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZmluYWwgaG9wIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ3dsaXN0W2xzcnJdID0gdG8tPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgICAgIG91dGlwLT5pcF9kc3Quc19hZGRyID0gZ3dsaXN0WzBdOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZm9yY2UgNCBieXRlIGFsaWdubWVudCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMF0gPSBJUE9QVF9OT1A7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGxvb3NlIHNvdXJjZSByb3V0ZSBvcHRpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzFdID0gSVBPUFRfTFNSUjsKICAgICAgICAgICAgaSA9IGxzcnIgKiBzaXplb2YoZ3dsaXN0WzBdKTsKICAgICAgICAgICAgb3B0bGlzdFsyXSA9IGkgKyAzOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQb2ludGVyIHRvIExTUlIgYWRkcmVzc2VzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFszXSA9IElQT1BUX01JTk9GRjsKICAgICAgICAgICAgbWVtY3B5KG9wdGxpc3QgKyA0LCBnd2xpc3QgKyAxLCBpKTsKICAgICAgICB9IGVsc2UKI2VuZGlmCiAgICAgICAgICAgIG91dGlwLT5pcF9kc3QgPSB0by0+c2luX2FkZHI7CiAgICAgICAgb3V0aXAtPmlwX2hsID0gKG91dHAgLSAodV9jaGFyICopIG91dGlwKSA+PiAyOwogICAgICAgIGlkZW50ID0gKGdldHBpZCgpICYgMHhmZmZmKSB8IDB4ODAwMDsKCiAgICAgICAgb3V0aXAtPmlwX3AgPSBJUFBST1RPX1VEUDsKCiAgICAgICAgb3V0dWRwID0gKHN0cnVjdCB1ZHBoZHIgKikgb3V0cDsKICAgICAgICBvdXR1ZHAtPnNvdXJjZSA9IGh0b25zKGlkZW50KTsKICAgICAgICBvdXR1ZHAtPmxlbiA9CiAgICAgICAgICAgIGh0b25zKCh1X3Nob3J0KSAocGFja2xlbiAtIChzaXplb2YoKm91dGlwKSArIG9wdGxlbikpKTsKICAgICAgICBvdXRkYXRhID0gKHN0cnVjdCBvdXRkYXRhICopIChvdXR1ZHAgKyAxKTsKCiAgICAgICAgY3AgPSAiaWNtcCI7CiAgICAgICAgaWYgKChwZSA9IGdldHByb3RvYnluYW1lKGNwKSkgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgJXNcbiIsIGNwKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIEluc3VyZSB0aGUgc29ja2V0IGZkcyB3b24ndCBiZSAwLCAxIG9yIDIgCiAgICAgICAgICovCiAgICAgICAgaWYgKG9wZW4oZGV2bnVsbCwgT19SRE9OTFkpIDwgMCB8fAogICAgICAgICAgICBvcGVuKGRldm51bGwsIE9fUkRPTkxZKSA8IDAgfHwgb3BlbihkZXZudWxsLCBPX1JET05MWSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAib3BlbiBcIiVzXCI6ICVzXG4iLCBkZXZudWxsLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKChzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBwZS0+cF9wcm90bykpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImljbXAgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIGlmIChvcHRpb25zICYgU09fREVCVUcpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0RFQlVHLCAoY2hhciAqKSAmb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbikpOwogICAgICAgIGlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiNpZm5kZWYgX19ocHV4CiAgICAgICAgcHJpbnRmKCJyYXdcbiIpOwogICAgICAgIHNuZHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKI2Vsc2UKICAgICAgICBwcmludGYoInVkcFxuIik7CiAgICAgICAgc25kc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19VRFApOwojZW5kaWYKICAgICAgICBpZiAoc25kc29jayA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyYXcgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojaWYgZGVmaW5lZChJUF9PUFRJT05TKSAmJiAhZGVmaW5lZChIQVZFX1JBV19PUFRJT05TKQogICAgICAgIGlmIChsc3JyID4gMCkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgb3B0bGlzdFtNQVhfSVBPUFRMRU5dOwoKICAgICAgICAgICAgY3AgPSAiaXAiOwogICAgICAgICAgICBpZiAoKHBlID0gZ2V0cHJvdG9ieW5hbWUoY3ApKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHByb3RvY29sICVzXG4iLCBjcCkpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmaW5hbCBob3AgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnd2xpc3RbbHNycl0gPSB0by0+c2luX2FkZHIuc19hZGRyOwogICAgICAgICAgICArK2xzcnI7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFswXSA9IElQT1BUX05PUDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOwogICAgICAgICAgICBpID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOwogICAgICAgICAgICBvcHRsaXN0WzJdID0gaSArIDM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOwogICAgICAgICAgICBtZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCwgaSk7CgogICAgICAgICAgICBpZiAoKHNldHNvY2tvcHQoc25kc29jaywgcGUtPnBfcHJvdG8sIElQX09QVElPTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBvcHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIHNpemVvZihnd2xpc3RbMF0pKSkgPCAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgIklQX09QVElPTlM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKI2lmZGVmIFNPX1NOREJVRgogICAgICAgIGlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikgJnBhY2tsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhY2tsZW4pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJTT19TTkRCVUY6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgojaWZkZWYgSVBfSERSSU5DTAogICAgICAgIGlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX0hEUklOQ0wsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJJUF9IRFJJTkNMOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojZWxzZQojaWZkZWYgSVBfVE9TCiAgICAgICAgaWYgKHNldHRvcyAmJiBzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RPUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnRvcywgc2l6ZW9mKHRvcykpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInNldHNvY2tvcHQgdG9zICVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojZW5kaWYKI2VuZGlmCiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICAvKgogICAgICAgICAqIEdldCB0aGUgaW50ZXJmYWNlIGFkZHJlc3MgbGlzdCAKICAgICAgICAgKi8KICAgICAgICBuID0gaWZhZGRybGlzdCgmYWwsIGVycmJ1Zik7CiAgICAgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIGlmYWRkcmxpc3Q6ICVzXG4iLCBlcnJidWYpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG4gPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW4ndCBmaW5kIGFueSBuZXR3b3JrIGludGVyZmFjZXNcbiIpKTsKCiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIExvb2sgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIAogICAgICAgICAqLwogICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkgewogICAgICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgLS1pLCArK2FsKQogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChkZXZpY2UsIGFsLT5kZXZpY2UpID09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChpIDw9IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW4ndCBmaW5kIGludGVyZmFjZSAlLjMyc1xuIiwgZGV2aWNlKSk7CgogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIERldGVybWluZSBvdXIgc291cmNlIGFkZHJlc3MgCiAgICAgICAgICovCiAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIGEgZGV2aWNlIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGUgaW50ZXJmYWNlIGFkZHJlc3MuCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgdHJ5IHRvIGRldGVybWluZSBvdXIgc291cmNlIGFkZHJlc3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZGV2aWNlICE9IE5VTEwpCiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgYWwtPmFkZHIpOwogICAgICAgICAgICBlbHNlIGlmICgoZXJyID0gZmluZHNhZGRyKHRvLCBmcm9tKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpbmRzYWRkcjogJXNcbiIsIGVycikpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaSA9IGdldGhvc3RpbmZvKHNvdXJjZSk7CiAgICAgICAgICAgIHNvdXJjZSA9IGhpLT5uYW1lOwogICAgICAgICAgICBoaS0+bmFtZSA9IE5VTEw7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHRoZSBkZXZpY2Ugd2FzIHNwZWNpZmllZCBtYWtlIHN1cmUgaXQKICAgICAgICAgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBhZGRyZXNzIHNwZWNpZmllZC4KICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB1c2UgdGhlIGZpcnN0IGFkZHJlc3MgKGFuZCB3YXJuIGlmCiAgICAgICAgICAgICAqIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgZm9yIChpID0gaGktPm4sIGFwID0gaGktPmFkZHJzOyBpID4gMDsgLS1pLCArK2FwKQogICAgICAgICAgICAgICAgICAgIGlmICgqYXAgPT0gYWwtPmFkZHIpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKGkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgaXMgbm90IG9uIGludGVyZmFjZSAlLjMyc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGRldmljZSkpOwoKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0c2luKGZyb20sICphcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgaGktPmFkZHJzWzBdKTsKICAgICAgICAgICAgICAgIGlmIChoaS0+biA+IDEpCiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBXYXJuaW5nOiAlcyBoYXMgbXVsdGlwbGUgYWRkcmVzc2VzOyB1c2luZyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZWhvc3RpbmZvKGhpKTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBSZXZlcnQgdG8gbm9uLXByaXZpbGVnZWQgdXNlciBhZnRlciBvcGVuaW5nIHNvY2tldHMgCiAgICAgICAgICovCiAgICAgICAgc2V0Z2lkKGdldGdpZCgpKTsKICAgICAgICBzZXR1aWQoZ2V0dWlkKCkpOwoKICAgICAgICBvdXRpcC0+aXBfc3JjID0gZnJvbS0+c2luX2FkZHI7CiNpZm5kZWYgSVBfSERSSU5DTAogICAgICAgIGlmIChiaW5kKHNuZHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbSwgc2l6ZW9mKCpmcm9tKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIGJpbmQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICIgdG8gJXMgKCVzKSIsIGhvc3RuYW1lLCBpbmV0X250b2EodG8tPnNpbl9hZGRyKSkpOwoKICAgICAgICBpZiAoc291cmNlKQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgIiBmcm9tICVzIiwgc291cmNlKSk7CgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICIsICVsdSBob3BzIG1heCwgJWQgYnl0ZSBwYWNrZXRzXG4iLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwsIHBhY2tsZW4pKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZGVycik7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VSZXN1bHRzID0gTlVMTDsKICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfcmVzdWx0cyA9IE5VTEw7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKnRlbXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudCA9IE5VTEw7CgogICAgICAgIHVuc2lnbmVkIGxvbmcgICBpbmRleCA9IDA7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqdGVtcF9oaXMgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqY3VycmVudF90ZW1wX2hpcyA9IE5VTEw7CgogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX3Jlc3VsdHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICBpZiAoKFN0b3JhZ2VSZXN1bHRzID0KICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX3Jlc3VsdHMpKSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19yZXN1bHRzKTsKICAgICAgICB2YXJzX3Jlc3VsdHMgPSBOVUxMOwoKCiAgICAgICAgZm9yICh0dGwgPSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICAgICAgIHR0bCA8PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsOyArK3R0bCkgewoKICAgICAgICAgICAgdV9pbnQzMl90ICAgICAgIGxhc3RhZGRyID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdGxhc3RhZGRyID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdF90aGVyZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICB1bnJlYWNoYWJsZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZW50Zmlyc3QgPSAwOwogICAgICAgICAgICB0aW1lX3QgICAgICAgICAgdGltZXAgPSAwOwoKICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VySG9wQ291bnQgPSB0dGw7CiAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCkgewogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoaXRlbSk7CgoKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CgogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB2YXJzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyICE9IE5VTEw7IGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld29pZF9sZW4pID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCBoY2lwdHIyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfSG9wc0FkZHJlc3Nba10gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCA9ICsraW5kZXg7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KCgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWluUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWF4UnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzQXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1NlbnRQcm9iZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNQcm9iZVJlc3BvbnNlcyA9IDA7CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuID0gMDsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVIb3BzID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1heFJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWluUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3BvbnNlUHJvYmUgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bU9mU3F1YXJlID0gMDsKICAgICAgICAgICAgZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGNjOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHQxLCB0MjsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXAgPSBOVUxMOwogICAgICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBSdHQgPSAwOwoKICAgICAgICAgICAgICAgIGlmIChzZW50Zmlyc3QgJiYgcGF1c2Vtc2VjcyA+IDApCiAgICAgICAgICAgICAgICAgICAgdXNsZWVwKHBhdXNlbXNlY3MgKiAxMDAwKTsKICAgICAgICAgICAgICAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOwogICAgICAgICAgICAgICAgc2VuZF9wcm9iZSh0bywgKytzZXEsIHR0bCwgJnQxLCBvdXRpcCwgb3V0dWRwLCBwYWNrbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRsZW4sIGhvc3RuYW1lLCBpZGVudCwgc25kc29jaywgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSk7CiAgICAgICAgICAgICAgICArK3NlbnRmaXJzdDsKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseShzLCBmcm9tLCAmdDEsIHBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpID0gcGFja2V0X29rKHBhY2tldCwgY2MsIGZyb20sIHNlcSwgaWRlbnQsIHBtdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFNraXAgc2hvcnQgcGFja2V0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmICghZ290bGFzdGFkZHIgfHwgZnJvbS0+c2luX2FkZHIuc19hZGRyICE9IGxhc3RhZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCAgICBobGVuOwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBobGVuID0gaXAtPmlwX2hsIDw8IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGhsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzIiwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RhZGRyID0gZnJvbS0+c2luX2FkZHIuc19hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICArK2dvdGxhc3RhZGRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSdHQgPSBkZWx0YVQoJnQxLCAmdDIpOwogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvYmUgPSByZXNwb25zZVByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0IDwgbWluUnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1SdHQgPSAoc3VtUnR0KSArIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZCgoZG91YmxlKSAoc3VtUnR0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSByZXNwb25zZVByb2JlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0N1clByb2JlQ291bnQgPQogICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gLTIpIHsKI2lmbmRlZiBBUkNIQUlDCiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC0+aXBfdHRsIDw9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICArK2dvdF90aGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogdGltZSBleGNlZWRlZCBpbiB0cmFuc2l0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjb2RlID0gaSAtIDE7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BPUlQ6CiNpZm5kZWYgQVJDSEFJQwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAtPmlwX3R0bCA8PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgISIpOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFOIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9IT1NUOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhSCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUFJPVE9DT0w6CiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfTkVFREZSQUc6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFGLSVkIiwgcG10dSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9TUkNGQUlMOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfRklMVEVSX1BST0hJQjoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRToKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhQyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgITwlZD4iLCBjb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIFByaW50ZigiICoiKTsKICAgICAgICAgICAgICAgICAgICBSdHQgPSAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpICogMTAwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cyAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzID0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9NQUxMT0NfU1RSVUNUCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgICAgIC8qIGFkZCBsb2NrIHRvIHByb3RlY3QgKi8KICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID49CiAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAoMjE0NzQ4MzY0NykpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgICsrKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIC8qIGVuZHNhZHNhZHNhZCAqLwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggPSB0dGw7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4ID0gcHJvYmUgKyAxOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyVHlwZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyb20tPnNpbl9hZGRyKSldID0KICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVJlc3BvbnNlID0gUnR0OwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJCSAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXMgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpLT5uZXh0ID0gdGVtcF9oaXM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzID0gdGVtcF9oaXM7CgogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSArIDEgPj0gbnByb2JlcykgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzLT5uZXh0ID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfaG9wcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbS0+c2luX2FkZHIpKV0gPQogICAgICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmUgPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlCiAgICAgICAgICAgICAgICB8fCAodW5yZWFjaGFibGUgPiAwICYmIHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSkgewoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCgkJICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aF90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoID0KICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RDT01QTEVURUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURVNUIGNvbXBsZXRlZCFcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IEZhaWxlZCFcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlVGVzdEZhaWxlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsCiAgICAgICAgICAgICAgICAgICAgICAgJiYgKHByb2JlICsgMSkgPT0gbnByb2JlcykgewogICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwoKICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgIFRSQUNFUk9VVEVUUkFQR0VORVJBVElPTl9URVNURkFJTEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgRmFpbGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVUZXN0RmFpbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlVGVzdEZhaWxlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsb3NlKHNuZHNvY2spOwoKICAgICAgICBpZiAoZmxhZyA9PSAxKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAicGF0aCBjaGFuZ2VkIVxuIikpOwogICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlUGF0aENoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVQYXRoQ2hhbmdlKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICB9CgogICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgewogICAgICAgICAgICBmcmVlKG9sZF9Ib3BzQWRkcmVzc1trXSk7CiAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IE5VTEw7CiAgICAgICAgfQogICAgfQogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAyKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGljbXBfc29jayA9IDA7ICAvKiByZWNlaXZlIChpY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHNuZHNvY2sgPSAwOyAgICAvKiBzZW5kICh1ZHApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiB3aGVyZXRvOyAgICAvKiBXaG8gdG8gdHJ5IHRvIHJlYWNoICovCgogICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgc2FkZHI7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBmaXJzdGhvcDsKICAgICAgICBjaGFyICAgICAgICAgICAqc291cmNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqZGV2aWNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWUgPSBOVUxMOwoKICAgICAgICBwaWRfdCAgICAgICAgICAgaWRlbnQgPSAwOwogICAgICAgIHVfc2hvcnQgICAgICAgICBwb3J0ID0gMzI3NjggKyA2NjY7ICAgICAvKiBzdGFydCB1ZHAgZGVzdCBwb3J0ICMgZm9yIHByb2JlIHBhY2tldHMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0aW9ucyA9IDA7ICAgIC8qIHNvY2tldCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHdhaXR0aW1lID0gNTsgICAvKiB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIChpbiBzZWNvbmRzKSAqLwoKICAgICAgICBjaGFyICAgICAgICAgICAqc2VuZGJ1ZmYgPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBkYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBwa3RfZm9ybWF0KTsKCiAgICAgICAgdV9jaGFyICAgICAgICAgIHBhY2tldFs1MTJdOyAgICAvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLwoKICAgICAgICBjaGFyICAgICAgICAgICAgcGFbNjRdOwogICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBmcm9tLCAqdG8gPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBpID0gMCwgb24gPSAwLCBwcm9iZSA9IDAsIHNlcSA9IDAsIHRvcyA9CiAgICAgICAgICAgIDAsIHR0bCA9IDA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNvY2tldF9lcnJubyA9IDA7CgogICAgICAgIGljbXBfc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19SQVcsIElQUFJPVE9fSUNNUFY2KTsKICAgICAgICBzb2NrZXRfZXJybm8gPSBlcnJubzsKCiAgICAgICAgc2V0dWlkKGdldHVpZCgpKTsKCiAgICAgICAgb24gPSAxOwogICAgICAgIHNlcSA9IHRvcyA9IDA7CiAgICAgICAgdG8gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmd2hlcmV0bzsKCiAgICAgICAgaG9zdG5hbWUgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKTsKICAgICAgICBtZW1jcHkoaG9zdG5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGhvc3RuYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgICAgIHNldGxpbmVidWYoc3Rkb3V0KTsKCiAgICAgICAgKHZvaWQpIGJ6ZXJvKChjaGFyICopICZ3aGVyZXRvLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwoKICAgICAgICB0by0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKICAgICAgICB0by0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CgogICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGhvc3RuYW1lLCAmdG8tPnNpbjZfYWRkcikgPD0gMCkgewogICAgICAgICAgICBocCA9IGdldGhvc3RieW5hbWUyKGhvc3RuYW1lLCBBRl9JTkVUNik7CiAgICAgICAgICAgIGlmIChocCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gKGNoYXIgKikgaHAtPmhfbmFtZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlOiB1bmtub3duIGhvc3QgJXNcbiIsIGhvc3RuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaXJzdGhvcCA9ICp0bzsKCiAgICAgICAgZGF0YWxlbiA9IGl0ZW0tPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICBpZiAoZGF0YWxlbiA8IChpbnQpIHNpemVvZihzdHJ1Y3QgcGt0X2Zvcm1hdCkKICAgICAgICAgICAgfHwgZGF0YWxlbiA+PSBNQVhQQUNLRVQpIHsKICAgICAgICAgICAgRnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHBhY2tldCBzaXplIG11c3QgYmUgJWQgPD0gcyA8ICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAoaW50KSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpLCBNQVhQQUNLRVQpOwogICAgICAgICAgICBkYXRhbGVuID0gMTY7CiAgICAgICAgfQoKICAgICAgICBpZGVudCA9IGdldHBpZCgpOwoKICAgICAgICBzZW5kYnVmZiA9IG1hbGxvYyhkYXRhbGVuKTsKICAgICAgICBpZiAoc2VuZGJ1ZmYgPT0gTlVMTCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsZWRcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoaWNtcF9zb2NrIDwgMCkgewogICAgICAgICAgICBlcnJubyA9IHNvY2tldF9lcnJubzsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlNjogaWNtcCBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZvbiwgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgIHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKCiAgICAgICAgaWYgKChzbmRzb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogVURQIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojaWZkZWYgU09fU05EQlVGCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSAmZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGF0YWxlbikpIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU6IFNPX1NOREJVRiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNPX1NOREJVRiAqLwoKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwoKICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgc29ja2xlbl90ICAgICAgIGFsZW47CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBwcm9iZV9mZCA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CgogICAgICAgICAgICBpZiAocHJvYmVfZmQgPCAwKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoInNvY2tldCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkZXZpY2UpIHsKICAgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgICAgICAgICAgICAgKHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRldmljZSkgKyAxKSA9PSAtMSkKICAgICAgICAgICAgICAgICAgICBwZXJyb3IoIldBUk5JTkc6IGludGVyZmFjZSBpcyBpZ25vcmVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlyc3Rob3Auc2luNl9wb3J0ID0gaHRvbnMoMTAyNSk7CiAgICAgICAgICAgIGlmIChjb25uZWN0CiAgICAgICAgICAgICAgICAocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZpcnN0aG9wLAogICAgICAgICAgICAgICAgIHNpemVvZihmaXJzdGhvcCkpID09IC0xKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3QiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJmFsZW4pID09CiAgICAgICAgICAgICAgICAtMSkgewogICAgICAgICAgICAgICAgcGVycm9yKCJnZXRzb2NrbmFtZSIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNhZGRyLnNpbjZfcG9ydCA9IDA7CiAgICAgICAgICAgIGNsb3NlKHByb2JlX2ZkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAodm9pZCkgYnplcm8oKGNoYXIgKikgJnNhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwogICAgICAgICAgICBzYWRkci5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBzb3VyY2UsICZzYWRkci5zaW42X2FkZHIpIDwgMCkgewogICAgICAgICAgICAgICAgUHJpbnRmKCJ0cmFjZXJvdXRlOiB1bmtub3duIGFkZHIgJXNcbiIsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChiaW5kKHNuZHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBiaW5kIHNlbmRpbmcgc29ja2V0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGJpbmQoaWNtcF9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogYmluZCBpY21wNiBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgRnByaW50ZihzdGRlcnIsICJ0cmFjZXJvdXRlIHRvICVzICglcykiLCBob3N0bmFtZSwKICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJnRvLT5zaW42X2FkZHIsIHBhLCA2NCkpOwoKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiBmcm9tICVzIiwKICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJnNhZGRyLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIsICVsdSBob3BzIG1heCwgJWQgYnl0ZSBwYWNrZXRzXG4iLAogICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCwgZGF0YWxlbik7CiAgICAgICAgKHZvaWQpIGZmbHVzaChzdGRlcnIpOwoKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVJlc3VsdHMgPSBOVUxMOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudF90ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgdW5zaWduZWQgbG9uZyAgIGluZGV4ID0gMDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0ZW1wX2hpcyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXBfaGlzID0gTlVMTDsKCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIGlmICgoU3RvcmFnZVJlc3VsdHMgPQogICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfcmVzdWx0cykpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX3Jlc3VsdHMpOwogICAgICAgIHZhcnNfcmVzdWx0cyA9IE5VTEw7CgogICAgICAgIGZvciAodHRsID0gaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgICAgICB0dGwgPD0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bDsgKyt0dGwpIHsKICAgICAgICAgICAgc3RydWN0IGluNl9hZGRyIGxhc3RhZGRyID0geyB7ezAsfX0gfTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdF90aGVyZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICB1bnJlYWNoYWJsZSA9IDA7CiAgICAgICAgICAgIHRpbWVfdCAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgIFByaW50ZigiJTJkICIsIHR0bCk7CgoKICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VySG9wQ291bnQgPSB0dGw7CiAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCkgewoKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgayA9IDA7CiAgICAgICAgICAgICAgICAgICAgY291bnQgPSB0cmFjZVJvdXRlSG9wc1RhYmxlX2NvdW50KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHZhcnMpOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyICE9IE5VTEw7IGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld29pZF9sZW4pID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCBoY2lwdHIyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfSG9wc0FkZHJlc3Nba10gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kZWwoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QodHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXggPSArK2luZGV4OwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCgoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNSdHRTdW1PZlNxdWFyZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSAwOwoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMSkKICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlSG9wcyA9IHRlbXA7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wKS0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudF90ZW1wID0gdGVtcDsKCiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXhSdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1pblJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3VtUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXNwb25zZVByb2JlID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1PZlNxdWFyZSA9IDA7CiAgICAgICAgICAgIGZvciAocHJvYmUgPSAwOyBwcm9iZSA8IG5wcm9iZXM7ICsrcHJvYmUpIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjYyA9IDAsIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0MSwgdDI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIFJ0dCA9IDA7CgogICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0MSwgJnR6KTsKCiAgICAgICAgICAgICAgICBzZW5kX3Byb2JlX3Y2KCsrc2VxLCB0dGwsIHNlbmRidWZmLCBpZGVudCwgJnR6LCBzbmRzb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCAmd2hlcmV0bywgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAxOwoKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseV92NihpY21wX3NvY2ssICZmcm9tLCByZXNldF90aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUsIGljbXBfc29jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0KSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPQogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X29rX3Y2KHBhY2tldCwgY2MsICZmcm9tLCBzZXEsICZ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZmcm9tLnNpbjZfYWRkciwgJmxhc3RhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbGFzdGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgUnR0ID0gZGVsdGFUKCZ0MSwgJnQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9iZSA9IHJlc3BvbnNlUHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bU9mU3F1YXJlID0gUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJ0dCA8IG1pblJ0dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IChzdW1SdHQpICsgUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoKGRvdWJsZSkgKHN1bVJ0dCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHJlc3BvbnNlUHJvYmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CgoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIU4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIUgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAqIik7CiAgICAgICAgICAgICAgICAgICAgUnR0ID0gKGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0KSAqIDEwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QKICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKysoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCA9IHR0bDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggPSBwcm9iZSArIDE7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHN0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZXRfbnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKSArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsIHBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkckxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlSZXNwb25zZSA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlMYXN0UkMgPSAwOwoKCQkgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWUgPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJnRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcyktPm5leHQgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMgPSB0ZW1wX2hpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlICsgMSA+PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfY291bnQoaXRlbSkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFJvd3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RlbExhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLCBwYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CgogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmUgPSAKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19ob3BzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlIHx8IHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSB7CgoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCQkgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGggPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aExlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGl0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFUk9VVEVUUkFQR0VORVJBVElPTl9URVNUQ09NUExFVEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVEVTVCBjb21wbGV0ZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+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=