LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY29tbW9uLmMKICogVmVyc2lvbjogICAgICAgMC45CiAqIERlc2NyaXB0aW9uOiAgIElyREEgTEFOIEFjY2VzcyBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTM6MTAgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgojaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4gCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2ZpbHRlci5oPgoKCi8qIAogKiBTZW5kIGdyYXR1aXRvdXMgQVJQIHdoZW4gY29ubmVjdGVkIHRvIGEgbmV3IEFQIG9yIG5vdC4gTWF5IGJlIGEgY2xldmVyCiAqIHRoaW5nIHRvIGRvLCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSBtYWNoaW5lIGNyYXNoZXMgaWYgeW91IHVzZSBESENQLiBTbwogKiBsZXRzIG5vdCB1c2UgaXQgYnkgZGVmYXVsdC4KICovCiN1bmRlZiBDT05GSUdfSVJMQU5fU0VORF9HUkFUVUlUT1VTX0FSUAoKLyogZXh0ZXJuIGNoYXIgc3lzY3RsX2Rldm5hbWVbXTsgKi8KCi8qCiAqICBNYXN0ZXIgc3RydWN0dXJlCiAqLwpzdGF0aWMgTElTVF9IRUFEKGlybGFucyk7CgpzdGF0aWMgdm9pZCAqY2tleTsKc3RhdGljIHZvaWQgKnNrZXk7CgovKiBNb2R1bGUgcGFyYW1ldGVycyAqLwpzdGF0aWMgaW50IGV0aDsgICAvKiBVc2UgImV0aCIgb3IgImlybGFuIiBuYW1lIGZvciBkZXZpY2VzICovCnN0YXRpYyBpbnQgYWNjZXNzID0gQUNDRVNTX1BFRVI7IC8qIFBFRVIsIERJUkVDVCBvciBIT1NURUQgKi8KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwpzdGF0aWMgY29uc3QgY2hhciAqaXJsYW5fYWNjZXNzW10gPSB7CgkiVU5LTk9XTiIsCgkiRElSRUNUIiwKCSJQRUVSIiwKCSJIT1NURUQiCn07CgpzdGF0aWMgY29uc3QgY2hhciAqaXJsYW5fbWVkaWFbXSA9IHsKCSJVTktOT1dOIiwKCSI4MDIuMyIsCgkiODAyLjUiCn07CgpleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CgpzdGF0aWMgaW50IGlybGFuX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlybGFuX2ZvcHMgPSB7Cgkub3duZXIJID0gVEhJU19NT0RVTEUsCgkub3BlbiAgICA9IGlybGFuX3NlcV9vcGVuLAoJLnJlYWQgICAgPSBzZXFfcmVhZCwKCS5sbHNlZWsgID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKfTsKCmV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCgpzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcik7CnN0YXRpYyB2b2lkIF9faXJsYW5fY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKc3RhdGljIGludCBfX2lybGFuX2luc2VydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgaW50IHR5cGUsIAoJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwgCgkJCQlfX3U4ICp2YWx1ZV9hcnJheSwgX191MTYgdmFsdWVfbGVuKTsKc3RhdGljIHZvaWQgaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwp2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CgovKgogKiBGdW5jdGlvbiBpcmxhbl9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIElyTEFOIGxheWVyCiAqCiAqLwpzdGF0aWMgaW50IF9faW5pdCBpcmxhbl9pbml0KHZvaWQpCnsKCXN0cnVjdCBpcmxhbl9jYiAqbmV3OwoJX191MTYgaGludHM7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCXsgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwoJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIDAsIHByb2NfaXJkYSk7CglpZiAoIXByb2MpIHsKCQlwcmludGsoS0VSTl9FUlIgImlybGFuX2luaXQ6IGNhbid0IGNyZWF0ZSAvcHJvYyBlbnRyeSFcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXByb2MtPnByb2NfZm9wcyA9ICZpcmxhbl9mb3BzOwoJfQojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCWhpbnRzID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfTEFOKTsKCgkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgY2xpZW50ICovCglja2V5ID0gaXJsbXBfcmVnaXN0ZXJfY2xpZW50KGhpbnRzLCAmaXJsYW5fY2xpZW50X2Rpc2NvdmVyeV9pbmRpY2F0aW9uLAoJCQkJICAgICBOVUxMLCBOVUxMKTsKCQoJLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIHNlcnZpY2UgKi8KIAlza2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CgoJLyogU3RhcnQgdGhlIG1hc3RlciBJckxBTiBpbnN0YW5jZSAodGhlIG9ubHkgb25lIGZvciBub3cpICovCiAJbmV3ID0gaXJsYW5fb3BlbihERVZfQUREUl9BTlksIERFVl9BRERSX0FOWSk7CgoJLyogVGhlIG1hc3RlciB3aWxsIG9ubHkgb3BlbiBpdHMgKGxpc3RlbikgY29udHJvbCBUU0FQICovCglpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChuZXcpOwoKCS8qIERvIHNvbWUgZmFzdCBkaXNjb3ZlcnkhICovCglpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpcmxhbl9jbGVhbnVwKHZvaWQpIAp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsICpuZXh0OwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KGNrZXkpOwoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNrZXkpOwoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCglyZW1vdmVfcHJvY19lbnRyeSgiaXJsYW4iLCBwcm9jX2lyZGEpOwojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCgkvKiBDbGVhbnVwIGFueSBsZWZ0b3ZlciBuZXR3b3JrIGRldmljZXMgKi8KCXJ0bmxfbG9jaygpOwoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlbGYsIG5leHQsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJX19pcmxhbl9jbG9zZShzZWxmKTsKCX0KCXJ0bmxfdW5sb2NrKCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW4gKHZvaWQpCiAqCiAqICAgIE9wZW4gbmV3IGluc3RhbmNlIG9mIGEgY2xpZW50L3Byb3ZpZGVyLCB3ZSBzaG91bGQgb25seSByZWdpc3RlciB0aGUgCiAqICAgIG5ldHdvcmsgZGV2aWNlIGlmIHRoaXMgaW5zdGFuY2UgaXMgbWVudCBmb3IgYSBwYXJ0aWN1bGFyIGNsaWVudC9wcm92aWRlcgogKi8Kc3RhdGljIHN0cnVjdCBpcmxhbl9jYiAqaXJsYW5fb3BlbihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJLyogQ3JlYXRlIG5ldHdvcmsgZGV2aWNlIHdpdGggaXJsYW4gKi8KCWRldiA9IGFsbG9jX2lybGFuZGV2KGV0aCA/ICJldGglZCIgOiAiaXJsYW4lZCIpOwoJaWYgKCFkZXYpCgkJcmV0dXJuIE5VTEw7CgoJc2VsZiA9IGRldi0+cHJpdjsKCXNlbGYtPmRldiA9IGRldjsKCgkvKgoJICogIEluaXRpYWxpemUgbG9jYWwgZGV2aWNlIHN0cnVjdHVyZQoJICovCglzZWxmLT5tYWdpYyA9IElSTEFOX01BR0lDOwoJc2VsZi0+c2FkZHIgPSBzYWRkcjsKCXNlbGYtPmRhZGRyID0gZGFkZHI7CgoJLyogUHJvdmlkZXIgYWNjZXNzIGNhbiBvbmx5IGJlIFBFRVIsIERJUkVDVCwgb3IgSE9TVEVEICovCglzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9IGFjY2VzczsKCWlmIChhY2Nlc3MgPT0gQUNDRVNTX0RJUkVDVCkgewoJCS8qICAKCQkgKiBTaW5jZSB3ZSBhcmUgZW11bGF0aW5nIGFuIElyTEFOIHNldmVyIHdlIHdpbGwgaGF2ZSB0bwoJCSAqIGdpdmUgb3Vyc2VsZiBhbiBldGhlcm5ldCBhZGRyZXNzISAgCgkJICovCgkJZGV2LT5kZXZfYWRkclswXSA9IDB4NDA7CgkJZGV2LT5kZXZfYWRkclsxXSA9IDB4MDA7CgkJZGV2LT5kZXZfYWRkclsyXSA9IDB4MDA7CgkJZGV2LT5kZXZfYWRkclszXSA9IDB4MDA7CgkJZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyKzQsIDEpOwoJCWdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkcis1LCAxKTsKCX0KCglzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl8zOwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cglpbml0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7Cglpbml0X3RpbWVyKCZzZWxmLT5jbGllbnQua2lja190aW1lcik7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZWxmLT5vcGVuX3dhaXQpOwkKCQoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+Y2xpZW50LnR4cSk7CgkKCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCglpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCAKCQkJICAgX19GVU5DVElPTl9fICk7CgkJc2VsZiA9IE5VTEw7CgkJZnJlZV9uZXRkZXYoZGV2KTsKCX0gZWxzZSB7CgkJcnRubF9sb2NrKCk7CgkJbGlzdF9hZGRfcmN1KCZzZWxmLT5kZXZfbGlzdCwgJmlybGFucyk7CgkJcnRubF91bmxvY2soKTsKCX0KCglyZXR1cm4gc2VsZjsKfQovKgogKiBGdW5jdGlvbiBfX2lybGFuX2Nsb3NlIChzZWxmKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBhbmQgZGVhbGxvY2F0ZXMgdGhlIElyTEFOIGNsaWVudCBpbnN0YW5jZXMuIEJlIAogKiAgICBhd2FyZSB0aGF0IG90aGVyIGZ1bmN0aW9ucyB3aGljaCBjYWxscyBjbGllbnRfY2xvc2UoKSBtdXN0CiAqICAgIHJlbW92ZSBzZWxmIGZyb20gaXJsYW5zIGxpc3QgZmlyc3QuCiAqLwpzdGF0aWMgdm9pZCBfX2lybGFuX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUFTU0VSVF9SVE5MKCk7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCWRlbF90aW1lcl9zeW5jKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CglkZWxfdGltZXJfc3luYygmc2VsZi0+Y2xpZW50LmtpY2tfdGltZXIpOwoKCS8qIENsb3NlIGFsbCBvcGVuIGNvbm5lY3Rpb25zIGFuZCByZW1vdmUgVFNBUHMgKi8KCWlybGFuX2Nsb3NlX3RzYXBzKHNlbGYpOwoJCglpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKSAKCQlpcmlhcF9jbG9zZShzZWxmLT5jbGllbnQuaXJpYXApOwoKCS8qIFJlbW92ZSBmcmFtZXMgcXVldWVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KCXNrYl9xdWV1ZV9wdXJnZSgmc2VsZi0+Y2xpZW50LnR4cSk7CgoJLyogVW5yZWdpc3RlciBhbmQgZnJlZSBzZWxmIHZpYSBkZXN0cnVjdG9yICovCgl1bnJlZ2lzdGVyX25ldGRldmljZShzZWxmLT5kZXYpOwp9CgovKiBGaW5kIGFueSBpbnN0YW5jZSBvZiBpcmxhbiwgdXNlZCBmb3IgY2xpZW50IGRpc2NvdmVyeSB3YWtldXAgKi8Kc3RydWN0IGlybGFuX2NiICppcmxhbl9nZXRfYW55KHZvaWQpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZWxmLCAmaXJsYW5zLCBkZXZfbGlzdCkgewoJCXJldHVybiBzZWxmOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHNrYikKICoKICogICAgSGVyZSB3ZSByZWNlaXZlIHRoZSBjb25uZWN0IGluZGljYXRpb24gZm9yIHRoZSBkYXRhIGNoYW5uZWwKICoKICovCnN0YXRpYyB2b2lkIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJCSAgICAgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEscmV0dXJuOyk7CgoJc2VsZi0+bWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOwoJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOwoKCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKCSAqIG5lZWQgdG8gc2tiX2Nsb25lKCkgaXQsIHNvIHRoYXQgeW91IGRvbid0IGZyZWUgaXQgdHdpY2UuCgkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCgkgKiBKZWFuIElJICovCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7Cglpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT04sIE5VTEwpOwoKCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgewoJCS8qIAoJCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8KCQkgKiBjb25maWd1cmUgdGhlIHJlbW90ZSBmaWx0ZXIgCgkJICovCgkJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKCQlpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzZWxmKTsKCX0KCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAoYXQgbGFzdCkgKi8KCW5ldGlmX3N0YXJ0X3F1ZXVlKHNlbGYtPmRldik7IC8qIENsZWFyIHJlYXNvbiAqLwp9CgpzdGF0aWMgdm9pZCBpcmxhbl9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIAoJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLCAKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNlbGYtPm1heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCgkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLwoKCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKiAKCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8gY29uZmlndXJlIHRoZSByZW1vdGUKCSAqIGZpbHRlciAKCSAqLwoJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKCWlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHNlbGYpOwoJCgkvKiBPcGVuIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZpbHRlciBieSBkZWZhdWx0ICovCiAJaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CiAJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CgoJLyogUmVhZHkgdG8gdHJhbnNmZXIgRXRoZXJuZXQgZnJhbWVzICovCgluZXRpZl9zdGFydF9xdWV1ZShzZWxmLT5kZXYpOwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSAwOyAvKiBDbGVhciByZWFzb24gKi8KI2lmZGVmIENPTkZJR19JUkxBTl9TRU5EX0dSQVRVSVRPVVNfQVJQCglpcmxhbl9ldGhfc2VuZF9ncmF0dWl0b3VzX2FycCgmc2VsZi0+ZGV2KTsKI2VuZGlmCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9kaXNjb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSkKICoKICogICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBJclRUUCBsYXllci4gSW5kaWNhdGVzIGEgZGlzY29ubmVjdGlvbiBvZgogKiAgICB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gKGhhbmRsZSkKICovCnN0YXRpYyB2b2lkIGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwKCQkJCQl2b2lkICpzYXAsIExNX1JFQVNPTiByZWFzb24sIAoJCQkJCXN0cnVjdCBza19idWZmICp1c2VyZGF0YSkgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoMCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19GVU5DVElPTl9fICwgcmVhc29uKTsKCQoJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7Cgl0c2FwID0gKHN0cnVjdCB0c2FwX2NiICopIHNhcDsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwkKCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgkKCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+dHNhcF9kYXRhLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDIsICJJckxBTiwgZGF0YSBjaGFubmVsIGRpc2Nvbm5lY3RlZCBieSBwZWVyIVxuIik7CgoJLyogU2F2ZSByZWFzb24gc28gd2Uga25vdyBpZiB3ZSBzaG91bGQgdHJ5IHRvIHJlY29ubmVjdCBvciBub3QgKi8KCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gcmVhc29uOwoJCglzd2l0Y2ggKHJlYXNvbikgewoJY2FzZSBMTV9VU0VSX1JFUVVFU1Q6IC8qIFVzZXIgcmVxdWVzdCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVzZXIgcmVxdWVzdGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1Q6IC8qIFVuZXhwZWN0ZWQgSXJMQVAgZGlzY29ubmVjdCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVuZXhwZWN0ZWQgSXJMQVAgZGlzY29ubmVjdFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIExNX0NPTk5FQ1RfRkFJTFVSRTogLyogRmFpbGVkIHRvIGVzdGFibGlzaCBJckxBUCBjb25uZWN0aW9uICovCgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQVAgY29ubmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfUkVTRVQ6ICAvKiBJckxBUCByZXNldCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFQIHJlc2V0XG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fSU5JVF9ESVNDT05ORUNUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTE1QIGNvbm5lY3QgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9FUlJPUigiJXMoKSwgVW5rbm93biBkaXNjb25uZWN0IHJlYXNvblxuIiwgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCX0KCQoJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKCSAqIG5lZWQgdG8gc2tiX2Nsb25lKCkgaXQsIHNvIHRoYXQgeW91IGRvbid0IGZyZWUgaXQgdHdpY2UuCgkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCgkgKiBKZWFuIElJICovCglpZiAodXNlcmRhdGEpCgkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CgoJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCQoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOwp9Cgp2b2lkIGlybGFuX29wZW5fZGF0YV90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHRzYXBfY2IgKnRzYXA7Cglub3RpZnlfdCBub3RpZnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KCWlmIChzZWxmLT50c2FwX2RhdGEpCgkJcmV0dXJuOwoKCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CgkKCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKCW5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmxhbl9jb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJsYW5fY29ubmVjdF9jb25maXJtOwogCW5vdGlmeS5mbG93X2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSAgICAgICAgICAgICAgPSBzZWxmOwoJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGRhdGEiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKCgl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKCWlmICghdHNhcCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuOwoJfQoJc2VsZi0+dHNhcF9kYXRhID0gdHNhcDsKCgkvKiAKCSAqICBUaGlzIGlzIHRoZSBkYXRhIFRTQVAgc2VsZWN0b3Igd2hpY2ggd2Ugd2lsbCBwYXNzIHRvIHRoZSBjbGllbnQKCSAqICB3aGVuIHRoZSBjbGllbnQgYXNrIGZvciBpdC4KCSAqLwoJc2VsZi0+c3RzYXBfc2VsX2RhdGEgPSBzZWxmLT50c2FwX2RhdGEtPnN0c2FwX3NlbDsKfQoKdm9pZCBpcmxhbl9jbG9zZV90c2FwcyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJLyogRGlzY29ubmVjdCBhbmQgY2xvc2UgYWxsIG9wZW4gVFNBUCBjb25uZWN0aW9ucyAqLwoJaWYgKHNlbGYtPnRzYXBfZGF0YSkgewoJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIE5VTEwsIFBfTk9STUFMKTsKCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXBfZGF0YSk7CgkJc2VsZi0+dHNhcF9kYXRhID0gTlVMTDsKCX0KCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsKSB7CgkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIE5VTEwsIAoJCQkJCSBQX05PUk1BTCk7CgkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT5jbGllbnQudHNhcF9jdHJsKTsKCQlzZWxmLT5jbGllbnQudHNhcF9jdHJsID0gTlVMTDsKCX0KCWlmIChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpIHsKCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCBOVUxMLCAKCQkJCQkgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKCQlzZWxmLT5wcm92aWRlci50c2FwX2N0cmwgPSBOVUxMOwoJfQoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2lhc19yZWdpc3RlciAoc2VsZiwgdHNhcF9zZWwpCiAqCiAqICAgIFJlZ2lzdGVyIHdpdGggTE0tSUFTCiAqCiAqLwp2b2lkIGlybGFuX2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIF9fdTggdHNhcF9zZWwpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWU7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJLyogCgkgKiBDaGVjayBpZiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGJ5IGEgcHJldmlvdXMgcHJvdmlkZXIuCgkgKiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBqdXN0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQoJICovCglpZiAoIWlyaWFzX2ZpbmRfb2JqZWN0KCJJckxBTiIpKSB7CgkJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiSXJMQU4iLCBJQVNfSVJMQU5fSUQpOwoJCWlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihvYmosICJJckRBOlRpbnlUUDpMc2FwU2VsIiwgdHNhcF9zZWwsCgkJCQkJIElBU19LRVJORUxfQVRUUik7CgkJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOwoJfSBlbHNlIHsKCQluZXdfdmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh0c2FwX3NlbCk7CgkJaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoIklyTEFOIiwgIklyREE6VGlueVRQOkxzYXBTZWwiLAoJCQkJCSAgICAgIG5ld192YWx1ZSk7Cgl9CgkKICAgICAgICAvKiBSZWdpc3RlciBQblAgb2JqZWN0IG9ubHkgaWYgbm90IHJlZ2lzdGVyZWQgYmVmb3JlICovCiAgICAgICAgaWYgKCFpcmlhc19maW5kX29iamVjdCgiUG5QIikpIHsKCQlvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJQblAiLCBJQVNfUE5QX0lEKTsKI2lmIDAKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgc3lzY3RsX2Rldm5hbWUsCgkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKI2Vsc2UKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgIkxpbnV4IiwgSUFTX0tFUk5FTF9BVFRSKTsKI2VuZGlmCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiRGV2aWNlSUQiLCAiSFdQMTlGMCIsCgkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIob2JqLCAiQ29tcENudCIsIDEsIElBU19LRVJORUxfQVRUUik7CgkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKQoJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJDb21wIzAxIiwgIlBOUDgzODkiLAoJCQkJCQlJQVNfS0VSTkVMX0FUVFIpOwoJCWVsc2UKCQkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiQ29tcCMwMSIsICJQTlA4Mjk0IiwKCQkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiTWFudWZhY3R1cmVyIiwKCQkJCQkiTGludXgtSXJEQSBQcm9qZWN0IiwgSUFTX0tFUk5FTF9BVFRSKTsKCQlpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlIChzZWxmKQogKgogKiAgICBUcnkgdG8gc2VuZCB0aGUgbmV4dCBjb21tYW5kIGluIHRoZSBjb250cm9sIHRyYW5zbWl0IHF1ZXVlCiAqCiAqLwppbnQgaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWlmIChpcmRhX2xvY2soJnNlbGYtPmNsaWVudC50eF9idXN5KSA9PSBGQUxTRSkKCQlyZXR1cm4gLUVCVVNZOwoKCXNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5jbGllbnQudHhxKTsKCWlmICghc2tiKSB7CgkJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKCQlyZXR1cm4gMDsKCX0KCQoJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzICovCglpZiAoKHNlbGYtPmNsaWVudC50c2FwX2N0cmwgPT0gTlVMTCkgfHwgCgkgICAgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSkgCgl7CgkJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJcmV0dXJuIC0xOwoJfQoJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2VuZGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyApOwoKCXJldHVybiBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY3RybF9kYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKICoKICogICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29tbWFuZHMgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCBpcyBiZWluZwogKiAgICBzZW50IGluIGEgY29tbWFuZC9yZXNwb25zZSBmYXNoaW9uCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCS8qIFF1ZXVlIGNvbW1hbmQgKi8KCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5jbGllbnQudHhxLCBza2IpOwoKCS8qIFRyeSB0byBzZW5kIGNvbW1hbmQgKi8KCWlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlKHNlbGYpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyAoc2VsZikKICoKICogICAgU2VuZCBHZXQgUHJvdmlkZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byBwZWVyIElyTEFOIGxheWVyCiAqCiAqLwp2b2lkIGlybGFuX2dldF9wcm92aWRlcl9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNrYiA9IGFsbG9jX3NrYig2NCwgR0ZQX0FUT01JQyk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQogCWZyYW1lWzBdID0gQ01EX0dFVF9QUk9WSURFUl9JTkZPOwoJZnJhbWVbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgLyogWmVybyBwYXJhbWV0ZXJzICovCgkKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW5fZGF0YV9jaGFubmVsIChzZWxmKQogKgogKiAgICBTZW5kIGFuIE9wZW4gRGF0YSBDb21tYW5kIHRvIHByb3ZpZGVyCiAqCiAqLwp2b2lkIGlybGFuX29wZW5fZGF0YV9jaGFubmVsKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJc2tiID0gYWxsb2Nfc2tiKDY0LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQoJLyogQnVpbGQgZnJhbWUgKi8KIAlmcmFtZVswXSA9IENNRF9PUEVOX0RBVEFfQ0hBTk5FTDsKCWZyYW1lWzFdID0gMHgwMjsgLyogVHdvIHBhcmFtZXRlcnMgKi8KCglpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7Cglpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkRJUkVDVCIpOwoJLyogaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNT0RFIiwgIlVOUkVMSUFCTEUiKTsgKi8KCi8qIAlzZWxmLT51c2VfdWRhdGEgPSBUUlVFOyAqLwoKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCnZvaWQgaXJsYW5fY2xvc2VfZGF0YV9jaGFubmVsKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBDaGVjayBpZiB0aGUgVFNBUCBpcyBzdGlsbCB0aGVyZSAqLwoJaWYgKHNlbGYtPmNsaWVudC50c2FwX2N0cmwgPT0gTlVMTCkKCQlyZXR1cm47CgoJc2tiID0gYWxsb2Nfc2tiKDY0LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQoJLyogQnVpbGQgZnJhbWUgKi8KIAlmcmFtZVswXSA9IENNRF9DTE9TRV9EQVRBX0NIQU47CglmcmFtZVsxXSA9IDB4MDE7IC8qIFR3byBwYXJhbWV0ZXJzICovCgoJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwoKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyIChzZWxmKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSB1bmljYXN0IAogKiAgICBhZGRyZXNzLgogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQoJCglza2IgPSBhbGxvY19za2IoMTI4LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwogCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIgLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiRklMVEVSIik7IAoJCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlciAoc2VsZiwgc3RhdHVzKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBicm9hZGNhc3QKICogICAgYWRkcmVzcy4gQmUgY2FyZWZ1bCB3aXRoIHRoZSB1c2Ugb2YgdGhpcyBvbmUsIHNpbmNlIHRoZXJlIG1heSBiZSBhIGxvdAogKiAgICBvZiBicm9hZGNhc3QgdHJhZmZpYyBvdXQgdGhlcmUuIFdlIGNhbiBzdGlsbCBmdW5jdGlvbiB3aXRob3V0IHRoaXMKICogICAgb25lIGJ1dCB0aGVuIF93ZV8gaGF2ZSB0byBpbml0aWF0ZSBhbGwgY29tbXVuaWNhdGlvbiB3aXRoIG90aGVyCiAqICAgIGhvc3RzLCBzaW5jZSBBUlAgcmVxdWVzdCBmb3IgdGhpcyBob3N0IHdpbGwgbm90IGJlIGFuc3dlcmVkLgogKi8Kdm9pZCBpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBzdGF0dXMpIAp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKIAlza2IgPSBhbGxvY19za2IoMTI4LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCiAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KIAlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJCUk9BRENBU1QiKTsKCWlmIChzdGF0dXMpCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJGSUxURVIiKTsgCgllbHNlCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7IAoKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyIChzZWxmLCBzdGF0dXMpCiAqCiAqICAgIE1ha2UgSXJMQU4gcHJvdmlkZXIgYWNjZXB0IGV0aGVybmV0IGZyYW1lcyBhZGRyZXNzZWQgdG8gdGhlIG11bHRpY2FzdAogKiAgICBhZGRyZXNzLiAKICoKICovCnZvaWQgaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgc3RhdHVzKSAKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKIAlza2IgPSBhbGxvY19za2IoMTI4LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCQoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQogCWZyYW1lWzBdID0gQ01EX0ZJTFRFUl9PUEVSQVRJT047CglmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCiAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiTVVMVElDQVNUIik7CglpZiAoc3RhdHVzKQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiQUxMIik7IAoJZWxzZQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOyAKCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyIChzZWxmKQogKgogKiAgICBSZXRyaWV2ZXMgdGhlIHVuaWNhc3QgYWRkcmVzcyBmcm9tIHRoZSBJckxBTiBwcm92aWRlci4gVGhpcyBhZGRyZXNzCiAqICAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGV2aWNlcyBzdHJ1Y3R1cmUsIHNvIHRoZSBldGhlcm5ldCBsYXllcgogKiAgICBjYW4gY29uc3RydWN0IGl0cyBwYWNrZXRzLgogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKCXNrYiA9IGFsbG9jX3NrYigxMjgsIEdGUF9BVE9NSUMpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwogCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIik7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfT1BFUkFUSU9OIiwgIkRZTkFNSUMiKTsgCgkKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2dldF9tZWRpYV9jaGFyIChzZWxmKQogKgogKiAgICAKICoKICovCnZvaWQgaXJsYW5fZ2V0X21lZGlhX2NoYXIoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJCglza2IgPSBhbGxvY19za2IoNjQsIEdGUF9BVE9NSUMpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKCS8qIEJ1aWxkIGZyYW1lICovCiAJZnJhbWVbMF0gPSBDTURfR0VUX01FRElBX0NIQVI7CglmcmFtZVsxXSA9IDB4MDE7IC8qIE9uZSBwYXJhbWV0ZXIgKi8KCQoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuMyIpOwoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X2J5dGVfcGFyYW0gKHNrYiwgcGFyYW0sIHZhbHVlKQogKgogKiAgICBJbnNlcnQgYnl0ZSBwYXJhbWV0ZXIgaW50byBmcmFtZQogKgogKi8KaW50IGlybGFuX2luc2VydF9ieXRlX3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBfX3U4IHZhbHVlKQp7CglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBwYXJhbSwgSVJMQU5fQllURSwgdmFsdWUsIDAsIE5VTEwsIDApOwp9CgppbnQgaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBfX3UxNiB2YWx1ZSkKewoJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX1NIT1JULCAwLCB2YWx1ZSwgTlVMTCwgMCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGluc2VydF9zdHJpbmcgKHNrYiwgcGFyYW0sIHZhbHVlKQogKgogKiAgICBJbnNlcnQgc3RyaW5nIHBhcmFtZXRlciBpbnRvIGZyYW1lCiAqCiAqLwppbnQgaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgY2hhciAqc3RyaW5nKQp7CglpbnQgc3RyaW5nX2xlbiA9IHN0cmxlbihzdHJpbmcpOwoKCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9BUlJBWSwgMCwgMCwgc3RyaW5nLCAKCQkJCSAgICBzdHJpbmdfbGVuKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X2FycmF5X3BhcmFtKHNrYiwgcGFyYW0sIHZhbHVlLCBsZW5fdmFsdWUpCiAqCiAqICAgIEluc2VydCBhcnJheSBwYXJhbWV0ZXIgaW50byBmcmFtZQogKgogKi8KaW50IGlybGFuX2luc2VydF9hcnJheV9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpuYW1lLCBfX3U4ICphcnJheSwKCQkJICAgICBfX3UxNiBhcnJheV9sZW4pCnsKCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIG5hbWUsIElSTEFOX0FSUkFZLCAwLCAwLCBhcnJheSwgCgkJCQkgICAgYXJyYXlfbGVuKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X3BhcmFtIChza2IsIHBhcmFtLCB2YWx1ZSwgYnl0ZSkKICoKICogICAgSW5zZXJ0IHBhcmFtZXRlciBhdCBlbmQgb2YgYnVmZmVyLCBzdHJ1Y3R1cmUgb2YgYSBwYXJhbWV0ZXIgaXM6CiAqCiAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICAgIHwgTmFtZSBMZW5ndGhbMV0gfCBQYXJhbSBOYW1lWzEuLjI1NV0gfCBWYWwgTGVuZ3RoWzJdIHwgVmFsdWVbMC4uMTAxNl18CiAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IF9faXJsYW5faW5zZXJ0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBpbnQgdHlwZSwgCgkJCQlfX3U4IHZhbHVlX2J5dGUsIF9fdTE2IHZhbHVlX3Nob3J0LCAKCQkJCV9fdTggKnZhbHVlX2FycmF5LCBfX3UxNiB2YWx1ZV9sZW4pCnsKCV9fdTggKmZyYW1lOwoJX191OCBwYXJhbV9sZW47CglfX3UxNiB0bXBfbGU7IC8qIFRlbXBvcmFyeSB2YWx1ZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAqLwoJaW50IG49MDsKCQoJaWYgKHNrYiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgR290IE5VTEwgc2tiXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm4gMDsKCX0JCgoJcGFyYW1fbGVuID0gc3RybGVuKHBhcmFtKTsKCXN3aXRjaCAodHlwZSkgewoJY2FzZSBJUkxBTl9CWVRFOgoJCXZhbHVlX2xlbiA9IDE7CgkJYnJlYWs7CgljYXNlIElSTEFOX1NIT1JUOgoJCXZhbHVlX2xlbiA9IDI7CgkJYnJlYWs7CgljYXNlIElSTEFOX0FSUkFZOgoJCUlSREFfQVNTRVJUKHZhbHVlX2FycmF5ICE9IE5VTEwsIHJldHVybiAwOyk7CgkJSVJEQV9BU1NFUlQodmFsdWVfbGVuID4gMCwgcmV0dXJuIDA7KTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBwYXJhbWV0ZXIgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAwOwoJCWJyZWFrOwoJfQoJCgkvKiBJbnNlcnQgYXQgZW5kIG9mIHNrLWJ1ZmZlciAqLwoJZnJhbWUgPSBza2ItPnRhaWw7CgoJLyogTWFrZSBzcGFjZSBmb3IgZGF0YSAqLwoJaWYgKHNrYl90YWlscm9vbShza2IpIDwgKHBhcmFtX2xlbit2YWx1ZV9sZW4rMykpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBObyBtb3JlIHNwYWNlIGF0IGVuZCBvZiBza2JcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAwOwoJfQkKCXNrYl9wdXQoc2tiLCBwYXJhbV9sZW4rdmFsdWVfbGVuKzMpOwoJCgkvKiBJbnNlcnQgcGFyYW1ldGVyIGxlbmd0aCAqLwoJZnJhbWVbbisrXSA9IHBhcmFtX2xlbjsKCQoJLyogSW5zZXJ0IHBhcmFtZXRlciAqLwoJbWVtY3B5KGZyYW1lK24sIHBhcmFtLCBwYXJhbV9sZW4pOyBuICs9IHBhcmFtX2xlbjsKCQoJLyogSW5zZXJ0IHZhbHVlIGxlbmd0aCAoMiBieXRlIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBMU0IgZmlyc3QpICovCgl0bXBfbGUgPSBjcHVfdG9fbGUxNih2YWx1ZV9sZW4pOwoJbWVtY3B5KGZyYW1lK24sICZ0bXBfbGUsIDIpOyBuICs9IDI7IC8qIFRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcyAqLwoKCS8qIEluc2VydCB2YWx1ZSAqLwoJc3dpdGNoICh0eXBlKSB7CgljYXNlIElSTEFOX0JZVEU6CgkJZnJhbWVbbisrXSA9IHZhbHVlX2J5dGU7CgkJYnJlYWs7CgljYXNlIElSTEFOX1NIT1JUOgoJCXRtcF9sZSA9IGNwdV90b19sZTE2KHZhbHVlX3Nob3J0KTsKCQltZW1jcHkoZnJhbWUrbiwgJnRtcF9sZSwgMik7IG4gKz0gMjsKCQlicmVhazsKCWNhc2UgSVJMQU5fQVJSQVk6CgkJbWVtY3B5KGZyYW1lK24sIHZhbHVlX2FycmF5LCB2YWx1ZV9sZW4pOyBuKz12YWx1ZV9sZW47CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoJSVJEQV9BU1NFUlQobiA9PSAocGFyYW1fbGVuK3ZhbHVlX2xlbiszKSwgcmV0dXJuIDA7KTsKCglyZXR1cm4gcGFyYW1fbGVuK3ZhbHVlX2xlbiszOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9leHRyYWN0X3BhcmFtIChidWYsIG5hbWUsIHZhbHVlLCBsZW4pCiAqCiAqICAgIEV4dHJhY3RzIGEgc2luZ2xlIHBhcmFtZXRlciBuYW1lL3ZhbHVlIHBhaXIgZnJvbSBidWZmZXIgYW5kIHVwZGF0ZXMKICogICAgdGhlIGJ1ZmZlciBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBuZXh0IG5hbWUvdmFsdWUgcGFpci4gCiAqLwppbnQgaXJsYW5fZXh0cmFjdF9wYXJhbShfX3U4ICpidWYsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBfX3UxNiAqbGVuKQp7CglfX3U4IG5hbWVfbGVuOwoJX191MTYgdmFsX2xlbjsKCWludCBuPTA7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCgkvKiBnZXQgbGVuZ3RoIG9mIHBhcmFtZXRlciBuYW1lICgxIGJ5dGUpICovCgluYW1lX2xlbiA9IGJ1ZltuKytdOwoJCglpZiAobmFtZV9sZW4gPiAyNTQpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBuYW1lX2xlbiA+IDI1NFxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIC1SU1BfSU5WQUxJRF9DT01NQU5EX0ZPUk1BVDsKCX0KCQoJLyogZ2V0IHBhcmFtZXRlciBuYW1lICovCgltZW1jcHkobmFtZSwgYnVmK24sIG5hbWVfbGVuKTsKCW5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKCW4rPW5hbWVfbGVuOwoJCgkvKiAgCgkgKiAgR2V0IGxlbmd0aCBvZiBwYXJhbWV0ZXIgdmFsdWUgKDIgYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbiAKCSAqICBmb3JtYXQpIAoJICovCgltZW1jcHkoJnZhbF9sZW4sIGJ1ZituLCAyKTsgLyogVG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zICovCglsZTE2X3RvX2NwdXMoJnZhbF9sZW4pOyBuKz0yOwoJCglpZiAodmFsX2xlbiA+IDEwMTYpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBwYXJhbWV0ZXIgbGVuZ3RoIHRvIGxvbmdcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAtUlNQX0lOVkFMSURfQ09NTUFORF9GT1JNQVQ7Cgl9CgkqbGVuID0gdmFsX2xlbjsKCgkvKiBnZXQgcGFyYW1ldGVyIHZhbHVlICovCgltZW1jcHkodmFsdWUsIGJ1ZituLCB2YWxfbGVuKTsKCXZhbHVlW3ZhbF9sZW5dID0gJ1wwJzsKCW4rPXZhbF9sZW47CgkKCUlSREFfREVCVUcoNCwgIlBhcmFtZXRlcjogJXMgIiwgbmFtZSk7IAoJSVJEQV9ERUJVRyg0LCAiVmFsdWU6ICVzXG4iLCB2YWx1ZSk7IAoKCXJldHVybiBuOwp9CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCi8qCiAqIFN0YXJ0IG9mIHJlYWRpbmcgL3Byb2MgZW50cmllcy4KICogUmV0dXJuIGVudHJ5IGF0IHBvcywgCiAqCW9yIHN0YXJ0X3Rva2VuIHRvIGluZGljYXRlIHByaW50IGhlYWRlciBsaW5lCiAqCW9yIE5VTEwgaWYgZW5kIG9mIGZpbGUKICovCnN0YXRpYyB2b2lkICppcmxhbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglpbnQgaSA9IDE7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CgoJcmN1X3JlYWRfbG9jaygpOwoJaWYgKCpwb3MgPT0gMCkKCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VsZiwgJmlybGFucywgZGV2X2xpc3QpIHsKCQlpZiAoKnBvcyA9PSBpKSAKCQkJcmV0dXJuIHNlbGY7CgkJKytpOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qIFJldHVybiBlbnRyeSBhZnRlciB2LCBhbmQgaW5jcmVtZW50IHBvcyAqLwpzdGF0aWMgdm9pZCAqaXJsYW5fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpueHQ7CgoJKysqcG9zOwoJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSAKCQlueHQgPSBpcmxhbnMubmV4dDsKCWVsc2UKCQlueHQgPSAoKHN0cnVjdCBpcmxhbl9jYiAqKXYpLT5kZXZfbGlzdC5uZXh0OwoKCXJldHVybiAobnh0ID09ICZpcmxhbnMpID8gTlVMTCAKCQk6IGxpc3RfZW50cnkobnh0LCBzdHJ1Y3QgaXJsYW5fY2IsIGRldl9saXN0KTsKfQoKLyogRW5kIG9mIHJlYWRpbmcgL3Byb2MgZmlsZSAqLwpzdGF0aWMgdm9pZCBpcmxhbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJcmN1X3JlYWRfdW5sb2NrKCk7Cn0KCgovKgogKiBTaG93IG9uZSBlbnRyeSBpbiAvcHJvYyBmaWxlLgogKi8Kc3RhdGljIGludCBpcmxhbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQoJCXNlcV9wdXRzKHNlcSwgIklyTEFOIGluc3RhbmNlczpcbiIpOwoJZWxzZSB7CgkJc3RydWN0IGlybGFuX2NiICpzZWxmID0gdjsKCQkKCQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKCgkJc2VxX3ByaW50ZihzZXEsImlmbmFtZTogJXMsXG4iLAoJCQkgICAgICAgc2VsZi0+ZGV2LT5uYW1lKTsKCQlzZXFfcHJpbnRmKHNlcSwiY2xpZW50IHN0YXRlOiAlcywgIiwKCQkJICAgICAgIGlybGFuX3N0YXRlWyBzZWxmLT5jbGllbnQuc3RhdGVdKTsKCQlzZXFfcHJpbnRmKHNlcSwicHJvdmlkZXIgc3RhdGU6ICVzLFxuIiwKCQkJICAgICAgIGlybGFuX3N0YXRlWyBzZWxmLT5wcm92aWRlci5zdGF0ZV0pOwoJCXNlcV9wcmludGYoc2VxLCJzYWRkcjogJSMwOHgsICIsCgkJCSAgICAgICBzZWxmLT5zYWRkcik7CgkJc2VxX3ByaW50ZihzZXEsImRhZGRyOiAlIzA4eFxuIiwKCQkJICAgICAgIHNlbGYtPmRhZGRyKTsKCQlzZXFfcHJpbnRmKHNlcSwidmVyc2lvbjogJWQuJWQsXG4iLAoJCQkgICAgICAgc2VsZi0+dmVyc2lvblsxXSwgc2VsZi0+dmVyc2lvblswXSk7CgkJc2VxX3ByaW50ZihzZXEsImFjY2VzcyB0eXBlOiAlc1xuIiwgCgkJCSAgICAgICBpcmxhbl9hY2Nlc3Nbc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlXSk7CgkJc2VxX3ByaW50ZihzZXEsIm1lZGlhOiAlc1xuIiwgCgkJCSAgICAgICBpcmxhbl9tZWRpYVtzZWxmLT5tZWRpYV0pOwoJCQoJCXNlcV9wcmludGYoc2VxLCJsb2NhbCBmaWx0ZXI6XG4iKTsKCQlzZXFfcHJpbnRmKHNlcSwicmVtb3RlIGZpbHRlcjogIik7CgkJaXJsYW5fcHJpbnRfZmlsdGVyKHNlcSwgc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlKTsKCQlzZXFfcHJpbnRmKHNlcSwidHggYnVzeTogJXNcbiIsIAoJCQkgICAgICAgbmV0aWZfcXVldWVfc3RvcHBlZChzZWxmLT5kZXYpID8gIlRSVUUiIDogIkZBTFNFIik7CgkJCQoJCXNlcV9wdXRjKHNlcSwnXG4nKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlybGFuX3NlcV9vcHMgPSB7Cgkuc3RhcnQgPSBpcmxhbl9zZXFfc3RhcnQsCgkubmV4dCAgPSBpcmxhbl9zZXFfbmV4dCwKCS5zdG9wICA9IGlybGFuX3NlcV9zdG9wLAoJLnNob3cgID0gaXJsYW5fc2VxX3Nob3csCn07CgpzdGF0aWMgaW50IGlybGFuX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlybGFuX3NlcV9vcHMpOwp9CiNlbmRpZgoKTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBMaW51eCBJckRBIExBTiBwcm90b2NvbCIpOyAKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtKGV0aCwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZXRoLCAiTmFtZSBkZXZpY2VzIGV0aFggKDApIG9yIGlybGFuWCAoMSkiKTsKbW9kdWxlX3BhcmFtKGFjY2VzcywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhY2Nlc3MsICJBY2Nlc3MgdHlwZSBESVJFQ1Q9MSwgUEVFUj0yLCBIT1NURUQ9MyIpOwoKbW9kdWxlX2luaXQoaXJsYW5faW5pdCk7Cm1vZHVsZV9leGl0KGlybGFuX2NsZWFudXApOwoK