ClJFQURNRSBmb3IgdGhlIGJ1aWxkcy9hbWlnYSBzdWJkaXJlY3RvcnkuCgpDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5Cldlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKZnVsbHkuCgoKVGhlIG1ha2VmaWxlLm9zNCBpcyBmb3IgdGhlIEFtaWdhT1M0IFNESy4gIFRvIHVzZSBpdCwgdHlwZQoibWFrZSAtZiBtYWtlZmlsZS5vczQiLCBpdCBwcm9kdWNlcyBhIGxpbmsgbGlicmFyeSBsaWJmdDJfcHBjLmEuCgpUaGUgbWFrZWZpbGUgaXMgZm9yIHBwYy1tb3JwaG9zLWdjYy0yLjk1LjMtYmluLnRneiAoZ2NjIDIuOTUuMyBob3N0ZWQgb24KNjhrLUFtaWdhIHByb2R1Y2luZyBNb3JwaE9TLVBQQy1iaW5hcmllcyBmcm9tIGh0dHA6Ly93d3cubW9ycGhvcy5kZSkuClRvIHVzZSBpdCwgdHlwZSAibWFrZSBhc3NpZ24iLCB0aGVuICJtYWtlIjsgaXQgcHJvZHVjZXMgYSBsaW5rIGxpYnJhcnkKbGliZnQyX3BwYy5hLgoKVGhlIHNtYWtlZmlsZSBpcyBhIG1ha2VmaWxlIGZvciBBbWlnYSBTQVMvQyA2LjU4IChubyBsb25nZXIgYXZhaWxhYmxlLApsYXRlc3Qgc29sZCB2ZXJzaW9uIHdhcyA2LjUwLCB1cGRhdGVzIGNhbiBiZSBmb3VuZCBpbiBBbWluZXQpLiAgSXQgaXMKYmFzZWQgb24gdGhlIHZlcnNpb24gZm91bmQgaW4gdGhlIHNvdXJjZWNvZGUgb2YgdHRmLmxpYnJhcnkgMC44M2IgZm9yCkZyZWVUeXBlIDEuMy4xIGZyb20gUmljaGFyZCBHcmlmZml0aCAocmFncmlmZmlAc3ByeW5ldC5jb20sCmh0dHA6Ly9yYWdyaWZmaS5ob21lLnNwcnluZXQuY29tKS4KCllvdSB3aWxsIGFsc28gbmVlZCB0aGUgbGF0ZXN0IGluY2x1ZGUgZmlsZXMgYW5kIGFtaWdhLmxpYiBmcm9tIHRoZQpBbWlnYSB3ZWIgc2l0ZSAoaHR0cDovL3d3dy5hbWlnYS5jb20vMy45L2Rvd25sb2FkL05ESzMuOS5saGEpIGZvcgpBbWlnYU9TIDMuOTsgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB3b3JrIHVuZGVyIEFtaWdhT1MgMi4wNCBhbmQgdXAuCgpUbyB1c2UgaXQsIGNhbGwgInNtYWtlIGFzc2lnbiIgYW5kIHRoZW4gInNtYWtlIiBmcm9tIHRoZSBidWlsZHMvYW1pZ2EKZGlyZWN0b3J5LiAgVGhlIHJlc3VsdHMgYXJlOgoKLSBBIGxpbmsgbGlicmFyeSAiZnQyXzY4MHgwLmxpYiIgKHdoZXJlIHggZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBvZgogIHRoZSBDUFUgZW50cnkgaW4gdGhlIHNtYWtlZmlsZSkgY29udGFpbmluZyBhbGwgRnJlZVR5cGUyIHBhcnRzCiAgZXhjZXB0IG9mIHRoZSBpbml0IGNvZGUsIGRlYnVnZ2luZyBjb2RlLCBhbmQgdGhlIHN5c3RlbSBpbnRlcmZhY2UKICBjb2RlLgoKLSBmdHN5c3RlbS5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgdGhlCiAgc3lzdGVtIGludGVyZmFjZSBjb2RlIHdoaWNoIHVzZXMgZm9wZW4oKSBmY2xvc2UoKSBmcmVhZCgpIGZzZWVrKCkKICBmdGVsbCgpIG1hbGxvYygpIHJlYWxsb2MoKSBhbmQgZnJlZSgpIGZyb20gbGliOnNjLmxpYiAobm90IHB1cmUpLgoKLSBmdHN5c3RlbXB1cmUubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBwdXJlIHZlcnNpb24gb2YgdGhlCiAgc3lzdGVtIGludGVyZmFjZSBjb2RlIHdoaWNoIHVzZXMgT3BlbigpIENsb3NlKCkgUmVhZCgpIFNlZWsoKQogIEV4YW1pbmVGSCgpIEFzbUFsbG9jUG9vbGVkKCkgQXNtRnJlZVBvb2xlZCgpIGV0Yy4gIFRoaXMgdmVyc2lvbiBjYW4KICBiZSB1c2VkIGluIGJvdGggbm9ybWFsIHByb2dyYW1zIGFuZCBpbiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtCiAgbGlicmFyeXMgKGNhbiBiZSBsaW5rZWQgd2l0aCBsaWI6bGliaW5pdC5vLCBubyBjb3B5aW5nIG9mIERBVEEgYW5kCiAgQlNTIGh1bmtzIGZvciBlYWNoIE9wZW5MaWJyYXJ5KCkgbmVjZXNzYXJ5KS4gIFNvdXJjZSBjb2RlIGlzIGluCiAgc3JjL2Jhc2UvZnRzeXN0ZW0uYy4KCi0gZnRkZWJ1Zy5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgdGhlCiAgZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyB2cHJpbnRmKCkgYW5kIGV4aXQoKSAobm90IHB1cmUpLgogIERlYnVnZ2luZyBjYW4gYmUgdHVybmVkIG9uIGluIEZUOmluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKICBhbmQgd2l0aCBGVF9TZXRUcmFjZUxldmVsKCkuCgotIGZ0ZGVidWdwdXJlLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgcHVyZSB2ZXJzaW9uIG9mIHRoZQogIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgS1ZQcmludGYoKSBmcm9tIGxpYjpkZWJ1Zy5saWIgYW5kIG5vCiAgZXhpdCgpLiAgRm9yIGRlYnVnZ2luZyBvZiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtIGxpYnJhcmllcy4KICBTb3VyY2UgY29kZSBpcyBpbiBzcmMvYmFzZS9mdGRlYnVnLmMuCgotIE5PIGZ0aW5pdC5vLiAgQmVjYXVzZSBsaW5raW5nIHdpdGggYSBsaW5rIGxpYnJhcnkgc2hvdWxkIHJlc3VsdCBpbgogIGxpbmtpbmcgb25seSB0aGUgbmVlZGVkIG9iamVjdCBtb2R1bGVzIGluIGl0LCBidXQgc3RhbmRhcmQKICBmdHN5c3RlbS5vIHdvdWxkIGZvcmNlIEFMTCBGcmVlVHlwZTIgbW9kdWxlcyB0byBiZSBsaW5rZWQgdG8geW91cgogIHByb2dyYW0sIEkgZGVjaWRlZCB0byB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lOiBZb3UgbXVzdCAjaW5jbHVkZQogIEZUOnNyYy9iYXNlL2Z0aW5pdC5jIGluIHlvdXIgc291cmNlY29kZSBhbmQgc3BlY2lmeSB3aXRoICNkZWZpbmUKICBzdGF0ZW1lbnRzIHdoaWNoIG1vZHVsZXMgeW91IG5lZWQuICBTZWUKICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oLgoKClRvIHVzZSBpbiB5b3VyIG93biBwcm9ncmFtczoKCi0gSW5zZXJ0IHRoZSAjZGVmaW5lIGFuZCAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZyb20gdG9wIG9mCiAgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCBpbiB5b3VyIHNvdXJjZSBjb2RlIGFuZAogIHVuY29tbWVudCB0aGUgI2RlZmluZSBzdGF0ZW1lbnRzIGZvciB0aGUgRnJlZVR5cGUyIG1vZHVsZXMgeW91IG5lZWQuCgotIFlvdSBjYW4gdXNlIGVpdGhlciBQQVJBTUVURVJTPVJFR0lTVEVSIG9yIFBBUkFNRVRFUlM9U1RBQ0sgZm9yCiAgY2FsbGluZyB0aGUgRnJlZVR5cGUyIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGUgbGluayBsaWJyYXJ5IGFuZCB0aGUKICBvYmplY3QgZmlsZXMgYXJlIGNvbXBpbGVkIHdpdGggUEFSQU1FVEVSUz1CT1RILgoKLSAic21ha2UgYXNzaWduIiAoYXNzaWduICJGVDoiIHRvIHRoZSBGcmVlVHlwZTIgbWFpbiBkaXJlY3RvcnkpLgoKLSBDb21waWxlIHlvdXIgcHJvZ3JhbS4KCi0gTGluayB3aXRoIGVpdGhlciBmdHN5c3RlbS5vIG9yIGZ0c3lzdGVtcHVyZS5vLCBpZiBkZWJ1Z2dpbmcgZW5hYmxlZAogIHdpdGggZWl0aGVyIGZ0ZGVidWcubyBvciAoZnRkZWJ1Z3B1cmUubyBhbmQgbGliOmRlYnVnLmxpYiksIGFuZCB3aXRoCiAgZnQyXzY4MHgwLmxpYiBhcyBsaW5rIGxpYnJhcnkuCgoKVG8gYWRhcHQgdG8gb3RoZXIgY29tcGlsZXJzOgoKLSBUaGUgc3RhbmRhcmQgQU5TSSBDIG1heGltdW0gbGVuZ3RoIG9mIDMxIHNpZ25pZmljYW50IGNoYXJhY3RlcnMgaW4KICBpZGVudGlmaWVycyBpcyBub3QgZW5vdWdoIGZvciBGcmVlVHlwZTIuICBDaGVjayBpZiB5b3VyIGNvbXBpbGVyIGhhcwogIGEgbWluaW11bSBsZW5ndGggb2YgNDAgc2lnbmlmaWNhbnQgY2hhcmFjdGVycyBvciBjYW4gYmUgc3dpdGNoZWQgdG8KICBpdC4gICJpZGxlbj00MCIgaXMgdGhlIG9wdGlvbiBmb3IgU0FTL0MuICBTZXR0aW5nICNkZWZpbmUKICBIQVZFX0xJTUlUX09OX0lERU5UUyBpbiBhbiBpbmNsdWRlIGZpbGUgbWF5IGFsc28gd29yayAobm90IHRlc3RlZCkuCgotIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBpbiBidWlsZHMvYW1pZ2EgaXMgc2VhcmNoZWQKICBiZWZvcmUgdGhlIG5vcm1hbCBGcmVlVHlwZTIgaW5jbHVkZSBkaXJlY3RvcnksIHNvIHlvdSBhcmUgYWJsZSB0bwogIHJlcGxhY2UgcHJvYmxlbWF0aWMgaW5jbHVkZSBmaWxlcyB3aXRoIHlvdXIgb3duIHZlcnNpb24gKHNhbWUgbWF5IGJlCiAgdXNlZnVsIGZvciB0aGUgc3JjIGRpcmVjdG9yeSkuCgotIEFuIGV4YW1wbGUgb2YgaG93IHRvIHJlcGxhY2Uvd29ya2Fyb3VuZCBhIHByb2JsZW1hdGljIGluY2x1ZGUgZmlsZQogIGlzIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg7IGl0IGNoYW5nZXMgYSAjZGVmaW5lIHRoYXQKICB3b3VsZCBwcmV2ZW50IFNBUy9DIGZyb20gZ2VuZXJhdGluZyBYREVGJ3Mgd2hlcmUgaXQgc2hvdWxkIGRvIHRoYXQgYW5kCiAgdGhlbiBpbmNsdWRlcyB0aGUgc3RhbmRhcmQgRnJlZVR5cGUyIGluY2x1ZGUgZmlsZS4KCkxvY2FsIFZhcmlhYmxlczoKY29kaW5nOiBsYXRpbi0xCkVuZDoK