LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBGaW5uaXNoIGxhbmd1YWdlIGJ5IEp1c3NpIFRpcmtrb25lbiA8anRAbW9kZWVtaS5jcy50dXQuZmk+CiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAid2luaGVscF9yZXMuaCIKCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfRklOTklTSCwgU1VCTEFOR19ERUZBVUxUCnsKIFBPUFVQICImVGllZG9zdG8iIHsKICBNRU5VSVRFTSAiJkF2YWEuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImVHVsb3N0YSIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImS2lyam9pdHRpbWVuIGFzZXR1a3NldC4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkxvcGV0YSIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJk11b2trYWEiIHsKICAgTUVOVUlURU0gIiZLb3Bpb2kuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZIdW9tYXV0dXMuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICImS2lyamFubWVya2tpIiB7CiAgIE1FTlVJVEVNICImQXNldGEuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkhlbHAgYWx3YXlzIHZpc2libGUiCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIkRlZmF1bHQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlZpc2libGUiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3J5IiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZvbnRzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiU21hbGwiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJMYXJnZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlVzZSBzeXN0ZW0gY29sb3JzIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICImT2hqZSIgewogICBNRU5VSVRFTSAiJk9oamVlbiBr5Hl0dPYiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICImQWluYSBw5ORsbGltbeRpc2Vu5CIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiVCZpZXRvamEuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZUaWV0b2phIFdJTkVzdOQiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKLyogU3RyaW5ncyAqLwoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQKewpTVElEX1dJTkVfSEVMUCwgCSJXSU5FIE9oamUiClNUSURfV0hFUlJPUiwgCQkiVklSSEUiClNUSURfV0FSTklORywgIAkJIlZBUk9JVFVTIgpTVElEX0lORk8sICAJCSJUaWV0b2phIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJFaSBr5Hl0ZXR05HZpc3PkIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJWaXJoZSBsdWV0dGFlc3NhIG9oamV0aWVkb3N0b2EgYCVzJyIKU1RJRF9JTkRFWCwgCQkiJlNpc+RsbHlzIgpTVElEX0NPTlRFTlRTLAkJIlN1bW1hcnkiClNUSURfQkFDSywgCQkiJlRha2Fpc2luIgpTVElEX0FMTF9GSUxFUywgCSJLYWlra2kgdGllZG9zdG90ICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIk9oamV0aWVkb3N0b3QgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJDYW5ub3QgZmluZCAnJXMnLiBEbyB5b3Ugd2FudCB0byBmaW5kIHRoaXMgZmlsZSB5b3Vyc2VsZj8iClNUSURfTk9fUklDSEVESVQJIkNhbm5vdCBmaW5kIGEgcmljaGVkaXQgaW1wbGVtZW50YXRpb24uLi4gQWJvcnRpbmciClNUSURfUFNIX0lOREVYLAkJIkhlbHAgdG9waWNzOiAiCn0K