LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcnN5c2N0bC5jCiAqIFZlcnNpb246ICAgICAgIDEuMAogKiBEZXNjcmlwdGlvbjogICBTeXNjdGwgaW50ZXJmYWNlIGZvciBJckRBCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gTWF5IDI0IDIyOjEyOjA2IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgRnJpIEp1biAgNCAwMjo1MDoxNSAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KICoKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcwogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CQkvKiBpcmRhX2RlYnVnICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KCiNkZWZpbmUgTkVUX0lSREEgNDEyIC8qIFJhbmRvbSBudW1iZXIgKi8KZW51bSB7IERJU0NPVkVSWT0xLCBERVZOQU1FLCBERUJVRywgRkFTVF9QT0xMLCBESVNDT1ZFUllfU0xPVFMsCiAgICAgICBESVNDT1ZFUllfVElNRU9VVCwgU0xPVF9USU1FT1VULCBNQVhfQkFVRF9SQVRFLCBNSU5fVFhfVFVSTl9USU1FLAogICAgICAgTUFYX1RYX0RBVEFfU0laRSwgTUFYX1RYX1dJTkRPVywgTUFYX05PUkVQTFlfVElNRSwgV0FSTl9OT1JFUExZX1RJTUUsCiAgICAgICBMQVBfS0VFUEFMSVZFX1RJTUUgfTsKCmV4dGVybiBpbnQgIHN5c2N0bF9kaXNjb3Zlcnk7CmV4dGVybiBpbnQgIHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHM7CmV4dGVybiBpbnQgIHN5c2N0bF9kaXNjb3ZlcnlfdGltZW91dDsKZXh0ZXJuIGludCAgc3lzY3RsX3Nsb3RfdGltZW91dDsKZXh0ZXJuIGludCAgc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZTsKZXh0ZXJuIGNoYXIgc3lzY3RsX2Rldm5hbWVbXTsKZXh0ZXJuIGludCAgc3lzY3RsX21heF9iYXVkX3JhdGU7CmV4dGVybiBpbnQgIHN5c2N0bF9taW5fdHhfdHVybl90aW1lOwpleHRlcm4gaW50ICBzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZTsKZXh0ZXJuIGludCAgc3lzY3RsX21heF90eF93aW5kb3c7CmV4dGVybiBpbnQgIHN5c2N0bF9tYXhfbm9yZXBseV90aW1lOwpleHRlcm4gaW50ICBzeXNjdGxfd2Fybl9ub3JlcGx5X3RpbWU7CmV4dGVybiBpbnQgIHN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWU7CgovKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHByb2NfZG9pbnR2ZWNfbWlubWF4IC0gSmVhbiBJSSAqLwpzdGF0aWMgaW50IG1heF9kaXNjb3Zlcnlfc2xvdHMgPSAxNjsJCS8qID8/PyAqLwpzdGF0aWMgaW50IG1pbl9kaXNjb3Zlcnlfc2xvdHMgPSAxOwovKiBJckxBUCA2LjEzLjIgc2F5cyAyNW1zIHRvIDEwKzcwbXMgLSBhbGxvdyBoaWdoZXIgc2luY2Ugc29tZSBkZXZpY2VzCiAqIHNlZW1zIHRvIHJlcXVpcmUgaXQuIChmcm9tIERhZydzIGNvbW1lbnQpICovCnN0YXRpYyBpbnQgbWF4X3Nsb3RfdGltZW91dCA9IDE2MDsKc3RhdGljIGludCBtaW5fc2xvdF90aW1lb3V0ID0gMjA7CnN0YXRpYyBpbnQgbWF4X21heF9iYXVkX3JhdGUgPSAxNjAwMDAwMDsJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLwpzdGF0aWMgaW50IG1pbl9tYXhfYmF1ZF9yYXRlID0gMjQwMDsKc3RhdGljIGludCBtYXhfbWluX3R4X3R1cm5fdGltZSA9IDEwMDAwOwkvKiBTZWUgcW9zLmMgLSBJckxBUCBzcGVjICovCnN0YXRpYyBpbnQgbWluX21pbl90eF90dXJuX3RpbWU7CnN0YXRpYyBpbnQgbWF4X21heF90eF9kYXRhX3NpemUgPSAyMDQ4OwkJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLwpzdGF0aWMgaW50IG1pbl9tYXhfdHhfZGF0YV9zaXplID0gNjQ7CnN0YXRpYyBpbnQgbWF4X21heF90eF93aW5kb3cgPSA3OwkJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLwpzdGF0aWMgaW50IG1pbl9tYXhfdHhfd2luZG93ID0gMTsKc3RhdGljIGludCBtYXhfbWF4X25vcmVwbHlfdGltZSA9IDQwOwkJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLwpzdGF0aWMgaW50IG1pbl9tYXhfbm9yZXBseV90aW1lID0gMzsKc3RhdGljIGludCBtYXhfd2Fybl9ub3JlcGx5X3RpbWUgPSAzOwkJLyogM3MgPT0gc3RhbmRhcmQgKi8Kc3RhdGljIGludCBtaW5fd2Fybl9ub3JlcGx5X3RpbWUgPSAxOwkJLyogMXMgPT0gbWluIFdEX1RJTUVSICovCnN0YXRpYyBpbnQgbWF4X2xhcF9rZWVwYWxpdmVfdGltZSA9IDEwMDAwOwkvKiAxMHMgKi8Kc3RhdGljIGludCBtaW5fbGFwX2tlZXBhbGl2ZV90aW1lID0gMTAwOwkvKiAxMDB1cyAqLwovKiBGb3Igb3RoZXIgc3lzY3RsLCBJJ3ZlIG5vIGlkZWEgb2YgdGhlIHJhbmdlLiBNYXliZSBEYWcgY291bGQgaGVscAogKiB1cyBvbiB0aGF0IC0gSmVhbiBJSSAqLwoKc3RhdGljIGludCBkb19kZXZuYW1lKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCgkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCnsKCWludCByZXQ7CgoJcmV0ID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CglpZiAocmV0ID09IDAgJiYgd3JpdGUpIHsKCQlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWw7CgoJCXZhbCA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUoc3lzY3RsX2Rldm5hbWUpOwoJCWlmICh2YWwpCgkJCWlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKCJEZXZpY2UiLCAiRGV2aWNlTmFtZSIsIHZhbCk7Cgl9CglyZXR1cm4gcmV0Owp9CgovKiBPbmUgZmlsZSAqLwpzdGF0aWMgY3RsX3RhYmxlIGlyZGFfdGFibGVbXSA9IHsKCXsKCQkuY3RsX25hbWUJPSBESVNDT1ZFUlksCgkJLnByb2NuYW1lCT0gImRpc2NvdmVyeSIsCgkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3ZlcnksCgkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKCQkubW9kZQkJPSAwNjQ0LAoJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwoJfSwKCXsKCQkuY3RsX25hbWUJPSBERVZOQU1FLAoJCS5wcm9jbmFtZQk9ICJkZXZuYW1lIiwKCQkuZGF0YQkJPSBzeXNjdGxfZGV2bmFtZSwKCQkubWF4bGVuCQk9IDY1LAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZkb19kZXZuYW1lLAoJCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nCgl9LAojaWZkZWYgQ09ORklHX0lSREFfREVCVUcKCXsKCQkuY3RsX25hbWUJPSBERUJVRywKCQkucHJvY25hbWUJPSAiZGVidWciLAoJCS5kYXRhCQk9ICZpcmRhX2RlYnVnLAoJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCgkJLm1vZGUJCT0gMDY0NCwKCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKCX0sCiNlbmRpZgojaWZkZWYgQ09ORklHX0lSREFfRkFTVF9SUgoJewoJCS5jdGxfbmFtZQk9IEZBU1RfUE9MTCwKCQkucHJvY25hbWUJPSAiZmFzdF9wb2xsX2luY3JlYXNlIiwKCQkuZGF0YQkJPSAmc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZSwKCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCgl9LAojZW5kaWYKCXsKCQkuY3RsX25hbWUJPSBESVNDT1ZFUllfU0xPVFMsCgkJLnByb2NuYW1lCT0gImRpc2NvdmVyeV9zbG90cyIsCgkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3Zlcnlfc2xvdHMsCgkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKCQkubW9kZQkJPSAwNjQ0LAoJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCgkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCgkJLmV4dHJhMQkJPSAmbWluX2Rpc2NvdmVyeV9zbG90cywKCQkuZXh0cmEyCQk9ICZtYXhfZGlzY292ZXJ5X3Nsb3RzCgl9LAoJewoJCS5jdGxfbmFtZQk9IERJU0NPVkVSWV9USU1FT1VULAoJCS5wcm9jbmFtZQk9ICJkaXNjb3ZlcnlfdGltZW91dCIsCgkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3ZlcnlfdGltZW91dCwKCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCgl9LAoJewoJCS5jdGxfbmFtZQk9IFNMT1RfVElNRU9VVCwKCQkucHJvY25hbWUJPSAic2xvdF90aW1lb3V0IiwKCQkuZGF0YQkJPSAmc3lzY3RsX3Nsb3RfdGltZW91dCwKCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKCQkuZXh0cmExCQk9ICZtaW5fc2xvdF90aW1lb3V0LAoJCS5leHRyYTIJCT0gJm1heF9zbG90X3RpbWVvdXQKCX0sCgl7CgkJLmN0bF9uYW1lCT0gTUFYX0JBVURfUkFURSwKCQkucHJvY25hbWUJPSAibWF4X2JhdWRfcmF0ZSIsCgkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfYmF1ZF9yYXRlLAoJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCgkJLm1vZGUJCT0gMDY0NCwKCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAoJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAoJCS5leHRyYTEJCT0gJm1pbl9tYXhfYmF1ZF9yYXRlLAoJCS5leHRyYTIJCT0gJm1heF9tYXhfYmF1ZF9yYXRlCgl9LAoJewoJCS5jdGxfbmFtZQk9IE1JTl9UWF9UVVJOX1RJTUUsCgkJLnByb2NuYW1lCT0gIm1pbl90eF90dXJuX3RpbWUiLAoJCS5kYXRhCQk9ICZzeXNjdGxfbWluX3R4X3R1cm5fdGltZSwKCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKCQkuZXh0cmExCQk9ICZtaW5fbWluX3R4X3R1cm5fdGltZSwKCQkuZXh0cmEyCQk9ICZtYXhfbWluX3R4X3R1cm5fdGltZQoJfSwKCXsKCQkuY3RsX25hbWUJPSBNQVhfVFhfREFUQV9TSVpFLAoJCS5wcm9jbmFtZQk9ICJtYXhfdHhfZGF0YV9zaXplIiwKCQkuZGF0YQkJPSAmc3lzY3RsX21heF90eF9kYXRhX3NpemUsCgkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKCQkubW9kZQkJPSAwNjQ0LAoJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCgkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCgkJLmV4dHJhMQkJPSAmbWluX21heF90eF9kYXRhX3NpemUsCgkJLmV4dHJhMgkJPSAmbWF4X21heF90eF9kYXRhX3NpemUKCX0sCgl7CgkJLmN0bF9uYW1lCT0gTUFYX1RYX1dJTkRPVywKCQkucHJvY25hbWUJPSAibWF4X3R4X3dpbmRvdyIsCgkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfdHhfd2luZG93LAoJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCgkJLm1vZGUJCT0gMDY0NCwKCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAoJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAoJCS5leHRyYTEJCT0gJm1pbl9tYXhfdHhfd2luZG93LAoJCS5leHRyYTIJCT0gJm1heF9tYXhfdHhfd2luZG93Cgl9LAoJewoJCS5jdGxfbmFtZQk9IE1BWF9OT1JFUExZX1RJTUUsCgkJLnByb2NuYW1lCT0gIm1heF9ub3JlcGx5X3RpbWUiLAoJCS5kYXRhCQk9ICZzeXNjdGxfbWF4X25vcmVwbHlfdGltZSwKCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAoJCS5tb2RlCQk9IDA2NDQsCgkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKCQkuZXh0cmExCQk9ICZtaW5fbWF4X25vcmVwbHlfdGltZSwKCQkuZXh0cmEyCQk9ICZtYXhfbWF4X25vcmVwbHlfdGltZQoJfSwKCXsKCQkuY3RsX25hbWUJPSBXQVJOX05PUkVQTFlfVElNRSwKCQkucHJvY25hbWUJPSAid2Fybl9ub3JlcGx5X3RpbWUiLAoJCS5kYXRhCQk9ICZzeXNjdGxfd2Fybl9ub3JlcGx5X3RpbWUsCgkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKCQkubW9kZQkJPSAwNjQ0LAoJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCgkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCgkJLmV4dHJhMQkJPSAmbWluX3dhcm5fbm9yZXBseV90aW1lLAoJCS5leHRyYTIJCT0gJm1heF93YXJuX25vcmVwbHlfdGltZQoJfSwKCXsKCQkuY3RsX25hbWUJPSBMQVBfS0VFUEFMSVZFX1RJTUUsCgkJLnByb2NuYW1lCT0gImxhcF9rZWVwYWxpdmVfdGltZSIsCgkJLmRhdGEJCT0gJnN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWUsCgkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKCQkubW9kZQkJPSAwNjQ0LAoJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCgkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCgkJLmV4dHJhMQkJPSAmbWluX2xhcF9rZWVwYWxpdmVfdGltZSwKCQkuZXh0cmEyCQk9ICZtYXhfbGFwX2tlZXBhbGl2ZV90aW1lCgl9LAoJeyAuY3RsX25hbWUgPSAwIH0KfTsKCi8qIE9uZSBkaXJlY3RvcnkgKi8Kc3RhdGljIGN0bF90YWJsZSBpcmRhX25ldF90YWJsZVtdID0gewoJewoJCS5jdGxfbmFtZQk9IE5FVF9JUkRBLAoJCS5wcm9jbmFtZQk9ICJpcmRhIiwKCQkubWF4bGVuCQk9IDAsCgkJLm1vZGUJCT0gMDU1NSwKCQkuY2hpbGQJCT0gaXJkYV90YWJsZQoJfSwKCXsgLmN0bF9uYW1lID0gMCB9Cn07CgovKiBUaGUgcGFyZW50IGRpcmVjdG9yeSAqLwpzdGF0aWMgY3RsX3RhYmxlIGlyZGFfcm9vdF90YWJsZVtdID0gewoJewoJCS5jdGxfbmFtZQk9IENUTF9ORVQsCgkJLnByb2NuYW1lCT0gIm5ldCIsCgkJLm1heGxlbgkJPSAwLAoJCS5tb2RlCQk9IDA1NTUsCgkJLmNoaWxkCQk9IGlyZGFfbmV0X3RhYmxlCgl9LAoJeyAuY3RsX25hbWUgPSAwIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXJkYV90YWJsZV9oZWFkZXI7CgovKgogKiBGdW5jdGlvbiBpcmRhX3N5c2N0bF9yZWdpc3RlciAodm9pZCkKICoKICogICAgUmVnaXN0ZXIgb3VyIHN5c2N0bCBpbnRlcmZhY2UKICoKICovCmludCBfX2luaXQgaXJkYV9zeXNjdGxfcmVnaXN0ZXIodm9pZCkKewoJaXJkYV90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXJkYV9yb290X3RhYmxlKTsKCWlmICghaXJkYV90YWJsZV9oZWFkZXIpCgkJcmV0dXJuIC1FTk9NRU07CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyZGFfc3lzY3RsX3VucmVnaXN0ZXIgKHZvaWQpCiAqCiAqICAgIFVucmVnaXN0ZXIgb3VyIHN5c2N0bCBpbnRlcmZhY2UKICoKICovCnZvaWQgaXJkYV9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKQp7Cgl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcmRhX3RhYmxlX2hlYWRlcik7Cn0KCgoK