LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcm1vZC5jCiAqIFZlcnNpb246ICAgICAgIDAuOQogKiBEZXNjcmlwdGlvbjogICBJckRBIHN0YWNrIG1haW4gZW50cnkgcG9pbnRzCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBNb24gRGVjIDE1IDEzOjU1OjM5IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxNToxMjo0MSAyMDAwCiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgb2YgdGhlIElyREEgc3RhY2suCiAqIFRoZXkgYXJlIGluIHRoaXMgZmlsZSBhbmQgbm90IGFmX2lyZGEuYyBiZWNhdXNlIHNvbWUgZGV2ZWxvcHBlcnMKICogYXJlIHVzaW5nIHRoZSBJckRBIHN0YWNrIHdpdGhvdXQgdGhlIHNvY2tldCBBUEkgKGNvbXBpbGluZyBvdXQKICogYWZfaXJkYS5jKS4KICogSmVhbiBJSQogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4JCS8qIG5vdGlmeV90ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgkJLyogaXJsYXBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4JCS8qIGlybG1wX2luaXQgKi8KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CQkvKiBpcmlhcF9pbml0ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgkJLyogaXJ0dHBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4JLyogaXJkYV9kZXZpY2VfaW5pdCAqLwoKLyoKICogTW9kdWxlIHBhcmFtZXRlcnMKICovCiNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwp1bnNpZ25lZCBpbnQgaXJkYV9kZWJ1ZyA9IElSREFfREVCVUdfTEVWRUw7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaXJkYV9kZWJ1ZywgdWludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJJUkRBIGRlYnVnZ2luZyBsZXZlbCIpOwpFWFBPUlRfU1lNQk9MKGlyZGFfZGVidWcpOwojZW5kaWYKCi8qIFBhY2tldCB0eXBlIGhhbmRsZXIuCiAqIFRlbGwgdGhlIGtlcm5lbCBob3cgSXJEQSBwYWNrZXRzIHNob3VsZCBiZSBoYW5kbGVkLgogKi8Kc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcmRhX3BhY2tldF90eXBlID0gewoJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lSREEpLAoJLmZ1bmMJPSBpcmxhcF9kcml2ZXJfcmN2LAkvKiBQYWNrZXQgdHlwZSBoYW5kbGVyIGlybGFwX2ZyYW1lLmMgKi8KfTsKCi8qCiAqIEZ1bmN0aW9uIGlyZGFfbm90aWZ5X2luaXQgKG5vdGlmeSkKICoKICogICAgVXNlZCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBub3RpZnkgc3RydWN0dXJlCiAqCiAqLwp2b2lkIGlyZGFfbm90aWZ5X2luaXQobm90aWZ5X3QgKm5vdGlmeSkKewoJbm90aWZ5LT5kYXRhX2luZGljYXRpb24gPSBOVUxMOwoJbm90aWZ5LT51ZGF0YV9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+Y29ubmVjdF9jb25maXJtID0gTlVMTDsKCW5vdGlmeS0+Y29ubmVjdF9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+ZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+Zmxvd19pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+c3RhdHVzX2luZGljYXRpb24gPSBOVUxMOwoJbm90aWZ5LT5pbnN0YW5jZSA9IE5VTEw7CglzdHJsY3B5KG5vdGlmeS0+bmFtZSwgIlVua25vd24iLCBzaXplb2Yobm90aWZ5LT5uYW1lKSk7Cn0KRVhQT1JUX1NZTUJPTChpcmRhX25vdGlmeV9pbml0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyZGFfaW5pdCAodm9pZCkKICoKICogIFByb3RvY29sIHN0YWNrIGluaXRpYWxpc2F0aW9uIGVudHJ5IHBvaW50LgogKiAgSW5pdGlhbGlzZSB0aGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZSBJckRBIHN0YWNrCiAqLwpzdGF0aWMgaW50IF9faW5pdCBpcmRhX2luaXQodm9pZCkKewoJaW50IHJldCA9IDA7CgoJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCgkvKiBMb3dlciBsYXllciBvZiB0aGUgc3RhY2sgKi8KCWlybG1wX2luaXQoKTsKCWlybGFwX2luaXQoKTsKCgkvKiBEcml2ZXIvZG9uZ2xlIHN1cHBvcnQgKi8KCWlyZGFfZGV2aWNlX2luaXQoKTsKCgkvKiBIaWdoZXIgbGF5ZXJzIG9mIHRoZSBzdGFjayAqLwoJaXJpYXBfaW5pdCgpOwoJaXJ0dHBfaW5pdCgpOwoJcmV0ID0gaXJzb2NrX2luaXQoKTsKCWlmIChyZXQgPCAwKQoJCWdvdG8gb3V0X2Vycl8xOwoKCS8qIEFkZCBJckRBIHBhY2tldCB0eXBlIChTdGFydCByZWNlaXZpbmcgcGFja2V0cykgKi8KCWRldl9hZGRfcGFjaygmaXJkYV9wYWNrZXRfdHlwZSk7CgoJLyogRXh0ZXJuYWwgQVBJcyAqLwojaWZkZWYgQ09ORklHX1BST0NfRlMKCWlyZGFfcHJvY19yZWdpc3RlcigpOwojZW5kaWYKI2lmZGVmIENPTkZJR19TWVNDVEwKCXJldCA9IGlyZGFfc3lzY3RsX3JlZ2lzdGVyKCk7CglpZiAocmV0IDwgMCkKCQlnb3RvIG91dF9lcnJfMjsKI2VuZGlmCgoJcmV0ID0gaXJkYV9ubF9yZWdpc3RlcigpOwoJaWYgKHJldCA8IDApCgkJZ290byBvdXRfZXJyXzM7CgoJcmV0dXJuIDA7Cgogb3V0X2Vycl8zOgojaWZkZWYgQ09ORklHX1NZU0NUTAoJaXJkYV9zeXNjdGxfdW5yZWdpc3RlcigpOwogb3V0X2Vycl8yOgojZW5kaWYKI2lmZGVmIENPTkZJR19QUk9DX0ZTCglpcmRhX3Byb2NfdW5yZWdpc3RlcigpOwojZW5kaWYKCgkvKiBSZW1vdmUgSXJEQSBwYWNrZXQgdHlwZSAoc3RvcCByZWNlaXZpbmcgcGFja2V0cykgKi8KCWRldl9yZW1vdmVfcGFjaygmaXJkYV9wYWNrZXRfdHlwZSk7CgoJLyogUmVtb3ZlIGhpZ2hlciBsYXllcnMgKi8KCWlyc29ja19jbGVhbnVwKCk7CiBvdXRfZXJyXzE6CglpcnR0cF9jbGVhbnVwKCk7CglpcmlhcF9jbGVhbnVwKCk7CgoJLyogUmVtb3ZlIGxvd2VyIGxheWVycyAqLwoJaXJkYV9kZXZpY2VfY2xlYW51cCgpOwoJaXJsYXBfY2xlYW51cCgpOyAvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIGlybG1wX2NsZWFudXAoKSEgREIgKi8KCgkvKiBSZW1vdmUgbWlkZGxlIGxheWVyICovCglpcmxtcF9jbGVhbnVwKCk7CgoKCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyZGFfY2xlYW51cCAodm9pZCkKICoKICogIFByb3RvY29sIHN0YWNrIGNsZWFudXAvcmVtb3ZhbCBlbnRyeSBwb2ludC4KICogIENsZWFudXAgdGhlIHZhcmlvdXMgY29tcG9uZW50cyBvZiB0aGUgSXJEQSBzdGFjawogKi8Kc3RhdGljIHZvaWQgX19leGl0IGlyZGFfY2xlYW51cCh2b2lkKQp7CgkvKiBSZW1vdmUgRXh0ZXJuYWwgQVBJcyAqLwoJaXJkYV9ubF91bnJlZ2lzdGVyKCk7CgojaWZkZWYgQ09ORklHX1NZU0NUTAoJaXJkYV9zeXNjdGxfdW5yZWdpc3RlcigpOwojZW5kaWYKI2lmZGVmIENPTkZJR19QUk9DX0ZTCglpcmRhX3Byb2NfdW5yZWdpc3RlcigpOwojZW5kaWYKCgkvKiBSZW1vdmUgSXJEQSBwYWNrZXQgdHlwZSAoc3RvcCByZWNlaXZpbmcgcGFja2V0cykgKi8KCWRldl9yZW1vdmVfcGFjaygmaXJkYV9wYWNrZXRfdHlwZSk7CgoJLyogUmVtb3ZlIGhpZ2hlciBsYXllcnMgKi8KCWlyc29ja19jbGVhbnVwKCk7CglpcnR0cF9jbGVhbnVwKCk7CglpcmlhcF9jbGVhbnVwKCk7CgoJLyogUmVtb3ZlIGxvd2VyIGxheWVycyAqLwoJaXJkYV9kZXZpY2VfY2xlYW51cCgpOwoJaXJsYXBfY2xlYW51cCgpOyAvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIGlybG1wX2NsZWFudXAoKSEgREIgKi8KCgkvKiBSZW1vdmUgbWlkZGxlIGxheWVyICovCglpcmxtcF9jbGVhbnVwKCk7Cn0KCi8qCiAqIFRoZSBJckRBIHN0YWNrIG11c3QgYmUgaW5pdGlhbGlzZWQgKmJlZm9yZSogZHJpdmVycyBnZXQgaW5pdGlhbGlzZWQsCiAqIGFuZCAqYmVmb3JlKiBoaWdoZXIgcHJvdG9jb2xzIChJckxBTi9JckNPTU0vSXJORVQpIGdldCBpbml0aWFsaXNlZCwKICogb3RoZXJ3aXNlIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gKGhhc2hiaW5zIHdpbGwgYmUgTlVMTCBmb3IgZXhhbXBsZSkuCiAqIFRob3NlIG1vZHVsZXMgYXJlIGF0IG1vZHVsZV9pbml0KCkvZGV2aWNlX2luaXRjYWxsKCkgbGV2ZWwuCiAqCiAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBuZWVkcyB0byBiZSBpbml0aWFsaXNlZCAqYWZ0ZXIqIHRoZSBiYXNpYwogKiBuZXR3b3JraW5nLCB0aGUgL3Byb2MvbmV0IGZpbGVzeXN0ZW0gYW5kIHN5c2N0bCBtb2R1bGUuIFRob3NlIGFyZQogKiBjdXJyZW50bHkgaW5pdGlhbGlzZWQgaW4gLi4uL2luaXQvbWFpbi5jIChiZWZvcmUgaW5pdGNhbGxzKS4KICogQWxzbywgSXJEQSBkcml2ZXJzIG5lZWRzIHRvIGJlIGluaXRpYWxpc2VkICphZnRlciogdGhlIHJhbmRvbSBudW1iZXIKICogZ2VuZXJhdG9yIChtYWluIHN0YWNrIGFuZCBoaWdoZXIgbGF5ZXIgaW5pdCBkb24ndCBuZWVkIGl0IGFueW1vcmUpLgogKgogKiBKZWFuIElJCiAqLwpzdWJzeXNfaW5pdGNhbGwoaXJkYV9pbml0KTsKbW9kdWxlX2V4aXQoaXJkYV9jbGVhbnVwKTsKCk1PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gJiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVGhlIExpbnV4IElyREEgUHJvdG9jb2wgU3RhY2siKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfSVJEQSk7Cg==