LyoKICogQXV0aG9yczoKICogQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkgUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2U+CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHkgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIEFsZXhleSBLdXpuZXRzb3YgIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KICogQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqIEplbnMgTOXlcyA8amVucy5sYWFzQGRhdGEuc2x1LnNlPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKgogKiBBIHRvb2wgZm9yIGxvYWRpbmcgdGhlIG5ldHdvcmsgd2l0aCBwcmVjb25maWd1cmF0ZWQgcGFja2V0cy4KICogVGhlIHRvb2wgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaW51eCBtb2R1bGUuICBQYXJhbWV0ZXJzIGFyZSBvdXRwdXQgCiAqIGRldmljZSwgZGVsYXkgKHRvIGhhcmRfeG1pdCksIG51bWJlciBvZiBwYWNrZXRzLCBhbmQgd2hldGhlcgogKiB0byB1c2UgbXVsdGlwbGUgU0tCcyBvciBqdXN0IHRoZSBzYW1lIG9uZS4KICogcGt0Z2VuIHVzZXMgdGhlIGluc3RhbGxlZCBpbnRlcmZhY2UncyBvdXRwdXQgcm91dGluZS4KICoKICogQWRkaXRpb25hbCBoYWNraW5nIGJ5OgogKgogKiBKZW5zLkxhYXNAZGF0YS5zbHUuc2UKICogSW1wcm92ZWQgYnkgQU5LLiAwMTAxMjAuCiAqIEltcHJvdmVkIGJ5IEFOSyBldmVuIG1vcmUuIDAxMDIxMi4KICogTUFDIGFkZHJlc3MgdHlwbyBmaXhlZC4gMDEwNDE3IC0tcm8KICogSW50ZWdyYXRlZC4gIDAyMDMwMSAtLURhdmVNCiAqIEFkZGVkIG11bHRpc2tiIG9wdGlvbiAwMjAzMDEgLS1EYXZlTQogKiBTY2FsaW5nIG9mIHJlc3VsdHMuIDAyMDQxNy0tc2lndXJkdXJAbGlucHJvLm5vCiAqIFNpZ25pZmljYW50IHJlLXdvcmsgb2YgdGhlIG1vZHVsZToKICogICAqICBDb252ZXJ0IHRvIHRocmVhZGVkIG1vZGVsIHRvIG1vcmUgZWZmaWNpZW50bHkgYmUgYWJsZSB0byB0cmFuc21pdAogKiAgICAgICBhbmQgcmVjZWl2ZSBvbiBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IG9uY2UuCiAqICAgKiAgQ29udmVydGVkIG1hbnkgY291bnRlcnMgdG8gX191NjQgdG8gYWxsb3cgbG9uZ2VyIHJ1bnMuCiAqICAgKiAgQWxsb3cgY29uZmlndXJhdGlvbiBvZiByYW5nZXMsIGxpa2UgbWluL21heCBJUCBhZGRyZXNzLCBNQUNzLAogKiAgICAgICBhbmQgVURQLXBvcnRzLCBmb3IgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBhbmQgY2FuCiAqICAgICAgIHNldCB0byB1c2UgYSByYW5kb20gZGlzdHJpYnV0aW9uIG9yIHNlcXVlbnRpYWxseSB3YWxrIHRoZSByYW5nZS4KICogICAqICBDYW4gbm93IGNoYW5nZSBtb3N0IHZhbHVlcyBhZnRlciBzdGFydGluZy4KICogICAqICBQbGFjZSAxMi1ieXRlIHBhY2tldCBpbiBVRFAgcGF5bG9hZCB3aXRoIG1hZ2ljIG51bWJlciwKICogICAgICAgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wLgogKiAgICogIEFkZCByZWNlaXZlciBjb2RlIHRoYXQgZGV0ZWN0cyBkcm9wcGVkIHBrdHMsIHJlLW9yZGVyZWQgcGt0cywgYW5kCiAqICAgICAgIGxhdGVuY2llcyAod2l0aCBtaWNyby1zZWNvbmQpIHByZWNpc2lvbi4KICogICAqICBBZGQgSU9DVEwgaW50ZXJmYWNlIHRvIGVhc2lseSBnZXQgY291bnRlcnMgJiBjb25maWd1cmF0aW9uLgogKiAgIC0tQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqCiAqIFJlbmFtZWQgbXVsdGlza2IgdG8gY2xvbmVfc2tiIGFuZCBjbGVhbmVkIHVwIHNlbmRpbmcgY29yZSBmb3IgdHdvIGRpc3RpbmN0IAogKiBza2IgbW9kZXMuIEEgY2xvbmVfc2tiPTAgbW9kZSBmb3IgQmVuICJyYW5nZXMiIHdvcmsgYW5kIGEgY2xvbmVfc2tiICE9IDAgCiAqIGFzIGEgImZhc3RwYXRoIiB3aXRoIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjbG9uZXMgYWZ0ZXIgYWxsb2Mncy4KICogY2xvbmVfc2tiPTAgbWVhbnMgYWxsIHBhY2tldHMgYXJlIGFsbG9jYXRlZCB0aGlzIGFsc28gbWVhbnMgcmFuZ2VzIHRpbWUgCiAqIHN0YW1wcyBldGMgY2FuIGJlIHVzZWQuIGNsb25lX3NrYj0xMDAgbWVhbnMgMSBtYWxsb2MgaXMgZm9sbG93ZWQgYnkgMTAwIAogKiBjbG9uZXMuCiAqCiAqIEFsc28gbW92ZWQgdG8gL3Byb2MvbmV0L3BrdGdlbi8gCiAqIC0tcm8KICoKICogU2VwdCAxMDogIEZpeGVkIHRocmVhZGluZy9sb2NraW5nLiAgTG90cyBvZiBib25lLWhlYWRlZCBhbmQgbW9yZSBjbGV2ZXIKICogICAgbWlzdGFrZXMuICBBbHNvIG1lcmdlZCBpbiBEYXZlTSdzIHBhdGNoIGluIHRoZSAtcHJlNiBwYXRjaC4KICogLS1CZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KICoKICogSW50ZWdyYXRlZCB0byAyLjUueCAwMjEwMjkgLS1MdWNpbyBNYWNpZWwgKGx1Y2lvbWFjaWVsQHppcG1haWwuY29tLmJyKQogKgogKiAKICogMDIxMTI0IEZpbmlzaGVkIG1ham9yIHJlZGVzaWduIGFuZCByZXdyaXRlIGZvciBuZXcgZnVuY3Rpb25hbGl0eS4KICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGZvciBob3cgdG8gdXNlIHRoaXMuCiAqCiAqIFRoZSBuZXcgb3BlcmF0aW9uOgogKiBGb3IgZWFjaCBDUFUgb25lIHRocmVhZC9wcm9jZXNzIGlzIGNyZWF0ZWQgYXQgc3RhcnQuIFRoaXMgcHJvY2VzcyBjaGVja3MgCiAqIGZvciBydW5uaW5nIGRldmljZXMgaW4gdGhlIGlmX2xpc3QgYW5kIHNlbmRzIHBhY2tldHMgdW50aWwgY291bnQgaXMgMCBpdCAKICogYWxzbyB0aGUgdGhyZWFkIGNoZWNrcyB0aGUgdGhyZWFkLT5jb250cm9sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyLXByb2Nlc3MgCiAqIGNvbW11bmljYXRpb24uIGNvbnRyb2xsaW5nIHByb2Nlc3MgInBvc3RzIiBvcGVyYXRpb25zIHRvIHRoZSB0aHJlYWRzIHRoaXMgCiAqIHdheS4gVGhlIGlmX2xvY2sgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlbW92ZSB3aGVuIGFkZC9yZW1fZGV2aWNlIGlzIG1lcmdlZAogKiBpbnRvIHRoaXMgdG9vLgogKgogKiBCeSBkZXNpZ24gdGhlcmUgc2hvdWxkIG9ubHkgYmUgKm9uZSogImNvbnRyb2xsaW5nIiBwcm9jZXNzLiBJbiBwcmFjdGljZSAKICogbXVsdGlwbGUgd3JpdGUgYWNjZXNzZXMgZ2l2ZXMgdW5wcmVkaWN0YWJsZSByZXN1bHQuIFVuZGVyc3Rvb2QgYnkgIndyaXRlIiAKICogdG8gL3Byb2MgZ2l2ZXMgcmVzdWx0IGNvZGUgdGhhdHMgc2hvdWxkIGJlIHJlYWQgYmUgdGhlICJ3cml0ZXIiLgogKiBGb3IgcHJhdGljYWwgdXNlIHRoaXMgc2hvdWxkIGJlIG5vIHByb2JsZW0uCiAqCiAqIE5vdGUgd2hlbiBhZGRpbmcgZGV2aWNlcyB0byBhIHNwZWNpZmljIENQVSB0aGVyZSBnb29kIGlkZWEgdG8gYWxzbyBhc3NpZ24gCiAqIC9wcm9jL2lycS9YWC9zbXBfYWZmaW5pdHkgc28gVFgtaW50ZXJydXB0cyBnZXRzIGJvdW5kIHRvIHRoZSBzYW1lIENQVS4gCiAqIC0tcm8KICoKICogRml4IHJlZmNvdW50IG9mZiBieSBvbmUgaWYgZmlyc3QgcGFja2V0IGZhaWxzLCBwb3RlbnRpYWwgbnVsbCBkZXJlZiwgCiAqIG1lbWxlYWsgMDMwNzEwLSBLSlAKICoKICogRmlyc3QgInJhbmdlcyIgZnVuY3Rpb25hbGl0eSBmb3IgaXB2NiAwMzA3MjYgLS1ybwogKgogKiBJbmNsdWRlZCBmbG93IHN1cHBvcnQuIDAzMDgwMiBBTksuCiAqCiAqIEZpeGVkIHVuYWxpZ25lZCBhY2Nlc3Mgb24gSUEtNjQgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CiAqIAogKiBSZW1vdmUgaWYgZml4IGZyb20gYWRkZWQgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+IDA0MDQxOQogKiBpYTY0IGNvbXBpbGF0aW9uIGZpeCBmcm9tICBBcm9uIEdyaWZmaXMgPGFyb25AaHAuY29tPiAwNDA2MDQKICoKICogTmV3IHhtaXQoKSByZXR1cm4sIGRvX2RpdiBhbmQgbWlzYyBjbGVhbiB1cCBieSBTdGVwaGVuIEhlbW1pbmdlciAKICogPHNoZW1taW5nZXJAb3NkbC5vcmc+IDA0MDkyMwogKgogKiBSYW55IER1bmxhcCBmaXhlZCB1NjQgcHJpbnRrIGNvbXBpbGVyIHdhcmluZyAKICoKICogUmVtb3ZlIEZDUyBmcm9tIEJXIGNhbGN1bGF0aW9uLiAgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+CiAqIE5ldyB0aW1lIGhhbmRsaW5nLiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gMDQxMjEzCiAqCiAqIENvcnJlY3Rpb25zIGZyb20gTmlrb2xhaSBNYWx5a2ggKG5tYWx5a2hAYmlsaW0uY29tKSAKICogUmVtb3ZlZCB1bnVzZWQgZmxhZ3MgRl9TRVRfU1JDTUFDICYgRl9TRVRfU1JDSVAgMDQxMjMwCiAqCiAqIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgpIHJlcGxhY2VkIE5pc2hhbnRoIEFyYXZhbXVkYW4gPG5hY2NAdXMuaWJtLmNvbT4gCiAqIDA1MDEwMwogKi8KI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiNpbmNsdWRlIDxsaW51eC91ZHAuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgojaW5jbHVkZSA8bmV0L2lwdjYuaD4KI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgojaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPiAvKiBkb19kaXYgKi8KI2luY2x1ZGUgPGFzbS90aW1leC5oPgoKCiNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MjogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCgovKiAjZGVmaW5lIFBHX0RFQlVHKGEpIGEgKi8KI2RlZmluZSBQR19ERUJVRyhhKSAKCi8qIFRoZSBidWNrZXRzIGFyZSBleHBvbmVudGlhbCBpbiAnd2lkdGgnICovCiNkZWZpbmUgTEFUX0JVQ0tFVFNfTUFYIDMyCiNkZWZpbmUgSVBfTkFNRV9TWiAzMgoKLyogRGV2aWNlIGZsYWcgYml0cyAqLwojZGVmaW5lIEZfSVBTUkNfUk5EICAgKDE8PDApICAvKiBJUC1TcmMgUmFuZG9tICAqLwojZGVmaW5lIEZfSVBEU1RfUk5EICAgKDE8PDEpICAvKiBJUC1Ec3QgUmFuZG9tICAqLwojZGVmaW5lIEZfVURQU1JDX1JORCAgKDE8PDIpICAvKiBVRFAtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfVURQRFNUX1JORCAgKDE8PDMpICAvKiBVRFAtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDU1JDX1JORCAgKDE8PDQpICAvKiBNQUMtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDRFNUX1JORCAgKDE8PDUpICAvKiBNQUMtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfVFhTSVpFX1JORCAgKDE8PDYpICAvKiBUcmFuc21pdCBzaXplIGlzIHJhbmRvbSAqLwojZGVmaW5lIEZfSVBWNiAgICAgICAgKDE8PDcpICAvKiBJbnRlcmZhY2UgaW4gSVBWNiBNb2RlICovCgovKiBUaHJlYWQgY29udHJvbCBmbGFnIGJpdHMgKi8KI2RlZmluZSBUX1RFUk1JTkFURSAgICgxPDwwKSAgCiNkZWZpbmUgVF9TVE9QICAgICAgICAoMTw8MSkgIC8qIFN0b3AgcnVuICovCiNkZWZpbmUgVF9SVU4gICAgICAgICAoMTw8MikgIC8qIFN0YXJ0IHJ1biAqLwojZGVmaW5lIFRfUkVNREVWICAgICAgKDE8PDMpICAvKiBSZW1vdmUgYWxsIGRldnMgKi8KCi8qIExvY2tzICovCiNkZWZpbmUgICB0aHJlYWRfbG9jaygpICAgICAgICBzcGluX2xvY2soJl90aHJlYWRfbG9jaykKI2RlZmluZSAgIHRocmVhZF91bmxvY2soKSAgICAgIHNwaW5fdW5sb2NrKCZfdGhyZWFkX2xvY2spCgovKiBJZiBsb2NrIC0tIGNhbiBiZSByZW1vdmVkIGFmdGVyIHNvbWUgd29yayAqLwojZGVmaW5lICAgaWZfbG9jayh0KSAgICAgICAgICAgc3Bpbl9sb2NrKCYodC0+aWZfbG9jaykpOwojZGVmaW5lICAgaWZfdW5sb2NrKHQpICAgICAgICAgICBzcGluX3VubG9jaygmKHQtPmlmX2xvY2spKTsKCi8qIFVzZWQgdG8gaGVscCB3aXRoIGRldGVybWluaW5nIHRoZSBwa3RzIG9uIHJlY2VpdmUgKi8KI2RlZmluZSBQS1RHRU5fTUFHSUMgMHhiZTliZTk1NQojZGVmaW5lIFBHX1BST0NfRElSICJuZXQvcGt0Z2VuIgoKI2RlZmluZSBNQVhfQ0ZMT1dTICA2NTUzNgoKc3RydWN0IGZsb3dfc3RhdGUKewoJX191MzIJCWN1cl9kYWRkcjsKCWludAkJY291bnQ7Cn07CgpzdHJ1Y3QgcGt0Z2VuX2RldiB7CgoJLyoKCSAqIFRyeSB0byBrZWVwIGZyZXF1ZW50L2luZnJlcXVlbnQgdXNlZCB2YXJzLiBzZXBhcmF0ZWQuCgkgKi8KCiAgICAgICAgY2hhciBpZm5hbWVbMzJdOwogICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnQ7CiAgICAgICAgY2hhciByZXN1bHRbNTEyXTsKICAgICAgICAvKiBwcm9jIGZpbGUgbmFtZXMgKi8KICAgICAgICBjaGFyIGZuYW1lWzgwXTsKCiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQqIHBnX3RocmVhZDsgLyogdGhlIG93bmVyICovCiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQ7IC8qIFVzZWQgZm9yIGNoYWluaW5nIGluIHRoZSB0aHJlYWQncyBydW4tcXVldWUgKi8KCiAgICAgICAgaW50IHJ1bm5pbmc7ICAvKiBpZiB0aGlzIGNoYW5nZXMgdG8gZmFsc2UsIHRoZSB0ZXN0IHdpbGwgc3RvcCAqLwogICAgICAgIAogICAgICAgIC8qIElmIG1pbiAhPSBtYXgsIHRoZW4gd2Ugd2lsbCBlaXRoZXIgZG8gYSBsaW5lYXIgaXRlcmF0aW9uLCBvcgogICAgICAgICAqIHdlIHdpbGwgZG8gYSByYW5kb20gc2VsZWN0aW9uIGZyb20gd2l0aGluIHRoZSByYW5nZS4KICAgICAgICAgKi8KICAgICAgICBfX3UzMiBmbGFnczsgICAgIAoKICAgICAgICBpbnQgbWluX3BrdF9zaXplOyAgICAvKiA9IEVUSF9aTEVOOyAqLwogICAgICAgIGludCBtYXhfcGt0X3NpemU7ICAgIC8qID0gRVRIX1pMRU47ICovCiAgICAgICAgaW50IG5mcmFnczsKICAgICAgICBfX3UzMiBkZWxheV91czsgICAgLyogRGVmYXVsdCBkZWxheSAqLwogICAgICAgIF9fdTMyIGRlbGF5X25zOwogICAgICAgIF9fdTY0IGNvdW50OyAgLyogRGVmYXVsdCBObyBwYWNrZXRzIHRvIHNlbmQgKi8KICAgICAgICBfX3U2NCBzb2ZhcjsgIC8qIEhvdyBtYW55IHBrdHMgd2UndmUgc2VudCBzbyBmYXIgKi8KICAgICAgICBfX3U2NCB0eF9ieXRlczsgLyogSG93IG1hbnkgYnl0ZXMgd2UndmUgdHJhbnNtaXR0ZWQgKi8KICAgICAgICBfX3U2NCBlcnJvcnM7ICAgIC8qIEVycm9ycyB3aGVuIHRyeWluZyB0byB0cmFuc21pdCwgcGt0cyB3aWxsIGJlIHJlLXNlbnQgKi8KCiAgICAgICAgLyogcnVudGltZSBjb3VudGVycyByZWxhdGluZyB0byBjbG9uZV9za2IgKi8KICAgICAgICBfX3U2NCBuZXh0X3R4X3VzOyAgICAgICAgICAvKiB0aW1lc3RhbXAgb2Ygd2hlbiB0byB0eCBuZXh0ICovCiAgICAgICAgX191MzIgbmV4dF90eF9uczsKICAgICAgICAKICAgICAgICBfX3U2NCBhbGxvY2F0ZWRfc2ticzsKICAgICAgICBfX3UzMiBjbG9uZV9jb3VudDsKCWludCBsYXN0X29rOyAgICAgICAgICAgLyogV2FzIGxhc3Qgc2tiIHNlbnQ/IAoJICAgICAgICAgICAgICAgICAgICAgICAgKiBPciBhIGZhaWxlZCB0cmFuc21pdCBvZiBzb21lIHNvcnQ/ICBUaGlzIHdpbGwga2VlcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VxdWVuY2UgbnVtYmVycyBpbiBvcmRlciwgZm9yIGV4YW1wbGUuCgkJCQkqLwogICAgICAgIF9fdTY0IHN0YXJ0ZWRfYXQ7IC8qIG1pY3JvLXNlY29uZHMgKi8KICAgICAgICBfX3U2NCBzdG9wcGVkX2F0OyAvKiBtaWNyby1zZWNvbmRzICovCiAgICAgICAgX191NjQgaWRsZV9hY2M7IC8qIG1pY3JvLXNlY29uZHMgKi8KICAgICAgICBfX3UzMiBzZXFfbnVtOwogICAgICAgIAogICAgICAgIGludCBjbG9uZV9za2I7IC8qIFVzZSBtdWx0aXBsZSBTS0JzIGR1cmluZyBwYWNrZXQgZ2VuLiAgSWYgdGhpcyBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuIHRoYXQgbWFueSBjb3BwaWVzIG9mIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXQgd2lsbCBiZSBzZW50IGJlZm9yZSBhIG5ldyBwYWNrZXQgaXMgYWxsb2NhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICogRm9yIGluc3RhbmNlLCBpZiB5b3Ugd2FudCB0byBzZW5kIDEwMjQgaWRlbnRpY2FsIHBhY2tldHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBwYWNrZXQsIHNldCBjbG9uZV9za2IgdG8gMTAyNC4KICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIAogICAgICAgIGNoYXIgZHN0X21pbltJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KICAgICAgICBjaGFyIGRzdF9tYXhbSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCiAgICAgICAgY2hhciBzcmNfbWluW0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwogICAgICAgIGNoYXIgc3JjX21heFtJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KCglzdHJ1Y3QgaW42X2FkZHIgIGluNl9zYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgaW42X2RhZGRyOwoJc3RydWN0IGluNl9hZGRyICBjdXJfaW42X2RhZGRyOwoJc3RydWN0IGluNl9hZGRyICBjdXJfaW42X3NhZGRyOwoJLyogRm9yIHJhbmdlcyAqLwoJc3RydWN0IGluNl9hZGRyICBtaW5faW42X2RhZGRyOwoJc3RydWN0IGluNl9hZGRyICBtYXhfaW42X2RhZGRyOwoJc3RydWN0IGluNl9hZGRyICBtaW5faW42X3NhZGRyOwoJc3RydWN0IGluNl9hZGRyICBtYXhfaW42X3NhZGRyOwoKICAgICAgICAvKiBJZiB3ZSdyZSBkb2luZyByYW5nZXMsIHJhbmRvbSBvciBpbmNyZW1lbnRhbCwgdGhlbiB0aGlzCiAgICAgICAgICogZGVmaW5lcyB0aGUgbWluL21heCBmb3IgdGhvc2UgcmFuZ2VzLgogICAgICAgICAqLwogICAgICAgIF9fdTMyIHNhZGRyX21pbjsgLyogaW5jbHVzaXZlLCBzb3VyY2UgSVAgYWRkcmVzcyAqLwogICAgICAgIF9fdTMyIHNhZGRyX21heDsgLyogZXhjbHVzaXZlLCBzb3VyY2UgSVAgYWRkcmVzcyAqLwogICAgICAgIF9fdTMyIGRhZGRyX21pbjsgLyogaW5jbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KICAgICAgICBfX3UzMiBkYWRkcl9tYXg7IC8qIGV4Y2x1c2l2ZSwgZGVzdCBJUCBhZGRyZXNzICovCgogICAgICAgIF9fdTE2IHVkcF9zcmNfbWluOyAvKiBpbmNsdXNpdmUsIHNvdXJjZSBVRFAgcG9ydCAqLwogICAgICAgIF9fdTE2IHVkcF9zcmNfbWF4OyAvKiBleGNsdXNpdmUsIHNvdXJjZSBVRFAgcG9ydCAqLwogICAgICAgIF9fdTE2IHVkcF9kc3RfbWluOyAvKiBpbmNsdXNpdmUsIGRlc3QgVURQIHBvcnQgKi8KICAgICAgICBfX3UxNiB1ZHBfZHN0X21heDsgLyogZXhjbHVzaXZlLCBkZXN0IFVEUCBwb3J0ICovCgogICAgICAgIF9fdTMyIHNyY19tYWNfY291bnQ7IC8qIEhvdyBtYW55IE1BQ3MgdG8gaXRlcmF0ZSB0aHJvdWdoICovCiAgICAgICAgX191MzIgZHN0X21hY19jb3VudDsgLyogSG93IG1hbnkgTUFDcyB0byBpdGVyYXRlIHRocm91Z2ggKi8KICAgICAgICAKICAgICAgICB1bnNpZ25lZCBjaGFyIGRzdF9tYWNbNl07CiAgICAgICAgdW5zaWduZWQgY2hhciBzcmNfbWFjWzZdOwogICAgICAgIAogICAgICAgIF9fdTMyIGN1cl9kc3RfbWFjX29mZnNldDsKICAgICAgICBfX3UzMiBjdXJfc3JjX21hY19vZmZzZXQ7CiAgICAgICAgX191MzIgY3VyX3NhZGRyOwogICAgICAgIF9fdTMyIGN1cl9kYWRkcjsKICAgICAgICBfX3UxNiBjdXJfdWRwX2RzdDsKICAgICAgICBfX3UxNiBjdXJfdWRwX3NyYzsKICAgICAgICBfX3UzMiBjdXJfcGt0X3NpemU7CiAgICAgICAgCiAgICAgICAgX191OCBoaFsxNF07CiAgICAgICAgLyogPSB7IAogICAgICAgICAgIDB4MDAsIDB4ODAsIDB4QzgsIDB4NzksIDB4QjMsIDB4Q0IsIAogICAgICAgICAgIAogICAgICAgICAgIFdlIGZpbGwgaW4gU1JDIGFkZHJlc3MgbGF0ZXIKICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgICAgIDB4MDgsIDB4MDAKICAgICAgICAgICB9OwogICAgICAgICovCiAgICAgICAgX191MTYgcGFkOyAvKiBwYWQgb3V0IHRoZSBoaCBzdHJ1Y3QgdG8gYW4gZXZlbiAxNiBieXRlcyAqLwoKICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiogc2tiOyAvKiBza2Igd2UgYXJlIHRvIHRyYW5zbWl0IG5leHQsIG1haW5seSB1c2VkIGZvciB3aGVuIHdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIHRyYW5zbWl0dGluZyB0aGUgc2FtZSBvbmUgbXVsdGlwbGUgdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogb2RldjsgLyogVGhlIG91dC1nb2luZyBkZXZpY2UuICBOb3RlIHRoYXQgdGhlIGRldmljZSBzaG91bGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGF2ZSBpdCdzIHBnX2luZm8gcG9pbnRlciBwb2ludGluZyBiYWNrIHRvIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlLiAgVGhpcyB3aWxsIGJlIHNldCB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgb3V0LWdvaW5nIGRldmljZSBuYW1lIChub3Qgd2hlbiB0aGUgaW5qZWN0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXJ0ZWQgYXMgaXQgdXNlZCB0byBkby4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJc3RydWN0IGZsb3dfc3RhdGUgKmZsb3dzOwoJdW5zaWduZWQgY2Zsb3dzOyAgICAgICAgIC8qIENvbmN1cnJlbnQgZmxvd3MgKGNvbmZpZykgKi8KCXVuc2lnbmVkIGxmbG93OyAgICAgICAgICAvKiBGbG93IGxlbmd0aCAgKGNvbmZpZykgKi8KCXVuc2lnbmVkIG5mbG93czsgICAgICAgICAvKiBhY2N1bXVsYXRlZCBmbG93cyAoc3RhdHMpICovCn07CgpzdHJ1Y3QgcGt0Z2VuX2hkciB7CiAgICAgICAgX191MzIgcGdoX21hZ2ljOwogICAgICAgIF9fdTMyIHNlcV9udW07CglfX3UzMiB0dl9zZWM7CglfX3UzMiB0dl91c2VjOwp9OwoKc3RydWN0IHBrdGdlbl90aHJlYWQgewogICAgICAgIHNwaW5sb2NrX3QgaWZfbG9jazsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqaWZfbGlzdDsgICAgICAgICAgIC8qIEFsbCBkZXZpY2UgaGVyZSAqLwogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkKiBuZXh0OwogICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgY2hhciBmbmFtZVsxMjhdOyAvKiBuYW1lIG9mIHByb2MgZmlsZSAqLwogICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnQ7CiAgICAgICAgY2hhciByZXN1bHRbNTEyXTsKICAgICAgICB1MzIgbWF4X2JlZm9yZV9zb2Z0aXJxOyAvKiBXZSdsbCBjYWxsIGRvX3NvZnRpcnEgdG8gcHJldmVudCBzdGFydmF0aW9uLiAqLwogICAgICAgIAoJLyogRmllbGQgZm9yIHRocmVhZCB0byByZWNlaXZlICJwb3N0ZWQiIGV2ZW50cyB0ZXJtaW5hdGUsIHN0b3AgaWZzIGV0Yy4qLwoKICAgICAgICB1MzIgY29udHJvbDsKCWludCBwaWQ7CglpbnQgY3B1OwoKICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKfTsKCiNkZWZpbmUgUkVNT1ZFIDEKI2RlZmluZSBGSU5EICAgMAoKLyogIFRoaXMgY29kZSB3b3JrcyBhcm91bmQgdGhlIGZhY3QgdGhhdCBkb19kaXYgY2Fubm90IGhhbmRsZSB0d28gNjQtYml0CiAgICBudW1iZXJzLCBhbmQgcmVndWxhciA2NC1iaXQgZGl2aXNpb24gZG9lc24ndCB3b3JrIG9uIHg4NiBrZXJuZWxzLgogICAgLS1CZW4KKi8KCiNkZWZpbmUgUEdfRElWIDAKCi8qIFRoaXMgd2FzIGVtYWlsZWQgdG8gTE1LTCBieTogQ2hyaXMgQ2FwdXRvIDxjY2FwdXRvQGFsdC5uZXQ+CiAqIEZ1bmN0aW9uIGNvcGllZC9hZGFwdGVkL29wdGltaXplZCBmcm9tOgogKgogKiAgbmVtZXNpcy5zb3VyY2Vmb3JnZS5uZXQvYnJvd3NlL2xpYi9zdGF0aWMvaW50bWF0aC9peDg2L2ludG1hdGguYy5odG1sCiAqCiAqIENvcHlyaWdodCAxOTk0LCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBDb21wdXRlciBMYWJvcmF0b3J5CiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqLwpzdGF0aWMgaW5saW5lIHM2NCBkaXZyZW1kaTMoczY0IHgsIHM2NCB5LCBpbnQgdHlwZSkKewogICAgICAgIHU2NCBhID0gKHggPCAwKSA/IC14IDogeDsKICAgICAgICB1NjQgYiA9ICh5IDwgMCkgPyAteSA6IHk7CiAgICAgICAgdTY0IHJlcyA9IDAsIGQgPSAxOwoKICAgICAgICBpZiAoYiA+IDApIHsKICAgICAgICAgICAgICAgIHdoaWxlIChiIDwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBiIDw8PSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkIDw8PSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAoIGEgPj0gYiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSAtPSBiOwogICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGIgPj49IDE7CiAgICAgICAgICAgICAgICBkID4+PSAxOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZCk7CgogICAgICAgIGlmIChQR19ESVYgPT0gdHlwZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICgoKHggXiB5KSAmICgxbGw8PDYzKSkgPT0gMCkgPyByZXMgOiAtKHM2NClyZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICgoeCAmICgxbGw8PDYzKSkgPT0gMCkgPyBhIDogLShzNjQpYTsKICAgICAgICB9Cn0KCi8qIEVuZCBvZiBoYWNrcyB0byBkZWFsIHdpdGggNjQtYml0IG1hdGggb24geDg2ICovCgovKiogQ29udmVydCB0byBtaWxpc2Vjb25kcyAqLwpzdGF0aWMgaW5saW5lIF9fdTY0IHR2X3RvX21zKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0dikgCnsKICAgICAgICBfX3U2NCBtcyA9IHR2LT50dl91c2VjIC8gMTAwMDsKICAgICAgICBtcyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwOwogICAgICAgIHJldHVybiBtczsKfQoKCi8qKiBDb252ZXJ0IHRvIG1pY3JvLXNlY29uZHMgKi8Kc3RhdGljIGlubGluZSBfX3U2NCB0dl90b191cyhjb25zdCBzdHJ1Y3QgdGltZXZhbCogdHYpIAp7CiAgICAgICAgX191NjQgdXMgPSB0di0+dHZfdXNlYzsKICAgICAgICB1cyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwMDAwOwogICAgICAgIHJldHVybiB1czsKfQoKc3RhdGljIGlubGluZSBfX3U2NCBwZ19kaXYoX191NjQgbiwgX191MzIgYmFzZSkgewogICAgICAgIF9fdTY0IHRtcCA9IG47CiAgICAgICAgZG9fZGl2KHRtcCwgYmFzZSk7CiAgICAgICAgLyogcHJpbnRrKCJwa3RnZW46IHBnX2RpdiwgbjogJWxsdSAgYmFzZTogJWQgIHJ2OiAlbGx1XG4iLAogICAgICAgICAgICAgICAgICBuLCBiYXNlLCB0bXApOyAqLwogICAgICAgIHJldHVybiB0bXA7Cn0KCnN0YXRpYyBpbmxpbmUgX191NjQgcGdfZGl2NjQoX191NjQgbiwgX191NjQgYmFzZSkgCnsKICAgICAgICBfX3U2NCB0bXAgPSBuOwovKgogKiBIb3cgZG8gd2Uga25vdyBpZiB0aGUgYXJjaGl0ZWN0cnVyZSB3ZSBhcmUgcnVubmluZyBvbgogKiBzdXBwb3J0cyBkaXZpc2lvbiB3aXRoIDY0IGJpdCBiYXNlPwogKiAKICovCiNpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSAKCgkJZG9fZGl2KHRtcCwgYmFzZSk7CiNlbHNlCgkJdG1wID0gZGl2cmVtZGkzKG4sIGJhc2UsIFBHX0RJVik7CiNlbmRpZgogICAgICAgIHJldHVybiB0bXA7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIHBrdGdlbl9yYW5kb20odm9pZCkKewojaWYgMAoJX191MzIgbjsKCWdldF9yYW5kb21fYnl0ZXMoJm4sIDQpOwoJcmV0dXJuIG47CiNlbHNlCglyZXR1cm4gbmV0X3JhbmRvbSgpOwojZW5kaWYKfQoKc3RhdGljIGlubGluZSBfX3U2NCBnZXRDdXJNcyh2b2lkKSAKewogICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOwogICAgICAgIHJldHVybiB0dl90b19tcygmdHYpOwp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IGdldEN1clVzKHZvaWQpIAp7CiAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICAgICAgcmV0dXJuIHR2X3RvX3VzKCZ0dik7Cn0KCnN0YXRpYyBpbmxpbmUgX191NjQgdHZfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCogYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwqIGIpIAp7CiAgICAgICAgcmV0dXJuIHR2X3RvX3VzKGEpIC0gdHZfdG9fdXMoYik7Cn0KCgovKiBvbGQgaW5jbHVkZSBlbmQgKi8KCnN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gVkVSU0lPTjsKCnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3JlYWQoc3RydWN0IGZpbGUqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3dyaXRlKHN0cnVjdCBmaWxlKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwpzdGF0aWMgaW50IHByb2NfaWZfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwoKc3RhdGljIGludCBwcm9jX3RocmVhZF9yZWFkKGNoYXIgKmJ1ZiAsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CnN0YXRpYyBpbnQgcHJvY19pZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBwcm9jX3RocmVhZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBjcmVhdGVfcHJvY19kaXIodm9pZCk7CnN0YXRpYyBpbnQgcmVtb3ZlX3Byb2NfZGlyKHZvaWQpOwoKc3RhdGljIGludCBwa3RnZW5fcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCwgc3RydWN0IHBrdGdlbl9kZXYgKmkpOwpzdGF0aWMgaW50IHBrdGdlbl9hZGRfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBjb25zdCBjaGFyKiBpZm5hbWUpOwpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQqIHBrdGdlbl9maW5kX3RocmVhZChjb25zdCBjaGFyKiBuYW1lKTsKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fZmluZF9kZXYoc3RydWN0IHBrdGdlbl90aHJlYWQqIHQsIGNvbnN0IGNoYXIqIGlmbmFtZSk7CnN0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKc3RhdGljIHZvaWQgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcyh2b2lkKTsKc3RhdGljIHZvaWQgcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHNfaWZzKHZvaWQpOwpzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7CnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0KTsKc3RhdGljIHZvaWQgcGt0Z2VuX2NsZWFyX2NvdW50ZXJzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KTsKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fTk5fdGhyZWFkcyhjb25zdCBjaGFyKiBkZXZfbmFtZSwgaW50IHJlbW92ZSk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9pcDYoY29uc3QgY2hhciAqcyxjaGFyIGlwWzE2XSk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgZm10X2lwNihjaGFyICpzLGNvbnN0IGNoYXIgaXBbMTZdKTsKCi8qIE1vZHVsZSBwYXJhbWV0ZXJzLCBkZWZhdWx0cy4gKi8Kc3RhdGljIGludCBwZ19jb3VudF9kID0gMTAwMDsgLyogMTAwMCBwa3RzIGJ5IGRlZmF1bHQgKi8Kc3RhdGljIGludCBwZ19kZWxheV9kID0gMDsKc3RhdGljIGludCBwZ19jbG9uZV9za2JfZCA9IDA7CnN0YXRpYyBpbnQgZGVidWcgPSAwOwoKc3RhdGljIERFRklORV9TUElOTE9DSyhfdGhyZWFkX2xvY2spOwpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl90aHJlYWRzID0gTlVMTDsKCnN0YXRpYyBjaGFyIG1vZHVsZV9mbmFtZVsxMjhdOwpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICptb2R1bGVfcHJvY19lbnQgPSBOVUxMOwoKc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwa3RnZW5fbm90aWZpZXJfYmxvY2sgPSB7Cgkubm90aWZpZXJfY2FsbCA9IHBrdGdlbl9kZXZpY2VfZXZlbnQsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwa3RnZW5fZm9wcyA9IHsKICAgICAgICAucmVhZCAgICAgPSBwcm9jX3BnY3RybF9yZWFkLAogICAgICAgIC53cml0ZSAgICA9IHByb2NfcGdjdHJsX3dyaXRlLAoJLyogIC5pb2N0bCAgICA9IHBrdGdlbl9pb2N0bCwgbGF0ZXIgbWF5YmUgKi8KfTsKCi8qCiAqIC9wcm9jIGhhbmRsaW5nIGZ1bmN0aW9ucyAKICoKICovCgpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZ19wcm9jX2RpciA9IE5VTEw7CnN0YXRpYyBpbnQgcHJvY19wZ2N0cmxfcmVhZF9lb2Y9MDsKCnN0YXRpYyBzc2l6ZV90IHByb2NfcGdjdHJsX3JlYWQoc3RydWN0IGZpbGUqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKeyAKCWNoYXIgZGF0YVsyMDBdOwoJaW50IGxlbiA9IDA7CgoJaWYocHJvY19wZ2N0cmxfcmVhZF9lb2YpIHsKCQlwcm9jX3BnY3RybF9yZWFkX2VvZj0wOwoJCWxlbiA9IDA7CgkJZ290byBvdXQ7Cgl9CgoJc3ByaW50ZihkYXRhLCAiJXMiLCBWRVJTSU9OKTsgCgoJbGVuID0gc3RybGVuKGRhdGEpOwoKCWlmKGxlbiA+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+cmVzdWx0WzBdKQoJCXAgKz0gc3ByaW50ZihwLCAiXG5SZXN1bHQ6ICVzXG4iLCB0LT5yZXN1bHQpOwoJZWxzZQoJCXAgKz0gc3ByaW50ZihwLCAiXG5SZXN1bHQ6IE5BXG4iKTsKCgkqZW9mID0gMTsKCiAgICAgICAgaWZfdW5sb2NrKHQpOwoKCXJldHVybiBwIC0gYnVmOwp9CgpzdGF0aWMgaW50IHByb2NfdGhyZWFkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJaW50IGkgPSAwLCBtYXgsIGxlbiwgcmV0OwoJY2hhciBuYW1lWzQwXTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdDsKICAgICAgICBjaGFyICpwZ19yZXN1bHQ7CiAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CiAgICAgICAgCglpZiAoY291bnQgPCAxKSB7CgkJLy8Jc3ByaW50ZihwZ19yZXN1bHQsICJXcm9uZyBjb21tYW5kIGZvcm1hdCIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQogIAoJbWF4ID0gY291bnQgLSBpOwogICAgICAgIGxlbiA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAobGVuIDwgMCkgCgkJcmV0dXJuIGxlbjsgCiAgICAgCglpICs9IGxlbjsKICAKCS8qIFJlYWQgdmFyaWFibGUgbmFtZSAqLwoKCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKG5hbWUpIC0gMSk7CiAgICAgICAgaWYgKGxlbiA8IDApICAKCQlyZXR1cm4gbGVuOyAKCQoJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CglpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCXJldHVybiAtRUZBVUxUOwoJaSArPSBsZW47CiAgCgltYXggPSBjb3VudCAtaTsKCWxlbiA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAobGVuIDwgMCkgIAoJCXJldHVybiBsZW47IAoJCglpICs9IGxlbjsKCglpZiAoZGVidWcpIAoJCXByaW50aygicGt0Z2VuOiB0PSVzLCBjb3VudD0lbHVcbiIsIG5hbWUsIGNvdW50KTsKICAgICAgICAKCiAgICAgICAgdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGRhdGEpOwoJaWYoIXQpIHsKCQlwcmludGsoInBrdGdlbjogRVJST1I6IE5vIHRocmVhZFxuIik7CgkJcmV0ID0gLUVJTlZBTDsKCQlnb3RvIG91dDsKCX0KCglwZ19yZXN1bHQgPSAmKHQtPnJlc3VsdFswXSk7CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfZGV2aWNlIikpIHsKICAgICAgICAgICAgICAgIGNoYXIgZlszMl07CiAgICAgICAgICAgICAgICBtZW1zZXQoZiwgMCwgMzIpOwoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyAKCQkJcmV0ID0gbGVuOyAKCQkJZ290byBvdXQ7CgkJfQoJCWlmKCBjb3B5X2Zyb21fdXNlcihmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikgKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKCQl0aHJlYWRfbG9jaygpOwogICAgICAgICAgICAgICAgcGt0Z2VuX2FkZF9kZXZpY2UodCwgZik7CgkJdGhyZWFkX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBhZGRfZGV2aWNlPSVzIiwgZik7CgkJZ290byBvdXQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJyZW1fZGV2aWNlX2FsbCIpKSB7CgkJdGhyZWFkX2xvY2soKTsKCQl0LT5jb250cm9sIHw9IFRfUkVNREVWOwoJCXRocmVhZF91bmxvY2soKTsKCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMjUpKTsgIC8qIFByb3BhZ2F0ZSB0aHJlYWQtPmNvbnRyb2wgICovCgkJcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiByZW1fZGV2aWNlX2FsbCIpOwoJCWdvdG8gb3V0OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibWF4X2JlZm9yZV9zb2Z0aXJxIikpIHsKICAgICAgICAgICAgICAgIGxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKCQl0aHJlYWRfbG9jaygpOwogICAgICAgICAgICAgICAgdC0+bWF4X2JlZm9yZV9zb2Z0aXJxID0gdmFsdWU7CgkJdGhyZWFkX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtYXhfYmVmb3JlX3NvZnRpcnE9JWx1IiwgdmFsdWUpOwoJCWdvdG8gb3V0OwoJfQoKCXJldCA9IC1FSU5WQUw7CiBvdXQ6CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBjcmVhdGVfcHJvY19kaXIodm9pZCkKewoJcGdfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBHX1BST0NfRElSLCBOVUxMKTsKICAgICAgICAKICAgICAgICBpZiAoIXBnX3Byb2NfZGlyKSAKICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgICAgIAogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJlbW92ZV9wcm9jX2Rpcih2b2lkKQp7CiAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUEdfUFJPQ19ESVIsIE5VTEwpOwogICAgICAgIHJldHVybiAwOwp9CgovKiBUaGluayBmaW5kIG9yIHJlbW92ZSBmb3IgTk4gKi8Kc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpfX3BrdGdlbl9OTl90aHJlYWRzKGNvbnN0IGNoYXIqIGlmbmFtZSwgaW50IHJlbW92ZSkgCnsKCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OwoJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoKICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgICAgICAgICAKCXdoaWxlICh0KSB7CgkJcGt0X2RldiA9IHBrdGdlbl9maW5kX2Rldih0LCBpZm5hbWUpOwoJCWlmIChwa3RfZGV2KSB7CgkJICAgICAgICAgICAgICAgIGlmKHJlbW92ZSkgeyAKCQkJCSAgICAgICAgaWZfbG9jayh0KTsKCQkJCSAgICAgICAgcGt0Z2VuX3JlbW92ZV9kZXZpY2UodCwgcGt0X2Rldik7CgkJCQkgICAgICAgIGlmX3VubG9jayh0KTsKCQkJCX0KCQkJYnJlYWs7CgkJfQoJCXQgPSB0LT5uZXh0OwoJfQogICAgICAgIHJldHVybiBwa3RfZGV2Owp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9OTl90aHJlYWRzKGNvbnN0IGNoYXIqIGlmbmFtZSwgaW50IHJlbW92ZSkgCnsKCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKCXRocmVhZF9sb2NrKCk7Cglwa3RfZGV2ID0gX19wa3RnZW5fTk5fdGhyZWFkcyhpZm5hbWUsIHJlbW92ZSk7CiAgICAgICAgdGhyZWFkX3VubG9jaygpOwoJcmV0dXJuIHBrdF9kZXY7Cn0KCnN0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKSAKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKShwdHIpOwoKCS8qIEl0IGlzIE9LIHRoYXQgd2UgZG8gbm90IGhvbGQgdGhlIGdyb3VwIGxvY2sgcmlnaHQgbm93LAoJICogYXMgd2UgcnVuIHVuZGVyIHRoZSBSVE5MIGxvY2suCgkgKi8KCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIE5FVERFVl9DSEFOR0VBRERSOgoJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKCWNhc2UgTkVUREVWX0RPV046CgljYXNlIE5FVERFVl9VUDoKCQkvKiBJZ25vcmUgZm9yIG5vdyAqLwoJCWJyZWFrOwoJCQoJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKICAgICAgICAgICAgICAgIHBrdGdlbl9OTl90aHJlYWRzKGRldi0+bmFtZSwgUkVNT1ZFKTsKCQlicmVhazsKCX07CgoJcmV0dXJuIE5PVElGWV9ET05FOwp9CgovKiBBc3NvY2lhdGUgcGt0Z2VuX2RldiB3aXRoIGEgZGV2aWNlLiAqLwoKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlKiBwa3RnZW5fc2V0dXBfZGV2KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSB7CglzdHJ1Y3QgbmV0X2RldmljZSAqb2RldjsKCgkvKiBDbGVhbiBvbGQgc2V0dXBzICovCgoJaWYgKHBrdF9kZXYtPm9kZXYpIHsKCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+b2RldiA9IE5VTEw7CiAgICAgICAgfQoKCW9kZXYgPSBkZXZfZ2V0X2J5X25hbWUocGt0X2Rldi0+aWZuYW1lKTsKCglpZiAoIW9kZXYpIHsKCQlwcmludGsoInBrdGdlbjogbm8gc3VjaCBuZXRkZXZpY2U6IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dDsKCX0KCWlmIChvZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikgewoJCXByaW50aygicGt0Z2VuOiBub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CgkJZ290byBvdXRfcHV0OwoJfQoJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CgkJcHJpbnRrKCJwa3RnZW46IGRldmljZSBpcyBkb3duOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CgkJZ290byBvdXRfcHV0OwoJfQoJcGt0X2Rldi0+b2RldiA9IG9kZXY7CgkKICAgICAgICByZXR1cm4gcGt0X2Rldi0+b2RldjsKCm91dF9wdXQ6CglkZXZfcHV0KG9kZXYpOwpvdXQ6CiAJcmV0dXJuIE5VTEw7Cgp9CgovKiBSZWFkIHBrdF9kZXYgZnJvbSB0aGUgaW50ZXJmYWNlIGFuZCBzZXQgdXAgaW50ZXJuYWwgcGt0Z2VuX2RldgogKiBzdHJ1Y3R1cmUgdG8gaGF2ZSB0aGUgcmlnaHQgaW5mb3JtYXRpb24gdG8gY3JlYXRlL3NlbmQgcGFja2V0cwogKi8Kc3RhdGljIHZvaWQgcGt0Z2VuX3NldHVwX2luamVjdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJLyogVHJ5IG9uY2UgbW9yZSwganVzdCBpbiBjYXNlIGl0IHdvcmtzIG5vdy4gKi8KICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIAogICAgICAgICAgICAgICAgcGt0Z2VuX3NldHVwX2Rldihwa3RfZGV2KTsKICAgICAgICAKICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluIHNldHVwX2luamVjdC5cbiIpOwogICAgICAgICAgICAgICAgc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluIHNldHVwX2luamVjdC5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBpbnRlcmZhY2UncyBtYWMgaWYgbm90IGV4cGxpY2l0bHkgc2V0LiAqLwoKCWlmICgocGt0X2Rldi0+c3JjX21hY1swXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1syXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1szXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s1XSA9PSAwKSkgewoKCSAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFs2XSksIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyLCA2KTsKICAgICAgIH0KICAgICAgICAvKiBTZXQgdXAgRGVzdCBNQUMgKi8KICAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFswXSksIHBrdF9kZXYtPmRzdF9tYWMsIDYpOwoKICAgICAgICAvKiBTZXQgdXAgcGt0IHNpemUgKi8KICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CgkKCWlmKHBrdF9kZXYtPmZsYWdzICYgRl9JUFY2KSB7CgkJLyoKCQkgKiBTa2lwIHRoaXMgYXV0b21hdGljIGFkZHJlc3Mgc2V0dGluZyB1bnRpbCBsb2NrcyBvciBmdW5jdGlvbnMgCgkJICogZ2V0cyBleHBvcnRlZAoJCSAqLwoKI2lmZGVmIE5PVE5PVwoJCWludCBpLCBzZXQgPSAwLCBlcnI9MTsKCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwoKCQlmb3IoaT0wOyBpPCBJTjZfQUREUl9IU0laRTsgaSsrKQoJCQlpZihwa3RfZGV2LT5jdXJfaW42X3NhZGRyLnM2X2FkZHJbaV0pIHsKCQkJCXNldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCQlpZighc2V0KSB7CgkJCQoJCQkvKgoJCQkgKiBVc2UgbGlua2xldmVsIGFkZHJlc3MgaWYgdW5jb25maWd1cmVkLgoJCQkgKgoJCQkgKiB1c2UgaXB2Nl9nZXRfbGxhZGRyIGlmL3doZW4gaXQncyBnZXQgZXhwb3J0ZWQKCQkJICovCgoKCQkJcmVhZF9sb2NrKCZhZGRyY29uZl9sb2NrKTsKCQkJaWYgKChpZGV2ID0gX19pbjZfZGV2X2dldChwa3RfZGV2LT5vZGV2KSkgIT0gTlVMTCkgewoJCQkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwoKCQkJCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CgkJCQlmb3IgKGlmcD1pZGV2LT5hZGRyX2xpc3Q7IGlmcDsgaWZwPWlmcC0+aWZfbmV4dCkgewoJCQkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CgkJCQkJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X3NhZGRyLCAmaWZwLT5hZGRyKTsKCQkJCQkJZXJyID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwoJCQl9CgkJCXJlYWRfdW5sb2NrKCZhZGRyY29uZl9sb2NrKTsKCQkJaWYoZXJyKQlwcmludGsoInBrdGdlbjogRVJST1I6IElQdjYgbGluayBhZGRyZXNzIG5vdCBhdmFpbGJsZS5cbiIpOwoJCX0KI2VuZGlmCgl9IAoJZWxzZSB7CgkJcGt0X2Rldi0+c2FkZHJfbWluID0gMDsKCQlwa3RfZGV2LT5zYWRkcl9tYXggPSAwOwoJCWlmIChzdHJsZW4ocGt0X2Rldi0+c3JjX21pbikgPT0gMCkgewoJCQkKCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OyAKCgkJCXJjdV9yZWFkX2xvY2soKTsKCQkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShwa3RfZGV2LT5vZGV2KTsKCQkJaWYgKGluX2RldikgewoJCQkJaWYgKGluX2Rldi0+aWZhX2xpc3QpIHsKCQkJCQlwa3RfZGV2LT5zYWRkcl9taW4gPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzczsKCQkJCQlwa3RfZGV2LT5zYWRkcl9tYXggPSBwa3RfZGV2LT5zYWRkcl9taW47CgkJCQl9CgkJCX0KCQkJcmN1X3JlYWRfdW5sb2NrKCk7CgkJfQoJCWVsc2UgewoJCQlwa3RfZGV2LT5zYWRkcl9taW4gPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19taW4pOwoJCQlwa3RfZGV2LT5zYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19tYXgpOwoJCX0KCgkJcGt0X2Rldi0+ZGFkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWluKTsKCQlwa3RfZGV2LT5kYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9tYXgpOwoJfQogICAgICAgIC8qIEluaXRpYWxpemUgY3VycmVudCB2YWx1ZXMuICovCiAgICAgICAgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID0gMDsKICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOwogICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciA9IHBrdF9kZXYtPnNhZGRyX21pbjsKICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSBwa3RfZGV2LT51ZHBfZHN0X21pbjsKICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHBrdF9kZXYtPnVkcF9zcmNfbWluOwoJcGt0X2Rldi0+bmZsb3dzID0gMDsKfQoKc3RhdGljIHZvaWQgc3BpbihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwgX191NjQgc3Bpbl91bnRpbF91cykKewoJX191NjQgc3RhcnQ7CglfX3U2NCBub3c7CgoJc3RhcnQgPSBub3cgPSBnZXRDdXJVcygpOwoJcHJpbnRrKEtFUk5fSU5GTyAic2xlZXBpbmcgZm9yICVkXG4iLCAoaW50KShzcGluX3VudGlsX3VzIC0gbm93KSk7Cgl3aGlsZSAobm93IDwgc3Bpbl91bnRpbF91cykgewoJCS8qIFRPRE86IG9wdGltaXNlIHNsZWVwaW5nIGJlaGF2aW9yICovCgkJaWYgKHNwaW5fdW50aWxfdXMgLSBub3cgPiBqaWZmaWVzX3RvX3VzZWNzKDEpKzEpCgkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKCQllbHNlIGlmIChzcGluX3VudGlsX3VzIC0gbm93ID4gMTAwKSB7CgkJCWRvX3NvZnRpcnEoKTsKCQkJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKQoJCQkJcmV0dXJuOwoJCQlpZiAobmVlZF9yZXNjaGVkKCkpCgkJCQlzY2hlZHVsZSgpOwoJCX0KCgkJbm93ID0gZ2V0Q3VyVXMoKTsKCX0KCglwa3RfZGV2LT5pZGxlX2FjYyArPSBub3cgLSBzdGFydDsKfQoKCi8qIEluY3JlbWVudC9yYW5kb21pemUgaGVhZGVycyBhY2NvcmRpbmcgdG8gZmxhZ3MgYW5kIGN1cnJlbnQgdmFsdWVzCiAqIGZvciBJUCBzcmMvZGVzdCwgVURQIHNyYy9kc3QgcG9ydCwgTUFDLUFkZHIgc3JjL2RzdAogKi8Kc3RhdGljIHZvaWQgbW9kX2N1cl9oZWFkZXJzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSB7ICAgICAgICAKICAgICAgICBfX3UzMiBpbW47CiAgICAgICAgX191MzIgaW14OwoJaW50ICBmbG93ID0gMDsKCglpZihwa3RfZGV2LT5jZmxvd3MpICB7CgkJZmxvdyA9IHBrdGdlbl9yYW5kb20oKSAlIHBrdF9kZXYtPmNmbG93czsKCQkKCQlpZiAocGt0X2Rldi0+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+bWF4X3BrdF9zaXplKSAKCQkJCXQgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB0OwogICAgICAgIH0KCglwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCsrOwp9CgoKc3RhdGljIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldF9pcHY0KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKCV9fdTggKmV0aDsKCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CglpbnQgZGF0YWxlbiwgaXBsZW47CglzdHJ1Y3QgaXBoZHIgKmlwaDsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2hkciAqcGdoID0gTlVMTDsKICAgICAgICAKCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCgkgKiBmaWVsZHMuCgkgKi8KCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKCglza2IgPSBhbGxvY19za2IocGt0X2Rldi0+Y3VyX3BrdF9zaXplICsgNjQgKyAxNiwgR0ZQX0FUT01JQyk7CglpZiAoIXNrYikgewoJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gbWVtb3J5Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc2tiX3Jlc2VydmUoc2tiLCAxNik7CgoJLyogIFJlc2VydmUgZm9yIGV0aGVybmV0IGFuZCBJUCBoZWFkZXIgICovCglldGggPSAoX191OCAqKSBza2JfcHVzaChza2IsIDE0KTsKCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwoJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CgoJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKCSoodTE2KikmZXRoWzEyXSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOwoKCWRhdGFsZW4gPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgLSAxNCAtIDIwIC0gODsgLyogRXRoICsgSVBoICsgVURQaCAqLwoJaWYgKGRhdGFsZW4gPCBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpKSAKCQlkYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBwa3RnZW5faGRyKTsKICAgICAgICAKCXVkcGgtPnNvdXJjZSA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7Cgl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuICsgOCk7IC8qIERBVEEgKyB1ZHBoZHIgKi8KCXVkcGgtPmNoZWNrID0gMDsgIC8qIE5vIGNoZWNrc3VtICovCgoJaXBoLT5paGwgPSA1OwoJaXBoLT52ZXJzaW9uID0gNDsKCWlwaC0+dHRsID0gMzI7CglpcGgtPnRvcyA9IDA7CglpcGgtPnByb3RvY29sID0gSVBQUk9UT19VRFA7IC8qIFVEUCAqLwoJaXBoLT5zYWRkciA9IHBrdF9kZXYtPmN1cl9zYWRkcjsKCWlwaC0+ZGFkZHIgPSBwa3RfZGV2LT5jdXJfZGFkZHI7CglpcGgtPmZyYWdfb2ZmID0gMDsKCWlwbGVuID0gMjAgKyA4ICsgZGF0YWxlbjsKCWlwaC0+dG90X2xlbiA9IGh0b25zKGlwbGVuKTsKCWlwaC0+Y2hlY2sgPSAwOwoJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodm9pZCAqKSBpcGgsIGlwaC0+aWhsKTsKCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKCXNrYi0+bWFjLnJhdyA9ICgodTggKilpcGgpIC0gMTQ7Cglza2ItPmRldiA9IG9kZXY7Cglza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CgoJaWYgKHBrdF9kZXYtPm5mcmFncyA8PSAwKSAKICAgICAgICAgICAgICAgIHBnaCA9IChzdHJ1Y3QgcGt0Z2VuX2hkciAqKXNrYl9wdXQoc2tiLCBkYXRhbGVuKTsKCWVsc2UgewoJCWludCBmcmFncyA9IHBrdF9kZXYtPm5mcmFnczsKCQlpbnQgaTsKCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIqKSgoKGNoYXIqKSh1ZHBoKSkgKyA4KTsKICAgICAgICAgICAgICAgIAoJCWlmIChmcmFncyA+IE1BWF9TS0JfRlJBR1MpCgkJCWZyYWdzID0gTUFYX1NLQl9GUkFHUzsKCQlpZiAoZGF0YWxlbiA+IGZyYWdzKlBBR0VfU0laRSkgewoJCQlza2JfcHV0KHNrYiwgZGF0YWxlbi1mcmFncypQQUdFX1NJWkUpOwoJCQlkYXRhbGVuID0gZnJhZ3MqUEFHRV9TSVpFOwoJCX0KCgkJaSA9IDA7CgkJd2hpbGUgKGRhdGFsZW4gPiAwKSB7CgkJCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgPSAwOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPQoJCQkJKGRhdGFsZW4gPCBQQUdFX1NJWkUgPyBkYXRhbGVuIDogUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+bGVuICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJc2tiLT5kYXRhX2xlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCWkrKzsKCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGk7CgkJfQoKCQl3aGlsZSAoaSA8IGZyYWdzKSB7CgkJCWludCByZW07CgoJCQlpZiAoaSA9PSAwKQoJCQkJYnJlYWs7CgoJCQlyZW0gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC8gMjsKCQkJaWYgKHJlbSA9PSAwKQoJCQkJYnJlYWs7CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC09IHJlbTsKCgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXTsKCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0ucGFnZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSByZW07CgkJCWkrKzsKCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGk7CgkJfQoJfQoKICAgICAgICAvKiBTdGFtcCB0aGUgdGltZSwgYW5kIHNlcXVlbmNlIG51bWJlciwgY29udmVydCB0aGVtIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwoKICAgICAgICBpZiAocGdoKSB7CiAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwoJICAgICAgCgkgICAgICBwZ2gtPnBnaF9tYWdpYyA9IGh0b25sKFBLVEdFTl9NQUdJQyk7CgkgICAgICBwZ2gtPnNlcV9udW0gICA9IGh0b25sKHBrdF9kZXYtPnNlcV9udW0pOwoJICAgICAgCgkgICAgICBkb19nZXR0aW1lb2ZkYXkoJnRpbWVzdGFtcCk7CgkgICAgICBwZ2gtPnR2X3NlYyAgICA9IGh0b25sKHRpbWVzdGFtcC50dl9zZWMpOwoJICAgICAgcGdoLT50dl91c2VjICAgPSBodG9ubCh0aW1lc3RhbXAudHZfdXNlYyk7CiAgICAgICAgfQogICAgICAgIHBrdF9kZXYtPnNlcV9udW0rKzsKICAgICAgICAKCXJldHVybiBza2I7Cn0KCi8qCiAqIHNjYW5faXA2LCBmbXRfaXAgdGFrZW4gZnJvbSBkaWV0bGliYy0wLjIxIAogKiBBdXRob3IgRmVsaXggdm9uIExlaXRuZXIgPGZlbGl4LWRpZXRsaWJjQGZlZmUuZGU+CiAqCiAqIFNsaWdodGx5IG1vZGlmaWVkIGZvciBrZXJuZWwuIAogKiBTaG91bGQgYmUgY2FuZGlkYXRlIGZvciBuZXQvaXB2NC91dGlscy5jCiAqIC0tcm8KICovCgpzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5faXA2KGNvbnN0IGNoYXIgKnMsY2hhciBpcFsxNl0pCnsKCXVuc2lnbmVkIGludCBpOwoJdW5zaWduZWQgaW50IGxlbj0wOwoJdW5zaWduZWQgbG9uZyB1OwoJY2hhciBzdWZmaXhbMTZdOwoJdW5zaWduZWQgaW50IHByZWZpeGxlbj0wOwoJdW5zaWduZWQgaW50IHN1ZmZpeGxlbj0wOwoJX191MzIgdG1wOwoKCWZvciAoaT0wOyBpPDE2OyBpKyspIGlwW2ldPTA7CgoJZm9yICg7OykgewoJCWlmICgqcyA9PSAnOicpIHsKCQkJbGVuKys7CgkJCWlmIChzWzFdID09ICc6JykgeyAgICAgICAgLyogRm91bmQgIjo6Iiwgc2tpcCB0byBwYXJ0IDIgKi8KCQkJCXMrPTI7CgkJCQlsZW4rKzsKCQkJCWJyZWFrOwoJCQl9CgkJCXMrKzsKCQl9CgkJewoJCQljaGFyICp0bXA7CgkJCXU9c2ltcGxlX3N0cnRvdWwocywmdG1wLDE2KTsKCQkJaT10bXAtczsKCQl9CgoJCWlmICghaSkgcmV0dXJuIDA7CgkJaWYgKHByZWZpeGxlbj09MTIgJiYgc1tpXT09Jy4nKSB7CgoJCQkvKiB0aGUgbGFzdCA0IGJ5dGVzIG1heSBiZSB3cml0dGVuIGFzIElQdjQgYWRkcmVzcyAqLwoKCQkJdG1wID0gaW5fYXRvbihzKTsKCQkJbWVtY3B5KChzdHJ1Y3QgaW5fYWRkciopKGlwKzEyKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOwoJCQlyZXR1cm4gaStsZW47CgkJfQoJCWlwW3ByZWZpeGxlbisrXSA9ICh1ID4+IDgpOwoJCWlwW3ByZWZpeGxlbisrXSA9ICh1ICYgMjU1KTsKCQlzICs9IGk7IGxlbiArPSBpOwoJCWlmIChwcmVmaXhsZW49PTE2KQoJCQlyZXR1cm4gbGVuOwoJfQoKLyogcGFydCAyLCBhZnRlciAiOjoiICovCglmb3IgKDs7KSB7CgkJaWYgKCpzID09ICc6JykgewoJCQlpZiAoc3VmZml4bGVuPT0wKQoJCQkJYnJlYWs7CgkJCXMrKzsKCQkJbGVuKys7CgkJfSBlbHNlIGlmIChzdWZmaXhsZW4hPTApCgkJCWJyZWFrOwoJCXsKCQkJY2hhciAqdG1wOwoJCQl1PXNpbXBsZV9zdHJ0b2wocywmdG1wLDE2KTsKCQkJaT10bXAtczsKCQl9CgkJaWYgKCFpKSB7CgkJCWlmICgqcykgbGVuLS07CgkJCWJyZWFrOwoJCX0KCQlpZiAoc3VmZml4bGVuK3ByZWZpeGxlbjw9MTIgJiYgc1tpXT09Jy4nKSB7CgkJCXRtcCA9IGluX2F0b24ocyk7CgkJCW1lbWNweSgoc3RydWN0IGluX2FkZHIqKShzdWZmaXgrc3VmZml4bGVuKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOwoJCQlzdWZmaXhsZW4rPTQ7CgkJCWxlbis9c3RybGVuKHMpOwoJCQlicmVhazsKCQl9CgkJc3VmZml4W3N1ZmZpeGxlbisrXSA9ICh1ID4+IDgpOwoJCXN1ZmZpeFtzdWZmaXhsZW4rK10gPSAodSAmIDI1NSk7CgkJcyArPSBpOyBsZW4gKz0gaTsKCQlpZiAocHJlZml4bGVuK3N1ZmZpeGxlbj09MTYpCgkJCWJyZWFrOwoJfQoJZm9yIChpPTA7IGk8c3VmZml4bGVuOyBpKyspCgkJaXBbMTYtc3VmZml4bGVuK2ldID0gc3VmZml4W2ldOwoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIGNoYXIgdG9oZXgoY2hhciBoZXhkaWdpdCkgewoJcmV0dXJuIGhleGRpZ2l0Pjk/aGV4ZGlnaXQrJ2EnLTEwOmhleGRpZ2l0KycwJzsKfQoKc3RhdGljIGludCBmbXRfeGxvbmcoY2hhciogcyx1bnNpZ25lZCBpbnQgaSkgewoJY2hhciogYmFrPXM7Cgkqcz10b2hleCgoaT4+MTIpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoKGk+PjgpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoKGk+PjQpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoaSYweGYpOwoJcmV0dXJuIHMtYmFrKzE7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgZm10X2lwNihjaGFyICpzLGNvbnN0IGNoYXIgaXBbMTZdKSB7Cgl1bnNpZ25lZCBpbnQgbGVuOwoJdW5zaWduZWQgaW50IGk7Cgl1bnNpZ25lZCBpbnQgdGVtcDsKCXVuc2lnbmVkIGludCBjb21wcmVzc2luZzsKCWludCBqOwoKCWxlbiA9IDA7IGNvbXByZXNzaW5nID0gMDsKCWZvciAoaj0wOyBqPDE2OyBqKz0yKSB7CgojaWZkZWYgVjRNQVBQRURQUkVGSVgKCQlpZiAoaj09MTIgJiYgIW1lbWNtcChpcCxWNG1hcHBlZHByZWZpeCwxMikpIHsKCQkJaW5ldF9udG9hX3IoKihzdHJ1Y3QgaW5fYWRkciopKGlwKzEyKSxzKTsKCQkJdGVtcD1zdHJsZW4ocyk7CgkJCXJldHVybiBsZW4rdGVtcDsKCQl9CiNlbmRpZgoJCXRlbXAgPSAoKHVuc2lnbmVkIGxvbmcpICh1bnNpZ25lZCBjaGFyKSBpcFtqXSA8PCA4KSArCgkJCSh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgY2hhcikgaXBbaisxXTsKCQlpZiAodGVtcCA9PSAwKSB7CgkJCWlmICghY29tcHJlc3NpbmcpIHsKCQkJCWNvbXByZXNzaW5nPTE7CgkJCQlpZiAoaj09MCkgewoJCQkJCSpzKys9JzonOyArK2xlbjsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWlmIChjb21wcmVzc2luZykgewoJCQkJY29tcHJlc3Npbmc9MDsKCQkJCSpzKys9JzonOyArK2xlbjsKCQkJfQoJCQlpID0gZm10X3hsb25nKHMsdGVtcCk7IGxlbiArPSBpOyBzICs9IGk7CgkJCWlmIChqPDE0KSB7CgkJCQkqcysrID0gJzonOwoJCQkJKytsZW47CgkJCX0KCQl9Cgl9CglpZiAoY29tcHJlc3NpbmcpIHsKCQkqcysrPSc6JzsgKytsZW47Cgl9Cgkqcz0wOwoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldF9pcHY2KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKCV9fdTggKmV0aDsKCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CglpbnQgZGF0YWxlbjsKCXN0cnVjdCBpcHY2aGRyICppcGg7CiAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CgoJLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKCSAqIGZpZWxkcy4KCSAqLwoJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwoKCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKSB7CgkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglza2JfcmVzZXJ2ZShza2IsIDE2KTsKCgkvKiAgUmVzZXJ2ZSBmb3IgZXRoZXJuZXQgYW5kIElQIGhlYWRlciAgKi8KCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwoJaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwoJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CgoJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKCSoodTE2KikmZXRoWzEyXSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CgoJZGF0YWxlbiA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZS0xNC0gCgkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKS1zaXplb2Yoc3RydWN0IHVkcGhkcik7IC8qIEV0aCArIElQaCArIFVEUGggKi8KCglpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpIHsgCgkJZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcik7CgkJaWYgKG5ldF9yYXRlbGltaXQoKSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAicGt0Z2VuOiBpbmNyZWFzZWQgZGF0YWxlbiB0byAlZFxuIiwgZGF0YWxlbik7Cgl9CgoJdWRwaC0+c291cmNlID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9zcmMpOwoJdWRwaC0+ZGVzdCA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfZHN0KTsKCXVkcGgtPmxlbiA9IGh0b25zKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOyAKCXVkcGgtPmNoZWNrID0gMDsgIC8qIE5vIGNoZWNrc3VtICovCgoJICoodTMyKilpcGggPSBfX2NvbnN0YW50X2h0b25sKDB4NjAwMDAwMDApOyAvKiBWZXJzaW9uICsgZmxvdyAqLwoKCWlwaC0+aG9wX2xpbWl0ID0gMzI7CgoJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIGRhdGFsZW4pOwoJaXBoLT5uZXh0aGRyID0gSVBQUk9UT19VRFA7CgoJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZwa3RfZGV2LT5jdXJfaW42X2RhZGRyKTsKCWlwdjZfYWRkcl9jb3B5KCZpcGgtPnNhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9zYWRkcik7CgoJc2tiLT5tYWMucmF3ID0gKCh1OCAqKWlwaCkgLSAxNDsKCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOwoJc2tiLT5kZXYgPSBvZGV2OwoJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwoKCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkgCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CgllbHNlIHsKCQlpbnQgZnJhZ3MgPSBwa3RfZGV2LT5uZnJhZ3M7CgkJaW50IGk7CgogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyKikoKChjaGFyKikodWRwaCkpICsgOCk7CiAgICAgICAgICAgICAgICAKCQlpZiAoZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKQoJCQlmcmFncyA9IE1BWF9TS0JfRlJBR1M7CgkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKCQkJc2tiX3B1dChza2IsIGRhdGFsZW4tZnJhZ3MqUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiA9IGZyYWdzKlBBR0VfU0laRTsKCQl9CgoJCWkgPSAwOwoJCXdoaWxlIChkYXRhbGVuID4gMCkgewoJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIDApOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBwYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0KCQkJCShkYXRhbGVuIDwgUEFHRV9TSVpFID8gZGF0YWxlbiA6IFBBR0VfU0laRSk7CgkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmxlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+ZGF0YV9sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCgkJd2hpbGUgKGkgPCBmcmFncykgewoJCQlpbnQgcmVtOwoKCQkJaWYgKGkgPT0gMCkKCQkJCWJyZWFrOwoKCQkJcmVtID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAvIDI7CgkJCWlmIChyZW0gPT0gMCkKCQkJCWJyZWFrOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAtPSByZW07CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CgkJCWdldF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0gcmVtOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCX0KCiAgICAgICAgLyogU3RhbXAgdGhlIHRpbWUsIGFuZCBzZXF1ZW5jZSBudW1iZXIsIGNvbnZlcnQgdGhlbSB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KCS8qIHNob3VsZCB3ZSB1cGRhdGUgY2xvbmVkIHBhY2tldHMgdG9vID8gKi8KICAgICAgICBpZiAocGdoKSB7CiAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwoJICAgICAgCgkgICAgICBwZ2gtPnBnaF9tYWdpYyA9IGh0b25sKFBLVEdFTl9NQUdJQyk7CgkgICAgICBwZ2gtPnNlcV9udW0gICA9IGh0b25sKHBrdF9kZXYtPnNlcV9udW0pOwoJICAgICAgCgkgICAgICBkb19nZXR0aW1lb2ZkYXkoJnRpbWVzdGFtcCk7CgkgICAgICBwZ2gtPnR2X3NlYyAgICA9IGh0b25sKHRpbWVzdGFtcC50dl9zZWMpOwoJICAgICAgcGdoLT50dl91c2VjICAgPSBodG9ubCh0aW1lc3RhbXAudHZfdXNlYyk7CiAgICAgICAgfQogICAgICAgIHBrdF9kZXYtPnNlcV9udW0rKzsKICAgICAgICAKCXJldHVybiBza2I7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmZpbGxfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglpZihwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikgCgkJcmV0dXJuIGZpbGxfcGFja2V0X2lwdjYob2RldiwgcGt0X2Rldik7CgllbHNlCgkJcmV0dXJuIGZpbGxfcGFja2V0X2lwdjQob2RldiwgcGt0X2Rldik7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9jbGVhcl9jb3VudGVycyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKICAgICAgICBwa3RfZGV2LT5zZXFfbnVtID0gMTsKICAgICAgICBwa3RfZGV2LT5pZGxlX2FjYyA9IDA7Cglwa3RfZGV2LT5zb2ZhciA9IDA7CiAgICAgICAgcGt0X2Rldi0+dHhfYnl0ZXMgPSAwOwogICAgICAgIHBrdF9kZXYtPmVycm9ycyA9IDA7Cn0KCi8qIFNldCB1cCBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgcGt0cywgY2xlYXIgY291bnRlcnMgKi8KCnN0YXRpYyB2b2lkIHBrdGdlbl9ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CglpbnQgc3RhcnRlZCA9IDA7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9ydW4uICVwXG4iLCB0KSk7CgoJaWZfbG9jayh0KTsKICAgICAgICBmb3IgKHBrdF9kZXYgPSB0LT5pZl9saXN0OyBwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCApIHsKCgkJLyoKCQkgKiBzZXR1cCBvZGV2IGFuZCBjcmVhdGUgaW5pdGlhbCBwYWNrZXQuCgkJICovCgkJcGt0Z2VuX3NldHVwX2luamVjdChwa3RfZGV2KTsKCgkJaWYocGt0X2Rldi0+b2RldikgeyAKCQkJcGt0Z2VuX2NsZWFyX2NvdW50ZXJzKHBrdF9kZXYpOwoJCQlwa3RfZGV2LT5ydW5uaW5nID0gMTsgLyogQ3JhbmtlIHllc2VsZiEgKi8KCQkJcGt0X2Rldi0+c2tiID0gTlVMTDsKCQkJcGt0X2Rldi0+c3RhcnRlZF9hdCA9IGdldEN1clVzKCk7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOyAvKiBUcmFuc21pdCBpbW1lZGlhdGVseSAqLwoJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKCQkJCgkJCXN0cmNweShwa3RfZGV2LT5yZXN1bHQsICJTdGFydGluZyIpOwoJCQlzdGFydGVkKys7CgkJfQoJCWVsc2UgCgkJCXN0cmNweShwa3RfZGV2LT5yZXN1bHQsICJFcnJvciBzdGFydGluZyIpOwoJfQoJaWZfdW5sb2NrKHQpOwoJaWYoc3RhcnRlZCkgdC0+Y29udHJvbCAmPSB+KFRfU1RPUCk7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcyh2b2lkKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHMuXG4iKSk7CgoJdGhyZWFkX2xvY2soKTsKCXdoaWxlKHQpIHsKCQlwa3RnZW5fc3RvcCh0KTsKCQl0ID0gdC0+bmV4dDsKCX0KICAgICAgIHRocmVhZF91bmxvY2soKTsKfQoKc3RhdGljIGludCB0aHJlYWRfaXNfcnVubmluZyhzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCApCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dDsKICAgICAgICBpbnQgcmVzID0gMDsKCiAgICAgICAgZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dDsgbmV4dD1uZXh0LT5uZXh0KSB7IAoJCWlmKG5leHQtPnJ1bm5pbmcpIHsKCQkJcmVzID0gMTsKCQkJYnJlYWs7CgkJfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwp9CgpzdGF0aWMgaW50IHBrdGdlbl93YWl0X3RocmVhZF9ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgKQp7CiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgd2hpbGUodGhyZWFkX2lzX3J1bm5pbmcodCkpIHsKCiAgICAgICAgICAgICAgICBpZl91bmxvY2sodCk7CgoJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7IAoKICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2lnbmFsOwogICAgICAgICAgICAgICAgaWZfbG9jayh0KTsKICAgICAgICB9CiAgICAgICAgaWZfdW5sb2NrKHQpOwogICAgICAgIHJldHVybiAxOwogc2lnbmFsOgogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHBrdGdlbl93YWl0X2FsbF90aHJlYWRzX3J1bih2b2lkKQp7CglzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOwoJaW50IHNpZyA9IDE7CgkKCXdoaWxlICh0KSB7CgkJc2lnID0gcGt0Z2VuX3dhaXRfdGhyZWFkX3J1bih0KTsKCQlpZiggc2lnID09IDAgKSBicmVhazsKCQl0aHJlYWRfbG9jaygpOwoJCXQ9dC0+bmV4dDsKCQl0aHJlYWRfdW5sb2NrKCk7Cgl9CglpZihzaWcgPT0gMCkgewoJCXRocmVhZF9sb2NrKCk7CgkJd2hpbGUgKHQpIHsKCQkJdC0+Y29udHJvbCB8PSAoVF9TVE9QKTsKCQkJdD10LT5uZXh0OwoJCX0KCQl0aHJlYWRfdW5sb2NrKCk7Cgl9CglyZXR1cm4gc2lnOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fcnVuX2FsbF90aHJlYWRzKHZvaWQpCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIikpOwoKCXRocmVhZF9sb2NrKCk7CgoJd2hpbGUodCkgewoJCXQtPmNvbnRyb2wgfD0gKFRfUlVOKTsKCQl0ID0gdC0+bmV4dDsKCX0KCXRocmVhZF91bmxvY2soKTsKCglzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMjUpKTsgIC8qIFByb3BhZ2F0ZSB0aHJlYWQtPmNvbnRyb2wgICovCgkJCQoJcGt0Z2VuX3dhaXRfYWxsX3RocmVhZHNfcnVuKCk7Cn0KCgpzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdHMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsIGludCBucl9mcmFncykKewogICAgICAgX191NjQgdG90YWxfdXMsIGJwcywgbWJwcywgcHBzLCBpZGxlOwogICAgICAgY2hhciAqcCA9IHBrdF9kZXYtPnJlc3VsdDsKCiAgICAgICB0b3RhbF91cyA9IHBrdF9kZXYtPnN0b3BwZWRfYXQgLSBwa3RfZGV2LT5zdGFydGVkX2F0OwoKICAgICAgIGlkbGUgPSBwa3RfZGV2LT5pZGxlX2FjYzsKCiAgICAgICBwICs9IHNwcmludGYocCwgIk9LOiAlbGx1KGMlbGx1K2QlbGx1KSB1c2VjLCAlbGx1ICglZGJ5dGUsJWRmcmFncylcbiIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG90YWxfdXMsIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSh0b3RhbF91cyAtIGlkbGUpLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWRsZSwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5zb2ZhciwgCgkJICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSwgbnJfZnJhZ3MpOwoKICAgICAgIHBwcyA9IHBrdF9kZXYtPnNvZmFyICogVVNFQ19QRVJfU0VDOwoKICAgICAgIHdoaWxlICgodG90YWxfdXMgPj4gMzIpICE9IDApIHsKICAgICAgICAgICAgICAgcHBzID4+PSAxOwogICAgICAgICAgICAgICB0b3RhbF91cyA+Pj0gMTsKICAgICAgIH0KCiAgICAgICBkb19kaXYocHBzLCB0b3RhbF91cyk7CiAgICAgICAKICAgICAgIGJwcyA9IHBwcyAqIDggKiBwa3RfZGV2LT5jdXJfcGt0X3NpemU7CgogICAgICAgbWJwcyA9IGJwczsKICAgICAgIGRvX2RpdihtYnBzLCAxMDAwMDAwKTsKICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAlbGx1cHBzICVsbHVNYi9zZWMgKCVsbHVicHMpIGVycm9yczogJWxsdSIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcHBzLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWJwcywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJwcywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPmVycm9ycyk7Cn0KIAoKLyogU2V0IHN0b3BwZWQtYXQgdGltZXIsIHJlbW92ZSBmcm9tIHJ1bm5pbmcgbGlzdCwgZG8gY291bnRlcnMgJiBzdGF0aXN0aWNzICovCgpzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCQogICAgICAgIGlmICghcGt0X2Rldi0+cnVubmluZykgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGludGVyZmFjZTogJXMgaXMgYWxyZWFkeSBzdG9wcGVkXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICBwa3RfZGV2LT5zdG9wcGVkX2F0ID0gZ2V0Q3VyVXMoKTsKICAgICAgICBwa3RfZGV2LT5ydW5uaW5nID0gMDsKCglzaG93X3Jlc3VsdHMocGt0X2Rldiwgc2tiX3NoaW5mbyhwa3RfZGV2LT5za2IpLT5ucl9mcmFncyk7CgoJaWYgKHBrdF9kZXYtPnNrYikgCgkJa2ZyZWVfc2tiKHBrdF9kZXYtPnNrYik7CgoJcGt0X2Rldi0+c2tiID0gTlVMTDsKCQogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKm5leHRfdG9fcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKewoJc3RydWN0IHBrdGdlbl9kZXYgKm5leHQsICpiZXN0ID0gTlVMTDsKICAgICAgICAKCWlmX2xvY2sodCk7CgoJZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dCA7IG5leHQ9bmV4dC0+bmV4dCkgewoJCWlmKCFuZXh0LT5ydW5uaW5nKSBjb250aW51ZTsKCQlpZihiZXN0ID09IE5VTEwpIGJlc3Q9bmV4dDsKCQllbHNlIGlmICggbmV4dC0+bmV4dF90eF91cyA8IGJlc3QtPm5leHRfdHhfdXMpIAoJCQliZXN0ID0gIG5leHQ7Cgl9CglpZl91bmxvY2sodCk7CiAgICAgICAgcmV0dXJuIGJlc3Q7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSB7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQgPSBOVUxMOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fc3RvcC5cbiIpKTsKCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dDsgbmV4dD1uZXh0LT5uZXh0KQogICAgICAgICAgICAgICAgcGt0Z2VuX3N0b3BfZGV2aWNlKG5leHQpOwoKICAgICAgICBpZl91bmxvY2sodCk7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9yZW1fYWxsX2lmcyhzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqY3VyLCAqbmV4dCA9IE5VTEw7CiAgICAgICAgCiAgICAgICAgLyogUmVtb3ZlIGFsbCBkZXZpY2VzLCBmcmVlIG1lbSAqLwogCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKGN1cj10LT5pZl9saXN0OyBjdXI7IGN1cj1uZXh0KSB7IAoJCW5leHQgPSBjdXItPm5leHQ7CgkJcGt0Z2VuX3JlbW92ZV9kZXZpY2UodCwgY3VyKTsKCX0KCiAgICAgICAgaWZfdW5sb2NrKHQpOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fcmVtX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCnsKICAgICAgICAvKiBSZW1vdmUgZnJvbSB0aGUgdGhyZWFkIGxpc3QgKi8KCglzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdG1wID0gcGt0Z2VuX3RocmVhZHM7CgogICAgICAgIGlmIChzdHJsZW4odC0+Zm5hbWUpKQogICAgICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkodC0+Zm5hbWUsIE5VTEwpOwoKICAgICAgIHRocmVhZF9sb2NrKCk7CgoJaWYgKHRtcCA9PSB0KQoJCXBrdGdlbl90aHJlYWRzID0gdG1wLT5uZXh0OwoJZWxzZSB7CgkJd2hpbGUgKHRtcCkgewoJCQlpZiAodG1wLT5uZXh0ID09IHQpIHsKCQkJCXRtcC0+bmV4dCA9IHQtPm5leHQ7CgkJCQl0LT5uZXh0ID0gTlVMTDsKCQkJCWJyZWFrOwoJCQl9CgkJCXRtcCA9IHRtcC0+bmV4dDsKCQl9Cgl9CiAgICAgICAgdGhyZWFkX3VubG9jaygpOwp9CgpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBrdGdlbl94bWl0KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiA9IE5VTEw7CglfX3U2NCBpZGxlX3N0YXJ0ID0gMDsKCWludCByZXQ7CgoJb2RldiA9IHBrdF9kZXYtPm9kZXY7CgkKCWlmIChwa3RfZGV2LT5kZWxheV91cyB8fCBwa3RfZGV2LT5kZWxheV9ucykgewoJCXU2NCBub3c7CgoJCW5vdyA9IGdldEN1clVzKCk7CgkJaWYgKG5vdyA8IHBrdF9kZXYtPm5leHRfdHhfdXMpCgkJCXNwaW4ocGt0X2RldiwgcGt0X2Rldi0+bmV4dF90eF91cyk7CgoJCS8qIFRoaXMgaXMgbWF4IERFTEFZLCB0aGlzIGhhcyBzcGVjaWFsIG1lYW5pbmcgb2YKCQkgKiAibmV2ZXIgdHJhbnNtaXQiCgkJICovCgkJaWYgKHBrdF9kZXYtPmRlbGF5X3VzID09IDB4N0ZGRkZGRkYpIHsKCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCkgKyBwa3RfZGV2LT5kZWxheV91czsKCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IHBrdF9kZXYtPmRlbGF5X25zOwoJCQlnb3RvIG91dDsKCQl9Cgl9CgkKCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpIHx8IG5lZWRfcmVzY2hlZCgpKSB7CgkJaWRsZV9zdGFydCA9IGdldEN1clVzKCk7CgkJCgkJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CgkJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKCQkJZ290byBvdXQ7CgkJfQoJCWlmIChuZWVkX3Jlc2NoZWQoKSkgCgkJCXNjaGVkdWxlKCk7CgkJCgkJcGt0X2Rldi0+aWRsZV9hY2MgKz0gZ2V0Q3VyVXMoKSAtIGlkbGVfc3RhcnQ7CgkJCgkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikpIHsKCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRPRE8gKi8KCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgkJCWdvdG8gb3V0OyAvKiBUcnkgdGhlIG5leHQgaW50ZXJmYWNlICovCgkJfQoJfQoJCglpZiAocGt0X2Rldi0+bGFzdF9vayB8fCAhcGt0X2Rldi0+c2tiKSB7CgkJaWYgKCgrK3BrdF9kZXYtPmNsb25lX2NvdW50ID49IHBrdF9kZXYtPmNsb25lX3NrYiApIHx8ICghcGt0X2Rldi0+c2tiKSkgewoJCQkvKiBidWlsZCBhIG5ldyBwa3QgKi8KCQkJaWYgKHBrdF9kZXYtPnNrYikgCgkJCQlrZnJlZV9za2IocGt0X2Rldi0+c2tiKTsKCQkJCgkJCXBrdF9kZXYtPnNrYiA9IGZpbGxfcGFja2V0KG9kZXYsIHBrdF9kZXYpOwoJCQlpZiAocGt0X2Rldi0+c2tiID09IE5VTEwpIHsKCQkJCXByaW50aygicGt0Z2VuOiBFUlJPUjogY291bGRuJ3QgYWxsb2NhdGUgc2tiIGluIGZpbGxfcGFja2V0LlxuIik7CgkJCQlzY2hlZHVsZSgpOwoJCQkJcGt0X2Rldi0+Y2xvbmVfY291bnQtLTsgLyogYmFjayBvdXQgaW5jcmVtZW50LCBPT00gKi8KCQkJCWdvdG8gb3V0OwoJCQl9CgkJCXBrdF9kZXYtPmFsbG9jYXRlZF9za2JzKys7CgkJCXBrdF9kZXYtPmNsb25lX2NvdW50ID0gMDsgLyogcmVzZXQgY291bnRlciAqLwoJCX0KCX0KCQoJc3Bpbl9sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOwoJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpKSB7CgoJCWF0b21pY19pbmMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CnJldHJ5X25vdzoKCQlyZXQgPSBvZGV2LT5oYXJkX3N0YXJ0X3htaXQocGt0X2Rldi0+c2tiLCBvZGV2KTsKCQlpZiAobGlrZWx5KHJldCA9PSBORVRERVZfVFhfT0spKSB7CgkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAxOyAgICAKCQkJcGt0X2Rldi0+c29mYXIrKzsKCQkJcGt0X2Rldi0+c2VxX251bSsrOwoJCQlwa3RfZGV2LT50eF9ieXRlcyArPSBwa3RfZGV2LT5jdXJfcGt0X3NpemU7CgkJCQoJCX0gZWxzZSBpZiAocmV0ID09IE5FVERFVl9UWF9MT0NLRUQgCgkJCSAgICYmIChvZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTExUWCkpIHsKCQkJY3B1X3JlbGF4KCk7CgkJCWdvdG8gcmV0cnlfbm93OwoJCX0gZWxzZSB7ICAvKiBSZXRyeSBpdCBuZXh0IHRpbWUgKi8KCQkJCgkJCWF0b21pY19kZWMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CgkJCQoJCQlpZiAoZGVidWcgJiYgbmV0X3JhdGVsaW1pdCgpKQoJCQkJcHJpbnRrKEtFUk5fSU5GTyAicGt0Z2VuOiBIYXJkIHhtaXQgZXJyb3JcbiIpOwoJCQkKCQkJcGt0X2Rldi0+ZXJyb3JzKys7CgkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAwOwoJCX0KCgkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7CgkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgoJCXBrdF9kZXYtPm5leHRfdHhfdXMgKz0gcGt0X2Rldi0+ZGVsYXlfdXM7CgkJcGt0X2Rldi0+bmV4dF90eF9ucyArPSBwa3RfZGV2LT5kZWxheV9uczsKCgkJaWYgKHBrdF9kZXYtPm5leHRfdHhfbnMgPiAxMDAwKSB7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMrKzsKCQkJcGt0X2Rldi0+bmV4dF90eF9ucyAtPSAxMDAwOwoJCX0KCX0gCgoJZWxzZSB7ICAvKiBSZXRyeSBpdCBuZXh0IHRpbWUgKi8KICAgICAgICAgICAgICAgIHBrdF9kZXYtPmxhc3Rfb2sgPSAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRPRE8gKi8KCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKICAgICAgICB9CgoJc3Bpbl91bmxvY2tfYmgoJm9kZXYtPnhtaXRfbG9jayk7CgkKCS8qIElmIHBrdF9kZXYtPmNvdW50IGlzIHplcm8sIHRoZW4gcnVuIGZvcmV2ZXIgKi8KCWlmICgocGt0X2Rldi0+Y291bnQgIT0gMCkgJiYgKHBrdF9kZXYtPnNvZmFyID49IHBrdF9kZXYtPmNvdW50KSkgewoJCWlmIChhdG9taWNfcmVhZCgmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKSAhPSAxKSB7CgkJCWlkbGVfc3RhcnQgPSBnZXRDdXJVcygpOwoJCQl3aGlsZSAoYXRvbWljX3JlYWQoJihwa3RfZGV2LT5za2ItPnVzZXJzKSkgIT0gMSkgewoJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzY2hlZHVsZSgpOwoJCQl9CgkJCXBrdF9kZXYtPmlkbGVfYWNjICs9IGdldEN1clVzKCkgLSBpZGxlX3N0YXJ0OwoJCX0KICAgICAgICAgICAgICAgIAoJCS8qIERvbmUgd2l0aCB0aGlzICovCgkJcGt0Z2VuX3N0b3BfZGV2aWNlKHBrdF9kZXYpOwoJfSAKIG91dDo7CiB9CgovKiAKICogTWFpbiBsb29wIG9mIHRoZSB0aHJlYWQgZ29lcyBoZXJlCiAqLwoKc3RhdGljIHZvaWQgcGt0Z2VuX3RocmVhZF93b3JrZXIoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpIAp7CglERUZJTkVfV0FJVCh3YWl0KTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CglpbnQgY3B1ID0gdC0+Y3B1OwoJc2lnc2V0X3QgdG1wc2lnOwoJdTMyIG1heF9iZWZvcmVfc29mdGlycTsKICAgICAgICB1MzIgdHhfc2luY2Vfc29mdGlycSA9IDA7CgoJZGFlbW9uaXplKCJwa3RnZW4vJWQiLCBjcHUpOwoKICAgICAgICAvKiBCbG9jayBhbGwgc2lnbmFscyBleGNlcHQgU0lHS0lMTCwgU0lHU1RPUCBhbmQgU0lHVEVSTSAqLwoKICAgICAgICBzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKICAgICAgICB0bXBzaWcgPSBjdXJyZW50LT5ibG9ja2VkOwogICAgICAgIHNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIAogICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdLSUxMKSB8IAogICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdTVE9QKXwgCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYXNrKFNJR1RFUk0pKTsKCiAgICAgICAgcmVjYWxjX3NpZ3BlbmRpbmcoKTsKICAgICAgICBzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwoKCS8qIE1pZ3JhdGUgdG8gdGhlIHJpZ2h0IENQVSAqLwoJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKICAgICAgICBpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkKICAgICAgICAgICAgICAgIEJVRygpOwoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnQtPnF1ZXVlKTsKCgl0LT5jb250cm9sICY9IH4oVF9URVJNSU5BVEUpOwoJdC0+Y29udHJvbCAmPSB+KFRfUlVOKTsKCXQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwoJdC0+Y29udHJvbCAmPSB+KFRfUkVNREVWKTsKCiAgICAgICAgdC0+cGlkID0gY3VycmVudC0+cGlkOyAgICAgICAgCgogICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBzdGFydGluZyBwa3RnZW4vJWQ6ICBwaWQ9JWRcbiIsIGNwdSwgY3VycmVudC0+cGlkKSk7CgoJbWF4X2JlZm9yZV9zb2Z0aXJxID0gdC0+bWF4X2JlZm9yZV9zb2Z0aXJxOwogICAgICAgIAogICAgICAgIF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKICAgICAgICBtYigpOwoKICAgICAgICB3aGlsZSAoMSkgewoJCQoJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCgkJLyoKCQkgKiBHZXQgbmV4dCBkZXYgdG8geG1pdCAtLSBpZiBhbnkuCgkJICovCgogICAgICAgICAgICAgICAgcGt0X2RldiA9IG5leHRfdG9fcnVuKHQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAocGt0X2RldikgewoKCQkJcGt0Z2VuX3htaXQocGt0X2Rldik7CgoJCQkvKgoJCQkgKiBXZSBsaWtlIHRvIHN0YXkgUlVOTklORyBidXQgbXVzdCBhbHNvIGdpdmUKCQkJICogb3RoZXJzIGZhaXIgc2hhcmUuCgkJCSAqLwoKCQkJdHhfc2luY2Vfc29mdGlycSArPSBwa3RfZGV2LT5sYXN0X29rOwoKCQkJaWYgKHR4X3NpbmNlX3NvZnRpcnEgPiBtYXhfYmVmb3JlX3NvZnRpcnEpIHsKCQkJCWlmIChsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKSkKCQkJCQlkb19zb2Z0aXJxKCk7CgkJCQl0eF9zaW5jZV9zb2Z0aXJxID0gMDsKCQkJfQoJCX0gZWxzZSB7CgkJCXByZXBhcmVfdG9fd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOwoJCQlmaW5pc2hfd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQpOwoJCX0KCiAgICAgICAgICAgICAgICAvKiAKCQkgKiBCYWNrIGZyb20gc2xlZXAsIGVpdGhlciBkdWUgdG8gdGhlIHRpbWVvdXQgb3Igc2lnbmFsLgoJCSAqIFdlIGNoZWNrIGlmIHdlIGhhdmUgYW55ICJwb3N0ZWQiIHdvcmsgZm9yIHVzLgoJCSAqLwoKICAgICAgICAgICAgICAgIGlmICh0LT5jb250cm9sICYgVF9URVJNSU5BVEUgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSByZWNlaXZlZCBhIHJlcXVlc3QgdG8gdGVybWluYXRlIG91cnNlbGYgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCgoJCWlmKHQtPmNvbnRyb2wgJiBUX1NUT1ApIHsKCQkJcGt0Z2VuX3N0b3AodCk7CgkJCXQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwoJCX0KCgkJaWYodC0+Y29udHJvbCAmIFRfUlVOKSB7CgkJCXBrdGdlbl9ydW4odCk7CgkJCXQtPmNvbnRyb2wgJj0gfihUX1JVTik7CgkJfQoKCQlpZih0LT5jb250cm9sICYgVF9SRU1ERVYpIHsKCQkJcGt0Z2VuX3JlbV9hbGxfaWZzKHQpOwoJCQl0LT5jb250cm9sICY9IH4oVF9SRU1ERVYpOwoJCX0KCgkJaWYgKG5lZWRfcmVzY2hlZCgpKSAKCQkJc2NoZWR1bGUoKTsKICAgICAgICB9IAoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+bmFtZSkpOwogICAgICAgIHBrdGdlbl9zdG9wKHQpOwoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgYWxsIGRldmljZVxuIiwgdC0+bmFtZSkpOwogICAgICAgIHBrdGdlbl9yZW1fYWxsX2lmcyh0KTsKCiAgICAgICAgUEdfREVCVUcocHJpbnRrKCJwa3RnZW46ICVzIHJlbW92aW5nIHRocmVhZC5cbiIsIHQtPm5hbWUpKTsKICAgICAgICBwa3RnZW5fcmVtX3RocmVhZCh0KTsKfQoKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fZmluZF9kZXYoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIqIGlmbmFtZSkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKHBrdF9kZXY9dC0+aWZfbGlzdDsgcGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQgKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBrdF9kZXYtPmlmbmFtZSwgaWZuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWZfdW5sb2NrKHQpOwoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGZpbmRfZGV2KCVzKSByZXR1cm5pbmcgJXBcbiIsIGlmbmFtZSxwa3RfZGV2KSk7CiAgICAgICAgcmV0dXJuIHBrdF9kZXY7Cn0KCi8qIAogKiBBZGRzIGEgZGV2IGF0IGZyb250IG9mIGlmX2xpc3QuIAogKi8KCnN0YXRpYyBpbnQgYWRkX2Rldl90b190aHJlYWQoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSAKewoJaW50IHJ2ID0gMDsKCQogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIGlmIChwa3RfZGV2LT5wZ190aHJlYWQpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogIGFscmVhZHkgYXNzaWduZWQgdG8gYSB0aHJlYWQuXG4iKTsKICAgICAgICAgICAgICAgIHJ2ID0gLUVCVVNZOwogICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgfQoJcGt0X2Rldi0+bmV4dCA9dC0+aWZfbGlzdDsgdC0+aWZfbGlzdD1wa3RfZGV2OwogICAgICAgIHBrdF9kZXYtPnBnX3RocmVhZCA9IHQ7Cglwa3RfZGV2LT5ydW5uaW5nID0gMDsKCiBvdXQ6CiAgICAgICAgaWZfdW5sb2NrKHQpOyAgICAgICAgCiAgICAgICAgcmV0dXJuIHJ2Owp9CgovKiBDYWxsZWQgdW5kZXIgdGhyZWFkIGxvY2sgKi8KCnN0YXRpYyBpbnQgcGt0Z2VuX2FkZF9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIqIGlmbmFtZSkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldjsKCQoJLyogV2UgZG9uJ3QgYWxsb3cgYSBkZXZpY2UgdG8gYmUgb24gc2V2ZXJhbCB0aHJlYWRzICovCgoJaWYoIChwa3RfZGV2ID0gX19wa3RnZW5fTk5fdGhyZWFkcyhpZm5hbWUsIEZJTkQpKSA9PSBOVUxMKSB7CgkJCQkJCSAgIAoJCXBrdF9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2RldiksIEdGUF9LRVJORUwpOwogICAgICAgICAgICAgICAgaWYgKCFwa3RfZGV2KSAKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CgogICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2RldikpOwoKCQlwa3RfZGV2LT5mbG93cyA9IHZtYWxsb2MoTUFYX0NGTE9XUypzaXplb2Yoc3RydWN0IGZsb3dfc3RhdGUpKTsKCQlpZiAocGt0X2Rldi0+Zmxvd3MgPT0gTlVMTCkgewoJCQlrZnJlZShwa3RfZGV2KTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJCW1lbXNldChwa3RfZGV2LT5mbG93cywgMCwgTUFYX0NGTE9XUypzaXplb2Yoc3RydWN0IGZsb3dfc3RhdGUpKTsKCgkJcGt0X2Rldi0+bWluX3BrdF9zaXplID0gRVRIX1pMRU47CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5tYXhfcGt0X3NpemUgPSBFVEhfWkxFTjsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPm5mcmFncyA9IDA7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jbG9uZV9za2IgPSBwZ19jbG9uZV9za2JfZDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRlbGF5X3VzID0gcGdfZGVsYXlfZCAvIDEwMDA7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5kZWxheV9ucyA9IHBnX2RlbGF5X2QgJSAxMDAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+Y291bnQgPSBwZ19jb3VudF9kOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+c29mYXIgPSAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX3NyY19taW4gPSA5OyAvKiBzaW5rIHBvcnQgKi8KICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWF4ID0gOTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWluID0gOTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9kc3RfbWF4ID0gOTsKCiAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPmlmbmFtZSwgaWZuYW1lLCAzMSk7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBrdF9kZXYtPmZuYW1lLCAiJXMvJXMiLCBQR19QUk9DX0RJUiwgaWZuYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoISBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0Z2VuX3NldHVwX2RldiBmYWlsZWQuXG4iKTsKCQkJaWYgKHBrdF9kZXYtPmZsb3dzKQoJCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwogICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeShwa3RfZGV2LT5mbmFtZSwgMDYwMCwgTlVMTCk7CiAgICAgICAgICAgICAgICBpZiAoIXBrdF9kZXYtPnByb2NfZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeS5cbiIsIHBrdF9kZXYtPmZuYW1lKTsKCQkJaWYgKHBrdF9kZXYtPmZsb3dzKQoJCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwogICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+cmVhZF9wcm9jID0gcHJvY19pZl9yZWFkOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQtPndyaXRlX3Byb2MgPSBwcm9jX2lmX3dyaXRlOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+cHJvY19lbnQtPmRhdGEgPSAodm9pZCopKHBrdF9kZXYpOwoJCXBrdF9kZXYtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOwoKICAgICAgICAgICAgICAgIHJldHVybiBhZGRfZGV2X3RvX3RocmVhZCh0LCBwa3RfZGV2KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGludGVyZmFjZSBhbHJlYWR5IHVzZWQuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgfQp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl9maW5kX3RocmVhZChjb25zdCBjaGFyKiBuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKCiAgICAgICB0aHJlYWRfbG9jaygpOwoKICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgd2hpbGUgKHQpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIHQgPSB0LT5uZXh0OwogICAgICAgIH0KICAgICAgICB0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgcmV0dXJuIHQ7Cn0KCnN0YXRpYyBpbnQgcGt0Z2VuX2NyZWF0ZV90aHJlYWQoY29uc3QgY2hhciogbmFtZSwgaW50IGNwdSkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IE5VTEw7CgogICAgICAgIGlmIChzdHJsZW4obmFtZSkgPiAzMSkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiAgVGhyZWFkIG5hbWUgY2Fubm90IGJlIG1vcmUgdGhhbiAzMSBjaGFyYWN0ZXJzLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHBrdGdlbl9maW5kX3RocmVhZChuYW1lKSkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiB0aHJlYWQ6ICVzIGFscmVhZHkgZXhpc3RzXG4iLCBuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCiAgICAgICAgdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwa3RnZW5fdGhyZWFkKSwgR0ZQX0tFUk5FTCkpOwogICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBvdXQgb2YgbWVtb3J5LCBjYW4ndCBjcmVhdGUgbmV3IHRocmVhZC5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgfQoKICAgICAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHN0cnVjdCBwa3RnZW5fdGhyZWFkKSk7CiAgICAgICAgc3RyY3B5KHQtPm5hbWUsIG5hbWUpOwogICAgICAgIHNwaW5fbG9ja19pbml0KCZ0LT5pZl9sb2NrKTsKCXQtPmNwdSA9IGNwdTsKICAgICAgICAKICAgICAgICBzcHJpbnRmKHQtPmZuYW1lLCAiJXMvJXMiLCBQR19QUk9DX0RJUiwgdC0+bmFtZSk7CiAgICAgICAgdC0+cHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeSh0LT5mbmFtZSwgMDYwMCwgTlVMTCk7CiAgICAgICAgaWYgKCF0LT5wcm9jX2VudCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgdC0+Zm5hbWUpOwogICAgICAgICAgICAgICAga2ZyZWUodCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CiAgICAgICAgdC0+cHJvY19lbnQtPnJlYWRfcHJvYyA9IHByb2NfdGhyZWFkX3JlYWQ7CiAgICAgICAgdC0+cHJvY19lbnQtPndyaXRlX3Byb2MgPSBwcm9jX3RocmVhZF93cml0ZTsKICAgICAgICB0LT5wcm9jX2VudC0+ZGF0YSA9ICh2b2lkKikodCk7CiAgICAgICAgdC0+cHJvY19lbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CgogICAgICAgIHQtPm5leHQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICBwa3RnZW5fdGhyZWFkcyA9IHQ7CgoJaWYgKGtlcm5lbF90aHJlYWQoKHZvaWQgKikgcGt0Z2VuX3RocmVhZF93b3JrZXIsICh2b2lkICopIHQsIAoJCQkgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBDTE9ORV9TSUdIQU5EKSA8IDApCgkJcHJpbnRrKCJwa3RnZW46IGtlcm5lbF90aHJlYWQoKSBmYWlsZWQgZm9yIGNwdSAlZFxuIiwgdC0+Y3B1KTsKCglyZXR1cm4gMDsKfQoKLyogCiAqIFJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgdGhyZWFkIGlmX2xpc3QuIAogKi8Kc3RhdGljIHZvaWQgX3JlbV9kZXZfZnJvbV9pZl9saXN0KHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCXN0cnVjdCBwa3RnZW5fZGV2ICppLCAqcHJldiA9IE5VTEw7CgoJaSA9IHQtPmlmX2xpc3Q7CgoJd2hpbGUoaSkgewoJCWlmKGkgPT0gcGt0X2RldikgewoJCQlpZihwcmV2KSBwcmV2LT5uZXh0ID0gaS0+bmV4dDsKCQkJZWxzZSB0LT5pZl9saXN0ID0gTlVMTDsKCQkJYnJlYWs7CgkJfQoJCXByZXYgPSBpOwoJCWk9aS0+bmV4dDsKCX0KfQoKc3RhdGljIGludCBwa3RnZW5fcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IHJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2RldikpOwoKICAgICAgICBpZiAocGt0X2Rldi0+cnVubmluZykgeyAKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOldBUk5JTkc6IHRyeWluZyB0byByZW1vdmUgYSBydW5uaW5nIGludGVyZmFjZSwgc3RvcHBpbmcgaXQgbm93LlxuIik7CiAgICAgICAgICAgICAgICBwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIERpcy1hc3NvY2lhdGUgZnJvbSB0aGUgaW50ZXJmYWNlICovCgoJaWYgKHBrdF9kZXYtPm9kZXYpIHsKCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+b2RldiA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIAoJLyogQW5kIHVwZGF0ZSB0aGUgdGhyZWFkIGlmX2xpc3QgKi8KCglfcmVtX2Rldl9mcm9tX2lmX2xpc3QodCwgcGt0X2Rldik7CgogICAgICAgIC8qIENsZWFuIHVwIHByb2MgZmlsZSBzeXN0ZW0gKi8KCiAgICAgICAgaWYgKHN0cmxlbihwa3RfZGV2LT5mbmFtZSkpIAogICAgICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkocGt0X2Rldi0+Zm5hbWUsIE5VTEwpOwoKCWlmIChwa3RfZGV2LT5mbG93cykKCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CglrZnJlZShwa3RfZGV2KTsKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2luaXQgcGdfaW5pdCh2b2lkKSAKewoJaW50IGNwdTsKCXByaW50ayh2ZXJzaW9uKTsKCiAgICAgICAgbW9kdWxlX2ZuYW1lWzBdID0gMDsKCgljcmVhdGVfcHJvY19kaXIoKTsKCiAgICAgICAgc3ByaW50Zihtb2R1bGVfZm5hbWUsICIlcy9wZ2N0cmwiLCBQR19QUk9DX0RJUik7CiAgICAgICAgbW9kdWxlX3Byb2NfZW50ID0gY3JlYXRlX3Byb2NfZW50cnkobW9kdWxlX2ZuYW1lLCAwNjAwLCBOVUxMKTsKICAgICAgICBpZiAoIW1vZHVsZV9wcm9jX2VudCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeS5cbiIsIG1vZHVsZV9mbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CgogICAgICAgIG1vZHVsZV9wcm9jX2VudC0+cHJvY19mb3BzID0gICZwa3RnZW5fZm9wczsKICAgICAgICBtb2R1bGVfcHJvY19lbnQtPmRhdGEgPSBOVUxMOwoKCS8qIFJlZ2lzdGVyIHVzIHRvIHJlY2VpdmUgbmV0ZGV2aWNlIGV2ZW50cyAqLwoJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwa3RnZW5fbm90aWZpZXJfYmxvY2spOwogICAgICAgIAoJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTIDsgY3B1KyspIHsKCQljaGFyIGJ1ZlszMF07CgoJCWlmICghY3B1X29ubGluZShjcHUpKQoJCQljb250aW51ZTsKCiAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgImtwa3RnZW5kXyVpIiwgY3B1KTsKICAgICAgICAgICAgICAgIHBrdGdlbl9jcmVhdGVfdGhyZWFkKGJ1ZiwgY3B1KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7ICAgICAgICAKfQoKc3RhdGljIHZvaWQgX19leGl0IHBnX2NsZWFudXAodm9pZCkKewoJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CgogICAgICAgIC8qIFN0b3AgYWxsIGludGVyZmFjZXMgJiB0aHJlYWRzICovICAgICAgICAKCiAgICAgICAgd2hpbGUgKHBrdGdlbl90aHJlYWRzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOwogICAgICAgICAgICAgICAgcGt0Z2VuX3RocmVhZHMtPmNvbnRyb2wgfD0gKFRfVEVSTUlOQVRFKTsKCgkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocXVldWUsICh0ICE9IHBrdGdlbl90aHJlYWRzKSwgSFopOwogICAgICAgIH0KCiAgICAgICAgLyogVW4tcmVnaXN0ZXIgdXMgZnJvbSByZWNlaXZpbmcgbmV0ZGV2aWNlIGV2ZW50cyAqLwoJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBrdGdlbl9ub3RpZmllcl9ibG9jayk7CgogICAgICAgIC8qIENsZWFuIHVwIHByb2MgZmlsZSBzeXN0ZW0gKi8KCiAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkobW9kdWxlX2ZuYW1lLCBOVUxMKTsKICAgICAgICAKCXJlbW92ZV9wcm9jX2RpcigpOwp9CgoKbW9kdWxlX2luaXQocGdfaW5pdCk7Cm1vZHVsZV9leGl0KHBnX2NsZWFudXApOwoKTU9EVUxFX0FVVEhPUigiUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2UiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgR2VuZXJhdG9yIHRvb2wiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwptb2R1bGVfcGFyYW0ocGdfY291bnRfZCwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKHBnX2RlbGF5X2QsIGludCwgMCk7Cm1vZHVsZV9wYXJhbShwZ19jbG9uZV9za2JfZCwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwo=