LyoKICogQXV0aG9yczoKICogQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkgUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2U+CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHkgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIEFsZXhleSBLdXpuZXRzb3YgIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KICogQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqIEplbnMgTOXlcyA8amVucy5sYWFzQGRhdGEuc2x1LnNlPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKgogKiBBIHRvb2wgZm9yIGxvYWRpbmcgdGhlIG5ldHdvcmsgd2l0aCBwcmVjb25maWd1cmF0ZWQgcGFja2V0cy4KICogVGhlIHRvb2wgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaW51eCBtb2R1bGUuICBQYXJhbWV0ZXJzIGFyZSBvdXRwdXQgCiAqIGRldmljZSwgZGVsYXkgKHRvIGhhcmRfeG1pdCksIG51bWJlciBvZiBwYWNrZXRzLCBhbmQgd2hldGhlcgogKiB0byB1c2UgbXVsdGlwbGUgU0tCcyBvciBqdXN0IHRoZSBzYW1lIG9uZS4KICogcGt0Z2VuIHVzZXMgdGhlIGluc3RhbGxlZCBpbnRlcmZhY2UncyBvdXRwdXQgcm91dGluZS4KICoKICogQWRkaXRpb25hbCBoYWNraW5nIGJ5OgogKgogKiBKZW5zLkxhYXNAZGF0YS5zbHUuc2UKICogSW1wcm92ZWQgYnkgQU5LLiAwMTAxMjAuCiAqIEltcHJvdmVkIGJ5IEFOSyBldmVuIG1vcmUuIDAxMDIxMi4KICogTUFDIGFkZHJlc3MgdHlwbyBmaXhlZC4gMDEwNDE3IC0tcm8KICogSW50ZWdyYXRlZC4gIDAyMDMwMSAtLURhdmVNCiAqIEFkZGVkIG11bHRpc2tiIG9wdGlvbiAwMjAzMDEgLS1EYXZlTQogKiBTY2FsaW5nIG9mIHJlc3VsdHMuIDAyMDQxNy0tc2lndXJkdXJAbGlucHJvLm5vCiAqIFNpZ25pZmljYW50IHJlLXdvcmsgb2YgdGhlIG1vZHVsZToKICogICAqICBDb252ZXJ0IHRvIHRocmVhZGVkIG1vZGVsIHRvIG1vcmUgZWZmaWNpZW50bHkgYmUgYWJsZSB0byB0cmFuc21pdAogKiAgICAgICBhbmQgcmVjZWl2ZSBvbiBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IG9uY2UuCiAqICAgKiAgQ29udmVydGVkIG1hbnkgY291bnRlcnMgdG8gX191NjQgdG8gYWxsb3cgbG9uZ2VyIHJ1bnMuCiAqICAgKiAgQWxsb3cgY29uZmlndXJhdGlvbiBvZiByYW5nZXMsIGxpa2UgbWluL21heCBJUCBhZGRyZXNzLCBNQUNzLAogKiAgICAgICBhbmQgVURQLXBvcnRzLCBmb3IgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBhbmQgY2FuCiAqICAgICAgIHNldCB0byB1c2UgYSByYW5kb20gZGlzdHJpYnV0aW9uIG9yIHNlcXVlbnRpYWxseSB3YWxrIHRoZSByYW5nZS4KICogICAqICBDYW4gbm93IGNoYW5nZSBtb3N0IHZhbHVlcyBhZnRlciBzdGFydGluZy4KICogICAqICBQbGFjZSAxMi1ieXRlIHBhY2tldCBpbiBVRFAgcGF5bG9hZCB3aXRoIG1hZ2ljIG51bWJlciwKICogICAgICAgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wLgogKiAgICogIEFkZCByZWNlaXZlciBjb2RlIHRoYXQgZGV0ZWN0cyBkcm9wcGVkIHBrdHMsIHJlLW9yZGVyZWQgcGt0cywgYW5kCiAqICAgICAgIGxhdGVuY2llcyAod2l0aCBtaWNyby1zZWNvbmQpIHByZWNpc2lvbi4KICogICAqICBBZGQgSU9DVEwgaW50ZXJmYWNlIHRvIGVhc2lseSBnZXQgY291bnRlcnMgJiBjb25maWd1cmF0aW9uLgogKiAgIC0tQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqCiAqIFJlbmFtZWQgbXVsdGlza2IgdG8gY2xvbmVfc2tiIGFuZCBjbGVhbmVkIHVwIHNlbmRpbmcgY29yZSBmb3IgdHdvIGRpc3RpbmN0IAogKiBza2IgbW9kZXMuIEEgY2xvbmVfc2tiPTAgbW9kZSBmb3IgQmVuICJyYW5nZXMiIHdvcmsgYW5kIGEgY2xvbmVfc2tiICE9IDAgCiAqIGFzIGEgImZhc3RwYXRoIiB3aXRoIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjbG9uZXMgYWZ0ZXIgYWxsb2Mncy4KICogY2xvbmVfc2tiPTAgbWVhbnMgYWxsIHBhY2tldHMgYXJlIGFsbG9jYXRlZCB0aGlzIGFsc28gbWVhbnMgcmFuZ2VzIHRpbWUgCiAqIHN0YW1wcyBldGMgY2FuIGJlIHVzZWQuIGNsb25lX3NrYj0xMDAgbWVhbnMgMSBtYWxsb2MgaXMgZm9sbG93ZWQgYnkgMTAwIAogKiBjbG9uZXMuCiAqCiAqIEFsc28gbW92ZWQgdG8gL3Byb2MvbmV0L3BrdGdlbi8gCiAqIC0tcm8KICoKICogU2VwdCAxMDogIEZpeGVkIHRocmVhZGluZy9sb2NraW5nLiAgTG90cyBvZiBib25lLWhlYWRlZCBhbmQgbW9yZSBjbGV2ZXIKICogICAgbWlzdGFrZXMuICBBbHNvIG1lcmdlZCBpbiBEYXZlTSdzIHBhdGNoIGluIHRoZSAtcHJlNiBwYXRjaC4KICogLS1CZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KICoKICogSW50ZWdyYXRlZCB0byAyLjUueCAwMjEwMjkgLS1MdWNpbyBNYWNpZWwgKGx1Y2lvbWFjaWVsQHppcG1haWwuY29tLmJyKQogKgogKiAKICogMDIxMTI0IEZpbmlzaGVkIG1ham9yIHJlZGVzaWduIGFuZCByZXdyaXRlIGZvciBuZXcgZnVuY3Rpb25hbGl0eS4KICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGZvciBob3cgdG8gdXNlIHRoaXMuCiAqCiAqIFRoZSBuZXcgb3BlcmF0aW9uOgogKiBGb3IgZWFjaCBDUFUgb25lIHRocmVhZC9wcm9jZXNzIGlzIGNyZWF0ZWQgYXQgc3RhcnQuIFRoaXMgcHJvY2VzcyBjaGVja3MgCiAqIGZvciBydW5uaW5nIGRldmljZXMgaW4gdGhlIGlmX2xpc3QgYW5kIHNlbmRzIHBhY2tldHMgdW50aWwgY291bnQgaXMgMCBpdCAKICogYWxzbyB0aGUgdGhyZWFkIGNoZWNrcyB0aGUgdGhyZWFkLT5jb250cm9sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyLXByb2Nlc3MgCiAqIGNvbW11bmljYXRpb24uIGNvbnRyb2xsaW5nIHByb2Nlc3MgInBvc3RzIiBvcGVyYXRpb25zIHRvIHRoZSB0aHJlYWRzIHRoaXMgCiAqIHdheS4gVGhlIGlmX2xvY2sgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlbW92ZSB3aGVuIGFkZC9yZW1fZGV2aWNlIGlzIG1lcmdlZAogKiBpbnRvIHRoaXMgdG9vLgogKgogKiBCeSBkZXNpZ24gdGhlcmUgc2hvdWxkIG9ubHkgYmUgKm9uZSogImNvbnRyb2xsaW5nIiBwcm9jZXNzLiBJbiBwcmFjdGljZSAKICogbXVsdGlwbGUgd3JpdGUgYWNjZXNzZXMgZ2l2ZXMgdW5wcmVkaWN0YWJsZSByZXN1bHQuIFVuZGVyc3Rvb2QgYnkgIndyaXRlIiAKICogdG8gL3Byb2MgZ2l2ZXMgcmVzdWx0IGNvZGUgdGhhdHMgc2hvdWxkIGJlIHJlYWQgYmUgdGhlICJ3cml0ZXIiLgogKiBGb3IgcHJhdGljYWwgdXNlIHRoaXMgc2hvdWxkIGJlIG5vIHByb2JsZW0uCiAqCiAqIE5vdGUgd2hlbiBhZGRpbmcgZGV2aWNlcyB0byBhIHNwZWNpZmljIENQVSB0aGVyZSBnb29kIGlkZWEgdG8gYWxzbyBhc3NpZ24gCiAqIC9wcm9jL2lycS9YWC9zbXBfYWZmaW5pdHkgc28gVFgtaW50ZXJydXB0cyBnZXRzIGJvdW5kIHRvIHRoZSBzYW1lIENQVS4gCiAqIC0tcm8KICoKICogRml4IHJlZmNvdW50IG9mZiBieSBvbmUgaWYgZmlyc3QgcGFja2V0IGZhaWxzLCBwb3RlbnRpYWwgbnVsbCBkZXJlZiwgCiAqIG1lbWxlYWsgMDMwNzEwLSBLSlAKICoKICogRmlyc3QgInJhbmdlcyIgZnVuY3Rpb25hbGl0eSBmb3IgaXB2NiAwMzA3MjYgLS1ybwogKgogKiBJbmNsdWRlZCBmbG93IHN1cHBvcnQuIDAzMDgwMiBBTksuCiAqCiAqIEZpeGVkIHVuYWxpZ25lZCBhY2Nlc3Mgb24gSUEtNjQgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CiAqIAogKiBSZW1vdmUgaWYgZml4IGZyb20gYWRkZWQgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+IDA0MDQxOQogKiBpYTY0IGNvbXBpbGF0aW9uIGZpeCBmcm9tICBBcm9uIEdyaWZmaXMgPGFyb25AaHAuY29tPiAwNDA2MDQKICoKICogTmV3IHhtaXQoKSByZXR1cm4sIGRvX2RpdiBhbmQgbWlzYyBjbGVhbiB1cCBieSBTdGVwaGVuIEhlbW1pbmdlciAKICogPHNoZW1taW5nZXJAb3NkbC5vcmc+IDA0MDkyMwogKgogKiBSYW55IER1bmxhcCBmaXhlZCB1NjQgcHJpbnRrIGNvbXBpbGVyIHdhcmluZyAKICoKICogUmVtb3ZlIEZDUyBmcm9tIEJXIGNhbGN1bGF0aW9uLiAgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+CiAqIE5ldyB0aW1lIGhhbmRsaW5nLiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gMDQxMjEzCiAqCiAqIENvcnJlY3Rpb25zIGZyb20gTmlrb2xhaSBNYWx5a2ggKG5tYWx5a2hAYmlsaW0uY29tKSAKICogUmVtb3ZlZCB1bnVzZWQgZmxhZ3MgRl9TRVRfU1JDTUFDICYgRl9TRVRfU1JDSVAgMDQxMjMwCiAqCiAqIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgpIHJlcGxhY2VkIE5pc2hhbnRoIEFyYXZhbXVkYW4gPG5hY2NAdXMuaWJtLmNvbT4gCiAqIDA1MDEwMwogKi8KI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiNpbmNsdWRlIDxsaW51eC91ZHAuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgojaW5jbHVkZSA8bmV0L2lwdjYuaD4KI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgojaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPiAvKiBkb19kaXYgKi8KI2luY2x1ZGUgPGFzbS90aW1leC5oPgoKCiNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MTogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCgovKiAjZGVmaW5lIFBHX0RFQlVHKGEpIGEgKi8KI2RlZmluZSBQR19ERUJVRyhhKSAKCi8qIFRoZSBidWNrZXRzIGFyZSBleHBvbmVudGlhbCBpbiAnd2lkdGgnICovCiNkZWZpbmUgTEFUX0JVQ0tFVFNfTUFYIDMyCiNkZWZpbmUgSVBfTkFNRV9TWiAzMgoKLyogRGV2aWNlIGZsYWcgYml0cyAqLwojZGVmaW5lIEZfSVBTUkNfUk5EICAgKDE8PDApICAvKiBJUC1TcmMgUmFuZG9tICAqLwojZGVmaW5lIEZfSVBEU1RfUk5EICAgKDE8PDEpICAvKiBJUC1Ec3QgUmFuZG9tICAqLwojZGVmaW5lIEZfVURQU1JDX1JORCAgKDE8PDIpICAvKiBVRFAtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfVURQRFNUX1JORCAgKDE8PDMpICAvKiBVRFAtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDU1JDX1JORCAgKDE8PDQpICAvKiBNQUMtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDRFNUX1JORCAgKDE8PDUpICAvKiBNQUMtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfVFhTSVpFX1JORCAgKDE8PDYpICAvKiBUcmFuc21pdCBzaXplIGlzIHJhbmRvbSAqLwojZGVmaW5lIEZfSVBWNiAgICAgICAgKDE8PDcpICAvKiBJbnRlcmZhY2UgaW4gSVBWNiBNb2RlICovCgovKiBUaHJlYWQgY29udHJvbCBmbGFnIGJpdHMgKi8KI2RlZmluZSBUX1RFUk1JTkFURSAgICgxPDwwKSAgCiNkZWZpbmUgVF9TVE9QICAgICAgICAoMTw8MSkgIC8qIFN0b3AgcnVuICovCiNkZWZpbmUgVF9SVU4gICAgICAgICAoMTw8MikgIC8qIFN0YXJ0IHJ1biAqLwojZGVmaW5lIFRfUkVNREVWICAgICAgKDE8PDMpICAvKiBSZW1vdmUgYWxsIGRldnMgKi8KCi8qIExvY2tzICovCiNkZWZpbmUgICB0aHJlYWRfbG9jaygpICAgICAgICBzcGluX2xvY2soJl90aHJlYWRfbG9jaykKI2RlZmluZSAgIHRocmVhZF91bmxvY2soKSAgICAgIHNwaW5fdW5sb2NrKCZfdGhyZWFkX2xvY2spCgovKiBJZiBsb2NrIC0tIGNhbiBiZSByZW1vdmVkIGFmdGVyIHNvbWUgd29yayAqLwojZGVmaW5lICAgaWZfbG9jayh0KSAgICAgICAgICAgc3Bpbl9sb2NrKCYodC0+aWZfbG9jaykpOwojZGVmaW5lICAgaWZfdW5sb2NrKHQpICAgICAgICAgICBzcGluX3VubG9jaygmKHQtPmlmX2xvY2spKTsKCi8qIFVzZWQgdG8gaGVscCB3aXRoIGRldGVybWluaW5nIHRoZSBwa3RzIG9uIHJlY2VpdmUgKi8KI2RlZmluZSBQS1RHRU5fTUFHSUMgMHhiZTliZTk1NQojZGVmaW5lIFBHX1BST0NfRElSICJwa3RnZW4iCgojZGVmaW5lIE1BWF9DRkxPV1MgIDY1NTM2CgpzdHJ1Y3QgZmxvd19zdGF0ZQp7CglfX3UzMgkJY3VyX2RhZGRyOwoJaW50CQljb3VudDsKfTsKCnN0cnVjdCBwa3RnZW5fZGV2IHsKCgkvKgoJICogVHJ5IHRvIGtlZXAgZnJlcXVlbnQvaW5mcmVxdWVudCB1c2VkIHZhcnMuIHNlcGFyYXRlZC4KCSAqLwoKICAgICAgICBjaGFyIGlmbmFtZVszMl07CiAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudDsKICAgICAgICBjaGFyIHJlc3VsdFs1MTJdOwogICAgICAgIC8qIHByb2MgZmlsZSBuYW1lcyAqLwogICAgICAgIGNoYXIgZm5hbWVbODBdOwoKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogcGdfdGhyZWFkOyAvKiB0aGUgb3duZXIgKi8KICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dDsgLyogVXNlZCBmb3IgY2hhaW5pbmcgaW4gdGhlIHRocmVhZCdzIHJ1bi1xdWV1ZSAqLwoKICAgICAgICBpbnQgcnVubmluZzsgIC8qIGlmIHRoaXMgY2hhbmdlcyB0byBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBzdG9wICovCiAgICAgICAgCiAgICAgICAgLyogSWYgbWluICE9IG1heCwgdGhlbiB3ZSB3aWxsIGVpdGhlciBkbyBhIGxpbmVhciBpdGVyYXRpb24sIG9yCiAgICAgICAgICogd2Ugd2lsbCBkbyBhIHJhbmRvbSBzZWxlY3Rpb24gZnJvbSB3aXRoaW4gdGhlIHJhbmdlLgogICAgICAgICAqLwogICAgICAgIF9fdTMyIGZsYWdzOyAgICAgCgogICAgICAgIGludCBtaW5fcGt0X3NpemU7ICAgIC8qID0gRVRIX1pMRU47ICovCiAgICAgICAgaW50IG1heF9wa3Rfc2l6ZTsgICAgLyogPSBFVEhfWkxFTjsgKi8KICAgICAgICBpbnQgbmZyYWdzOwogICAgICAgIF9fdTMyIGRlbGF5X3VzOyAgICAvKiBEZWZhdWx0IGRlbGF5ICovCiAgICAgICAgX191MzIgZGVsYXlfbnM7CiAgICAgICAgX191NjQgY291bnQ7ICAvKiBEZWZhdWx0IE5vIHBhY2tldHMgdG8gc2VuZCAqLwogICAgICAgIF9fdTY0IHNvZmFyOyAgLyogSG93IG1hbnkgcGt0cyB3ZSd2ZSBzZW50IHNvIGZhciAqLwogICAgICAgIF9fdTY0IHR4X2J5dGVzOyAvKiBIb3cgbWFueSBieXRlcyB3ZSd2ZSB0cmFuc21pdHRlZCAqLwogICAgICAgIF9fdTY0IGVycm9yczsgICAgLyogRXJyb3JzIHdoZW4gdHJ5aW5nIHRvIHRyYW5zbWl0LCBwa3RzIHdpbGwgYmUgcmUtc2VudCAqLwoKICAgICAgICAvKiBydW50aW1lIGNvdW50ZXJzIHJlbGF0aW5nIHRvIGNsb25lX3NrYiAqLwogICAgICAgIF9fdTY0IG5leHRfdHhfdXM7ICAgICAgICAgIC8qIHRpbWVzdGFtcCBvZiB3aGVuIHRvIHR4IG5leHQgKi8KICAgICAgICBfX3UzMiBuZXh0X3R4X25zOwogICAgICAgIAogICAgICAgIF9fdTY0IGFsbG9jYXRlZF9za2JzOwogICAgICAgIF9fdTMyIGNsb25lX2NvdW50OwoJaW50IGxhc3Rfb2s7ICAgICAgICAgICAvKiBXYXMgbGFzdCBza2Igc2VudD8gCgkgICAgICAgICAgICAgICAgICAgICAgICAqIE9yIGEgZmFpbGVkIHRyYW5zbWl0IG9mIHNvbWUgc29ydD8gIFRoaXMgd2lsbCBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXF1ZW5jZSBudW1iZXJzIGluIG9yZGVyLCBmb3IgZXhhbXBsZS4KCQkJCSovCiAgICAgICAgX191NjQgc3RhcnRlZF9hdDsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTY0IHN0b3BwZWRfYXQ7IC8qIG1pY3JvLXNlY29uZHMgKi8KICAgICAgICBfX3U2NCBpZGxlX2FjYzsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTMyIHNlcV9udW07CiAgICAgICAgCiAgICAgICAgaW50IGNsb25lX3NrYjsgLyogVXNlIG11bHRpcGxlIFNLQnMgZHVyaW5nIHBhY2tldCBnZW4uICBJZiB0aGlzIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhhdCBtYW55IGNvcHBpZXMgb2YgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldCB3aWxsIGJlIHNlbnQgYmVmb3JlIGEgbmV3IHBhY2tldCBpcyBhbGxvY2F0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSB3YW50IHRvIHNlbmQgMTAyNCBpZGVudGljYWwgcGFja2V0cwogICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIGNyZWF0aW5nIGEgbmV3IHBhY2tldCwgc2V0IGNsb25lX3NrYiB0byAxMDI0LgogICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgCiAgICAgICAgY2hhciBkc3RfbWluW0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwogICAgICAgIGNoYXIgZHN0X21heFtJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KICAgICAgICBjaGFyIHNyY19taW5bSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCiAgICAgICAgY2hhciBzcmNfbWF4W0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwoKCXN0cnVjdCBpbjZfYWRkciAgaW42X3NhZGRyOwoJc3RydWN0IGluNl9hZGRyICBpbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIGN1cl9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIGN1cl9pbjZfc2FkZHI7CgkvKiBGb3IgcmFuZ2VzICovCglzdHJ1Y3QgaW42X2FkZHIgIG1pbl9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1heF9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1pbl9pbjZfc2FkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1heF9pbjZfc2FkZHI7CgogICAgICAgIC8qIElmIHdlJ3JlIGRvaW5nIHJhbmdlcywgcmFuZG9tIG9yIGluY3JlbWVudGFsLCB0aGVuIHRoaXMKICAgICAgICAgKiBkZWZpbmVzIHRoZSBtaW4vbWF4IGZvciB0aG9zZSByYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgX191MzIgc2FkZHJfbWluOyAvKiBpbmNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCiAgICAgICAgX191MzIgc2FkZHJfbWF4OyAvKiBleGNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCiAgICAgICAgX191MzIgZGFkZHJfbWluOyAvKiBpbmNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLwogICAgICAgIF9fdTMyIGRhZGRyX21heDsgLyogZXhjbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KCiAgICAgICAgX191MTYgdWRwX3NyY19taW47IC8qIGluY2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCiAgICAgICAgX191MTYgdWRwX3NyY19tYXg7IC8qIGV4Y2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCiAgICAgICAgX191MTYgdWRwX2RzdF9taW47IC8qIGluY2x1c2l2ZSwgZGVzdCBVRFAgcG9ydCAqLwogICAgICAgIF9fdTE2IHVkcF9kc3RfbWF4OyAvKiBleGNsdXNpdmUsIGRlc3QgVURQIHBvcnQgKi8KCiAgICAgICAgX191MzIgc3JjX21hY19jb3VudDsgLyogSG93IG1hbnkgTUFDcyB0byBpdGVyYXRlIHRocm91Z2ggKi8KICAgICAgICBfX3UzMiBkc3RfbWFjX2NvdW50OyAvKiBIb3cgbWFueSBNQUNzIHRvIGl0ZXJhdGUgdGhyb3VnaCAqLwogICAgICAgIAogICAgICAgIHVuc2lnbmVkIGNoYXIgZHN0X21hY1s2XTsKICAgICAgICB1bnNpZ25lZCBjaGFyIHNyY19tYWNbNl07CiAgICAgICAgCiAgICAgICAgX191MzIgY3VyX2RzdF9tYWNfb2Zmc2V0OwogICAgICAgIF9fdTMyIGN1cl9zcmNfbWFjX29mZnNldDsKICAgICAgICBfX3UzMiBjdXJfc2FkZHI7CiAgICAgICAgX191MzIgY3VyX2RhZGRyOwogICAgICAgIF9fdTE2IGN1cl91ZHBfZHN0OwogICAgICAgIF9fdTE2IGN1cl91ZHBfc3JjOwogICAgICAgIF9fdTMyIGN1cl9wa3Rfc2l6ZTsKICAgICAgICAKICAgICAgICBfX3U4IGhoWzE0XTsKICAgICAgICAvKiA9IHsgCiAgICAgICAgICAgMHgwMCwgMHg4MCwgMHhDOCwgMHg3OSwgMHhCMywgMHhDQiwgCiAgICAgICAgICAgCiAgICAgICAgICAgV2UgZmlsbCBpbiBTUkMgYWRkcmVzcyBsYXRlcgogICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAgICAgMHgwOCwgMHgwMAogICAgICAgICAgIH07CiAgICAgICAgKi8KICAgICAgICBfX3UxNiBwYWQ7IC8qIHBhZCBvdXQgdGhlIGhoIHN0cnVjdCB0byBhbiBldmVuIDE2IGJ5dGVzICovCgogICAgICAgIHN0cnVjdCBza19idWZmKiBza2I7IC8qIHNrYiB3ZSBhcmUgdG8gdHJhbnNtaXQgbmV4dCwgbWFpbmx5IHVzZWQgZm9yIHdoZW4gd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgdHJhbnNtaXR0aW5nIHRoZSBzYW1lIG9uZSBtdWx0aXBsZSB0aW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBvZGV2OyAvKiBUaGUgb3V0LWdvaW5nIGRldmljZS4gIE5vdGUgdGhhdCB0aGUgZGV2aWNlIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIGl0J3MgcGdfaW5mbyBwb2ludGVyIHBvaW50aW5nIGJhY2sgdG8gdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXZpY2UuICBUaGlzIHdpbGwgYmUgc2V0IHdoZW4gdGhlIHVzZXIgc3BlY2lmaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBvdXQtZ29pbmcgZGV2aWNlIG5hbWUgKG5vdCB3aGVuIHRoZSBpbmplY3QgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnRlZCBhcyBpdCB1c2VkIHRvIGRvLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglzdHJ1Y3QgZmxvd19zdGF0ZSAqZmxvd3M7Cgl1bnNpZ25lZCBjZmxvd3M7ICAgICAgICAgLyogQ29uY3VycmVudCBmbG93cyAoY29uZmlnKSAqLwoJdW5zaWduZWQgbGZsb3c7ICAgICAgICAgIC8qIEZsb3cgbGVuZ3RoICAoY29uZmlnKSAqLwoJdW5zaWduZWQgbmZsb3dzOyAgICAgICAgIC8qIGFjY3VtdWxhdGVkIGZsb3dzIChzdGF0cykgKi8KfTsKCnN0cnVjdCBwa3RnZW5faGRyIHsKICAgICAgICBfX3UzMiBwZ2hfbWFnaWM7CiAgICAgICAgX191MzIgc2VxX251bTsKCV9fdTMyIHR2X3NlYzsKCV9fdTMyIHR2X3VzZWM7Cn07CgpzdHJ1Y3QgcGt0Z2VuX3RocmVhZCB7CiAgICAgICAgc3BpbmxvY2tfdCBpZl9sb2NrOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICppZl9saXN0OyAgICAgICAgICAgLyogQWxsIGRldmljZSBoZXJlICovCiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQqIG5leHQ7CiAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICBjaGFyIGZuYW1lWzEyOF07IC8qIG5hbWUgb2YgcHJvYyBmaWxlICovCiAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudDsKICAgICAgICBjaGFyIHJlc3VsdFs1MTJdOwogICAgICAgIHUzMiBtYXhfYmVmb3JlX3NvZnRpcnE7IC8qIFdlJ2xsIGNhbGwgZG9fc29mdGlycSB0byBwcmV2ZW50IHN0YXJ2YXRpb24uICovCiAgICAgICAgCgkvKiBGaWVsZCBmb3IgdGhyZWFkIHRvIHJlY2VpdmUgInBvc3RlZCIgZXZlbnRzIHRlcm1pbmF0ZSwgc3RvcCBpZnMgZXRjLiovCgogICAgICAgIHUzMiBjb250cm9sOwoJaW50IHBpZDsKCWludCBjcHU7CgogICAgICAgIHdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwp9OwoKI2RlZmluZSBSRU1PVkUgMQojZGVmaW5lIEZJTkQgICAwCgovKiAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCB0aGUgZmFjdCB0aGF0IGRvX2RpdiBjYW5ub3QgaGFuZGxlIHR3byA2NC1iaXQKICAgIG51bWJlcnMsIGFuZCByZWd1bGFyIDY0LWJpdCBkaXZpc2lvbiBkb2Vzbid0IHdvcmsgb24geDg2IGtlcm5lbHMuCiAgICAtLUJlbgoqLwoKI2RlZmluZSBQR19ESVYgMAoKLyogVGhpcyB3YXMgZW1haWxlZCB0byBMTUtMIGJ5OiBDaHJpcyBDYXB1dG8gPGNjYXB1dG9AYWx0Lm5ldD4KICogRnVuY3Rpb24gY29waWVkL2FkYXB0ZWQvb3B0aW1pemVkIGZyb206CiAqCiAqICBuZW1lc2lzLnNvdXJjZWZvcmdlLm5ldC9icm93c2UvbGliL3N0YXRpYy9pbnRtYXRoL2l4ODYvaW50bWF0aC5jLmh0bWwKICoKICogQ29weXJpZ2h0IDE5OTQsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIENvbXB1dGVyIExhYm9yYXRvcnkKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICovCmlubGluZSBzdGF0aWMgczY0IGRpdnJlbWRpMyhzNjQgeCwgczY0IHksIGludCB0eXBlKSAKewogICAgICAgIHU2NCBhID0gKHggPCAwKSA/IC14IDogeDsKICAgICAgICB1NjQgYiA9ICh5IDwgMCkgPyAteSA6IHk7CiAgICAgICAgdTY0IHJlcyA9IDAsIGQgPSAxOwoKICAgICAgICBpZiAoYiA+IDApIHsKICAgICAgICAgICAgICAgIHdoaWxlIChiIDwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBiIDw8PSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkIDw8PSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAoIGEgPj0gYiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSAtPSBiOwogICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGIgPj49IDE7CiAgICAgICAgICAgICAgICBkID4+PSAxOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZCk7CgogICAgICAgIGlmIChQR19ESVYgPT0gdHlwZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICgoKHggXiB5KSAmICgxbGw8PDYzKSkgPT0gMCkgPyByZXMgOiAtKHM2NClyZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICgoeCAmICgxbGw8PDYzKSkgPT0gMCkgPyBhIDogLShzNjQpYTsKICAgICAgICB9Cn0KCi8qIEVuZCBvZiBoYWNrcyB0byBkZWFsIHdpdGggNjQtYml0IG1hdGggb24geDg2ICovCgovKiogQ29udmVydCB0byBtaWxpc2Vjb25kcyAqLwpzdGF0aWMgaW5saW5lIF9fdTY0IHR2X3RvX21zKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0dikgCnsKICAgICAgICBfX3U2NCBtcyA9IHR2LT50dl91c2VjIC8gMTAwMDsKICAgICAgICBtcyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwOwogICAgICAgIHJldHVybiBtczsKfQoKCi8qKiBDb252ZXJ0IHRvIG1pY3JvLXNlY29uZHMgKi8Kc3RhdGljIGlubGluZSBfX3U2NCB0dl90b191cyhjb25zdCBzdHJ1Y3QgdGltZXZhbCogdHYpIAp7CiAgICAgICAgX191NjQgdXMgPSB0di0+dHZfdXNlYzsKICAgICAgICB1cyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwMDAwOwogICAgICAgIHJldHVybiB1czsKfQoKc3RhdGljIGlubGluZSBfX3U2NCBwZ19kaXYoX191NjQgbiwgX191MzIgYmFzZSkgewogICAgICAgIF9fdTY0IHRtcCA9IG47CiAgICAgICAgZG9fZGl2KHRtcCwgYmFzZSk7CiAgICAgICAgLyogcHJpbnRrKCJwa3RnZW46IHBnX2RpdiwgbjogJWxsdSAgYmFzZTogJWQgIHJ2OiAlbGx1XG4iLAogICAgICAgICAgICAgICAgICBuLCBiYXNlLCB0bXApOyAqLwogICAgICAgIHJldHVybiB0bXA7Cn0KCnN0YXRpYyBpbmxpbmUgX191NjQgcGdfZGl2NjQoX191NjQgbiwgX191NjQgYmFzZSkgCnsKICAgICAgICBfX3U2NCB0bXAgPSBuOwovKgogKiBIb3cgZG8gd2Uga25vdyBpZiB0aGUgYXJjaGl0ZWN0cnVyZSB3ZSBhcmUgcnVubmluZyBvbgogKiBzdXBwb3J0cyBkaXZpc2lvbiB3aXRoIDY0IGJpdCBiYXNlPwogKiAKICovCiNpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSAKCgkJZG9fZGl2KHRtcCwgYmFzZSk7CiNlbHNlCgkJdG1wID0gZGl2cmVtZGkzKG4sIGJhc2UsIFBHX0RJVik7CiNlbmRpZgogICAgICAgIHJldHVybiB0bXA7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIHBrdGdlbl9yYW5kb20odm9pZCkKewojaWYgMAoJX191MzIgbjsKCWdldF9yYW5kb21fYnl0ZXMoJm4sIDQpOwoJcmV0dXJuIG47CiNlbHNlCglyZXR1cm4gbmV0X3JhbmRvbSgpOwojZW5kaWYKfQoKc3RhdGljIGlubGluZSBfX3U2NCBnZXRDdXJNcyh2b2lkKSAKewogICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOwogICAgICAgIHJldHVybiB0dl90b19tcygmdHYpOwp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IGdldEN1clVzKHZvaWQpIAp7CiAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICAgICAgcmV0dXJuIHR2X3RvX3VzKCZ0dik7Cn0KCnN0YXRpYyBpbmxpbmUgX191NjQgdHZfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCogYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwqIGIpIAp7CiAgICAgICAgcmV0dXJuIHR2X3RvX3VzKGEpIC0gdHZfdG9fdXMoYik7Cn0KCgovKiBvbGQgaW5jbHVkZSBlbmQgKi8KCnN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gVkVSU0lPTjsKCnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3JlYWQoc3RydWN0IGZpbGUqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3dyaXRlKHN0cnVjdCBmaWxlKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwpzdGF0aWMgaW50IHByb2NfaWZfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwoKc3RhdGljIGludCBwcm9jX3RocmVhZF9yZWFkKGNoYXIgKmJ1ZiAsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CnN0YXRpYyBpbnQgcHJvY19pZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBwcm9jX3RocmVhZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBjcmVhdGVfcHJvY19kaXIodm9pZCk7CnN0YXRpYyBpbnQgcmVtb3ZlX3Byb2NfZGlyKHZvaWQpOwoKc3RhdGljIGludCBwa3RnZW5fcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCwgc3RydWN0IHBrdGdlbl9kZXYgKmkpOwpzdGF0aWMgaW50IHBrdGdlbl9hZGRfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBjb25zdCBjaGFyKiBpZm5hbWUpOwpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQqIHBrdGdlbl9maW5kX3RocmVhZChjb25zdCBjaGFyKiBuYW1lKTsKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fZmluZF9kZXYoc3RydWN0IHBrdGdlbl90aHJlYWQqIHQsIGNvbnN0IGNoYXIqIGlmbmFtZSk7CnN0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKc3RhdGljIHZvaWQgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcyh2b2lkKTsKc3RhdGljIHZvaWQgcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHNfaWZzKHZvaWQpOwpzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7CnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0KTsKc3RhdGljIHZvaWQgcGt0Z2VuX2NsZWFyX2NvdW50ZXJzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KTsKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fTk5fdGhyZWFkcyhjb25zdCBjaGFyKiBkZXZfbmFtZSwgaW50IHJlbW92ZSk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9pcDYoY29uc3QgY2hhciAqcyxjaGFyIGlwWzE2XSk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgZm10X2lwNihjaGFyICpzLGNvbnN0IGNoYXIgaXBbMTZdKTsKCi8qIE1vZHVsZSBwYXJhbWV0ZXJzLCBkZWZhdWx0cy4gKi8Kc3RhdGljIGludCBwZ19jb3VudF9kID0gMTAwMDsgLyogMTAwMCBwa3RzIGJ5IGRlZmF1bHQgKi8Kc3RhdGljIGludCBwZ19kZWxheV9kID0gMDsKc3RhdGljIGludCBwZ19jbG9uZV9za2JfZCA9IDA7CnN0YXRpYyBpbnQgZGVidWcgPSAwOwoKc3RhdGljIHNwaW5sb2NrX3QgX3RocmVhZF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOwpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl90aHJlYWRzID0gTlVMTDsKCnN0YXRpYyBjaGFyIG1vZHVsZV9mbmFtZVsxMjhdOwpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICptb2R1bGVfcHJvY19lbnQgPSBOVUxMOwoKc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwa3RnZW5fbm90aWZpZXJfYmxvY2sgPSB7Cgkubm90aWZpZXJfY2FsbCA9IHBrdGdlbl9kZXZpY2VfZXZlbnQsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwa3RnZW5fZm9wcyA9IHsKICAgICAgICAucmVhZCAgICAgPSBwcm9jX3BnY3RybF9yZWFkLAogICAgICAgIC53cml0ZSAgICA9IHByb2NfcGdjdHJsX3dyaXRlLAoJLyogIC5pb2N0bCAgICA9IHBrdGdlbl9pb2N0bCwgbGF0ZXIgbWF5YmUgKi8KfTsKCi8qCiAqIC9wcm9jIGhhbmRsaW5nIGZ1bmN0aW9ucyAKICoKICovCgpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZ19wcm9jX2RpciA9IE5VTEw7CnN0YXRpYyBpbnQgcHJvY19wZ2N0cmxfcmVhZF9lb2Y9MDsKCnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3JlYWQoc3RydWN0IGZpbGUqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKeyAKCWNoYXIgZGF0YVsyMDBdOwoJaW50IGxlbiA9IDA7CgoJaWYocHJvY19wZ2N0cmxfcmVhZF9lb2YpIHsKCQlwcm9jX3BnY3RybF9yZWFkX2VvZj0wOwoJCWxlbiA9IDA7CgkJZ290byBvdXQ7Cgl9CgoJc3ByaW50ZihkYXRhLCAiJXMiLCBWRVJTSU9OKTsgCgoJbGVuID0gc3RybGVuKGRhdGEpOwoKCWlmKGxlbiA+IGNvdW50KSB7CgkJbGVuID0tRUZBVUxUOwoJCWdvdG8gb3V0OwoJfSAgCQoKCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBsZW4pKSB7CgkJbGVuID0tRUZBVUxUOwoJCWdvdG8gb3V0OwoJfSAgCgoJKnBwb3MgKz0gbGVuOwoJcHJvY19wZ2N0cmxfcmVhZF9lb2Y9MTsgLyogRU9GIG5leHQgY2FsbCAqLwoKIG91dDoKCXJldHVybiBsZW47Cn0KCnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3dyaXRlKHN0cnVjdCBmaWxlKiBmaWxlLGNvbnN0IGNoYXIgX191c2VyICogYnVmLAoJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CgljaGFyICpkYXRhID0gTlVMTDsKCWludCBlcnIgPSAwOwoKICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpewogICAgICAgICAgICAgICAgZXJyID0gLUVQRVJNOwoJCWdvdG8gb3V0OwogICAgICAgIH0KCglkYXRhID0gKHZvaWQqKXZtYWxsb2MgKCh1bnNpZ25lZCBpbnQpY291bnQpOwoKCWlmKCFkYXRhKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIG91dDsKCX0KCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSkgewoJCWVyciA9LUVGQVVMVDsKCQlnb3RvIG91dF9mcmVlOwoJfSAgCglkYXRhW2NvdW50LTFdID0gMDsgLyogTWFrZSBzdHJpbmcgKi8KCglpZiAoIXN0cmNtcChkYXRhLCAic3RvcCIpKSAKCQlwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnMoKTsKCiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkYXRhLCAic3RhcnQiKSkgCgkJcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcygpOwoKCWVsc2UgCgkJcHJpbnRrKCJwa3RnZW46IFVua25vd24gY29tbWFuZDogJXNcbiIsIGRhdGEpOwoKCWVyciA9IGNvdW50OwoKIG91dF9mcmVlOgoJdmZyZWUgKGRhdGEpOwogb3V0OgogICAgICAgIHJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgcHJvY19pZl9yZWFkKGNoYXIgKmJ1ZiAsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKewoJY2hhciAqcDsKCWludCBpOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gKHN0cnVjdCBwa3RnZW5fZGV2KikoZGF0YSk7CiAgICAgICAgX191NjQgc2E7CiAgICAgICAgX191NjQgc3RvcHBlZDsKICAgICAgICBfX3U2NCBub3cgPSBnZXRDdXJVcygpOwogICAgICAgIAoJcCA9IGJ1ZjsKCXAgKz0gc3ByaW50ZihwLCAiUGFyYW1zOiBjb3VudCAlbGx1ICBtaW5fcGt0X3NpemU6ICV1ICBtYXhfcGt0X3NpemU6ICV1XG4iLAoJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+Y291bnQsCgkJICAgICBwa3RfZGV2LT5taW5fcGt0X3NpemUsIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSk7CgoJcCArPSBzcHJpbnRmKHAsICIgICAgIGZyYWdzOiAlZCAgZGVsYXk6ICV1ICBjbG9uZV9za2I6ICVkICBpZm5hbWU6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5uZnJhZ3MsIDEwMDAqcGt0X2Rldi0+ZGVsYXlfdXMrcGt0X2Rldi0+ZGVsYXlfbnMsIHBrdF9kZXYtPmNsb25lX3NrYiwgcGt0X2Rldi0+aWZuYW1lKTsKCglwICs9IHNwcmludGYocCwgIiAgICAgZmxvd3M6ICV1IGZsb3dsZW46ICV1XG4iLCBwa3RfZGV2LT5jZmxvd3MsIHBrdF9kZXYtPmxmbG93KTsKCgoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKCQljaGFyIGIxWzEyOF0sIGIyWzEyOF0sIGIzWzEyOF07CgkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmluNl9zYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIyLCAgcGt0X2Rldi0+bWluX2luNl9zYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIzLCAgcGt0X2Rldi0+bWF4X2luNl9zYWRkci5zNl9hZGRyKTsKCQlwICs9IHNwcmludGYocCwgIiAgICAgc2FkZHI6ICVzICBtaW5fc2FkZHI6ICVzICBtYXhfc2FkZHI6ICVzXG4iLCBiMSwgYjIsIGIzKTsKCgkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIyLCAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIzLCAgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyKTsKCQlwICs9IHNwcmludGYocCwgIiAgICAgZGFkZHI6ICVzICBtaW5fZGFkZHI6ICVzICBtYXhfZGFkZHI6ICVzXG4iLCBiMSwgYjIsIGIzKTsKCgl9IAoJZWxzZSAKCQlwICs9IHNwcmludGYocCwgIiAgICAgZHN0X21pbjogJXMgIGRzdF9tYXg6ICVzXG4gICAgIHNyY19taW46ICVzICBzcmNfbWF4OiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZHN0X21pbiwgcGt0X2Rldi0+ZHN0X21heCwgcGt0X2Rldi0+c3JjX21pbiwgcGt0X2Rldi0+c3JjX21heCk7CgogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICBzcmNfbWFjOiAiKTsKCglpZiAoKHBrdF9kZXYtPnNyY19tYWNbMF0gPT0gMCkgJiYgCgkgICAgKHBrdF9kZXYtPnNyY19tYWNbMV0gPT0gMCkgJiYgCgkgICAgKHBrdF9kZXYtPnNyY19tYWNbMl0gPT0gMCkgJiYgCgkgICAgKHBrdF9kZXYtPnNyY19tYWNbM10gPT0gMCkgJiYgCgkgICAgKHBrdF9kZXYtPnNyY19tYWNbNF0gPT0gMCkgJiYgCgkgICAgKHBrdF9kZXYtPnNyY19tYWNbNV0gPT0gMCkpIAoKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKCQkJcCArPSBzcHJpbnRmKHAsICIlMDJYJXMiLCBwa3RfZGV2LT5vZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gIiAgIiA6ICI6Iik7CgoJZWxzZSAKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKCQkJcCArPSBzcHJpbnRmKHAsICIlMDJYJXMiLCBwa3RfZGV2LT5zcmNfbWFjW2ldLCBpID09IDUgPyAiICAiIDogIjoiKTsKCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICJkc3RfbWFjOiAiKTsKCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAoJCXAgKz0gc3ByaW50ZihwLCAiJTAyWCVzIiwgcGt0X2Rldi0+ZHN0X21hY1tpXSwgaSA9PSA1ID8gIlxuIiA6ICI6Iik7CgogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICB1ZHBfc3JjX21pbjogJWQgIHVkcF9zcmNfbWF4OiAlZCAgdWRwX2RzdF9taW46ICVkICB1ZHBfZHN0X21heDogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWluLCBwa3RfZGV2LT51ZHBfc3JjX21heCwgcGt0X2Rldi0+dWRwX2RzdF9taW4sCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWF4KTsKCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICIgICAgIHNyY19tYWNfY291bnQ6ICVkICBkc3RfbWFjX2NvdW50OiAlZCBcbiAgICAgRmxhZ3M6ICIsCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNyY19tYWNfY291bnQsIHBrdF9kZXYtPmRzdF9tYWNfY291bnQpOwoKCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgIEZfSVBWNikgCiAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIklQVjYgICIpOwoKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiAgRl9JUFNSQ19STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJJUFNSQ19STkQgICIpOwoKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQRFNUX1JORCkgCiAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIklQRFNUX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9UWFNJWkVfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVFhTSVpFX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVURQU1JDX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBEU1RfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVURQRFNUX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNTUkNfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiTUFDU1JDX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNEU1RfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiTUFDRFNUX1JORCAgIik7CgogICAgICAgIAogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiXG4iKTsKICAgICAgICAKICAgICAgICBzYSA9IHBrdF9kZXYtPnN0YXJ0ZWRfYXQ7CiAgICAgICAgc3RvcHBlZCA9IHBrdF9kZXYtPnN0b3BwZWRfYXQ7CiAgICAgICAgaWYgKHBrdF9kZXYtPnJ1bm5pbmcpIAogICAgICAgICAgICAgICAgc3RvcHBlZCA9IG5vdzsgLyogbm90IHJlYWxseSBzdG9wcGVkLCBtb3JlIGxpa2UgbGFzdC1ydW5uaW5nLWF0ICovCiAgICAgICAgCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICJDdXJyZW50OlxuICAgICBwa3RzLXNvZmFyOiAlbGx1ICBlcnJvcnM6ICVsbHVcbiAgICAgc3RhcnRlZDogJWxsdXVzICBzdG9wcGVkOiAlbGx1dXMgaWRsZTogJWxsdXVzXG4iLAoJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+c29mYXIsCgkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5lcnJvcnMsCgkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYSwKCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0b3BwZWQsIAoJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+aWRsZV9hY2MpOwoKICAgICAgICBwICs9IHNwcmludGYocCwgIiAgICAgc2VxX251bTogJWQgIGN1cl9kc3RfbWFjX29mZnNldDogJWQgIGN1cl9zcmNfbWFjX29mZnNldDogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNlcV9udW0sIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCwgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0KTsKCglpZihwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikgewoJCWNoYXIgYjFbMTI4XSwgYjJbMTI4XTsKCQlmbXRfaXA2KGIxLCAgcGt0X2Rldi0+Y3VyX2luNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIyLCAgcGt0X2Rldi0+Y3VyX2luNl9zYWRkci5zNl9hZGRyKTsKCQlwICs9IHNwcmludGYocCwgIiAgICAgY3VyX3NhZGRyOiAlcyAgY3VyX2RhZGRyOiAlc1xuIiwgYjIsIGIxKTsKCX0gCgllbHNlIAoJCXAgKz0gc3ByaW50ZihwLCAiICAgICBjdXJfc2FkZHI6IDB4JXggIGN1cl9kYWRkcjogMHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NhZGRyLCBwa3RfZGV2LT5jdXJfZGFkZHIpOwoKCglwICs9IHNwcmludGYocCwgIiAgICAgY3VyX3VkcF9kc3Q6ICVkICBjdXJfdWRwX3NyYzogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0LCBwa3RfZGV2LT5jdXJfdWRwX3NyYyk7CgoJcCArPSBzcHJpbnRmKHAsICIgICAgIGZsb3dzOiAldVxuIiwgcGt0X2Rldi0+bmZsb3dzKTsKCglpZiAocGt0X2Rldi0+cmVzdWx0WzBdKQoJCXAgKz0gc3ByaW50ZihwLCAiUmVzdWx0OiAlc1xuIiwgcGt0X2Rldi0+cmVzdWx0KTsKCWVsc2UKCQlwICs9IHNwcmludGYocCwgIlJlc3VsdDogSWRsZVxuIik7CgkqZW9mID0gMTsKCglyZXR1cm4gcCAtIGJ1ZjsKfQoKCnN0YXRpYyBpbnQgY291bnRfdHJhaWxfY2hhcnMoY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbWF4bGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGNoYXIgYzsKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcihjLCAmdXNlcl9idWZmZXJbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewoJCWNhc2UgJ1wiJzoKCQljYXNlICdcbic6CgkJY2FzZSAnXHInOgoJCWNhc2UgJ1x0JzoKCQljYXNlICcgJzoKCQljYXNlICc9JzoKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZ290byBkb25lOwoJCX07Cgl9CmRvbmU6CglyZXR1cm4gaTsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbnVtX2FyZyhjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuLCAKCQkJICAgICB1bnNpZ25lZCBsb25nICpudW0pCnsKCWludCBpID0gMDsKCSpudW0gPSAwOwogIAoJZm9yKDsgaSA8IG1heGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjaGFyIGM7CiAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7CgkJCSpudW0gKj0gMTA7CgkJCSpudW0gKz0gYyAtJzAnOwoJCX0gZWxzZQoJCQlicmVhazsKCX0KCXJldHVybiBpOwp9CgpzdGF0aWMgaW50IHN0cm5fbGVuKGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgdW5zaWduZWQgaW50IG1heGxlbikKewoJaW50IGkgPSAwOwoKCWZvcig7IGkgPCBtYXhsZW47IGkrKykgewogICAgICAgICAgICAgICAgY2hhciBjOwogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGMsICZ1c2VyX2J1ZmZlcltpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CgkJY2FzZSAnXCInOgoJCWNhc2UgJ1xuJzoKCQljYXNlICdccic6CgkJY2FzZSAnXHQnOgoJCWNhc2UgJyAnOgoJCQlnb3RvIGRvbmVfc3RyOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9OwoJfQpkb25lX3N0cjoKCglyZXR1cm4gaTsKfQoKc3RhdGljIGludCBwcm9jX2lmX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7CglpbnQgaSA9IDAsIG1heCwgbGVuOwoJY2hhciBuYW1lWzE2XSwgdmFsc3RyWzMyXTsKCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAwOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gKHN0cnVjdCBwa3RnZW5fZGV2KikoZGF0YSk7CiAgICAgICAgY2hhciogcGdfcmVzdWx0ID0gTlVMTDsKICAgICAgICBpbnQgdG1wID0gMDsKCWNoYXIgYnVmWzEyOF07CiAgICAgICAgCiAgICAgICAgcGdfcmVzdWx0ID0gJihwa3RfZGV2LT5yZXN1bHRbMF0pOwogICAgICAgIAoJaWYgKGNvdW50IDwgMSkgewoJCXByaW50aygicGt0Z2VuOiB3cm9uZyBjb21tYW5kIGZvcm1hdFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiAgCgltYXggPSBjb3VudCAtIGk7Cgl0bXAgPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CiAgICAgICAgaWYgKHRtcCA8IDApIHsgCgkJcHJpbnRrKCJwa3RnZW46IGlsbGVnYWwgZm9ybWF0XG4iKTsKCQlyZXR1cm4gdG1wOyAKCX0KICAgICAgICBpICs9IHRtcDsKICAgICAgICAKCS8qIFJlYWQgdmFyaWFibGUgbmFtZSAqLwoKCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKG5hbWUpIC0gMSk7CiAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CglpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pICkKCQlyZXR1cm4gLUVGQVVMVDsKCWkgKz0gbGVuOwogIAoJbWF4ID0gY291bnQgLWk7CglsZW4gPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CiAgICAgICAgaWYgKGxlbiA8IDApIAogICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKICAgICAgICAKCWkgKz0gbGVuOwoKCWlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgY2hhciB0Yltjb3VudCArIDFdOwogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKHRiLCB1c2VyX2J1ZmZlciwgY291bnQpKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIHRiW2NvdW50XSA9IDA7CgkJcHJpbnRrKCJwa3RnZW46ICVzLCVsdSAgYnVmZmVyIC06JXM6LVxuIiwgbmFtZSwgY291bnQsIHRiKTsKICAgICAgICB9CgoJaWYgKCFzdHJjbXAobmFtZSwgIm1pbl9wa3Rfc2l6ZSIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmICh2YWx1ZSA8IDE0KzIwKzgpCgkJCXZhbHVlID0gMTQrMjArODsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT5taW5fcGt0X3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWluX3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1pbl9wa3Rfc2l6ZT0ldSIsIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CgkJcmV0dXJuIGNvdW50OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibWF4X3BrdF9zaXplIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHZhbHVlIDwgMTQrMjArOCkKCQkJdmFsdWUgPSAxNCsyMCs4OwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5tYXhfcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogbWF4X3BrdF9zaXplPSV1IiwgcGt0X2Rldi0+bWF4X3BrdF9zaXplKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgogICAgICAgIC8qIFNob3J0Y3V0IGZvciBtaW4gPSBtYXggKi8KCglpZiAoIXN0cmNtcChuYW1lLCAicGt0X3NpemUiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAodmFsdWUgPCAxNCsyMCs4KQoJCQl2YWx1ZSA9IDE0KzIwKzg7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+bWluX3BrdF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5tYXhfcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogcGt0X3NpemU9JXUiLCBwa3RfZGV2LT5taW5fcGt0X3NpemUpOwoJCXJldHVybiBjb3VudDsKCX0KCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImRlYnVnIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBkZWJ1ZyA9IHZhbHVlOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRlYnVnPSV1IiwgZGVidWcpOwoJCXJldHVybiBjb3VudDsKCX0KCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImZyYWdzIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJcGt0X2Rldi0+bmZyYWdzID0gdmFsdWU7CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZnJhZ3M9JXUiLCBwa3RfZGV2LT5uZnJhZ3MpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkZWxheSIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmICh2YWx1ZSA9PSAweDdGRkZGRkZGKSB7CgkJCXBrdF9kZXYtPmRlbGF5X3VzID0gMHg3RkZGRkZGRjsKCQkJcGt0X2Rldi0+ZGVsYXlfbnMgPSAwOwoJCX0gZWxzZSB7CgkJCXBrdF9kZXYtPmRlbGF5X3VzID0gdmFsdWUgLyAxMDAwOwoJCQlwa3RfZGV2LT5kZWxheV9ucyA9IHZhbHVlICUgMTAwMDsKCQl9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZGVsYXk9JXUiLCAxMDAwKnBrdF9kZXYtPmRlbGF5X3VzK3BrdF9kZXYtPmRlbGF5X25zKTsKCQlyZXR1cm4gY291bnQ7Cgl9CiAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9zcmNfbWluIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+dWRwX3NyY19taW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX3NyY19taW4gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0gICAgICAgCgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogdWRwX3NyY19taW49JXUiLCBwa3RfZGV2LT51ZHBfc3JjX21pbik7CgkJcmV0dXJuIGNvdW50OwoJfQogCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0X21pbiIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9kc3RfbWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogdWRwX2RzdF9taW49JXUiLCBwa3RfZGV2LT51ZHBfZHN0X21pbik7CgkJcmV0dXJuIGNvdW50OwoJfQogCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfc3JjX21heCIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9zcmNfbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfc3JjID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogdWRwX3NyY19tYXg9JXUiLCBwa3RfZGV2LT51ZHBfc3JjX21heCk7CgkJcmV0dXJuIGNvdW50OwoJfQogCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0X21heCIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9kc3RfbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogdWRwX2RzdF9tYXg9JXUiLCBwa3RfZGV2LT51ZHBfZHN0X21heCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImNsb25lX3NrYiIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+Y2xvbmVfc2tiID0gdmFsdWU7CgkKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBjbG9uZV9za2I9JWQiLCBwa3RfZGV2LT5jbG9uZV9za2IpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJjb3VudCIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCXBrdF9kZXYtPmNvdW50ID0gdmFsdWU7CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogY291bnQ9JWxsdSIsCgkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPmNvdW50KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAic3JjX21hY19jb3VudCIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmIChwa3RfZGV2LT5zcmNfbWFjX2NvdW50ICE9IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNyY19tYWNfY291bnQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNfbWFjX2NvdW50PSVkIiwgcGt0X2Rldi0+c3JjX21hY19jb3VudCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9tYWNfY291bnQiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAocGt0X2Rldi0+ZHN0X21hY19jb3VudCAhPSB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kc3RfbWFjX2NvdW50ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0X21hY19jb3VudD0lZCIsIHBrdF9kZXYtPmRzdF9tYWNfY291bnQpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJmbGFnIikpIHsKICAgICAgICAgICAgICAgIGNoYXIgZlszMl07CiAgICAgICAgICAgICAgICBtZW1zZXQoZiwgMCwgMzIpOwoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaWYgKGNvcHlfZnJvbV91c2VyKGYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGYsICJJUFNSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFNSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIUlQU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9JUFNSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiVFhTSVpFX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX1RYU0laRV9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIVRYU0laRV9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfVFhTSVpFX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJJUERTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUERTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIUlQRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9JUERTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiVURQU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX1VEUFNSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIVVEUFNSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfVURQU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJVRFBEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfVURQRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhVURQRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9VRFBEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIk1BQ1NSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9NQUNTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFNQUNTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX01BQ1NSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiTUFDRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX01BQ0RTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIU1BQ0RTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfTUFDRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiRmxhZyAtOiVzOi0gdW5rbm93blxuQXZhaWxhYmxlIGZsYWdzLCAocHJlcGVuZCAhIHRvIHVuLXNldCBmbGFnKTpcbiVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUFNSQ19STkQsIElQRFNUX1JORCwgVFhTSVpFX1JORCwgVURQU1JDX1JORCwgVURQRFNUX1JORCwgTUFDU1JDX1JORCwgTUFDRFNUX1JORFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBmbGFncz0weCV4IiwgcGt0X2Rldi0+ZmxhZ3MpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3RfbWluIikgfHwgIXN0cmNtcChuYW1lLCAiZHN0IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihwa3RfZGV2LT5kc3RfbWluKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+ZHN0X21pbikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2Rldi0+ZHN0X21pbiwgMCwgc2l6ZW9mKHBrdF9kZXYtPmRzdF9taW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5kc3RfbWluLCBidWYsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+ZHN0X21pbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kYWRkciA9IHBrdF9kZXYtPmRhZGRyX21pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKGRlYnVnKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogZHN0X21pbiBzZXQgdG86ICVzXG4iLCBwa3RfZGV2LT5kc3RfbWluKTsKICAgICAgICAgICAgICAgIGkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdF9taW49JXMiLCBwa3RfZGV2LT5kc3RfbWluKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0X21heCIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YocGt0X2Rldi0+ZHN0X21heCkgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwoKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmLCBwa3RfZGV2LT5kc3RfbWF4KSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LT5kc3RfbWF4LCAwLCBzaXplb2YocGt0X2Rldi0+ZHN0X21heCkpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPmRzdF9tYXgsIGJ1ZiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZGFkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWF4KTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+ZGFkZHJfbWF4OwogICAgICAgICAgICAgICAgfQoJCWlmKGRlYnVnKQoJCQlwcmludGsoInBrdGdlbjogZHN0X21heCBzZXQgdG86ICVzXG4iLCBwa3RfZGV2LT5kc3RfbWF4KTsKCQlpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3RfbWF4PSVzIiwgcGt0X2Rldi0+ZHN0X21heCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdDYiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSByZXR1cm4gbGVuOyAKCgkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OwoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CgoJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+aW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYnVmLCAgcGt0X2Rldi0+aW42X2RhZGRyLnM2X2FkZHIpOwoKCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9kYWRkciwgJnBrdF9kZXYtPmluNl9kYWRkcik7CgogICAgICAgICAgICAgICAgaWYoZGVidWcpIAoJCQlwcmludGsoInBrdGdlbjogZHN0NiBzZXQgdG86ICVzXG4iLCBidWYpOwoKICAgICAgICAgICAgICAgIGkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdDY9JXMiLCBidWYpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3Q2X21pbiIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoYnVmKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHJldHVybiBsZW47IAoKCQlwa3RfZGV2LT5mbGFncyB8PSBGX0lQVjY7CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKCgkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYnVmLCAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyKTsKCgkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfZGFkZHIsICZwa3RfZGV2LT5taW5faW42X2RhZGRyKTsKICAgICAgICAgICAgICAgIGlmKGRlYnVnKSAKCQkJcHJpbnRrKCJwa3RnZW46IGRzdDZfbWluIHNldCB0bzogJXNcbiIsIGJ1Zik7CgogICAgICAgICAgICAgICAgaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0Nl9taW49JXMiLCBidWYpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3Q2X21heCIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoYnVmKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHJldHVybiBsZW47IAoKCQlwa3RfZGV2LT5mbGFncyB8PSBGX0lQVjY7CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKCgkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYnVmLCAgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyKTsKCiAgICAgICAgICAgICAgICBpZihkZWJ1ZykgCgkJCXByaW50aygicGt0Z2VuOiBkc3Q2X21heCBzZXQgdG86ICVzXG4iLCBidWYpOwoKICAgICAgICAgICAgICAgIGkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdDZfbWF4PSVzIiwgYnVmKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAic3JjNiIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoYnVmKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHJldHVybiBsZW47IAoKCQlwa3RfZGV2LT5mbGFncyB8PSBGX0lQVjY7CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKCgkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5pbjZfc2FkZHIuczZfYWRkcik7CgkJZm10X2lwNihidWYsICBwa3RfZGV2LT5pbjZfc2FkZHIuczZfYWRkcik7CgoJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X3NhZGRyLCAmcGt0X2Rldi0+aW42X3NhZGRyKTsKCiAgICAgICAgICAgICAgICBpZihkZWJ1ZykgCgkJCXByaW50aygicGt0Z2VuOiBzcmM2IHNldCB0bzogJXNcbiIsIGJ1Zik7CgkJCiAgICAgICAgICAgICAgICBpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmM2PSVzIiwgYnVmKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAic3JjX21pbiIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YocGt0X2Rldi0+c3JjX21pbikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+c3JjX21pbikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2Rldi0+c3JjX21pbiwgMCwgc2l6ZW9mKHBrdF9kZXYtPnNyY19taW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5zcmNfbWluLCBidWYsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+c3JjX21pbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciA9IHBrdF9kZXYtPnNhZGRyX21pbjsKICAgICAgICAgICAgICAgIH0KCQlpZihkZWJ1ZykKCQkJcHJpbnRrKCJwa3RnZW46IHNyY19taW4gc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+c3JjX21pbik7CgkJaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjX21pbj0lcyIsIHBrdF9kZXYtPnNyY19taW4pOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWF4IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihwa3RfZGV2LT5zcmNfbWF4KSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmLCBwa3RfZGV2LT5zcmNfbWF4KSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LT5zcmNfbWF4LCAwLCBzaXplb2YocGt0X2Rldi0+c3JjX21heCkpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPnNyY19tYXgsIGJ1ZiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c2FkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWF4KTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NhZGRyID0gcGt0X2Rldi0+c2FkZHJfbWF4OwogICAgICAgICAgICAgICAgfQoJCWlmKGRlYnVnKQoJCQlwcmludGsoInBrdGdlbjogc3JjX21heCBzZXQgdG86ICVzXG4iLCBwa3RfZGV2LT5zcmNfbWF4KTsKCQlpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNfbWF4PSVzIiwgcGt0X2Rldi0+c3JjX21heCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9tYWMiKSkgewoJCWNoYXIgKnYgPSB2YWxzdHI7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZF9kbWFjWzZdOwoJCXVuc2lnbmVkIGNoYXIgKm0gPSBwa3RfZGV2LT5kc3RfbWFjOwogICAgICAgICAgICAgICAgbWVtY3B5KG9sZF9kbWFjLCBwa3RfZGV2LT5kc3RfbWFjLCA2KTsKICAgICAgICAgICAgICAgIAoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHZhbHN0cikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQltZW1zZXQodmFsc3RyLCAwLCBzaXplb2YodmFsc3RyKSk7CgkJaWYoIGNvcHlfZnJvbV91c2VyKHZhbHN0ciwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKCgkJZm9yKCptID0gMDsqdiAmJiBtIDwgcGt0X2Rldi0+ZHN0X21hYyArIDY7IHYrKykgewoJCQlpZiAoKnYgPj0gJzAnICYmICp2IDw9ICc5JykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICcwJzsKCQkJfQoJCQlpZiAoKnYgPj0gJ0EnICYmICp2IDw9ICdGJykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICdBJyArIDEwOwoJCQl9CgkJCWlmICgqdiA+PSAnYScgJiYgKnYgPD0gJ2YnKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJ2EnICsgMTA7CgkJCX0KCQkJaWYgKCp2ID09ICc6JykgewoJCQkJbSsrOwoJCQkJKm0gPSAwOwoJCQl9CgkJfQoKCQkvKiBTZXQgdXAgRGVzdCBNQUMgKi8KICAgICAgICAgICAgICAgIGlmIChtZW1jbXAob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMsIDYpICE9IDApIAogICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFswXSksIHBrdF9kZXYtPmRzdF9tYWMsIDYpOwogICAgICAgICAgICAgICAgCgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0bWFjIik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgInNyY19tYWMiKSkgewoJCWNoYXIgKnYgPSB2YWxzdHI7CgkJdW5zaWduZWQgY2hhciAqbSA9IHBrdF9kZXYtPnNyY19tYWM7CgoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHZhbHN0cikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQltZW1zZXQodmFsc3RyLCAwLCBzaXplb2YodmFsc3RyKSk7CgkJaWYoIGNvcHlfZnJvbV91c2VyKHZhbHN0ciwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKSAKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaSArPSBsZW47CgoJCWZvcigqbSA9IDA7KnYgJiYgbSA8IHBrdF9kZXYtPnNyY19tYWMgKyA2OyB2KyspIHsKCQkJaWYgKCp2ID49ICcwJyAmJiAqdiA8PSAnOScpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnMCc7CgkJCX0KCQkJaWYgKCp2ID49ICdBJyAmJiAqdiA8PSAnRicpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnQScgKyAxMDsKCQkJfQoJCQlpZiAoKnYgPj0gJ2EnICYmICp2IDw9ICdmJykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICdhJyArIDEwOwoJCQl9CgkJCWlmICgqdiA9PSAnOicpIHsKCQkJCW0rKzsKCQkJCSptID0gMDsKCQkJfQoJCX0JICAKCiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNtYWMiKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJjbGVhcl9jb3VudGVycyIpKSB7CiAgICAgICAgICAgICAgICBwa3RnZW5fY2xlYXJfY291bnRlcnMocGt0X2Rldik7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBDbGVhcmluZyBjb3VudGVycy5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIH0KCglpZiAoIXN0cmNtcChuYW1lLCAiZmxvd3MiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAodmFsdWUgPiBNQVhfQ0ZMT1dTKQoJCQl2YWx1ZSA9IE1BWF9DRkxPV1M7CgoJCXBrdF9kZXYtPmNmbG93cyA9IHZhbHVlOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsb3dzPSV1IiwgcGt0X2Rldi0+Y2Zsb3dzKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgoJaWYgKCFzdHJjbXAobmFtZSwgImZsb3dsZW4iKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlwa3RfZGV2LT5sZmxvdyA9IHZhbHVlOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsb3dsZW49JXUiLCBwa3RfZGV2LT5sZmxvdyk7CgkJcmV0dXJuIGNvdW50OwoJfQogICAgICAgIAoJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBzdWNoIHBhcmFtZXRlciBcIiVzXCIiLCBuYW1lKTsKCXJldHVybiAtRUlOVkFMOwp9CgpzdGF0aWMgaW50IHByb2NfdGhyZWFkX3JlYWQoY2hhciAqYnVmICwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKewoJY2hhciAqcDsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGRhdGEpOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKCgogICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBjb3VsZCBub3QgZmluZCB0aHJlYWQgaW4gcHJvY190aHJlYWRfcmVhZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CgoJcCA9IGJ1ZjsKCXAgKz0gc3ByaW50ZihwLCAiTmFtZTogJXMgIG1heF9iZWZvcmVfc29mdGlycTogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHQtPm5hbWUsIHQtPm1heF9iZWZvcmVfc29mdGlycSk7CgogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiUnVubmluZzogIik7CiAgICAgICAgCiAgICAgICAgaWZfbG9jayh0KTsKICAgICAgICBmb3IocGt0X2RldiA9IHQtPmlmX2xpc3Q7cGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQpIAoJCWlmKHBrdF9kZXYtPnJ1bm5pbmcpCgkJCXAgKz0gc3ByaW50ZihwLCAiJXMgIiwgcGt0X2Rldi0+aWZuYW1lKTsKICAgICAgICAKICAgICAgICBwICs9IHNwcmludGYocCwgIlxuU3RvcHBlZDogIik7CgogICAgICAgIGZvcihwa3RfZGV2ID0gdC0+aWZfbGlzdDtwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCkgCgkJaWYoIXBrdF9kZXYtPnJ1bm5pbmcpCgkJCXAgKz0gc3ByaW50ZihwLCAiJXMgIiwgcGt0X2Rldi0+aWZuYW1lKTsKCglpZiAodC0+cmVzdWx0WzBdKQoJCXAgKz0gc3ByaW50ZihwLCAiXG5SZXN1bHQ6ICVzXG4iLCB0LT5yZXN1bHQpOwoJZWxzZQoJCXAgKz0gc3ByaW50ZihwLCAiXG5SZXN1bHQ6IE5BXG4iKTsKCgkqZW9mID0gMTsKCiAgICAgICAgaWZfdW5sb2NrKHQpOwoKCXJldHVybiBwIC0gYnVmOwp9CgpzdGF0aWMgaW50IHByb2NfdGhyZWFkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJaW50IGkgPSAwLCBtYXgsIGxlbiwgcmV0OwoJY2hhciBuYW1lWzQwXTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdDsKICAgICAgICBjaGFyICpwZ19yZXN1bHQ7CiAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CiAgICAgICAgCglpZiAoY291bnQgPCAxKSB7CgkJLy8Jc3ByaW50ZihwZ19yZXN1bHQsICJXcm9uZyBjb21tYW5kIGZvcm1hdCIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQogIAoJbWF4ID0gY291bnQgLSBpOwogICAgICAgIGxlbiA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAobGVuIDwgMCkgCgkJcmV0dXJuIGxlbjsgCiAgICAgCglpICs9IGxlbjsKICAKCS8qIFJlYWQgdmFyaWFibGUgbmFtZSAqLwoKCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKG5hbWUpIC0gMSk7CiAgICAgICAgaWYgKGxlbiA8IDApICAKCQlyZXR1cm4gbGVuOyAKCQoJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CglpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCXJldHVybiAtRUZBVUxUOwoJaSArPSBsZW47CiAgCgltYXggPSBjb3VudCAtaTsKCWxlbiA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAobGVuIDwgMCkgIAoJCXJldHVybiBsZW47IAoJCglpICs9IGxlbjsKCglpZiAoZGVidWcpIAoJCXByaW50aygicGt0Z2VuOiB0PSVzLCBjb3VudD0lbHVcbiIsIG5hbWUsIGNvdW50KTsKICAgICAgICAKCiAgICAgICAgdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGRhdGEpOwoJaWYoIXQpIHsKCQlwcmludGsoInBrdGdlbjogRVJST1I6IE5vIHRocmVhZFxuIik7CgkJcmV0ID0gLUVJTlZBTDsKCQlnb3RvIG91dDsKCX0KCglwZ19yZXN1bHQgPSAmKHQtPnJlc3VsdFswXSk7CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfZGV2aWNlIikpIHsKICAgICAgICAgICAgICAgIGNoYXIgZlszMl07CiAgICAgICAgICAgICAgICBtZW1zZXQoZiwgMCwgMzIpOwoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyAKCQkJcmV0ID0gbGVuOyAKCQkJZ290byBvdXQ7CgkJfQoJCWlmKCBjb3B5X2Zyb21fdXNlcihmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikgKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKCQl0aHJlYWRfbG9jaygpOwogICAgICAgICAgICAgICAgcGt0Z2VuX2FkZF9kZXZpY2UodCwgZik7CgkJdGhyZWFkX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBhZGRfZGV2aWNlPSVzIiwgZik7CgkJZ290byBvdXQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJyZW1fZGV2aWNlX2FsbCIpKSB7CgkJdGhyZWFkX2xvY2soKTsKCQl0LT5jb250cm9sIHw9IFRfUkVNREVWOwoJCXRocmVhZF91bmxvY2soKTsKCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKCQlzY2hlZHVsZV90aW1lb3V0KEhaLzgpOyAgLyogUHJvcGFnYXRlIHRocmVhZC0+Y29udHJvbCAgKi8KCQlyZXQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IHJlbV9kZXZpY2VfYWxsIik7CgkJZ290byBvdXQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJtYXhfYmVmb3JlX3NvZnRpcnEiKSkgewogICAgICAgICAgICAgICAgbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwoJCXRocmVhZF9sb2NrKCk7CiAgICAgICAgICAgICAgICB0LT5tYXhfYmVmb3JlX3NvZnRpcnEgPSB2YWx1ZTsKCQl0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICByZXQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1heF9iZWZvcmVfc29mdGlycT0lbHUiLCB2YWx1ZSk7CgkJZ290byBvdXQ7Cgl9CgoJcmV0ID0gLUVJTlZBTDsKIG91dDoKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGNyZWF0ZV9wcm9jX2Rpcih2b2lkKQp7CiAgICAgICAgaW50ICAgICBsZW47CiAgICAgICAgLyogIGRvZXMgcHJvY19kaXIgYWxyZWFkeSBleGlzdHMgKi8KICAgICAgICBsZW4gPSBzdHJsZW4oUEdfUFJPQ19ESVIpOwoKICAgICAgICBmb3IgKHBnX3Byb2NfZGlyID0gcHJvY19uZXQtPnN1YmRpcjsgcGdfcHJvY19kaXI7IHBnX3Byb2NfZGlyPXBnX3Byb2NfZGlyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoKHBnX3Byb2NfZGlyLT5uYW1lbGVuID09IGxlbikgJiYKCQkgICAgKCEgbWVtY21wKHBnX3Byb2NfZGlyLT5uYW1lLCBQR19QUk9DX0RJUiwgbGVuKSkpIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFwZ19wcm9jX2RpcikgCiAgICAgICAgICAgICAgICBwZ19wcm9jX2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBHX1BST0NfRElSLCBTX0lGRElSLCBwcm9jX25ldCk7CiAgICAgICAgCiAgICAgICAgaWYgKCFwZ19wcm9jX2RpcikgCiAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgICAKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCByZW1vdmVfcHJvY19kaXIodm9pZCkKewogICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBHX1BST0NfRElSLCBwcm9jX25ldCk7CiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qIFRoaW5rIGZpbmQgb3IgcmVtb3ZlIGZvciBOTiAqLwpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKl9fcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogaWZuYW1lLCBpbnQgcmVtb3ZlKSAKewoJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CglzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CgogICAgICAgIHQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICAgICAgICAgIAoJd2hpbGUgKHQpIHsKCQlwa3RfZGV2ID0gcGt0Z2VuX2ZpbmRfZGV2KHQsIGlmbmFtZSk7CgkJaWYgKHBrdF9kZXYpIHsKCQkgICAgICAgICAgICAgICAgaWYocmVtb3ZlKSB7IAoJCQkJICAgICAgICBpZl9sb2NrKHQpOwoJCQkJICAgICAgICBwa3RnZW5fcmVtb3ZlX2RldmljZSh0LCBwa3RfZGV2KTsKCQkJCSAgICAgICAgaWZfdW5sb2NrKHQpOwoJCQkJfQoJCQlicmVhazsKCQl9CgkJdCA9IHQtPm5leHQ7Cgl9CiAgICAgICAgcmV0dXJuIHBrdF9kZXY7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogaWZuYW1lLCBpbnQgcmVtb3ZlKSAKewoJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoJdGhyZWFkX2xvY2soKTsKCXBrdF9kZXYgPSBfX3BrdGdlbl9OTl90aHJlYWRzKGlmbmFtZSwgcmVtb3ZlKTsKICAgICAgICB0aHJlYWRfdW5sb2NrKCk7CglyZXR1cm4gcGt0X2RldjsKfQoKc3RhdGljIGludCBwa3RnZW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpIAp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopKHB0cik7CgoJLyogSXQgaXMgT0sgdGhhdCB3ZSBkbyBub3QgaG9sZCB0aGUgZ3JvdXAgbG9jayByaWdodCBub3csCgkgKiBhcyB3ZSBydW4gdW5kZXIgdGhlIFJUTkwgbG9jay4KCSAqLwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CgljYXNlIE5FVERFVl9HT0lOR19ET1dOOgoJY2FzZSBORVRERVZfRE9XTjoKCWNhc2UgTkVUREVWX1VQOgoJCS8qIElnbm9yZSBmb3Igbm93ICovCgkJYnJlYWs7CgkJCgljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgogICAgICAgICAgICAgICAgcGt0Z2VuX05OX3RocmVhZHMoZGV2LT5uYW1lLCBSRU1PVkUpOwoJCWJyZWFrOwoJfTsKCglyZXR1cm4gTk9USUZZX0RPTkU7Cn0KCi8qIEFzc29jaWF0ZSBwa3RnZW5fZGV2IHdpdGggYSBkZXZpY2UuICovCgpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIHBrdGdlbl9zZXR1cF9kZXYoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIHsKCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2OwoKCS8qIENsZWFuIG9sZCBzZXR1cHMgKi8KCglpZiAocGt0X2Rldi0+b2RldikgewoJCWRldl9wdXQocGt0X2Rldi0+b2Rldik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5vZGV2ID0gTlVMTDsKICAgICAgICB9CgoJb2RldiA9IGRldl9nZXRfYnlfbmFtZShwa3RfZGV2LT5pZm5hbWUpOwoKCWlmICghb2RldikgewoJCXByaW50aygicGt0Z2VuOiBubyBzdWNoIG5ldGRldmljZTogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwoJCWdvdG8gb3V0OwoJfQoJaWYgKG9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKSB7CgkJcHJpbnRrKCJwa3RnZW46IG5vdCBhbiBldGhlcm5ldCBkZXZpY2U6IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dF9wdXQ7Cgl9CglpZiAoIW5ldGlmX3J1bm5pbmcob2RldikpIHsKCQlwcmludGsoInBrdGdlbjogZGV2aWNlIGlzIGRvd246IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dF9wdXQ7Cgl9Cglwa3RfZGV2LT5vZGV2ID0gb2RldjsKCQogICAgICAgIHJldHVybiBwa3RfZGV2LT5vZGV2OwoKb3V0X3B1dDoKCWRldl9wdXQob2Rldik7Cm91dDoKIAlyZXR1cm4gTlVMTDsKCn0KCi8qIFJlYWQgcGt0X2RldiBmcm9tIHRoZSBpbnRlcmZhY2UgYW5kIHNldCB1cCBpbnRlcm5hbCBwa3RnZW5fZGV2CiAqIHN0cnVjdHVyZSB0byBoYXZlIHRoZSByaWdodCBpbmZvcm1hdGlvbiB0byBjcmVhdGUvc2VuZCBwYWNrZXRzCiAqLwpzdGF0aWMgdm9pZCBwa3RnZW5fc2V0dXBfaW5qZWN0KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CgkvKiBUcnkgb25jZSBtb3JlLCBqdXN0IGluIGNhc2UgaXQgd29ya3Mgbm93LiAqLwogICAgICAgIGlmICghcGt0X2Rldi0+b2RldikgCiAgICAgICAgICAgICAgICBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpOwogICAgICAgIAogICAgICAgIGlmICghcGt0X2Rldi0+b2RldikgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIkVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIERlZmF1bHQgdG8gdGhlIGludGVyZmFjZSdzIG1hYyBpZiBub3QgZXhwbGljaXRseSBzZXQuICovCgoJaWYgKChwa3RfZGV2LT5zcmNfbWFjWzBdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzFdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzJdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzNdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzRdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzVdID09IDApKSB7CgoJICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzZdKSwgcGt0X2Rldi0+b2Rldi0+ZGV2X2FkZHIsIDYpOwogICAgICAgfQogICAgICAgIC8qIFNldCB1cCBEZXN0IE1BQyAqLwogICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzBdKSwgcGt0X2Rldi0+ZHN0X21hYywgNik7CgogICAgICAgIC8qIFNldCB1cCBwa3Qgc2l6ZSAqLwogICAgICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSA9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZTsKCQoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKCQkvKgoJCSAqIFNraXAgdGhpcyBhdXRvbWF0aWMgYWRkcmVzcyBzZXR0aW5nIHVudGlsIGxvY2tzIG9yIGZ1bmN0aW9ucyAKCQkgKiBnZXRzIGV4cG9ydGVkCgkJICovCgojaWZkZWYgTk9UTk9XCgkJaW50IGksIHNldCA9IDAsIGVycj0xOwoJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CgoJCWZvcihpPTA7IGk8IElONl9BRERSX0hTSVpFOyBpKyspCgkJCWlmKHBrdF9kZXYtPmN1cl9pbjZfc2FkZHIuczZfYWRkcltpXSkgewoJCQkJc2V0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgoJCWlmKCFzZXQpIHsKCQkJCgkJCS8qCgkJCSAqIFVzZSBsaW5rbGV2ZWwgYWRkcmVzcyBpZiB1bmNvbmZpZ3VyZWQuCgkJCSAqCgkJCSAqIHVzZSBpcHY2X2dldF9sbGFkZHIgaWYvd2hlbiBpdCdzIGdldCBleHBvcnRlZAoJCQkgKi8KCgoJCQlyZWFkX2xvY2soJmFkZHJjb25mX2xvY2spOwoJCQlpZiAoKGlkZXYgPSBfX2luNl9kZXZfZ2V0KHBrdF9kZXYtPm9kZXYpKSAhPSBOVUxMKSB7CgkJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CgoJCQkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKCQkJCWZvciAoaWZwPWlkZXYtPmFkZHJfbGlzdDsgaWZwOyBpZnA9aWZwLT5pZl9uZXh0KSB7CgkJCQkJaWYgKGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgIShpZnAtPmZsYWdzJklGQV9GX1RFTlRBVElWRSkpIHsKCQkJCQkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIsICZpZnAtPmFkZHIpOwoJCQkJCQllcnIgPSAwOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CgkJCX0KCQkJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOwoJCQlpZihlcnIpCXByaW50aygicGt0Z2VuOiBFUlJPUjogSVB2NiBsaW5rIGFkZHJlc3Mgbm90IGF2YWlsYmxlLlxuIik7CgkJfQojZW5kaWYKCX0gCgllbHNlIHsKCQlwa3RfZGV2LT5zYWRkcl9taW4gPSAwOwoJCXBrdF9kZXYtPnNhZGRyX21heCA9IDA7CgkJaWYgKHN0cmxlbihwa3RfZGV2LT5zcmNfbWluKSA9PSAwKSB7CgkJCQoJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7IAoKCQkJcmN1X3JlYWRfbG9jaygpOwoJCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQocGt0X2Rldi0+b2Rldik7CgkJCWlmIChpbl9kZXYpIHsKCQkJCWlmIChpbl9kZXYtPmlmYV9saXN0KSB7CgkJCQkJcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2FkZHJlc3M7CgkJCQkJcGt0X2Rldi0+c2FkZHJfbWF4ID0gcGt0X2Rldi0+c2FkZHJfbWluOwoJCQkJfQoJCQkJX19pbl9kZXZfcHV0KGluX2Rldik7CQoJCQl9CgkJCXJjdV9yZWFkX3VubG9jaygpOwoJCX0KCQllbHNlIHsKCQkJcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWluKTsKCQkJcGt0X2Rldi0+c2FkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWF4KTsKCQl9CgoJCXBrdF9kZXYtPmRhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+ZHN0X21pbik7CgkJcGt0X2Rldi0+ZGFkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWF4KTsKCX0KICAgICAgICAvKiBJbml0aWFsaXplIGN1cnJlbnQgdmFsdWVzLiAqLwogICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CiAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIgPSBwa3RfZGV2LT5zYWRkcl9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+ZGFkZHJfbWluOwogICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gcGt0X2Rldi0+dWRwX2RzdF9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSBwa3RfZGV2LT51ZHBfc3JjX21pbjsKCXBrdF9kZXYtPm5mbG93cyA9IDA7Cn0KCnN0YXRpYyB2b2lkIHNwaW4oc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsIF9fdTY0IHNwaW5fdW50aWxfdXMpCnsKCV9fdTY0IHN0YXJ0OwoJX191NjQgbm93OwoKCXN0YXJ0ID0gbm93ID0gZ2V0Q3VyVXMoKTsKCXByaW50ayhLRVJOX0lORk8gInNsZWVwaW5nIGZvciAlZFxuIiwgKGludCkoc3Bpbl91bnRpbF91cyAtIG5vdykpOwoJd2hpbGUgKG5vdyA8IHNwaW5fdW50aWxfdXMpIHsKCQkvKiBUT0RPOiBvcHRpbWlzZSBzbGVlcGluZyBiZWhhdmlvciAqLwoJCWlmIChzcGluX3VudGlsX3VzIC0gbm93ID4gKDEwMDAwMDAvSFopKzEpIHsKCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CgkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CgkJfSBlbHNlIGlmIChzcGluX3VudGlsX3VzIC0gbm93ID4gMTAwKSB7CgkJCWRvX3NvZnRpcnEoKTsKCQkJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKQoJCQkJcmV0dXJuOwoJCQlpZiAobmVlZF9yZXNjaGVkKCkpCgkJCQlzY2hlZHVsZSgpOwoJCX0KCgkJbm93ID0gZ2V0Q3VyVXMoKTsKCX0KCglwa3RfZGV2LT5pZGxlX2FjYyArPSBub3cgLSBzdGFydDsKfQoKCi8qIEluY3JlbWVudC9yYW5kb21pemUgaGVhZGVycyBhY2NvcmRpbmcgdG8gZmxhZ3MgYW5kIGN1cnJlbnQgdmFsdWVzCiAqIGZvciBJUCBzcmMvZGVzdCwgVURQIHNyYy9kc3QgcG9ydCwgTUFDLUFkZHIgc3JjL2RzdAogKi8Kc3RhdGljIHZvaWQgbW9kX2N1cl9oZWFkZXJzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSB7ICAgICAgICAKICAgICAgICBfX3UzMiBpbW47CiAgICAgICAgX191MzIgaW14OwoJaW50ICBmbG93ID0gMDsKCglpZihwa3RfZGV2LT5jZmxvd3MpICB7CgkJZmxvdyA9IHBrdGdlbl9yYW5kb20oKSAlIHBrdF9kZXYtPmNmbG93czsKCQkKCQlpZiAocGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgPiBwa3RfZGV2LT5sZmxvdykKCQkJcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgPSAwOwoJfQkJCQkJCQoKCgkvKiAgRGVhbCB3aXRoIHNvdXJjZSBNQUMgKi8KICAgICAgICBpZiAocGt0X2Rldi0+c3JjX21hY19jb3VudCA+IDEpIHsKICAgICAgICAgICAgICAgIF9fdTMyIG1jOwogICAgICAgICAgICAgICAgX191MzIgdG1wOwoKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDU1JDX1JORCkgCiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPnNyY19tYWNfY291bnQpOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPiBwa3RfZGV2LT5zcmNfbWFjX2NvdW50KSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRtcCA9IHBrdF9kZXYtPnNyY19tYWNbNV0gKyAobWMgJiAweEZGKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzExXSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsxMF0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+c3JjX21hY1szXSArICgobWMgPj4gMTYpICYgMHhGRikgKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzldID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPnNyY19tYWNbMl0gKyAoKG1jID4+IDI0KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs4XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzFdICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs3XSA9IHRtcDsgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgLyogIERlYWwgd2l0aCBEZXN0aW5hdGlvbiBNQUMgKi8KICAgICAgICBpZiAocGt0X2Rldi0+ZHN0X21hY19jb3VudCA+IDEpIHsKICAgICAgICAgICAgICAgIF9fdTMyIG1jOwogICAgICAgICAgICAgICAgX191MzIgdG1wOwoKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDRFNUX1JORCkgCiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPmRzdF9tYWNfY291bnQpOwoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCsrOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID4gcGt0X2Rldi0+ZHN0X21hY19jb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0bXAgPSBwa3RfZGV2LT5kc3RfbWFjWzVdICsgKG1jICYgMHhGRik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs1XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs0XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzNdICsgKChtYyA+PiAxNikgJiAweEZGKSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbM10gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+ZHN0X21hY1syXSArICgobWMgPj4gMjQpICYgMHhGRikgKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzJdID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbMV0gKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzFdID0gdG1wOyAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBpZiAocGt0X2Rldi0+dWRwX3NyY19taW4gPCBwa3RfZGV2LT51ZHBfc3JjX21heCkgewogICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT51ZHBfc3JjX21heCAtIHBrdF9kZXYtPnVkcF9zcmNfbWluKSkgKyBwa3RfZGV2LT51ZHBfc3JjX21pbik7CgogICAgICAgICAgICAgICAgZWxzZSB7CgkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjKys7CgkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX3NyYyA+PSBwa3RfZGV2LT51ZHBfc3JjX21heCkKCQkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjID0gcGt0X2Rldi0+dWRwX3NyY19taW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocGt0X2Rldi0+dWRwX2RzdF9taW4gPCBwa3RfZGV2LT51ZHBfZHN0X21heCkgewogICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBEU1RfUk5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+dWRwX2RzdF9tYXggLSBwa3RfZGV2LT51ZHBfZHN0X21pbikpICsgcGt0X2Rldi0+dWRwX2RzdF9taW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgkJCXBrdF9kZXYtPmN1cl91ZHBfZHN0Kys7CgkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX2RzdCA+PSBwa3RfZGV2LT51ZHBfZHN0X21heCkgCgkJCQlwa3RfZGV2LT5jdXJfdWRwX2RzdCA9IHBrdF9kZXYtPnVkcF9kc3RfbWluOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCglpZiAoIShwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikpIHsKCgkJaWYgKChpbW4gPSBudG9obChwa3RfZGV2LT5zYWRkcl9taW4pKSA8IChpbXggPSBudG9obChwa3RfZGV2LT5zYWRkcl9tYXgpKSkgewoJCQlfX3UzMiB0OwoJCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQU1JDX1JORCkgCgkJCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSkgKyBpbW4pOwoJCQllbHNlIHsKCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfc2FkZHIpOwoJCQkJdCsrOwoJCQkJaWYgKHQgPiBpbXgpIHsKCQkJCQl0ID0gaW1uOwoJCQkJfQoJCQl9CgkJCXBrdF9kZXYtPmN1cl9zYWRkciA9IGh0b25sKHQpOwoJCX0KCQkKCQlpZiAocGt0X2Rldi0+Y2Zsb3dzICYmIHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ICE9IDApIHsKCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+Zmxvd3NbZmxvd10uY3VyX2RhZGRyOwoJCX0gZWxzZSB7CgoJCQlpZiAoKGltbiA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21pbikpIDwgKGlteCA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21heCkpKSB7CgkJCQlfX3UzMiB0OwoJCQkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUERTVF9STkQpIHsKCgkJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsgaW1uKTsKCQkJCQl0ID0gaHRvbmwodCk7CgoJCQkJCXdoaWxlKCBMT09QQkFDSyh0KSB8fCBNVUxUSUNBU1QodCkgfHwgQkFEQ0xBU1ModCkgfHwgWkVST05FVCh0KSB8fCAgTE9DQUxfTUNBU1QodCkgKSB7CgkJCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArIGltbik7CgkJCQkJCXQgPSBodG9ubCh0KTsKCQkJCQl9CgkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gdDsKCQkJCX0KCQkJCQoJCQkJZWxzZSB7CgkJCQkJdCA9IG50b2hsKHBrdF9kZXYtPmN1cl9kYWRkcik7CgkJCQkJdCsrOwoJCQkJCWlmICh0ID4gaW14KSB7CgkJCQkJCXQgPSBpbW47CgkJCQkJfQoJCQkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IGh0b25sKHQpOwoJCQkJfQoJCQl9CgkJCWlmKHBrdF9kZXYtPmNmbG93cykgewkKCQkJCXBrdF9kZXYtPmZsb3dzW2Zsb3ddLmN1cl9kYWRkciA9IHBrdF9kZXYtPmN1cl9kYWRkcjsKCQkJCXBrdF9kZXYtPm5mbG93cysrOwoJCQl9CgkJfQoJfQoJZWxzZSAvKiBJUFY2ICogKi8KCXsKCQlpZihwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlswXSA9PSAwICYmCgkJICAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbMV0gPT0gMCAmJgoJCSAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyWzJdID09IDAgJiYKCQkgICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlszXSA9PSAwKTsKCQllbHNlIHsKCQkJaW50IGk7CgoJCQkvKiBPbmx5IHJhbmRvbSBkZXN0aW5hdGlvbnMgeWV0ICovCgoJCQlmb3IoaT0wOyBpIDwgNDsgaSsrKSB7CgkJCQlwa3RfZGV2LT5jdXJfaW42X2RhZGRyLnM2X2FkZHIzMltpXSA9CgkJCQkJKChwa3RnZW5fcmFuZG9tKCkgfAoJCQkJCSAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbaV0pICYKCQkJCQkgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyMzJbaV0pOwoJCQl9CiAJCX0KCX0KCiAgICAgICAgaWYgKHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA8IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkgewogICAgICAgICAgICAgICAgX191MzIgdDsKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVFhTSVpFX1JORCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+bWF4X3BrdF9zaXplIC0gcGt0X2Rldi0+bWluX3BrdF9zaXplKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCQkJdCA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDE7CgkJCWlmICh0ID4gcGt0X2Rldi0+bWF4X3BrdF9zaXplKSAKCQkJCXQgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB0OwogICAgICAgIH0KCglwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCsrOwp9CgoKc3RhdGljIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldF9pcHY0KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKCV9fdTggKmV0aDsKCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CglpbnQgZGF0YWxlbiwgaXBsZW47CglzdHJ1Y3QgaXBoZHIgKmlwaDsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2hkciAqcGdoID0gTlVMTDsKICAgICAgICAKCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKSB7CgkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglza2JfcmVzZXJ2ZShza2IsIDE2KTsKCgkvKiAgUmVzZXJ2ZSBmb3IgZXRoZXJuZXQgYW5kIElQIGhlYWRlciAgKi8KCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwoJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7Cgl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKCiAgICAgICAgLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKICAgICAgICAgKiBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwoKCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CgkqKHUxNiopJmV0aFsxMl0gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKCglkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLSAyMCAtIDg7IC8qIEV0aCArIElQaCArIFVEUGggKi8KCWlmIChkYXRhbGVuIDwgc2l6ZW9mKHN0cnVjdCBwa3RnZW5faGRyKSkgCgkJZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcik7CiAgICAgICAgCgl1ZHBoLT5zb3VyY2UgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX3NyYyk7Cgl1ZHBoLT5kZXN0ID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9kc3QpOwoJdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbiArIDgpOyAvKiBEQVRBICsgdWRwaGRyICovCgl1ZHBoLT5jaGVjayA9IDA7ICAvKiBObyBjaGVja3N1bSAqLwoKCWlwaC0+aWhsID0gNTsKCWlwaC0+dmVyc2lvbiA9IDQ7CglpcGgtPnR0bCA9IDMyOwoJaXBoLT50b3MgPSAwOwoJaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOyAvKiBVRFAgKi8KCWlwaC0+c2FkZHIgPSBwa3RfZGV2LT5jdXJfc2FkZHI7CglpcGgtPmRhZGRyID0gcGt0X2Rldi0+Y3VyX2RhZGRyOwoJaXBoLT5mcmFnX29mZiA9IDA7CglpcGxlbiA9IDIwICsgOCArIGRhdGFsZW47CglpcGgtPnRvdF9sZW4gPSBodG9ucyhpcGxlbik7CglpcGgtPmNoZWNrID0gMDsKCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHZvaWQgKikgaXBoLCBpcGgtPmlobCk7Cglza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7Cglza2ItPm1hYy5yYXcgPSAoKHU4ICopaXBoKSAtIDE0OwoJc2tiLT5kZXYgPSBvZGV2OwoJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwoKCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkgCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CgllbHNlIHsKCQlpbnQgZnJhZ3MgPSBwa3RfZGV2LT5uZnJhZ3M7CgkJaW50IGk7CgogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyKikoKChjaGFyKikodWRwaCkpICsgOCk7CiAgICAgICAgICAgICAgICAKCQlpZiAoZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKQoJCQlmcmFncyA9IE1BWF9TS0JfRlJBR1M7CgkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKCQkJc2tiX3B1dChza2IsIGRhdGFsZW4tZnJhZ3MqUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiA9IGZyYWdzKlBBR0VfU0laRTsKCQl9CgoJCWkgPSAwOwoJCXdoaWxlIChkYXRhbGVuID4gMCkgewoJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIDApOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBwYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0KCQkJCShkYXRhbGVuIDwgUEFHRV9TSVpFID8gZGF0YWxlbiA6IFBBR0VfU0laRSk7CgkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmxlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+ZGF0YV9sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCgkJd2hpbGUgKGkgPCBmcmFncykgewoJCQlpbnQgcmVtOwoKCQkJaWYgKGkgPT0gMCkKCQkJCWJyZWFrOwoKCQkJcmVtID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAvIDI7CgkJCWlmIChyZW0gPT0gMCkKCQkJCWJyZWFrOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAtPSByZW07CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CgkJCWdldF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0gcmVtOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCX0KCiAgICAgICAgLyogU3RhbXAgdGhlIHRpbWUsIGFuZCBzZXF1ZW5jZSBudW1iZXIsIGNvbnZlcnQgdGhlbSB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KCiAgICAgICAgaWYgKHBnaCkgewogICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKCSAgICAgIAoJICAgICAgcGdoLT5wZ2hfbWFnaWMgPSBodG9ubChQS1RHRU5fTUFHSUMpOwoJICAgICAgcGdoLT5zZXFfbnVtICAgPSBodG9ubChwa3RfZGV2LT5zZXFfbnVtKTsKCSAgICAgIAoJICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1lc3RhbXApOwoJICAgICAgcGdoLT50dl9zZWMgICAgPSBodG9ubCh0aW1lc3RhbXAudHZfc2VjKTsKCSAgICAgIHBnaC0+dHZfdXNlYyAgID0gaHRvbmwodGltZXN0YW1wLnR2X3VzZWMpOwogICAgICAgIH0KICAgICAgICBwa3RfZGV2LT5zZXFfbnVtKys7CiAgICAgICAgCglyZXR1cm4gc2tiOwp9CgovKgogKiBzY2FuX2lwNiwgZm10X2lwIHRha2VuIGZyb20gZGlldGxpYmMtMC4yMSAKICogQXV0aG9yIEZlbGl4IHZvbiBMZWl0bmVyIDxmZWxpeC1kaWV0bGliY0BmZWZlLmRlPgogKgogKiBTbGlnaHRseSBtb2RpZmllZCBmb3Iga2VybmVsLiAKICogU2hvdWxkIGJlIGNhbmRpZGF0ZSBmb3IgbmV0L2lwdjQvdXRpbHMuYwogKiAtLXJvCiAqLwoKc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2lwNihjb25zdCBjaGFyICpzLGNoYXIgaXBbMTZdKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXVuc2lnbmVkIGludCBsZW49MDsKCXVuc2lnbmVkIGxvbmcgdTsKCWNoYXIgc3VmZml4WzE2XTsKCXVuc2lnbmVkIGludCBwcmVmaXhsZW49MDsKCXVuc2lnbmVkIGludCBzdWZmaXhsZW49MDsKCV9fdTMyIHRtcDsKCglmb3IgKGk9MDsgaTwxNjsgaSsrKSBpcFtpXT0wOwoKCWZvciAoOzspIHsKCQlpZiAoKnMgPT0gJzonKSB7CgkJCWxlbisrOwoJCQlpZiAoc1sxXSA9PSAnOicpIHsgICAgICAgIC8qIEZvdW5kICI6OiIsIHNraXAgdG8gcGFydCAyICovCgkJCQlzKz0yOwoJCQkJbGVuKys7CgkJCQlicmVhazsKCQkJfQoJCQlzKys7CgkJfQoJCXsKCQkJY2hhciAqdG1wOwoJCQl1PXNpbXBsZV9zdHJ0b3VsKHMsJnRtcCwxNik7CgkJCWk9dG1wLXM7CgkJfQoKCQlpZiAoIWkpIHJldHVybiAwOwoJCWlmIChwcmVmaXhsZW49PTEyICYmIHNbaV09PScuJykgewoKCQkJLyogdGhlIGxhc3QgNCBieXRlcyBtYXkgYmUgd3JpdHRlbiBhcyBJUHY0IGFkZHJlc3MgKi8KCgkJCXRtcCA9IGluX2F0b24ocyk7CgkJCW1lbWNweSgoc3RydWN0IGluX2FkZHIqKShpcCsxMiksICZ0bXAsIHNpemVvZih0bXApKTsKCQkJcmV0dXJuIGkrbGVuOwoJCX0KCQlpcFtwcmVmaXhsZW4rK10gPSAodSA+PiA4KTsKCQlpcFtwcmVmaXhsZW4rK10gPSAodSAmIDI1NSk7CgkJcyArPSBpOyBsZW4gKz0gaTsKCQlpZiAocHJlZml4bGVuPT0xNikKCQkJcmV0dXJuIGxlbjsKCX0KCi8qIHBhcnQgMiwgYWZ0ZXIgIjo6IiAqLwoJZm9yICg7OykgewoJCWlmICgqcyA9PSAnOicpIHsKCQkJaWYgKHN1ZmZpeGxlbj09MCkKCQkJCWJyZWFrOwoJCQlzKys7CgkJCWxlbisrOwoJCX0gZWxzZSBpZiAoc3VmZml4bGVuIT0wKQoJCQlicmVhazsKCQl7CgkJCWNoYXIgKnRtcDsKCQkJdT1zaW1wbGVfc3RydG9sKHMsJnRtcCwxNik7CgkJCWk9dG1wLXM7CgkJfQoJCWlmICghaSkgewoJCQlpZiAoKnMpIGxlbi0tOwoJCQlicmVhazsKCQl9CgkJaWYgKHN1ZmZpeGxlbitwcmVmaXhsZW48PTEyICYmIHNbaV09PScuJykgewoJCQl0bXAgPSBpbl9hdG9uKHMpOwoJCQltZW1jcHkoKHN0cnVjdCBpbl9hZGRyKikoc3VmZml4K3N1ZmZpeGxlbiksICZ0bXAsIHNpemVvZih0bXApKTsKCQkJc3VmZml4bGVuKz00OwoJCQlsZW4rPXN0cmxlbihzKTsKCQkJYnJlYWs7CgkJfQoJCXN1ZmZpeFtzdWZmaXhsZW4rK10gPSAodSA+PiA4KTsKCQlzdWZmaXhbc3VmZml4bGVuKytdID0gKHUgJiAyNTUpOwoJCXMgKz0gaTsgbGVuICs9IGk7CgkJaWYgKHByZWZpeGxlbitzdWZmaXhsZW49PTE2KQoJCQlicmVhazsKCX0KCWZvciAoaT0wOyBpPHN1ZmZpeGxlbjsgaSsrKQoJCWlwWzE2LXN1ZmZpeGxlbitpXSA9IHN1ZmZpeFtpXTsKCXJldHVybiBsZW47Cn0KCnN0YXRpYyBjaGFyIHRvaGV4KGNoYXIgaGV4ZGlnaXQpIHsKCXJldHVybiBoZXhkaWdpdD45P2hleGRpZ2l0KydhJy0xMDpoZXhkaWdpdCsnMCc7Cn0KCnN0YXRpYyBpbnQgZm10X3hsb25nKGNoYXIqIHMsdW5zaWduZWQgaW50IGkpIHsKCWNoYXIqIGJhaz1zOwoJKnM9dG9oZXgoKGk+PjEyKSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KChpPj44KSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KChpPj40KSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KGkmMHhmKTsKCXJldHVybiBzLWJhaysxOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGZtdF9pcDYoY2hhciAqcyxjb25zdCBjaGFyIGlwWzE2XSkgewoJdW5zaWduZWQgaW50IGxlbjsKCXVuc2lnbmVkIGludCBpOwoJdW5zaWduZWQgaW50IHRlbXA7Cgl1bnNpZ25lZCBpbnQgY29tcHJlc3Npbmc7CglpbnQgajsKCglsZW4gPSAwOyBjb21wcmVzc2luZyA9IDA7Cglmb3IgKGo9MDsgajwxNjsgais9MikgewoKI2lmZGVmIFY0TUFQUEVEUFJFRklYCgkJaWYgKGo9PTEyICYmICFtZW1jbXAoaXAsVjRtYXBwZWRwcmVmaXgsMTIpKSB7CgkJCWluZXRfbnRvYV9yKCooc3RydWN0IGluX2FkZHIqKShpcCsxMikscyk7CgkJCXRlbXA9c3RybGVuKHMpOwoJCQlyZXR1cm4gbGVuK3RlbXA7CgkJfQojZW5kaWYKCQl0ZW1wID0gKCh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgY2hhcikgaXBbal0gPDwgOCkgKwoJCQkodW5zaWduZWQgbG9uZykgKHVuc2lnbmVkIGNoYXIpIGlwW2orMV07CgkJaWYgKHRlbXAgPT0gMCkgewoJCQlpZiAoIWNvbXByZXNzaW5nKSB7CgkJCQljb21wcmVzc2luZz0xOwoJCQkJaWYgKGo9PTApIHsKCQkJCQkqcysrPSc6JzsgKytsZW47CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoY29tcHJlc3NpbmcpIHsKCQkJCWNvbXByZXNzaW5nPTA7CgkJCQkqcysrPSc6JzsgKytsZW47CgkJCX0KCQkJaSA9IGZtdF94bG9uZyhzLHRlbXApOyBsZW4gKz0gaTsgcyArPSBpOwoJCQlpZiAoajwxNCkgewoJCQkJKnMrKyA9ICc6JzsKCQkJCSsrbGVuOwoJCQl9CgkJfQoJfQoJaWYgKGNvbXByZXNzaW5nKSB7CgkJKnMrKz0nOic7ICsrbGVuOwoJfQoJKnM9MDsKCXJldHVybiBsZW47Cn0KCnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZmlsbF9wYWNrZXRfaXB2NihzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCgkJCQkgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CglfX3U4ICpldGg7CglzdHJ1Y3QgdWRwaGRyICp1ZHBoOwoJaW50IGRhdGFsZW47CglzdHJ1Y3QgaXB2NmhkciAqaXBoOwogICAgICAgIHN0cnVjdCBwa3RnZW5faGRyICpwZ2ggPSBOVUxMOwogICAgICAgIAoJc2tiID0gYWxsb2Nfc2tiKHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgMTYsIEdGUF9BVE9NSUMpOwoJaWYgKCFza2IpIHsKCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwoJCXJldHVybiBOVUxMOwoJfQoKCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwoKCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLwoJZXRoID0gKF9fdTggKikgc2tiX3B1c2goc2tiLCAxNCk7CglpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Cgl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKCgogICAgICAgIC8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCiAgICAgICAgICogZmllbGRzLgogICAgICAgICAqLwoJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwoKCQoJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKCSoodTE2KikmZXRoWzEyXSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CgkKICAgICAgICAKCWRhdGFsZW4gPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUtMTQtIAoJCXNpemVvZihzdHJ1Y3QgaXB2Nmhkciktc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOyAvKiBFdGggKyBJUGggKyBVRFBoICovCgoJaWYgKGRhdGFsZW4gPCBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpKSB7IAoJCWRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpOwoJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCgkJCXByaW50ayhLRVJOX0lORk8gInBrdGdlbjogaW5jcmVhc2VkIGRhdGFsZW4gdG8gJWRcbiIsIGRhdGFsZW4pOwoJfQoKCXVkcGgtPnNvdXJjZSA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7Cgl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsgCgl1ZHBoLT5jaGVjayA9IDA7ICAvKiBObyBjaGVja3N1bSAqLwoKCSAqKHUzMiopaXBoID0gX19jb25zdGFudF9odG9ubCgweDYwMDAwMDAwKTsgLyogVmVyc2lvbiArIGZsb3cgKi8KCglpcGgtPmhvcF9saW1pdCA9IDMyOwoKCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBkYXRhbGVuKTsKCWlwaC0+bmV4dGhkciA9IElQUFJPVE9fVURQOwoKCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9kYWRkcik7CglpcHY2X2FkZHJfY29weSgmaXBoLT5zYWRkciwgJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIpOwoKCXNrYi0+bWFjLnJhdyA9ICgodTggKilpcGgpIC0gMTQ7Cglza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKCXNrYi0+ZGV2ID0gb2RldjsKCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKCglpZiAocGt0X2Rldi0+bmZyYWdzIDw9IDApIAogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopc2tiX3B1dChza2IsIGRhdGFsZW4pOwoJZWxzZSB7CgkJaW50IGZyYWdzID0gcGt0X2Rldi0+bmZyYWdzOwoJCWludCBpOwoKICAgICAgICAgICAgICAgIHBnaCA9IChzdHJ1Y3QgcGt0Z2VuX2hkciopKCgoY2hhciopKHVkcGgpKSArIDgpOwogICAgICAgICAgICAgICAgCgkJaWYgKGZyYWdzID4gTUFYX1NLQl9GUkFHUykKCQkJZnJhZ3MgPSBNQVhfU0tCX0ZSQUdTOwoJCWlmIChkYXRhbGVuID4gZnJhZ3MqUEFHRV9TSVpFKSB7CgkJCXNrYl9wdXQoc2tiLCBkYXRhbGVuLWZyYWdzKlBBR0VfU0laRSk7CgkJCWRhdGFsZW4gPSBmcmFncypQQUdFX1NJWkU7CgkJfQoKCQlpID0gMDsKCQl3aGlsZSAoZGF0YWxlbiA+IDApIHsKCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAwKTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlID0gcGFnZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCA9IDA7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9CgkJCQkoZGF0YWxlbiA8IFBBR0VfU0laRSA/IGRhdGFsZW4gOiBQQUdFX1NJWkUpOwoJCQlkYXRhbGVuIC09IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJc2tiLT5sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmRhdGFfbGVuICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJaSsrOwoJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKCQl9CgoJCXdoaWxlIChpIDwgZnJhZ3MpIHsKCQkJaW50IHJlbTsKCgkJCWlmIChpID09IDApCgkJCQlicmVhazsKCgkJCXJlbSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLyAyOwoJCQlpZiAocmVtID09IDApCgkJCQlicmVhazsKCgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLT0gcmVtOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdOwoJCQlnZXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UpOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5wYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemU7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9IHJlbTsKCQkJaSsrOwoJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKCQl9Cgl9CgogICAgICAgIC8qIFN0YW1wIHRoZSB0aW1lLCBhbmQgc2VxdWVuY2UgbnVtYmVyLCBjb252ZXJ0IHRoZW0gdG8gbmV0d29yayBieXRlIG9yZGVyICovCgkvKiBzaG91bGQgd2UgdXBkYXRlIGNsb25lZCBwYWNrZXRzIHRvbyA/ICovCiAgICAgICAgaWYgKHBnaCkgewogICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKCSAgICAgIAoJICAgICAgcGdoLT5wZ2hfbWFnaWMgPSBodG9ubChQS1RHRU5fTUFHSUMpOwoJICAgICAgcGdoLT5zZXFfbnVtICAgPSBodG9ubChwa3RfZGV2LT5zZXFfbnVtKTsKCSAgICAgIAoJICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1lc3RhbXApOwoJICAgICAgcGdoLT50dl9zZWMgICAgPSBodG9ubCh0aW1lc3RhbXAudHZfc2VjKTsKCSAgICAgIHBnaC0+dHZfdXNlYyAgID0gaHRvbmwodGltZXN0YW1wLnR2X3VzZWMpOwogICAgICAgIH0KICAgICAgICBwa3RfZGV2LT5zZXFfbnVtKys7CiAgICAgICAgCglyZXR1cm4gc2tiOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCgkJCQkgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIAoJCXJldHVybiBmaWxsX3BhY2tldF9pcHY2KG9kZXYsIHBrdF9kZXYpOwoJZWxzZQoJCXJldHVybiBmaWxsX3BhY2tldF9pcHY0KG9kZXYsIHBrdF9kZXYpOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CiAgICAgICAgcGt0X2Rldi0+c2VxX251bSA9IDE7CiAgICAgICAgcGt0X2Rldi0+aWRsZV9hY2MgPSAwOwoJcGt0X2Rldi0+c29mYXIgPSAwOwogICAgICAgIHBrdF9kZXYtPnR4X2J5dGVzID0gMDsKICAgICAgICBwa3RfZGV2LT5lcnJvcnMgPSAwOwp9CgovKiBTZXQgdXAgc3RydWN0dXJlIGZvciBzZW5kaW5nIHBrdHMsIGNsZWFyIGNvdW50ZXJzICovCgpzdGF0aWMgdm9pZCBwa3RnZW5fcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoJaW50IHN0YXJ0ZWQgPSAwOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuLiAlcFxuIiwgdCkpOwoKCWlmX2xvY2sodCk7CiAgICAgICAgZm9yIChwa3RfZGV2ID0gdC0+aWZfbGlzdDsgcGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQgKSB7CgoJCS8qCgkJICogc2V0dXAgb2RldiBhbmQgY3JlYXRlIGluaXRpYWwgcGFja2V0LgoJCSAqLwoJCXBrdGdlbl9zZXR1cF9pbmplY3QocGt0X2Rldik7CgoJCWlmKHBrdF9kZXYtPm9kZXYpIHsgCgkJCXBrdGdlbl9jbGVhcl9jb3VudGVycyhwa3RfZGV2KTsKCQkJcGt0X2Rldi0+cnVubmluZyA9IDE7IC8qIENyYW5rZSB5ZXNlbGYhICovCgkJCXBrdF9kZXYtPnNrYiA9IE5VTEw7CgkJCXBrdF9kZXYtPnN0YXJ0ZWRfYXQgPSBnZXRDdXJVcygpOwoJCQlwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKTsgLyogVHJhbnNtaXQgaW1tZWRpYXRlbHkgKi8KCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgkJCQoJCQlzdHJjcHkocGt0X2Rldi0+cmVzdWx0LCAiU3RhcnRpbmciKTsKCQkJc3RhcnRlZCsrOwoJCX0KCQllbHNlIAoJCQlzdHJjcHkocGt0X2Rldi0+cmVzdWx0LCAiRXJyb3Igc3RhcnRpbmciKTsKCX0KCWlmX3VubG9jayh0KTsKCWlmKHN0YXJ0ZWQpIHQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnModm9pZCkKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gcGt0Z2VuX3RocmVhZHM7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzLlxuIikpOwoKCXRocmVhZF9sb2NrKCk7Cgl3aGlsZSh0KSB7CgkJcGt0Z2VuX3N0b3AodCk7CgkJdCA9IHQtPm5leHQ7Cgl9CiAgICAgICB0aHJlYWRfdW5sb2NrKCk7Cn0KCnN0YXRpYyBpbnQgdGhyZWFkX2lzX3J1bm5pbmcoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQ7CiAgICAgICAgaW50IHJlcyA9IDA7CgogICAgICAgIGZvcihuZXh0PXQtPmlmX2xpc3Q7IG5leHQ7IG5leHQ9bmV4dC0+bmV4dCkgeyAKCQlpZihuZXh0LT5ydW5uaW5nKSB7CgkJCXJlcyA9IDE7CgkJCWJyZWFrOwoJCX0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKfQoKc3RhdGljIGludCBwa3RnZW5fd2FpdF90aHJlYWRfcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKewogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIHdoaWxlKHRocmVhZF9pc19ydW5uaW5nKHQpKSB7CgogICAgICAgICAgICAgICAgaWZfdW5sb2NrKHQpOwoKCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOyAKCiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNpZ25hbDsKICAgICAgICAgICAgICAgIGlmX2xvY2sodCk7CiAgICAgICAgfQogICAgICAgIGlmX3VubG9jayh0KTsKICAgICAgICByZXR1cm4gMTsKIHNpZ25hbDoKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBwa3RnZW5fd2FpdF9hbGxfdGhyZWFkc19ydW4odm9pZCkKewoJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCWludCBzaWcgPSAxOwoJCgl3aGlsZSAodCkgewoJCXNpZyA9IHBrdGdlbl93YWl0X3RocmVhZF9ydW4odCk7CgkJaWYoIHNpZyA9PSAwICkgYnJlYWs7CgkJdGhyZWFkX2xvY2soKTsKCQl0PXQtPm5leHQ7CgkJdGhyZWFkX3VubG9jaygpOwoJfQoJaWYoc2lnID09IDApIHsKCQl0aHJlYWRfbG9jaygpOwoJCXdoaWxlICh0KSB7CgkJCXQtPmNvbnRyb2wgfD0gKFRfU1RPUCk7CgkJCXQ9dC0+bmV4dDsKCQl9CgkJdGhyZWFkX3VubG9jaygpOwoJfQoJcmV0dXJuIHNpZzsKfQoKc3RhdGljIHZvaWQgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcyh2b2lkKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcy5cbiIpKTsKCgl0aHJlYWRfbG9jaygpOwoKCXdoaWxlKHQpIHsKCQl0LT5jb250cm9sIHw9IChUX1JVTik7CgkJdCA9IHQtPm5leHQ7Cgl9Cgl0aHJlYWRfdW5sb2NrKCk7CgoJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CglzY2hlZHVsZV90aW1lb3V0KEhaLzgpOyAgLyogUHJvcGFnYXRlIHRocmVhZC0+Y29udHJvbCAgKi8KCQkJCglwa3RnZW5fd2FpdF9hbGxfdGhyZWFkc19ydW4oKTsKfQoKCnN0YXRpYyB2b2lkIHNob3dfcmVzdWx0cyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwgaW50IG5yX2ZyYWdzKQp7CiAgICAgICBfX3U2NCB0b3RhbF91cywgYnBzLCBtYnBzLCBwcHMsIGlkbGU7CiAgICAgICBjaGFyICpwID0gcGt0X2Rldi0+cmVzdWx0OwoKICAgICAgIHRvdGFsX3VzID0gcGt0X2Rldi0+c3RvcHBlZF9hdCAtIHBrdF9kZXYtPnN0YXJ0ZWRfYXQ7CgogICAgICAgaWRsZSA9IHBrdF9kZXYtPmlkbGVfYWNjOwoKICAgICAgIHAgKz0gc3ByaW50ZihwLCAiT0s6ICVsbHUoYyVsbHUrZCVsbHUpIHVzZWMsICVsbHUgKCVkYnl0ZSwlZGZyYWdzKVxuIiwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0b3RhbF91cywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHRvdGFsX3VzIC0gaWRsZSksIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBpZGxlLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPnNvZmFyLCAKCQkgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplLCBucl9mcmFncyk7CgogICAgICAgcHBzID0gcGt0X2Rldi0+c29mYXIgKiBVU0VDX1BFUl9TRUM7CgogICAgICAgd2hpbGUgKCh0b3RhbF91cyA+PiAzMikgIT0gMCkgewogICAgICAgICAgICAgICBwcHMgPj49IDE7CiAgICAgICAgICAgICAgIHRvdGFsX3VzID4+PSAxOwogICAgICAgfQoKICAgICAgIGRvX2RpdihwcHMsIHRvdGFsX3VzKTsKICAgICAgIAogICAgICAgYnBzID0gcHBzICogOCAqIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZTsKCiAgICAgICBtYnBzID0gYnBzOwogICAgICAgZG9fZGl2KG1icHMsIDEwMDAwMDApOwogICAgICAgcCArPSBzcHJpbnRmKHAsICIgICVsbHVwcHMgJWxsdU1iL3NlYyAoJWxsdWJwcykgZXJyb3JzOiAlbGx1IiwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwcHMsIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBtYnBzLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYnBzLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+ZXJyb3JzKTsKfQogCgovKiBTZXQgc3RvcHBlZC1hdCB0aW1lciwgcmVtb3ZlIGZyb20gcnVubmluZyBsaXN0LCBkbyBjb3VudGVycyAmIHN0YXRpc3RpY3MgKi8KCnN0YXRpYyBpbnQgcGt0Z2VuX3N0b3BfZGV2aWNlKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSAKewoJCiAgICAgICAgaWYgKCFwa3RfZGV2LT5ydW5uaW5nKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogaW50ZXJmYWNlOiAlcyBpcyBhbHJlYWR5IHN0b3BwZWRcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CgogICAgICAgIHBrdF9kZXYtPnN0b3BwZWRfYXQgPSBnZXRDdXJVcygpOwogICAgICAgIHBrdF9kZXYtPnJ1bm5pbmcgPSAwOwoKCXNob3dfcmVzdWx0cyhwa3RfZGV2LCBza2Jfc2hpbmZvKHBrdF9kZXYtPnNrYiktPm5yX2ZyYWdzKTsKCglpZiAocGt0X2Rldi0+c2tiKSAKCQlrZnJlZV9za2IocGt0X2Rldi0+c2tiKTsKCglwa3RfZGV2LT5za2IgPSBOVUxMOwoJCiAgICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dF90b19ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgKQp7CglzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dCwgKmJlc3QgPSBOVUxMOwogICAgICAgIAoJaWZfbG9jayh0KTsKCglmb3IobmV4dD10LT5pZl9saXN0OyBuZXh0IDsgbmV4dD1uZXh0LT5uZXh0KSB7CgkJaWYoIW5leHQtPnJ1bm5pbmcpIGNvbnRpbnVlOwoJCWlmKGJlc3QgPT0gTlVMTCkgYmVzdD1uZXh0OwoJCWVsc2UgaWYgKCBuZXh0LT5uZXh0X3R4X3VzIDwgYmVzdC0+bmV4dF90eF91cykgCgkJCWJlc3QgPSAgbmV4dDsKCX0KCWlmX3VubG9jayh0KTsKICAgICAgICByZXR1cm4gYmVzdDsKfQoKc3RhdGljIHZvaWQgcGt0Z2VuX3N0b3Aoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpIHsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dCA9IE5VTEw7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wLlxuIikpOwoKICAgICAgICBpZl9sb2NrKHQpOwoKICAgICAgICBmb3IobmV4dD10LT5pZl9saXN0OyBuZXh0OyBuZXh0PW5leHQtPm5leHQpCiAgICAgICAgICAgICAgICBwa3RnZW5fc3RvcF9kZXZpY2UobmV4dCk7CgogICAgICAgIGlmX3VubG9jayh0KTsKfQoKc3RhdGljIHZvaWQgcGt0Z2VuX3JlbV9hbGxfaWZzKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpjdXIsICpuZXh0ID0gTlVMTDsKICAgICAgICAKICAgICAgICAvKiBSZW1vdmUgYWxsIGRldmljZXMsIGZyZWUgbWVtICovCiAKICAgICAgICBpZl9sb2NrKHQpOwoKICAgICAgICBmb3IoY3VyPXQtPmlmX2xpc3Q7IGN1cjsgY3VyPW5leHQpIHsgCgkJbmV4dCA9IGN1ci0+bmV4dDsKCQlwa3RnZW5fcmVtb3ZlX2RldmljZSh0LCBjdXIpOwoJfQoKICAgICAgICBpZl91bmxvY2sodCk7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9yZW1fdGhyZWFkKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSAKewogICAgICAgIC8qIFJlbW92ZSBmcm9tIHRoZSB0aHJlYWQgbGlzdCAqLwoKCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0bXAgPSBwa3RnZW5fdGhyZWFkczsKCiAgICAgICAgaWYgKHN0cmxlbih0LT5mbmFtZSkpCiAgICAgICAgICAgICAgICByZW1vdmVfcHJvY19lbnRyeSh0LT5mbmFtZSwgTlVMTCk7CgogICAgICAgdGhyZWFkX2xvY2soKTsKCglpZiAodG1wID09IHQpCgkJcGt0Z2VuX3RocmVhZHMgPSB0bXAtPm5leHQ7CgllbHNlIHsKCQl3aGlsZSAodG1wKSB7CgkJCWlmICh0bXAtPm5leHQgPT0gdCkgewoJCQkJdG1wLT5uZXh0ID0gdC0+bmV4dDsKCQkJCXQtPm5leHQgPSBOVUxMOwoJCQkJYnJlYWs7CgkJCX0KCQkJdG1wID0gdG1wLT5uZXh0OwoJCX0KCX0KICAgICAgICB0aHJlYWRfdW5sb2NrKCk7Cn0KCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgcGt0Z2VuX3htaXQoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2ID0gTlVMTDsKCV9fdTY0IGlkbGVfc3RhcnQgPSAwOwoJaW50IHJldDsKCglvZGV2ID0gcGt0X2Rldi0+b2RldjsKCQoJaWYgKHBrdF9kZXYtPmRlbGF5X3VzIHx8IHBrdF9kZXYtPmRlbGF5X25zKSB7CgkJdTY0IG5vdzsKCgkJbm93ID0gZ2V0Q3VyVXMoKTsKCQlpZiAobm93IDwgcGt0X2Rldi0+bmV4dF90eF91cykKCQkJc3Bpbihwa3RfZGV2LCBwa3RfZGV2LT5uZXh0X3R4X3VzKTsKCgkJLyogVGhpcyBpcyBtYXggREVMQVksIHRoaXMgaGFzIHNwZWNpYWwgbWVhbmluZyBvZgoJCSAqICJuZXZlciB0cmFuc21pdCIKCQkgKi8KCQlpZiAocGt0X2Rldi0+ZGVsYXlfdXMgPT0gMHg3RkZGRkZGRikgewoJCQlwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKSArIHBrdF9kZXYtPmRlbGF5X3VzOwoJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gcGt0X2Rldi0+ZGVsYXlfbnM7CgkJCWdvdG8gb3V0OwoJCX0KCX0KCQoJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikgfHwgbmVlZF9yZXNjaGVkKCkpIHsKCQlpZGxlX3N0YXJ0ID0gZ2V0Q3VyVXMoKTsKCQkKCQlpZiAoIW5ldGlmX3J1bm5pbmcob2RldikpIHsKCQkJcGt0Z2VuX3N0b3BfZGV2aWNlKHBrdF9kZXYpOwoJCQlnb3RvIG91dDsKCQl9CgkJaWYgKG5lZWRfcmVzY2hlZCgpKSAKCQkJc2NoZWR1bGUoKTsKCQkKCQlwa3RfZGV2LT5pZGxlX2FjYyArPSBnZXRDdXJVcygpIC0gaWRsZV9zdGFydDsKCQkKCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChvZGV2KSkgewoJCQlwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKTsgLyogVE9ETyAqLwoJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKCQkJZ290byBvdXQ7IC8qIFRyeSB0aGUgbmV4dCBpbnRlcmZhY2UgKi8KCQl9Cgl9CgkKCWlmIChwa3RfZGV2LT5sYXN0X29rIHx8ICFwa3RfZGV2LT5za2IpIHsKCQlpZiAoKCsrcGt0X2Rldi0+Y2xvbmVfY291bnQgPj0gcGt0X2Rldi0+Y2xvbmVfc2tiICkgfHwgKCFwa3RfZGV2LT5za2IpKSB7CgkJCS8qIGJ1aWxkIGEgbmV3IHBrdCAqLwoJCQlpZiAocGt0X2Rldi0+c2tiKSAKCQkJCWtmcmVlX3NrYihwa3RfZGV2LT5za2IpOwoJCQkKCQkJcGt0X2Rldi0+c2tiID0gZmlsbF9wYWNrZXQob2RldiwgcGt0X2Rldik7CgkJCWlmIChwa3RfZGV2LT5za2IgPT0gTlVMTCkgewoJCQkJcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBjb3VsZG4ndCBhbGxvY2F0ZSBza2IgaW4gZmlsbF9wYWNrZXQuXG4iKTsKCQkJCXNjaGVkdWxlKCk7CgkJCQlwa3RfZGV2LT5jbG9uZV9jb3VudC0tOyAvKiBiYWNrIG91dCBpbmNyZW1lbnQsIE9PTSAqLwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJcGt0X2Rldi0+YWxsb2NhdGVkX3NrYnMrKzsKCQkJcGt0X2Rldi0+Y2xvbmVfY291bnQgPSAwOyAvKiByZXNldCBjb3VudGVyICovCgkJfQoJfQoJCglzcGluX2xvY2tfYmgoJm9kZXYtPnhtaXRfbG9jayk7CglpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikpIHsKCgkJYXRvbWljX2luYygmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKTsKcmV0cnlfbm93OgoJCXJldCA9IG9kZXYtPmhhcmRfc3RhcnRfeG1pdChwa3RfZGV2LT5za2IsIG9kZXYpOwoJCWlmIChsaWtlbHkocmV0ID09IE5FVERFVl9UWF9PSykpIHsKCQkJcGt0X2Rldi0+bGFzdF9vayA9IDE7ICAgIAoJCQlwa3RfZGV2LT5zb2ZhcisrOwoJCQlwa3RfZGV2LT5zZXFfbnVtKys7CgkJCXBrdF9kZXYtPnR4X2J5dGVzICs9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZTsKCQkJCgkJfSBlbHNlIGlmIChyZXQgPT0gTkVUREVWX1RYX0xPQ0tFRCAKCQkJICAgJiYgKG9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MTFRYKSkgewoJCQljcHVfcmVsYXgoKTsKCQkJZ290byByZXRyeV9ub3c7CgkJfSBlbHNlIHsgIC8qIFJldHJ5IGl0IG5leHQgdGltZSAqLwoJCQkKCQkJYXRvbWljX2RlYygmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKTsKCQkJCgkJCWlmIChkZWJ1ZyAmJiBuZXRfcmF0ZWxpbWl0KCkpCgkJCQlwcmludGsoS0VSTl9JTkZPICJwa3RnZW46IEhhcmQgeG1pdCBlcnJvclxuIik7CgkJCQoJCQlwa3RfZGV2LT5lcnJvcnMrKzsKCQkJcGt0X2Rldi0+bGFzdF9vayA9IDA7CgkJfQoKCQlwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKTsKCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKCgkJcGt0X2Rldi0+bmV4dF90eF91cyArPSBwa3RfZGV2LT5kZWxheV91czsKCQlwa3RfZGV2LT5uZXh0X3R4X25zICs9IHBrdF9kZXYtPmRlbGF5X25zOwoKCQlpZiAocGt0X2Rldi0+bmV4dF90eF9ucyA+IDEwMDApIHsKCQkJcGt0X2Rldi0+bmV4dF90eF91cysrOwoJCQlwa3RfZGV2LT5uZXh0X3R4X25zIC09IDEwMDA7CgkJfQoJfSAKCgllbHNlIHsgIC8qIFJldHJ5IGl0IG5leHQgdGltZSAqLwogICAgICAgICAgICAgICAgcGt0X2Rldi0+bGFzdF9vayA9IDA7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKTsgLyogVE9ETyAqLwoJCXBrdF9kZXYtPm5leHRfdHhfbnMgPSAwOwogICAgICAgIH0KCglzcGluX3VubG9ja19iaCgmb2Rldi0+eG1pdF9sb2NrKTsKCQoJLyogSWYgcGt0X2Rldi0+Y291bnQgaXMgemVybywgdGhlbiBydW4gZm9yZXZlciAqLwoJaWYgKChwa3RfZGV2LT5jb3VudCAhPSAwKSAmJiAocGt0X2Rldi0+c29mYXIgPj0gcGt0X2Rldi0+Y291bnQpKSB7CgkJaWYgKGF0b21pY19yZWFkKCYocGt0X2Rldi0+c2tiLT51c2VycykpICE9IDEpIHsKCQkJaWRsZV9zdGFydCA9IGdldEN1clVzKCk7CgkJCXdoaWxlIChhdG9taWNfcmVhZCgmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKSAhPSAxKSB7CgkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXNjaGVkdWxlKCk7CgkJCX0KCQkJcGt0X2Rldi0+aWRsZV9hY2MgKz0gZ2V0Q3VyVXMoKSAtIGlkbGVfc3RhcnQ7CgkJfQogICAgICAgICAgICAgICAgCgkJLyogRG9uZSB3aXRoIHRoaXMgKi8KCQlwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7Cgl9IAogb3V0OjsKIH0KCi8qIAogKiBNYWluIGxvb3Agb2YgdGhlIHRocmVhZCBnb2VzIGhlcmUKICovCgpzdGF0aWMgdm9pZCBwa3RnZW5fdGhyZWFkX3dvcmtlcihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCnsKCURFRklORV9XQUlUKHdhaXQpOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKCWludCBjcHUgPSB0LT5jcHU7CglzaWdzZXRfdCB0bXBzaWc7Cgl1MzIgbWF4X2JlZm9yZV9zb2Z0aXJxOwogICAgICAgIHUzMiB0eF9zaW5jZV9zb2Z0aXJxID0gMDsKCglkYWVtb25pemUoInBrdGdlbi8lZCIsIGNwdSk7CgogICAgICAgIC8qIEJsb2NrIGFsbCBzaWduYWxzIGV4Y2VwdCBTSUdLSUxMLCBTSUdTVE9QIGFuZCBTSUdURVJNICovCgogICAgICAgIHNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogICAgICAgIHRtcHNpZyA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAgICAgICAgc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYXNrKFNJR0tJTEwpIHwgCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYXNrKFNJR1NUT1ApfCAKICAgICAgICAgICAgICAgICAgICAgIHNpZ21hc2soU0lHVEVSTSkpOwoKICAgICAgICByZWNhbGNfc2lncGVuZGluZygpOwogICAgICAgIHNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CgoJLyogTWlncmF0ZSB0byB0aGUgcmlnaHQgQ1BVICovCglzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOwogICAgICAgIGlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KQogICAgICAgICAgICAgICAgQlVHKCk7CgoJaW5pdF93YWl0cXVldWVfaGVhZCgmdC0+cXVldWUpOwoKCXQtPmNvbnRyb2wgJj0gfihUX1RFUk1JTkFURSk7Cgl0LT5jb250cm9sICY9IH4oVF9SVU4pOwoJdC0+Y29udHJvbCAmPSB+KFRfU1RPUCk7Cgl0LT5jb250cm9sICY9IH4oVF9SRU1ERVYpOwoKICAgICAgICB0LT5waWQgPSBjdXJyZW50LT5waWQ7ICAgICAgICAKCiAgICAgICAgUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IHN0YXJ0aW5nIHBrdGdlbi8lZDogIHBpZD0lZFxuIiwgY3B1LCBjdXJyZW50LT5waWQpKTsKCgltYXhfYmVmb3JlX3NvZnRpcnEgPSB0LT5tYXhfYmVmb3JlX3NvZnRpcnE7CiAgICAgICAgCiAgICAgICAgX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogICAgICAgIG1iKCk7CgogICAgICAgIHdoaWxlICgxKSB7CgkJCgkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoKCQkvKgoJCSAqIEdldCBuZXh0IGRldiB0byB4bWl0IC0tIGlmIGFueS4KCQkgKi8KCiAgICAgICAgICAgICAgICBwa3RfZGV2ID0gbmV4dF90b19ydW4odCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2KSB7CgoJCQlwa3RnZW5feG1pdChwa3RfZGV2KTsKCgkJCS8qCgkJCSAqIFdlIGxpa2UgdG8gc3RheSBSVU5OSU5HIGJ1dCBtdXN0IGFsc28gZ2l2ZQoJCQkgKiBvdGhlcnMgZmFpciBzaGFyZS4KCQkJICovCgoJCQl0eF9zaW5jZV9zb2Z0aXJxICs9IHBrdF9kZXYtPmxhc3Rfb2s7CgoJCQlpZiAodHhfc2luY2Vfc29mdGlycSA+IG1heF9iZWZvcmVfc29mdGlycSkgewoJCQkJaWYgKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQoJCQkJCWRvX3NvZnRpcnEoKTsKCQkJCXR4X3NpbmNlX3NvZnRpcnEgPSAwOwoJCQl9CgkJfSBlbHNlIHsKCQkJcHJlcGFyZV90b193YWl0KCYodC0+cXVldWUpLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKCQkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CgkJCWZpbmlzaF93YWl0KCYodC0+cXVldWUpLCAmd2FpdCk7CgkJfQoKICAgICAgICAgICAgICAgIC8qIAoJCSAqIEJhY2sgZnJvbSBzbGVlcCwgZWl0aGVyIGR1ZSB0byB0aGUgdGltZW91dCBvciBzaWduYWwuCgkJICogV2UgY2hlY2sgaWYgd2UgaGF2ZSBhbnkgInBvc3RlZCIgd29yayBmb3IgdXMuCgkJICovCgogICAgICAgICAgICAgICAgaWYgKHQtPmNvbnRyb2wgJiBUX1RFUk1JTkFURSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHJlY2VpdmVkIGEgcmVxdWVzdCB0byB0ZXJtaW5hdGUgb3Vyc2VsZiAqLwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkKCgkJaWYodC0+Y29udHJvbCAmIFRfU1RPUCkgewoJCQlwa3RnZW5fc3RvcCh0KTsKCQkJdC0+Y29udHJvbCAmPSB+KFRfU1RPUCk7CgkJfQoKCQlpZih0LT5jb250cm9sICYgVF9SVU4pIHsKCQkJcGt0Z2VuX3J1bih0KTsKCQkJdC0+Y29udHJvbCAmPSB+KFRfUlVOKTsKCQl9CgoJCWlmKHQtPmNvbnRyb2wgJiBUX1JFTURFVikgewoJCQlwa3RnZW5fcmVtX2FsbF9pZnModCk7CgkJCXQtPmNvbnRyb2wgJj0gfihUX1JFTURFVik7CgkJfQoKCQlpZiAobmVlZF9yZXNjaGVkKCkpIAoJCQlzY2hlZHVsZSgpOwogICAgICAgIH0gCgogICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyBzdG9wcGluZyBhbGwgZGV2aWNlXG4iLCB0LT5uYW1lKSk7CiAgICAgICAgcGt0Z2VuX3N0b3AodCk7CgogICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyByZW1vdmluZyBhbGwgZGV2aWNlXG4iLCB0LT5uYW1lKSk7CiAgICAgICAgcGt0Z2VuX3JlbV9hbGxfaWZzKHQpOwoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgdGhyZWFkLlxuIiwgdC0+bmFtZSkpOwogICAgICAgIHBrdGdlbl9yZW1fdGhyZWFkKHQpOwp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9maW5kX2RldihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgY29uc3QgY2hhciogaWZuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKICAgICAgICBpZl9sb2NrKHQpOwoKICAgICAgICBmb3IocGt0X2Rldj10LT5pZl9saXN0OyBwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCApIHsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGt0X2Rldi0+aWZuYW1lLCBpZm5hbWUpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZl91bmxvY2sodCk7CglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZmluZF9kZXYoJXMpIHJldHVybmluZyAlcFxuIiwgaWZuYW1lLHBrdF9kZXYpKTsKICAgICAgICByZXR1cm4gcGt0X2RldjsKfQoKLyogCiAqIEFkZHMgYSBkZXYgYXQgZnJvbnQgb2YgaWZfbGlzdC4gCiAqLwoKc3RhdGljIGludCBhZGRfZGV2X3RvX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CglpbnQgcnYgPSAwOwoJCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgaWYgKHBrdF9kZXYtPnBnX3RocmVhZCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiAgYWxyZWFkeSBhc3NpZ25lZCB0byBhIHRocmVhZC5cbiIpOwogICAgICAgICAgICAgICAgcnYgPSAtRUJVU1k7CiAgICAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICB9Cglwa3RfZGV2LT5uZXh0ID10LT5pZl9saXN0OyB0LT5pZl9saXN0PXBrdF9kZXY7CiAgICAgICAgcGt0X2Rldi0+cGdfdGhyZWFkID0gdDsKCXBrdF9kZXYtPnJ1bm5pbmcgPSAwOwoKIG91dDoKICAgICAgICBpZl91bmxvY2sodCk7ICAgICAgICAKICAgICAgICByZXR1cm4gcnY7Cn0KCi8qIENhbGxlZCB1bmRlciB0aHJlYWQgbG9jayAqLwoKc3RhdGljIGludCBwa3RnZW5fYWRkX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgY29uc3QgY2hhciogaWZuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2OwoJCgkvKiBXZSBkb24ndCBhbGxvdyBhIGRldmljZSB0byBiZSBvbiBzZXZlcmFsIHRocmVhZHMgKi8KCglpZiggKHBrdF9kZXYgPSBfX3BrdGdlbl9OTl90aHJlYWRzKGlmbmFtZSwgRklORCkpID09IE5VTEwpIHsKCQkJCQkJICAgCgkJcGt0X2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwa3RnZW5fZGV2KSwgR0ZQX0tFUk5FTCk7CiAgICAgICAgICAgICAgICBpZiAoIXBrdF9kZXYpIAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKCiAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBwa3RnZW5fZGV2KSk7CgoJCXBrdF9kZXYtPmZsb3dzID0gdm1hbGxvYyhNQVhfQ0ZMT1dTKnNpemVvZihzdHJ1Y3QgZmxvd19zdGF0ZSkpOwoJCWlmIChwa3RfZGV2LT5mbG93cyA9PSBOVUxMKSB7CgkJCWtmcmVlKHBrdF9kZXYpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgkJbWVtc2V0KHBrdF9kZXYtPmZsb3dzLCAwLCBNQVhfQ0ZMT1dTKnNpemVvZihzdHJ1Y3QgZmxvd19zdGF0ZSkpOwoKCQlwa3RfZGV2LT5taW5fcGt0X3NpemUgPSBFVEhfWkxFTjsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSA9IEVUSF9aTEVOOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+bmZyYWdzID0gMDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmNsb25lX3NrYiA9IHBnX2Nsb25lX3NrYl9kOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+ZGVsYXlfdXMgPSBwZ19kZWxheV9kIC8gMTAwMDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRlbGF5X25zID0gcGdfZGVsYXlfZCAlIDEwMDA7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jb3VudCA9IHBnX2NvdW50X2Q7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5zb2ZhciA9IDA7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbiA9IDk7IC8qIHNpbmsgcG9ydCAqLwogICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX3NyY19tYXggPSA5OwogICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9taW4gPSA5OwogICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXggPSA5OwoKICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+aWZuYW1lLCBpZm5hbWUsIDMxKTsKICAgICAgICAgICAgICAgIHNwcmludGYocGt0X2Rldi0+Zm5hbWUsICJuZXQvJXMvJXMiLCBQR19QUk9DX0RJUiwgaWZuYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoISBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0Z2VuX3NldHVwX2RldiBmYWlsZWQuXG4iKTsKCQkJaWYgKHBrdF9kZXYtPmZsb3dzKQoJCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwogICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeShwa3RfZGV2LT5mbmFtZSwgMDYwMCwgTlVMTCk7CiAgICAgICAgICAgICAgICBpZiAoIXBrdF9kZXYtPnByb2NfZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeS5cbiIsIHBrdF9kZXYtPmZuYW1lKTsKCQkJaWYgKHBrdF9kZXYtPmZsb3dzKQoJCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwogICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+cmVhZF9wcm9jID0gcHJvY19pZl9yZWFkOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQtPndyaXRlX3Byb2MgPSBwcm9jX2lmX3dyaXRlOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQtPmRhdGEgPSAodm9pZCopKHBrdF9kZXYpOwoJCXBrdF9kZXYtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOwoKICAgICAgICAgICAgICAgIHJldHVybiBhZGRfZGV2X3RvX3RocmVhZCh0LCBwa3RfZGV2KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGludGVyZmFjZSBhbHJlYWR5IHVzZWQuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgfQp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl9maW5kX3RocmVhZChjb25zdCBjaGFyKiBuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKCiAgICAgICB0aHJlYWRfbG9jaygpOwoKICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgd2hpbGUgKHQpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIHQgPSB0LT5uZXh0OwogICAgICAgIH0KICAgICAgICB0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgcmV0dXJuIHQ7Cn0KCnN0YXRpYyBpbnQgcGt0Z2VuX2NyZWF0ZV90aHJlYWQoY29uc3QgY2hhciogbmFtZSwgaW50IGNwdSkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IE5VTEw7CgogICAgICAgIGlmIChzdHJsZW4obmFtZSkgPiAzMSkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiAgVGhyZWFkIG5hbWUgY2Fubm90IGJlIG1vcmUgdGhhbiAzMSBjaGFyYWN0ZXJzLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHBrdGdlbl9maW5kX3RocmVhZChuYW1lKSkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiB0aHJlYWQ6ICVzIGFscmVhZHkgZXhpc3RzXG4iLCBuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCiAgICAgICAgdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwa3RnZW5fdGhyZWFkKSwgR0ZQX0tFUk5FTCkpOwogICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBvdXQgb2YgbWVtb3J5LCBjYW4ndCBjcmVhdGUgbmV3IHRocmVhZC5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgfQoKICAgICAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHN0cnVjdCBwa3RnZW5fdGhyZWFkKSk7CiAgICAgICAgc3RyY3B5KHQtPm5hbWUsIG5hbWUpOwogICAgICAgIHNwaW5fbG9ja19pbml0KCZ0LT5pZl9sb2NrKTsKCXQtPmNwdSA9IGNwdTsKICAgICAgICAKICAgICAgICBzcHJpbnRmKHQtPmZuYW1lLCAibmV0LyVzLyVzIiwgUEdfUFJPQ19ESVIsIHQtPm5hbWUpOwogICAgICAgIHQtPnByb2NfZW50ID0gY3JlYXRlX3Byb2NfZW50cnkodC0+Zm5hbWUsIDA2MDAsIE5VTEwpOwogICAgICAgIGlmICghdC0+cHJvY19lbnQpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeS5cbiIsIHQtPmZuYW1lKTsKICAgICAgICAgICAgICAgIGtmcmVlKHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQogICAgICAgIHQtPnByb2NfZW50LT5yZWFkX3Byb2MgPSBwcm9jX3RocmVhZF9yZWFkOwogICAgICAgIHQtPnByb2NfZW50LT53cml0ZV9wcm9jID0gcHJvY190aHJlYWRfd3JpdGU7CiAgICAgICAgdC0+cHJvY19lbnQtPmRhdGEgPSAodm9pZCopKHQpOwogICAgICAgIHQtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOwoKICAgICAgICB0LT5uZXh0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgcGt0Z2VuX3RocmVhZHMgPSB0OwoKCWlmIChrZXJuZWxfdGhyZWFkKCh2b2lkICopIHBrdGdlbl90aHJlYWRfd29ya2VyLCAodm9pZCAqKSB0LCAKCQkJICBDTE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgQ0xPTkVfU0lHSEFORCkgPCAwKQoJCXByaW50aygicGt0Z2VuOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkIGZvciBjcHUgJWRcbiIsIHQtPmNwdSk7CgoJcmV0dXJuIDA7Cn0KCi8qIAogKiBSZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHRocmVhZCBpZl9saXN0LiAKICovCnN0YXRpYyB2b2lkIF9yZW1fZGV2X2Zyb21faWZfbGlzdChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CglzdHJ1Y3QgcGt0Z2VuX2RldiAqaSwgKnByZXYgPSBOVUxMOwoKCWkgPSB0LT5pZl9saXN0OwoKCXdoaWxlKGkpIHsKCQlpZihpID09IHBrdF9kZXYpIHsKCQkJaWYocHJldikgcHJldi0+bmV4dCA9IGktPm5leHQ7CgkJCWVsc2UgdC0+aWZfbGlzdCA9IE5VTEw7CgkJCWJyZWFrOwoJCX0KCQlwcmV2ID0gaTsKCQlpPWktPm5leHQ7Cgl9Cn0KCnN0YXRpYyBpbnQgcGt0Z2VuX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSAKewoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiByZW1vdmVfZGV2aWNlIHBrdF9kZXY9JXBcbiIsIHBrdF9kZXYpKTsKCiAgICAgICAgaWYgKHBrdF9kZXYtPnJ1bm5pbmcpIHsgCiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjpXQVJOSU5HOiB0cnlpbmcgdG8gcmVtb3ZlIGEgcnVubmluZyBpbnRlcmZhY2UsIHN0b3BwaW5nIGl0IG5vdy5cbiIpOwogICAgICAgICAgICAgICAgcGt0Z2VuX3N0b3BfZGV2aWNlKHBrdF9kZXYpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBEaXMtYXNzb2NpYXRlIGZyb20gdGhlIGludGVyZmFjZSAqLwoKCWlmIChwa3RfZGV2LT5vZGV2KSB7CgkJZGV2X3B1dChwa3RfZGV2LT5vZGV2KTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPm9kZXYgPSBOVUxMOwogICAgICAgIH0KICAgICAgICAKCS8qIEFuZCB1cGRhdGUgdGhlIHRocmVhZCBpZl9saXN0ICovCgoJX3JlbV9kZXZfZnJvbV9pZl9saXN0KHQsIHBrdF9kZXYpOwoKICAgICAgICAvKiBDbGVhbiB1cCBwcm9jIGZpbGUgc3lzdGVtICovCgogICAgICAgIGlmIChzdHJsZW4ocGt0X2Rldi0+Zm5hbWUpKSAKICAgICAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KHBrdF9kZXYtPmZuYW1lLCBOVUxMKTsKCglpZiAocGt0X2Rldi0+Zmxvd3MpCgkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwoJa2ZyZWUocGt0X2Rldik7CiAgICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19pbml0IHBnX2luaXQodm9pZCkgCnsKCWludCBjcHU7CglwcmludGsodmVyc2lvbik7CgogICAgICAgIG1vZHVsZV9mbmFtZVswXSA9IDA7CgoJY3JlYXRlX3Byb2NfZGlyKCk7CgogICAgICAgIHNwcmludGYobW9kdWxlX2ZuYW1lLCAibmV0LyVzL3BnY3RybCIsIFBHX1BST0NfRElSKTsKICAgICAgICBtb2R1bGVfcHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeShtb2R1bGVfZm5hbWUsIDA2MDAsIE5VTEwpOwogICAgICAgIGlmICghbW9kdWxlX3Byb2NfZW50KSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgbW9kdWxlX2ZuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCiAgICAgICAgbW9kdWxlX3Byb2NfZW50LT5wcm9jX2ZvcHMgPSAgJnBrdGdlbl9mb3BzOwogICAgICAgIG1vZHVsZV9wcm9jX2VudC0+ZGF0YSA9IE5VTEw7CgoJLyogUmVnaXN0ZXIgdXMgdG8gcmVjZWl2ZSBuZXRkZXZpY2UgZXZlbnRzICovCglyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBrdGdlbl9ub3RpZmllcl9ibG9jayk7CiAgICAgICAgCglmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVMgOyBjcHUrKykgewoJCWNoYXIgYnVmWzMwXTsKCgkJaWYgKCFjcHVfb25saW5lKGNwdSkpCgkJCWNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAia3BrdGdlbmRfJWkiLCBjcHUpOwogICAgICAgICAgICAgICAgcGt0Z2VuX2NyZWF0ZV90aHJlYWQoYnVmLCBjcHUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsgICAgICAgIAp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgcGdfY2xlYW51cCh2b2lkKQp7Cgl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKCiAgICAgICAgLyogU3RvcCBhbGwgaW50ZXJmYWNlcyAmIHRocmVhZHMgKi8gICAgICAgIAoKICAgICAgICB3aGlsZSAocGt0Z2VuX3RocmVhZHMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgICAgICAgICBwa3RnZW5fdGhyZWFkcy0+Y29udHJvbCB8PSAoVF9URVJNSU5BVEUpOwoKCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChxdWV1ZSwgKHQgIT0gcGt0Z2VuX3RocmVhZHMpLCBIWik7CiAgICAgICAgfQoKICAgICAgICAvKiBVbi1yZWdpc3RlciB1cyBmcm9tIHJlY2VpdmluZyBuZXRkZXZpY2UgZXZlbnRzICovCgl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcGt0Z2VuX25vdGlmaWVyX2Jsb2NrKTsKCiAgICAgICAgLyogQ2xlYW4gdXAgcHJvYyBmaWxlIHN5c3RlbSAqLwoKICAgICAgICByZW1vdmVfcHJvY19lbnRyeShtb2R1bGVfZm5hbWUsIE5VTEwpOwogICAgICAgIAoJcmVtb3ZlX3Byb2NfZGlyKCk7Cn0KCgptb2R1bGVfaW5pdChwZ19pbml0KTsKbW9kdWxlX2V4aXQocGdfY2xlYW51cCk7CgpNT0RVTEVfQVVUSE9SKCJSb2JlcnQgT2xzc29uIDxyb2JlcnQub2xzc29uQGl0cy51dS5zZSIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBHZW5lcmF0b3IgdG9vbCIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cm1vZHVsZV9wYXJhbShwZ19jb3VudF9kLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ocGdfZGVsYXlfZCwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKHBnX2Nsb25lX3NrYl9kLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cg==