Ly8geyBkZy1yZXF1aXJlLW5hbWVkbG9jYWxlICIiIH0KCi8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQovLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi8vIGFueSBsYXRlciB2ZXJzaW9uLgoKLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLy8gU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAovLyBVU0EuCgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgoKaW50IG1haW4oKQp7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgYm9vbCB0ZXN0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gdHJ1ZTsKICBsb2NhbGUgbDEgPSBsb2NhbGUoImRlX0RFIik7CiAgbG9jYWxlIGwyID0gbG9jYWxlKCJlc19FUyIpOwogIAogIGNvbnN0IHRpbWVfcHV0PGNoYXI+ICZ0cCA9IHVzZV9mYWNldDx0aW1lX3B1dDxjaGFyPiA+KGwxKTsgIAogIG9zdHJpbmdzdHJlYW0gb3NzOwogIG9zcy5pbWJ1ZShsMik7CiAgCiAgdG0gdCA9IHRtKCk7ICAKICB0cC5wdXQob3NzLnJkYnVmKCksIG9zcywgJyAnLCAmdCwgJ0EnKTsKICBzdHJpbmcgcmVzID0gb3NzLnN0cigpOwogIAogIFZFUklGWSggcmVzID09ICJkb21pbmdvIiApOwoKICByZXR1cm4gMDsKfQoKLy8gVHdvIGludGVycHJldGF0aW9ucyBvZiB0aGUgc3RhbmRhcmQuCgovLyAxIDogdGltZV9nZXQsIHRpbWVfcHV0IGVhY2ggaGF2ZSB0aGVpciBvd24gZGF0YSBpbnRlcm5hbGx5Ci8vICAgdXNlIGludGVybmFsIGRhdGEgZm9yIHRpbWUgYW5kIGRhdGUgc3BlY2lmaWNzCi8vICAgdXNlIGdldGxvYyBmb3IgY3R5cGUgaW5mbwoKLy8gMiA6IHRpbWVfZ2V0LCB0aW1lX3B1dCB1c2UgdGhlIGlvc19iYXNlJiBhcmd1bWVudCBhbmQgZ2V0bG9jIHRvCi8vIHJldHJpZXZlIHRoZSBuZWNlc3NhcnkgZGF0YS4KLy8gICB1c2UgZ2V0bG9jIGZvciBjdHlwZSwgdGltZSBhbmQgZGF0ZSBzcGVjaWZpY3MKCi8vIEl0IGlzIG15IG9waW5pb24gdGhhdCB0aGUgbGFuZ3VhZ2UgaW4gdGhlIHN0YW5kYXJkIGlzIHN1ZmZpY2llbnRseQovLyB2YWd1ZSB0byBwZXJtaXQgYm90aCBpbnRlcnByZXRhdGlvbnMuIEluIHBhcnRpY3VsYXIsIHRoZSBpbnRlcmZhY2UKLy8gZm9yIHRpbWVfZ2V0IGFuZCB0aW1lX3B1dCBpcyBiYXNlZCBvbiBzdHJmdGltZSwgd2hpY2ggYXMKLy8gUE9TSVggbm90ZXMgaXMgZGVwZW5kZW50IG9uIExDX1RJTUUuIFRoZSBDKysgc3RhbmRhcmQsIGhvd2V2ZXIsCi8vIGRvZXMgbm90IHNwZWNpZnkgdGhlIGVxdWl2YWxlbnQgbWFwcGluZ3Mgb2YgTENfVElNRSB0byB0aW1lX2dldCBhbmQKLy8gdGltZV9wdXQuCgovKgpUaGUgcHJvYmxlbXMgd2l0aCB0aGUgZmlyc3QgYXBwcm9hY2gsIGFzIGFib3ZlLCBhcmUgbnVtZXJvdXMuCgoxKSBUaGUgbG9jYWxlIHVzYWdlIGFuZCBkZXNpZ24gZm9yIGZvcm1hdHRlcnMgYW5kIHBhcnNlcnMgYmVjb21lcwogICBmcmFnbWVudGVkLiBPbiBvbmUgc2lkZSwgbnVtX3B1dCBhbmQgbW9uZXlfcHV0LCBhbmQgb24gdGhlIG90aGVyLAogICB0aW1lX3B1dC4gVGhpcyBpbmNvbnNpc3RlbmN5IGlzIG5vdCB1c2VmdWwuCgoyKSBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aW1lIGFuZCBkYXRlIGZvcm1hdHRpbmcgYXJlIHRoZSBsYXJnZXN0IGluCiAgIHRoZSBsb2NhbGUgbGlicmFyeS4gTWFraW5nIHRpbWVfcHV0IGFuZCB0aW1lX2dldCBrZWVwIHNlcGFyYXRlCiAgIGNvcGllcyBpcyBpbmVmZmljaWVudC4gKE5vdGUgdGhhdCB0aW1lX3B1dCBhbmQgdGltZV9nZXQgYXJlIGluIHRoZQogICBzYW1lIGxvY2FsZTo6Y2F0ZWdvcnkpLgoqLwoKCi8qCjIyLjIuNSAtIFRoZSB0aW1lIGNhdGVnb3J5IFtsaWIuY2F0ZWdvcnkudGltZV0KCi0xLSBUZW1wbGF0ZXMgdGltZV9nZXQ8Y2hhclQsSW5wdXRJdGVyYXRvcj4gYW5kCiB0aW1lX3B1dDxjaGFyVCxPdXRwdXRJdGVyYXRvcj4gcHJvdmlkZSBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcgYW5kCiBwYXJzaW5nLiBBbGwgc3BlY2lmaWNhdGlvbnMgb2YgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgdGltZV9wdXQgYW5kCiB0aW1lX2dldCBpbiB0aGUgc3ViY2xhdXNlcyBvZiBsaWIuY2F0ZWdvcnkudGltZSBvbmx5IGFwcGx5IHRvIHRoZQogaW5zdGFudGlhdGlvbnMgcmVxdWlyZWQgaW4gVGFibGVzIDUxIGFuZCA1MgogKGxpYi5sb2NhbGUuY2F0ZWdvcnkpLiBUaGVpciBtZW1iZXJzIHVzZSB0aGVpciBpb3NfYmFzZSYsCiBpb3NfYmFzZTo6aW9zdGF0ZSYsIGFuZCBmaWxsIGFyZ3VtZW50cyBhcyBkZXNjcmliZWQgaW4KIChsaWIubG9jYWxlLmNhdGVnb3JpZXMpLCBhbmQgdGhlIGN0eXBlPD4gZmFjZXQsIHRvIGRldGVybWluZQogZm9ybWF0dGluZyBkZXRhaWxzLgoqLwoKLyoKMjIuMiAtIFN0YW5kYXJkIGxvY2FsZSBjYXRlZ29yaWVzIFtsaWIubG9jYWxlLmNhdGVnb3JpZXNdCgotMS0gRWFjaCBvZiB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbmNsdWRlcyBhIGZhbWlseSBvZiBmYWNldHMuIFNvbWUKIG9mIHRoZXNlIGltcGxlbWVudCBmb3JtYXR0aW5nIG9yIHBhcnNpbmcgb2YgYSBkYXR1bSwgZm9yIHVzZSBieQogc3RhbmRhcmQgb3IgdXNlcnMnIGlvc3RyZWFtIG9wZXJhdG9ycyA8PCBhbmQgPj4sIGFzIG1lbWJlcnMgcHV0KCkgYW5kCiBnZXQoKSwgcmVzcGVjdGl2ZWx5LiBFYWNoIHN1Y2ggbWVtYmVyIGZ1bmN0aW9uIHRha2VzIGFuIGlvc19iYXNlJgogYXJndW1lbnQgd2hvc2UgbWVtYmVycyBmbGFncygpLCBwcmVjaXNpb24oKSwgYW5kIHdpZHRoKCksIHNwZWNpZnkgdGhlCiBmb3JtYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGF0dW0uIChsaWIuaW9zLmJhc2UpLiBUaG9zZSBmdW5jdGlvbnMKIHdoaWNoIG5lZWQgdG8gdXNlIG90aGVyIGZhY2V0cyBjYWxsIGl0cyBtZW1iZXIgZ2V0bG9jKCkgdG8gcmV0cmlldmUKIHRoZSBsb2NhbGUgaW1idWVkIHRoZXJlLiBGb3JtYXR0aW5nIGZhY2V0cyB1c2UgdGhlIGNoYXJhY3RlciBhcmd1bWVudAogZmlsbCB0byBmaWxsIG91dCB0aGUgc3BlY2lmaWVkIHdpZHRoIHdoZXJlIG5lY2Vzc2FyeS4KKi8KCi8qCldpdGggR0NDL2xpYnN0ZGMrKywgdGhlIG91dHB1dCBvZiB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBhcmd1bWVudHMKb2YgZGVfREUgZXNfRVMgaXM6CiAgICAgZG9taW5nbwogICAgIGx1bmVzCiAgICAgbWFydGVzCiAgICAgbWnpcmNvbGVzCiAgICAganVldmVzCiAgICAgdmllcm5lcwogICAgIHPhYmFkbwoKV2l0aCBJbnRlbCBDKyssIGl0IGlzOiAodGhpcyBpcyBjbGVhcmx5IHdyb25nKQogICAgIFN1bmRheQogICAgIE1vbmRheQogICAgIFR1ZXNkYXkKICAgICBXZWRuZXNkYXkKICAgICBUaHVyc2RheQogICAgIEZyaWRheQogICAgIFNhdHVyZGF5CgpBbmQgd2l0aCBSb2d1ZVdhdmUgQysrCiAgICAgU29ubnRhZwogICAgIE1vbnRhZwogICAgIERpZW5zdGFnCiAgICAgTWl0dHdvY2gKICAgICBEb25uZXJzdGFnCiAgICAgRnJlaXRhZwogICAgIFNhbXN0YWcKKi8K