Tm90ZXMgb24gdGhlIFRISU5LIEMgdmVyc2lvbiBvZiBGbGV4IDIuNC42ClNjb3R0IEhvZm1hbm4gMjMtSlVMLTk0CkludGVybmV0OiBzY290dGhAdmlzaXguY29tCgpUaGUgb25seSBjaGFuZ2VzIG5lZWRlZCB0byBjb21waWxlIEZsZXggMi40LjYgdW5kZXIgU3ltYW50ZWMgQysrIDYuMCB3YXMKdG8gI2luY2x1ZGUgPGNvbnNvbGUuaD4gaW4gbWFpbi5jIGFuZCBjYWxsIGNjb21tYW5kKCkganVzdCBiZWZvcmUgZmxleGluaXQoKQppbiBtYWluKCkuIFRoZSBub3RlcyBiZWxvdyBhcmUgbW9zdGx5IG9mIGhpc3RvcmljYWwgc2lnbmlmaWNhbmNlIG9ubHk7IG1vc3QKb2YgdGhlIHdvcmthcm91bmRzIGJlbG93IHdlcmUgdG8gZ2V0IGFyb3VuZCByZXN0cmljdGlvbnMvcHJvYmxlbXMgaW4gZWFybGllcgp2ZXJzaW9ucyBvZiBUSElOSyBDLiBUaGUgb25seSBzZWN0aW9uIHdoaWNoIHN0aWxsIGFwcGxpZXMgaXMgUnVzc2VsbCBGaW5uJ3MgCmRlc2NyaXB0aW9uIG9mIGhvdyB0byBtYWtlIEZsZXggZ2VuZXJhdGUgb3V0cHV0IG9mIHR5cGUgJ0tBSEwnLiBBbHNvLCA0LWJ5dGUKaW50cyBtdXN0IGJlIHVzZWQgYnkgYW55IHByb2plY3Qgd2hpY2ggdXNlcyBGbGV4IG91dHB1dC4KCklmIHlvdSB3YW50IHRvIHJlY3JlYXRlIHRoZSBwcm9qZWN0LCB5b3UnbGwgbmVlZCB0byBhZGQgdGhlIGZpbGVzIAphbGxvY2EuYyBhbmQgeG1hbGxvYy5jIGluIHRoaXMgZGlyZWN0b3J5LiBCb3RoIGZpbGVzIGFyZSBjb3B5bGVmdGVkOyBzZWUKdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBkZXRhaWxzLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVjb21waWxlCmJvdGggdGhlIEFOU0kgYW5kIHVuaXggbGlicmFyaWVzIHRvIHVzZSA0IGJ5dGUgaW50cywgYW5kIGlmIHlvdSB3YW50IHRoZQpmaWxlcyB0aGF0IGZsZXggY3JlYXRlcyB0byBoYXZlICdLQUhMJyBhcyB0aGUgY3JlYXRvciB5b3UnbGwgbmVlZCB0byBhcHBseQpSdXNzZWxsIEZpbm4ncyBwYXRjaC4KCk5vdGVzIG9uIHRoZSBUSElOSyBDIHZlcnNpb24gb2YgRmxleCAyLjMuNwpKb25hcyBCYXJrbHVuZCwgMjUtSkFOLTkyCkludGVybmV0OiBqb25hc0Bjc2QudXUuc2UKCkkgaGF2ZSBtZXJnZWQgdGhlIHNvdXJjZXMgZm9yIEZsZXggdmVyc2lvbiAyLjMuNyB3aXRoIHRoZSBvbGRlciB2ZXJzaW9uCndoaWNoIHdhcyBoYWNrZWQgZm9yIFRISU5LIEMgdmVyc2lvbiA0LiBJIGhhdmUgY29uZGl0aW9uYWxpemVkIHRoZSBjb2RlCnNvIHRoYXQgSSB0aGluayBpdCBzaG91bGQgd29yayB3aXRoIGJvdGggVEhJTksgQyB2ZXJzaW9uIDQgYW5kIDUgKGZvcgp0aG9zZSBvZiB5b3Ugd2hvIGRvbid0IGtub3c6IHRoZSBUSElOS19DIHN5bWJvbCBpcyBkZWZpbmVkIGFzIDEgaW4gdmVyc2lvbgo0IGFuZCBhcyA1IGluIHZlcnNpb24gNSkuIEkgaGF2ZSBwdXQgaW4gc29tZSBtaXNzaW5nIHByb3RvdHlwZXMsIHNvIGl0CmNvbXBpbGVzIGFsc28gd2l0aCAicmVxdWlyZSBwcm90b3R5cGVzIiBvbi4KCk1vc3Qgb2YgdGhlIG5vdGVzIGJlbG93IHN0aWxsIGFwcGx5LCBpbiBwYXJ0aWN1bGFyIHRoYXQgYWJvdXQgdGhlIE1ha2VSZXMKcHJvZ3JhbS4KCgpOb3RlcyBvbiB0aGUgVEhJTksgQyB2ZXJzaW9uIG9mIEZsZXgKUnVzc2VsbCBTLiBGaW5uLCAxOS1GRUItOTAKSW50ZXJuZXQ6IHJzZmlubkBhdGhlbmEubWl0LmVkdSwgcnNmaW5uQG5ldXRyb24ubGNzLm1pdC5lZHUKQ29tcHVTZXJ2ZTogNzYzNzcsMTEwNwpHRW5pZTogUlNGSU5OCgpGbGV4IGFwcGVhcnMgdG8gYmUgY292ZXJlZCBieSBhIGNvcHlyaWdodCBub3RpY2UgZnJvbSB0aGUgVW5pdmVyc2l0eSBvZgpDYWxpZm9ybmlhLCBzaW1pbGFyIHRvIHRoZSBvbmUgY292ZXJpbmcgQmVya2VsZXkgVW5peDsgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgcGljdHVyZSBoZXJlLiAgU28gaGVyZSBpcyBhIHZlcnNpb24KY3JlYXRlZCB3aXRoIFRISU5LIEMgNC4wLCBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgY29kZTsgYXMgd2l0aCB0aGUKQmlzb24gZGlzdHJpYnV0aW9uLCBJIGFtIGluY2x1ZGluZyAqYWxsKiBvZiB0aGUgc291cmNlIGNvZGUgSSByZWNlaXZlZAp3aXRoIHRoZSBwYWNrYWdlLgoKVGhlIGN1cnJlbnQgdmVyc2lvbiAobW9kaWZpY2F0aW9uIGRhdGUgSmFudWFyeSAyNSwgMTk5MCkgaGFzIG9ubHkgdGhlCmJhcmUtYm9uZXMgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBUSElOSyBDIGxpYnJhcnkgcm91dGluZSAiY2NvbW1hbmQiLAp3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gdHlwZSBhIGNvbW1hbmQgbGluZSBhbmQgdG8gcmVkaXJlY3QgdGhlIG91dHB1dC4KUGVyaGFwcyBzb21lZGF5IEkgbWF5IHRyeSB0byBpbXBsZW1lbnQgYSAicmVhbCIgdXNlciBpbnRlcmZhY2U7IHBlcmhhcHMKbm90LgoKVGhlIG9ubHkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBzb3VyY2UgZmlsZSBhcmUgc3Vycm91bmRlZCBieSAiI2lmZGVmClRISU5LX0MiLi4uIiNlbmRpZiI7IGluIHRoZW9yeSwgdGhlbiwgdGhlc2Ugc291cmNlcyBjb3VsZCBiZSByZWNvbXBpbGVkCm9uIGFub3RoZXIgc3lzdGVtIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIGFyZSB0aGUgYWN0dWFsIGZpbGVzIG1vZGlmaWVkOgphbGxvY2EuYywgZGZhLmMsIGZsZXhkZWYuaCwgbWFpbi5jLCBtaXNjLmMsIHNjYW4uYywgc3ltLmMuICBNb3N0IG9mIHRoZXNlCmNoYW5nZXMgd2VyZSBtaW5vciwgYW5kIG1hbnkgb2YgdGhlbSB3b3VsZCBoYXZlIGJlZW4gdW5uZWNlc3NhcnkgaWYgdGhlCm9yaWdpbmFsIEZsZXggc291cmNlIGNvZGUgaGFkIGJlZW4gd3JpdHRlbiBmb3IgYW4gQU5TSS1jb21wbGlhbnQgQyBjb21waWxlci4KSW4gYWRkaXRpb24sIHRoZSBmaWxlICJtYWN1dGlscy5jIiBpcyBjb21wbGV0ZWx5IG5ldzsgc2VlIHRoZSBkaXNjdXNzaW9uCm9mICJNYWtlUmVzIiBiZWxvdy4KClRISU5LIEMgdXNlcnMgbWF5IGZpbmQgaXQgY29udmVuaWVudCB0byBoYXZlIHRoZSBvdXRwdXQgdGV4dCBmaWxlcyB3cml0dGVuCmJ5IEZsZXggYmUgVEhJTksgQyBkb2N1bWVudHMuICBUbyBkbyB0aGlzLCBjcmVhdGUgYSBjb3B5IG9mIHRoZSAiQU5TSSIKcHJvamVjdCBjYWxsZWQgIkFOU0ktS0FITCIsIGFuZCBhIGNvcHkgb2YgdGhlIGZpbGUgImZvcGVuLmMiIGNhbGxlZAoiZm9wZW4tS0FITC5jIi4gIEluIHRoZSBjb3B5LCBmaW5kIHRoZSByb3V0aW5lICJzZXRmaWxldHlwZSIsIGFuZCByZXBsYWNlCnRoZSBsaW5lczoKCWlmICghKG9mbGFnICYgRl9CSU5BUlkpKQoJCXBiLmlvRmxGbmRySW5mby5mZFR5cGUgPSAnVEVYVCc7CndpdGggdGhlIGxpbmVzOgoJaWYgKCEob2ZsYWcgJiBGX0JJTkFSWSkpIHsKCQlwYi5pb0ZsRm5kckluZm8uZmRUeXBlID0gJ1RFWFQnOwoJCXBiLmlvRmxGbmRySW5mby5mZENyZWF0b3IgPSAnS0FITCc7CgkJfQpSZXBsYWNlICJmb3Blbi5jIiB3aXRoIHRoZSBuZXcgImZvcGVuLUtBSEwuYyIsIHJlYnVpbGQgdGhlIG5ldyBwcm9qZWN0CiJBTlNJLUtBSEwiLCBhbmQgdXNlIHRoaXMgcHJvamVjdCBpbiB0aGUgcHJvamVjdCBmaWxlICJGbGV4LrkiCmluc3RlYWQgb2YgdGhlICJBTlNJIiBwcm9qZWN0LgoKKiogVGhlICJNYWtlUmVzIiBwcm9ncmFtCgpUaGUgb3V0cHV0IGZpbGVzIGNyZWF0ZWQgYnkgRmxleCBjb250YWluIGxhcmdlIGFtb3VudHMgb2YgcHJlaW5pdGlhbGl6ZWQKc3RhdGljIGRhdGE7IHRoZSBmaWxlICJzY2FuLmMiIGNvbnRhaW5lZCBpbiB0aGUgRmxleC65IHByb2plY3QgaXMgb25lCnN1Y2ggZmlsZS4gIEhvd2V2ZXIsIHRoZSBNYWNpbnRvc2ggYXJjaGl0ZWN0dXJlIGxpbWl0cyBub3JtYWwgYXBwbGljYXRpb25zCnRvIDMySyBvZiBnbG9iYWwgZGF0YS4gIEluIG1hbnkgY2FzZXMgKGluY2x1ZGluZyBGbGV4KSwgdGhpcyBsaW1pdCBjYW4KYmUgc3VycGFzc2VkIGJ5IHRoZSBzdGF0aWMgZGF0YSBnZW5lcmF0ZWQgYnkgRmxleC4KClRoZSBzb2x1dGlvbiBJIGhhdmUgaW1wbGVtZW50ZWQgZm9yIHRoZSBUSElOSyBDIHZlcnNpb24gb2YgRmxleCBpcyB0bwpleHRyYWN0IHRoZSBkYXRhIHRhYmxlcyBmcm9tIHRoZSBGbGV4IG91dHB1dCBmaWxlLCBhbmQgcGFzdGUgdGhlbSBpbnRvCnRoZSBmaWxlICJNYWtlUmVzLmMiLiAgVGhlbiwgYnkgcmVjb21waWxpbmcgYW5kIHJ1bm5pbmcgdGhlIHByb2dyYW0gaW4KdGhlICJNYWtlUmVzLrkiIHByb2plY3QgKGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGFuIGFwcGxpY2F0aW9uKSwKYSByZXNvdXJjZSBmaWxlIGNhbGxlZCAiRmxleC65LnJzcmMiIGlzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgpUaGUgRmxleCBvdXRwdXQgZmlsZSAic2Nhbi5jIiBoYXMgYmVlbiBtb2RpZmllZCB0byBsb2FkIHRoZSBzdGF0aWMgZGF0YQpmcm9tIHRoZSByZXNvdXJjZSBmb3JrIG9mIHRoZSBGbGV4IGFwcGxpY2F0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcKdGhlICJsb2FkX3RhYmxlIiBmdW5jdGlvbiwgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgZmlsZSAibWFjdXRpbHMuYyIuCgpJbiB0aGUgYXBwbGljYXRpb24gZm9yIHdoaWNoIEkgbmVlZGVkIEZsZXgsIHRoZSBkYXRhIHRhYmxlcyB3ZXJlIHNtYWxsCmVub3VnaCB0aGF0IEkgZGlkbid0IG5lZWQgdG8gZG8gdGhpcy4gIEhvd2V2ZXIsIGlmIHlvdXIgYXBwbGljYXRpb24KcmVxdWlyZXMgeW91IHRvIGRvIHRoaXMsIHNpbXBseSBmb2xsb3cgdGhlIG1vZGVsIG9mICJzY2FuLmMiOyB0aGUgTWFrZVJlcwpwcm9qZWN0IGFuZCBzb3VyY2UgY29kZSBoYXMgYmVlbiBpbmNsdWRlZCBmb3IgeW91ciB1c2UuCgo=