ClJFQURNRSBmb3IgdGhlIGJ1aWxkcy9hbWlnYSBzdWJkaXJlY3RvcnkuCgpDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMiBieQpXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuCgpUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAphbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCkxJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CmluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CmZ1bGx5LgoKClRoZSBtYWtlZmlsZS5vczQgaXMgZm9yIHRoZSBBbWlnYU9TNCBTREsuICBUbyB1c2UgaXQsIHR5cGUKIm1ha2UgLWYgbWFrZWZpbGUub3M0IiwgaXQgcHJvZHVjZXMgYSBsaW5rIGxpYnJhcnkgbGliZnQyX3BwYy5hLgoKVGhlIG1ha2VmaWxlIGlzIGZvciBwcGMtbW9ycGhvcy1nY2MtMi45NS4zLWJpbi50Z3ogKGdjYyAyLjk1LjMgaG9zdGVkIG9uCjY4ay1BbWlnYSBwcm9kdWNpbmcgTW9ycGhPUy1QUEMtYmluYXJpZXMgZnJvbSBodHRwOi8vd3d3Lm1vcnBob3MuZGUpLgpUbyB1c2UgaXQsIHR5cGUgIm1ha2UgYXNzaWduIiwgdGhlbiAibWFrZSI7IGl0IHByb2R1Y2VzIGEgbGluayBsaWJyYXJ5CmxpYmZ0Ml9wcGMuYS4KClRoZSBzbWFrZWZpbGUgaXMgYSBtYWtlZmlsZSBmb3IgQW1pZ2EgU0FTL0MgNi41OCAobm8gbG9uZ2VyIGF2YWlsYWJsZSwKbGF0ZXN0IHNvbGQgdmVyc2lvbiB3YXMgNi41MCwgdXBkYXRlcyBjYW4gYmUgZm91bmQgaW4gQW1pbmV0KS4gIEl0IGlzCmJhc2VkIG9uIHRoZSB2ZXJzaW9uIGZvdW5kIGluIHRoZSBzb3VyY2Vjb2RlIG9mIHR0Zi5saWJyYXJ5IDAuODNiIGZvcgpGcmVlVHlwZSAxLjMuMSBmcm9tIFJpY2hhcmQgR3JpZmZpdGggKHJhZ3JpZmZpQHNwcnluZXQuY29tLApodHRwOi8vcmFncmlmZmkuaG9tZS5zcHJ5bmV0LmNvbSkuCgpZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIGxhdGVzdCBpbmNsdWRlIGZpbGVzIGFuZCBhbWlnYS5saWIgZnJvbSB0aGUKQW1pZ2Egd2ViIHNpdGUgKGh0dHBzOi8vb3MuYW1pZ2F3b3JsZC5kZS9kb3dubG9hZC5waHA/aWQ9MykgZm9yCkFtaWdhT1MgMy45OyB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIHdvcmsgdW5kZXIgQW1pZ2FPUyAyLjA0IGFuZCB1cC4KClRvIHVzZSBpdCwgY2FsbCAic21ha2UgYXNzaWduIiBhbmQgdGhlbiAic21ha2UiIGZyb20gdGhlIGJ1aWxkcy9hbWlnYQpkaXJlY3RvcnkuICBUaGUgcmVzdWx0cyBhcmU6CgotIEEgbGluayBsaWJyYXJ5ICJmdDJfNjgweDAubGliIiAod2hlcmUgeCBkZXBlbmRzIG9uIHRoZSBzZXR0aW5nIG9mCiAgdGhlIENQVSBlbnRyeSBpbiB0aGUgc21ha2VmaWxlKSBjb250YWluaW5nIGFsbCBGcmVlVHlwZTIgcGFydHMKICBleGNlcHQgb2YgdGhlIGluaXQgY29kZSwgZGVidWdnaW5nIGNvZGUsIGFuZCB0aGUgc3lzdGVtIGludGVyZmFjZQogIGNvZGUuCgotIGZ0c3lzdGVtLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgc3RhbmRhcmQgdmVyc2lvbiBvZiB0aGUKICBzeXN0ZW0gaW50ZXJmYWNlIGNvZGUgd2hpY2ggdXNlcyBmb3BlbigpIGZjbG9zZSgpIGZyZWFkKCkgZnNlZWsoKQogIGZ0ZWxsKCkgbWFsbG9jKCkgcmVhbGxvYygpIGFuZCBmcmVlKCkgZnJvbSBsaWI6c2MubGliIChub3QgcHVyZSkuCgotIGZ0c3lzdGVtcHVyZS5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHB1cmUgdmVyc2lvbiBvZiB0aGUKICBzeXN0ZW0gaW50ZXJmYWNlIGNvZGUgd2hpY2ggdXNlcyBPcGVuKCkgQ2xvc2UoKSBSZWFkKCkgU2VlaygpCiAgRXhhbWluZUZIKCkgQXNtQWxsb2NQb29sZWQoKSBBc21GcmVlUG9vbGVkKCkgZXRjLiAgVGhpcyB2ZXJzaW9uIGNhbgogIGJlIHVzZWQgaW4gYm90aCBub3JtYWwgcHJvZ3JhbXMgYW5kIGluIEFtaWdhIHJ1bi10aW1lIHNoYXJlZCBzeXN0ZW0KICBsaWJyYXJ5cyAoY2FuIGJlIGxpbmtlZCB3aXRoIGxpYjpsaWJpbml0Lm8sIG5vIGNvcHlpbmcgb2YgREFUQSBhbmQKICBCU1MgaHVua3MgZm9yIGVhY2ggT3BlbkxpYnJhcnkoKSBuZWNlc3NhcnkpLiAgU291cmNlIGNvZGUgaXMgaW4KICBzcmMvYmFzZS9mdHN5c3RlbS5jLgoKLSBmdGRlYnVnLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgc3RhbmRhcmQgdmVyc2lvbiBvZiB0aGUKICBkZWJ1Z2dpbmcgY29kZSB3aGljaCB1c2VzIHZwcmludGYoKSBhbmQgZXhpdCgpIChub3QgcHVyZSkuCiAgRGVidWdnaW5nIGNhbiBiZSB0dXJuZWQgb24gaW4gRlQ6aW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAogIGFuZCB3aXRoIEZUX1NldFRyYWNlTGV2ZWwoKS4KCi0gZnRkZWJ1Z3B1cmUubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBwdXJlIHZlcnNpb24gb2YgdGhlCiAgZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyBLVlByaW50ZigpIGZyb20gbGliOmRlYnVnLmxpYiBhbmQgbm8KICBleGl0KCkuICBGb3IgZGVidWdnaW5nIG9mIEFtaWdhIHJ1bi10aW1lIHNoYXJlZCBzeXN0ZW0gbGlicmFyaWVzLgogIFNvdXJjZSBjb2RlIGlzIGluIHNyYy9iYXNlL2Z0ZGVidWcuYy4KCi0gTk8gZnRpbml0Lm8uICBCZWNhdXNlIGxpbmtpbmcgd2l0aCBhIGxpbmsgbGlicmFyeSBzaG91bGQgcmVzdWx0IGluCiAgbGlua2luZyBvbmx5IHRoZSBuZWVkZWQgb2JqZWN0IG1vZHVsZXMgaW4gaXQsIGJ1dCBzdGFuZGFyZAogIGZ0c3lzdGVtLm8gd291bGQgZm9yY2UgQUxMIEZyZWVUeXBlMiBtb2R1bGVzIHRvIGJlIGxpbmtlZCB0byB5b3VyCiAgcHJvZ3JhbSwgSSBkZWNpZGVkIHRvIHVzZSBhIGRpZmZlcmVudCBzY2hlbWU6IFlvdSBtdXN0ICNpbmNsdWRlCiAgRlQ6c3JjL2Jhc2UvZnRpbml0LmMgaW4geW91ciBzb3VyY2Vjb2RlIGFuZCBzcGVjaWZ5IHdpdGggI2RlZmluZQogIHN0YXRlbWVudHMgd2hpY2ggbW9kdWxlcyB5b3UgbmVlZC4gIFNlZQogIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmguCgoKVG8gdXNlIGluIHlvdXIgb3duIHByb2dyYW1zOgoKLSBJbnNlcnQgdGhlICNkZWZpbmUgYW5kICNpbmNsdWRlIHN0YXRlbWVudHMgZnJvbSB0b3Agb2YKICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oIGluIHlvdXIgc291cmNlIGNvZGUgYW5kCiAgdW5jb21tZW50IHRoZSAjZGVmaW5lIHN0YXRlbWVudHMgZm9yIHRoZSBGcmVlVHlwZTIgbW9kdWxlcyB5b3UgbmVlZC4KCi0gWW91IGNhbiB1c2UgZWl0aGVyIFBBUkFNRVRFUlM9UkVHSVNURVIgb3IgUEFSQU1FVEVSUz1TVEFDSyBmb3IKICBjYWxsaW5nIHRoZSBGcmVlVHlwZTIgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZSBsaW5rIGxpYnJhcnkgYW5kIHRoZQogIG9iamVjdCBmaWxlcyBhcmUgY29tcGlsZWQgd2l0aCBQQVJBTUVURVJTPUJPVEguCgotICJzbWFrZSBhc3NpZ24iIChhc3NpZ24gIkZUOiIgdG8gdGhlIEZyZWVUeXBlMiBtYWluIGRpcmVjdG9yeSkuCgotIENvbXBpbGUgeW91ciBwcm9ncmFtLgoKLSBMaW5rIHdpdGggZWl0aGVyIGZ0c3lzdGVtLm8gb3IgZnRzeXN0ZW1wdXJlLm8sIGlmIGRlYnVnZ2luZyBlbmFibGVkCiAgd2l0aCBlaXRoZXIgZnRkZWJ1Zy5vIG9yIChmdGRlYnVncHVyZS5vIGFuZCBsaWI6ZGVidWcubGliKSwgYW5kIHdpdGgKICBmdDJfNjgweDAubGliIGFzIGxpbmsgbGlicmFyeS4KCgpUbyBhZGFwdCB0byBvdGhlciBjb21waWxlcnM6CgotIFRoZSBzdGFuZGFyZCBBTlNJIEMgbWF4aW11bSBsZW5ndGggb2YgMzEgc2lnbmlmaWNhbnQgY2hhcmFjdGVycyBpbgogIGlkZW50aWZpZXJzIGlzIG5vdCBlbm91Z2ggZm9yIEZyZWVUeXBlMi4gIENoZWNrIGlmIHlvdXIgY29tcGlsZXIgaGFzCiAgYSBtaW5pbXVtIGxlbmd0aCBvZiA0MCBzaWduaWZpY2FudCBjaGFyYWN0ZXJzIG9yIGNhbiBiZSBzd2l0Y2hlZCB0bwogIGl0LiAgImlkbGVuPTQwIiBpcyB0aGUgb3B0aW9uIGZvciBTQVMvQy4gIFNldHRpbmcgI2RlZmluZQogIEhBVkVfTElNSVRfT05fSURFTlRTIGluIGFuIGluY2x1ZGUgZmlsZSBtYXkgYWxzbyB3b3JrIChub3QgdGVzdGVkKS4KCi0gTWFrZSBzdXJlIHRoYXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IGluIGJ1aWxkcy9hbWlnYSBpcyBzZWFyY2hlZAogIGJlZm9yZSB0aGUgbm9ybWFsIEZyZWVUeXBlMiBpbmNsdWRlIGRpcmVjdG9yeSwgc28geW91IGFyZSBhYmxlIHRvCiAgcmVwbGFjZSBwcm9ibGVtYXRpYyBpbmNsdWRlIGZpbGVzIHdpdGggeW91ciBvd24gdmVyc2lvbiAoc2FtZSBtYXkgYmUKICB1c2VmdWwgZm9yIHRoZSBzcmMgZGlyZWN0b3J5KS4KCi0gQW4gZXhhbXBsZSBvZiBob3cgdG8gcmVwbGFjZS93b3JrYXJvdW5kIGEgcHJvYmxlbWF0aWMgaW5jbHVkZSBmaWxlCiAgaXMgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDsgaXQgY2hhbmdlcyBhICNkZWZpbmUgdGhhdAogIHdvdWxkIHByZXZlbnQgU0FTL0MgZnJvbSBnZW5lcmF0aW5nIFhERUYncyB3aGVyZSBpdCBzaG91bGQgZG8gdGhhdCBhbmQKICB0aGVuIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBGcmVlVHlwZTIgaW5jbHVkZSBmaWxlLgoKTG9jYWwgVmFyaWFibGVzOgpjb2Rpbmc6IGxhdGluLTEKRW5kOgo=