--------------Boundary-00=_C4I3G05TI9K9YUDUYP0F Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit This patch fixes the todo and datebook conduits of Kpilot. They now use libkcal to access the KOrganizer files. Please test the patch. It's a massive change to the conduits and it probably still has some bugs. On the other hand are the KOrganizer conduits non-functional without this patch. I would like to get this into the beta, then we can fix the remaining problems before the final release. What do you think? -- Cornelius Schumacher --------------Boundary-00=_C4I3G05TI9K9YUDUYP0F Content-Type: text/plain; charset="iso-8859-1"; name="conduit.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="conduit.patch" SW5kZXg6IGNvbmR1aXRzL3ZjYWxjb25kdWl0L01ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZp bGU6IC9ob21lL2tkZS9rZGVwaW0va3BpbG90L2NvbmR1aXRzL3ZjYWxjb25kdWl0L01ha2VmaWxl LmFtLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE4CmRpZmYgLXUgLTMgLWQgLXAgLXIxLjE4IE1h a2VmaWxlLmFtCi0tLSBjb25kdWl0cy92Y2FsY29uZHVpdC9NYWtlZmlsZS5hbQkyMDAxLzA1LzE1 IDE1OjM3OjAyCTEuMTgKKysrIGNvbmR1aXRzL3ZjYWxjb25kdWl0L01ha2VmaWxlLmFtCTIwMDEv MDYvMTcgMjI6MDM6MTcKQEAgLTMsMTMgKzMsOSBAQAogIyMjIHNvIGl0IHNlZW1zIGxvZ2ljYWwg dG8gcHV0IHRoZW0gaW4gb25lIHBsYWNlLgogIyMjCiAKLSMjIwotIyMjIEJ1aWxkIHRoZSBWQ0Mg bGlicmFyeSBmaXJzdC4KLSMjIwotU1VCRElSUyA9IHZlcnNpdAorSU5DTFVERVM9IC1JJCh0b3Bf c3JjZGlyKS9rcGlsb3Qva3BpbG90IC1JJCh0b3Bfc3JjZGlyKS9saWJrY2FsIFwKKyAgICAtSSQo TElCUElTT0NLX1BBVEgpICQoYWxsX2luY2x1ZGVzKQogCi1JTkNMVURFUz0gQGFsbF9pbmNsdWRl c0AgLUkkKExJQlBJU09DS19QQVRIKSBcCi0JLUkkKHRvcF9zcmNkaXIpL2twaWxvdCAtSSQodG9w X3NyY2Rpcikva3BpbG90L2twaWxvdCAtSSQoc3JjZGlyKS92ZXJzaXQKIE1FVEFTT1VSQ0VTID0g QVVUTwogCiBzZXJ2aWNlZGlyICA9ICQoa2RlX3NlcnZpY2VzZGlyKQpAQCAtMjAsMjcgKzE2LDI1 IEBAIHNlcnZpY2VfREFUQSA9IHRvZG8tY29uZHVpdC5kZXNrdG9wIHZjYWwKIGJpbl9QUk9HUkFN UyA9IHRvZG9jb25kdWl0IHZjYWxjb25kdWl0CiAKICMgV2hpY2ggc291cmNlcyBzaG91bGQgYmUg Y29tcGlsZWQgZm9yIHRvZG9jb25kdWl0Ci10b2RvY29uZHVpdF9TT1VSQ0VTPSB0b2RvLWNvbmR1 aXQuY2MgdG9kby1zZXR1cC5jYyB2Y2FsQmFzZS5jYwordG9kb2NvbmR1aXRfU09VUkNFUyA9IHRv ZG8tY29uZHVpdC5jYyB0b2RvLXNldHVwLmNjIHZjYWxCYXNlLmNjCiB2Y2FsY29uZHVpdF9TT1VS Q0VTID0gdmNhbC1jb25kdWl0LmNjIHZjYWwtc2V0dXAuY2MgdmNhbEJhc2UuY2MKIAotCiAjIHRo ZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCi10b2RvY29uZHVpdF9MREZMQUdTID0gJChhbGxfbGlicmFy aWVzKSAtTHZlcnNpdCBcCi0JLUwuLi8uLi9rcGlsb3QKLXZjYWxjb25kdWl0X0xERkxBR1MgPSAk KGFsbF9saWJyYXJpZXMpIC1MdmVyc2l0IFwKLQktTC4uLy4uL2twaWxvdAordG9kb2NvbmR1aXRf TERGTEFHUyA9IC1MJCh0b3BfYnVpbGRkaXIpL2twaWxvdC9rcGlsb3QgXAorICAgIC1MJCh0b3Bf YnVpbGRkaXIpL2xpYmtjYWwgJChhbGxfbGlicmFyaWVzKQordmNhbGNvbmR1aXRfTERGTEFHUyA9 IC1MJCh0b3BfYnVpbGRkaXIpL2twaWxvdC9rcGlsb3QgXAorICAgIC1MJCh0b3BfYnVpbGRkaXIp L2xpYmtjYWwgJChhbGxfbGlicmFyaWVzKQogCiAjIHRoZSBsaWJyYXJpZXMgdG8gbGluayBhZ2Fp bnN0LiBCZSBhd2FyZSBvZiB0aGUgb3JkZXIuIEZpcnN0IHRoZSBsaWJyYXJpZXMsCiAjIHRoYXQg ZGVwZW5kIG9uIHRoZSBmb2xsb3dpbmcgb25lcy4KIHRvZG9jb25kdWl0X0xEQUREICAgPSBcCi0J LWxjb25kdWl0IC1scGlsb3RkYiBcCisJLWxjb25kdWl0IC1scGlsb3RkYiAtbGtjYWwgXAogCSQo TElCX0tGSUxFKSAkKExJQl9LREVVSSkgJChMSUJfS0RFQ09SRSkgXAotCUBMSUJTT0NLRVRAIC1s dmVyc2l0ICQoTElCUElTT0NLKQorCUBMSUJTT0NLRVRAICQoTElCUElTT0NLKQogdmNhbGNvbmR1 aXRfTERBREQgICA9IFwKLQktbGNvbmR1aXQgLWxwaWxvdGRiIFwKKwktbGNvbmR1aXQgLWxwaWxv dGRiIC1sa2NhbCBcCiAJJChMSUJfS0ZJTEUpICQoTElCX0tERVVJKSAkKExJQl9LREVDT1JFKSBc Ci0JQExJQlNPQ0tFVEAgLWx2ZXJzaXQgJChMSUJQSVNPQ0spCisJQExJQlNPQ0tFVEAgJChMSUJQ SVNPQ0spCiAKICMgdGhpcyBvcHRpb24geW91IGNhbiBsZWF2ZSBvdXQuIEp1c3QsIGlmIHlvdSB1 c2UgIm1ha2UgZGlzdCIsIHlvdSBuZWVkIGl0CiBub2luc3RfSEVBREVSUyA9IHRvZG8tY29uZHVp dC5oIHRvZG8tc2V0dXAuaCB2Y2FsLWNvbmR1aXQuaCB2Y2FsLXNldHVwLmgKLQpJbmRleDogY29u ZHVpdHMvdmNhbGNvbmR1aXQvdG9kby1jb25kdWl0LmNjCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9o b21lL2tkZS9rZGVwaW0va3BpbG90L2NvbmR1aXRzL3ZjYWxjb25kdWl0L3RvZG8tY29uZHVpdC5j Yyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41CmRpZmYgLXUgLTMgLWQgLXAgLXIxLjUgdG9kby1j b25kdWl0LmNjCi0tLSBjb25kdWl0cy92Y2FsY29uZHVpdC90b2RvLWNvbmR1aXQuY2MJMjAwMS8w Ni8wNSAyMjo1ODo0MAkxLjUKKysrIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3RvZG8tY29uZHVpdC5j YwkyMDAxLzA2LzE3IDIyOjAzOjE5CkBAIC0xLDggKzEsOSBAQAotLyogdG9kby1jb25kdWl0LmNj CQkJS1BpbG90CisvKiB0b2RvLWNvbmR1aXQuY2MgIFRvZG8tQ29uZHVpdCBmb3Igc3luY2luZyBL UGlsb3QgYW5kIEtPcmdhbml6ZXIKICoqCiAqKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBEYW4g UGlsb25lCiAqKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBQcmVzdG9uIEJyb3duCiAqKiBDb3B5 cmlnaHQgKEMpIDE5OTggSGVyd2luLUphbiBTdGVlaG91d2VyCisqKiBDb3B5cmlnaHQgKEMpIDIw MDEgQ29ybmVsaXVzIFNjaHVtYWNoZXIKICoqCiAqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUg dG9kbyBjb25kdWl0LCBhIGNvbmR1aXQgZm9yIEtQaWxvdCB0aGF0CiAqKiBzeW5jaHJvbmlzZXMg dGhlIFBpbG90J3MgdG9kbyBhcHBsaWNhdGlvbiB3aXRoIHRoZSBvdXRzaWRlIHdvcmxkLApAQCAt MjYsMTUgKzI3LDcgQEAKICoqIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0vKgotKiogQnVnIHJlcG9y dHMgYW5kIHF1ZXN0aW9ucyBjYW4gYmUgc2VudCB0byBhZHJpZGdAY3Mua3VuLm5sCi0qLwotLy8g SSBoYXZlIG5vdGljZWQgdGhhdCB0aGlzIGlzIGZ1bGwgb2YgbWVtb3J5IGxlYWtzLCBidXQgc2lu Y2UgaXQgaXMKLS8vIHNob3J0IGxpdmVkLCBpdCBzaG91bGRuJ3QgbWF0dGVyIHNvIG11Y2guIC0t IFBHQgotCi0jaWZuZGVmIF9LUElMT1RfT1BUSU9OU19ICiAjaW5jbHVkZSAib3B0aW9ucy5oIgot I2VuZGlmCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KQEAg LTQyLDEwNCArMzUsNTQgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx0aW1lLmg+ CiAKLSNpZm5kZWYgUUJJVEFSUkFZX0gKICNpbmNsdWRlIDxxYml0YXJyYXkuaD4KLSNlbmRpZgot Ci0jaWZuZGVmIFFESVJfSAogI2luY2x1ZGUgPHFkaXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFE QVRFVE1fSAogI2luY2x1ZGUgPHFkYXRldG0uaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFTVFJJTkdf SAogI2luY2x1ZGUgPHFzdHJpbmcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFNU0dCT1hfSAogI2lu Y2x1ZGUgPHFtc2dib3guaD4KLSNlbmRpZgogCi0KLSNpZm5kZWYgX0tBUFBfSAogI2luY2x1ZGUg PGthcHAuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9LTUVTU0FHRUJPWF9ICiAjaW5jbHVkZSA8a21l c3NhZ2Vib3guaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9LQ09ORklHX0gKICNpbmNsdWRlIDxrY29u ZmlnLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfS0RFQlVHX0gKICNpbmNsdWRlIDxrZGVidWcuaD4K LSNlbmRpZgotCiAKLSNpZm5kZWYgX0tQSUxPVF9LUElMT1RDT05GSUdfSAogI2luY2x1ZGUgImtw aWxvdENvbmZpZy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgX0tQSUxPVF9QSUxPVERBVEFCQVNFX0gK ICNpbmNsdWRlICJwaWxvdERhdGFiYXNlLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBfS1BJTE9UX1BJ TE9UUkVDT1JEX0gKLSNpbmNsdWRlICJwaWxvdFJlY29yZC5oIgotI2VuZGlmCi0KLSNpZm5kZWYg X0tQSUxPVF9QSUxPVFRPRE9FTlRSWV9ICiAjaW5jbHVkZSAicGlsb3RUb2RvRW50cnkuaCIKLSNl bmRpZgotCi0KLSNpZm5kZWYgX19WQ0NfSF9fCi0jaW5jbHVkZSAidmNjLmgiCi0jZW5kaWYKLQot I2lmbmRlZiBfS1BJTE9UX1RPRE9fQ09ORFVJVF9ICiAjaW5jbHVkZSAidG9kby1jb25kdWl0Lmgi Ci0jZW5kaWYKLQotI2lmbmRlZiBfS1BJTE9UX1RPRE9fU0VUVVBfSAogI2luY2x1ZGUgInRvZG8t c2V0dXAuaCIKLSNlbmRpZgotCi0jaWZuZGVmIF9LUElMT1RfQ09ORFVJVEFQUF9ICiAjaW5jbHVk ZSAiY29uZHVpdEFwcC5oIgotI2VuZGlmCisKKyNpbmNsdWRlIDx0b2RvLmg+CisKK3VzaW5nIG5h bWVzcGFjZSBLQ2FsOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdG9kb19jb25kdWl0X2lkID0gIiRJ ZDogdG9kby1jb25kdWl0LmNjLHYgMS41IDIwMDEvMDYvMDUgMjI6NTg6NDAgYWRyaWRnIEV4cCAk IjsKIAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQogewotICBDb25kdWl0QXBw IGEoYXJnYywgYXJndiwgInRvZG9fY29uZHVpdCIsCi0gIAkiVG9Eby1saXN0IGNvbmR1aXQiLAot CUtQSUxPVF9WRVJTSU9OKTsKKyAgQ29uZHVpdEFwcCBhKGFyZ2MsYXJndiwidG9kb19jb25kdWl0 IiwiVG9Eby1saXN0IGNvbmR1aXQiLEtQSUxPVF9WRVJTSU9OKTsKICAgYS5hZGRBdXRob3IoIlBy ZXN0b24gQnJvd24iLEkxOE5fTk9PUCgiT3JnYW5pemVyIGF1dGhvciIpKTsKLQlhLmFkZEF1dGhv cigiQWRyaWFhbiBkZSBHcm9vdCIsCi0JCUkxOE5fTk9PUCgiTWFpbnRhaW5lciIpLAotCQkiYWRy aWRnQGNzLmt1bi5ubCIpOwotCWEuYWRkQXV0aG9yKCJQaGlsaXBwIEh1bGxtYW5uIiwKLQkJSTE4 Tl9OT09QKCJCdWdmaXhlciIpKTsKLSAgVG9kb0NvbmR1aXQgY29uZHVpdChhLmdldE1vZGUoKSk7 CisgIGEuYWRkQXV0aG9yKCJBZHJpYWFuIGRlIEdyb290IixJMThOX05PT1AoIk1haW50YWluZXIi KSwiYWRyaWRnQGNzLmt1bi5ubCIpOworICBhLmFkZEF1dGhvcigiUGhpbGlwcCBIdWxsbWFubiIs STE4Tl9OT09QKCJCdWdmaXhlciIpKTsKKyAgYS5hZGRBdXRob3IoIkNvcm5lbGl1cyBTY2h1bWFj aGVyIixJMThOX05PT1AoImlDYWxlbmRhciBwb3J0IikpOworICAKKyAgVG9kb0NvbmR1aXQgY29u ZHVpdChhLmdldE1vZGUoKSxhLmdldERCU291cmNlKCkpOwogICBhLnNldENvbmR1aXQoJmNvbmR1 aXQpOwogICByZXR1cm4gYS5leGVjKCk7CiAKLQkvKiBOT1RSRUFDSEVEICovCi0JKHZvaWQpIHRv ZG9fY29uZHVpdF9pZDsKKyAgLyogTk9UUkVBQ0hFRCAqLworICAodm9pZCkgdG9kb19jb25kdWl0 X2lkOwogfQogCiAKLVRvZG9Db25kdWl0OjpUb2RvQ29uZHVpdChlQ29uZHVpdE1vZGUgbW9kZSkK LSAgOiBWQ2FsQmFzZUNvbmR1aXQobW9kZSkKK1RvZG9Db25kdWl0OjpUb2RvQ29uZHVpdChlQ29u ZHVpdE1vZGUgbW9kZSxEYXRhYmFzZVNvdXJjZSBzb3VyY2UpCisgIDogVkNhbEJhc2VDb25kdWl0 KG1vZGUsc291cmNlKQogewotCUZVTkNUSU9OU0VUVVA7CisgIEZVTkNUSU9OU0VUVVA7CisgIAor ICBrZERlYnVnKCkgPDwgIlRvZG9Db25kdWl0KCkiIDw8IGVuZGw7CiB9CiAKIApAQCAtMTQ4LDIx OSArOTEsMTY0IEBAIFRvZG9Db25kdWl0Ojp+VG9kb0NvbmR1aXQoKQogfQogCiAKLS8qIHN0YXRp YyAqLyBjb25zdCBjaGFyICpUb2RvQ29uZHVpdDo6dmVyc2lvbigpCitjb25zdCBjaGFyICpUb2Rv Q29uZHVpdDo6dmVyc2lvbigpCiB7Ci0JcmV0dXJuICJUb0RvIENvbmR1aXQgIiBLUElMT1RfVkVS U0lPTjsKKyAgcmV0dXJuICJUb0RvIENvbmR1aXQgIiBLUElMT1RfVkVSU0lPTjsKIH0KIAogCiB2 b2lkIFRvZG9Db25kdWl0Ojpkb0JhY2t1cCgpCiB7Ci0gICBQaWxvdFJlY29yZCogcmVjOwotICAg aW50IGluZGV4ID0gMDsKKyAgIGtkRGVidWcoKSA8PCAiVG9kb0NvbmR1aXQ6OmRvQmFja3VwKCki IDw8IGVuZGw7CiAKICAgIGlmICghZ2V0Q2FsZW5kYXIoVG9kb1NldHVwOjpUb2RvR3JvdXApKSB7 CiAgICAgIG5vQ2FsZW5kYXJFcnJvcihpMThuKCJUb0RvIENvbmR1aXQiKSk7CiAgICAgIGV4aXQo Q29uZHVpdE1pc2NvbmZpZ3VyZWQpOwogICAgfQogCi0gICByZWMgPSByZWFkUmVjb3JkQnlJbmRl eChpbmRleCsrKTsKKyAgIGludCBpbmRleCA9IDA7CisgICBQaWxvdFJlY29yZCAqcmVjID0gcmVh ZFJlY29yZEJ5SW5kZXgoaW5kZXgrKyk7CiAKLSAgLy8gR2V0IEFMTCBlbnRyaWVzIGZyb20gUGls b3QKKyAgIC8vIEdldCBBTEwgZW50cmllcyBmcm9tIFBpbG90CiAgICB3aGlsZShyZWMpIHsKLSAg ICAgaWYocmVjLT5nZXRBdHRyaWIoKSAmIGRscFJlY0F0dHJEZWxldGVkKSB7IC8vIHRhZ2dlZCBm b3IgZGVsZXRpb24KLSAgICAgICBkZWxldGVWT2JqZWN0KHJlYywgVkNUb2RvUHJvcCk7CisgICAg IGlmKHJlYy0+aXNEZWxldGVkKCkpIHsgLy8gdGFnZ2VkIGZvciBkZWxldGlvbgorICAgICAgIGRl bGV0ZVJlY29yZChyZWMpOworLy8gICAgICAgZGVsZXRlVk9iamVjdChyZWMsIFZDVG9kb1Byb3Ap OwogICAgICB9IGVsc2UgewotICAgICAgIHVwZGF0ZVZPYmplY3QocmVjKTsKLSAgICAgfSAgICAK KyAgICAgICB1cGRhdGVUb2RvKHJlYyk7CisvLyAgICAgICB1cGRhdGVWT2JqZWN0KHJlYyk7Cisg ICAgIH0KICAgICAgZGVsZXRlIHJlYzsKICAgICAgcmVjID0gcmVhZFJlY29yZEJ5SW5kZXgoaW5k ZXgrKyk7CiAgICB9CisKICAgIC8vIHNhdmUgdGhlIHRvZG9lbmRhcgogICAgc2F2ZVZDYWwoKTsK IAogICAgLy8gY2xlYXIgdGhlICJmaXJzdCB0aW1lIiBmbGFnCi0gIEtDb25maWcmIGNvbmZpZyA9 IEtQaWxvdENvbmZpZzo6Z2V0Q29uZmlnKFRvZG9TZXR1cDo6VG9kb0dyb3VwKTsKLSAgc2V0Rmly c3RUaW1lKGNvbmZpZywgZmFsc2UpOworICAgS0NvbmZpZyYgY29uZmlnID0gS1BpbG90Q29uZmln OjpnZXRDb25maWcoVG9kb1NldHVwOjpUb2RvR3JvdXApOworICAgc2V0Rmlyc3RUaW1lKGNvbmZp ZywgZmFsc2UpOwogfQogCiB2b2lkIFRvZG9Db25kdWl0Ojpkb1N5bmMoKQogewotCUZVTkNUSU9O U0VUVVA7Ci0gICBQaWxvdFJlY29yZCogcmVjOworICBGVU5DVElPTlNFVFVQOworICBQaWxvdFJl Y29yZCogcmVjOwogCi0gICBpZiAoIWdldENhbGVuZGFyKFRvZG9TZXR1cDo6VG9kb0dyb3VwKSkg ewotICAgICBub0NhbGVuZGFyRXJyb3IoaTE4bigiVG9EbyBDb25kdWl0IikpOwotICAgICBleGl0 KENvbmR1aXRNaXNjb25maWd1cmVkKTsKLSAgIH0KKyAgaWYgKCFnZXRDYWxlbmRhcihUb2RvU2V0 dXA6OlRvZG9Hcm91cCkpIHsKKyAgICBub0NhbGVuZGFyRXJyb3IoaTE4bigiVG9EbyBDb25kdWl0 IikpOworICAgIGV4aXQoQ29uZHVpdE1pc2NvbmZpZ3VyZWQpOworICB9CiAKLSAgIERFQlVHQ09O RFVJVCA8PCBmbmFtZSA8PCAiOiBQaWxvdCAtPiBEZXNrdG9wIiA8PCBlbmRsOworICBERUJVR0NP TkRVSVQgPDwgZm5hbWUgPDwgIjogUGlsb3QgLT4gRGVza3RvcCIgPDwgZW5kbDsKIAotICAgcmVj ID0gcmVhZE5leHRNb2RpZmllZFJlY29yZCgpOworICByZWMgPSByZWFkTmV4dE1vZGlmaWVkUmVj b3JkKCk7CiAKLSAgIC8vIGdldCBvbmx5IE1PRElGSUVEIGVudHJpZXMgZnJvbSBQaWxvdCwgY29t cGFyZWQgd2l0aCB0aGUgYWJvdmUgKGRvQmFja3VwKSwKLSAgIC8vIHdoaWNoIGdldHMgQUxMIGVu dHJpZXMKLSAgIHdoaWxlIChyZWMpIHsKLSAgICAgaWYocmVjLT5nZXRBdHRyaWIoKSAmIGRscFJl Y0F0dHJEZWxldGVkKQotICAgICAgIC8vCSByZWNvcmREZWxldGVkKHJlYyk7Ci0gICAgICAgZGVs ZXRlVk9iamVjdChyZWMsIFZDVG9kb1Byb3ApOwotICAgICBlbHNlIHsKLSAgICAgICBib29sIHBp bG90UmVjTW9kaWZpZWQgPSAocmVjLT5nZXRBdHRyaWIoKSAmIGRscFJlY0F0dHJEaXJ0eSk7Ci0g ICAgICAgaWYgKHBpbG90UmVjTW9kaWZpZWQpCi0JewotCSB1cGRhdGVWT2JqZWN0KHJlYyk7Ci0J fQotICAgICAgIGVsc2UgewotCQlERUJVR0NPTkRVSVQgPDwgZm5hbWUKLQkJCTw8ICI6IEFza2Vk IGZvciBhIG1vZGlmaWVkIHJlY29yZCBhbmQgZ290ICIKLQkJCSAgICJhbiB1bm1vZGlmaWVkIG9u ZS4iCi0JCQk8PCBlbmRsOwotICAgICAgIH0KLSAgICAgfQotCSAKLSAgICAgZGVsZXRlIHJlYzsK LSAgICAgcmVjID0gcmVhZE5leHRNb2RpZmllZFJlY29yZCgpOwotICAgfQorICAvLyBnZXQgb25s eSBNT0RJRklFRCBlbnRyaWVzIGZyb20gUGlsb3QsIGNvbXBhcmVkIHdpdGggdGhlIGFib3ZlIChk b0JhY2t1cCksCisgIC8vIHdoaWNoIGdldHMgQUxMIGVudHJpZXMKKyAgd2hpbGUgKHJlYykgewor ICAgIGlmKHJlYy0+aXNEZWxldGVkKCkpIGRlbGV0ZVJlY29yZChyZWMpOworICAgIGVsc2Ugewor ICAgICAgYm9vbCBwaWxvdFJlY01vZGlmaWVkID0gKHJlYy0+Z2V0QXR0cmliKCkgJiBkbHBSZWNB dHRyRGlydHkpOworICAgICAgaWYgKHBpbG90UmVjTW9kaWZpZWQpIHsKKyAgICAgICAgdXBkYXRl VG9kbyhyZWMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUdDT05EVUlUIDw8IGZuYW1l CisJCSAgICAgPDwgIjogQXNrZWQgZm9yIGEgbW9kaWZpZWQgcmVjb3JkIGFuZCBnb3QgIgorCQkg ICAgICAgICJhbiB1bm1vZGlmaWVkIG9uZS4iCisJCSAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAg ICB9CiAKLSAgIC8vIG5vdywgYWxsIHRoZSBzdHVmZiB0aGF0IHdhcyBtb2RpZmllZC9uZXcgb24g dGhlIHBpbG90IHNob3VsZCBiZQotICAgLy8gYWRkZWQgdG8gdGhlIHRvZG9lbmRhci4gIFdlIG5v dyBuZWVkIHRvIGFkZCBzdHVmZiB0byB0aGUgcGlsb3QKLSAgIC8vIHRoYXQgaXMgbW9kaWZpZWQv bmV3IGluIHRoZSB0b2RvZW5kYXIgKHRoZSBvcHBvc2l0ZSkuCSAgCi0gICBERUJVR0NPTkRVSVQg PDwgZm5hbWUgPDwgIjogRGVza3RvcCAtPiBQaWxvdCIgPDwgZW5kbDsKLSAgIGRvTG9jYWxTeW5j KCk7CisgICAgZGVsZXRlIHJlYzsKKyAgICByZWMgPSByZWFkTmV4dE1vZGlmaWVkUmVjb3JkKCk7 CisgIH0KIAotICAgLy8gbm93IHdlIHNhdmUgdGhlIHRvZG9lbmRhci4KLSAgIHNhdmVWQ2FsKCk7 CisgIC8vIG5vdywgYWxsIHRoZSBzdHVmZiB0aGF0IHdhcyBtb2RpZmllZC9uZXcgb24gdGhlIHBp bG90IHNob3VsZCBiZQorICAvLyBhZGRlZCB0byB0aGUgdG9kb2VuZGFyLiAgV2Ugbm93IG5lZWQg dG8gYWRkIHN0dWZmIHRvIHRoZSBwaWxvdAorICAvLyB0aGF0IGlzIG1vZGlmaWVkL25ldyBpbiB0 aGUgdG9kb2VuZGFyICh0aGUgb3Bwb3NpdGUpLgkgIAorICBERUJVR0NPTkRVSVQgPDwgZm5hbWUg PDwgIjogRGVza3RvcCAtPiBQaWxvdCIgPDwgZW5kbDsKKyAgZG9Mb2NhbFN5bmMoKTsKIAotICAg Ly8gY2xlYXIgdGhlICJmaXJzdCB0aW1lIiBmbGFnCisgIC8vIG5vdyB3ZSBzYXZlIHRoZSB0b2Rv ZW5kYXIuCisgIHNhdmVWQ2FsKCk7CisKKyAgLy8gY2xlYXIgdGhlICJmaXJzdCB0aW1lIiBmbGFn CiAgIEtDb25maWcmIGNvbmZpZyA9IEtQaWxvdENvbmZpZzo6Z2V0Q29uZmlnKFRvZG9TZXR1cDo6 VG9kb0dyb3VwKTsKICAgc2V0Rmlyc3RUaW1lKGNvbmZpZywgZmFsc2UpOwogfQogCiAKLS8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KLQogLyoKICAqIEdpdmVuIGEgcGlsb3QgcmVjb3JkLCBjaGVjayB0 byBzZWUgd2hhdCBuZWVkcyB0byBiZSBkb25lIHRvIHRoZQogICogYW5hbG9nb3VzIHZvYmplY3Qg dG8gYnJpbmcgdGhpbmdzIGludG8gc3luYy4KICAqLwotdm9pZCBUb2RvQ29uZHVpdDo6dXBkYXRl Vk9iamVjdChQaWxvdFJlY29yZCAqcmVjKQordm9pZCBUb2RvQ29uZHVpdDo6dXBkYXRlVG9kbyhQ aWxvdFJlY29yZCAqcmVjKQogewotCUZVTkNUSU9OU0VUVVA7Ci0KLSAgVk9iamVjdCAqdnRvZG87 Ci0gIFZPYmplY3QgKnZvOwotICBRRGF0ZVRpbWUgdG9kYXlzRGF0ZSA9IFFEYXRlVGltZTo6Y3Vy cmVudERhdGVUaW1lKCk7Ci0gIFFTdHJpbmcgdG1wU3RyOwogICBQaWxvdFRvZG9FbnRyeSB0b2Rv RW50cnkocmVjKTsKICAgCi0gIHZ0b2RvPWZpbmRFbnRyeUluQ2FsZW5kYXIocmVjLT5nZXRJRCgp LCBWQ1RvZG9Qcm9wKTsKKyAgVG9kbyAqdnRvZG89ZmluZFRvZG8ocmVjLT5nZXRJRCgpKTsKICAg aWYgKCF2dG9kbykgewogICAgIC8vIG5vIGV2ZW50IHdhcyBmb3VuZCwgc28gd2UgbmVlZCB0byBh ZGQgb25lIHdpdGggc29tZSBpbml0aWFsIGluZm8KLSAgICBRU3RyaW5nIG51bVN0cjsKLSAgICB2 dG9kbyA9IGFkZFByb3AoY2FsZW5kYXIoKSwgVkNUb2RvUHJvcCk7Ci0gICAgYWRkRGF0ZVByb3Bl cnR5KHZ0b2RvLCBWQ0RDcmVhdGVkUHJvcCwgdG9kYXlzRGF0ZSk7Ci0gICAgbnVtU3RyLnNwcmlu dGYoIktQaWxvdCAtICVsZCIscmVjLT5nZXRJRCgpKTsKLSAgICBhZGRQcm9wVmFsdWUodnRvZG8s IFZDVW5pcXVlU3RyaW5nUHJvcCwgbnVtU3RyLmxhdGluMSgpKTsKLSAgICBhZGRQcm9wVmFsdWUo dnRvZG8sIFZDU2VxdWVuY2VQcm9wLCAiMSIpOwotICAgIGFkZERhdGVQcm9wZXJ0eSh2dG9kbywg VkNMYXN0TW9kaWZpZWRQcm9wLCB0b2RheXNEYXRlKTsKLSAgICBhZGRQcm9wVmFsdWUodnRvZG8s IFZDUHJpb3JpdHlQcm9wLCAiMCIpOwotICAgIGFkZFByb3BWYWx1ZSh2dG9kbywgS1BpbG90SWRQ cm9wLAotCQkgbnVtU3RyLnNldE51bSh0b2RvRW50cnkuZ2V0SUQoKSkubGF0aW4xKCkpOyAKLSAg ICBhZGRQcm9wVmFsdWUodnRvZG8sIEtQaWxvdFN0YXR1c1Byb3AsICIwIik7Ci0gIH0KKyAgICB2 dG9kbyA9IG5ldyBUb2RvOworICAgIGNhbGVuZGFyKCktPmFkZFRvZG8odnRvZG8pOwogCi0gIGlm IChnZXRTdGF0dXModnRvZG8pKSB7Ci0gICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBtb2RpZnkgdGhl IHZvYmplY3Qgd2l0aCBwaWxvdCBpbmZvLCBiZWNhdXNlIGl0IGhhcwotICAgIC8vIGFscmVhZHkg YmVlbiAgbW9kaWZpZWQgb24gdGhlIGRlc2t0b3AuICBUaGUgVk9iamVjdCdzIG1vZGlmaWVkIHN0 YXRlCi0gICAgLy8gb3ZlcnJpZGVzIHRoZSBQaWxvdFJlYydzIG1vZGlmaWVkIHN0YXRlLgotICAg IHJldHVybjsKKyAgICB2dG9kby0+c2V0UGlsb3RJZCh0b2RvRW50cnkuZ2V0SUQoKSk7CisgICAg dnRvZG8tPnNldFN5bmNTdGF0dXMoSW5jaWRlbmNlOjpTWU5DTk9ORSk7CiAgIH0KIAorICAvLyB3 ZSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdm9iamVjdCB3aXRoIHBpbG90IGluZm8sIGJlY2F1 c2UgaXQgaGFzCisgIC8vIGFscmVhZHkgYmVlbiAgbW9kaWZpZWQgb24gdGhlIGRlc2t0b3AuICBU aGUgVk9iamVjdCdzIG1vZGlmaWVkIHN0YXRlCisgIC8vIG92ZXJyaWRlcyB0aGUgUGlsb3RSZWMn cyBtb2RpZmllZCBzdGF0ZS4KKworICBpZiAodnRvZG8tPnN5bmNTdGF0dXMoKSAhPSBJbmNpZGVu Y2U6OlNZTkNOT05FKSByZXR1cm47CisKICAgLy8gb3RoZXJ3aXNlLCB0aGUgdk9iamVjdCBoYXNu J3QgYmVlbiB0b3VjaGVkLiAgVXBkYXRlZCBpdCB3aXRoIHRoZQogICAvLyBpbmZvIGZyb20gdGhl IFBpbG90UmVjLgotICAKLQkvLyBEVUUgREFURSAvLwotCXZvID0gaXNBUHJvcGVydHlPZih2dG9k bywgVkNEdWVQcm9wKTsKLQlpZiAodG9kb0VudHJ5LmdldEluZGVmaW5pdGUoKSkgCi0JeyAKLQkJ Ly8gdGhlcmUgaXMgbm8gZHVlIGRhdGUsIHJlbW92ZSBpdCBpZiBhbHJlYWR5IHByZXNlbnQuCi0J CS8vCi0JCS8vCi0JCWlmICh2bykKLQkJewotCQkJYWRkUHJvcCh2bywgS1BpbG90U2tpcFByb3Ap OwotCQl9Ci0gICAgCi0JCURFQlVHQ09ORFVJVCA8PCBmbmFtZQotCQkJPDwgIjogVG9kby1pdGVt IHdpdGggbm8gZW5kIGRhdGUuIgotCQkJPDwgZW5kbDsKLQl9IAotCWVsc2UgCi0JewotCQlpZiAo dm8pCi0JCXsKLQkJCXNldERhdGVQcm9wZXJ0eSh2bywgdG9kb0VudHJ5LmdldER1ZURhdGVfcCgp KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWFkZERhdGVQcm9wZXJ0eSh2dG9kbywgVkNEdWVQcm9w LAotCQkJCXRvZG9FbnRyeS5nZXREdWVEYXRlX3AoKSk7Ci0JCX0KLQl9Ci0gIAorCisgIGlmICh0 b2RvRW50cnkuZ2V0SW5kZWZpbml0ZSgpKSB7CisgICAgdnRvZG8tPnNldEhhc0R1ZURhdGUoZmFs c2UpOworICB9IGVsc2UgeworICAgIHZ0b2RvLT5zZXREdER1ZShyZWFkVG0odG9kb0VudHJ5Lmdl dER1ZURhdGUoKSkpOworICB9CisKICAgLy8gUFJJT1JJVFkgLy8KLSAgdm8gPSBpc0FQcm9wZXJ0 eU9mKHZ0b2RvLCBWQ1ByaW9yaXR5UHJvcCk7Ci0gIGludCBwcmlvcml0eSA9IHRvZG9FbnRyeS5n ZXRQcmlvcml0eSgpOwotICB0bXBTdHIuc2V0TnVtKHByaW9yaXR5KTsKLSAgaWYgKHZvKQotICAg IHNldFZPYmplY3RVU3RyaW5nWlZhbHVlXyh2bywgZmFrZVVuaWNvZGUodG1wU3RyLmxhdGluMSgp LCAwKSk7Ci0gIGVsc2UKLSAgICBhZGRQcm9wVmFsdWUodnRvZG8sIFZDUHJpb3JpdHlQcm9wLCB0 bXBTdHIubGF0aW4xKCkpOworICB2dG9kby0+c2V0UHJpb3JpdHkodG9kb0VudHJ5LmdldFByaW9y aXR5KCkpOwogCiAgIC8vIENPTVBMRVRFRD8gLy8KLSAgdm8gPSBpc0FQcm9wZXJ0eU9mKHZ0b2Rv LCBWQ1N0YXR1c1Byb3ApOwotICB0bXBTdHIgPSAodG9kb0VudHJ5LmdldENvbXBsZXRlKCkgPyAi Q09NUExFVEVEIiA6ICJYLUFDVElPTiIpOwotICBpZiAodm8pCi0gICAgc2V0Vk9iamVjdFVTdHJp bmdaVmFsdWVfKHZvLCBmYWtlVW5pY29kZSh0bXBTdHIubGF0aW4xKCksIDApKTsKLSAgZWxzZQot ICAgIGFkZFByb3BWYWx1ZSh2dG9kbywgVkNTdGF0dXNQcm9wLCB0bXBTdHIubGF0aW4xKCkpOwor ICB2dG9kby0+c2V0Q29tcGxldGVkKHRvZG9FbnRyeS5nZXRDb21wbGV0ZSgpKTsKIAogICBzZXRT dW1tYXJ5KHZ0b2RvLCB0b2RvRW50cnkuZ2V0RGVzY3JpcHRpb24oKSk7CiAgIHNldE5vdGUodnRv ZG8sIHRvZG9FbnRyeS5nZXROb3RlKCkpOwotICBzZXRTdGF0dXModnRvZG8sIDApOworICAKKyAg dnRvZG8tPnNldFN5bmNTdGF0dXMoSW5jaWRlbmNlOjpTWU5DTk9ORSk7CiB9CiAKLS8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KLQogCiB2b2lkIFRvZG9Db25kdWl0Ojpkb0xvY2FsU3luYygpCiB7Ci0J RlVOQ1RJT05TRVRVUDsKKyAgRlVOQ1RJT05TRVRVUDsKIAotICBWT2JqZWN0SXRlcmF0b3IgaTsK LSAgCi0gIGluaXRQcm9wSXRlcmF0b3IoJmksIGNhbGVuZGFyKCkpOworICBRTGlzdDxUb2RvPiB0 b2RvcyA9IGNhbGVuZGFyKCktPmdldFRvZG9MaXN0KCk7CiAgIAogICAvKiBnbyB0aHJvdWdoIHRo ZSB3aG9sZSB0b2RvIGxpc3QuICBJZiB0aGUgZXZlbnQgaGFzIHRoZSBkaXJ0eQogICAgICAobW9k aWZpZWQpIGZsYWcgc2V0LCBtYWtlIGEgbmV3IHBpbG90IHJlY29yZCBhbmQgYWRkIGl0LiAqLwot ICB3aGlsZSAobW9yZUl0ZXJhdGlvbigmaSkpIHsKKyAgZm9yKFRvZG8gKnRvZG8gPSB0b2Rvcy5m aXJzdCgpO3RvZG87dG9kbyA9IHRvZG9zLm5leHQoKSkgewogICAgIHJlY29yZGlkX3QgaWQ7CiAg ICAgUGlsb3RUb2RvRW50cnkgKnRvZG9FbnRyeTsKICAgICBQaWxvdFJlY29yZCAqcFJlYzsKIAot ICAgIFZPYmplY3QgKnZ0b2RvID0gbmV4dFZPYmplY3QoJmkpOwotICAgIGlmIChzdHJjbXAodk9i amVjdE5hbWUodnRvZG8pLCBWQ1RvZG9Qcm9wKSA9PSAwICYmCi0JZ2V0U3RhdHVzKHZ0b2RvKSkg ewotICAgICAgLyogdGhlIGV2ZW50IGhhcyBiZWVuIG1vZGlmaWVkLCBuZWVkIHRvIHdyaXRlIGl0 IHRvIHRoZSBwaWxvdAotCSBBZnRlciB1c2luZyB0aGUgd3JpdGVSZWNvcmQgbWV0aG9kLCBiZSBz dXJlIGFuZCBwdXQgdGhlIHJldHVybmVkIGlkCi0JIGJhY2sgaW50byB0aGUgdG9kbyBlbnRyeSEg Ki8KKyAgICBpZiAodG9kby0+c3luY1N0YXR1cygpICE9IEluY2lkZW5jZTo6U1lOQ05PTkUpIHsK KyAgICAgIC8vIFRoZSBldmVudCBoYXMgYmVlbiBtb2RpZmllZCwgbmVlZCB0byB3cml0ZSBpdCB0 byB0aGUgcGlsb3QuCisgICAgICAvLyBBZnRlciB1c2luZyB0aGUgd3JpdGVSZWNvcmQgbWV0aG9k LCBiZSBzdXJlIGFuZCBwdXQgdGhlIHJldHVybmVkIGlkCisgICAgICAvLyBiYWNrIGludG8gdGhl IHRvZG8gZW50cnkhIAogICAgICAgCiAgICAgICAvLyB3ZSByZWFkIHRoZSBwaWxvdElELgogCi0g ICAgICBpZCA9IGdldFJlY29yZElEKHZ0b2RvKTsKKyAgICAgIGlkID0gdG9kby0+cGlsb3RJZCgp OwogCi0JLy8gaWYgaWQgIT0gMCwgdGhpcyBpcyBhIG1vZGlmaWVkIGV2ZW50LCBvdGhlcndpc2Ug aXQgaXMgbmV3LgotCWlmIChpZCAhPSAwKSB7CisgICAgICAvLyBpZiBpZCAhPSAwLCB0aGlzIGlz IGEgbW9kaWZpZWQgZXZlbnQsIG90aGVyd2lzZSBpdCBpcyBuZXcuCisgICAgICBpZiAoaWQgIT0g MCkgewogCSAgcFJlYyA9IHJlYWRSZWNvcmRCeUlkKGlkKTsKIAkgIC8qIElmIHRoaXMgZmFpbHMs IHNvbWVob3cgdGhlIHJlY29yZCBnb3QgZGVsZXRlZCBmcm9tIHRoZQogCSAgICAgcGlsb3QgYnV0 IHdlIHdlcmUgbmV2ZXIgaW5mb3JtZWQhIGJhZCBwaWxvdC4gbmF1Z2h0eQpAQCAtMzczLDkzICsy NjEsNjAgQEAgdm9pZCBUb2RvQ29uZHVpdDo6ZG9Mb2NhbFN5bmMoKQogCSAgICB0b2RvRW50cnkg PSBuZXcgUGlsb3RUb2RvRW50cnkoKTsKIAkgICAgaWQgPSAwOwogCSAgfQotCX0gZWxzZSB7Ci0J ICB0b2RvRW50cnkgPSBuZXcgUGlsb3RUb2RvRW50cnkoKTsKLQl9Ci0JCi0JLy8gdXBkYXRlIGl0 IGZyb20gdGhlIHZPYmplY3QuCi0JCi0JLy8gRU5EIFRJTUUgKERVRSBEQVRFKSAvLwotCVZPYmpl Y3QgKnZvOwotCWlmICgodm8gPSBpc0FQcm9wZXJ0eU9mKHZ0b2RvLCBWQ0R1ZVByb3ApKSAhPSAw TCkgewotCSAgY2hhciAqcyA9IGZha2VDU3RyaW5nKHZPYmplY3RVU3RyaW5nWlZhbHVlKHZvKSk7 Ci0JICBzdHJ1Y3QgdG0gZHVlID0gSVNPVG9UbShRU3RyaW5nKHMpKTsKLQkgIERFQlVHQ09ORFVJ VCA8PCBmbmFtZSA8PCAgIjogRHVlIERhdGU6ICIgPDwgcyA8PCBlbmRsOwotCSAgZGVsZXRlU3Ry KHMpOwotCSAgdG9kb0VudHJ5LT5zZXREdWVEYXRlKGR1ZSk7Ci0JICB0b2RvRW50cnktPnNldElu ZGVmaW5pdGUoMCk7Ci0JfSBlbHNlIHsKLQkgIC8vIGluZGVmaW5pdGUgZXZlbnQKLQkgIERFQlVH Q09ORFVJVCA8PCBmbmFtZSA8PCAiOiBJbmRlZmluaXRlIGV2ZW50LlxuIjsKLQkgIHRvZG9FbnRy eS0+c2V0SW5kZWZpbml0ZSgxKTsKLQl9CisgICAgICB9IGVsc2UgeworICAgICAgICB0b2RvRW50 cnkgPSBuZXcgUGlsb3RUb2RvRW50cnkoKTsKKyAgICAgIH0KIAotCS8vIFBSSU9SSVRZIC8vCi0J aWYgKCh2byA9IGlzQVByb3BlcnR5T2YodnRvZG8sIFZDUHJpb3JpdHlQcm9wKSkgIT0gMEwpIHsK LQkgIGludCBwcmlvcml0eSA9IGF0b2koZmFrZUNTdHJpbmcodk9iamVjdFVTdHJpbmdaVmFsdWUo dm8pKSk7Ci0JICBpZiAocHJpb3JpdHkgPT0gMCkKLQkgICAgcHJpb3JpdHkgPSAxOyAvLyBubyAn dW5kZWZpbmVkJyBwcmlvcml0aWVzIG9uIHRoZSBwaWxvdAotCSAgdG9kb0VudHJ5LT5zZXRQcmlv cml0eShwcmlvcml0eSk7Ci0JfSBlbHNlIHsKLQkgIHRvZG9FbnRyeS0+c2V0UHJpb3JpdHkoMSk7 IC8vIHRvZG8gbmVlZHMgYSBwcmlvcml0eS4KLQl9CisgICAgICAvLyB1cGRhdGUgaXQgZnJvbSB0 aGUgaUNhbGVuZGFyIFRvZG8uCiAKLQkvLyBDT01QTEVURT8gLy8KLQlpZiAoKHZvID0gaXNBUHJv cGVydHlPZih2dG9kbywgVkNTdGF0dXNQcm9wKSkgIT0gMEwpIHsKLQkgIGNoYXIgKnMgPSBmYWtl Q1N0cmluZyh2T2JqZWN0VVN0cmluZ1pWYWx1ZSh2bykpOwotCSAgaWYgKHN0cmNtcChzLCAiQ09N UExFVEVEIikgPT0gMCkKLQkgICAgdG9kb0VudHJ5LT5zZXRDb21wbGV0ZSgxKTsKLQkgIGVsc2UK LQkgICAgdG9kb0VudHJ5LT5zZXRDb21wbGV0ZSgwKTsKLQkgIGRlbGV0ZVN0cihzKTsKLQl9IGVs c2UgewotCSAgLy8gbmVlZHMgY29tcGxldGUgc3RhdHVzIGV2ZW4gaWYgbm9uZSBnaXZlbgotCSAg dG9kb0VudHJ5LT5zZXRDb21wbGV0ZSgwKTsKLQl9CisgICAgICBpZiAodG9kby0+aGFzRHVlRGF0 ZSgpKSB7CisgICAgICAgIHN0cnVjdCB0bSB0ID0gd3JpdGVUbSh0b2RvLT5kdER1ZSgpKTsKKyAg ICAgICAgdG9kb0VudHJ5LT5zZXREdWVEYXRlKHQpOworICAgICAgICB0b2RvRW50cnktPnNldElu ZGVmaW5pdGUoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0b2RvRW50cnktPnNldEluZGVm aW5pdGUoMSk7CisgICAgICB9CQogCi0JLy8gU1VNTUFSWSAvLwotCS8vIHdoYXQgd2UgY2FsbCBz dW1tYXJ5IHBpbG90IGNhbGxzIGRlc2NyaXB0aW9uLgotCXRvZG9FbnRyeS0+c2V0RGVzY3JpcHRp b24oZ2V0U3VtbWFyeSh2dG9kbykpOworICAgICAgdG9kb0VudHJ5LT5zZXRQcmlvcml0eSh0b2Rv LT5wcmlvcml0eSgpKTsKKworICAgICAgdG9kb0VudHJ5LT5zZXRDb21wbGV0ZSh0b2RvLT5pc0Nv bXBsZXRlZCgpKTsKKworICAgICAgLy8gd2hhdCB3ZSBjYWxsIHN1bW1hcnkgcGlsb3QgY2FsbHMg ZGVzY3JpcHRpb24uCisgICAgICB0b2RvRW50cnktPnNldERlc2NyaXB0aW9uKHRvZG8tPnN1bW1h cnkoKSk7CiAJCi0JLy8gREVTQ1JJUFRJT04gLy8KLQkvLyB3aGF0IHdlIGNhbGwgZGVzY3JpcHRp b24gcGlsb3QgcHV0cyBhcyBhIHNlcGFyYXRlIG5vdGUKLQl0b2RvRW50cnktPnNldE5vdGUoZ2V0 RGVzY3JpcHRpb24odnRvZG8pKTsKKyAgICAgIC8vIHdoYXQgd2UgY2FsbCBkZXNjcmlwdGlvbiBw aWxvdCBwdXRzIGFzIGEgc2VwYXJhdGUgbm90ZQorICAgICAgdG9kb0VudHJ5LT5zZXROb3RlKHRv ZG8tPmRlc2NyaXB0aW9uKCkpOwogCi0JLy8gcHV0IHRoZSBwaWxvdFJlYyBpbiB0aGUgZGF0YWJh c2UuLi4KLQlwUmVjPXRvZG9FbnRyeS0+cGFjaygpOwotCXBSZWMtPnNldEF0dHJpYih0b2RvRW50 cnktPmdldEF0dHJpYigpICYgfmRscFJlY0F0dHJEaXJ0eSk7Ci0JaWQgPSB3cml0ZVJlY29yZChw UmVjKTsKLQlkZWxldGUodG9kb0VudHJ5KTsKLQlkZWxldGUocFJlYyk7CisgICAgICAvLyBwdXQg dGhlIHBpbG90UmVjIGluIHRoZSBkYXRhYmFzZS4uLgorICAgICAgcFJlYz10b2RvRW50cnktPnBh Y2soKTsKKyAgICAgIHBSZWMtPnNldEF0dHJpYih0b2RvRW50cnktPmdldEF0dHJpYigpICYgfmRs cFJlY0F0dHJEaXJ0eSk7CisgICAgICBpZCA9IHdyaXRlUmVjb3JkKHBSZWMpOworICAgICAgZGVs ZXRlKHRvZG9FbnRyeSk7CisgICAgICBkZWxldGUocFJlYyk7CiAKLQkvLyB3cml0ZSB0aGUgaWQg d2UgZ290IGZyb20gd3JpdGVSZWNvcmQgYmFjayB0byB0aGUgdk9iamVjdAotCWlmIChpZCA+IDAp IHsKLQkgIHNldE51bVByb3BlcnR5KHZ0b2RvLCBLUGlsb3RJZFByb3AsIGlkKTsKLQkgIHNldE51 bVByb3BlcnR5KHZ0b2RvLCBLUGlsb3RTdGF0dXNQcm9wLCAwKTsKLQl9IGVsc2UgewotCQlrZERl YnVnKCkgPDwgZm5hbWUKLQkJCTw8ICJlcnJvciEgd3JpdGVSZWNvcmQgcmV0dXJuZWQgYSBwaWxv dElEIDw9IDAhIgotCQkJPDwgZW5kbDsKLQl9CisgICAgICAvLyB3cml0ZSB0aGUgaWQgd2UgZ290 IGZyb20gd3JpdGVSZWNvcmQgYmFjayB0byB0aGUgdk9iamVjdAorICAgICAgaWYgKGlkID4gMCkg eworICAgICAgICB0b2RvLT5zZXRQaWxvdElkKGlkKTsKKyAgICAgICAgdG9kby0+c2V0U3luY1N0 YXR1cyhJbmNpZGVuY2U6OlNZTkNOT05FKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGtkRGVi dWcoKSA8PCBmbmFtZQorICAgICAgICAgICAgICAgICAgPDwgImVycm9yISB3cml0ZVJlY29yZCBy ZXR1cm5lZCBhIHBpbG90SUQgPD0gMCEiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAg ICAgfQotICAgfQorICAgIH0KKyAgfQogCiAgIEtDb25maWcmIGNvbmZpZyA9IEtQaWxvdENvbmZp Zzo6Z2V0Q29uZmlnKFRvZG9TZXR1cDo6VG9kb0dyb3VwKTsKLSAgYm9vbCBEZWxldGVPblBpbG90 ID0gY29uZmlnLnJlYWRCb29sRW50cnkoIkRlbGV0ZU9uUGlsb3QiLCB0cnVlKTsKKyAgYm9vbCBk ZWxldGVPblBpbG90ID0gY29uZmlnLnJlYWRCb29sRW50cnkoIkRlbGV0ZU9uUGlsb3QiLCB0cnVl KTsKIAotICBpZiAoZmlyc3RUaW1lKCkpCi0gICAgZmlyc3RTeW5jQ29weShEZWxldGVPblBpbG90 KTsKKyAgaWYgKGZpcnN0VGltZSgpKSBmaXJzdFN5bmNDb3B5KGRlbGV0ZU9uUGlsb3QpOwogCi0g IGlmIChEZWxldGVPblBpbG90KQotICAgIGRlbGV0ZUZyb21QaWxvdChWQ1RvZG9Qcm9wKTsKKyAg aWYgKGRlbGV0ZU9uUGlsb3QpIGRlbGV0ZUZyb21QaWxvdChWQ2FsQmFzZUNvbmR1aXQ6OlR5cGVU b2RvKTsKIH0KIAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi12b2lkIFRvZG9Db25kdWl0OjpmaXJz dFN5bmNDb3B5KGJvb2wgRGVsZXRlT25QaWxvdCkgewotICBGVU5DVElPTlNFVFVQOwogCit2b2lk IFRvZG9Db25kdWl0OjpmaXJzdFN5bmNDb3B5KGJvb2wgRGVsZXRlT25QaWxvdCkKK3sKICAgYm9v bCBpbnNlcnRhbGwgPSBmYWxzZSwgc2tpcGFsbCA9IGZhbHNlOwogCiAgIC8vIEdldCBhbGwgZW50 cmllcyBmcm9tIFBpbG90CkBAIC00NzQsMTAgKzMyOSw5IEBAIHZvaWQgVG9kb0NvbmR1aXQ6OmZp cnN0U3luY0NvcHkoYm9vbCBEZWwKIAkJCSAgICA8PCBlbmRsOwogICAgICAgY29udGludWU7CiAg ICAgfQotICAgICAgCi0gICAgVk9iamVjdCAqdmV2ZW50ID0gZmluZEVudHJ5SW5DYWxlbmRhcihy ZWMtPmdldElEKCksCi0JCQkJCSAgVkNUb2RvUHJvcCk7Ci0gICAgaWYgKHZldmVudCA9PSAwTCkg eworICAgIAorICAgIFRvZG8gKnRvZG8gPSBmaW5kVG9kbyhyZWMtPmdldElEKCkpOworICAgIGlm ICghdG9kbykgewogICAgICAgREVCVUdDT05EVUlUIDw8IF9fRlVOQ1RJT05fXwogCQkgICA8PCAi OiBFbnRyeSBmb3VuZCBvbiBwaWxvdCBidXQgbm90IGluIHZjYWxlbmRhci4iCiAJCSAgIDw8IGVu ZGw7CkBAIC00OTcsNyArMzUxLDcgQEAgdm9pZCBUb2RvQ29uZHVpdDo6Zmlyc3RTeW5jQ29weShi b29sIERlbAogCXRleHQgKz0gaTE4bigiSXRlbTogJTEuXG5cbiIKIAkJICAgICAiV2hhdCBtdXN0 IGJlIGRvbmUgd2l0aCB0aGlzIGl0ZW0/IikKIAkgIC5hcmcodG9kb0VudHJ5LT5nZXREZXNjcmlw dGlvbigpKTsKLQkgICAgCisgICAgCiAJaW50IHJlc3BvbnNlID0KIAkgIFFNZXNzYWdlQm94Ojpp bmZvcm1hdGlvbigwLCAKIAkJCQkgICBpMThuKCJLUGlsb3QgVG8tRG8gQ29uZHVpdCIpLCAKQEAg LTUxNCwzMCArMzY4LDI4IEBAIHZvaWQgVG9kb0NvbmR1aXQ6OmZpcnN0U3luY0NvcHkoYm9vbCBE ZWwKIAkJICAgICA8PCBlbmRsOwogCSAgICAKIAlzd2l0Y2ggKHJlc3BvbnNlKSB7Ci0JY2FzZSAw OgotCWRlZmF1bHQ6IAotCSAgLyogRGVmYXVsdCBpcyB0byBpbnNlcnQgdGhpcyBzaW5nbGUgZW50 cnkgYW5kIGFzayBhZ2FpbgotCSAgICAgbGF0ZXIuICovCi0JICB1cGRhdGVWT2JqZWN0KHJlYyk7 Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvLyBKdXN0IHNraXAgdGhpcywgaXQgd2lsbCBiZSBk ZWxldGVkIGJ5IGRlbGV0ZUZyb21QaWxvdCgpLgotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgaW5z ZXJ0YWxsID0gdHJ1ZTsKLQkgIHNraXBhbGwgPSBmYWxzZTsKLQkgIHVwZGF0ZVZPYmplY3QocmVj KTsKLQkgIGJyZWFrOwotCX0gLy8gc3dpdGNoIChyZXNwb25zZSkKKyAgICAgICAgICBjYXNlIDA6 CisgICAgICAgICAgZGVmYXVsdDogCisJICAgIC8vIERlZmF1bHQgaXMgdG8gaW5zZXJ0IHRoaXMg c2luZ2xlIGVudHJ5IGFuZCBhc2sgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgIHVwZGF0ZVRvZG8o cmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAg IC8vIEp1c3Qgc2tpcCB0aGlzLCBpdCB3aWxsIGJlIGRlbGV0ZWQgYnkgZGVsZXRlRnJvbVBpbG90 KCkuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBp bnNlcnRhbGwgPSB0cnVlOworICAgICAgICAgICAgc2tpcGFsbCA9IGZhbHNlOworICAgICAgICAg ICAgdXBkYXRlVG9kbyhyZWMpOworICAgICAgICAgICAgYnJlYWs7CisJfQogICAgICAgfSBlbHNl IGlmIChpbnNlcnRhbGwpIHsKLQkvLyBhbGwgcmVjb3JkcyBhcmUgdG8gYmUgaW5zZXJ0ZWQuCi0J dXBkYXRlVk9iamVjdChyZWMpOworICAgICAgICAvLyBhbGwgcmVjb3JkcyBhcmUgdG8gYmUgaW5z ZXJ0ZWQuCisgICAgICAgIHVwZGF0ZVRvZG8ocmVjKTsKICAgICAgIH0KLSAgICB9IC8vIGlmICgh dmV2ZW50KQorICAgIH0KICAgICBkZWxldGUgcmVjOwotICB9IC8vIHdoaWxlICgocmVjID0gcmVh ZFJlY29yZEJ5SW5kZXgoaW5kZXgrKykpICE9IDApCi19IC8vIHZvaWQgVG9kb0NvbmR1aXQ6OmZp cnN0U3luY0NvcHkoKQotCisgIH0KK30KIAogLyogcHV0IHVwIHRoZSBhYm91dCAvIHNldHVwIGRp YWxvZy4gKi8KIFFXaWRnZXQqIFRvZG9Db25kdWl0OjphYm91dEFuZFNldHVwKCkKSW5kZXg6IGNv bmR1aXRzL3ZjYWxjb25kdWl0L3RvZG8tY29uZHVpdC5oCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9o b21lL2tkZS9rZGVwaW0va3BpbG90L2NvbmR1aXRzL3ZjYWxjb25kdWl0L3RvZG8tY29uZHVpdC5o LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjIKZGlmZiAtdSAtMyAtZCAtcCAtcjEuMiB0b2RvLWNv bmR1aXQuaAotLS0gY29uZHVpdHMvdmNhbGNvbmR1aXQvdG9kby1jb25kdWl0LmgJMjAwMS8wNi8w NSAyMjo1ODo0MAkxLjIKKysrIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3RvZG8tY29uZHVpdC5oCTIw MDEvMDYvMTcgMjI6MDM6MTkKQEAgLTQxLDM0ICs0MSwzNiBAQAogI2luY2x1ZGUgPHRpbWUuaD4K ICNlbmRpZgogCi0jaWZuZGVmIF9WQ0FMX1ZDQUxCQVNFX0gKKyNpbmNsdWRlIDx0b2RvLmg+CisK ICNpbmNsdWRlICJ2Y2FsQmFzZS5oIgotI2VuZGlmCiAKIGNsYXNzIFFXaWRnZXQ7CiBjbGFzcyBQ aWxvdFJlY29yZDsKIAordXNpbmcgbmFtZXNwYWNlIEtDYWw7CiAKIGNsYXNzIFRvZG9Db25kdWl0 IDogcHVibGljIFZDYWxCYXNlQ29uZHVpdAogewotcHVibGljOgotICBUb2RvQ29uZHVpdChlQ29u ZHVpdE1vZGUgbW9kZSk7Ci0gIHZpcnR1YWwgflRvZG9Db25kdWl0KCk7Ci0gIAotICB2aXJ0dWFs IHZvaWQgZG9TeW5jKCk7Ci0gIHZpcnR1YWwgdm9pZCBkb0JhY2t1cCgpOwotICB2aXJ0dWFsIFFX aWRnZXQqIGFib3V0QW5kU2V0dXAoKTsKKyAgcHVibGljOgorICAgIFRvZG9Db25kdWl0KGVDb25k dWl0TW9kZSBtb2RlLERhdGFiYXNlU291cmNlIHNvdXJjZT1Db25kdWl0U29ja2V0KTsKKyAgICB2 aXJ0dWFsIH5Ub2RvQ29uZHVpdCgpOwogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogZGJJbmZvKCkg eyByZXR1cm4gIlRvZG9EQiI7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZG9TeW5jKCk7CisgICAgdmly dHVhbCB2b2lkIGRvQmFja3VwKCk7CisgICAgdmlydHVhbCBRV2lkZ2V0KiBhYm91dEFuZFNldHVw KCk7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRiSW5mbygpIHsgcmV0dXJuICJUb0RvREIi OyB9CiAgIAotICBzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbigpOworICAgIHN0YXRpYyBjb25z dCBjaGFyICp2ZXJzaW9uKCk7CiAKLXByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGRvTG9jYWxT eW5jKCk7Ci0gIHZpcnR1YWwgdm9pZCB1cGRhdGVWT2JqZWN0KFBpbG90UmVjb3JkICpyZWMpOwor ICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGRvTG9jYWxTeW5jKCk7CisgICAgdmlydHVh bCB2b2lkIHVwZGF0ZVRvZG8oUGlsb3RSZWNvcmQgKnJlYyk7CisvLyAgICB2aXJ0dWFsIHZvaWQg dXBkYXRlVk9iamVjdChQaWxvdFJlY29yZCAqcmVjKTsKIAotIHByaXZhdGU6Ci0gIHZvaWQgZmly c3RTeW5jQ29weShib29sIERlbGV0ZU9uUGlsb3QpOworICAgcHJpdmF0ZToKKyAgICB2b2lkIGZp cnN0U3luY0NvcHkoYm9vbCBEZWxldGVPblBpbG90KTsKIH07CiAKICNlbmRpZgpJbmRleDogY29u ZHVpdHMvdmNhbGNvbmR1aXQvdG9kby1zZXR1cC5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9t ZS9rZGUva2RlcGltL2twaWxvdC9jb25kdWl0cy92Y2FsY29uZHVpdC90b2RvLXNldHVwLmNjLHYK cmV0cmlldmluZyByZXZpc2lvbiAxLjIKZGlmZiAtdSAtMyAtZCAtcCAtcjEuMiB0b2RvLXNldHVw LmNjCi0tLSBjb25kdWl0cy92Y2FsY29uZHVpdC90b2RvLXNldHVwLmNjCTIwMDEvMDYvMDUgMjI6 NTg6NDAJMS4yCisrKyBjb25kdWl0cy92Y2FsY29uZHVpdC90b2RvLXNldHVwLmNjCTIwMDEvMDYv MTcgMjI6MDM6MTkKQEAgLTI1LDExMCArMjUsNjQgQEAKICoqIE1BIDAyMTM5LCBVU0EuCiAqLwog Ci0vKgotKiogQnVnIHJlcG9ydHMgYW5kIHF1ZXN0aW9ucyBjYW4gYmUgc2VudCB0byBhZHJpZGdA Y3Mua3VuLm5sCi0qLwogc3RhdGljIGNvbnN0IGNoYXIgKnRvZG9fc2V0dXBfaWQ9IiRJZDogdG9k by1zZXR1cC5jYyx2IDEuMiAyMDAxLzA2LzA1IDIyOjU4OjQwIGFkcmlkZyBFeHAgJCI7CiAKLQog I2luY2x1ZGUgIm9wdGlvbnMuaCIKIAotI2lmbmRlZiBRRElSX0gKICNpbmNsdWRlIDxxZGlyLmg+ Ci0jZW5kaWYKLQotI2lmbmRlZiBRTEFCRUxfSAogI2luY2x1ZGUgPHFsYWJlbC5oPgotI2VuZGlm Ci0KLSNpZm5kZWYgUVBVU0hCVF9ICi0jaW5jbHVkZSA8cXB1c2hidC5oPgotI2VuZGlmCi0KLSNp Zm5kZWYgUUNIS0JPWF9ICi0jaW5jbHVkZSA8cWNoa2JveC5oPgotI2VuZGlmCi0KLSNpZm5kZWYg UUxJTkVEX0gKLSNpbmNsdWRlIDxxbGluZWQuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFMQVlPVVRf SAorI2luY2x1ZGUgPHFwdXNoYnV0dG9uLmg+CisjaW5jbHVkZSA8cWNoZWNrYm94Lmg+CisjaW5j bHVkZSA8cWxpbmVlZGl0Lmg+CiAjaW5jbHVkZSA8cWxheW91dC5oPgotI2VuZGlmCiAKLSNpZm5k ZWYgX0tBUFBfSAogI2luY2x1ZGUgPGthcHAuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9LTE9DQUxF X0gKICNpbmNsdWRlIDxrbG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfS0RFQlVHX0gKICNp bmNsdWRlIDxrZGVidWcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9LRklMRURJQUxPR19ICiAjaW5j bHVkZSA8a2ZpbGVkaWFsb2cuaD4KLSNlbmRpZgogCi0jaWZuZGVmIF9LREVCVUdfSAotI2luY2x1 ZGUgPGtkZWJ1Zy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX0tQSUxPVF9UT0RPX0NPTkRVSVRfSAot I2luY2x1ZGUgInRvZG8tY29uZHVpdC5oIgotI2VuZGlmCi0KLSNpZm5kZWYgX0tQSUxPVF9LUElM T1RDT05GSUdfSAogI2luY2x1ZGUgImtwaWxvdENvbmZpZy5oIgotI2VuZGlmCi0KKyNpbmNsdWRl ICJ0b2RvLWNvbmR1aXQuaCIKIAorI2luY2x1ZGUgInRvZG8tc2V0dXAuaCIKICNpbmNsdWRlICJ0 b2RvLXNldHVwLm1vYyIKIAogCi0vKiBzdGF0aWMgKi8gY29uc3QgUVN0cmluZyBUb2RvU2V0dXA6 OlRvZG9Hcm91cCgidG9kb09wdGlvbnMiKTsKK2NvbnN0IFFTdHJpbmcgVG9kb1NldHVwOjpUb2Rv R3JvdXAoInRvZG9PcHRpb25zIik7CiAKIFRvZG9TZXR1cDo6VG9kb1NldHVwKFFXaWRnZXQgKnBh cmVudCkKICAgOiBzZXR1cERpYWxvZyhwYXJlbnQsVG9kb0dyb3VwLFRvZG9Db25kdWl0Ojp2ZXJz aW9uKCkpCiB7Ci0JRlVOQ1RJT05TRVRVUDsKLQlLQ29uZmlnJiBjb25maWc9S1BpbG90Q29uZmln OjpnZXRDb25maWcoVG9kb0dyb3VwKTsKLQlhZGRQYWdlKG5ldyBUb2RvU2V0dXBQYWdlKHRoaXMs Y29uZmlnKSk7Ci0JYWRkUGFnZShuZXcgc2V0dXBJbmZvUGFnZSh0aGlzKSk7Ci0Jc2V0dXBEaWFs b2c6OnNldHVwV2lkZ2V0KCk7Ci0JKHZvaWQpIHRvZG9fc2V0dXBfaWQ7CisgIEtDb25maWcmIGNv bmZpZz1LUGlsb3RDb25maWc6OmdldENvbmZpZyhUb2RvR3JvdXApOworICBhZGRQYWdlKG5ldyBU b2RvU2V0dXBQYWdlKHRoaXMsY29uZmlnKSk7CisgIGFkZFBhZ2UobmV3IHNldHVwSW5mb1BhZ2Uo dGhpcykpOworICBzZXR1cERpYWxvZzo6c2V0dXBXaWRnZXQoKTsKKyAgKHZvaWQpIHRvZG9fc2V0 dXBfaWQ7CiB9CiAKIAogaW50IFRvZG9TZXR1cFBhZ2U6OmNvbW1pdENoYW5nZXMoS0NvbmZpZyYg Y29uZmlnKQogewotCWNvbmZpZy53cml0ZUVudHJ5KCJDYWxGaWxlIiwgZkNhbGVuZGFyRmlsZS0+ dGV4dCgpKTsKLQljb25maWcud3JpdGVFbnRyeSgiRmlyc3RUaW1lIiwgCi0JCQkgIGZQcm9tcHRG aXJzdFRpbWUtPmlzQ2hlY2tlZCgpID8gInRydWUiIDogImZhbHNlIik7Ci0JY29uZmlnLndyaXRl RW50cnkoIkRlbGV0ZU9uUGlsb3QiLAotCQkJICBmRGVsZXRlT25QaWxvdC0+aXNDaGVja2VkKCkg PyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgY29uZmlnLndyaXRlRW50cnkoIkNhbEZpbGUiLCBmQ2Fs ZW5kYXJGaWxlLT50ZXh0KCkpOworICBjb25maWcud3JpdGVFbnRyeSgiRmlyc3RUaW1lIiwgCisg ICAgICAgICAgICAgICAgICAgIGZQcm9tcHRGaXJzdFRpbWUtPmlzQ2hlY2tlZCgpID8gInRydWUi IDogImZhbHNlIik7CisgIGNvbmZpZy53cml0ZUVudHJ5KCJEZWxldGVPblBpbG90IiwKKyAgICAg ICAgICAgICAgICAgICAgZkRlbGV0ZU9uUGlsb3QtPmlzQ2hlY2tlZCgpID8gInRydWUiIDogImZh bHNlIik7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKIAogdm9pZCBUb2RvU2V0dXBQ YWdlOjpzbG90QnJvd3NlKCkKIHsKLQlGVU5DVElPTlNFVFVQOwotCi0gIFFTdHJpbmcgZmlsZU5h bWUgPSBLRmlsZURpYWxvZzo6Z2V0T3BlbkZpbGVOYW1lKDBMLCAiKi52Y3MiKTsKKyAgUVN0cmlu ZyBmaWxlTmFtZSA9IEtGaWxlRGlhbG9nOjpnZXRPcGVuRmlsZU5hbWUoMCwgIioudmNzICppY3Mi KTsKICAgaWYoZmlsZU5hbWUuaXNOdWxsKCkpIHJldHVybjsKICAgZkNhbGVuZGFyRmlsZS0+c2V0 VGV4dChmaWxlTmFtZSk7CiB9CiAKIFRvZG9TZXR1cFBhZ2U6OlRvZG9TZXR1cFBhZ2Uoc2V0dXBE aWFsb2cgKnBhcmVudCxLQ29uZmlnJiBjb25maWcpIDoKLQlzZXR1cERpYWxvZ1BhZ2UoaTE4bigi VG9EbyBGaWxlIikscGFyZW50KQorICAgIHNldHVwRGlhbG9nUGFnZShpMThuKCJUb0RvIEZpbGUi KSxwYXJlbnQpCiB7Ci0gIEZVTkNUSU9OU0VUVVA7Ci0KICAgZ3JpZCA9IG5ldyBRR3JpZExheW91 dCh0aGlzLCAyLCAzLCBTUEFDSU5HKTsKIAogICBmQ2FsRmlsZUxhYmVsID0gbmV3IFFMYWJlbChp MThuKCJDYWxlbmRhciBGaWxlOiIpLApAQCAtMTYwLDcgKzExNCw4IEBAIFRvZG9TZXR1cFBhZ2U6 OlRvZG9TZXR1cFBhZ2Uoc2V0dXBEaWFsb2cKICAgZ3JpZC0+YWRkV2lkZ2V0KGZEZWxldGVPblBp bG90LCAyLCAxKTsKIH0KIAotVG9kb1NldHVwUGFnZTo6flRvZG9TZXR1cFBhZ2UoKSB7CitUb2Rv U2V0dXBQYWdlOjp+VG9kb1NldHVwUGFnZSgpCit7CiAgIGRlbGV0ZSBmQ2FsZW5kYXJGaWxlOwog ICBkZWxldGUgZlByb21wdEZpcnN0VGltZTsKICAgZGVsZXRlIGZEZWxldGVPblBpbG90OwpJbmRl eDogY29uZHVpdHMvdmNhbGNvbmR1aXQvdmNhbC1jb25kdWl0LmNjCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZp bGU6IC9ob21lL2tkZS9rZGVwaW0va3BpbG90L2NvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWwtY29u ZHVpdC5jYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40MgpkaWZmIC11IC0zIC1kIC1wIC1yMS40 MiB2Y2FsLWNvbmR1aXQuY2MKLS0tIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWwtY29uZHVpdC5j YwkyMDAxLzA2LzEzIDIxOjMwOjI0CTEuNDIKKysrIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWwt Y29uZHVpdC5jYwkyMDAxLzA2LzE3IDIyOjAzOjIwCkBAIC0yLDEyICsyLDEyIEBACiAqKgogKiog Q29weXJpZ2h0IChDKSAxOTk4LTIwMDAgYnkgRGFuIFBpbG9uZSwgUHJlc3RvbiBCcm93biwgYW5k CiAqKglIZXJ3aW4gSmFuIFN0ZWVob3V3ZXIKKyoqIENvcHlyaWdodCAoQykgMjAwMSBieSBDb3Ju ZWxpdXMgU2NodW1hY2hlcgogKioKICoqIEEgcHJvZ3JhbSB0byBzeW5jaHJvbml6ZSBLT3JnYW5p emVyJ3MgZGF0ZSBib29rIHdpdGggdGhlIFBhbG0KICoqIFBpbG90IC8gS1BpbG90LiBUaGlzIHBy b2dyYW0gaXMgcGFydCBvZiBLUGlsb3QuCiAqLwogCi0KIC8qCiAqKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiog aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkKQEAgLTI1LDE1ICsyNSw2IEBACiAqKiBNQSAwMjEzOSwgVVNBLgogKi8KIAot LyoKLSoqIEJ1ZyByZXBvcnRzIGFuZCBxdWVzdGlvbnMgY2FuIGJlIHNlbnQgdG8gYWRyaWRnQGNz Lmt1bi5ubAotKi8KLQotCi0vLyBJIGhhdmUgbm90aWNlZCB0aGF0IHRoaXMgaXMgZnVsbCBvZiBt ZW1vcnkgbGVha3MsIGJ1dCBzaW5jZSBpdCBpcwotLy8gc2hvcnQgbGl2ZWQsIGl0IHNob3VsZG4n dCBtYXR0ZXIgc28gbXVjaC4gLS0gUEdCCi0KLQogI2lmbmRlZiBfS1BJTE9UX09QVElPTlNfSAog I2luY2x1ZGUgIm9wdGlvbnMuaCIKICNlbmRpZgpAQCAtNDQsMTk2ICszNSwxMTYgQEAKICNpbmNs dWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLSNpZm5kZWYgUUJJVEFSUkFZX0gK ICNpbmNsdWRlIDxxYml0YXJyYXkuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFESVJfSAogI2luY2x1 ZGUgPHFkaXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFEQVRFVE1fSAogI2luY2x1ZGUgPHFkYXRl dG0uaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFTVFJJTkdfSAogI2luY2x1ZGUgPHFzdHJpbmcuaD4K LSNlbmRpZgotCi0jaWZuZGVmIFFNU0dCT1hfSAogI2luY2x1ZGUgPHFtc2dib3guaD4KLSNlbmRp ZgotCiAKLSNpZm5kZWYgX0tDT05GSUdfSAogI2luY2x1ZGUgPGtjb25maWcuaD4KLSNlbmRpZgot Ci0jaWZuZGVmIF9LREVCVUdfSAogI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2VuZGlmCi0KIAotI2lm bmRlZiBfS1BJTE9UX0tQSUxPVENPTkZJR19ICiAjaW5jbHVkZSAia3BpbG90Q29uZmlnLmgiCi0j ZW5kaWYKLQotI2lmbmRlZiBfS1BJTE9UX1BJTE9UREFUQUJBU0VfSAogI2luY2x1ZGUgInBpbG90 RGF0YWJhc2UuaCIKLSNlbmRpZgotCi0jaWZuZGVmIF9LUElMT1RfUElMT1RSRUNPUkRfSAotI2lu Y2x1ZGUgInBpbG90UmVjb3JkLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBfS1BJTE9UX1BJTE9UREFU RUVOVFJZX0gKICNpbmNsdWRlICJwaWxvdERhdGVFbnRyeS5oIgotI2VuZGlmCi0KIAotI2lmbmRl ZiBfS1BJTE9UX1ZDQUxfQ09ORFVJVF9ICiAjaW5jbHVkZSAidmNhbC1jb25kdWl0LmgiCi0jZW5k aWYKLQotI2lmbmRlZiBfS1BJTE9UX1ZDQUxfU0VUVVBfSAogI2luY2x1ZGUgInZjYWwtc2V0dXAu aCIKLSNlbmRpZgotCi0jaWZuZGVmIF9LUElMT1RfQ09ORFVJVEFQUF9ICiAjaW5jbHVkZSAiY29u ZHVpdEFwcC5oIgotI2VuZGlmCiAKLSNpZm5kZWYgX19WQ0NfSF9fCi0jaW5jbHVkZSAidmNjLmgi Ci0jZW5kaWYKLQogc3RhdGljIGNvbnN0IGNoYXIgKmlkPQogCSIkSWQ6IHZjYWwtY29uZHVpdC5j Yyx2IDEuNDIgMjAwMS8wNi8xMyAyMTozMDoyNCBhZHJpZGcgRXhwICQiOwogCiAKIGludCBtYWlu KGludCBhcmdjLCBjaGFyKiBhcmd2W10pCiB7Ci0gIENvbmR1aXRBcHAgYShhcmdjLCBhcmd2LCAi dmNhbF9jb25kdWl0IiwKLSAgCSJDYWxlbmRhciAvIE9yZ2FuaXplciBjb25kdWl0IiwKLQlLUElM T1RfVkVSU0lPTik7CisgIENvbmR1aXRBcHAgYShhcmdjLGFyZ3YsInZjYWxfY29uZHVpdCIsIkNh bGVuZGFyIC8gT3JnYW5pemVyIGNvbmR1aXQiLAorICAgICAgICAgICAgICAgS1BJTE9UX1ZFUlNJ T04pOwogICBhLmFkZEF1dGhvcigiUHJlc3RvbiBCcm93biIsSTE4Tl9OT09QKCJPcmdhbml6ZXIg YXV0aG9yIikpOwotCWEuYWRkQXV0aG9yKCJBZHJpYWFuIGRlIEdyb290IiwKLQkJSTE4Tl9OT09Q KCJNYWludGFpbmVyIiksCi0JCSJhZHJpZGdAY3Mua3VuLm5sIik7Ci0JYS5hZGRBdXRob3IoIlBo aWxpcHAgSHVsbG1hbm4iLAotCQlJMThOX05PT1AoIkJ1Z2ZpeGVyIikpOwotICBWQ2FsQ29uZHVp dCBjb25kdWl0KGEuZ2V0TW9kZSgpKTsKKyAgYS5hZGRBdXRob3IoIkFkcmlhYW4gZGUgR3Jvb3Qi LEkxOE5fTk9PUCgiTWFpbnRhaW5lciIpLCJhZHJpZGdAY3Mua3VuLm5sIik7CisgIGEuYWRkQXV0 aG9yKCJQaGlsaXBwIEh1bGxtYW5uIixJMThOX05PT1AoIkJ1Z2ZpeGVyIikpOworICBhLmFkZEF1 dGhvcigiQ29ybmVsaXVzIFNjaHVtYWNoZXIiLEkxOE5fTk9PUCgiaUNhbGVuZGFyIHBvcnQiKSk7 CisKKyAgVkNhbENvbmR1aXQgY29uZHVpdChhLmdldE1vZGUoKSxhLmdldERCU291cmNlKCkpOwog ICBhLnNldENvbmR1aXQoJmNvbmR1aXQpOwogICByZXR1cm4gYS5leGVjKGZhbHNlLHRydWUpOwog Ci0JLyogTk9UUkVBQ0hFRCAqLwotCSh2b2lkKSBpZDsKKyAgLyogTk9UUkVBQ0hFRCAqLworICAo dm9pZCkgaWQ7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1WQ2FsQ29uZHVpdDo6 VkNhbENvbmR1aXQoQmFzZUNvbmR1aXQ6OmVDb25kdWl0TW9kZSBtb2RlKSA6Ci0JVkNhbEJhc2VD b25kdWl0KG1vZGUpCitWQ2FsQ29uZHVpdDo6VkNhbENvbmR1aXQoZUNvbmR1aXRNb2RlIG1vZGUs RGF0YWJhc2VTb3VyY2Ugc291cmNlKSA6CisgIFZDYWxCYXNlQ29uZHVpdChtb2RlLHNvdXJjZSkK IHsKLQlGVU5DVElPTlNFVFVQOwogfQogCi0KIFZDYWxDb25kdWl0Ojp+VkNhbENvbmR1aXQoKQog ewogfQogCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQogdm9pZCBWQ2FsQ29uZHVpdDo6ZG9CYWNr dXAoKQogewogICBGVU5DVElPTlNFVFVQOwotICBQaWxvdFJlY29yZCogcmVjOwotICBpbnQgaW5k ZXggPSAwOwogCi0JaWYgKCFnZXRDYWxlbmRhcihWQ2FsU2V0dXA6OlZDYWxHcm91cCkpCi0Jewot CQlub0NhbGVuZGFyRXJyb3IoaTE4bigiVkNhbCBDb25kdWl0IikpOwotCQlleGl0KENvbmR1aXRN aXNjb25maWd1cmVkKTsKLQl9CisgIGlmICghZ2V0Q2FsZW5kYXIoVkNhbFNldHVwOjpWQ2FsR3Jv dXApKQorICB7CisgICAgbm9DYWxlbmRhckVycm9yKGkxOG4oIlZDYWwgQ29uZHVpdCIpKTsKKyAg ICBleGl0KENvbmR1aXRNaXNjb25maWd1cmVkKTsKKyAgfQogCQkKLQlERUJVR0NPTkRVSVQgPDwg X19GVU5DVElPTl9fCi0JCSAgICAgPDwgIjogUGVyZm9ybWluZyBmdWxsIGJhY2t1cCIKLQkJICAg ICA8PCBlbmRsOwotCi0JLy8gR2V0IEFMTCBlbnRyaWVzIGZyb20gUGlsb3QKLQkvLwotCS8vCi0J d2hpbGUgKChyZWM9cmVhZFJlY29yZEJ5SW5kZXgoaW5kZXgrKykpKQotCXsKLQkJaWYgKHJlYy0+ aXNEZWxldGVkKCkpCi0JCXsKLQkJCWRlbGV0ZVZPYmplY3QocmVjLCBWQ0V2ZW50UHJvcCk7Ci0J CX0KLQkJZWxzZQotCQl7Ci0JCQl1cGRhdGVWT2JqZWN0KHJlYyk7Ci0JCX0KLQkJZGVsZXRlIHJl YzsKLQl9Ci0KLQlzYXZlVkNhbCgpOwotfSAvLyB2b2lkIFZDYWxDb25kdWl0Ojpkb0JhY2t1cCgp CisgIERFQlVHQ09ORFVJVCA8PCBfX0ZVTkNUSU9OX18KKyAgICAgICAgICAgICAgIDw8ICI6IFBl cmZvcm1pbmcgZnVsbCBiYWNrdXAiCisgICAgICAgICAgICAgICA8PCBlbmRsOwogCisgIC8vIEdl dCBBTEwgZW50cmllcyBmcm9tIFBpbG90CisgIGludCBpbmRleCA9IDA7CisgIFBpbG90UmVjb3Jk KiByZWM7CisgIHdoaWxlICgocmVjPXJlYWRSZWNvcmRCeUluZGV4KGluZGV4KyspKSkgeworICAg IGlmIChyZWMtPmlzRGVsZXRlZCgpKSBkZWxldGVSZWNvcmQocmVjKTsKKyAgICBlbHNlIHVwZGF0 ZUV2ZW50KHJlYyk7CisgIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgc2F2ZVZDYWwoKTsKK30K IAogCiB2b2lkIFZDYWxDb25kdWl0Ojpkb1N5bmMoKQogewotCUZVTkNUSU9OU0VUVVA7CisgIEZV TkNUSU9OU0VUVVA7CiAKLSAgIFBpbG90UmVjb3JkKiByZWM7Ci0JaW50IHJlY29yZGNvdW50PTA7 CisgIFBpbG90UmVjb3JkKiByZWM7CisgIGludCByZWNvcmRjb3VudD0wOwogCi0JaWYgKCFnZXRD YWxlbmRhcihWQ2FsU2V0dXA6OlZDYWxHcm91cCkpIHsKLQkgIG5vQ2FsZW5kYXJFcnJvcihpMThu KCJWQ2FsIENvbmR1aXQiKSk7Ci0JICBleGl0KENvbmR1aXRNaXNjb25maWd1cmVkKTsKLQl9Cisg IGlmICghZ2V0Q2FsZW5kYXIoVkNhbFNldHVwOjpWQ2FsR3JvdXApKSB7CisgICAgbm9DYWxlbmRh ckVycm9yKGkxOG4oIlZDYWwgQ29uZHVpdCIpKTsKKyAgICBleGl0KENvbmR1aXRNaXNjb25maWd1 cmVkKTsKKyAgfQogCi0JLy8gZ2V0IG9ubHkgTU9ESUZJRUQgZW50cmllcyBmcm9tIFBpbG90LCBj b21wYXJlZCB3aXRoIAotCS8vIHRoZSBhYm92ZSAoZG9CYWNrdXApLCB3aGljaCBnZXRzIEFMTCBl bnRyaWVzCi0JLy8KLQkvLwotCXdoaWxlICgocmVjPXJlYWROZXh0TW9kaWZpZWRSZWNvcmQoKSkp IAotCXsKLQkJcmVjb3JkY291bnQrKzsKLQkJaWYgKHJlYy0+aXNEZWxldGVkKCkpCi0JCXsKLQkJ CWRlbGV0ZVZPYmplY3QocmVjLCBWQ0V2ZW50UHJvcCk7Ci0JCX0gCi0JCWVsc2UgCi0JCXsKLQkJ CWJvb2wgcGlsb3RSZWNNb2RpZmllZCA9IAotCQkJCShyZWMtPmdldEF0dHJpYigpICYgZGxwUmVj QXR0ckRpcnR5KTsKLQkJCWlmIChwaWxvdFJlY01vZGlmaWVkKSAKLQkJCXsKLQkJCQl1cGRhdGVW T2JqZWN0KHJlYyk7Ci0JCQl9IAotCQkJZWxzZSAKLQkJCXsKLQkJCSAga2RXYXJuaW5nKENPTkRV SVRfQVJFQSkgPDwgX19GVU5DVElPTl9fCi0JCQkJCTw8ICJ3ZWlyZCEgd2UgYXNrZWQgZm9yIGEg bW9kaWZpZWQgIgotCQkJCQkgICAicmVjb3JkIGFuZCBnb3Qgb25lIHRoYXQgd2Fzbid0IgotCQkJ CQk8PCBlbmRsOwotCQkJfQotCQl9Ci0JCWRlbGV0ZSByZWM7Ci0JfQorICAvLyBnZXQgb25seSBN T0RJRklFRCBlbnRyaWVzIGZyb20gUGlsb3QsIGNvbXBhcmVkIHdpdGggCisgIC8vIHRoZSBhYm92 ZSAoZG9CYWNrdXApLCB3aGljaCBnZXRzIEFMTCBlbnRyaWVzCisgIHdoaWxlICgocmVjPXJlYWRO ZXh0TW9kaWZpZWRSZWNvcmQoKSkpIHsKKyAgICByZWNvcmRjb3VudCsrOworICAgIGlmIChyZWMt PmlzRGVsZXRlZCgpKSBkZWxldGVSZWNvcmQocmVjKTsKKyAgICBlbHNlIHsKKyAgICAgIGJvb2wg cGlsb3RSZWNNb2RpZmllZCA9IHJlYy0+Z2V0QXR0cmliKCkgJiBkbHBSZWNBdHRyRGlydHk7Cisg ICAgICBpZiAocGlsb3RSZWNNb2RpZmllZCkgeworICAgICAgICB1cGRhdGVFdmVudChyZWMpOwor ICAgICAgfSBlbHNlIHsKKyAgICAgICAga2RXYXJuaW5nKENPTkRVSVRfQVJFQSkgPDwgX19GVU5D VElPTl9fCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ3ZWlyZCEgd2UgYXNr ZWQgZm9yIGEgbW9kaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi cmVjb3JkIGFuZCBnb3Qgb25lIHRoYXQgd2Fzbid0IgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgcmVjOworICB9CiAg ICAKLQlERUJVR0NPTkRVSVQgPDwgX19GVU5DVElPTl9fCi0JCQkgICAgICA8PCAiOiBSZWFkIGEg dG90YWwgb2YgIgotCQkJICAgICAgPDwgcmVjb3JkY291bnQKLQkJCSAgICAgIDw8ICIgbW9kaWZp ZWQgcmVjb3JkcyBmcm9tIHRoZSBwaWxvdC4iCi0JCQkgICAgICA8PCBlbmRsOworICBERUJVR0NP TkRVSVQgPDwgX19GVU5DVElPTl9fCisgICAgICAgICAgICAgICA8PCAiOiBSZWFkIGEgdG90YWwg b2YgIgorICAgICAgICAgICAgICAgPDwgcmVjb3JkY291bnQKKyAgICAgICAgICAgICAgIDw8ICIg bW9kaWZpZWQgcmVjb3JkcyBmcm9tIHRoZSBwaWxvdC4iCisgICAgICAgICAgICAgICA8PCBlbmRs OwogCiAgICAvLyBub3csIGFsbCB0aGUgc3R1ZmYgdGhhdCB3YXMgbW9kaWZpZWQvbmV3IG9uIHRo ZSBwaWxvdCBzaG91bGQgYmUKICAgIC8vIGFkZGVkIHRvIHRoZSB2Q2FsZW5kYXIuICBXZSBub3cg bmVlZCB0byBhZGQgc3R1ZmYgdG8gdGhlIHBpbG90CkBAIC0yNDIsMTQwICsxNTMsNDEgQEAgdm9p ZCBWQ2FsQ29uZHVpdDo6ZG9TeW5jKCkKICAgIAogICAgLy8gbm93IHdlIHNhdmUgdGhlIHZDYWxl bmRhci4KICAgIHNhdmVWQ2FsKCk7Ci19IC8vIHZvaWQgVkNhbENvbmR1aXQ6OmRvU3luYygpCi0K LQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi12b2lkIFZDYWxDb25kdWl0OjpyZXBlYXRGb3JldmVy KAotCVBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksCi0JaW50IHJGcmVxLAotCVZPYmplY3QgKnZl dmVudCkKLXsKLQlGVU5DVElPTlNFVFVQOwotCi0JY29uc3QgY2hhciAqcyA9ICI8bm8gZGVzY3Jp cHRpb24+IjsKLQotCWlmICh2ZXZlbnQpCi0JewotCQlWT2JqZWN0ICp2byA9IGlzQVByb3BlcnR5 T2YodmV2ZW50LCBWQ1N1bW1hcnlQcm9wKTsKLQkJaWYgKHZvICE9IDBMKQotCQl7Ci0JCQlzPWZh a2VDU3RyaW5nKHZPYmplY3RVU3RyaW5nWlZhbHVlKHZvKSk7Ci0JCX0KLQl9Ci0KLQotCWRhdGVF bnRyeS0+c2V0UmVwZWF0RnJlcXVlbmN5KHJGcmVxKTsKLQlkYXRlRW50cnktPnNldFJlcGVhdEZv cmV2ZXIoKTsKLQlrZFdhcm5pbmcoQ09ORFVJVF9BUkVBKSA8PCBfX0ZVTkNUSU9OX18KLQkJPDwg IjogcmVwZWF0IGR1cmF0aW9uIGlzIGZvcmV2ZXIgZm9yICIKLQkJPDwgcwotCQk8PCBlbmRsOwot fSAKLS8vIHZvaWQgVkNhbENvbmR1aXQ6OnJlcGVhdEZvcmV2ZXIoUGlsb3REYXRlRW50cnkgKmRh dGVFbnRyeSwJaW50Ci0vLyByRnJlcSwgVk9iamVjdCAqdmV2ZW50KQotCi0KLQotLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KLQotCi12b2lkIFZDYWxDb25kdWl0OjpyZXBlYXRVbnRpbCgKLQlQaWxvdERhdGVF bnRyeSAqZGF0ZUVudHJ5LAotCWNvbnN0IHN0cnVjdCB0bSAqc3RhcnQsCi0JaW50IHJGcmVxLAot CWludCByRHVyYXRpb24sCi0JUGVyaW9kQ29uc3RhbnRzIHBlcmlvZCkKLXsKLQlGVU5DVElPTlNF VFVQOwotCXN0cnVjdCB0bSByU3RhcnQgPSAqc3RhcnQ7Ci0JdGltZV90IGVuZF90aW1lID0gbWt0 aW1lKCZyU3RhcnQpOwotCXN0cnVjdCB0bSByRW5kID0gKnN0YXJ0OwotCi0Jc3dpdGNoKHBlcmlv ZCkKLQl7Ci0JY2FzZSBEYWlseVBlcmlvZDoKLQljYXNlIFdlZWtseVBlcmlvZDoKLQkJLy8gQ2Fs Y3VsYXRlIHRoZSBlbmQgdGltZSBieSBhZGRpbmcgdGhlIHJpZ2h0IG51bWJlciBvZgotCQkvLyBy ZXBlYXQgcGVyaW9kcy4KLQkJLy8KLQkJLy8KLQkJZW5kX3RpbWUgKz0gckZyZXEgKiAockR1cmF0 aW9uLTEpICogKGludCkgcGVyaW9kOwotCi0JCWRhdGVFbnRyeS0+c2V0UmVwZWF0RnJlcXVlbmN5 KHJGcmVxKTsKLQkJZGF0ZUVudHJ5LT5zZXRSZXBlYXRFbmQoKmxvY2FsdGltZSgmZW5kX3RpbWUp KTsKLQkJYnJlYWs7Ci0JY2FzZSBNb250aGx5QnlEYXlQZXJpb2Q6Ci0JY2FzZSBNb250aGx5QnlQ b3NQZXJpb2Q6Ci0JCWRhdGVFbnRyeS0+c2V0UmVwZWF0RnJlcXVlbmN5KHJGcmVxKTsKLQkJckVu ZC50bV9tb24gKz0gckZyZXEgKiAockR1cmF0aW9uIC0gMSk7Ci0JCXJFbmQudG1feWVhciArPSBy RW5kLnRtX21vbiAvIDEyOwotCQlyRW5kLnRtX21vbiAlPSAxMjsKLQkJZGF0ZUVudHJ5LT5zZXRS ZXBlYXRFbmQockVuZCk7Ci0JCWJyZWFrOwotCWNhc2UgWWVhcmx5QnlEYXlQZXJpb2Q6Ci0JCWRh dGVFbnRyeS0+c2V0UmVwZWF0RnJlcXVlbmN5KHJGcmVxKTsKLQkJckVuZC50bV95ZWFyICs9IHJG cmVxICogKHJEdXJhdGlvbiAtIDEpOwotCQlkYXRlRW50cnktPnNldFJlcGVhdEVuZChyRW5kKTsK LQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJa2RXYXJuaW5nKENPTkRVSVRfQVJFQSkgPDwgX19GVU5D VElPTl9fCi0JCQk8PCAiOiBVbmtub3duIHJlcGVhdCBwZXJpb2QgIgotCQkJPDwgKGludCkgcGVy aW9kCi0JCQk8PCBlbmRsOwotCX0KIH0KLS8vIHZvaWQgVkNhbENvbmR1aXQ6OnJlcGVhdFVudGls KFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksIHN0cnVjdCB0bQotLy8gc3RhcnQsIGludCByRnJl cSwgaW50IHJEdXJhdGlvbiwgUGVyaW9kQ29uc3RhbnRzIHBlcmlvZCkKLQotLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLwogCiAvKgogICogR2l2ZW4gYSBwaWxvdCByZWNvcmQsIGNoZWNrIHRvIHNlZSB3 aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gdGhlCiAgKiBhbmFsb2dvdXMgdm9iamVjdCB0byBicmlu ZyB0aGluZ3MgaW50byBzeW5jLgogICovCi12b2lkIFZDYWxDb25kdWl0Ojp1cGRhdGVWT2JqZWN0 KFBpbG90UmVjb3JkICpyZWMpIHsKK3ZvaWQgVkNhbENvbmR1aXQ6OnVwZGF0ZUV2ZW50KFBpbG90 UmVjb3JkICpyZWMpCit7CiAgIEZVTkNUSU9OU0VUVVA7CiAKLSAgUURhdGVUaW1lIHRvZGF5c0Rh dGUgPSBRRGF0ZVRpbWU6OmN1cnJlbnREYXRlVGltZSgpOwotICAvL1FTdHJpbmcgdG1wU3RyOwot ICAvL1FTdHJpbmcgbnVtU3RyOwogICBQaWxvdERhdGVFbnRyeSBkYXRlRW50cnkocmVjKTsKKwor ICBrZERlYnVnKCkgPDwgIlZDYWxDb25kdWl0Ojp1cGRhdGVFdmVudCgpICIgPDwgZGF0ZUVudHJ5 LmdldERlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIDw8IGVuZGw7CiAgIAotICBWT2JqZWN0ICp2 ZXZlbnQgPSBmaW5kRW50cnlJbkNhbGVuZGFyKHJlYy0+Z2V0SUQoKSwgVkNFdmVudFByb3ApOwor ICBFdmVudCAqdmV2ZW50ID0gZmluZEV2ZW50KHJlYy0+Z2V0SUQoKSk7CiAgIGlmICghdmV2ZW50 KSB7CiAgICAgLy8gbm8gZXZlbnQgd2FzIGZvdW5kLCBzbyB3ZSBuZWVkIHRvIGFkZCBvbmUgd2l0 aCBzb21lIGluaXRpYWwgaW5mbwogICAgIERFQlVHQ09ORFVJVCA8PCBfX0ZVTkNUSU9OX18gPDwg IjogY3JlYXRpbmcgbmV3IHZDYWxlbmRhciBldmVudCIKIAkJIDw8IGVuZGw7Ci0gICAgdmV2ZW50 ID0gYWRkUHJvcChjYWxlbmRhcigpLCBWQ0V2ZW50UHJvcCk7CisgICAgdmV2ZW50ID0gbmV3IEV2 ZW50OworICAgIHZldmVudC0+c2V0T3JnYW5pemVyKGNhbGVuZGFyKCktPmdldEVtYWlsKCkpOwog ICAgIAotICAgIGFkZERhdGVQcm9wZXJ0eSh2ZXZlbnQsIFZDRENyZWF0ZWRQcm9wLCB0b2RheXNE YXRlKTsKKyAgICBjYWxlbmRhcigpLT5hZGRFdmVudCh2ZXZlbnQpOwogCi0gICAgUVN0cmluZyBu dW1TdHI7Ci0gICAgbnVtU3RyLnNwcmludGYoIktQaWxvdCAtICVsZCIsIHJlYy0+Z2V0SUQoKSk7 Ci0gICAgYWRkUHJvcFZhbHVlKHZldmVudCwgVkNVbmlxdWVTdHJpbmdQcm9wLCBudW1TdHIubGF0 aW4xKCkpOwotICAgIGFkZFByb3BWYWx1ZSh2ZXZlbnQsIFZDU2VxdWVuY2VQcm9wLCAiMSIpOwot ICAgIGFkZERhdGVQcm9wZXJ0eSh2ZXZlbnQsVkNMYXN0TW9kaWZpZWRQcm9wLHRvZGF5c0RhdGUp OwotICAgIAotICAgIGFkZFByb3BWYWx1ZSh2ZXZlbnQsIFZDUHJpb3JpdHlQcm9wLCAiMCIpOwot ICAgIGFkZFByb3BWYWx1ZSh2ZXZlbnQsIFZDVHJhbnNwUHJvcCwgIjAiKTsKLSAgICBhZGRQcm9w VmFsdWUodmV2ZW50LCBWQ1JlbGF0ZWRUb1Byb3AsICIwIik7Ci0gICAgYWRkUHJvcFZhbHVlKHZl dmVudCwgS1BpbG90SWRQcm9wLAotCQkgbnVtU3RyLnNldE51bShkYXRlRW50cnkuZ2V0SUQoKSku bGF0aW4xKCkpOwotICAgIGFkZFByb3BWYWx1ZSh2ZXZlbnQsIEtQaWxvdFN0YXR1c1Byb3AsICIw Iik7CisgICAgdmV2ZW50LT5zZXRQaWxvdElkKGRhdGVFbnRyeS5nZXRJRCgpKTsKKyAgICB2ZXZl bnQtPnNldFN5bmNTdGF0dXMoSW5jaWRlbmNlOjpTWU5DTk9ORSk7CiAgIH0KLSAgCi0gIC8vIGRl dGVybWluZSB3aGV0aGVyIHRoZSB2b2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBs YXN0IHN5bmMKLSAgYm9vbCB2Y2FsUmVjTW9kaWZpZWQgPSAoZ2V0U3RhdHVzKHZldmVudCkgIT0g MCk7CiAgIAotICBpZiAodmNhbFJlY01vZGlmaWVkKSB7Ci0gICAgLy8gd2UgZG9uJ3Qgd2FudCB0 byBtb2RpZnkgdGhlIHZvYmplY3Qgd2l0aCBwaWxvdCBpbmZvLCBiZWNhdXNlIGl0IGhhcwotICAg IC8vIGFscmVhZHkgYmVlbiAgbW9kaWZpZWQgb24gdGhlIGRlc2t0b3AuICBUaGUgVk9iamVjdCdz IG1vZGlmaWVkIHN0YXRlCi0gICAgLy8gb3ZlcnJpZGVzIHRoZSBQaWxvdFJlYydzIG1vZGlmaWVk IHN0YXRlLgotICAgIHJldHVybjsKLSAgfQorICAvLyB3ZSBkb24ndCB3YW50IHRvIG1vZGlmeSB0 aGUgdm9iamVjdCB3aXRoIHBpbG90IGluZm8sIGJlY2F1c2UgaXQgaGFzCisgIC8vIGFscmVhZHkg YmVlbiAgbW9kaWZpZWQgb24gdGhlIGRlc2t0b3AuICBUaGUgVk9iamVjdCdzIG1vZGlmaWVkIHN0 YXRlCisgIC8vIG92ZXJyaWRlcyB0aGUgUGlsb3RSZWMncyBtb2RpZmllZCBzdGF0ZS4KKworICBp ZiAodmV2ZW50LT5zeW5jU3RhdHVzKCkgIT0gSW5jaWRlbmNlOjpTWU5DTk9ORSkgcmV0dXJuOwor CiAgIC8vIG90aGVyd2lzZSwgdGhlIHZPYmplY3QgaGFzbid0IGJlZW4gdG91Y2hlZC4gIFVwZGF0 ZWQgaXQgd2l0aCB0aGUKICAgLy8gaW5mbyBmcm9tIHRoZSBQaWxvdFJlYy4KICAgCkBAIC0zODcs MTU0ICsxOTksMTAyIEBAIHZvaWQgVkNhbENvbmR1aXQ6OnVwZGF0ZVZPYmplY3QoUGlsb3RSZWMK ICAgc2V0U3VtbWFyeSh2ZXZlbnQsIGRhdGVFbnRyeS5nZXREZXNjcmlwdGlvbigpKTsKICAgc2V0 Tm90ZSh2ZXZlbnQsIGRhdGVFbnRyeS5nZXROb3RlKCkpOwogICBzZXRTZWNyZXQodmV2ZW50LCAo cmVjLT5nZXRBdHRyaWIoKSAmIGRscFJlY0F0dHJTZWNyZXQpKTsKLSAgc2V0U3RhdHVzKHZldmVu dCwgMCk7CiAgIAotfSAvLyB2b2lkIFZDYWxDb25kdWl0Ojp1cGRhdGVWT2JqZWN0KFBpbG90UmVj b3JkICpyZWMpCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgdmV2ZW50LT5zZXRTeW5jU3RhdHVz KEluY2lkZW5jZTo6U1lOQ05PTkUpOyAgCiAKKyAga2REZWJ1ZygpIDw8ICJWQ2FsQ29uZHVpdDo6 dXBkYXRlRXZlbnQoKSBkb25lIiA8PCBlbmRsOworfQogCi12b2lkIFZDYWxDb25kdWl0OjpzZXRW Y2FsU3RhcnRFbmRUaW1lcyhWT2JqZWN0ICp2ZXZlbnQsCi0JCQkJICAgICAgIGNvbnN0IFBpbG90 RGF0ZUVudHJ5ICZkYXRlRW50cnkpIHsKLSAgRlVOQ1RJT05TRVRVUDsKIAordm9pZCBWQ2FsQ29u ZHVpdDo6c2V0VmNhbFN0YXJ0RW5kVGltZXMoRXZlbnQgKnZldmVudCwKKwkJCQkgICAgICAgY29u c3QgUGlsb3REYXRlRW50cnkgJmRhdGVFbnRyeSkKK3sKICAgLy8gU1RBUlQgVElNRSAvLwotICBW T2JqZWN0ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBWQ0RUc3RhcnRQcm9wKTsKKyAgdmV2 ZW50LT5zZXREdFN0YXJ0KHJlYWRUbShkYXRlRW50cnkuZ2V0RXZlbnRTdGFydCgpKSk7CiAgIAog ICAvLyBjaGVjayB3aGV0aGVyIHRoZSBldmVudCBpcyBhbiBldmVudCBvciBhbiBhcHBvaW50bWVu dC4gIFNlZSBkYXRlRW50cnkKICAgLy8gc3RydWN0dXJlIGZvciBtb3JlIGluZm8uCi0gIGlmICgh ZGF0ZUVudHJ5LmdldEV2ZW50KCkpIHsKLSAgICAvLyB0aGUgZXZlbnQgZG9lc24ndCAiZmxvYXQi Ci0gICAgaWYgKHZvKQotICAgICAgc2V0RGF0ZVByb3BlcnR5KHZvLGRhdGVFbnRyeS5nZXRFdmVu dFN0YXJ0X3AoKSk7Ci0gICAgZWxzZSAKLSAgICAgIGFkZERhdGVQcm9wZXJ0eSh2ZXZlbnQsIFZD RFRzdGFydFByb3AsIAotCQkgICAgICBkYXRlRW50cnkuZ2V0RXZlbnRTdGFydF9wKCkpOworICBp ZiAoZGF0ZUVudHJ5LmdldEV2ZW50KCkpIHsKKyAgICB2ZXZlbnQtPnNldEZsb2F0cyh0cnVlKTsK ICAgfSBlbHNlIHsKLSAgICAvLyB0aGUgZXZlbnQgZmxvYXRzCi0gICAgaWYgKHZvKQotICAgICAg c2V0RGF0ZVByb3BlcnR5KHZvLGRhdGVFbnRyeS5nZXRFdmVudFN0YXJ0X3AoKSx0cnVlKTsKLSAg ICBlbHNlCi0gICAgICBhZGREYXRlUHJvcGVydHkodmV2ZW50LCBWQ0RUc3RhcnRQcm9wLAotCQkg ICAgICBkYXRlRW50cnkuZ2V0RXZlbnRTdGFydF9wKCksdHJ1ZSk7Ci0gIH0KLQotICAvLyBFTkQg VElNRSAvLwotICB2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBWQ0RUZW5kUHJvcCk7Ci0gIAot ICAvLyBQYXRjaCBieSBIZWlrbwotICBib29sIG11bHRpRGF5ID0gKCAoZGF0ZUVudHJ5LmdldFJl cGVhdFR5cGUoKSA9PSByZXBlYXREYWlseSkgJiYKLQkJICAgIGRhdGVFbnRyeS5nZXRFdmVudCgp ICk7Ci0gIAotICBpZiAobXVsdGlEYXkpIHsKLSAgICAvLyBJIGhvbmVzdGx5IGRvbid0IGtub3cg d2hhdCB3YXMgc3VwcG9zZWQgdG8gZ28gaGVyZQorICAgIHZldmVudC0+c2V0RmxvYXRzKGZhbHNl KTsKICAgfQogCi0gIFFEYXRlVGltZSBlbmREVDsKKyAgLy8gRU5EIFRJTUUgLy8gIAogICAvLyBo YW5kbGUgdGhlIGNhc2Ugb2YgYSAicmVwZWF0aW5nIGV2ZW50IG9uIGEgZGFpbHkgYmFzaXMiIHdo aWNoIGlzIHRoZQogICAvLyBwaWxvdCdzIHdheSBvZiBpbmRpY2F0aW5nIGEgbXVsdGktZGF5IGV2 ZW50LgotICBpZiAoIW11bHRpRGF5KSB7Ci0gICAgZW5kRFQuc2V0RGF0ZShRRGF0ZSgxOTAwK2Rh dGVFbnRyeS5nZXRFdmVudEVuZCgpLnRtX3llYXIsCi0JCQlkYXRlRW50cnkuZ2V0RXZlbnRFbmQo KS50bV9tb24gKyAxLAotCQkJZGF0ZUVudHJ5LmdldEV2ZW50RW5kKCkudG1fbWRheSkpOwotICAg IGVuZERULnNldFRpbWUoUVRpbWUoZGF0ZUVudHJ5LmdldEV2ZW50RW5kKCkudG1faG91ciwKLQkJ CWRhdGVFbnRyeS5nZXRFdmVudEVuZCgpLnRtX21pbiwKLQkJCWRhdGVFbnRyeS5nZXRFdmVudEVu ZCgpLnRtX3NlYykpOworICBpZiAoZGF0ZUVudHJ5LmlzTXVsdGlEYXkoKSkgeworICAgIHZldmVu dC0+c2V0RHRFbmQocmVhZFRtKGRhdGVFbnRyeS5nZXRSZXBlYXRFbmQoKSkpOwogICB9IGVsc2Ug ewotICAgIGVuZERULnNldERhdGUoUURhdGUoMTkwMCtkYXRlRW50cnkuZ2V0UmVwZWF0RW5kKCku dG1feWVhciwKLQkJCWRhdGVFbnRyeS5nZXRSZXBlYXRFbmQoKS50bV9tb24gKyAxLAotCQkJZGF0 ZUVudHJ5LmdldFJlcGVhdEVuZCgpLnRtX21kYXkpKTsKLSAgICBlbmREVC5zZXRUaW1lKFFUaW1l KGRhdGVFbnRyeS5nZXRSZXBlYXRFbmQoKS50bV9ob3VyLAotCQkJZGF0ZUVudHJ5LmdldFJlcGVh dEVuZCgpLnRtX21pbiwKLQkJCWRhdGVFbnRyeS5nZXRSZXBlYXRFbmQoKS50bV9zZWMpKTsKKyAg ICB2ZXZlbnQtPnNldER0RW5kKHJlYWRUbShkYXRlRW50cnkuZ2V0RXZlbnRFbmQoKSkpOwogICB9 Ci0gICAgICAKLQotICBpZiAodm8pCi0gICAgc2V0RGF0ZVByb3BlcnR5KHZvLCBlbmREVCwgZGF0 ZUVudHJ5LmdldEV2ZW50KCkpOwotICBlbHNlIAotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gYWRk IGl0IGlmIGl0IGlzbid0IHRoZXJlIGFscmVhZHksIG9yIGlmIHRoZQotICAgICAgIGV2ZW50IGlz bid0IG11bHRpZGF5L2Zsb2F0aW5nLiAgSXQgaXMgZGVwcmVjYXRlZCB0byBoYXZlIGJvdGgKLSAg ICAgICBEVFNUQVJUIGFuZCBEVEVORCBzZXQgdG8gMDAwMDAwIGZvciB0aGVpciB0aW1lcy4gKi8K LSAgICBpZiAoIWRhdGVFbnRyeS5nZXRFdmVudCgpIHx8IG11bHRpRGF5KQotICAgICAgYWRkRGF0 ZVByb3BlcnR5KHZldmVudCwgVkNEVGVuZFByb3AsIGVuZERULCBkYXRlRW50cnkuZ2V0RXZlbnQo KSk7Ci19IAotLy8gdm9pZCBWQ2FsQ29uZHVpdDo6c2V0VmNhbFN0YXJ0RW5kVGltZXMoVk9iamVj dCAqdmV2ZW50LAotLy8gUGlsb3REYXRlRW50cnkgKmRhdGVFbnRyeSkKLQotCi0vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLworfQogCiAKLXZvaWQgVkNhbENvbmR1aXQ6OnNldFZjYWxBbGFybXMoVk9iamVjdCAq dmV2ZW50LCAKLQkJCQljb25zdCBQaWxvdERhdGVFbnRyeSAmZGF0ZUVudHJ5KSB7Cit2b2lkIFZD YWxDb25kdWl0OjpzZXRWY2FsQWxhcm1zKEluY2lkZW5jZSAqdmV2ZW50LCAKKwkJCQljb25zdCBQ aWxvdERhdGVFbnRyeSAmZGF0ZUVudHJ5KQorewogICBGVU5DVElPTlNFVFVQOwogCi0gIFZPYmpl Y3QgKnZvID0gaXNBUHJvcGVydHlPZih2ZXZlbnQsIFZDREFsYXJtUHJvcCk7Ci0KLSAgaWYgKGRh dGVFbnRyeS5nZXRBbGFybSgpKSB7Ci0gICAgUURhdGVUaW1lIGFsYXJtRFQ7Ci0gICAgYWxhcm1E VC5zZXREYXRlKFFEYXRlKDE5MDArZGF0ZUVudHJ5LmdldEV2ZW50U3RhcnQoKS50bV95ZWFyLAot CQkJICBkYXRlRW50cnkuZ2V0RXZlbnRTdGFydCgpLnRtX21vbiArIDEsCi0JCQkgIGRhdGVFbnRy eS5nZXRFdmVudFN0YXJ0KCkudG1fbWRheSkpOwotICAgIGFsYXJtRFQuc2V0VGltZShRVGltZShk YXRlRW50cnkuZ2V0RXZlbnRTdGFydCgpLnRtX2hvdXIsCi0JCQkgIGRhdGVFbnRyeS5nZXRFdmVu dFN0YXJ0KCkudG1fbWluLAotCQkJICBkYXRlRW50cnkuZ2V0RXZlbnRTdGFydCgpLnRtX3NlYykp OwotICAgIAotICAgIGludCBhZHZhbmNlVW5pdHMgPSBkYXRlRW50cnkuZ2V0QWR2YW5jZVVuaXRz KCk7Ci0gICAgc3dpdGNoKGFkdmFuY2VVbml0cykgewotICAgIGNhc2UgYWR2TWludXRlczogYWR2 YW5jZVVuaXRzID0gMTsgYnJlYWs7Ci0gICAgY2FzZSBhZHZIb3VyczogYWR2YW5jZVVuaXRzID0g NjA7IGJyZWFrOwotICAgIGNhc2UgYWR2RGF5czogYWR2YW5jZVVuaXRzID0gNjAqMjQ7IGJyZWFr OworICBpZiAoIWRhdGVFbnRyeS5nZXRBbGFybSgpKSByZXR1cm47CisgIAorICBRRGF0ZVRpbWUg YWxhcm1EVCA9IHJlYWRUbShkYXRlRW50cnkuZ2V0RXZlbnRTdGFydCgpKTsKKyAgCisgIGludCBh ZHZhbmNlVW5pdHMgPSBkYXRlRW50cnkuZ2V0QWR2YW5jZVVuaXRzKCk7CisgIHN3aXRjaCAoYWR2 YW5jZVVuaXRzKSB7CisgICAgY2FzZSBhZHZNaW51dGVzOgorICAgICAgYWR2YW5jZVVuaXRzID0g MTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWR2SG91cnM6CisgICAgICBhZHZhbmNlVW5pdHMg PSA2MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWR2RGF5czoKKyAgICAgIGFkdmFuY2VVbml0 cyA9IDYwKjI0OworICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIERFQlVHQ09ORFVJ VCA8PCBfX0ZVTkNUSU9OX18gCi0JCSAgIDw8ICI6IFVua25vd24gYWR2YW5jZSB1bml0cyAiCi0J CSAgIDw8IGFkdmFuY2VVbml0cwotCQkgICA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgIDw8 ICI6IFVua25vd24gYWR2YW5jZSB1bml0cyAiCisgICAgICAgICAgICAgICAgICAgPDwgYWR2YW5j ZVVuaXRzCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgIGFkdmFuY2VVbml0cz0x OwotICAgIH0KKyAgfQogCi0gICAgYWxhcm1EVCA9IGFsYXJtRFQuYWRkU2Vjcyg2MCphZHZhbmNl VW5pdHMqLShkYXRlRW50cnkuZ2V0QWR2YW5jZSgpKSk7CisgIGFsYXJtRFQgPSBhbGFybURULmFk ZFNlY3MoNjAqYWR2YW5jZVVuaXRzKi0oZGF0ZUVudHJ5LmdldEFkdmFuY2UoKSkpOwogCi0gICAg aWYgKHZvKSB7Ci0gICAgICB2byA9IGlzQVByb3BlcnR5T2Yodm8sIFZDUnVuVGltZVByb3ApOwot ICAgICAgc2V0RGF0ZVByb3BlcnR5KHZvLCBhbGFybURUKTsKLSAgICB9IGVsc2UgewotICAgICAg dm8gPSBhZGRQcm9wKHZldmVudCwgVkNEQWxhcm1Qcm9wKTsKLSAgICAgIGFkZERhdGVQcm9wZXJ0 eSh2bywgVkNSdW5UaW1lUHJvcCwgYWxhcm1EVCk7Ci0gICAgICBhZGRQcm9wVmFsdWUodm8sIFZD UmVwZWF0Q291bnRQcm9wLCAiMSIpOwotICAgICAgYWRkUHJvcFZhbHVlKHZvLCBWQ0Rpc3BsYXlT dHJpbmdQcm9wLCAiYmVlcCEiKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodm8pCi0gICAgYWRkUHJv cCh2bywgS1BpbG90U2tpcFByb3ApOworICB2ZXZlbnQtPmFsYXJtKCktPnNldFRpbWUoYWxhcm1E VCk7CisgIHZldmVudC0+YWxhcm0oKS0+c2V0UmVwZWF0Q291bnQoMSk7ICAvLyBFbmFibGUgYWxh cm0KIH0KLS8vIHZvaWQgVkNhbENvbmR1aXQ6OnNldFZjYWxBbGFybXMoVk9iamVjdCAqdmV2ZW50 LCBQaWxvdERhdGVFbnRyeQotLy8gKmRhdGVFbnRyeSkKLQogCi0vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwog Ci0KLS8qIFBpbG90IGVudHJpZXMgdGhhdCByZXBlYXQgZGFpbHkgYXJlIG5vdCB3aGF0IHdlIGNv bnNpZGVyIGRhaWx5Ci0gICByZXBlYXRpbmcgZXZlbnRzIGluIHZDYWxlbmRhci9LT3JnYW5pemVy LiAgSXQgaXMgYWN0dWFsbHkgYSBtdWx0aS1kYXkKLSAgIGFwcG9pbnRtZW50IGFuZCBoYW5kbGVk IGJ5IHNldFZjYWxTdGFydEVuZFRpbWVzKCkuICovCi12b2lkIFZDYWxDb25kdWl0OjpzZXRWY2Fs UmVjdXJyZW5jZShWT2JqZWN0ICp2ZXZlbnQsIAotCQkJCSAgICBjb25zdCBQaWxvdERhdGVFbnRy eSAmZGF0ZUVudHJ5KSB7Cit2b2lkIFZDYWxDb25kdWl0OjpzZXRWY2FsUmVjdXJyZW5jZShJbmNp ZGVuY2UgKnZldmVudCwgCisJCQkJICAgIGNvbnN0IFBpbG90RGF0ZUVudHJ5ICZkYXRlRW50cnkp Cit7CiAgIEZVTkNUSU9OU0VUVVA7CiAKLSAgY29uc3QgY2hhciAqZGF5bmFtZVtdID0geyJTVSAi LCAiTU8gIiwgIlRVICIsICJXRSAiLCAiVEggIiwgIkZSICIsCi0JCQkgICAiU0EgIn07CisgIC8v IFBpbG90IGVudHJpZXMgdGhhdCByZXBlYXQgZGFpbHkgYXJlIG5vdCB3aGF0IHdlIGNvbnNpZGVy IGRhaWx5CisgIC8vIHJlcGVhdGluZyBldmVudHMgaW4gdkNhbGVuZGFyL0tPcmdhbml6ZXIuICBJ dCBpcyBhY3R1YWxseSBhIG11bHRpLWRheQorICAvLyBhcHBvaW50bWVudCBhbmQgaGFuZGxlZCBi eSBzZXRWY2FsU3RhcnRFbmRUaW1lcygpLgorICBpZiAoKGRhdGVFbnRyeS5nZXRSZXBlYXRUeXBl KCkgPT0gcmVwZWF0Tm9uZSkgfHwKKyAgICAgICgoZGF0ZUVudHJ5LmdldFJlcGVhdFR5cGUoKSA9 PSByZXBlYXREYWlseSkgJiYgZGF0ZUVudHJ5LmdldEV2ZW50KCkpKSB7CisgICAgcmV0dXJuOwor ICB9CiAKLSAgVk9iamVjdCAqdm8gPSBpc0FQcm9wZXJ0eU9mKHZldmVudCwgVkNSUnVsZVByb3Ap OworICBLT1JlY3VycmVuY2UgKnJlY3VyID0gdmV2ZW50LT5yZWN1cnJlbmNlKCk7CisgIGludCBm cmVxID0gZGF0ZUVudHJ5LmdldFJlcGVhdEZyZXF1ZW5jeSgpOworICBib29sIHJlcGVhdHNGb3Jl dmVyID0gZGF0ZUVudHJ5LmdldFJlcGVhdEZvcmV2ZXIoKTsKKyAgUURhdGUgZW5kRGF0ZTsKKyAg aWYgKCFyZXBlYXRzRm9yZXZlcikgeworICAgIGVuZERhdGUgPSByZWFkVG0oZGF0ZUVudHJ5Lmdl dFJlcGVhdEVuZCgpKS5kYXRlKCk7CisgICAga2REZWJ1ZygpIDw8ICItLSBlbmQgIiA8PCBlbmRE YXRlLnRvU3RyaW5nKCkgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBrZERlYnVnKCkgPDwgIi0t IG5vZW5kIiA8PCBlbmRsOworICB9CisgIFFCaXRBcnJheSBkYXlBcnJheSg3KTsKIAotICBpZiAo ZGF0ZUVudHJ5LmdldFJlcGVhdFR5cGUoKSAhPSByZXBlYXROb25lICYmCi0gICAgICAhKChkYXRl RW50cnkuZ2V0UmVwZWF0VHlwZSgpID09IHJlcGVhdERhaWx5KSAmJgotCWRhdGVFbnRyeS5nZXRF dmVudCgpKSkgewotICAgIFFTdHJpbmcgdG1wU3RyKCIiKTsKLSAgICBzd2l0Y2goZGF0ZUVudHJ5 LmdldFJlcGVhdFR5cGUoKSkgeworICBzd2l0Y2goZGF0ZUVudHJ5LmdldFJlcGVhdFR5cGUoKSkg ewogICAgIGNhc2UgcmVwZWF0RGFpbHk6Ci0gICAgICB0bXBTdHIuc3ByaW50ZigiRCVpICIsIGRh dGVFbnRyeS5nZXRSZXBlYXRGcmVxdWVuY3koKSk7CisgICAgICBpZiAocmVwZWF0c0ZvcmV2ZXIp IHJlY3VyLT5zZXREYWlseShmcmVxLDApOworICAgICAgZWxzZSByZWN1ci0+c2V0RGFpbHkoZnJl cSxlbmREYXRlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgcmVwZWF0V2Vla2x5OgogICAgICAg ewpAQCAtNTUwLDIxICszMTAsNDAgQEAgdm9pZCBWQ2FsQ29uZHVpdDo6c2V0VmNhbFJlY3VycmVu Y2UoVk9iagogCQkgICAgIDw8IGRheXNbNl0gPDwgIiAiCiAJCSAgICAgPDwgZW5kbDsKIAotCXRt cFN0ci5zcHJpbnRmKCJXJWkgIiwgZGF0ZUVudHJ5LmdldFJlcGVhdEZyZXF1ZW5jeSgpKTsKLQlm b3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykKLQkgIGlmIChkYXlzW2ldKSB0bXBTdHIuYXBwZW5k KGRheW5hbWVbaV0pOworICAgICAgICBpZiAoZGF5c1swXSkgZGF5QXJyYXkuc2V0Qml0KDYpOwor CWZvciAoaW50IGkgPSAxOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgaWYgKGRheXNbaV0pIGRh eUFycmF5LnNldEJpdChpLTEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcGVhdHNGb3Jl dmVyKSByZWN1ci0+c2V0V2Vla2x5KGZyZXEsZGF5QXJyYXksMCk7CisgICAgICAgIGVsc2UgcmVj dXItPnNldFdlZWtseShmcmVxLGRheUFycmF5LGVuZERhdGUpOwogICAgICAgfQogICAgICAgYnJl YWs7Ci0gICAgY2FzZSByZXBlYXRNb250aGx5QnlEYXk6IAorICAgIGNhc2UgcmVwZWF0TW9udGhs eUJ5RGF5OgorICAgICAgaWYgKHJlcGVhdHNGb3JldmVyKSByZWN1ci0+c2V0TW9udGhseShLT1Jl Y3VycmVuY2U6OnJNb250aGx5UG9zLGZyZXEsMCk7CisgICAgICBlbHNlIHJlY3VyLT5zZXRNb250 aGx5KEtPUmVjdXJyZW5jZTo6ck1vbnRobHlQb3MsZnJlcSxlbmREYXRlKTsKKworICAgICAgZGF5 QXJyYXkuc2V0Qml0KGRhdGVFbnRyeS5nZXRSZXBlYXREYXkoKSAlIDcpOworICAgICAgcmVjdXIt PmFkZE1vbnRobHlQb3MoKGRhdGVFbnRyeS5nZXRSZXBlYXREYXkoKSAvIDcpICsgMSxkYXlBcnJh eSk7CisjaWYgMAogICAgICAgdG1wU3RyLnNwcmludGYoIk1QJWkgJWQrICIsIGRhdGVFbnRyeS5n ZXRSZXBlYXRGcmVxdWVuY3koKSwKIAkJICAgICAoZGF0ZUVudHJ5LmdldFJlcGVhdERheSgpIC8g NykgKyAxKTsKICAgICAgIHRtcFN0ci5hcHBlbmQoZGF5bmFtZVtkYXRlRW50cnkuZ2V0UmVwZWF0 RGF5KCkgJSA3XSk7CisjZW5kaWYKICAgICAgIGJyZWFrOwogICAgIGNhc2UgcmVwZWF0TW9udGhs eUJ5RGF0ZToKKyAgICAgIGlmIChyZXBlYXRzRm9yZXZlcikgcmVjdXItPnNldE1vbnRobHkoS09S ZWN1cnJlbmNlOjpyTW9udGhseURheSxmcmVxLDApOworICAgICAgZWxzZSByZWN1ci0+c2V0TW9u dGhseShLT1JlY3VycmVuY2U6OnJNb250aGx5RGF5LGZyZXEsZW5kRGF0ZSk7CisjaWYgMCAgICAg IAogICAgICAgdG1wU3RyLnNwcmludGYoIk1EJWkgIiwgZGF0ZUVudHJ5LmdldFJlcGVhdEZyZXF1 ZW5jeSgpKTsKKyNlbmRpZgogICAgICAgYnJlYWs7CiAgICAgY2FzZSByZXBlYXRZZWFybHk6Cisg ICAgICBpZiAocmVwZWF0c0ZvcmV2ZXIpIHJlY3VyLT5zZXRZZWFybHkoS09SZWN1cnJlbmNlOjpy WWVhcmx5RGF5LGZyZXEsMCk7CisgICAgICBlbHNlIHJlY3VyLT5zZXRZZWFybHkoS09SZWN1cnJl bmNlOjpyWWVhcmx5RGF5LGZyZXEsZW5kRGF0ZSk7CisjaWYgMAogICAgICAgdG1wU3RyLnNwcmlu dGYoIllEJWkgIiwgZGF0ZUVudHJ5LmdldFJlcGVhdEZyZXF1ZW5jeSgpKTsKKyNlbmRpZgogICAg ICAgYnJlYWs7CiAgICAgY2FzZSByZXBlYXROb25lOgogICAgICAgREVCVUdDT05EVUlUIDw8IF9f RlVOQ1RJT05fXwpAQCAtNTczLDU5ICszNTIsMzAgQEAgdm9pZCBWQ2FsQ29uZHVpdDo6c2V0VmNh bFJlY3VycmVuY2UoVk9iagogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFr OwotICAgIH0KLQotICAgIGlmIChkYXRlRW50cnkuZ2V0UmVwZWF0Rm9yZXZlcigpKQotICAgICAg dG1wU3RyICs9ICIjMCI7Ci0gICAgZWxzZSAKLSAgICAgIHRtcFN0ciArPSBUbVRvSVNPKGRhdGVF bnRyeS5nZXRSZXBlYXRFbmQoKSk7Ci0KLSAgICB2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBW Q1JSdWxlUHJvcCk7Ci0gICAgaWYgKHZvKQotICAgICAgc2V0Vk9iamVjdFVTdHJpbmdaVmFsdWVf KHZvLCBmYWtlVW5pY29kZSh0bXBTdHIubGF0aW4xKCksIDApKTsKLSAgICBlbHNlCi0gICAgICBh ZGRQcm9wVmFsdWUodmV2ZW50LCBWQ1JSdWxlUHJvcCx0bXBTdHIubGF0aW4xKCkpOwotICB9IGVs c2UgaWYgKHZvKQotICAgIGFkZFByb3Aodm8sIEtQaWxvdFNraXBQcm9wKTsKKyAgfQogfQotLy8g dm9pZCBWQ2FsQ29uZHVpdDo6c2V0VmNhbFJlY3VycmVuY2UoVk9iamVjdCAqdmV2ZW50LCBQaWxv dERhdGVFbnRyeQotLy8gKmRhdGVFbnRyeSkKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAKLXZv aWQgVkNhbENvbmR1aXQ6OnNldFZjYWxFeGNlcHRpb25zKFZPYmplY3QgKnZldmVudCwgCi0JCQkJ ICAgIGNvbnN0IFBpbG90RGF0ZUVudHJ5ICZkYXRlRW50cnkpIHsKK3ZvaWQgVkNhbENvbmR1aXQ6 OnNldFZjYWxFeGNlcHRpb25zKEluY2lkZW5jZSAqdmV2ZW50LCAKKwkJCQkgICAgY29uc3QgUGls b3REYXRlRW50cnkgJmRhdGVFbnRyeSkKK3sKICAgRlVOQ1RJT05TRVRVUDsKIAogICBpZiAoKChk YXRlRW50cnkuZ2V0UmVwZWF0VHlwZSgpID09IHJlcGVhdERhaWx5KSAmJgotICAgICAgIGRhdGVF bnRyeS5nZXRFdmVudCgpKSAmJiBkYXRlRW50cnkuZ2V0RXhjZXB0aW9uQ291bnQoKSkKKyAgICAg ICBkYXRlRW50cnkuZ2V0RXZlbnQoKSkgJiYgZGF0ZUVudHJ5LmdldEV4Y2VwdGlvbkNvdW50KCkp IHsKICAgICBERUJVR0NPTkRVSVQgPDwgX19GVU5DVElPTl9fCiAJCSA8PCAiOiBXQVJOSU5HIEV4 Y2VwdGlvbnMgaWdub3JlZCBmb3IgbXVsdGktZGF5IGV2ZW50ICIKIAkJIDw8IGRhdGVFbnRyeS5n ZXREZXNjcmlwdGlvbigpCiAJCSA8PCBlbmRsIDsKKyAgICByZXR1cm47CisgIH0KIAotICBWT2Jq ZWN0ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBWQ0V4RGF0ZVByb3ApOwotICBRU3RyaW5n IHRtcFN0cigiIik7Ci0gIGlmIChkYXRlRW50cnkuZ2V0RXhjZXB0aW9uQ291bnQoKSkgewotICAg IGZvciAoaW50IGkgPSAwOyBpIDwgZGF0ZUVudHJ5LmdldEV4Y2VwdGlvbkNvdW50KCk7IGkrKykg ewotICAgICAgdG1wU3RyICs9IFRtVG9JU08oZGF0ZUVudHJ5LmdldEV4Y2VwdGlvbnMoKVtpXSk7 Ci0gICAgICB0bXBTdHIgKz0gIjsiOwotICAgIH0KLSAgICB0bXBTdHIudHJ1bmNhdGUodG1wU3Ry Lmxlbmd0aCgpIC0gMSk7Ci0gICAgaWYgKHZvKQotICAgICAgc2V0Vk9iamVjdFVTdHJpbmdaVmFs dWVfKHZvLCBmYWtlVW5pY29kZSh0bXBTdHIubGF0aW4xKCksIDApKTsKLSAgICBlbHNlCi0gICAg ICBhZGRQcm9wVmFsdWUodmV2ZW50LCBWQ0V4RGF0ZVByb3AsIHRtcFN0ci5sYXRpbjEoKSk7Ci0g IH0gZWxzZSBpZiAodm8pCi0gICAgYWRkUHJvcCh2bywgS1BpbG90U2tpcFByb3ApOworICBmb3Ig KGludCBpID0gMDsgaSA8IGRhdGVFbnRyeS5nZXRFeGNlcHRpb25Db3VudCgpOyBpKyspIHsKKyAg ICB2ZXZlbnQtPmFkZEV4RGF0ZShyZWFkVG0oZGF0ZUVudHJ5LmdldEV4Y2VwdGlvbnMoKVtpXSku ZGF0ZSgpKTsKKyAgfQogfQogCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQogdm9pZCBWQ2FsQ29u ZHVpdDo6ZG9Mb2NhbFN5bmMoKQogewogICBGVU5DVElPTlNFVFVQOwpAQCAtNjM0LDE4OSArMzg0 LDE1MSBAQCB2b2lkIFZDYWxDb25kdWl0Ojpkb0xvY2FsU3luYygpCiAJICAgICAgIDw8ICI6IFBl cmZvcm1pbmcgbG9jYWwgc3luYy4iCiAJICAgICAgIDw8IGVuZGw7CiAKLSAgVk9iamVjdEl0ZXJh dG9yIGk7Ci0gIGluaXRQcm9wSXRlcmF0b3IoJmksIGNhbGVuZGFyKCkpOwotCiAgIGludCByZWNv cmRjb3VudCA9IDA7CiAKKyAgUUxpc3Q8RXZlbnQ+IGV2ZW50cyA9IGNhbGVuZGFyKCktPmdldEFs bEV2ZW50cygpOworCiAgIC8vIGdvIHRocm91Z2ggdGhlIHdob2xlIHZDYWxlbmRhci4gIElmIHRo ZSBldmVudCBoYXMgdGhlIGRpcnR5CiAgIC8vIChtb2RpZmllZCkgZmxhZyBzZXQsIG1ha2UgYSBu ZXcgcGlsb3QgcmVjb3JkIGFuZCBhZGQgaXQuICB3ZSBvbmx5CiAgIC8vIHRha2UgZXZlbnRzIHRo YXQgaGF2ZSBLUGlsb3RTdGF0dXNQcm9wIGFzIGEgcHJvcGVydHkuICBJZiB0aGlzCiAgIC8vIHBy b3BlcnR5IGlzbid0IHByZXNlbnQsIGlnbm9yZSB0aGUgZXZlbnQuCiAKLSAgLyogU2luY2UgdGhl IGNhbGVuZGFyIGlzIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCB3ZSBuZWVkIGEgcG9pbnRlciB0bwot ICAgICB0aGUgcHJldmlvdXMgaXRlbS4gKi8KLSAgVk9iamVjdCAqcHJldmlvdXNFdmVudCA9IDA7 Ci0KLSAgd2hpbGUgKG1vcmVJdGVyYXRpb24oJmkpKSB7CisgIGZvcihFdmVudCAqZXZlbnQgPSBl dmVudHMuZmlyc3QoKTtldmVudDtldmVudCA9IGV2ZW50cy5uZXh0KCkpIHsKICAgICByZWNvcmRj b3VudCsrOwotICAgIFZPYmplY3QgKnZldmVudCA9IG5leHRWT2JqZWN0KCZpKTsKIAotICAgIGlm IChnZXRTdGF0dXModmV2ZW50KSAhPSAyICYmCi0JKHN0cmNtcCh2T2JqZWN0TmFtZSh2ZXZlbnQp LCBWQ0V2ZW50UHJvcCkgPT0gMCkpIHsKLSAgICAgIC8vIHRoZSBjYWxlbmRhciBlbnRyeSBpcyBh biBldmVudCBhbmQgaGFzIGEgS1BpbG90U3RhdHVzIGZpZWxkCisgICAgaWYgKGV2ZW50LT5zeW5j U3RhdHVzKCkgPT0gSW5jaWRlbmNlOjpTWU5DTU9EKSB7CisgICAgICAvLyB0aGUgZXZlbnQgaGFz IGJlZW4gbW9kaWZpZWQsIG5lZWQgdG8gd3JpdGUgaXQgdG8gdGhlIHBpbG90CiAKLSAgICAgIHJl Y29yZGlkX3QgaWQ7Ci0gICAgICBpZiAoZ2V0U3RhdHVzKHZldmVudCkgPT0gMSkgewotCS8vIHRo ZSBldmVudCBoYXMgYmVlbiBtb2RpZmllZCwgbmVlZCB0byB3cml0ZSBpdCB0byB0aGUgcGlsb3QK LQkvLyB3ZSByZWFkIHRoZSBwaWxvdElELgorICAgICAgLy8gd2UgcmVhZCB0aGUgcGlsb3RJRC4K IAkKLQlpZCA9IGdldFJlY29yZElEKHZldmVudCk7CisgICAgICBpbnQgaWQgPSBldmVudC0+cGls b3RJZCgpOwogCQotCS8vIGlmIGlkICE9IDAsIHRoaXMgaXMgYSBtb2RpZmllZCBldmVudCwgb3Ro ZXJ3aXNlIGl0IGlzIG5ldy4KKyAgICAgIC8vIGlmIGlkICE9IDAsIHRoaXMgaXMgYSBtb2RpZmll ZCBldmVudCwgb3RoZXJ3aXNlIGl0IGlzIG5ldy4KIAotCVBpbG90RGF0ZUVudHJ5ICpkYXRlRW50 cnkgPSAwTDsKKyAgICAgIFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnkgPSAwOwogCQotCWlmIChp ZCAhPSAwKSB7Ci0JICBQaWxvdFJlY29yZCAqcFJlYyA9IHJlYWRSZWNvcmRCeUlkKGlkKTsKLQkg IC8vIGlmIHRoaXMgZmFpbHMsIHNvbWVob3cgdGhlIHJlY29yZCBnb3QgZGVsZXRlZCBmcm9tIHRo ZSBwaWxvdAotCSAgLy8gYnV0IHdlIHdlcmUgbmV2ZXIgaW5mb3JtZWQhIGJhZCBwaWxvdC4gbmF1 Z2h0eSBwaWxvdC4KKyAgICAgIGlmIChpZCAhPSAwKSB7CisgICAgICAgIFBpbG90UmVjb3JkICpw UmVjID0gcmVhZFJlY29yZEJ5SWQoaWQpOworICAgICAgICAvLyBpZiB0aGlzIGZhaWxzLCBzb21l aG93IHRoZSByZWNvcmQgZ290IGRlbGV0ZWQgZnJvbSB0aGUgcGlsb3QKKyAgICAgICAgLy8gYnV0 IHdlIHdlcmUgbmV2ZXIgaW5mb3JtZWQhIGJhZCBwaWxvdC4gbmF1Z2h0eSBwaWxvdC4KIAotCSAg aWYgKHBSZWMpCi0JICAgIC8vIElmIHRoZSByZWNvcmQgd2FzIGRlbGV0ZWQgb24gdGhlIHBpbG90 LCByZWNyZWF0ZSBpdC4KLQkgICAgZGF0ZUVudHJ5ID0gbmV3IFBpbG90RGF0ZUVudHJ5KHBSZWMp OwotCSAgZWxzZSB7Ci0JICAgIGRhdGVFbnRyeSA9IG5ldyBQaWxvdERhdGVFbnRyeSgpOwotCSAg ICBpZCA9IDA7Ci0JICB9Ci0JfSBlbHNlCi0JICBkYXRlRW50cnkgPSBuZXcgUGlsb3REYXRlRW50 cnkoKTsKKyAgICAgICAgaWYgKHBSZWMpIHsKKyAgICAgICAgICAvLyBJZiB0aGUgcmVjb3JkIHdh cyBkZWxldGVkIG9uIHRoZSBwaWxvdCwgcmVjcmVhdGUgaXQuCisgICAgICAgICAgZGF0ZUVudHJ5 ID0gbmV3IFBpbG90RGF0ZUVudHJ5KHBSZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg IGRhdGVFbnRyeSA9IG5ldyBQaWxvdERhdGVFbnRyeSgpOworICAgICAgICAgIGlkID0gMDsKKyAg ICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIGRhdGVFbnRyeSA9IG5ldyBQaWxvdERhdGVF bnRyeSgpOwogCi0Jc2V0U3RhcnRFbmRUaW1lcyhkYXRlRW50cnksIHZldmVudCk7Ci0Jc2V0QWxh cm1zKGRhdGVFbnRyeSwgdmV2ZW50KTsKKyAgICAgIHNldFN0YXJ0RW5kVGltZXMoZGF0ZUVudHJ5 LGV2ZW50KTsKKyAgICAgIHNldEFsYXJtcyhkYXRlRW50cnksZXZlbnQpOwogCi0JLy8gUkVDVVJS RU5DRShTKSAvLwotCXsKLQkgIC8vIGZpcnN0IHdlIGhhdmUgYSAnZmFrZSB0eXBlIG9mIHJlY3Vy cmVuY2UnIHdoZW4gYSBtdWx0aS1kYXkKLQkgIC8vIGV2ZW4gaXQgcGFzc2VkIHRvIHRoZSBwaWxv dCwgaXQgaXMgY29udmVydGVkIHRvIGFuIGV2ZW50Ci0JICAvLyB3aGljaCByZWN1cnMgZGFpbHkg YSBudW1iZXIgb2YgdGltZXMuCisgICAgICAvLyBSRUNVUlJFTkNFKFMpIC8vCiAKLQkgIHN0cnVj dCB0bSBzdGFydCA9IGdldFN0YXJ0VGltZSh2ZXZlbnQpOwotCSAgUURhdGVUaW1lIHRtcER0U3Rh cnQgPSB0bVRvUURhdGVUaW1lKHN0YXJ0KTsKLQkgIHN0cnVjdCB0bSBlbmQgPSBnZXRFbmRUaW1l KHZldmVudCk7Ci0JICBRRGF0ZVRpbWUgdG1wRHRFbmQgPSB0bVRvUURhdGVUaW1lKGVuZCk7Cisg ICAgICAvLyBmaXJzdCB3ZSBoYXZlIGEgJ2Zha2UgdHlwZSBvZiByZWN1cnJlbmNlJyB3aGVuIGEg bXVsdGktZGF5CisgICAgICAvLyBldmVuIGl0IHBhc3NlZCB0byB0aGUgcGlsb3QsIGl0IGlzIGNv bnZlcnRlZCB0byBhbiBldmVudAorICAgICAgLy8gd2hpY2ggcmVjdXJzIGRhaWx5IGEgbnVtYmVy IG9mIHRpbWVzLgorICAgICAgaWYgKGV2ZW50LT5pc011bHRpRGF5KCkgJiYgZXZlbnQtPmRvZXNG bG9hdCgpKSB7CisgICAgICAgIC8vIG11bHRpIGRheSBldmVudAorICAgICAgICBERUJVR0NPTkRV SVQgPDwgX19GVU5DVElPTl9fCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiBtdWx0aS1kYXkg ZXZlbnQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnQtPmR0U3RhcnQoKS50 b1N0cmluZygpKSA8PCAiIHRvICIgCisgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnQtPmR0 RW5kKCkudG9TdHJpbmcoKSkgPDwgZW5kbDsKKyAgICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRU eXBlKHJlcGVhdERhaWx5KTsKKyAgICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRGcmVxdWVuY3ko MSk7CisgICAgICAgIHN0cnVjdCB0bSBlbmQgPSB3cml0ZVRtKGV2ZW50LT5kdEVuZCgpKTsKKyAg ICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRFbmQoZW5kKTsKIAotCSAgaWYgKHRtcER0RW5kLmlz VmFsaWQoKSkKLQkgICAgaWYgKHRtcER0U3RhcnQuZGF5c1RvKHRtcER0RW5kKSA+IDAgJiYKLQkJ c3RhcnQudG1faG91ciA9PSAwICYmIHN0YXJ0LnRtX21pbiA9PSAwICYmIAotCQlzdGFydC50bV9z ZWMgPT0gMCkgewotCSAgICAgIC8vIG11bHRpIGRheSBldmVudAotCSAgICAgIERFQlVHQ09ORFVJ VCA8PCBfX0ZVTkNUSU9OX18KLQkJCSAgIDw8ICI6IG11bHRpLWRheSBldmVudCBmcm9tICIKLQkJ CSAgIDw8IHRtcER0U3RhcnQudG9TdHJpbmcoKSA8PCAiIHRvICIgCi0JCQkgICA8PCB0bXBEdEVu ZC50b1N0cmluZygpIDw8IGVuZGw7Ci0JICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRUeXBlKHJl cGVhdERhaWx5KTsKLQkgICAgICBkYXRlRW50cnktPnNldFJlcGVhdEZyZXF1ZW5jeSgxKTsKLQkg ICAgICBkYXRlRW50cnktPnNldFJlcGVhdEVuZChlbmQpOwotCSAgICAgIGlmIChpc0FQcm9wZXJ0 eU9mKHZldmVudCwgVkNFeERhdGVQcm9wKSAhPSAwTCkKLQkJREVCVUdDT05EVUlUIDw8IF9fRlVO Q1RJT05fXwotCQkJICAgICA8PCAiOiBXQVJOSU5HOiBleGNlcHRpb25zIGlnbm9yZWQgIgotCQkJ ICAgICA8PCAiZm9yIG11bHRpLWRheSBldmVudCAiCi0JCQkgICAgIDw8IGdldFN1bW1hcnkodmV2 ZW50KQotCQkJICAgICA8PCBlbmRsIDsKLQkgICAgfQotCX0KKyAgICAgICAgaWYgKGV2ZW50LT5l eERhdGVzKCkuY291bnQoKSA+IDApIHsKKyAgICAgICAgICBERUJVR0NPTkRVSVQgPDwgX19GVU5D VElPTl9fCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IFdBUk5JTkc6IGV4Y2VwdGlvbnMg aWdub3JlZCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmb3IgbXVsdGktZGF5IGV2ZW50 ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZXZlbnQtPnN1bW1hcnkoKQorICAgICAgICAg ICAgICAgICAgICAgICA8PCBlbmRsIDsKKyAgICAgICAgfQorICAgICAgfQogCi0JLy8gYW5kIG5v dyB0aGUgcmVhbCByZWN1cnJpbmcgZXZlbnRzCi0Jc2V0UmVwZXRpdGlvbihkYXRlRW50cnksIGdl dFJlcGV0aXRpb24odmV2ZW50KSk7CisgICAgICAvLyBhbmQgbm93IHRoZSByZWFsIHJlY3Vycmlu ZyBldmVudHMKKyAgICAgIHNldFJlcGV0aXRpb24oZGF0ZUVudHJ5LGV2ZW50KTsKIAkKLQkvLyBF WENFUFRJT04oUykgLy8KLQl7Ci0JICBpbnQgY291bnQ7Ci0JICBzdHJ1Y3QgdG0gKmV4Y2VwdGlv bkxpc3QgPSBnZXRFeGNlcHRpb25EYXRlcyh2ZXZlbnQsICZjb3VudCk7Ci0JICBpZiAoZXhjZXB0 aW9uTGlzdCkgewotCSAgICBkYXRlRW50cnktPnNldEV4Y2VwdGlvbkNvdW50KGNvdW50KTsKLQkg ICAgZGF0ZUVudHJ5LT5zZXRFeGNlcHRpb25zKGV4Y2VwdGlvbkxpc3QpOwotCSAgfSBlbHNlCi0J ICAgIGRhdGVFbnRyeS0+c2V0RXhjZXB0aW9uQ291bnQoMCk7Ci0JfQorICAgICAgLy8gRVhDRVBU SU9OKFMpIC8vCisgICAgICBpbnQgY291bnQ7CisgICAgICBzdHJ1Y3QgdG0gKmV4Y2VwdGlvbkxp c3QgPSBnZXRFeGNlcHRpb25EYXRlcyhldmVudCwmY291bnQpOworICAgICAgaWYgKGV4Y2VwdGlv bkxpc3QpIHsKKyAgICAgICAgZGF0ZUVudHJ5LT5zZXRFeGNlcHRpb25Db3VudChjb3VudCk7Cisg ICAgICAgIGRhdGVFbnRyeS0+c2V0RXhjZXB0aW9ucyhleGNlcHRpb25MaXN0KTsKKyAgICAgIH0g ZWxzZSB7CisgICAgICAgIGRhdGVFbnRyeS0+c2V0RXhjZXB0aW9uQ291bnQoMCk7CisgICAgICB9 CiAKLQkvLyBTVU1NQVJZIC8vCi0JZGF0ZUVudHJ5LT5zZXREZXNjcmlwdGlvbihnZXRTdW1tYXJ5 KHZldmVudCkubGF0aW4xKCkpOworICAgICAgLy8gU1VNTUFSWSAvLworICAgICAgZGF0ZUVudHJ5 LT5zZXREZXNjcmlwdGlvbihldmVudC0+c3VtbWFyeSgpKTsKIAotCS8vIERFU0NSSVBUSU9OIC8v Ci0JZGF0ZUVudHJ5LT5zZXROb3RlKGdldERlc2NyaXB0aW9uKHZldmVudCkubGF0aW4xKCkpOwor ICAgICAgLy8gREVTQ1JJUFRJT04gLy8KKyAgICAgIGRhdGVFbnRyeS0+c2V0Tm90ZShldmVudC0+ ZGVzY3JpcHRpb24oKSk7CiAKLQkvLyBwdXQgdGhlIHBpbG90UmVjIGluIHRoZSBkYXRhYmFzZS4u LgotCXsKLQkgIFBpbG90UmVjb3JkICpwUmVjID0gZGF0ZUVudHJ5LT5wYWNrKCk7Ci0JICBwUmVj LT5zZXRBdHRyaWIoZGF0ZUVudHJ5LT5nZXRBdHRyaWIoKSAmIH5kbHBSZWNBdHRyRGlydHkpOwot CSAgaWQgPSB3cml0ZVJlY29yZChwUmVjKTsKLQkgIDo6ZnJlZShwUmVjKTsKLQl9CisgICAgICAv LyBwdXQgdGhlIHBpbG90UmVjIGluIHRoZSBkYXRhYmFzZS4uLgorICAgICAgUGlsb3RSZWNvcmQg KnBSZWMgPSBkYXRlRW50cnktPnBhY2soKTsKKyAgICAgIHBSZWMtPnNldEF0dHJpYihkYXRlRW50 cnktPmdldEF0dHJpYigpICYgfmRscFJlY0F0dHJEaXJ0eSk7CisgICAgICBpZCA9IHdyaXRlUmVj b3JkKHBSZWMpOworICAgICAgOjpmcmVlKHBSZWMpOwogCi0JZGVsZXRlIGRhdGVFbnRyeTsKKyAg ICAgIGRlbGV0ZSBkYXRlRW50cnk7CiAKLQlpZiAoaWQgPiAwKSB7Ci0JICAvLyBXcml0aW5nIHN1 Y2NlZWRlZC4gV3JpdGUgdGhlIGlkIHdlIGdvdCBmcm9tIHdyaXRlUmVjb3JkCi0JICAvLyBiYWNr IHRvIHRoZSB2T2JqZWN0LgotCSAgc2V0TnVtUHJvcGVydHkodmV2ZW50LCBLUGlsb3RJZFByb3As IGlkKTsKLQl9IAorICAgICAgaWYgKGlkID4gMCkgeworICAgICAgICAvLyBXcml0aW5nIHN1Y2Nl ZWRlZC4gV3JpdGUgdGhlIGlkIHdlIGdvdCBmcm9tIHdyaXRlUmVjb3JkCisgICAgICAgIC8vIGJh Y2sgdG8gdGhlIHZPYmplY3QuCisgICAgICAgIGV2ZW50LT5zZXRQaWxvdElkKGlkKTsKICAgICAg IH0KICAgICAgIC8vIENsZWFyIHRoZSAnbW9kaWZpZWQnIGZsYWcuCi0gICAgICBzZXROdW1Qcm9w ZXJ0eSh2ZXZlbnQsIEtQaWxvdFN0YXR1c1Byb3AsIDApOworICAgICAgZXZlbnQtPnNldFN5bmNT dGF0dXMoSW5jaWRlbmNlOjpTWU5DTk9ORSk7CiAgICAgfQotICAgIHByZXZpb3VzRXZlbnQgPSB2 ZXZlbnQ7CiAgIH0KIAogICBERUJVR0NPTkRVSVQgPDwgX19GVU5DVElPTl9fIDw8ICI6IFJlYWQg IiA8PCByZWNvcmRjb3VudAotCQkJPDwgIiByZWNvcmRzIHRvdGFsLiIgPDwgZW5kbDsKKyAgICAg ICAgICAgICAgIDw8ICIgcmVjb3JkcyB0b3RhbC4iIDw8IGVuZGw7CiAgIAogICBLQ29uZmlnJiBj b25maWcgPSBLUGlsb3RDb25maWc6OmdldENvbmZpZyhWQ2FsU2V0dXA6OlZDYWxHcm91cCk7Ci0g IGJvb2wgRGVsZXRlT25QaWxvdCA9IGNvbmZpZy5yZWFkQm9vbEVudHJ5KCJEZWxldGVPblBpbG90 IiwgdHJ1ZSk7Ci0KLSAgaWYgKGZpcnN0VGltZSgpKQotICAgIGZpcnN0U3luY0NvcHkoRGVsZXRl T25QaWxvdCk7Ci0KLSAgaWYgKERlbGV0ZU9uUGlsb3QpCi0gICAgZGVsZXRlRnJvbVBpbG90KFZD RXZlbnRQcm9wKTsKKyAgYm9vbCBkZWxldGVPblBpbG90ID0gY29uZmlnLnJlYWRCb29sRW50cnko IkRlbGV0ZU9uUGlsb3QiLCB0cnVlKTsKIAotICBzZXRGaXJzdFRpbWUoY29uZmlnLCBmYWxzZSk7 Ci19IC8vIHZvaWQgVkNhbENvbmR1aXQ6OmRvTG9jYWxTeW5jKCkKKyAgaWYgKGZpcnN0VGltZSgp KSBmaXJzdFN5bmNDb3B5KGRlbGV0ZU9uUGlsb3QpOwogCisgIGlmIChkZWxldGVPblBpbG90KSBk ZWxldGVGcm9tUGlsb3QoVkNhbEJhc2VDb25kdWl0OjpUeXBlRXZlbnQpOwogCi0vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLworICBzZXRGaXJzdFRpbWUoY29uZmlnLGZhbHNlKTsKK30KIAogCi1zdHJ1Y3QgdG0g KlZDYWxDb25kdWl0OjpnZXRFeGNlcHRpb25EYXRlcyhWT2JqZWN0ICp2ZXZlbnQsIGludCAqbikg eworc3RydWN0IHRtICpWQ2FsQ29uZHVpdDo6Z2V0RXhjZXB0aW9uRGF0ZXMoRXZlbnQgKnZldmVu dCwgaW50ICpuKQorewogICBGVU5DVElPTlNFVFVQOworCiAgIHN0cnVjdCB0bSAqdG1MaXN0ID0g MDsKICAgaW50IGNvdW50ID0gMDsKLSAgVk9iamVjdCAqdm8gPSBpc0FQcm9wZXJ0eU9mKHZldmVu dCwgVkNFeERhdGVQcm9wKTsKLSAgaWYgKHZvKSB7Ci0gICAgY2hhciAqcyA9IGZha2VDU3RyaW5n KHZPYmplY3RVU3RyaW5nWlZhbHVlKHZvKSk7Ci0gICAgUVN0cmluZyB0bXBTdHIocyk7Ci0gICAg ZGVsZXRlU3RyKHMpOwotICAgIGludCBpbmRleCA9IDAsIGluZGV4MiA9IDA7Ci0gICAgc3RydWN0 IHRtIGV4dG07Ci0gICAgd2hpbGUgKChpbmRleDIgPSB0bXBTdHIuZmluZCgnLCcsIGluZGV4KSkg IT0gLTEpIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICB0bUxpc3QgPSAoc3RydWN0IHRtICopIHJl YWxsb2ModG1MaXN0LCBzaXplb2Yoc3RydWN0Ci0JCQkJCQkgICAgdG0pKmNvdW50KTsKLSAgICAg IGlmICh0bUxpc3QgPT0gMEwpCi0Ja2RGYXRhbChDT05EVUlUX0FSRUEpIDw8IF9fRlVOQ1RJT05f XwotCQkJICAgICAgPDwgIjogcmVhbGxvYygpIGZhaWxlZCEiCi0JCQkgICAgICA8PCBlbmRsOwot ICAgICAgZXh0bSA9IElTT1RvVG0odG1wU3RyLm1pZChpbmRleCwgKGluZGV4Mi1pbmRleCkpKTsK LSAgICAgIHRtTGlzdFtjb3VudC0xXSA9IGV4dG07Ci0gICAgICBpbmRleCA9IGluZGV4MiArIDE7 Ci0gICAgfQorCisgIFFEYXRlTGlzdCBkYXRlcyA9IHZldmVudC0+ZXhEYXRlcygpOworICBRRGF0 ZSAqZGF0ZSA9IGRhdGVzLmZpcnN0KCk7CisgIHdoaWxlKGRhdGUpIHsKKyAgICBzdHJ1Y3QgdG0g ZXh0bSA9IHdyaXRlVG0oKmRhdGUpOwogICAgICsrY291bnQ7CiAgICAgdG1MaXN0ID0gKHN0cnVj dCB0bSAqKSByZWFsbG9jKHRtTGlzdCwgc2l6ZW9mKHN0cnVjdCB0bSkqY291bnQpOwotICAgIGlm ICh0bUxpc3QgPT0gMEwpCisgICAgaWYgKCF0bUxpc3QpCiAgICAgICBrZEZhdGFsKENPTkRVSVRf QVJFQSkgPDwgX19GVU5DVElPTl9fCiAJCQkgICAgPDwgIjogcmVhbGxvYygpIGZhaWxlZCEiIDw8 IGVuZGw7Ci0gICAgZXh0bSA9IElTT1RvVG0odG1wU3RyLm1pZChpbmRleCwgKHRtcFN0ci5sZW5n dGgoKS1pbmRleCkpKTsKICAgICB0bUxpc3RbY291bnQtMV0gPSBleHRtOworICAKKyAgICBkYXRl ID0gZGF0ZXMubmV4dCgpOwogICB9CisKICAgaWYgKG4pICpuID0gY291bnQ7CiAgIHJldHVybiB0 bUxpc3Q7Ci19IC8vIHN0cnVjdCB0bSAqVkNhbENvbmR1aXQ6OmdldEV4Y2VwdGlvbkRhdGVzKGNv bnN0IFZPYmplY3QgKnZldmVudCwgaW50ICpuKQotCit9CiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAK LXZvaWQgVkNhbENvbmR1aXQ6OmZpcnN0U3luY0NvcHkoYm9vbCBEZWxldGVPblBpbG90KSB7Cit2 b2lkIFZDYWxDb25kdWl0OjpmaXJzdFN5bmNDb3B5KGJvb2wgRGVsZXRlT25QaWxvdCkKK3sKICAg RlVOQ1RJT05TRVRVUDsKIAogICBib29sIGluc2VydGFsbCA9IGZhbHNlLCBza2lwYWxsID0gZmFs c2U7CkBAIC04MzYsMTAgKzU0OCw4IEBAIHZvaWQgVkNhbENvbmR1aXQ6OmZpcnN0U3luY0NvcHko Ym9vbCBEZWwKIAkJCSAgICA8PCBlbmRsOwogICAgICAgY29udGludWU7CiAgICAgfQotICAgIAot ICAgIFZPYmplY3QgKnZldmVudCA9IGZpbmRFbnRyeUluQ2FsZW5kYXIocmVjLT5nZXRJRCgpLAot CQkJCQkgIFZDRXZlbnRQcm9wKTsKLSAgICBpZiAodmV2ZW50ID09IDBMKSB7CisKKyAgICBpZiAo ZmluZEV2ZW50KHJlYy0+Z2V0SUQoKSkpIHsKICAgICAgIERFQlVHQ09ORFVJVCA8PCBfX0ZVTkNU SU9OX18KIAkJICAgPDwgIjogRW50cnkgZm91bmQgb24gcGlsb3QgYnV0IG5vdCBpbiB2Y2FsZW5k YXIuIgogCQkgICA8PCBlbmRsOwpAQCAtODc2LDM5MyArNTg2LDE3MyBAQCB2b2lkIFZDYWxDb25k dWl0OjpmaXJzdFN5bmNDb3B5KGJvb2wgRGVsCiAJCSAgICAgPDwgZW5kbDsKIAkKIAlzd2l0Y2gg KHJlc3BvbnNlKSB7Ci0JY2FzZSAwOgotCWRlZmF1bHQ6IAotCSAgLyogRGVmYXVsdCBpcyB0byBp bnNlcnQgdGhpcyBzaW5nbGUgZW50cnkgYW5kIGFzayBhZ2FpbgotCSAgICAgbGF0ZXIuICovCi0J ICB1cGRhdGVWT2JqZWN0KHJlYyk7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvLyBTa2lwIHRo aXMgaXRlbSwgZGVsZXRpb24gaXMgaGFuZGxlZCBieSBkZWxldGVGcm9tUGlsb3QoKS4KLQkgIGJy ZWFrOwotCWNhc2UgMjoKLQkgIGluc2VydGFsbCA9IHRydWU7Ci0JICBza2lwYWxsID0gZmFsc2U7 Ci0JICB1cGRhdGVWT2JqZWN0KHJlYyk7Ci0JICBicmVhazsKLQl9IC8vIHN3aXRjaCAocmVzcG9u c2UpCisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGRlZmF1bHQ6IAorCSAgICAvKiBEZWZh dWx0IGlzIHRvIGluc2VydCB0aGlzIHNpbmdsZSBlbnRyeSBhbmQgYXNrIGFnYWluCisJICAgICAg IGxhdGVyLiAqLworICAgICAgICAgICAgdXBkYXRlRXZlbnQocmVjKTsKKyAgICAgICAgICAgIGJy ZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpdGVtLCBk ZWxldGlvbiBpcyBoYW5kbGVkIGJ5IGRlbGV0ZUZyb21QaWxvdCgpLgorICAgICAgICAgICAgYnJl YWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaW5zZXJ0YWxsID0gdHJ1ZTsKKyAg ICAgICAgICAgIHNraXBhbGwgPSBmYWxzZTsKKyAgICAgICAgICAgIHVwZGF0ZUV2ZW50KHJlYyk7 CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIGlmIChpbnNlcnRh bGwpIHsKLQkvLyBhbGwgcmVjb3JkcyBhcmUgdG8gYmUgaW5zZXJ0ZWQuCi0JdXBkYXRlVk9iamVj dChyZWMpOwotICAgICAgfQotICAgIH0gLy8gaWYgKCF2ZXZlbnQpCi0gICAgZGVsZXRlIHJlYzsK LSAgfSAvLyB3aGlsZSAoKHJlYyA9IHJlYWRSZWNvcmRCeUluZGV4KGluZGV4KyspKSAhPSAwKQot fSAvLyB2b2lkIFZDYWxDb25kdWl0Ojpwcm9jZXNzRGVsZXRlZCgpCi0KLQotLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KLQotc3RydWN0IFZDYWxDb25kdWl0OjpldmVudFJlcGV0aXRpb24KLVZDYWxDb25kdWl0 OjpnZXRSZXBldGl0aW9uKFZPYmplY3QgKnZldmVudCkgewotICBGVU5DVElPTlNFVFVQOwotCi0g IHN0cnVjdCBldmVudFJlcGV0aXRpb24gcjsKLSAgVk9iamVjdCAqdm8gPSBpc0FQcm9wZXJ0eU9m KHZldmVudCwgVkNSUnVsZVByb3ApOwotICBpZiAodm8pIHsKLSAgICByLnN0YXJ0RGF0ZSA9IGdl dFN0YXJ0VGltZSh2ZXZlbnQpOwotICAgIGNoYXIgKnMgPSBmYWtlQ1N0cmluZyh2T2JqZWN0VVN0 cmluZ1pWYWx1ZSh2bykpOwotICAgIFFTdHJpbmcgdG1wU3RyKHMpOwotICAgIGRlbGV0ZVN0cihz KTsKLSAgICB0bXBTdHIuc2ltcGxpZnlXaGl0ZVNwYWNlKCk7Ci0gICAgdG1wU3RyID0gdG1wU3Ry LnVwcGVyKCk7Ci0KLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGlmICh0bXBTdHIubGVmdCgxKSA9 PSAiRCIpIHsKLSAgICAgIERFQlVHQ09ORFVJVCA8PCBfX0ZVTkNUSU9OX18gPDwgIjogcmVwZWF0 IGRhaWx5IiA8PCBlbmRsOwotICAgICAgci50eXBlID0gOjpyZXBlYXREYWlseTsKLSAgICAgIHN0 YXJ0ID0gMTsKLSAgICB9IGVsc2UgaWYgKHRtcFN0ci5sZWZ0KDEpID09ICJXIikgewotICAgICAg REVCVUdDT05EVUlUIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiByZXBlYXQgd2Vla2x5IiA8PCBlbmRs OwotICAgICAgci50eXBlID0gOjpyZXBlYXRXZWVrbHk7Ci0gICAgICBzdGFydCA9IDE7Ci0gICAg fSBlbHNlIGlmICh0bXBTdHIubGVmdCgyKSA9PSAiTVAiKSB7Ci0gICAgICBERUJVR0NPTkRVSVQg PDwgX19GVU5DVElPTl9fIDw8ICI6IHJlcGVhdCBtb250aGx5IGJ5IGRheSIgPDwgZW5kbDsKLSAg ICAgIHIudHlwZSA9IDo6cmVwZWF0TW9udGhseUJ5RGF5OwotICAgICAgc3RhcnQgPSAyOwotICAg IH0gZWxzZSBpZiAodG1wU3RyLmxlZnQoMikgPT0gIk1EIikgewotICAgICAgREVCVUdDT05EVUlU IDw8IF9fRlVOQ1RJT05fXyA8PCAiOiByZXBlYXQgbW9udGhseSBieSBkYXRlIiA8PCBlbmRsOwot ICAgICAgci50eXBlID0gOjpyZXBlYXRNb250aGx5QnlEYXRlOwotICAgICAgc3RhcnQgPSAyOwot ICAgIH0gZWxzZSBpZiAodG1wU3RyLmxlZnQoMikgPT0gIllEIikgewotICAgICAgREVCVUdDT05E VUlUIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiByZXBlYXQgeWVhcmx5IiA8PCBlbmRsOwotICAgICAg ci50eXBlID0gOjpyZXBlYXRZZWFybHk7Ci0gICAgICBzdGFydCA9IDI7Ci0gICAgfSBlbHNlCi0g ICAgICByLnR5cGUgPSA6OnJlcGVhdE5vbmU7Ci0KLSAgICBpbnQgaW5kZXggPSB0bXBTdHIuZmlu ZCgnICcpOwotICAgIGludCBsYXN0ID0gdG1wU3RyLmZpbmRSZXYoJyAnKSArIDE7Ci0KLSAgICBy LmZyZXEgPSB0bXBTdHIubWlkKHN0YXJ0LCAoaW5kZXggLSAxKSkudG9JbnQoKTsKLSAgICBpbmRl eCsrOyAvLyBhZHZhbmNlIHRvIGJlZ2lubmluZyBvZiBzdHVmZiBhZnRlciBmcmVxCi0KLSAgICBy Lmhhc0VuZERhdGUgPSBmYWxzZTsKLQotICAgIHN3aXRjaCAoci50eXBlKSB7Ci0KLSAgICBjYXNl IDo6cmVwZWF0RGFpbHk6Ci0gICAgICBpbmRleCA9IGxhc3Q7IC8vIGFkdmFuY2UgdG8gbGFzdCBm aWVsZAotICAgICAgaWYgKHRtcFN0ci5taWQoaW5kZXgsIDEpID09ICIjIikgaW5kZXgrKzsKLSAg ICAgIGlmICh0bXBTdHIuZmluZCgnVCcsIGluZGV4KSAhPSAtMSkgewotCXIuZW5kRGF0ZSA9IElT T1RvVG0odG1wU3RyLm1pZChpbmRleCwgdG1wU3RyLmxlbmd0aCgpIC0KLQkJCQkgICAgICAgaW5k ZXgpLmxhdGluMSgpKTsKLQlyLmhhc0VuZERhdGUgPSB0cnVlOwotICAgICAgfSBlbHNlCi0Jci5k dXJhdGlvbiA9Ci0JICB0bXBTdHIubWlkKGluZGV4LCB0bXBTdHIubGVuZ3RoKCkgLSBpbmRleCku dG9JbnQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA6OnJlcGVhdFdlZWtseToKLSAgICAg IGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JUURhdGUgdG1wRGF0ZSgxOTAwICsgci5zdGFydERhdGUu dG1feWVhciwKLQkJICAgICAgci5zdGFydERhdGUudG1fbW9uICsgMSwKLQkJICAgICAgci5zdGFy dERhdGUudG1fbWRheSk7Ci0Jci53ZWVrZGF5cy5zZXRCaXQodG1wRGF0ZS5kYXlPZldlZWsoKSAt IDEpOwotICAgICAgfSBlbHNlIHsKLQl3aGlsZSAoaW5kZXggPCBsYXN0KSB7Ci0JICBRU3RyaW5n IGRheVN0ciA9IHRtcFN0ci5taWQoaW5kZXgsIDMpOwotCSAgaW50IGRheU51bSA9IG51bUZyb21E YXkoZGF5U3RyKTsKLQkgIHIud2Vla2RheXMuc2V0Qml0KGRheU51bSk7Ci0JICBpbmRleCArPSAz OyAvLyBhZHZhbmNlIHRvIG5leHQgZGF5LCBvciBwb3NzaWJseSAiIyIKLQl9Ci0gICAgICB9Ci0g ICAgICBpbmRleCA9IGxhc3Q7IAotICAgICAgaWYgKHRtcFN0ci5taWQoaW5kZXgsMSkgPT0gIiMi KSBpbmRleCsrOwotICAgICAgaWYgKHRtcFN0ci5maW5kKCdUJywgaW5kZXgpICE9IC0xKSB7Ci0J Ly8gcmVwZWF0IHVudGlsIGEgZ2l2ZW4gZGF0ZQotCXIuZW5kRGF0ZSA9IAotCSAgSVNPVG9UbSh0 bXBTdHIubWlkKGluZGV4LCB0bXBTdHIubGVuZ3RoKCkgLQotCQkJICAgICBpbmRleCkubGF0aW4x KCkpOwotCXIuaGFzRW5kRGF0ZSA9IHRydWU7Ci0gICAgICB9IGVsc2UKLQkvLyByZXBlYXQgYSBn aXZlbiBudW1iZXIgb2YgdGltZXMKLQlyLmR1cmF0aW9uID0gdG1wU3RyLm1pZChpbmRleCwgdG1w U3RyLmxlbmd0aCgpIC0gaW5kZXgpLnRvSW50KCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ug OjpyZXBlYXRNb250aGx5QnlEYXk6Ci0gICAgICBpZiAoaW5kZXggPT0gbGFzdCkgewotCVFEYXRl IHRtcERhdGUoMTkwMCArIHIuc3RhcnREYXRlLnRtX3llYXIsCi0JCSAgICAgIHIuc3RhcnREYXRl LnRtX21vbiArIDEsCi0JCSAgICAgIHIuc3RhcnREYXRlLnRtX21kYXkpOwotCXNob3J0IHRtcFBv cyA9IHRtcERhdGUuZGF5KCkgLyA3ICsgMTsKLQlpZiAodG1wUG9zID09IDUpIHRtcFBvcyA9IC0x OwotCXIucmVwZWF0RGF5ID0KLQkgIChEYXlPZk1vbnRoVHlwZSkgKDcgKiAodG1wUG9zIC0gMSkg KyAKLQkJCSAgICB0bXBEYXRlLmRheU9mV2VlaygpIC0gMSk7Ci0gICAgICB9IGVsc2UgewotCXdo aWxlIChpbmRleCA8IGxhc3QpIHsKLQkgIHNob3J0IHRtcFBvcyA9IHRtcFN0ci5taWQoaW5kZXgs IDEpLnRvU2hvcnQoKTsKLQkgIGluZGV4Kys7Ci0JICBpZiAodG1wU3RyLm1pZChpbmRleCwxKSA9 PSAiLSIpCi0JICAgIC8vIGNvbnZlcnQgdG1wUG9zIHRvIG5lZ2F0aXZlCi0JICAgIHRtcFBvcyA9 IC10bXBQb3M7Ci0JICBpbmRleCArPSAyOyAvLyBhZHZhbmNlIHRvIGRheShzKQotCSAgaW50IGRh eU51bSA9IDA7Ci0JICB3aGlsZSAobnVtRnJvbURheSh0bXBTdHIubWlkKGluZGV4LCAzKSkgPj0g MCkgewotCSAgICBpZiAoIWRheU51bSkgLy8gcGlsb3QgY2FuIG9ubHkgaGFuZGxlIDEgZGF5IGlu IG1vbnRoLWJ5LXBvcwotCSAgICAgIGRheU51bSA9IG51bUZyb21EYXkodG1wU3RyLm1pZChpbmRl eCwgMykpOwotCSAgICBpbmRleCArPSAzOyAvLyBhZHZhbmNlIHRvIG5leHQgZGF5LCBvciBwb3Nz aWJseSBwb3MgLyAiIyIKLQkgIH0KLQkgIHIucmVwZWF0RGF5ID0gKERheU9mTW9udGhUeXBlKSAo NyAqICh0bXBQb3MgLSAxKSArIGRheU51bSk7Ci0JfQorICAgICAgICAvLyBhbGwgcmVjb3JkcyBh cmUgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgIHVwZGF0ZUV2ZW50KHJlYyk7CiAgICAgICB9Ci0g ICAgICBpbmRleCA9IGxhc3Q7IAotICAgICAgaWYgKHRtcFN0ci5taWQoaW5kZXgsMSkgPT0gIiMi KSBpbmRleCsrOwotICAgICAgaWYgKHRtcFN0ci5maW5kKCdUJywgaW5kZXgpICE9IC0xKSB7Ci0J ci5lbmREYXRlID0gSVNPVG9UbSh0bXBTdHIubWlkKGluZGV4LCB0bXBTdHIubGVuZ3RoKCkgLQot CQkJCSAgICAgICBpbmRleCkubGF0aW4xKCkpOwotCXIuaGFzRW5kRGF0ZSA9IHRydWU7Ci0gICAg ICB9IGVsc2UKLQlyLmR1cmF0aW9uID0gdG1wU3RyLm1pZChpbmRleCwgdG1wU3RyLmxlbmd0aCgp IC0KLQkJCQlpbmRleCkudG9JbnQoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA6OnJlcGVh dE1vbnRobHlCeURhdGU6Ci0gICAgY2FzZSA6OnJlcGVhdFllYXJseToKLSAgICAgIC8vaWYgKGlu ZGV4ICE9IGxhc3QpIC8vICsrKyA/Pz8KLSAgICAgIC8vd2hpbGUgKGluZGV4IDwgbGFzdCkKLSAg ICAgIC8vICBpbmRleCA9IHRtcFN0ci5maW5kKCcgJywgaW5kZXgpICsgMTsKLSAgICAgIGluZGV4 ID0gbGFzdDsKLSAgICAgIGlmICh0bXBTdHIubWlkKGluZGV4LDEpID09ICIjIikgaW5kZXgrKzsK LSAgICAgIGlmICh0bXBTdHIuZmluZCgnVCcsIGluZGV4KSAhPSAtMSkgewotCXIuZW5kRGF0ZSA9 IElTT1RvVG0odG1wU3RyLm1pZChpbmRleCwgdG1wU3RyLmxlbmd0aCgpIC0KLQkJCQkgICAgICAg aW5kZXgpLmxhdGluMSgpKTsKLQlyLmhhc0VuZERhdGUgPSB0cnVlOwotICAgICAgfSBlbHNlCi0J ci5kdXJhdGlvbiA9IHRtcFN0ci5taWQoaW5kZXgsIHRtcFN0ci5sZW5ndGgoKSAtCi0JCQkJaW5k ZXgpLnRvSW50KCk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgOjpyZXBlYXROb25l OgotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2RFcnJvcihDT05EVUlUX0FS RUEpIDw8IF9fRlVOQ1RJT05fXwotCQkJICAgIDw8ICI6IHVua25vd24gcmVwZXRpdGlvbiB0eXBl ISIKLQkJCSAgICA8PCBlbmRsOwotICAgICAgYnJlYWs7CiAgICAgfQotCi0gIH0gZWxzZQotICAg IHIudHlwZSA9IDo6cmVwZWF0Tm9uZTsKLQotICByZXR1cm4gcjsKKyAgICBkZWxldGUgcmVjOwor ICB9CiB9CiAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQogCi12b2lkIFZDYWxDb25kdWl0OjpzZXRS ZXBldGl0aW9uKFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksCi0JCQkJY29uc3QgZXZlbnRSZXBl dGl0aW9uICZlcikgewordm9pZCBWQ2FsQ29uZHVpdDo6c2V0UmVwZXRpdGlvbihQaWxvdERhdGVF bnRyeSAqZGF0ZUVudHJ5LEluY2lkZW5jZSAqaW5jaWRlbmNlKQorewogICBGVU5DVElPTlNFVFVQ OwotCi0JLy8gRGVmYXVsdCB0byByZXBlYXQgZGFpbHksIHNpbmNlIHRoZXJlIGlzCi0JLy8gbm8g Ik5vbmUiIGVsZW1lbnQgb2YgUGVyaW9kQ29uc3RhbnRzLgotCS8vCi0JUGVyaW9kQ29uc3RhbnRz IHBlcmlvZCA9IERhaWx5UGVyaW9kOwogCi0gIGRhdGVFbnRyeS0+c2V0UmVwZWF0VHlwZShlci50 eXBlKTsKKyAgS09SZWN1cnJlbmNlICpyZWN1ciA9IGluY2lkZW5jZS0+cmVjdXJyZW5jZSgpOwog Ci0gIGlmIChlci50eXBlICE9IHJlcGVhdE5vbmUpIHsKLSAgICBERUJVR0NPTkRVSVQgPDwgX19G VU5DVElPTl9fCi0JCSA8PCAiOiB0eXBlICIgPDwgZXIudHlwZQotCQkgPDwgIiwgZnJlcSAiIDw8 IGVyLmZyZXEKLQkJIDw8ICIsIGhhc0VuZERhdGUgIiA8PCBlci5oYXNFbmREYXRlCi0JCSA8PCAi LCBkdXJhdGlvbiAiIDw8IGVyLmR1cmF0aW9uCi0JCSA8PCAiLCByZXBlYXREYXkiIDw8IGVyLnJl cGVhdERheQotCQkgPDwgZW5kbDsKKyAgLy8gRGVmYXVsdCB0byByZXBlYXQgZGFpbHksIHNpbmNl IHRoZXJlIGlzIG5vICJOb25lIiBlbGVtZW50IG9mCisgIC8vIFBlcmlvZENvbnN0YW50cy4KKyAg UGVyaW9kQ29uc3RhbnRzIHBlcmlvZCA9IERhaWx5UGVyaW9kOwogCi0gICAgc3dpdGNoIChlci50 eXBlKSB7Ci0gICAgY2FzZSByZXBlYXREYWlseToKKyAgc3dpdGNoIChyZWN1ci0+ZG9lc1JlY3Vy KCkpIHsKKyAgICBjYXNlIEtPUmVjdXJyZW5jZTo6ck5vbmU6CisgICAgICBkYXRlRW50cnktPnNl dFJlcGVhdFR5cGUocmVwZWF0Tm9uZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEtPUmVjdXJy ZW5jZTo6ckRhaWx5OgorICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRUeXBlKHJlcGVhdERhaWx5 KTsKICAgICAgIHBlcmlvZCA9IERhaWx5UGVyaW9kOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBy ZXBlYXRXZWVrbHk6Ci0gICAgICBkYXRlRW50cnktPnNldFJlcGVhdERheXMoZXIud2Vla2RheXMp OworICAgIGNhc2UgS09SZWN1cnJlbmNlOjpyV2Vla2x5OgorICAgICAgZGF0ZUVudHJ5LT5zZXRS ZXBlYXRUeXBlKHJlcGVhdFdlZWtseSk7CiAgICAgICBwZXJpb2QgPSBXZWVrbHlQZXJpb2Q7Cisg ICAgICBkYXRlRW50cnktPnNldFJlcGVhdERheXMocmVjdXItPmRheXMoKSk7CiAgICAgICBicmVh azsKLSAgICBjYXNlIHJlcGVhdE1vbnRobHlCeURheToKLSAgICAgIGRhdGVFbnRyeS0+c2V0UmVw ZWF0RGF5KGVyLnJlcGVhdERheSk7CisgICAgY2FzZSBLT1JlY3VycmVuY2U6OnJNb250aGx5UG9z OgorICAgICAgZGF0ZUVudHJ5LT5zZXRSZXBlYXRUeXBlKHJlcGVhdE1vbnRobHlCeURheSk7CiAg ICAgICBwZXJpb2QgPSBNb250aGx5QnlQb3NQZXJpb2Q7CisgICAgICB7CisgICAgICAgIFFMaXN0 PEtPUmVjdXJyZW5jZTo6ck1vbnRoUG9zPiBybCA9IHJlY3VyLT5tb250aFBvc2l0aW9ucygpOwor ICAgICAgICBLT1JlY3VycmVuY2U6OnJNb250aFBvcyAqciA9IHJsLmZpcnN0KCk7CisgICAgICAg IGlmICghcikgeworICAgICAgICAgIGtkRGVidWcoKSA8PCAiUmVjdXJyZW5jZSBtb250aGx5UG9z LCBidXQgbm8gck1vbnRoUG9zIiA8PCBlbmRsOworICAgICAgICAgIGRhdGVFbnRyeS0+c2V0UmVw ZWF0VHlwZShyZXBlYXROb25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnQgcG9z ID0gKHItPnJQb3MgLSAxKSAqIDc7CisgICAgICAgICAgZm9yKGludCBpPTA7aTw3OysraSkgewor ICAgICAgICAgICAgaWYgKHItPnJEYXlzLnRlc3RCaXQoaSkpIHsKKyAgICAgICAgICAgICAgcG9z ICs9IGk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0K KyAgICAgICAgICBkYXRlRW50cnktPnNldFJlcGVhdERheSgoRGF5T2ZNb250aFR5cGUpIHBvcyk7 CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIGNhc2UgcmVwZWF0TW9udGhs eUJ5RGF0ZToKKyAgICBjYXNlIEtPUmVjdXJyZW5jZTo6ck1vbnRobHlEYXk6CisgICAgICBkYXRl RW50cnktPnNldFJlcGVhdFR5cGUocmVwZWF0TW9udGhseUJ5RGF0ZSk7CiAgICAgICBwZXJpb2Qg PSBNb250aGx5QnlEYXlQZXJpb2Q7CiAgICAgICBicmVhazsKLSAgICBjYXNlIHJlcGVhdFllYXJs eToKKyAgICBjYXNlIEtPUmVjdXJyZW5jZTo6clllYXJseURheToKKyAgICAgIGRhdGVFbnRyeS0+ c2V0UmVwZWF0VHlwZShyZXBlYXRZZWFybHkpOwogICAgICAgcGVyaW9kID0gWWVhcmx5QnlEYXlQ ZXJpb2Q7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAga2RFcnJvcihDT05EVUlU X0FSRUEpIDw8IF9fRlVOQ1RJT05fXwotCQkJICAgIDw8ICI6IHVua25vd24gcmVwZXRpdGlvbiB0 eXBlICIKLQkJCSAgICA8PCBlci50eXBlIDw8IGVuZGw7CisgICAgICBrZERlYnVnKCkgPDwgIlRo aXMgcmVjdXJyZW5jZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIiA8PCBlbmRsOwogICAgICAgYnJl YWs7Ci0gICAgfQotCi0JaWYgKGVyLmhhc0VuZERhdGUpIAotCXsKLQkJZGF0ZUVudHJ5LT5zZXRS ZXBlYXRGcmVxdWVuY3koZXIuZnJlcSk7Ci0JCWRhdGVFbnRyeS0+c2V0UmVwZWF0RW5kKGVyLmVu ZERhdGUpOwotCX0gCi0JZWxzZSBpZiAoZXIuZHVyYXRpb24gPT0gMCkgCi0JewotCQlkYXRlRW50 cnktPnNldFJlcGVhdEZyZXF1ZW5jeShlci5mcmVxKTsKLQkJZGF0ZUVudHJ5LT5zZXRSZXBlYXRG b3JldmVyKCk7Ci0JfSAKLQllbHNlIAotCXsKLQkJcmVwZWF0VW50aWwoZGF0ZUVudHJ5LCAmZXIu c3RhcnREYXRlLCBlci5mcmVxLCBlci5kdXJhdGlvbiwKLQkJCXBlcmlvZCk7Ci0JfQogICB9Ci19 Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQogCi1zdHJ1Y3QgdG0gVkNhbENvbmR1aXQ6OmdldFN0 YXJ0VGltZShWT2JqZWN0ICp2ZXZlbnQpIHsKLSAgRlVOQ1RJT05TRVRVUDsKLQotICBzdHJ1Y3Qg dG0gc3RhcnQ7Ci0gIFZPYmplY3QgKnZvID0gaXNBUHJvcGVydHlPZih2ZXZlbnQsIFZDRFRzdGFy dFByb3ApOwotICBpZiAodm8pIHsKLSAgICBjaGFyICpzID0gZmFrZUNTdHJpbmcodk9iamVjdFVT dHJpbmdaVmFsdWUodm8pKTsKLSAgICBzdGFydCA9IElTT1RvVG0oUVN0cmluZyhzKSk7Ci0gICAg ZGVsZXRlU3RyKHMpOwotICB9IGVsc2UKLSAgICBtZW1zZXQoJnN0YXJ0LCAwLCBzaXplb2Yoc3Rh cnQpKTsKLSAgcmV0dXJuIHN0YXJ0OwotfSAvLyBzdHJ1Y3QgdG0gVkNhbENvbmR1aXQ6OmdldFN0 YXJ0VGltZShjb25zdCBWT2JqZWN0ICp2ZXZlbnQpCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAg ZGF0ZUVudHJ5LT5zZXRSZXBlYXRGcmVxdWVuY3kocmVjdXItPmZyZXF1ZW5jeSgpKTsKIAorICBp ZiAocmVjdXItPmR1cmF0aW9uKCkgPT0gMCkgIHsKKyAgICBzdHJ1Y3QgdG0gZW5kID0gd3JpdGVU bShyZWN1ci0+ZW5kRGF0ZSgpKTsKKyAgICBkYXRlRW50cnktPnNldFJlcGVhdEVuZChlbmQpOwor ICB9IGVsc2UgaWYgKHJlY3VyLT5kdXJhdGlvbigpIDwgMCkgeworICAgIGRhdGVFbnRyeS0+c2V0 UmVwZWF0Rm9yZXZlcigpOworICB9IGVsc2UgeworICAgIGRhdGVFbnRyeS0+c2V0UmVwZWF0RW5k KHJlcGVhdFVudGlsKGluY2lkZW5jZS0+ZHRTdGFydCgpLHJlY3VyLT5mcmVxdWVuY3koKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1ci0+ZHVyYXRpb24oKSxw ZXJpb2QpKTsKKyAgfQorfQogCi1zdHJ1Y3QgdG0gVkNhbENvbmR1aXQ6OmdldEVuZFRpbWUoVk9i amVjdCAqdmV2ZW50KSB7CitzdHJ1Y3QgdG0gVkNhbENvbmR1aXQ6OnJlcGVhdFVudGlsKGNvbnN0 IFFEYXRlVGltZSAmc3RhcnREdCxpbnQgckZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGludCByRHVyYXRpb24sUGVyaW9kQ29uc3RhbnRzIHBlcmlvZCkKK3sKICAgRlVO Q1RJT05TRVRVUDsKLQotICBzdHJ1Y3QgdG0gZW5kOwotICBWT2JqZWN0ICp2byA9IGlzQVByb3Bl cnR5T2YodmV2ZW50LCBWQ0RUZW5kUHJvcCk7Ci0gIGlmICh2bykgewotICAgIGNoYXIgKnMgPSBm YWtlQ1N0cmluZyh2T2JqZWN0VVN0cmluZ1pWYWx1ZSh2bykpOwotICAgIGVuZCA9IElTT1RvVG0o UVN0cmluZyhzKSk7Ci0gICAgZGVsZXRlU3RyKHMpOwotICB9IGVsc2UKLSAgICBtZW1zZXQoJmVu ZCwgMCwgc2l6ZW9mKGVuZCkpOwotICByZXR1cm4gZW5kOwotfSAvLyBzdHJ1Y3QgdG0gVkNhbENv bmR1aXQ6OmdldEVuZFRpbWUoY29uc3QgVk9iamVjdCAqdmV2ZW50KQotCi0KLS8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vCi0KIAotdm9pZCBWQ2FsQ29uZHVpdDo6c2V0U3RhcnRFbmRUaW1lcyhQaWxvdERhdGVF bnRyeSAqZGF0ZUVudHJ5LAotCQkJCSAgIFZPYmplY3QgKnZldmVudCkgewotICBGVU5DVElPTlNF VFVQOworICBzdHJ1Y3QgdG0gc3RhcnQgPSB3cml0ZVRtKHN0YXJ0RHQpOworICB0aW1lX3QgZW5k X3RpbWUgPSBta3RpbWUoJnN0YXJ0KTsKKyAgc3RydWN0IHRtIHJFbmQgPSBzdGFydDsKIAotICBp bnQgdGltZWxlc3NfZXZlbnQgPSAwOwotICBzdHJ1Y3QgdG0gc3RhcnQsIGVuZDsKLSAgCi0gIGlm IChnZXREYXRlUHJvcGVydHkoJnN0YXJ0LCB2ZXZlbnQsIFZDRFRzdGFydFByb3ApKSB7Ci0gICAg aWYgKHN0YXJ0LnRtX2hvdXIgPT0gMCAmJgotCXN0YXJ0LnRtX21pbiA9PSAwICYmCi0Jc3RhcnQu dG1fc2VjID09IDApCi0gICAgICB0aW1lbGVzc19ldmVudCA9IDE7IC8vIHRoZSBldmVudCBmbG9h dHMgICAgCi0gICAgZGF0ZUVudHJ5LT5zZXRFdmVudFN0YXJ0KHN0YXJ0KTsKKyAgc3dpdGNoKHBl cmlvZCkgeworICAgIGNhc2UgRGFpbHlQZXJpb2Q6CisgICAgY2FzZSBXZWVrbHlQZXJpb2Q6Cisg ICAgICAvLyBDYWxjdWxhdGUgdGhlIGVuZCB0aW1lIGJ5IGFkZGluZyB0aGUgcmlnaHQgbnVtYmVy IG9mCisgICAgICAvLyByZXBlYXQgcGVyaW9kcy4KKyAgICAgIGVuZF90aW1lICs9IHJGcmVxICog KHJEdXJhdGlvbi0xKSAqIChpbnQpIHBlcmlvZDsKKyAgICAgIHJldHVybiAqbG9jYWx0aW1lKCZl bmRfdGltZSk7CisgICAgY2FzZSBNb250aGx5QnlEYXlQZXJpb2Q6CisgICAgY2FzZSBNb250aGx5 QnlQb3NQZXJpb2Q6CisgICAgICByRW5kLnRtX21vbiArPSByRnJlcSAqIChyRHVyYXRpb24gLSAx KTsKKyAgICAgIHJFbmQudG1feWVhciArPSByRW5kLnRtX21vbiAvIDEyOworICAgICAgckVuZC50 bV9tb24gJT0gMTI7CisgICAgICByZXR1cm4gckVuZDsKKyAgICBjYXNlIFllYXJseUJ5RGF5UGVy aW9kOgorICAgICAgckVuZC50bV95ZWFyICs9IHJGcmVxICogKHJEdXJhdGlvbiAtIDEpOworICAg ICAgcmV0dXJuIHJFbmQ7CisgICAgZGVmYXVsdDoKKyAgICAgIGtkV2FybmluZyhDT05EVUlUX0FS RUEpIDw8IF9fRlVOQ1RJT05fXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjog VW5rbm93biByZXBlYXQgcGVyaW9kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8 IChpbnQpIHBlcmlvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAg ICAgIHJldHVybiByRW5kOwogICB9Ci0JICAKLSAgZGF0ZUVudHJ5LT5zZXRFdmVudCh0aW1lbGVz c19ldmVudCk7Ci0KLSAgaWYgKGdldERhdGVQcm9wZXJ0eSgmZW5kLCB2ZXZlbnQsIFZDRFRlbmRQ cm9wKSkgCi0gICAgZGF0ZUVudHJ5LT5zZXRFdmVudEVuZChlbmQpOwotICBlbHNlIAotICAgIC8v IGlmIHRoZSBldmVudCBoYXMgbm8gRFRlbmQsIGdldCBpdCBmcm9tIHN0YXJ0IHRpbWUuCi0gICAg ZGF0ZUVudHJ5LT5zZXRFdmVudEVuZChzdGFydCk7Ci19IC8vIHZvaWQgVkNhbENvbmR1aXQ6OnNl dFN0YXJ0RW5kVGltZXMoUGlsb3REYXRlRW50cnkgKmRhdGVFbnRyeSwgY29uc3QgVk9iamVjdCAq dmV2ZW50KQorfQogCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIFZDYWxDb25kdWl0OjpzZXRT dGFydEVuZFRpbWVzKFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksRXZlbnQgKnZldmVudCkKK3sK KyAgZGF0ZUVudHJ5LT5zZXRFdmVudCh2ZXZlbnQtPmRvZXNGbG9hdCgpKTsKIAorICBzdHJ1Y3Qg dG0gc3RhcnQsIGVuZDsKIAotdm9pZCBWQ2FsQ29uZHVpdDo6c2V0QWxhcm1zKFBpbG90RGF0ZUVu dHJ5ICpkYXRlRW50cnksIFZPYmplY3QKLQkJCSAgICAqdmV2ZW50KSBjb25zdCB7Ci0gIEZVTkNU SU9OU0VUVVA7CisgIHN0YXJ0ID0gd3JpdGVUbSh2ZXZlbnQtPmR0U3RhcnQoKSk7CisgIGRhdGVF bnRyeS0+c2V0RXZlbnRTdGFydChzdGFydCk7CisgIAorICBlbmQgPSB3cml0ZVRtKHZldmVudC0+ ZHRFbmQoKSk7CisgIGRhdGVFbnRyeS0+c2V0RXZlbnRFbmQoZW5kKTsKK30KIAotICAvLyBBTEFS TShzKSAvLwotICBWT2JqZWN0ICp2bzsKLSAgaWYgKCh2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50 LCBWQ0RBbGFybVByb3ApKSkgewotICAgIFZPYmplY3QgKmEgPSAwTCwgKmIgPSAwTDsKLSAgICBp ZiAoKGEgPSBpc0FQcm9wZXJ0eU9mKHZvLCBWQ1J1blRpbWVQcm9wKSkgJiYKLQkoYiA9IGlzQVBy b3BlcnR5T2YodmV2ZW50LCBWQ0RUc3RhcnRQcm9wKSkpIHsKLSAgICAgIGRhdGVFbnRyeS0+c2V0 QWxhcm0oMSk7Ci0gICAgICBRRGF0ZSB0bXBEYXRlOwotICAgICAgUVRpbWUgdG1wVGltZTsKLSAg ICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKLSAgICAgIAot ICAgICAgUVN0cmluZyB0bXBTdHIgPSBmYWtlQ1N0cmluZyh2T2JqZWN0VVN0cmluZ1pWYWx1ZShh KSk7Ci0gICAgICB5ZWFyID0gdG1wU3RyLmxlZnQoNCkudG9JbnQoKTsKLSAgICAgIG1vbnRoID0g dG1wU3RyLm1pZCg0LDIpLnRvSW50KCk7Ci0gICAgICBkYXkgPSB0bXBTdHIubWlkKDYsMikudG9J bnQoKTsKLSAgICAgIGhvdXIgPSB0bXBTdHIubWlkKDksMikudG9JbnQoKTsKLSAgICAgIG1pbnV0 ZSA9IHRtcFN0ci5taWQoMTEsMikudG9JbnQoKTsKLSAgICAgIHNlY29uZCA9IHRtcFN0ci5taWQo MTMsMikudG9JbnQoKTsKLSAgICAgIHRtcERhdGUuc2V0WU1EKHllYXIsIG1vbnRoLCBkYXkpOwot ICAgICAgdG1wVGltZS5zZXRITVMoaG91ciwgbWludXRlLCBzZWNvbmQpOwotCSAgICAgIAotICAg ICAgQVNTRVJUKHRtcERhdGUuaXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVCh0bXBUaW1lLmlzVmFs aWQoKSk7Ci0gICAgICBRRGF0ZVRpbWUgdG1wRFQodG1wRGF0ZSwgdG1wVGltZSk7Ci0gICAgICAv LyBjb3JyZWN0IGZvciBHTVQgaWYgc3RyaW5nIGlzIGluIFp1bHUgZm9ybWF0Ci0gICAgICBpZiAo dG1wU3RyLnJpZ2h0KDEpID09IFFTdHJpbmcoIloiKSkKLQl0bXBEVCA9IHRtcERULmFkZFNlY3Mo NjAgKiBmVGltZVpvbmUpOwotICAgICAgCi0gICAgICB0bXBTdHIgPSBmYWtlQ1N0cmluZyh2T2Jq ZWN0VVN0cmluZ1pWYWx1ZShiKSk7Ci0gICAgICB5ZWFyID0gdG1wU3RyLmxlZnQoNCkudG9JbnQo KTsKLSAgICAgIG1vbnRoID0gdG1wU3RyLm1pZCg0LDIpLnRvSW50KCk7Ci0gICAgICBkYXkgPSB0 bXBTdHIubWlkKDYsMikudG9JbnQoKTsKLSAgICAgIGhvdXIgPSB0bXBTdHIubWlkKDksMikudG9J bnQoKTsKLSAgICAgIG1pbnV0ZSA9IHRtcFN0ci5taWQoMTEsMikudG9JbnQoKTsKLSAgICAgIHNl Y29uZCA9IHRtcFN0ci5taWQoMTMsMikudG9JbnQoKTsKLSAgICAgIHRtcERhdGUuc2V0WU1EKHll YXIsIG1vbnRoLCBkYXkpOwotICAgICAgdG1wVGltZS5zZXRITVMoaG91ciwgbWludXRlLCBzZWNv bmQpOwotICAgICAgCi0gICAgICBBU1NFUlQodG1wRGF0ZS5pc1ZhbGlkKCkpOwotICAgICAgQVNT RVJUKHRtcFRpbWUuaXNWYWxpZCgpKTsKLSAgICAgIFFEYXRlVGltZSB0bXBEVDIodG1wRGF0ZSwg dG1wVGltZSk7Ci0gICAgICAvLyBjb3JyZWN0IGZvciBHTVQgaWYgc3RyaW5nIGlzIGluIFp1bHUg Zm9ybWF0Ci0gICAgICBpZiAodG1wU3RyLnJpZ2h0KDEpID09IFFTdHJpbmcoIloiKSkKLQl0bXBE VDIgPSB0bXBEVDIuYWRkU2Vjcyg2MCpmVGltZVpvbmUpOwotICAgICAgCi0gICAgICBpbnQgZGlm ZlNlY3MgPSB0bXBEVC5zZWNzVG8odG1wRFQyKTsKLSAgICAgIGlmIChkaWZmU2VjcyA+IDYwKjYw KjI0KSB7Ci0JZGF0ZUVudHJ5LT5zZXRBZHZhbmNlVW5pdHMoYWR2RGF5cyk7Ci0JZGF0ZUVudHJ5 LT5zZXRBZHZhbmNlKChpbnQpIGRpZmZTZWNzLyg2MCo2MCoyNCkpOwotICAgICAgfSBlbHNlIGlm IChkaWZmU2VjcyA+IDYwKjYwKSB7Ci0JZGF0ZUVudHJ5LT5zZXRBZHZhbmNlVW5pdHMoYWR2SG91 cnMpOwotCWRhdGVFbnRyeS0+c2V0QWR2YW5jZSgoaW50KSBkaWZmU2Vjcy8oNjAqNjApKTsKLSAg ICAgIH0gZWxzZSB7Ci0JZGF0ZUVudHJ5LT5zZXRBZHZhbmNlVW5pdHMoYWR2TWludXRlcyk7Ci0J ZGF0ZUVudHJ5LT5zZXRBZHZhbmNlKChpbnQpIGRpZmZTZWNzLzYwKTsKLSAgICAgIH0KLSAgICB9 IGVsc2UKLSAgICAgIGRhdGVFbnRyeS0+c2V0QWxhcm0oMCk7Ci0gIH0gZWxzZSAKK3ZvaWQgVkNh bENvbmR1aXQ6OnNldEFsYXJtcyhQaWxvdERhdGVFbnRyeSAqZGF0ZUVudHJ5LEV2ZW50ICp2ZXZl bnQpCit7CisgIGlmICh2ZXZlbnQtPmFsYXJtKCktPnJlcGVhdENvdW50KCkgPT0gMCkgewogICAg IGRhdGVFbnRyeS0+c2V0QWxhcm0oMCk7Ci19IC8vIHZvaWQgVkNhbENvbmR1aXQ6OnNldEFsYXJt cyhQaWxvdERhdGVFbnRyeSAqZGF0ZUVudHJ5LCBjb25zdCBWT2JqZWN0ICp2ZXZlbnQpIGNvbnN0 CisgIH0gZWxzZSB7CisgICAgZGF0ZUVudHJ5LT5zZXRBbGFybSgxKTsKIAorICAgIFFEYXRlVGlt ZSBzdGFydER0ID0gdmV2ZW50LT5kdFN0YXJ0KCk7CisgICAgUURhdGVUaW1lIGFsYXJtRHQgPSB2 ZXZlbnQtPmFsYXJtKCktPnRpbWUoKTsKKyAgICAgIAorICAgIGludCBkaWZmU2VjcyA9IHN0YXJ0 RHQuc2Vjc1RvKGFsYXJtRHQpOworICAgIGlmIChkaWZmU2VjcyA+IDYwKjYwKjI0KSB7CisgICAg ICBkYXRlRW50cnktPnNldEFkdmFuY2VVbml0cyhhZHZEYXlzKTsKKyAgICAgIGRhdGVFbnRyeS0+ c2V0QWR2YW5jZSgoaW50KSBkaWZmU2Vjcy8oNjAqNjAqMjQpKTsKKyAgICB9IGVsc2UgaWYgKGRp ZmZTZWNzID4gNjAqNjApIHsKKyAgICAgIGRhdGVFbnRyeS0+c2V0QWR2YW5jZVVuaXRzKGFkdkhv dXJzKTsKKyAgICAgIGRhdGVFbnRyeS0+c2V0QWR2YW5jZSgoaW50KSBkaWZmU2Vjcy8oNjAqNjAp KTsKKyAgICB9IGVsc2UgeworICAgICAgZGF0ZUVudHJ5LT5zZXRBZHZhbmNlVW5pdHMoYWR2TWlu dXRlcyk7CisgICAgICBkYXRlRW50cnktPnNldEFkdmFuY2UoKGludCkgZGlmZlNlY3MvNjApOwor ICAgIH0KKyAgfQorfQogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvKiBwdXQgdXAgdGhlIGFib3V0 IC8gc2V0dXAgZGlhbG9nLiAqLwogUVdpZGdldCogVkNhbENvbmR1aXQ6OmFib3V0QW5kU2V0dXAo KQpAQCAtMTI3MCwyOCArNzYwLDEwIEBAIFFXaWRnZXQqIFZDYWxDb25kdWl0OjphYm91dEFuZFNl dHVwKCkKICAgcmV0dXJuIG5ldyBWQ2FsU2V0dXAoKTsKIH0KIAotCi0vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v LwogCi0KLXZvaWQgbWltZUVycm9yKGNoYXIgKnMpCi17Ci0Ja2RXYXJuaW5nKENPTkRVSVRfQVJF QSkgPDwgX19GVU5DVElPTl9fCi0JCTw8ICI6ICIKLQkJPDwgcwotCQk8PCBlbmRsOwotfQotCi0K LS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCi0KLS8qIHZpcnR1YWwgKi8gdm9pZCBWQ2FsQ29uZHVpdDo6ZG9U ZXN0KCkKK3ZvaWQgVkNhbENvbmR1aXQ6OmRvVGVzdCgpCiB7Ci0JRlVOQ1RJT05TRVRVUDsKLQot CXJlZ2lzdGVyTWltZUVycm9ySGFuZGxlcihtaW1lRXJyb3IpOwotCWdldENhbGVuZGFyKFZDYWxT ZXR1cDo6VkNhbEdyb3VwKTsKLQlwcmludFZPYmplY3Qoc3RkZXJyLGNhbGVuZGFyKCkpOworICAv LyBUT0RPOiBkdW1wIGNhbGVuZGFyCiB9CiAKIApJbmRleDogY29uZHVpdHMvdmNhbGNvbmR1aXQv dmNhbC1jb25kdWl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZXBpbS9rcGls b3QvY29uZHVpdHMvdmNhbGNvbmR1aXQvdmNhbC1jb25kdWl0LmgsdgpyZXRyaWV2aW5nIHJldmlz aW9uIDEuMTYKZGlmZiAtdSAtMyAtZCAtcCAtcjEuMTYgdmNhbC1jb25kdWl0LmgKLS0tIGNvbmR1 aXRzL3ZjYWxjb25kdWl0L3ZjYWwtY29uZHVpdC5oCTIwMDEvMDYvMDUgMjI6NTg6NDAJMS4xNgor KysgY29uZHVpdHMvdmNhbGNvbmR1aXQvdmNhbC1jb25kdWl0LmgJMjAwMS8wNi8xNyAyMjowMzoy MQpAQCAtMSw4ICsxLDggQEAKLS8qIHZjYWwtY29uZHVpdC5jCQlWQ2FsZW5kYXIgQ29uZHVpdCAK LSoqCisvKiB2Y2FsLWNvbmR1aXQuYyAgVkNhbGVuZGFyIENvbmR1aXQgCiAqKgogKiogQ29weXJp Z2h0IChDKSAxOTk4LTIwMDAgYnkgRGFuIFBpbG9uZSwgUHJlc3RvbiBCcm93biwgYW5kCiAqKglI ZXJ3aW4gSmFuIFN0ZWVob3V3ZXIKKyoqIENvcHlyaWdodCAoQykgMjAwMSBieSBDb3JuZWxpdXMg U2NodW1hY2hlcgogKioKICoqIEEgcHJvZ3JhbSB0byBzeW5jaHJvbml6ZSBLT3JnYW5pemVyJ3Mg ZGF0ZSBib29rIHdpdGggdGhlIFBhbG0KICoqIFBpbG90IC8gS1BpbG90LiBUaGlzIHByb2dyYW0g aXMgcGFydCBvZiBLUGlsb3QuCkBAIC0zNCwxMzIgKzM0LDc3IEBACiAKICNpbmNsdWRlIDx0aW1l Lmg+CiAKLSNpZm5kZWYgX1BJTE9UX0RBVEVCT09LX0hfCiAjaW5jbHVkZSA8cGktZGF0ZWJvb2su aD4KLSNlbmRpZgogCi0jaWZuZGVmIF9LUElMT1RfVkNBTEJBU0VfSAotI2luY2x1ZGUgInZjYWxC YXNlLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBRQklUQVJSQVlfSAogI2luY2x1ZGUgPHFiaXRhcnJh eS5oPgotI2VuZGlmCiAKKyNpbmNsdWRlIDxldmVudC5oPgorCisjaW5jbHVkZSAidmNhbEJhc2Uu aCIKKwogY2xhc3MgUGlsb3RSZWNvcmQ7CiBjbGFzcyBQaWxvdERhdGVFbnRyeTsKLWNsYXNzIFZP YmplY3Q7Ci0JCisKK3VzaW5nIG5hbWVzcGFjZSBLQ2FsOworCiBjbGFzcyBWQ2FsQ29uZHVpdCA6 IHB1YmxpYyBWQ2FsQmFzZUNvbmR1aXQKIHsKLXB1YmxpYzoKLSAgVkNhbENvbmR1aXQoQmFzZUNv bmR1aXQ6OmVDb25kdWl0TW9kZSBtb2RlKTsKLSAgdmlydHVhbCB+VkNhbENvbmR1aXQoKTsKKyAg cHVibGljOgorICAgIFZDYWxDb25kdWl0KGVDb25kdWl0TW9kZSBtb2RlLERhdGFiYXNlU291cmNl IHNvdXJjZSk7CisgICAgdmlydHVhbCB+VkNhbENvbmR1aXQoKTsKICAgCi0gIHZpcnR1YWwgdm9p ZCBkb1N5bmMoKTsKLSAgdmlydHVhbCB2b2lkIGRvQmFja3VwKCk7Ci0gIHZpcnR1YWwgUVdpZGdl dCogYWJvdXRBbmRTZXR1cCgpOwotICB2aXJ0dWFsIHZvaWQgZG9UZXN0KCk7CisgICAgdmlydHVh bCB2b2lkIGRvU3luYygpOworICAgIHZpcnR1YWwgdm9pZCBkb0JhY2t1cCgpOworICAgIHZpcnR1 YWwgUVdpZGdldCogYWJvdXRBbmRTZXR1cCgpOworICAgIHZpcnR1YWwgdm9pZCBkb1Rlc3QoKTsK IAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGRiSW5mbygpIHsgcmV0dXJuICJEYXRlYm9va0RCIjsg fQorICAgIHZpcnR1YWwgY29uc3QgY2hhciogZGJJbmZvKCkgeyByZXR1cm4gIkRhdGVib29rREIi OyB9CiAgIAotCi0KLXByb3RlY3RlZDoKLQl2b2lkIGRvTG9jYWxTeW5jKCk7Ci0Jdm9pZCB1cGRh dGVWT2JqZWN0KFBpbG90UmVjb3JkICpyZWMpOwotCi1wcml2YXRlOgotCXN0cnVjdCB0bSBnZXRT dGFydFRpbWUoVk9iamVjdCAqdmV2ZW50KTsKLQlzdHJ1Y3QgdG0gZ2V0RW5kVGltZShWT2JqZWN0 ICp2ZXZlbnQpOwotCXZvaWQgc2V0QWxhcm1zKFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksIFZP YmplY3QKLQkJICAgICAgICp2ZXZlbnQpIGNvbnN0OwotCXZvaWQgZmlyc3RTeW5jQ29weShib29s IERlbGV0ZU9uUGlsb3QpOwotCi0JLyoqIENvcHkgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgZnJv bSBAYXJnICp2ZXZlbnQgdG8gQGFyZwotCSAqZGF0ZUVudHJ5LiAqLwotCXZvaWQgc2V0U3RhcnRF bmRUaW1lcyhQaWxvdERhdGVFbnRyeSAqZGF0ZUVudHJ5LAotCQkJICAgICAgVk9iamVjdCAqdmV2 ZW50KTsKLQotCXN0YXRpYyB2b2lkIHNldFZjYWxTdGFydEVuZFRpbWVzKFZPYmplY3QgKnZldmVu dCwgCi0JCQkJCSBjb25zdCBQaWxvdERhdGVFbnRyeSAmZGF0ZUVudHJ5KTsKLQlzdGF0aWMgdm9p ZCBzZXRWY2FsQWxhcm1zKFZPYmplY3QgKnZldmVudCwgCi0JCQkJICBjb25zdCBQaWxvdERhdGVF bnRyeSAmZGF0ZUVudHJ5KTsKLQlzdGF0aWMgdm9pZCBzZXRWY2FsUmVjdXJyZW5jZShWT2JqZWN0 ICp2ZXZlbnQsIAotCQkJCSAgICAgIGNvbnN0IFBpbG90RGF0ZUVudHJ5ICZkYXRlRW50cnkpOwot CXN0YXRpYyB2b2lkIHNldFZjYWxFeGNlcHRpb25zKFZPYmplY3QgKnZldmVudCwgCi0JCQkJICAg ICAgY29uc3QgUGlsb3REYXRlRW50cnkgJmRhdGVFbnRyeSk7Ci0KLQlzdHJ1Y3QgZXZlbnRSZXBl dGl0aW9uIHsKLQkgIGVudW0gOjpyZXBlYXRUeXBlcyB0eXBlOwotCSAgaW50IGZyZXE7Ci0JICBi b29sIGhhc0VuZERhdGU7Ci0JICBzdHJ1Y3QgdG0gc3RhcnREYXRlLCBlbmREYXRlOwotCSAgaW50 IGR1cmF0aW9uOyAvLyAwIG1lYW5zIGZvcmV2ZXIKLQkgIFFCaXRBcnJheSB3ZWVrZGF5czsKLQkg IERheU9mTW9udGhUeXBlIHJlcGVhdERheTsgLy8gZm9yIG1vbnRobHlCeVBvcwotCSAgCi0JICBl dmVudFJlcGV0aXRpb24oKSB7Ci0JICAgIHR5cGUgPSA6OnJlcGVhdE5vbmU7Ci0JICAgIHdlZWtk YXlzID0gUUJpdEFycmF5KDcpOwotCSAgfQotCi0JICBldmVudFJlcGV0aXRpb24oY29uc3QgZXZl bnRSZXBldGl0aW9uICZlKSB7Ci0JICAgIHR5cGUgPSBlLnR5cGU7Ci0JICAgIGZyZXEgPSBlLmZy ZXE7Ci0JICAgIGhhc0VuZERhdGUgPSBlLmhhc0VuZERhdGU7Ci0JICAgIHN0YXJ0RGF0ZSA9IGUu c3RhcnREYXRlOwotCSAgICBlbmREYXRlID0gZS5lbmREYXRlOwotCSAgICBkdXJhdGlvbiA9IGUu ZHVyYXRpb247Ci0JICAgIHdlZWtkYXlzID0gZS53ZWVrZGF5czsKLQkgICAgcmVwZWF0RGF5ID0g ZS5yZXBlYXREYXk7Ci0JICB9Ci0JfTsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgZG9Mb2NhbFN5 bmMoKTsKKyAgICB2b2lkIHVwZGF0ZUV2ZW50KFBpbG90UmVjb3JkICpyZWMpOwogCi0JZXZlbnRS ZXBldGl0aW9uIGdldFJlcGV0aXRpb24oVk9iamVjdCAqdmV2ZW50KTsKLQl2b2lkIHNldFJlcGV0 aXRpb24oUGlsb3REYXRlRW50cnkgKmRhdGVFbnRyeSwgCi0JCQkgICBjb25zdCBldmVudFJlcGV0 aXRpb24gJmVyKTsKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHNldEFsYXJtcyhQaWxvdERhdGVFbnRy eSAqZGF0ZUVudHJ5LCBFdmVudCAqdmV2ZW50KTsKKyAgICB2b2lkIGZpcnN0U3luY0NvcHkoYm9v bCBEZWxldGVPblBpbG90KTsKKyAgICAvKiogQ29weSB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lcyBm cm9tIEBhcmcgKnZldmVudCB0byBAYXJnCisgICAgICAqZGF0ZUVudHJ5LiAqLworICAgIHZvaWQg c2V0U3RhcnRFbmRUaW1lcyhQaWxvdERhdGVFbnRyeSAqZGF0ZUVudHJ5LEV2ZW50ICp2ZXZlbnQp OworICAgIHZvaWQgc2V0UmVwZXRpdGlvbihQaWxvdERhdGVFbnRyeSAqZGF0ZUVudHJ5LEluY2lk ZW5jZSAqaW5jaWRlbmNlKTsKIAotCS8qKiBHZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyBmb3Ig YSByZXBlYXRpbmcgZXZlbnQuIFRoZQotCSAgICByZXN1bHQgaXMgYW4gYXJyYXkgb2Ygc3RydWN0 IHRtIGFuZCBzaG91bGQgYmUgZnJlZSgpZAotCSAgICBhZnRlciB1c2UuIFRoZSBudW1iZXIgb2Yg ZXhjZXB0aW9ucyBpcyB3cml0dGVuIHRvIEBhcmcKLQkgICAgKm4uICovCi0Jc3RydWN0IHRtICpn ZXRFeGNlcHRpb25EYXRlcyhWT2JqZWN0ICp2ZXZlbnQsIGludCAqbik7CisgICAgdm9pZCBzZXRW Y2FsU3RhcnRFbmRUaW1lcyhFdmVudCAqdmV2ZW50LGNvbnN0IFBpbG90RGF0ZUVudHJ5ICZkYXRl RW50cnkpOworICAgIHZvaWQgc2V0VmNhbEFsYXJtcyhJbmNpZGVuY2UgKnZldmVudCxjb25zdCBQ aWxvdERhdGVFbnRyeSAmZGF0ZUVudHJ5KTsKKyAgICB2b2lkIHNldFZjYWxSZWN1cnJlbmNlKElu Y2lkZW5jZSAqdmV2ZW50LGNvbnN0IFBpbG90RGF0ZUVudHJ5ICZkYXRlRW50cnkpOworICAgIHZv aWQgc2V0VmNhbEV4Y2VwdGlvbnMoSW5jaWRlbmNlICp2ZXZlbnQsY29uc3QgUGlsb3REYXRlRW50 cnkgJmRhdGVFbnRyeSk7CisgICAgLyoqIEdldCB0aGUgbGlzdCBvZiBleGNlcHRpb25zIGZvciBh IHJlcGVhdGluZyBldmVudC4gVGhlCisgICAgICByZXN1bHQgaXMgYW4gYXJyYXkgb2Ygc3RydWN0 IHRtIGFuZCBzaG91bGQgYmUgZnJlZSgpZAorICAgICAgYWZ0ZXIgdXNlLiBUaGUgbnVtYmVyIG9m IGV4Y2VwdGlvbnMgaXMgd3JpdHRlbiB0byBAYXJnCisgICAgICAqbi4gKi8KKyAgICBzdHJ1Y3Qg dG0gKmdldEV4Y2VwdGlvbkRhdGVzKEV2ZW50ICp2ZXZlbnQsIGludCAqbik7CiAKLQkvKioKLQkq IFNldCB0aGUgZXZlbnQgdG8gcmVwZWF0IGZvcmV2ZXIsIHdpdGggcmVwZWF0Ci0JKiBmcmVxdWVu Y3kgQGFyZyByRnJlcS4gVGhpcyBmdW5jdGlvbiBhbHNvCi0JKiB3YXJucyB0aGUgdXNlciB0aGF0 IHRoaXMgaXMgcHJvYmFibHkgbm90Ci0JKiAqcXVpdGUqIHRoZSBiZWhhdmlvciBpbnRlbnRlZCBi dXQgdGhlcmUncwotCSogbm8gZml4IGZvciB0aGF0LgotCSovCi0Jdm9pZCByZXBlYXRGb3JldmVy KFBpbG90RGF0ZUVudHJ5ICpwLGludCByRnJlcSxWT2JqZWN0ICp2PTBMKTsKKyAgICAvKioKKyAg ICAgKiBUaGUgZm9sbG93aW5nIGVudW1zIGRpc3Rpbmd1aXNoIHZhcmlvdXMgcmVwZWF0LWJ5Cisg ICAgICogcG9zc2libGl0aWVzLiBTb21ldGltZXMgdGhlIHNwZWNpZmljIHZhbHVlIG9mIHRoZQor ICAgICAqIGVudW0gKGxpa2UgRGFpbHlQZXJpb2QpIGVuY29kZXMgc29tZXRoaW5nIHNwZWNpYWws CisgICAgICogc28gdGhlc2Ugc2hvdWxkbid0IGJlIGNoYW5nZWQgYXQgd2hpbSB3aXRob3V0Cisg ICAgICogY2hhbmdpbmcgQHJlZiByZXBlYXRVbnRpbCBhcyB3ZWxsLgorICAgICAqLwogCi0JLyoq Ci0JKiBUaGUgZm9sbG93aW5nIGVudW1zIGRpc3Rpbmd1aXNoIHZhcmlvdXMgcmVwZWF0LWJ5Ci0J KiBwb3NzaWJsaXRpZXMuIFNvbWV0aW1lcyB0aGUgc3BlY2lmaWMgdmFsdWUgb2YgdGhlCi0JKiBl bnVtIChsaWtlIERhaWx5UGVyaW9kKSBlbmNvZGVzIHNvbWV0aGluZyBzcGVjaWFsLAotCSogc28g dGhlc2Ugc2hvdWxkbid0IGJlIGNoYW5nZWQgYXQgd2hpbSB3aXRob3V0Ci0JKiBjaGFuZ2luZyBA cmVmIHJlcGVhdFVudGlsIGFzIHdlbGwuCi0JKi8KLQl0eXBlZGVmIGVudW0geyBEYWlseVBlcmlv ZD02MCo2MCoyNCwgCS8qIHNlY29uZHMgcGVyIGRheSAqLwotCQlXZWVrbHlQZXJpb2Q9NjAqNjAq MjQqNywJLyogc2Vjb25kcyBwZXIgd2VlayAqLwotCQlNb250aGx5QnlQb3NQZXJpb2Q9MSwJCS8q IGp1c3QgYSBjb25zdGFudCAqLwotCQlNb250aGx5QnlEYXlQZXJpb2Q9MiwKLQkJWWVhcmx5QnlE YXlQZXJpb2Q9MwotCQl9IFBlcmlvZENvbnN0YW50czsKKyAgICAgdHlwZWRlZiBlbnVtIHsgRGFp bHlQZXJpb2Q9NjAqNjAqMjQsICAgICAvKiBzZWNvbmRzIHBlciBkYXkgKi8KKyAgICAgICAgICAg ICAgICAgICAgV2Vla2x5UGVyaW9kPTYwKjYwKjI0KjcsICAvKiBzZWNvbmRzIHBlciB3ZWVrICov CisgICAgICAgICAgICAgICAgICAgIE1vbnRobHlCeVBvc1BlcmlvZD0xLCAgICAgLyoganVzdCBh IGNvbnN0YW50ICovCisgICAgICAgICAgICAgICAgICAgIE1vbnRobHlCeURheVBlcmlvZD0yLAor ICAgICAgICAgICAgICAgICAgICBZZWFybHlCeURheVBlcmlvZD0zCisgICAgICAgICAgICAgICAg ICB9IFBlcmlvZENvbnN0YW50czsKIAotCS8qKgotCSogU2V0IHRoZSBkYXRlIGVudHJ5IHRvIHJl cGVhdCBldmVyeSByRnJlcSBwZXJpb2RzLAotCSogckR1cmF0aW9uIHRpbWVzLCBzdGFydGluZyBh dCBzdGFydC4gCi0JKgotCSogVGhpcyBmdW5jdGlvbiBjb250YWlucyBjb2RlIGJ5IERhZyBOeWdy ZW4uCi0JKi8KLQl2b2lkIHJlcGVhdFVudGlsKFBpbG90RGF0ZUVudHJ5ICpkYXRlRW50cnksCi0J CQkgY29uc3Qgc3RydWN0IHRtICpzdGFydCwKLQkJCSBpbnQgckZyZXEsCi0JCQkgaW50IHJEdXJh dGlvbiwKLQkJCSBQZXJpb2RDb25zdGFudHMgcGVyaW9kKTsKKyAgICAgLyoqCisgICAgICAqIFNl dCB0aGUgZGF0ZSBlbnRyeSB0byByZXBlYXQgZXZlcnkgckZyZXEgcGVyaW9kcywKKyAgICAgICog ckR1cmF0aW9uIHRpbWVzLCBzdGFydGluZyBhdCBzdGFydC4gCisgICAgICAqCisgICAgICAqIFRo aXMgZnVuY3Rpb24gY29udGFpbnMgY29kZSBieSBEYWcgTnlncmVuLgorICAgICAgKi8KKyAgICAg IHN0cnVjdCB0bSByZXBlYXRVbnRpbChjb25zdCBRRGF0ZVRpbWUgJnN0YXJ0RHQsaW50IHJGcmVx LGludCByRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kQ29uc3Rh bnRzIHBlcmlvZCk7CiB9OwogCiAjZW5kaWYKSW5kZXg6IGNvbmR1aXRzL3ZjYWxjb25kdWl0L3Zj YWwtc2V0dXAuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZXBpbS9rcGlsb3Qv Y29uZHVpdHMvdmNhbGNvbmR1aXQvdmNhbC1zZXR1cC5jYyx2CnJldHJpZXZpbmcgcmV2aXNpb24g MS4xNApkaWZmIC11IC0zIC1kIC1wIC1yMS4xNCB2Y2FsLXNldHVwLmNjCi0tLSBjb25kdWl0cy92 Y2FsY29uZHVpdC92Y2FsLXNldHVwLmNjCTIwMDEvMDYvMDUgMjI6NTg6NDAJMS4xNAorKysgY29u ZHVpdHMvdmNhbGNvbmR1aXQvdmNhbC1zZXR1cC5jYwkyMDAxLzA2LzE3IDIyOjAzOjIxCkBAIC0y OCw3NyArMjgsMzUgQEAKICoqIEJ1ZyByZXBvcnRzIGFuZCBxdWVzdGlvbnMgY2FuIGJlIHNlbnQg dG8gYWRyaWRnQGNzLmt1bi5ubAogKi8KIAotCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogCi0jaWZu ZGVmIFFESVJfSAogI2luY2x1ZGUgPHFkaXIuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFMQUJFTF9I CiAjaW5jbHVkZSA8cWxhYmVsLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBRUFVTSEJUX0gKLSNpbmNs dWRlIDxxcHVzaGJ0Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBRRElBTE9HX0gKKyNpbmNsdWRlIDxx cHVzaGJ1dHRvbi5oPgogI2luY2x1ZGUgPHFkaWFsb2cuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFM SU5FRF9ICi0jaW5jbHVkZSA8cWxpbmVkLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBRQ0hLQk9YX0gK LSNpbmNsdWRlIDxxY2hrYm94Lmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBRTEFZT1VUX0gKKyNpbmNs dWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxY2hlY2tib3guaD4KICNpbmNsdWRlIDxxbGF5 b3V0Lmg+Ci0jZW5kaWYKIAotI2lmbmRlZiBfS0FQUF9ICiAjaW5jbHVkZSA8a2FwcC5oPgotI2Vu ZGlmCi0KLSNpZm5kZWYgX0tMT0NBTEVfSAogI2luY2x1ZGUgPGtsb2NhbGUuaD4KLSNlbmRpZgot Ci0jaWZuZGVmIF9LREVCVUdfSAogI2luY2x1ZGUgPGtkZWJ1Zy5oPgotI2VuZGlmCi0KLSNpZm5k ZWYgX0tGSUxFRElBTE9HX0gKICNpbmNsdWRlIDxrZmlsZWRpYWxvZy5oPgotI2VuZGlmCiAKLSNp Zm5kZWYgX0tERUJVR19ICi0jaW5jbHVkZSA8a2RlYnVnLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBf S1BJTE9UX0tQSUxPVENPTkZJR19ICiAjaW5jbHVkZSAia3BpbG90Q29uZmlnLmgiCi0jZW5kaWYK LQotI2lmbmRlZiBfS1BJTE9UX1ZDQUxfQ09ORFVJVF9ICiAjaW5jbHVkZSAidmNhbC1jb25kdWl0 LmgiCi0jZW5kaWYKIAotCisjaW5jbHVkZSAidmNhbC1zZXR1cC5oIgogI2luY2x1ZGUgInZjYWwt c2V0dXAubW9jIgogCitjb25zdCBRU3RyaW5nIFZDYWxTZXR1cDo6VkNhbEdyb3VwKCJ2Y2FsT3B0 aW9ucyIpOworCiBWQ2FsU2V0dXBQYWdlOjpWQ2FsU2V0dXBQYWdlKHNldHVwRGlhbG9nICpwYXJl bnQsIEtDb25maWcmIGNvbmZpZykgOgogCXNldHVwRGlhbG9nUGFnZShpMThuKCJDYWxlbmRhciIp LHBhcmVudCkKIHsKLSAgRlVOQ1RJT05TRVRVUDsKLQogICBncmlkID0gbmV3IFFHcmlkTGF5b3V0 KHRoaXMsIDIsIDQsIFNQQUNJTkcpOwogICAKLSAgRmlsZUxhYmVsID0KLSAgICBuZXcgUUxhYmVs KGkxOG4oIkNhbGVuZGFyIEZpbGU6IiksIHRoaXMpOworICBGaWxlTGFiZWwgPSBuZXcgUUxhYmVs KGkxOG4oIkNhbGVuZGFyIEZpbGU6IiksIHRoaXMpOwogCiAgIGZDYWxlbmRhckZpbGUgPSBuZXcg UUxpbmVFZGl0KHRoaXMpOwogICBmQ2FsZW5kYXJGaWxlLT5zZXRUZXh0KGNvbmZpZy5yZWFkRW50 cnkoIkNhbEZpbGUiLCAiIikpOwpAQCAtMTM4LDExICs5Niw4IEBAIFZDYWxTZXR1cFBhZ2U6On5W Q2FsU2V0dXBQYWdlKCkKICAgZGVsZXRlIGdyaWQ7CiB9CiAKLQogaW50IFZDYWxTZXR1cFBhZ2U6 OmNvbW1pdENoYW5nZXMoS0NvbmZpZyYgY29uZmlnKQogewotICBGVU5DVElPTlNFVFVQOwotCiAg IGNvbmZpZy53cml0ZUVudHJ5KCJDYWxGaWxlIiwgZkNhbGVuZGFyRmlsZS0+dGV4dCgpKTsKICAg Y29uZmlnLndyaXRlRW50cnkoIkZpcnN0VGltZSIsIAogCQkgICAgZlByb21wdEZpcnN0VGltZS0+ aXNDaGVja2VkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKQEAgLTE1MSwzNSArMTA2LDI4IEBAIGlu dCBWQ2FsU2V0dXBQYWdlOjpjb21taXRDaGFuZ2VzKEtDb25maWcKICAgcmV0dXJuIDA7CiB9CiAK LQotCiB2b2lkIFZDYWxTZXR1cFBhZ2U6OnNsb3RCcm93c2UoKQogewotCUZVTkNUSU9OU0VUVVA7 Ci0KLQlRU3RyaW5nIGZpbGVOYW1lID0gS0ZpbGVEaWFsb2c6OmdldE9wZW5GaWxlTmFtZSgwTCwg IioudmNzIik7Ci0JaWYoZmlsZU5hbWUuaXNOdWxsKCkpIHJldHVybjsKLQlmQ2FsZW5kYXJGaWxl LT5zZXRUZXh0KGZpbGVOYW1lKTsKKyAgUVN0cmluZyBmaWxlTmFtZSA9IEtGaWxlRGlhbG9nOjpn ZXRPcGVuRmlsZU5hbWUoMEwsICIqLnZjcyAqLmljcyIpOworICBpZihmaWxlTmFtZS5pc051bGwo KSkgcmV0dXJuOworICBmQ2FsZW5kYXJGaWxlLT5zZXRUZXh0KGZpbGVOYW1lKTsKIH0KIAogCi0K LS8qIHN0YXRpYyAqLyBjb25zdCBRU3RyaW5nIFZDYWxTZXR1cDo6VkNhbEdyb3VwKCJ2Y2FsT3B0 aW9ucyIpOwotCiBWQ2FsU2V0dXA6OlZDYWxTZXR1cChRV2lkZ2V0ICpwYXJlbnQpIDoKIAlzZXR1 cERpYWxvZyhwYXJlbnQsIFZDYWxHcm91cCkKIHsKLQlGVU5DVElPTlNFVFVQOwotCUtDb25maWcm IGNvbmZpZyA9IEtQaWxvdENvbmZpZzo6Z2V0Q29uZmlnKFZDYWxHcm91cCk7Ci0Jc1BhZ2UgPSBu ZXcgVkNhbFNldHVwUGFnZSh0aGlzLCBjb25maWcpOwotCWlmIChzUGFnZSkgYWRkUGFnZShzUGFn ZSk7Ci0JaVBhZ2UgPSBuZXcgc2V0dXBJbmZvUGFnZSh0aGlzKTsKLQlpZiAoaVBhZ2UpIGFkZFBh Z2UoaVBhZ2UpOworICBLQ29uZmlnJiBjb25maWcgPSBLUGlsb3RDb25maWc6OmdldENvbmZpZyhW Q2FsR3JvdXApOworICBzUGFnZSA9IG5ldyBWQ2FsU2V0dXBQYWdlKHRoaXMsIGNvbmZpZyk7Cisg IGlmIChzUGFnZSkgYWRkUGFnZShzUGFnZSk7CisgIGlQYWdlID0gbmV3IHNldHVwSW5mb1BhZ2Uo dGhpcyk7CisgIGlmIChpUGFnZSkgYWRkUGFnZShpUGFnZSk7CiAKLQlzZXR1cERpYWxvZzo6c2V0 dXBXaWRnZXQoKTsKKyAgc2V0dXBEaWFsb2c6OnNldHVwV2lkZ2V0KCk7CiB9CiAKLVZDYWxTZXR1 cDo6flZDYWxTZXR1cCgpIHsKK1ZDYWxTZXR1cDo6flZDYWxTZXR1cCgpCit7CiAgIGRlbGV0ZSBz UGFnZTsKICAgZGVsZXRlIGlQYWdlOwogfQpJbmRleDogY29uZHVpdHMvdmNhbGNvbmR1aXQvdmNh bEJhc2UuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZXBpbS9rcGlsb3QvY29u ZHVpdHMvdmNhbGNvbmR1aXQvdmNhbEJhc2UuY2MsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuOApk aWZmIC11IC0zIC1kIC1wIC1yMS44IHZjYWxCYXNlLmNjCi0tLSBjb25kdWl0cy92Y2FsY29uZHVp dC92Y2FsQmFzZS5jYwkyMDAxLzA2LzA1IDIyOjU4OjQwCTEuOAorKysgY29uZHVpdHMvdmNhbGNv bmR1aXQvdmNhbEJhc2UuY2MJMjAwMS8wNi8xNyAyMjowMzoyMQpAQCAtMSw4ICsxLDggQEAKLS8q IHZjYWxCYXNlLmNjCQkJUHJvZ3JhbQorLyogdmNhbEJhc2UuY2MJCQlCYXNlIGNsYXNzIGZvciBL T3JnYW5pemVyIENvbmR1aXRzCiAqKgotKiogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFkcmlhYW4g ZGUgR3Jvb3QKKyoqIENvcHlyaWdodCAoQykgMjAwMSBieSBBZHJpYWFuIGRlIEdyb290LCBDb3Ju ZWxpdXMgU2NodW1hY2hlcgogKioKLSoqIFByb2dyYW0gZGVzY3JpcHRpb24KKyoqIFRoaXMgaXMg dGhlIGJhc2UgY2xhc3MgZm9yIHRoZSB0b2RvIGFuZCBkYXRlYm9vayBjb25kdWl0cwogKi8KIAog LyoKQEAgLTIyLDYzICsyMiwzNiBAQAogKiogTUEgMDIxMzksIFVTQS4KICovCiAKLS8qCi0qKiBC dWcgcmVwb3J0cyBhbmQgcXVlc3Rpb25zIGNhbiBiZSBzZW50IHRvIGFkcmlkZ0Bjcy5rdW4ubmwK LSovCi0KLQogI2luY2x1ZGUgPGNzdGRsaWI+CiAKLSNpZm5kZWYgX0tQSUxPVF9PUFRJT05TX0gK ICNpbmNsdWRlICJvcHRpb25zLmgiCi0jZW5kaWYKIAotI2lmbmRlZiBRRklMRV9ICiAjaW5jbHVk ZSA8cWZpbGUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFFEQVRFVElNRV9ICiAjaW5jbHVkZSA8cWRh dGV0aW1lLmg+Ci0jZW5kaWYKIAotI2lmbmRlZiBfS01FU1NBR0VCT1hfSF8KLSNpbmNsdWRlICJr bWVzc2FnZWJveC5oIgotI2VuZGlmCisjaW5jbHVkZSA8a21lc3NhZ2Vib3guaD4KKyNpbmNsdWRl IDxrZGVidWcuaD4KIAotI2lmbmRlZiBfS1BJTE9UX0tQSUxPVENPTkZJR19ICi0jaW5jbHVkZSAi a3BpbG90Q29uZmlnLmgiCi0jZW5kaWYKKyNpbmNsdWRlIDxjYWxlbmRhcmxvY2FsLmg+CisjaW5j bHVkZSA8aWNhbGZvcm1hdC5oPgogCi0jaWZuZGVmIF9LREVCVUdfSF8KLSNpbmNsdWRlIDxrZGVi dWcuaD4KLSNlbmRpZgorI2luY2x1ZGUgImtwaWxvdENvbmZpZy5oIgogCi0jaWZuZGVmIF9WQ0FM X1ZDQUxCQVNFX0gKICNpbmNsdWRlICJ2Y2FsQmFzZS5oIgotI2VuZGlmCiAKLVZDYWxCYXNlQ29u ZHVpdDo6VkNhbEJhc2VDb25kdWl0KEJhc2VDb25kdWl0OjplQ29uZHVpdE1vZGUgbW9kZSkgOgot CUJhc2VDb25kdWl0KG1vZGUpLCAKLQlmVGltZVpvbmUoMCksIAotCWNhbE5hbWUoKSwgICAgICAg ICAvLyBUaGF0J3MgUVN0cmluZzo6bnVsbAotCWZDYWxlbmRhcigwKSAKKworVkNhbEJhc2VDb25k dWl0OjpWQ2FsQmFzZUNvbmR1aXQoQmFzZUNvbmR1aXQ6OmVDb25kdWl0TW9kZSBtb2RlLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNvbmR1aXQ6OkRhdGFiYXNlU291cmNl IHNvdXJjZSkgOgorICBCYXNlQ29uZHVpdChtb2RlLHNvdXJjZSksCisgIGZUaW1lWm9uZSgwKSwg CisgIGNhbE5hbWUoKSwgICAgICAgICAvLyBUaGF0J3MgUVN0cmluZzo6bnVsbAorICBmQ2FsZW5k YXIoMCkgCiB7Ci0JRlVOQ1RJT05TRVRVUDsKLQkKLQlmQ2FsZW5kYXIgPSAwTDsKIH0KIAotLyog dmlydHVhbCAqLyBWQ2FsQmFzZUNvbmR1aXQ6On5WQ2FsQmFzZUNvbmR1aXQoKQorVkNhbEJhc2VD b25kdWl0Ojp+VkNhbEJhc2VDb25kdWl0KCkKIHsKLQlGVU5DVElPTlNFVFVQOwotCQotCWlmIChm Q2FsZW5kYXIpCi0JewotCQljbGVhblZPYmplY3QoZkNhbGVuZGFyKTsKLQkJY2xlYW5TdHJUYmwo KTsKLQl9Ci0JCi0JZkNhbGVuZGFyPTBMOworICBkZWxldGUgZkNhbGVuZGFyOwogfQogCiBib29s IFZDYWxCYXNlQ29uZHVpdDo6Z2V0Q2FsZW5kYXIoY29uc3QgUVN0cmluZyAmZ3JvdXApCkBAIC0x MDQsOSArNzcsOSBAQCBib29sIFZDYWxCYXNlQ29uZHVpdDo6Z2V0Q2FsZW5kYXIoY29uc3QgCiAg IAogICBRQ1N0cmluZyBzID0gUUZpbGU6OmVuY29kZU5hbWUoY2FsTmFtZSk7CiAgIAotICBmQ2Fs ZW5kYXIgPSBQYXJzZV9NSU1FX0Zyb21GaWxlTmFtZSgoY29uc3QgY2hhciopcyk7CisgIGZDYWxl bmRhciA9IG5ldyBDYWxlbmRhckxvY2FsKCk7CiAgIAotICBpZihmQ2FsZW5kYXIgPT0gMEwpIHsK KyAgaWYoIWZDYWxlbmRhci0+bG9hZChzKSkgewogICAgIGtkRXJyb3IoQ09ORFVJVF9BUkVBKSA8 PCBfX0ZVTkNUSU9OX18KIAkJCSAgPDwgIjogQ291bGRuJ3Qgb3BlbiAiCiAJCQkgIDw8IGNhbE5h bWUKQEAgLTExNyw3ICs5MCw3IEBAIGJvb2wgVkNhbEJhc2VDb25kdWl0OjpnZXRDYWxlbmRhcihj b25zdCAKICAgICBERUJVR0NPTkRVSVQgPDwgZm5hbWUKIAkJIDw8ICI6IEdvdCBjYWxlbmRhciEi CiAJCSA8PCBlbmRsOwotICAgIGZUaW1lWm9uZSA9IGdldENhbGVuZGFyVGltZVpvbmUoZkNhbGVu ZGFyKTsKKyAgICBmVGltZVpvbmUgPSBmQ2FsZW5kYXItPmdldFRpbWVab25lKCk7CiAgICAgcmV0 dXJuIHRydWU7CiAgIH0KIH0KQEAgLTEyNSw1MjcgKzk4LDc2IEBAIGJvb2wgVkNhbEJhc2VDb25k dWl0OjpnZXRDYWxlbmRhcihjb25zdCAKIAogdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OnNhdmVWQ2Fs KCkKIHsKLSAgRlVOQ1RJT05TRVRVUDsKLQogICBpZiAoZkNhbGVuZGFyKSB7Ci0gICAgUUNTdHJp bmcgZmlsZW5hbWUoUUZpbGU6OmVuY29kZU5hbWUoY2FsTmFtZSkpOwotICAgIHdyaXRlVk9iamVj dFRvRmlsZShjb25zdF9jYXN0PGNoYXIgKj4oKGNvbnN0IGNoYXIgKikgZmlsZW5hbWUpLAotCQkg ICAgICAgZkNhbGVuZGFyKTsKKyAgICBJQ2FsRm9ybWF0ICpmb3JtYXQgPSBuZXcgSUNhbEZvcm1h dChmQ2FsZW5kYXIpOworICAgIGZDYWxlbmRhci0+c2F2ZShRRmlsZTo6ZW5jb2RlTmFtZShjYWxO YW1lKSxmb3JtYXQpOwogICB9CiAKICAgZkZpcnN0VGltZSA9IGZhbHNlOwogfQogCiAKLQogdm9p ZCBWQ2FsQmFzZUNvbmR1aXQ6Om5vQ2FsZW5kYXJFcnJvcihjb25zdCBRU3RyaW5nICZjb25kdWl0 TmFtZSkKIHsKLQlRU3RyaW5nIG1lc3NhZ2UgPSBpMThuKAotCQkiVGhlICUxIGNvdWxkIG5vdCBv cGVuIHRoZSBmaWxlIGAlMicuICIKLQkJIlBsZWFzZSBjb25maWd1cmUgdGhlIGNvbmR1aXQgd2l0 aCB0aGUgY29ycmVjdCAiCi0JCSJmaWxlbmFtZSBhbmQgdHJ5IGFnYWluLiIpCi0JCS5hcmcoY29u ZHVpdE5hbWUpCi0JCS5hcmcoY2FsTmFtZSk7Ci0JCQotCUtNZXNzYWdlQm94OjplcnJvcigwLCBt ZXNzYWdlLAotCQlpMThuKCIlMSBGYXRhbCBFcnJvciIpLmFyZyhjb25kdWl0TmFtZSkpOwotfQot CQotdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OnNldFN1bW1hcnkoVk9iamVjdCAqdmV2ZW50LGNvbnN0 IGNoYXIgKnN1bW1hcnkpCi17Ci0JRlVOQ1RJT05TRVRVUDsKLQotCVZPYmplY3QgKnZvID0gaXNB UHJvcGVydHlPZih2ZXZlbnQsIFZDU3VtbWFyeVByb3ApOwotCVFTdHJpbmcgcXN1bW1hcnkgKHN1 bW1hcnkpOwotCXFzdW1tYXJ5ID0gcXN1bW1hcnkuc2ltcGxpZnlXaGl0ZVNwYWNlKCk7Ci0JaWYg KHFzdW1tYXJ5LmlzRW1wdHkoKSkKLQl7Ci0JCS8vIFdlIHNob3VsZCBwcm9iYWJseSB1cGRhdGUg KGVtcHR5KSB0aGUKLQkJLy8gc3VtbWFyeSBpbiB0aGUgVk9iamVjdCBpZiB0aGVyZQotCQkvLyBp cyBvbmUuCi0JICAvLyArKysKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHZvKQotCQl7Ci0JCQlzZXRW T2JqZWN0VVN0cmluZ1pWYWx1ZV8odm8sCi0JCQkJZmFrZVVuaWNvZGUocXN1bW1hcnkudXRmOCgp LDApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWFkZFByb3BWYWx1ZSh2ZXZlbnQsIFZDU3VtbWFy eVByb3AsCi0JCQkJcXN1bW1hcnkudXRmOCgpKTsKLQkJfQotCX0KLX0KLQotdm9pZCBWQ2FsQmFz ZUNvbmR1aXQ6OnNldE5vdGUoVk9iamVjdCAqdmV2ZW50LGNvbnN0IGNoYXIgKnMpCi17Ci0JRlVO Q1RJT05TRVRVUDsKLQotCVZPYmplY3QgKnZvID0gaXNBUHJvcGVydHlPZih2ZXZlbnQsIFZDRGVz Y3JpcHRpb25Qcm9wKTsKKyAgUVN0cmluZyBtZXNzYWdlID0gaTE4bigKKyAgICAgICJUaGUgJTEg Y291bGQgbm90IG9wZW4gdGhlIGZpbGUgYCUyJy4gIgorICAgICAgIlBsZWFzZSBjb25maWd1cmUg dGhlIGNvbmR1aXQgd2l0aCB0aGUgY29ycmVjdCAiCisgICAgICAiZmlsZW5hbWUgYW5kIHRyeSBh Z2Fpbi4iKQorICAgICAgLmFyZyhjb25kdWl0TmFtZSkKKyAgICAgIC5hcmcoY2FsTmFtZSk7CiAJ Ci0JaWYgKHMpIHsKLQkgIGlmICgqcykgewotCQlRU3RyaW5nIHFub3RlIChzKTsKLQotCQkvLyBU aGVyZSBpcyBhIG5vdGUgZm9yIHRoaXMgZXZlbnQKLQkJLy8KLQkJLy8KLQkJaWYgKHZvKQotCQl7 Ci0JCQlzZXRWT2JqZWN0VVN0cmluZ1pWYWx1ZV8odm8sCi0JCQkJZmFrZVVuaWNvZGUocW5vdGUu dXRmOCgpLDApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXZvID0gYWRkUHJvcFZhbHVlKHZldmVu dCwgVkNEZXNjcmlwdGlvblByb3AsCi0JCQkJcW5vdGUudXRmOCgpKTsKLQkJfQotCi0JCS8vIHZv IG5vdyBjZXJ0YWlubHkgKD8pIHBvaW50cyB0byB0aGUgbm90ZSBwcm9wZXJ0eS4KLQkJLy8KLQkJ Ly8KLQkJaWYgKCF2bykKLQkJewotCQkJa2RFcnJvcigpIDw8IF9fRlVOQ1RJT05fXwotCQkJCTw8 ICI6IE5vIG9iamVjdCBmb3Igbm90ZSBwcm9wZXJ0eS4iCi0JCQkJPDwgZW5kbDsKLQkJCXJldHVy bjsKLQkJfQotCi0JCWlmIChzdHJjaHIocywnXG4nKSAmJgotCQkJIWlzQVByb3BlcnR5T2Yodm8s IFZDUXVvdGVkUHJpbnRhYmxlUHJvcCkpCi0JCXsKLQkJCS8vIE5vdGUgdGFrZXMgbW9yZSB0aGFu IG9uZSBsaW5lIHNvIHdlIG5lZWQKLQkJCS8vIHRvIGFkZCB0aGUgUXVvdGVkLVByaW50YWJsZSBw cm9wZXJ0eQotCQkJLy8KLQkJCS8vCi0JCQlhZGRQcm9wKHZvLFZDUXVvdGVkUHJpbnRhYmxlUHJv cCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJLy8gTm8gbm90ZSBhdCBhbGwKLQkJLy8KLQkJLy8K LQkJaWYgKHZvKQotCQl7Ci0JCQkvLyBTbyBza2lwIGV4aXN0aW5nIG5vdGUKLQkJCS8vCi0JCQkv LwotCQkJYWRkUHJvcCh2byxLUGlsb3RTa2lwUHJvcCk7Ci0JCX0KLQl9Ci0JfQotfQotCi0KLWlu dCBWQ2FsQmFzZUNvbmR1aXQ6OmdldENhbGVuZGFyVGltZVpvbmUoVk9iamVjdCAqY2FsKSB7Ci0g IEZVTkNUSU9OU0VUVVA7Ci0gIAotICBWT2JqZWN0ICp2byA9IGlzQVByb3BlcnR5T2YoY2FsLCBW Q1RpbWVab25lUHJvcCk7Ci0gIGlmICghdm8pIHJldHVybiAwOwotICAKLSAgYm9vbCBuZWcgPSBG QUxTRTsKLSAgaW50IGhvdXJzLCBtaW51dGVzOwotICBjaGFyICpzOwotICAKLSAgUVN0cmluZyB0 bXBTdHIocyA9IGZha2VDU3RyaW5nKHZPYmplY3RVU3RyaW5nWlZhbHVlKHZvKSkpOwotICBERUJV R0NPTkRVSVQgPDwgX19GVU5DVElPTl9fCi0JICAgICAgIDw8ICI6IEdvdCB0aW1lIHpvbmUgc3Ry aW5nICciCi0JICAgICAgIDw8IHMgPDwgIiciIDw8IGVuZGw7Ci0gIGRlbGV0ZVN0cihzKTsKLSAg Ci0gIGlmICh0bXBTdHIubGVmdCgxKSA9PSAiLSIpIG5lZyA9IFRSVUU7Ci0gIGlmICh0bXBTdHIu bGVmdCgxKSA9PSAiLSIgfHwgdG1wU3RyLmxlZnQoMSkgPT0gIisiKQotICAgIHRtcFN0ci5yZW1v dmUoMCwgMSk7Ci0KLSAgaG91cnMgPSB0bXBTdHIubGVmdCgyKS50b0ludCgpOwotICBpZiAodG1w U3RyLmxlbmd0aCgpID4gMikKLSAgICBtaW51dGVzID0gdG1wU3RyLnJpZ2h0KDIpLnRvSW50KCk7 Ci0gIGVsc2UKLSAgICBtaW51dGVzID0gMDsKLSAgCi0gIGludCB0aW1lWm9uZSA9IDYwICogaG91 cnMgKyBtaW51dGVzOwotICBpZiAobmVnKSB0aW1lWm9uZSA9IC10aW1lWm9uZTsKLSAgCi0gIERF QlVHQ09ORFVJVCA8PCBfX0ZVTkNUSU9OX18gPDwgIjogQ2FsY3VsYXRlZCBUWiBvZmZzZXQgIgot CSAgICAgICA8PCB0aW1lWm9uZSA8PCBlbmRsOwotICAKLSAgcmV0dXJuIHRpbWVab25lOwotfQot Ci0KLS8qCi0gKiBHaXZlbiBhbiBwaWxvdCBpZCwgc2VhcmNoIHRoZSB2Q2FsZW5kYXIgZm9yIGEg bWF0Y2hpbmcgdm9iamVjdCwgYW5kIHJldHVybgotICogdGhlIHBvaW50ZXIgdG8gdGhhdCBvYmpl Y3QuICBJZiBub3QgZm91bmQsIHJldHVybiBOVUxMLgotICovCi1WT2JqZWN0KiBWQ2FsQmFzZUNv bmR1aXQ6OmZpbmRFbnRyeUluQ2FsZW5kYXIocmVjb3JkaWRfdCBpZCwgY29uc3QKLQkJCQkJICAg ICAgY2hhciAqZW50cnlUeXBlKQotewotCUZVTkNUSU9OU0VUVVA7Ci0KLQlpZiAoZkNhbGVuZGFy ID09IDApCi0JICBrZEZhdGFsKCkgPDwgX19GVU5DVElPTl9fIDw8ICI6IGZDYWxlbmRhciA9PSAw IiA8PCBlbmRsOwotCi0JVk9iamVjdEl0ZXJhdG9yIGk7Ci0JVk9iamVjdCogZW50cnkgPSAwTDsK LQlWT2JqZWN0KiBvYmplY3RJRDsKLQotCWluaXRQcm9wSXRlcmF0b3IoJmksIGZDYWxlbmRhcik7 Ci0KLQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgdm9iamVjdHMgaW4gdGhlIHZjYWwKLQl3aGlsZSAo bW9yZUl0ZXJhdGlvbigmaSkpCi0JewotCQllbnRyeSA9IG5leHRWT2JqZWN0KCZpKTsKLQkJaWYg KCFlbnRyeSkKLQkJewotCQkJa2RXYXJuaW5nKCkgPDwgX19GVU5DVElPTl9fCi0JCQkJPDwgIjog bmV4dFZPYmplY3QgcmV0dXJuZWQgTlVMTCEiCi0JCQkJPDwgZW5kbDsKLQkJCWJyZWFrOwotCQl9 Ci0KLQkJb2JqZWN0SUQgPSBpc0FQcm9wZXJ0eU9mKGVudHJ5LCBLUGlsb3RJZFByb3ApOwotCi0J CWlmIChvYmplY3RJRCAmJgotCQkJKHN0cmNtcCh2T2JqZWN0TmFtZShlbnRyeSksIGVudHJ5VHlw ZSkgPT0gMCkpCi0JCXsKLQkJCWNvbnN0IGNoYXIgKnMgPSBmYWtlQ1N0cmluZygKLQkJCQl2T2Jq ZWN0VVN0cmluZ1pWYWx1ZShvYmplY3RJRCkpOwotCQkJaWYgKCFzKQotCQkJewotCQkJCWtkV2Fy bmluZygpIDw8IF9fRlVOQ1RJT05fXwotCQkJCQk8PCAiOiBmYWtlQ1N0cmluZyByZXR1cm5lZCBO VUxMISIKLQkJCQkJPDwgZW5kbDsKLQkJCQljb250aW51ZTsKLQkJCX0KLSNpZiAwCi0JCQllbHNl Ci0JCQl7Ci0JCQkJREVCVUdDT05EVUlUIDw8IGZuYW1lCi0JCQkJCTw8ICI6IExvb2tpbmcgYXQg b2JqZWN0IHdpdGggaWQgIgotCQkJCQk8PCBzCi0JCQkJCTw8IGVuZGw7Ci0JCQl9Ci0jZW5kaWYK LQotCQkJaWYoc3RydG91bChzLCAwTCwgMCkgPT0gaWQpCi0JCQl7Ci0JCQkJcmV0dXJuIGVudHJ5 OwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwTDsKLX0KLQotdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6 OnNldE51bVByb3BlcnR5KFZPYmplY3QgKnZldmVudCwKLQljb25zdCBjaGFyICpwcm9wZXJ0eW5h bWUsCi0JaW50IG51bSkKLXsKLQlGVU5DVElPTlNFVFVQOwotCi0JVk9iamVjdCAqdm8gPSBpc0FQ cm9wZXJ0eU9mKHZldmVudCxwcm9wZXJ0eW5hbWUpOwotCVFTdHJpbmcgczsKLQlzLnNldE51bShu dW0pOwotCi0JaWYgKHZvKQotCXsKLQkJc2V0Vk9iamVjdFVTdHJpbmdaVmFsdWVfKHZvLGZha2VV bmljb2RlKHMubGF0aW4xKCksMCkpOwotCX0KLQllbHNlCi0JewotCQlhZGRQcm9wVmFsdWUodmV2 ZW50LHByb3BlcnR5bmFtZSxzLmxhdGluMSgpKTsKLQl9Ci19Ci0KLXZvaWQgVkNhbEJhc2VDb25k dWl0OjpzZXRTZWNyZXQoVk9iamVjdCAqdmV2ZW50LGJvb2wgc2VjcmV0KQotewotCUZVTkNUSU9O U0VUVVA7Ci0KLQlWT2JqZWN0ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBWQ0NsYXNzUHJv cCk7Ci0JY29uc3QgY2hhciAqcyA9IHNlY3JldCA/ICJQUklWQVRFIiA6ICJQVUJMSUMiIDsKLQot CWlmICh2bykKLQl7Ci0JCXNldFZPYmplY3RVU3RyaW5nWlZhbHVlXyh2byxmYWtlVW5pY29kZShz LDApKTsKLQl9Ci0JZWxzZQotCXsJCi0JCWFkZFByb3BWYWx1ZSh2ZXZlbnQsVkNDbGFzc1Byb3As cyk7Ci0JfQotfQotCi0jaWYgMAotdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OnNldFN0YXR1cyhWT2Jq ZWN0ICp2ZXZlbnQsIGludCBzdGF0dXMpCi17Ci0JRlVOQ1RJT05TRVRVUDsKLQotCVZPYmplY3Qg KnZvID0gaXNBUHJvcGVydHlPZih2ZXZlbnQsIEtQaWxvdFN0YXR1c1Byb3ApOwotCWNoYXIgYnVm ZmVyWzIrNCpzaXplb2YoaW50KV07CS8vIE9uZSBieXRlIHByb2R1Y2VzIGF0IG1vc3QgMyBkaWdp dHMKLQkJCQkJLy8gaW4gZGVjaW1hbCwgYWRkIHNvbWUgc2xhY2sgYW5kCi0JCQkJCS8vIHNwYWNl IGZvciBhIC0KLQotCXNucHJpbnRmKGJ1ZmZlciwgMiArIDQgKiBzaXplb2YoaW50KSwgIiVkIiwg c3RhdHVzKTsKLQotCWlmICh2bykKLQl7Ci0KLQkJc2V0Vk9iamVjdFVTdHJpbmdaVmFsdWVfKHZv LGZha2VVbmljb2RlKGJ1ZmZlciwwKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCWFkZFByb3BWYWx1ZSh2 ZXZlbnQsS1BpbG90U3RhdHVzUHJvcCxidWZmZXIpOwotCX0KLX0KLSNlbmRpZgotCi0KLWludCBW Q2FsQmFzZUNvbmR1aXQ6OmdldFN0YXR1cyhWT2JqZWN0ICp2ZXZlbnQpIHsKLSAgRlVOQ1RJT05T RVRVUDsKLQotICBpbnQgc3RhdHVzID0gMjsKLSAgQVNTRVJUKHZldmVudCk7Ci0gIFZPYmplY3Qg KnZvID0gaXNBUHJvcGVydHlPZih2ZXZlbnQsIEtQaWxvdFN0YXR1c1Byb3ApOwotICBpZiAodm8p IHsKLSAgICBjaGFyICpzID0gZmFrZUNTdHJpbmcodk9iamVjdFVTdHJpbmdaVmFsdWUodm8pKTsK LSAgICBzdGF0dXMgPSBhdG9pKHMpOwotICAgIGRlbGV0ZVN0cihzKTsKLSAgfQotICByZXR1cm4g c3RhdHVzOwotfQotCi0KLXJlY29yZGlkX3QgVkNhbEJhc2VDb25kdWl0OjpnZXRSZWNvcmRJRChW T2JqZWN0ICp2ZXZlbnQpIHsKLSAgRlVOQ1RJT05TRVRVUDsKLSAgcmVjb3JkaWRfdCBpZDsKLSAg Vk9iamVjdCAqdm8gPSBpc0FQcm9wZXJ0eU9mKHZldmVudCwgS1BpbG90SWRQcm9wKTsKLSAgaWYg KHZvKSB7Ci0gICAgY2hhciAqcyA9IGZha2VDU3RyaW5nKHZPYmplY3RVU3RyaW5nWlZhbHVlKHZv KSk7Ci0gICAgaWQgPSBhdG9pKHMpOwotICAgIGRlbGV0ZVN0cihzKTsKLSAgfSBlbHNlCi0gICAg aWQgPSAwOwotICByZXR1cm4gaWQ7Ci19Ci0KLQotYm9vbCBWQ2FsQmFzZUNvbmR1aXQ6OmdldERh dGVQcm9wZXJ0eShzdHJ1Y3QgdG0gKnQsCi0JCQkJICAgICAgVk9iamVjdCAqdmV2ZW50LAotCQkJ CSAgICAgIGNvbnN0IGNoYXIgKnByb3ApIHsKLSAgRlVOQ1RJT05TRVRVUDsKLQotICBpZiAoIXQp Ci0gICAga2RGYXRhbCgpIDw8IGZuYW1lIDw8ICI6IHQgPT0gMCIgPDwgZW5kbDsKLQotICBWT2Jq ZWN0ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBwcm9wKTsKLSAgCi0gIGlmICh2bykgewot ICAgIGNoYXIgKnMgPSBmYWtlQ1N0cmluZyh2T2JqZWN0VVN0cmluZ1pWYWx1ZSh2bykpOwotICAg IHN0cnVjdCB0bSB0MiA9IElTT1RvVG0oUVN0cmluZyhzKSk7Ci0gICAgbWVtY3B5KHQsICZ0Miwg c2l6ZW9mKHN0cnVjdCB0bSkpOwotICAgIGRlbGV0ZVN0cihzKTsKLSAgfSBlbHNlCi0gICAgcmV0 dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi12b2lkIFZDYWxCYXNlQ29uZHVpdDo6 YWRkRGF0ZVByb3BlcnR5KFZPYmplY3QgKnZldmVudCwKLQljb25zdCBjaGFyICpwcm9wLAotCWNv bnN0IFFEYXRlVGltZSYgZHQsCi0JYm9vbCB0cnVuY2F0ZVRpbWUpCi17Ci0JUVN0cmluZyBkYXRl U3RyaW5nID0gVG1Ub0lTTyhkdCx0cnVuY2F0ZVRpbWUpOwotCWFkZFByb3BWYWx1ZSh2ZXZlbnQs IHByb3AsIGRhdGVTdHJpbmcubGF0aW4xKCkpOwotfQotCi12b2lkIFZDYWxCYXNlQ29uZHVpdDo6 YWRkRGF0ZVByb3BlcnR5KFZPYmplY3QgKnZldmVudCwKLQljb25zdCBjaGFyICpwcm9wLAotCWNv bnN0IHN0cnVjdCB0bSAqdCwKLQlib29sIHRydW5jYXRlVGltZSkKLXsKLQlRU3RyaW5nIGRhdGVT dHJpbmcgPSBUbVRvSVNPKHQsdHJ1bmNhdGVUaW1lKTsKLQlhZGRQcm9wVmFsdWUodmV2ZW50LCBw cm9wLCBkYXRlU3RyaW5nLmxhdGluMSgpKTsKKyAgS01lc3NhZ2VCb3g6OmVycm9yKDAsIG1lc3Nh Z2UsaTE4bigiJTEgRmF0YWwgRXJyb3IiKS5hcmcoY29uZHVpdE5hbWUpKTsKIH0KIAotdm9pZCBW Q2FsQmFzZUNvbmR1aXQ6OnNldERhdGVQcm9wZXJ0eShWT2JqZWN0ICp2ZXZlbnQsCi0JY29uc3Qg UURhdGVUaW1lJiBkdCwKLQlib29sIHRydW5jYXRlVGltZSkKK3ZvaWQgVkNhbEJhc2VDb25kdWl0 OjpzZXRTdW1tYXJ5KEluY2lkZW5jZSAqaW5jaWRlbmNlLGNvbnN0IGNoYXIgKnN1bW1hcnkpCiB7 Ci0Jc2V0Vk9iamVjdFVTdHJpbmdaVmFsdWVfKHZldmVudCwKLQkJZmFrZVVuaWNvZGUoVG1Ub0lT TyhkdCx0cnVuY2F0ZVRpbWUpLmxhdGluMSgpLCAwKSk7CisgIGluY2lkZW5jZS0+c2V0U3VtbWFy eShzdW1tYXJ5KTsKIH0KIAotdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OnNldERhdGVQcm9wZXJ0eShW T2JqZWN0ICp2ZXZlbnQsCi0JY29uc3Qgc3RydWN0IHRtICpwLAotCWJvb2wgdHJ1bmNhdGVUaW1l KQordm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OnNldE5vdGUoSW5jaWRlbmNlICppbmNpZGVuY2UsY29u c3QgY2hhciAqcykKIHsKLQlzZXRWT2JqZWN0VVN0cmluZ1pWYWx1ZV8odmV2ZW50LAotCQlmYWtl VW5pY29kZShUbVRvSVNPKHAsdHJ1bmNhdGVUaW1lKS5sYXRpbjEoKSwgMCkpOworICBpbmNpZGVu Y2UtPnNldERlc2NyaXB0aW9uKHMpOwogfQogCi0KLVFTdHJpbmcgVkNhbEJhc2VDb25kdWl0OjpU bVRvSVNPKGNvbnN0IFFEYXRlVGltZSAmZHQsCi0JYm9vbCB0cnVuY2F0ZVRpbWUpCit2b2lkIFZD YWxCYXNlQ29uZHVpdDo6c2V0U2VjcmV0KEluY2lkZW5jZSAqdmV2ZW50LGJvb2wgc2VjcmV0KQog ewotCUZVTkNUSU9OU0VUVVA7Ci0KLQlRU3RyaW5nIGRhdGVTdHJpbmc7Ci0KLQlpZiAodHJ1bmNh dGVUaW1lKQotCXsKLQlkYXRlU3RyaW5nLnNwcmludGYoIiUuNGQlLjJkJS4yZFQwMDAwMDAiLAot CQlkdC5kYXRlKCkueWVhcigpLCBkdC5kYXRlKCkubW9udGgoKSwgZHQuZGF0ZSgpLmRheSgpKTsK LQl9Ci0JZWxzZQotCXsKLQlkYXRlU3RyaW5nLnNwcmludGYoIiUuNGQlLjJkJS4yZFQlLjJkJS4y ZCUuMmQiLAotCQlkdC5kYXRlKCkueWVhcigpLCBkdC5kYXRlKCkubW9udGgoKSwgZHQuZGF0ZSgp LmRheSgpLCAKLQkJZHQudGltZSgpLmhvdXIoKSwgZHQudGltZSgpLm1pbnV0ZSgpLCBkdC50aW1l KCkuc2Vjb25kKCkpOwotCX0KLQotCXJldHVybiBkYXRlU3RyaW5nOworICB2ZXZlbnQtPnNldFNl Y3JlY3koc2VjcmV0ID8gSW5jaWRlbmNlOjpTZWNyZWN5UHJpdmF0ZSA6CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBJbmNpZGVuY2U6OlNlY3JlY3lQdWJsaWMpOwogfQotCiAKLVFTdHJp bmcgVkNhbEJhc2VDb25kdWl0OjpUbVRvSVNPKGNvbnN0IHN0cnVjdCB0bSAqdG0sCi0JYm9vbCB0 cnVuY2F0ZVRpbWUpCitRRGF0ZVRpbWUgVkNhbEJhc2VDb25kdWl0OjpyZWFkVG0oY29uc3Qgc3Ry dWN0IHRtICZ0KQogewotICBRU3RyaW5nIGRTdHI7Ci0KLSAgaWYgKHRydW5jYXRlVGltZSkKLSAg ewotICBkU3RyLnNwcmludGYoIiUuNGQlLjJkJS4yZFQwMDAwMDAiLAotCSAgICAgICAxOTAwICsg dG0tPnRtX3llYXIsCi0JICAgICAgIHRtLT50bV9tb24gKyAxLAotCSAgICAgICB0bS0+dG1fbWRh eSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gIGRTdHIuc3ByaW50ZigiJS40ZCUuMmQlLjJkVCUuMmQl LjJkJS4yZCIsCi0JICAgICAgIDE5MDAgKyB0bS0+dG1feWVhciwKLQkgICAgICAgdG0tPnRtX21v biArIDEsCi0JICAgICAgIHRtLT50bV9tZGF5LAotCSAgICAgICB0bS0+dG1faG91ciwKLQkgICAg ICAgdG0tPnRtX21pbiwKLQkgICAgICAgdG0tPnRtX3NlYyk7Ci0gIH0KLQotICByZXR1cm4gZFN0 cjsKKyAgUURhdGVUaW1lIGR0OworICBkdC5zZXREYXRlKFFEYXRlKDE5MDAgKyB0LnRtX3llYXIs IHQudG1fbW9uICsgMSwgdC50bV9tZGF5KSk7CisgIGR0LnNldFRpbWUoUVRpbWUodC50bV9ob3Vy LCB0LnRtX21pbiwgdC50bV9zZWMpKTsKKyAgcmV0dXJuIGR0OwogfQogCi0vKiBzdGF0aWMgKi8g c3RydWN0IHRtIFZDYWxCYXNlQ29uZHVpdDo6SVNPVG9UbShjb25zdCBRU3RyaW5nICZ0U3RyLGlu dCB0aW1lWm9uZSkKK3N0cnVjdCB0bSBWQ2FsQmFzZUNvbmR1aXQ6OndyaXRlVG0oY29uc3QgUURh dGVUaW1lICZkdCkKIHsKLSAgc3RydWN0IHRtIHRtOwotCi0gIHRtLnRtX3dkYXkgPSAwOyAvLyB1 bmltcGxlbWVudGVkCi0gIHRtLnRtX3lkYXkgPSAwOyAvLyB1bmltcGxlbWVudGVkCi0gIHRtLnRt X2lzZHN0ID0gMDsgLy8gdW5pbXBsZW1lbnRlZAotCi0gIHNzY2FuZih0U3RyLmxhdGluMSgpLCIl MDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKLQkgJnRtLnRtX3llYXIsICZ0bS50bV9tb24sCi0J ICZ0bS50bV9tZGF5LCAmdG0udG1faG91ciwKLQkgJnRtLnRtX21pbiwgJnRtLnRtX3NlYyk7Cisg IHN0cnVjdCB0bSB0OwogCi0gIC8vIHBvc3NpYmx5IGNvcnJlY3QgZm9yIHRpbWVab25lCi0gIGlm ICh0aW1lWm9uZSAmJiAodFN0ci5yaWdodCgxKSA9PSAiWiIpKSB7Ci0gICAgUURhdGVUaW1lIHRt cERUOwotICAgIHRtcERULnNldERhdGUoUURhdGUodG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50 bV9tZGF5KSk7Ci0gICAgdG1wRFQuc2V0VGltZShRVGltZSh0bS50bV9ob3VyLCB0bS50bV9taW4s IHRtLnRtX3NlYykpOwotICAgIHRtcERUID0gdG1wRFQuYWRkU2Vjcyg2MCp0aW1lWm9uZSk7IC8v IGNvcnJlY3QgZnJvbSBHTVQKLSAgICB0bS50bV95ZWFyID0gdG1wRFQuZGF0ZSgpLnllYXIoKTsK LSAgICB0bS50bV9tb24gPSB0bXBEVC5kYXRlKCkubW9udGgoKTsKLSAgICB0bS50bV9tZGF5ID0g dG1wRFQuZGF0ZSgpLmRheSgpOwotICAgIHRtLnRtX2hvdXIgPSB0bXBEVC50aW1lKCkuaG91cigp OwotICAgIHRtLnRtX21pbiA9IHRtcERULnRpbWUoKS5taW51dGUoKTsKLSAgICB0bS50bV9zZWMg PSB0bXBEVC50aW1lKCkuc2Vjb25kKCk7Ci0gIH0KKyAgdC50bV93ZGF5ID0gMDsgLy8gdW5pbXBs ZW1lbnRlZAorICB0LnRtX3lkYXkgPSAwOyAvLyB1bmltcGxlbWVudGVkCisgIHQudG1faXNkc3Qg PSAwOyAvLyB1bmltcGxlbWVudGVkCiAKLSAgLy8gdG1feWVhciBpcyBvbmx5IHNpbmNlIDE5MDAK LSAgdG0udG1feWVhciAtPSAxOTAwOwotICAvLyBwaWxvdCBtb250aCBpcyAwLWJhc2VkLgotICB0 bS50bV9tb24gLT0gMTsKKyAgdC50bV95ZWFyID0gZHQuZGF0ZSgpLnllYXIoKSAtIDE5MDA7Cisg IHQudG1fbW9uID0gZHQuZGF0ZSgpLm1vbnRoKCkgLSAxOworICB0LnRtX21kYXkgPSBkdC5kYXRl KCkuZGF5KCk7CisgIHQudG1faG91ciA9IGR0LnRpbWUoKS5ob3VyKCk7CisgIHQudG1fbWluID0g ZHQudGltZSgpLm1pbnV0ZSgpOworICB0LnRtX3NlYyA9IGR0LnRpbWUoKS5zZWNvbmQoKTsKIAot ICByZXR1cm4gdG07CisgIHJldHVybiB0OwogfQotCiAKLWludCBWQ2FsQmFzZUNvbmR1aXQ6Om51 bUZyb21EYXkoY29uc3QgUVN0cmluZyAmZGF5KQordm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OmRlbGV0 ZVJlY29yZChQaWxvdFJlY29yZCAqcmVjKQogewotICBpZiAoZGF5ID09ICJTVSAiKSByZXR1cm4g MDsKLSAgaWYgKGRheSA9PSAiTU8gIikgcmV0dXJuIDE7Ci0gIGlmIChkYXkgPT0gIlRVICIpIHJl dHVybiAyOwotICBpZiAoZGF5ID09ICJXRSAiKSByZXR1cm4gMzsKLSAgaWYgKGRheSA9PSAiVEgg IikgcmV0dXJuIDQ7Ci0gIGlmIChkYXkgPT0gIkZSICIpIHJldHVybiA1OwotICBpZiAoZGF5ID09 ICJTQSAiKSByZXR1cm4gNjsKLQotICByZXR1cm4gLTE7IC8vIHNvbWV0aGluZyBiYWQgaGFwcGVu ZWQuIDopCisgIGtkRGVidWcoKSA8PCAiVkNhbEJhc2VDb25kdWl0OjpkZWxldGVSZWNvcmQoKSBu b3QgeWV0IGltcGxlbWVudGVkIiA8PCBlbmRsOwogfQogCi0vKgotICogVGhlIHBpbG90IHJlY29y ZCBzcGVjaWZpZWQgd2FzIGRlbGV0ZWQgb24gdGhlIHBpbG90LiAgUmVtb3ZlCi0gKiB0aGUgY29y cmVzcG9uZGluZyB2b2JqZWN0IGZyb20gdGhlIHZDYWxlbmRhci4KLSAqLwotdm9pZCBWQ2FsQmFz ZUNvbmR1aXQ6OmRlbGV0ZVZPYmplY3QoUGlsb3RSZWNvcmQgKnJlYywgY29uc3QgY2hhciAqdHlw ZSkKK3ZvaWQgVkNhbEJhc2VDb25kdWl0OjpkZWxldGVGcm9tUGlsb3QoaW50IGVudHJ5VHlwZSkK IHsKLSAgVk9iamVjdCAqZGVsdm87Ci0KLSAgZGVsdm8gPSBmaW5kRW50cnlJbkNhbGVuZGFyKHJl Yy0+Z2V0SUQoKSwgdHlwZSk7Ci0gIC8vIGlmIHRoZSBlbnRyeSB3YXMgZm91bmQsIGl0IGlzIHN0 aWxsIGluIHRoZSB2Q2FsZW5kYXIuICBXZSBuZWVkIHRvCi0gIC8vIHNldCB0aGUgU3RhdHVzIGZs YWcgdG8gRGVsZXRlZCwgc28gdGhhdCBLT3JnYW5pemVyIHdpbGwgbm90IGxvYWQKLSAgLy8gaXQg bmV4dCB0aW1lIHRoZSB2Q2FsZW5kYXIgaXMgcmVhZCBpbi4gIElmIGl0IGlzIG5vdCBmb3VuZCwg dGhlCi0gIC8vIHVzZXIgaGFzIGFsc28gZGVsZXRlZCBpdCBhbHJlYWR5IGluIHRoZSB2Q2FsZW5k YXIsIGFuZCB3ZSBjYW4KLSAgLy8gc2FmZWx5IGRvIG5vdGhpbmcuCi0gIGlmIChkZWx2bykgewot ICAgIC8vIHdlIG5vdyB1c2UgdGhlIGFkZGl0aW9uYWwgJ0tQaWxvdFNraXAnIHByb3BlcnR5LCBp bnN0ZWFkIG9mIGEgc3BlY2lhbAotICAgIC8vIHZhbHVlIGZvciBLUGlsb3RTdGF0dXNQcm9wLgot ICAgIGFkZFByb3AoZGVsdm8sIEtQaWxvdFNraXBQcm9wKTsKLSAgfQotfQotCi0KLS8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCi0KLQotUVN0cmluZyBWQ2FsQmFzZUNvbmR1aXQ6OmdldFN1bW1hcnkoVk9iamVj dCAqdmV2ZW50KSB7Ci0gIEZVTkNUSU9OU0VUVVA7Ci0KLSAgUVN0cmluZyBzOwotICBWT2JqZWN0 ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBWQ1N1bW1hcnlQcm9wKTsKLSAgaWYgKHZvKSB7 Ci0gICAgY29uc3QgY2hhciAqczIgPSBmYWtlQ1N0cmluZyh2T2JqZWN0VVN0cmluZ1pWYWx1ZSh2 bykpOwotICAgIHMgPSBRU3RyaW5nOjpmcm9tVXRmOChzMik7Ci0gICAgZGVsZXRlU3RyKHMyKTsK LSAgfQotICByZXR1cm4gczsKLX0gLy8gUVN0cmluZyBWQ2FsQ29uZHVpdDo6Z2V0U3VtbWFyeShj b25zdCBWT2JqZWN0ICp2ZXZlbnQpCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1RU3RyaW5n IFZDYWxCYXNlQ29uZHVpdDo6Z2V0RGVzY3JpcHRpb24oVk9iamVjdCAqdmV2ZW50KSB7Ci0gIC8v IHdoYXQgd2UgY2FsbCBkZXNjcmlwdGlvbiBwaWxvdCBwdXRzIGFzIGEgc2VwYXJhdGUgbm90ZQot ICBGVU5DVElPTlNFVFVQOwotICBWT2JqZWN0ICp2byA9IGlzQVByb3BlcnR5T2YodmV2ZW50LCBW Q0Rlc2NyaXB0aW9uUHJvcCk7Ci0gIFFTdHJpbmcgc3RyOwotICBpZiAodm8pIHsKLSAgICBjb25z dCBjaGFyICpzID0gZmFrZUNTdHJpbmcodk9iamVjdFVTdHJpbmdaVmFsdWUodm8pKTsKLSAgICBz dHIgPSBRU3RyaW5nOjpmcm9tVXRmOChzKTsKLSAgICBkZWxldGVTdHIocyk7Ci0gIH0KLSAgcmV0 dXJuIHN0cjsKLX0gLy8gUVN0cmluZyBWQ2FsQ29uZHVpdDo6Z2V0RGVzY3JpcHRpb24oY29uc3Qg Vk9iamVjdCAqdmV2ZW50KQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi12b2lkIFZDYWxCYXNl Q29uZHVpdDo6ZGVsZXRlRnJvbVBpbG90KGNvbnN0IGNoYXIgKmVudHJ5VHlwZSkgewogICBRVmFs dWVMaXN0PHJlY29yZGlkX3Q+IGRlbGV0ZWRMaXN0OwogCiAgIC8qIEJ1aWxkIGEgbGlzdCBvZiBy ZWNvcmRzIGluIHRoZSBwaWxvdCBjYWxlbmRhciB0aGF0IGFyZSBub3QKQEAgLTY1NSw3ICsxNzcs MTAgQEAgdm9pZCBWQ2FsQmFzZUNvbmR1aXQ6OmRlbGV0ZUZyb21QaWxvdChjbwogICBQaWxvdFJl Y29yZCAqcmVjOwogICBpbnQgaW5kZXggPSAwOwogICB3aGlsZSAoKHJlYyA9IHJlYWRSZWNvcmRC eUluZGV4KGluZGV4KyspKSAhPSAwKSB7Ci0gICAgaWYgKCFmaW5kRW50cnlJbkNhbGVuZGFyKHJl Yy0+Z2V0SUQoKSwgZW50cnlUeXBlKSkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBp ZiAoKGVudHJ5VHlwZSA9PSBUeXBlVG9kbykgJiYgZmluZFRvZG8ocmVjLT5nZXRJRCgpKSkgZm91 bmQgPSB0cnVlOworICAgIGlmICgoZW50cnlUeXBlID09IFR5cGVFdmVudCkgJiYgZmluZEV2ZW50 KHJlYy0+Z2V0SUQoKSkpIGZvdW5kID0gdHJ1ZTsKKyAgICBpZiAoIWZvdW5kKSB7CiAgICAgICBE RUJVR0NPTkRVSVQgPDwgX19GVU5DVElPTl9fCiAJCSAgIDw8ICI6IHJlY29yZCAiCiAJCSAgIDw8 IHJlYy0+Z2V0SUQoKQpAQCAtNjY2LDYgKzE5MSwxMSBAQCB2b2lkIFZDYWxCYXNlQ29uZHVpdDo6 ZGVsZXRlRnJvbVBpbG90KGNvCiAgICAgfQogICAgIGRlbGV0ZSByZWM7CiAgIH0KKworICAvLyBE aXNhYmxlIGRlbGV0aW9uIHRvIHByZXZlbnQgZGF0YSBsb3NzIGluIGNhc2Ugb2YgbG9ncy4KKyAg Ly8gV2lsbCBiZSByZW1vdmVkLCB3aGVuIHRoZSB0b2RvIGFuZCBkYXRlYm9vayBjb25kdWl0cyBh cmUgdGhvcm91Z2hseSB0ZXN0ZWQKKyAgLy8gVE9ETzogUmVlbmFibGUgZGVsZXRlRnJvbVBpbG90 KCkKKyAgcmV0dXJuOwogICAKICAgLy8gTm93IHByb2Nlc3MgdGhlIGxpc3Qgb2YgZGVsZXRlZCBy ZWNvcmRzLiAKICAgZm9yIChRVmFsdWVMaXN0PHJlY29yZGlkX3Q+OjpJdGVyYXRvciBpdCA9IGRl bGV0ZWRMaXN0LmJlZ2luKCk7CkBAIC02ODgsNiArMjE4LDMxIEBAIHZvaWQgVkNhbEJhc2VDb25k dWl0OjpkZWxldGVGcm9tUGlsb3QoY28KICAgfQogfQogCitUb2RvICpWQ2FsQmFzZUNvbmR1aXQ6 OmZpbmRUb2RvKHJlY29yZGlkX3QgaWQpCit7CisgIFFMaXN0PFRvZG8+IHRvZG9zID0gY2FsZW5k YXIoKS0+Z2V0VG9kb0xpc3QoKTsKKyAgCisgIFRvZG8gKnRvZG8gPSB0b2Rvcy5maXJzdCgpOwor ICB3aGlsZSh0b2RvKSB7CisgICAgaWYgKHRvZG8tPnBpbG90SWQoKSA9PSBpZCkgcmV0dXJuIHRv ZG87CisgICAgdG9kbyA9IHRvZG9zLm5leHQoKTsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisK K0V2ZW50ICpWQ2FsQmFzZUNvbmR1aXQ6OmZpbmRFdmVudChyZWNvcmRpZF90IGlkKQoreworICBR TGlzdDxFdmVudD4gZXZlbnRzID0gY2FsZW5kYXIoKS0+Z2V0QWxsRXZlbnRzKCk7CisgIAorICBF dmVudCAqZXZlbnQgPSBldmVudHMuZmlyc3QoKTsKKyAgd2hpbGUoZXZlbnQpIHsKKyAgICBpZiAo ZXZlbnQtPnBpbG90SWQoKSA9PSBpZCkgcmV0dXJuIGV2ZW50OyAgICAKKyAgICBldmVudCA9IGV2 ZW50cy5uZXh0KCk7CisgIH0KKyAgCisgIHJldHVybiAwOworfQogCiAvLyAkTG9nOiB2Y2FsQmFz ZS5jYyx2ICQKIC8vIFJldmlzaW9uIDEuOCAgMjAwMS8wNi8wNSAyMjo1ODo0MCAgYWRyaWRnCklu ZGV4OiBjb25kdWl0cy92Y2FsY29uZHVpdC92Y2FsQmFzZS5oCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6 IC9ob21lL2tkZS9rZGVwaW0va3BpbG90L2NvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWxCYXNlLmgs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNwpkaWZmIC11IC0zIC1kIC1wIC1yMS43IHZjYWxCYXNl LmgKLS0tIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWxCYXNlLmgJMjAwMS8wNi8wNSAyMjo1ODo0 MAkxLjcKKysrIGNvbmR1aXRzL3ZjYWxjb25kdWl0L3ZjYWxCYXNlLmgJMjAwMS8wNi8xNyAyMjow MzoyMgpAQCAtMSw4ICsxLDcgQEAKLS8qIHZjYWxCYXNlLmgJCQlQcm9ncmFtCisvKiB2Y2FsQmFz ZS5oCQkJQmFzZSBjbGFzcyBmb3IgS09yZ2FuaXplciBjb25kdWl0cwogKioKLSoqIENvcHlyaWdo dCAoQykgMjAwMSBieSBBZHJpYWFuIGRlIEdyb290CisqKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkg QWRyaWFhbiBkZSBHcm9vdCwgQ29ybmVsaXVzIFNjaHVtYWNoZXIKICoqCi0qKiBQcm9ncmFtIGRl c2NyaXB0aW9uCiAqLwogCiAvKgpAQCAtMjEsMTY0ICsyMCw4OCBAQAogKiogdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIAogKiogTUEg MDIxMzksIFVTQS4KICovCi0KLS8qCi0qKiBCdWcgcmVwb3J0cyBhbmQgcXVlc3Rpb25zIGNhbiBi ZSBzZW50IHRvIGFkcmlkZ0Bjcy5rdW4ubmwKLSovCi0KICNpZm5kZWYgX1ZDQUxfVkNBTEJBU0Vf SAogI2RlZmluZSBfVkNBTF9WQ0FMQkFTRV9ICiAKLWNsYXNzIFBpbG90UmVjb3JkOwotLy9jbGFz cyBWT2JqZWN0OwotY2xhc3MgUURhdGVUaW1lOworI2luY2x1ZGUgImNhbGVuZGFyLmgiCiAKLSNp Zm5kZWYgX0tQSUxPVF9CQVNFQ09ORFVJVF9ICiAjaW5jbHVkZSAiYmFzZUNvbmR1aXQuaCIKLSNl bmRpZgotCi0jaWZuZGVmIF9fVkNDX0hfXwotI2luY2x1ZGUgInZjYy5oIgotI2VuZGlmCi0KLWNs YXNzIFZDYWxCYXNlQ29uZHVpdCA6IHB1YmxpYyBCYXNlQ29uZHVpdCB7Ci0gcHVibGljOgotICBW Q2FsQmFzZUNvbmR1aXQoQmFzZUNvbmR1aXQ6OmVDb25kdWl0TW9kZSBtb2RlKTsKLSAgdmlydHVh bCB+VkNhbEJhc2VDb25kdWl0KCk7Ci0JCi0gIHZpcnR1YWwgdm9pZCBkb1N5bmMoKSA9IDA7Ci0g IHZpcnR1YWwgdm9pZCBkb0JhY2t1cCgpID0gMDsKLSAgdmlydHVhbCBRV2lkZ2V0ICphYm91dEFu ZFNldHVwKCkgPSAwOwotICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmRiSW5mbygpID0gMDsKLQotcHVi bGljOgotCS8qKgotCSogVGhlcmUgYXJlIGEgd2hvbGUgYnVuY2ggb2YgbWV0aG9kcyB0aGF0IHNl dCBwYXJ0aWN1bGFyCi0JKiBwcm9wZXJ0aWVzIG9uIFZPYmplY3RzLiBQcm9iYWJseSB0aGV5IGRv bid0IGJlbG9uZyBoZXJlCi0JKiBidXQgaW4gdmVyc2l0LgotCSovCi0Jc3RhdGljIHZvaWQgc2V0 U3VtbWFyeShWT2JqZWN0ICp2ZXZlbnQsY29uc3QgY2hhciAqbm90ZSk7Ci0Jc3RhdGljIHZvaWQg c2V0Tm90ZShWT2JqZWN0ICp2ZXZlbnQsY29uc3QgY2hhciAqbm90ZSk7Ci0Jc3RhdGljIHZvaWQg c2V0U2VjcmV0KFZPYmplY3QgKnZldmVudCxib29sIHNlY3JldCk7Ci0Jc3RhdGljIHZvaWQgc2V0 U3RhdHVzKFZPYmplY3QgKnZldmVudCxpbnQgc3RhdHVzKSAKLQkgIHsgc2V0TnVtUHJvcGVydHko dmV2ZW50LCBLUGlsb3RTdGF0dXNQcm9wLCBzdGF0dXMpOyB9CSAgCi0KLQkvKiogCi0JICogRmlu ZCB0aGUgc3VtbWFyeSBzdHJpbmcgb2YgdmNhbGVuZGFyIGV2ZW50IEBhcmcKLQkgKiB2ZXZlbnQu IFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUgZm91bmQuCi0JICovCi0Jc3RhdGljIFFT dHJpbmcgZ2V0U3VtbWFyeShWT2JqZWN0ICp2ZXZlbnQpOwotCi0JLyoqIEZpbmQgdGhlIGRlc2Ny aXB0aW9uIHN0cmluZyBvZiB2Y2FsZW5kYXIgZXZlbnQgQGFyZwotCSAgICB2ZXZlbnQuIFJldHVy bnMgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUgZm91bmQuICovCi0Jc3RhdGljIFFTdHJpbmcgZ2V0 RGVzY3JpcHRpb24oVk9iamVjdCAqdmV2ZW50KTsKIAotCS8qKiBDaGVjayBAYXJnICp2ZXZlbnQg Zm9yIEtQaWxvdFN0YXR1cyBwcm9wZXJ0eS4gUmV0dXJucyAwIG9yCi0JICAgIDEgaWYgdGhlIHBy b3BlcnR5IGV4aXN0cywgMiBvdGhlcndpc2UgKGkuZS4gMCBpZiB0aGUgcmVjb3JkCi0JICAgIGlz IHVubW9kaWZpZWQsIG5vbi16ZXJvIGlmIGl0IGlzIG1vZGlmaWVkIG9yIG5ldykuICAqLwotCXN0 YXRpYyBpbnQgZ2V0U3RhdHVzKFZPYmplY3QgKnZldmVudCk7CitjbGFzcyBQaWxvdFJlY29yZDsK K2NsYXNzIFFEYXRlVGltZTsKIAotCS8qKiBBZGQgdGhlIGRhdGUgcHJvcGVydHkgQGFyZyAqcHJv cCB0byB0aGUgdmV2ZW50LiAgVGhpcwotCSAgICAqYWRkcyogdGhlIHByb3BlcnR5IGFzIGEgc3Vi LVZPYmplY3QgdG8gdGhlIGdpdmVuIFZPYmplY3QsCi0JICAgIHNvIHVzZSB0aGlzIHByaW1hcmls eSB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkLiBUaGUKLQkgICAgbWVhbmluZyBvZiBAYXJnIHRy dW5jYXRlVGltZSBpcyBleHBsYWluZWQgYmVsb3cgYXQKLQkgICAgVG1Ub0lTTygpLiAqLwotCXN0 YXRpYyB2b2lkIGFkZERhdGVQcm9wZXJ0eShWT2JqZWN0ICp2ZXZlbnQsCi0JCWNvbnN0IGNoYXIg KnByb3AsCi0JCWNvbnN0IHN0cnVjdCB0bSAqcCwKLQkJYm9vbCB0cnVuY2F0ZVRpbWU9ZmFsc2Up OwotCXN0YXRpYyB2b2lkIGFkZERhdGVQcm9wZXJ0eShWT2JqZWN0ICp2ZXZlbnQsCi0JCWNvbnN0 IGNoYXIgKnByb3AsCi0JCWNvbnN0IFFEYXRlVGltZSYgZHQsCi0JCWJvb2wgdHJ1bmNhdGVUaW1l PWZhbHNlKTsKK3VzaW5nIG5hbWVzcGFjZSBLQ2FsOwogCi0JLyoqIElmIHlvdSBhbHJlYWR5IGhh dmUgYSBkYXRlIHByb3BlcnR5IGFuZCB5b3Ugd2FudCB0byBjaGFuZ2UKLQkgICAgaXQsIHVzZSBz ZXREYXRlUHJvcGVydHkoKS4gIFRoZSBtZWFuaW5nIG9mIEBhcmcKLQkgICAgdHJ1bmNhdGVUaW1l IGlzIGV4cGxhaW5lZCBiZWxvdyBhdCBUbVRvSVNPKCkuICovCi0Jc3RhdGljIHZvaWQgc2V0RGF0 ZVByb3BlcnR5KFZPYmplY3QgKnZldmVudCwKLQkJY29uc3Qgc3RydWN0IHRtICpwLAotCQlib29s IHRydW5jYXRlVGltZT1mYWxzZSk7Ci0Jc3RhdGljIHZvaWQgc2V0RGF0ZVByb3BlcnR5KFZPYmpl Y3QgKnZldmVudCwKLQkJY29uc3QgUURhdGVUaW1lICZkdCwKLQkJYm9vbCB0cnVuY2F0ZVRpbWU9 ZmFsc2UpOworY2xhc3MgVkNhbEJhc2VDb25kdWl0IDogcHVibGljIEJhc2VDb25kdWl0IHsKKyAg cHVibGljOgorICAgIFZDYWxCYXNlQ29uZHVpdChCYXNlQ29uZHVpdDo6ZUNvbmR1aXRNb2RlIG1v ZGUsCisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU291cmNlIHNvdXJjZT1Db25kdWl0U29j a2V0KTsKKyAgICB2aXJ0dWFsIH5WQ2FsQmFzZUNvbmR1aXQoKTsKIAotCS8qKiBHZW5lcmFsIHNl dCBhbmQgcmVzZXQgZnVuY3Rpb24gZm9yIG51bWVyaWMgcHJvcGVydGllcy4gKi8KLQlzdGF0aWMg dm9pZCBzZXROdW1Qcm9wZXJ0eShWT2JqZWN0ICp2ZXZlbnQsCi0JCQkJICAgY29uc3QgY2hhciAq cHJvcGVydHksCi0JCQkJICAgaW50IG51bSk7CisgICAgdmlydHVhbCB2b2lkIGRvU3luYygpID0g MDsKKyAgICB2aXJ0dWFsIHZvaWQgZG9CYWNrdXAoKSA9IDA7CisgICAgdmlydHVhbCBRV2lkZ2V0 ICphYm91dEFuZFNldHVwKCkgPSAwOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZGJJbmZvKCkg PSAwOwogCi0JLyogTW9yZSAqc3RhdGljKiB1dGlsaXR5IGZ1bmN0aW9ucy4gU2V0dGluZyB0cnVu Y2F0ZVRpbWUgdG8KLQkgdHJ1ZSBkaXNjYXJkcyB0aGUgdGltZSBwYXJ0IGFuZCBzZXRzIHRoZSB0 aW1lIGluIHRoZSByZXR1cm5lZAotCSBzdHJpbmcgdG8gIjAwMDAwMCIuIFRoaXMgaW5kaWNhdGVz IGEgZmxvYXRpbmcgZXZlbnQgaW4KLQkgdkNhbC4gKi8KLQlzdGF0aWMgUVN0cmluZyBUbVRvSVNP KGNvbnN0IFFEYXRlVGltZSYsCi0JCWJvb2wgdHJ1bmNhdGVUaW1lPWZhbHNlKTsKLQlzdGF0aWMg UVN0cmluZyBUbVRvSVNPKGNvbnN0IHN0cnVjdCB0bSAqdG0sCi0JCWJvb2wgdHJ1bmNhdGVUaW1l PWZhbHNlKTsKLQlzdGF0aWMgUVN0cmluZyBUbVRvSVNPKGNvbnN0IHN0cnVjdCB0bSAmdG0sCi0J CWJvb2wgdHJ1bmNhdGVUaW1lPWZhbHNlKSB7IHJldHVybiBUbVRvSVNPKCZ0bSx0cnVuY2F0ZVRp bWUpOyB9Ci0Jc3RhdGljIHN0cnVjdCB0bSBJU09Ub1RtKGNvbnN0IFFTdHJpbmcgJnRTdHIsaW50 IHRpbWVab25lKTsKLQlzdGF0aWMgaW50IG51bUZyb21EYXkoY29uc3QgUVN0cmluZyAmZGF5KTsK LQlzdGF0aWMgUURhdGVUaW1lIHRtVG9RRGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtICZ0KSB7Ci0J ICByZXR1cm4gUURhdGVUaW1lKFFEYXRlKDE5MDAgKyB0LnRtX3llYXIsIHQudG1fbW9uICsgMSwK LQkJCQkgdC50bV9tZGF5KSwgCi0JCQkgICBRVGltZSh0LnRtX2hvdXIsIHQudG1fbWluLCB0LnRt X3NlYykpOyB9CisgICAgLyoqCisgICAgICogVGhlcmUgYXJlIGEgd2hvbGUgYnVuY2ggb2YgbWV0 aG9kcyB0aGF0IHNldCBwYXJ0aWN1bGFyCisgICAgICogcHJvcGVydGllcyBvbiBJbmNpZGVuY2Vz LiBQcm9iYWJseSB0aGV5IGRvbid0IGJlbG9uZyBoZXJlCisgICAgICogYnV0IGluIHZlcnNpdC4K KyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXRTdW1tYXJ5KEluY2lkZW5jZSAqdmV2ZW50LGNv bnN0IGNoYXIgKm5vdGUpOworICAgIHN0YXRpYyB2b2lkIHNldE5vdGUoSW5jaWRlbmNlICp2ZXZl bnQsY29uc3QgY2hhciAqbm90ZSk7CisgICAgc3RhdGljIHZvaWQgc2V0U2VjcmV0KEluY2lkZW5j ZSAqdmV2ZW50LGJvb2wgc2VjcmV0KTsKIAorICAgIC8qKiAKKyAgICAgKiBGaW5kIHRoZSBzdW1t YXJ5IHN0cmluZyBvZiB2Y2FsZW5kYXIgZXZlbnQgQGFyZworICAgICAqIHZldmVudC4gUmV0dXJu cyBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZSBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgUVN0 cmluZyBnZXRTdW1tYXJ5KEluY2lkZW5jZSAqdmV2ZW50KTsKIAotCS8vIElubGluZSBub24tc3Rh dGljIG1ldGhvZHMgZm9yIHRoZSBhYm92ZS4KLQlzdHJ1Y3QgdG0gSVNPVG9UbShjb25zdCBRU3Ry aW5nICZ0U3RyKQotCSAgeyByZXR1cm4gSVNPVG9UbSh0U3RyLGZUaW1lWm9uZSk7IH0gOworICAg IC8qKiBGaW5kIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgb2YgdmNhbGVuZGFyIGV2ZW50IEBhcmcK KyAgICAgICAgdmV2ZW50LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBub25lIGZvdW5kLiAq LworICAgIHN0YXRpYyBRU3RyaW5nIGdldERlc2NyaXB0aW9uKEluY2lkZW5jZSAqdmV2ZW50KTsK IAotCS8qKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgS1BpbG90SUQgZmllbGQgb2YgdmNhbGVuZGFy IHJlY29yZAotCSAqIEBhcmcgKnZldmVudC4gUmV0dXJucyAwIGlmIG5vIElEIGZvdW5kLiAqLwot CXN0YXRpYyByZWNvcmRpZF90IGdldFJlY29yZElEKFZPYmplY3QgKnZldmVudCk7CisgICAgLyoq IENoZWNrIEBhcmcgKnZldmVudCBmb3IgS1BpbG90U3RhdHVzIHByb3BlcnR5LiBSZXR1cm5zIDAg b3IKKyAgICAgICAgMSBpZiB0aGUgcHJvcGVydHkgZXhpc3RzLCAyIG90aGVyd2lzZSAoaS5lLiAw IGlmIHRoZSByZWNvcmQKKyAgICAgICAgaXMgdW5tb2RpZmllZCwgbm9uLXplcm8gaWYgaXQgaXMg bW9kaWZpZWQgb3IgbmV3KS4gICovCisgICAgc3RhdGljIGludCBnZXRTdGF0dXMoSW5jaWRlbmNl ICp2ZXZlbnQpOwogCisgICAgUURhdGVUaW1lIHJlYWRUbShjb25zdCBzdHJ1Y3QgdG0gJik7Cisg ICAgc3RydWN0IHRtIHdyaXRlVG0oY29uc3QgUURhdGVUaW1lICYpOwogCi0Jc3RhdGljIGludCBn ZXRDYWxlbmRhclRpbWVab25lKFZPYmplY3QgKnZldmVudCk7Ci0JCi1wcm90ZWN0ZWQ6Ci0JLyoq IENvcHkgdGhlIHZhbHVlIG9mIGEgRGF0ZS9UaW1lIHByb3BlcnR5IG9mIEBhcmcgKnZldmVudCB0 bwotCSAgICBAYXJnICp0LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhl Ci0JICAgIHJlcXVlc3RlZCBwcm9wZXJ0eSB3YXMgbm90IGZvdW5kLiAqLwotCWJvb2wgZ2V0RGF0 ZVByb3BlcnR5KHN0cnVjdCB0bSAqdCwKLQkJCSAgICAgVk9iamVjdCAqdmV2ZW50LAotCQkJICAg ICBjb25zdCBjaGFyICpwcm9wKTsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgc2F2ZVZDYWwoKTsK IAotCVBpbG90UmVjb3JkICpmaW5kRW50cnlJbkRCKHJlY29yZGlkX3QgaWQpOwotCVZPYmplY3Qg KmZpbmRFbnRyeUluQ2FsZW5kYXIocmVjb3JkaWRfdCBpZCwgCi0JCQkJICAgICBjb25zdCBjaGFy ICplbnRyeVR5cGUpOwotCXZvaWQgZGVsZXRlVk9iamVjdChQaWxvdFJlY29yZCAqcmVjLCBjb25z dCBjaGFyICp0eXBlKTsKLQl2b2lkIHNhdmVWQ2FsKCk7CisgICAgLy8gRGVsZXRlcyBhIHJlY29y ZCBmcm9tIHRoZSBkZXNrdG9wIGNhbGVuZGFyCisgICAgdm9pZCBkZWxldGVSZWNvcmQoUGlsb3RS ZWNvcmQgKnJlYyk7CiAJCi0JYm9vbCBnZXRDYWxlbmRhcihjb25zdCBRU3RyaW5nJiBncm91cCk7 Ci0Jdm9pZCBub0NhbGVuZGFyRXJyb3IoY29uc3QgUVN0cmluZyYgY29uZHVpdE5hbWUpOworICAg IGJvb2wgZ2V0Q2FsZW5kYXIoY29uc3QgUVN0cmluZyYgZ3JvdXApOworICAgIHZvaWQgbm9DYWxl bmRhckVycm9yKGNvbnN0IFFTdHJpbmcmIGNvbmR1aXROYW1lKTsKIAkKLQkvKioKLQkqIFJldHJp ZXZlIHRoZSB0aW1lIHpvbmUgc2V0IGluIHRoZSB2Y2FsIGZpbGUuCi0JKiBSZXR1cm5zIG51bWJl ciBvZiBtaW51dGVzIHJlbGF0aXZlIHRvIFVUQy4KLQkqLwotCWludCBnZXRUaW1lWm9uZSgpIGNv bnN0OwotCWJvb2wgZmlyc3RUaW1lKCkgY29uc3QgeyByZXR1cm4gZkZpcnN0VGltZTsgfSA7Cisg ICAgYm9vbCBmaXJzdFRpbWUoKSBjb25zdCB7IHJldHVybiBmRmlyc3RUaW1lOyB9IDsKIAotCS8q KiBUaW1lIHpvbmUgb2Zmc2V0IHRvIEdNVCBpbiBtaW51dGVzLiBTZXQgYnkKLQkgICAgZ2V0Q2Fs ZW5kYXIoKS4gKi8KLQlpbnQgZlRpbWVab25lOwotCVFTdHJpbmcgY2FsTmFtZTsKKyAgICAvKiog VGltZSB6b25lIG9mZnNldCB0byBHTVQgaW4gbWludXRlcy4gU2V0IGJ5CisgICAgICAgIGdldENh bGVuZGFyKCkuICovCisgICAgaW50IGZUaW1lWm9uZTsKKyAgICAKKyAgICBRU3RyaW5nIGNhbE5h bWU7CiAKLQlWT2JqZWN0ICpjYWxlbmRhcigpIHsgcmV0dXJuIGZDYWxlbmRhcjsgfSA7CisgICAg Q2FsZW5kYXIgKmNhbGVuZGFyKCkgeyByZXR1cm4gZkNhbGVuZGFyOyB9CiAKLQkvKiogRGVsZXRl IGFsbCByZWNvcmRzIGZyb20gdGhlIHBpbG90IHRoYXQgYXJlIG5vdCBpbiB0aGUKLQkgICAgdmNh bGVuZGFyLiBNZWFudCB0byBiZSBydW4gYXQgdGhlIGVuZCBvZiBhIGhvdC1zeW5jLCBhZnRlciAK LQkgICAgYWxsIG5ldyByZWNvcmRzIGZyb20gYm90aCBzaWRlcyBoYXZlIGJlZW4gaW5zZXJ0ZWQg b24gdGhlCi0JICAgIG90aGVyLiBAYXJnIGVudHJ5VHlwZSBzaG91bGQgYmUgVkNUb2RvUHJvcCBv cgotCSAgICBWQ0V2ZW50UHJvcC4gKi8KLQl2b2lkIGRlbGV0ZUZyb21QaWxvdChjb25zdCBjaGFy ICplbnRyeVR5cGUpOworICAgIGVudW0geyBUeXBlVG9kbywgVHlwZUV2ZW50IH07CisgICAgLyoq IERlbGV0ZSBhbGwgcmVjb3JkcyBmcm9tIHRoZSBwaWxvdCB0aGF0IGFyZSBub3QgaW4gdGhlCisg ICAgICAgIHZjYWxlbmRhci4gTWVhbnQgdG8gYmUgcnVuIGF0IHRoZSBlbmQgb2YgYSBob3Qtc3lu YywgYWZ0ZXIgCisgICAgICAgIGFsbCBuZXcgcmVjb3JkcyBmcm9tIGJvdGggc2lkZXMgaGF2ZSBi ZWVuIGluc2VydGVkIG9uIHRoZQorICAgICAgICBvdGhlci4gQGFyZyBlbnRyeVR5cGUgc2hvdWxk IGJlIFR5cGVUb2RvIG9yIFR5cGVFdmVudCAqLworICAgIHZvaWQgZGVsZXRlRnJvbVBpbG90KGlu dCk7CiAKLXByaXZhdGU6Ci0JVk9iamVjdCAqZkNhbGVuZGFyOwotCWJvb2wgZkZpcnN0VGltZTsK LX0gOwkKKyAgICBUb2RvICpmaW5kVG9kbyhyZWNvcmRpZF90IGlkKTsKKyAgICBFdmVudCAqZmlu ZEV2ZW50KHJlY29yZGlkX3QgaWQpOwogCi0jZWxzZQotI3dhcm5pbmcgIkZpbGUgZG91Ymx5IGlu Y2x1ZGVkLiIKKyAgcHJpdmF0ZToKKyAgICBDYWxlbmRhciAqZkNhbGVuZGFyOworICAgIGJvb2wg ZkZpcnN0VGltZTsKK307CisKICNlbmRpZgpJbmRleDoga3BpbG90L2NvbmR1aXRBcHAuY2MKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZXBpbS9rcGlsb3Qva3BpbG90L2NvbmR1aXRB cHAuY2MsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjgKZGlmZiAtdSAtMyAtZCAtcCAtcjEuMjgg Y29uZHVpdEFwcC5jYwotLS0ga3BpbG90L2NvbmR1aXRBcHAuY2MJMjAwMS8wNS8yNSAxNjowNjo1 MgkxLjI4CisrKyBrcGlsb3QvY29uZHVpdEFwcC5jYwkyMDAxLzA2LzE3IDIyOjAzOjIzCkBAIC0z NTcsNyArMzU3LDcgQEAgaW50IENvbmR1aXRBcHA6OmV4ZWMoYm9vbCB3aXRoRENPUCxib29sIAog CXN3aXRjaChmTW9kZSkKIAl7CiAJY2FzZSBCYXNlQ29uZHVpdDo6REJJbmZvIDogCi0JCWNvdXQg PDwgZkNvbmR1aXQtPmRiSW5mbygpOyAKKwkJY291dCA8PCBmQ29uZHVpdC0+ZGJJbmZvKCkgPDwg ZW5kbDsgCiAJCWtlZXBSdW5uaW5nPWZhbHNlOwogCQlicmVhazsKIAljYXNlIEJhc2VDb25kdWl0 OjpTZXR1cCA6Cg== --------------Boundary-00=_C4I3G05TI9K9YUDUYP0F--