LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcm1vZC5jCiAqIFZlcnNpb246ICAgICAgIDAuOQogKiBEZXNjcmlwdGlvbjogICBJckRBIHN0YWNrIG1haW4gZW50cnkgcG9pbnRzCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBNb24gRGVjIDE1IDEzOjU1OjM5IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxNToxMjo0MSAyMDAwCiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgb2YgdGhlIElyREEgc3RhY2suCiAqIFRoZXkgYXJlIGluIHRoaXMgZmlsZSBhbmQgbm90IGFmX2lyZGEuYyBiZWNhdXNlIHNvbWUgZGV2ZWxvcHBlcnMKICogYXJlIHVzaW5nIHRoZSBJckRBIHN0YWNrIHdpdGhvdXQgdGhlIHNvY2tldCBBUEkgKGNvbXBpbGluZyBvdXQKICogYWZfaXJkYS5jKS4KICogSmVhbiBJSQogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4JCS8qIG5vdGlmeV90ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgkJLyogaXJsYXBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4JCS8qIGlybG1wX2luaXQgKi8KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CQkvKiBpcmlhcF9pbml0ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgkJLyogaXJ0dHBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4JLyogaXJkYV9kZXZpY2VfaW5pdCAqLwoKLyoKICogTW9kdWxlIHBhcmFtZXRlcnMKICovCiNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwp1bnNpZ25lZCBpbnQgaXJkYV9kZWJ1ZyA9IElSREFfREVCVUdfTEVWRUw7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaXJkYV9kZWJ1ZywgdWludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJJUkRBIGRlYnVnZ2luZyBsZXZlbCIpOwpFWFBPUlRfU1lNQk9MKGlyZGFfZGVidWcpOwojZW5kaWYKCi8qIFBhY2tldCB0eXBlIGhhbmRsZXIuCiAqIFRlbGwgdGhlIGtlcm5lbCBob3cgSXJEQSBwYWNrZXRzIHNob3VsZCBiZSBoYW5kbGVkLgogKi8Kc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcmRhX3BhY2tldF90eXBlID0gewoJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lSREEpLAoJLmZ1bmMJPSBpcmxhcF9kcml2ZXJfcmN2LAkvKiBQYWNrZXQgdHlwZSBoYW5kbGVyIGlybGFwX2ZyYW1lLmMgKi8KfTsKCi8qCiAqIEZ1bmN0aW9uIGlyZGFfbm90aWZ5X2luaXQgKG5vdGlmeSkKICoKICogICAgVXNlZCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBub3RpZnkgc3RydWN0dXJlCiAqCiAqLwp2b2lkIGlyZGFfbm90aWZ5X2luaXQobm90aWZ5X3QgKm5vdGlmeSkKewoJbm90aWZ5LT5kYXRhX2luZGljYXRpb24gPSBOVUxMOwoJbm90aWZ5LT51ZGF0YV9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+Y29ubmVjdF9jb25maXJtID0gTlVMTDsKCW5vdGlmeS0+Y29ubmVjdF9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+ZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+Zmxvd19pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+c3RhdHVzX2luZGljYXRpb24gPSBOVUxMOwoJbm90aWZ5LT5pbnN0YW5jZSA9IE5VTEw7CglzdHJsY3B5KG5vdGlmeS0+bmFtZSwgIlVua25vd24iLCBzaXplb2Yobm90aWZ5LT5uYW1lKSk7Cn0KRVhQT1JUX1NZTUJPTChpcmRhX25vdGlmeV9pbml0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyZGFfaW5pdCAodm9pZCkKICoKICogIFByb3RvY29sIHN0YWNrIGluaXRpYWxpc2F0aW9uIGVudHJ5IHBvaW50LgogKiAgSW5pdGlhbGlzZSB0aGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZSBJckRBIHN0YWNrCiAqLwpzdGF0aWMgaW50IF9faW5pdCBpcmRhX2luaXQodm9pZCkKewoJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCgkvKiBMb3dlciBsYXllciBvZiB0aGUgc3RhY2sgKi8KCWlybG1wX2luaXQoKTsKCWlybGFwX2luaXQoKTsKCgkvKiBIaWdoZXIgbGF5ZXJzIG9mIHRoZSBzdGFjayAqLwoJaXJpYXBfaW5pdCgpOwoJaXJ0dHBfaW5pdCgpOwoJaXJzb2NrX2luaXQoKTsKCgkvKiBBZGQgSXJEQSBwYWNrZXQgdHlwZSAoU3RhcnQgcmVjZWl2aW5nIHBhY2tldHMpICovCglkZXZfYWRkX3BhY2soJmlyZGFfcGFja2V0X3R5cGUpOwoKCS8qIEV4dGVybmFsIEFQSXMgKi8KI2lmZGVmIENPTkZJR19QUk9DX0ZTCglpcmRhX3Byb2NfcmVnaXN0ZXIoKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU1lTQ1RMCglpcmRhX3N5c2N0bF9yZWdpc3RlcigpOwojZW5kaWYKCgkvKiBEcml2ZXIvZG9uZ2xlIHN1cHBvcnQgKi8KCWlyZGFfZGV2aWNlX2luaXQoKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJkYV9jbGVhbnVwICh2b2lkKQogKgogKiAgUHJvdG9jb2wgc3RhY2sgY2xlYW51cC9yZW1vdmFsIGVudHJ5IHBvaW50LgogKiAgQ2xlYW51cCB0aGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZSBJckRBIHN0YWNrCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgaXJkYV9jbGVhbnVwKHZvaWQpCnsKCS8qIFJlbW92ZSBFeHRlcm5hbCBBUElzICovCiNpZmRlZiBDT05GSUdfU1lTQ1RMCglpcmRhX3N5c2N0bF91bnJlZ2lzdGVyKCk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1BST0NfRlMKCWlyZGFfcHJvY191bnJlZ2lzdGVyKCk7CiNlbmRpZgoKCS8qIFJlbW92ZSBJckRBIHBhY2tldCB0eXBlIChzdG9wIHJlY2VpdmluZyBwYWNrZXRzKSAqLwoJZGV2X3JlbW92ZV9wYWNrKCZpcmRhX3BhY2tldF90eXBlKTsKCgkvKiBSZW1vdmUgaGlnaGVyIGxheWVycyAqLwoJaXJzb2NrX2NsZWFudXAoKTsKCWlydHRwX2NsZWFudXAoKTsKCWlyaWFwX2NsZWFudXAoKTsKCgkvKiBSZW1vdmUgbG93ZXIgbGF5ZXJzICovCglpcmRhX2RldmljZV9jbGVhbnVwKCk7CglpcmxhcF9jbGVhbnVwKCk7IC8qIE11c3QgYmUgZG9uZSBiZWZvcmUgaXJsbXBfY2xlYW51cCgpISBEQiAqLwoKCS8qIFJlbW92ZSBtaWRkbGUgbGF5ZXIgKi8KCWlybG1wX2NsZWFudXAoKTsKfQoKLyoKICogVGhlIElyREEgc3RhY2sgbXVzdCBiZSBpbml0aWFsaXNlZCAqYmVmb3JlKiBkcml2ZXJzIGdldCBpbml0aWFsaXNlZCwKICogYW5kICpiZWZvcmUqIGhpZ2hlciBwcm90b2NvbHMgKElyTEFOL0lyQ09NTS9Jck5FVCkgZ2V0IGluaXRpYWxpc2VkLAogKiBvdGhlcndpc2UgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiAoaGFzaGJpbnMgd2lsbCBiZSBOVUxMIGZvciBleGFtcGxlKS4KICogVGhvc2UgbW9kdWxlcyBhcmUgYXQgbW9kdWxlX2luaXQoKS9kZXZpY2VfaW5pdGNhbGwoKSBsZXZlbC4KICoKICogT24gdGhlIG90aGVyIGhhbmQsIGl0IG5lZWRzIHRvIGJlIGluaXRpYWxpc2VkICphZnRlciogdGhlIGJhc2ljCiAqIG5ldHdvcmtpbmcsIHRoZSAvcHJvYy9uZXQgZmlsZXN5c3RlbSBhbmQgc3lzY3RsIG1vZHVsZS4gVGhvc2UgYXJlCiAqIGN1cnJlbnRseSBpbml0aWFsaXNlZCBpbiAuLi4vaW5pdC9tYWluLmMgKGJlZm9yZSBpbml0Y2FsbHMpLgogKiBBbHNvLCBJckRBIGRyaXZlcnMgbmVlZHMgdG8gYmUgaW5pdGlhbGlzZWQgKmFmdGVyKiB0aGUgcmFuZG9tIG51bWJlcgogKiBnZW5lcmF0b3IgKG1haW4gc3RhY2sgYW5kIGhpZ2hlciBsYXllciBpbml0IGRvbid0IG5lZWQgaXQgYW55bW9yZSkuCiAqCiAqIEplYW4gSUkKICovCnN1YnN5c19pbml0Y2FsbChpcmRhX2luaXQpOwptb2R1bGVfZXhpdChpcmRhX2NsZWFudXApOwoKTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAmIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgTGludXggSXJEQSBQcm90b2NvbCBTdGFjayIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9JUkRBKTsK