VGhpcyBpcyBhbiBvdXRsaW5lIG9mIHRoZSBhcmNoaXRlY3R1cmUuIE1hbnkgZGV0YWlscyBhcmUKc2tpcHBlZCwgYnV0IGhvcGVmdWxseSB0aGlzIGlzIHVzZWZ1bC4KCkJ5IEFuZHJldyBMZXd5Y2t5IDxhbmRyZXdAdHJhbnNnYW1pbmcuY29tPgood2l0aCB1cGRhdGVzIGJ5IE92ZSBL5XZlbiA8b3Zla0B0cmFuc2dhbWluZy5jb20+KQoKCiogRGlyZWN0RHJhdyBpbmhlcml0YW5jZSB0cmVlCgogICAgICAgIE1haW4KICAgICAgICAgfAogICAgICAgIFVzZXIKICAgICAgICAgfC0tLS0tLS0tLS0tXAogICAgICAgIFhWaWRNb2RlICAgIERHQTIKCk1vc3Qgb2YgdGhlIERpcmVjdERyYXcgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCBpbiBhIGNvbW1vbiBiYXNlCmNsYXNzLiBEZXJpdmVkIGNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgZGlzcGxheQptb2RlIGZ1bmN0aW9ucyAoRW51bSwgU2V0LCBSZXN0b3JlKSwgR2V0Q2FwcywgR2V0RGV2aWNlIGlkZW50aWZpZXIKYW5kIGludGVybmFsIGZ1bmN0aW9ucyBjYWxsZWQgdG8gY3JlYXRlIHByaW1hcnkgYW5kIGJhY2tidWZmZXIKc3VyZmFjZXMuCgpVc2VyIHByb3ZpZGVzIGZvciBEaXJlY3REcmF3IGNhcGFiaWxpdGllcyBiYXNlZCBvbiBkcmF3aW5nIHRvIGEKV2luZSB3aW5kb3cuIEl0IHVzZXMgdGhlIFVzZXIgRGlyZWN0RHJhd1N1cmZhY2UgaW1wbGVtZW50YXRpb24KZm9yIHByaW1hcnkgYW5kIGJhY2tidWZmZXIgc3VyZmFjZXMuCgpYVmlkTW9kZSBhdHRlbXB0IHRvIHVzZSB0aGUgWEZyZWU4NiBWaWRNb2RlIGV4dGVuc2lvbiB0byBzZXQgdGhlCmRpc3BsYXkgcmVzb2x1dGlvbiB0byBtYXRjaCB0aGUgcGFyYW1ldGVycyB0byBTZXREaXNwbGF5TW9kZS4KCkRHQTIgYXR0ZW1wdCB0byB1c2UgdGhlIFhGcmVlODYgREdBIDIueCBleHRlbnNpb24gdG8gc2V0IHRoZQpkaXNwbGF5IHJlc29sdXRpb24gYW5kIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGZyYW1lYnVmZmVyLCBpZiB0aGUKZnVsbC1zY3JlZW4tZXhjbHVzaXZlIGNvb3BlcmF0aXZlIGxldmVsIGlzIHVzZWQuIElmIG5vdCwgaXQganVzdAp1c2VzIHRoZSBVc2VyIGltcGxlbWVudGF0aW9uLgoKCiogRGlyZWN0RHJhd1N1cmZhY2UgaW5oZXJpdGFuY2UgdHJlZQoKICAgICAgICBNYWluCiAgICAgICAgIHwtLS0tLS0tLS0tLS0tLVwKICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgICAgIERJQiAgICAgICAgRmFrZSBaLUJ1ZmZlcgogICAgICAgICB8CiAgICAgICAgIHwtLS0tLS1cLS0tLS0tLS0tXAogICAgICAgICB8ICAgICAgfCAgICAgICAgIHwKICAgICAgICBVc2VyICAgREdBMiAgIERJQlRleHR1cmUKCk1haW4gcHJvdmlkZXMgYSB2ZXJ5IHNpbXBsZSBiYXNlIGNsYXNzIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGFueSBvZgp0aGUgaW1hZ2UtcmVsYXRlZCBmdW5jdGlvbnMuIFRoZXJlZm9yZSBpdCBkb2VzIG5vdCBwbGFjZSBhbnkKY29uc3RyYWludHMgb24gaG93IHRoZSBzdXJmYWNlIGRhdGEgaXMgc3RvcmVkLgoKRElCIHN0b3JlcyB0aGUgc3VyZmFjZSBkYXRhIGluIGEgRElCIHNlY3Rpb24uIEl0IGlzIHVzZWQgYnkgdGhlIE1haW4KRGlyZWN0RHJhdyBkcml2ZXIgdG8gY3JlYXRlIG9mZi1zY3JlZW4gc3VyZmFjZXMuCgpVc2VyIGltcGxlbWVudHMgcHJpbWFyeSBhbmQgYmFja2J1ZmZlciBzdXJmYWNlcyBmb3IgdGhlIFVzZXIgRGlyZWN0RHJhdwpkcml2ZXIuIElmIGl0IGlzIGEgcHJpbWFyeSBzdXJmYWNlLCBpdCB3aWxsIGF0dGVtcHQgdG8ga2VlcCBpdHNlbGYKc3luY2hyb25pemVkIHRvIHRoZSB3aW5kb3cuCgpER0EyIHN1cmZhY2VzIGNsYWltcyBhbiBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGZyYW1lYnVmZmVyIHNwYWNlIGFuZApsZXRzIERJQiBidWlsZCBpdHMgRElCIHNlY3Rpb24gb24gdG9wIG9mIGl0LgoKRmFrZSBaLUJ1ZmZlciBzdXJmYWNlcyBhcmUgdXNlZCBieSBEaXJlY3QzRCB0byBpbmRpY2F0ZSB0aGF0IGEgcHJpbWFyeQpzdXJmYWNlIGhhcyBhbiBhc3NvY2lhdGVkIHotYnVmZmVyLiBGb3IgYSBmaXJzdCBpbXBsZW1lbnRhdGlvbiwgaXQKZG9lc24ndCBuZWVkIHRvIHN0b3JlIGFueSBpbWFnZSBkYXRhIHNpbmNlIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlci4KCihBY3R1YWxseSAzRCBwcm9ncmFtcyB3aWxsIHJhcmVseSB1c2UgTG9jayBvciBHZXREQyBvbiBwcmltYXJ5CnN1cmZhY2VzLCBiYWNrYnVmZmVycyBvciB6LWJ1ZmZlcnMgc28gd2UgbWF5IHdhbnQgdG8gYXJyYW5nZSBmb3IKbGF6eSBhbGxvY2F0aW9uIG9mIHRoZSBESUIgc2VjdGlvbnMuKQoKCiogSW50ZXJmYWNlIFRodW5rcwoKT25seSB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiBhbiBpbnRlcmZhY2UgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQuCk90aGVyIHZlcnNpb25zIGFyZSBoYW5kbGVkIGJ5IGhhdmluZyB0aHVua3MgY29udmVydCB0aGVpciBwYXJhbWV0ZXJzCmFuZCBjYWxsIHRoZSByb290IHZlcnNpb24uCgpOb3QgYWxsIGludGVyZmFjZSB2ZXJzaW9ucyBoYXZlIHRodW5rcy4gU29tZSB2ZXJzaW9ucyBjb3VsZCBiZSBjb21iaW5lZApiZWNhdXNlIHRoZWlyIHBhcmFtZXRlcnMgd2VyZSBjb21wYXRpYmxlLiBGb3IgZXhhbXBsZSBpZiBhIHN0cnVjdHVyZQpjaGFuZ2VzIGJ1dCB0aGUgc3RydWN0dXJlIGhhcyBhIGR3U2l6ZSBmaWVsZCwgbWV0aG9kcyB1c2luZyB0aGF0IHN0cnVjdHVyZQphcmUgY29tcGF0aWJsZSwgYXMgbG9uZyBhcyB0aGUgaW1wbGVtZW50YXRpb24gcmVtZW1iZXJzIHRvIHRha2UgdGhlIGR3U2l6ZQppbnRvIGFjY291bnQuCgpJbnRlcmZhY2UgdGh1bmtzIGZvciBEaXJlY3QzRCBhcmUgbW9yZSBjb21wbGljYXRlZCBzaW5jZSB0aGUgcGFyYWRpZ20KY2hhbmdlZCBiZXR3ZWVuIHZlcnNpb25zLgoKCiogTG9naWNhbCBPYmplY3QgTGF5b3V0CgpUaGUgb2JqZWN0cyBhcmUgc3BsaXQgaW50byB0aGUgZ2VuZXJpYyBwYXJ0IChlc3NlbnRpYWxseSB0aGUgZmllbGRzIGZvcgpNYWluKSBhbmQgYSBwcml2YXRlIHBhcnQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBvYmplY3RzCmNhbiBiZSBjcmVhdGVkIHdpdGggQ29DcmVhdGVJbnN0YW5jZSwgdGhlbiBJbml0aWFsaXplZCBsYXRlci4gT25seQphdCBpbml0aWFsaXNhdGlvbiB0aW1lIGRvIHdlIGtub3cgd2hpY2ggY2xhc3MgdG8gdXNlLiBFYWNoIGNsYXNzCmV4Y2VwdCBNYWluIGRlY2xhcmVzIGEgUGFydCBzdHJ1Y3R1cmUgYW5kIGFkZHMgdGhhdCB0byBpdHMgSW1wbC4KCkZvciBleGFtcGxlLCB0aGUgRElCVGV4dHVyZSBEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBsb29rcwpsaWtlIHRoaXM6CgpzdHJ1Y3QgRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydAp7CiAgICAgICAgdW5pb24gRElCVGV4dHVyZV9kYXRhIGRhdGE7IC8qZGVjbGFyZWQgaW4gdGhlIHJlYWwgaGVhZGVyKi8KfTsKCnR5cGVkZWYgc3RydWN0CnsKICAgICAgICBzdHJ1Y3QgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IGRpYjsKICAgICAgICBzdHJ1Y3QgRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWJ0ZXh0dXJlOwp9IERJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VJbXBsOwoKU28gdGhlIERJQlRleHR1cmUgc3VyZmFjZSBjbGFzcyBpcyBkZXJpdmVkIGZyb20gdGhlIERJQiBzdXJmYWNlCmNsYXNzIGFuZCBpdCBhZGRzIG9uZSBwaWVjZSBvZiBkYXRhLCBhIHVuaW9uLgoKTWFpbiBkb2VzIG5vdCBoYXZlIGEgUGFydCBzdHJ1Y3R1cmUuIEl0cyBmaWVsZHMgYXJlIHN0b3JlZCBpbgpJRGlyZWN0RHJhd0ltcGwvSURpcmVjdERyYXdTdXJmYWNlSW1wbC4KClRvIGFjY2VzcyBwcml2YXRlIGRhdGEsIG9uZSBzYXlzCgpESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpdiA9IFRoaXMtPnByaXZhdGU7CmRvX3NvbWV0aGluZ193aXRoKHByaXYtPmRpYnRleHR1cmUuZGF0YSk7CgoKKiBDcmVhdGluZyBPYmplY3RzCgpDbGFzc2VzIGhhdmUgdHdvIGZ1bmN0aW9ucyByZWxldmFudCB0byBvYmplY3QgY3JlYXRpb24sIENyZWF0ZSBhbmQKQ29uc3RydWN0LiBUbyBjcmVhdGUgYSBuZXcgb2JqZWN0LCB0aGUgY2xhc3MnIENyZWF0ZSBmdW5jdGlvbiBpcwpjYWxsZWQuIEl0IGFsbG9jYXRlcyBlbm91Z2ggbWVtb3J5IGZvciBJRGlyZWN0RHJhd0ltcGwgb3IKSURpcmVjdERyYXdTdXJmYWNlSW1wbCBhcyB3ZWxsIGFzIHRoZSBwcml2YXRlIGRhdGEgZm9yIGRlcml2ZWQKY2xhc3NlcyBhbmQgdGhlbiBjYWxscyBDb25zdHJ1Y3QuCgpFYWNoIGNsYXNzJ3MgQ29uc3RydWN0IGZ1bmN0aW9uIGNhbGxzIHRoZSBiYXNlIGNsYXNzJ3MgQ29uc3RydWN0LAp0aGVuIGRvZXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KCkZvciBleGFtcGxlLCBjcmVhdGluZyBhIHByaW1hcnkgc3VyZmFjZSB3aXRoIHRoZSB1c2VyIGRkcmF3IGRyaXZlcgpjYWxscyBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZSB3aGljaCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUKb2JqZWN0IGFuZCBjYWxscyBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdCB0byBpbml0aWFsaXplIGl0LgpUaGlzIGNhbGxzIERJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3Qgd2hpY2ggY2FsbHMKTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QuCg==