CkluIHRoaXMgZG9jdW1lbnQgeW91IHdpbGwgZmluZCBpbmZvcm1hdGlvbiBhYm91dDoKLSBob3cgdG8gYnVpbGQgZXh0ZXJuYWwgbW9kdWxlcwotIGhvdyB0byBtYWtlIHlvdXIgbW9kdWxlIHVzZSBrYnVpbGQgaW5mcmFzdHJ1Y3R1cmUKLSBob3cga2J1aWxkIHdpbGwgaW5zdGFsbCBhIGtlcm5lbAotIGhvdyB0byBpbnN0YWxsIG1vZHVsZXMgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24KCj09PSBUYWJsZSBvZiBDb250ZW50cwoKCT09PSAxIEludHJvZHVjdGlvbgoJPT09IDIgSG93IHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKCSAgIC0tLSAyLjEgQnVpbGRpbmcgZXh0ZXJuYWwgbW9kdWxlcwoJICAgLS0tIDIuMiBBdmFpbGFibGUgdGFyZ2V0cwoJICAgLS0tIDIuMyBBdmFpbGFibGUgb3B0aW9ucwoJICAgLS0tIDIuNCBQcmVwYXJpbmcgdGhlIGtlcm5lbCB0cmVlIGZvciBtb2R1bGUgYnVpbGQKCT09PSAzLiBFeGFtcGxlIGNvbW1hbmRzCgk9PT0gNC4gQ3JlYXRpbmcgYSBrYnVpbGQgZmlsZSBmb3IgYW4gZXh0ZXJuYWwgbW9kdWxlCgk9PT0gNS4gSW5jbHVkZSBmaWxlcwoJICAgLS0tIDUuMSBIb3cgdG8gaW5jbHVkZSBmaWxlcyBmcm9tIHRoZSBrZXJuZWwgaW5jbHVkZSBkaXIKCSAgIC0tLSA1LjIgRXh0ZXJuYWwgbW9kdWxlcyB1c2luZyBhbiBpbmNsdWRlLyBkaXIKCSAgIC0tLSA1LjMgRXh0ZXJuYWwgbW9kdWxlcyB1c2luZyBzZXZlcmFsIGRpcmVjdG9yaWVzCgk9PT0gNi4gTW9kdWxlIGluc3RhbGxhdGlvbgoJICAgLS0tIDYuMSBJTlNUQUxMX01PRF9QQVRICgkgICAtLS0gNi4yIElOU1RBTExfTU9EX0RJUgoJPT09IDcuIE1vZHVsZSB2ZXJzaW9uaW5nCgk9PT0gOC4gVGlwcyAmIFRyaWNrcwoJICAgLS0tIDguMSBUZXN0aW5nIGZvciBDT05GSUdfRk9PX0JBUgoKCgo9PT0gMS4gSW50cm9kdWN0aW9uCgprYnVpbGQgaW5jbHVkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGRpbmcgbW9kdWxlcyBib3RoCndpdGhpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGFuZCBvdXRzaWRlIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuClRoZSBsYXR0ZXIgaXMgdXN1YWxseSByZWZlcnJlZCB0byBhcyBleHRlcm5hbCBtb2R1bGVzIGFuZCBpcyB1c2VkCmJvdGggZHVyaW5nIGRldmVsb3BtZW50IGFuZCBmb3IgbW9kdWxlcyB0aGF0IGFyZSBub3QgcGxhbm5lZCB0byBiZQppbmNsdWRlZCBpbiB0aGUga2VybmVsIHRyZWUuCgpXaGF0IGlzIGNvdmVyZWQgd2l0aGluIHRoaXMgZmlsZSBpcyBtYWlubHkgaW5mb3JtYXRpb24gdG8gYXV0aG9ycwpvZiBtb2R1bGVzLiBUaGUgYXV0aG9yIG9mIGFuIGV4dGVybmFsIG1vZHVsZXMgc2hvdWxkIHN1cHBseQphIG1ha2VmaWxlIHRoYXQgaGlkZXMgbW9zdCBvZiB0aGUgY29tcGxleGl0eSBzbyBvbmUgb25seSBoYXMgdG8gdHlwZQonbWFrZScgdG8gYnVpbGQgdGhlIG1vZHVsZS4gQSBjb21wbGV0ZSBleGFtcGxlIHdpbGwgYmUgcHJlc2VudCBpbgpjaGFwdGVyIKQuIENyZWF0aW5nIGEga2J1aWxkIGZpbGUgZm9yIGFuIGV4dGVybmFsIG1vZHVsZSIuCgoKPT09IDIuIEhvdyB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzCgprYnVpbGQgb2ZmZXJzIGZ1bmN0aW9uYWxpdHkgdG8gYnVpbGQgZXh0ZXJuYWwgbW9kdWxlcywgd2l0aCB0aGUKcHJlcmVxdWlzaXRlIHRoYXQgdGhlcmUgaXMgYSBwcmUtYnVpbHQga2VybmVsIGF2YWlsYWJsZSB3aXRoIGZ1bGwgc291cmNlLgpBIHN1YnNldCBvZiB0aGUgdGFyZ2V0cyBhdmFpbGFibGUgd2hlbiBidWlsZGluZyB0aGUga2VybmVsIGlzIGF2YWlsYWJsZQp3aGVuIGJ1aWxkaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4KCi0tLSAyLjEgQnVpbGRpbmcgZXh0ZXJuYWwgbW9kdWxlcwoKCVVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gYnVpbGQgYW4gZXh0ZXJuYWwgbW9kdWxlOgoKCQltYWtlIC1DIDxwYXRoLXRvLWtlcm5lbD4gTT1gcHdkYAoKCUZvciB0aGUgcnVubmluZyBrZXJuZWwgdXNlOgoJCW1ha2UgLUMgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAvYnVpbGQgTT1gcHdkYAoKCUZvciB0aGUgYWJvdmUgY29tbWFuZCB0byBzdWNjZWVkIHRoZSBrZXJuZWwgbXVzdCBoYXZlIGJlZW4gYnVpbHQgd2l0aAoJbW9kdWxlcyBlbmFibGVkLgoKCVRvIGluc3RhbGwgdGhlIG1vZHVsZXMgdGhhdCB3ZXJlIGp1c3QgYnVpbHQ6CgoJCW1ha2UgLUMgPHBhdGgtdG8ta2VybmVsPiBNPWBwd2RgIG1vZHVsZXNfaW5zdGFsbAoKCU1vcmUgY29tcGxleCBleGFtcGxlcyBsYXRlciwgdGhlIGFib3ZlIHNob3VsZCBnZXQgeW91IGdvaW5nLgoKLS0tIDIuMiBBdmFpbGFibGUgdGFyZ2V0cwoKCSRLRElSIHJlZmVycyB0byB0aGUgcGF0aCB0byB0aGUga2VybmVsIHNvdXJjZSB0b3AtbGV2ZWwgZGlyZWN0b3J5CgoJbWFrZSAtQyAkS0RJUiBNPWBwd2RgCgkJV2lsbCBidWlsZCB0aGUgbW9kdWxlKHMpIGxvY2F0ZWQgaW4gY3VycmVudCBkaXJlY3RvcnkuCgkJQWxsIG91dHB1dCBmaWxlcyB3aWxsIGJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CgkJYXMgdGhlIG1vZHVsZSBzb3VyY2UuCgkJTm8gYXR0ZW1wdHMgYXJlIG1hZGUgdG8gdXBkYXRlIHRoZSBrZXJuZWwgc291cmNlLCBhbmQgaXQgaXMKCQlhIHByZWNvbmRpdGlvbiB0aGF0IGEgc3VjY2Vzc2Z1bCBtYWtlIGhhcyBiZWVuIGV4ZWN1dGVkCgkJZm9yIHRoZSBrZXJuZWwuCgoJbWFrZSAtQyAkS0RJUiBNPWBwd2RgIG1vZHVsZXMKCQlUaGUgbW9kdWxlcyB0YXJnZXQgaXMgaW1wbGllZCB3aGVuIG5vIHRhcmdldCBpcyBnaXZlbi4KCQlTYW1lIGZ1bmN0aW9uYWxpdHkgYXMgaWYgbm8gdGFyZ2V0IHdhcyBzcGVjaWZpZWQuCgkJU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgoKCW1ha2UgLUMgJEtESVIgTT0kUFdEIG1vZHVsZXNfaW5zdGFsbAoJCUluc3RhbGwgdGhlIGV4dGVybmFsIG1vZHVsZShzKS4KCQlJbnN0YWxsYXRpb24gZGVmYXVsdCBpcyBpbiAvbGliL21vZHVsZXMvPGtlcm5lbC12ZXJzaW9uPi9leHRyYSwKCQlidXQgbWF5IGJlIHByZWZpeGVkIHdpdGggSU5TVEFMTF9NT0RfUEFUSCAtIHNlZSBzZXBhcmF0ZSBjaGFwdGVyLgoKCW1ha2UgLUMgJEtESVIgTT0kUFdEIGNsZWFuCgkJUmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMgZm9yIHRoZSBtb2R1bGUgLSB0aGUga2VybmVsCgkJc291cmNlIGRpcmVjdG9yeSBpcyBub3QgbW9kaWZpZWQuCgoJbWFrZSAtQyAkS0RJUiBNPWBwd2RgIGhlbHAKCQloZWxwIHdpbGwgbGlzdCB0aGUgYXZhaWxhYmxlIHRhcmdldCB3aGVuIGJ1aWxkaW5nIGV4dGVybmFsCgkJbW9kdWxlcy4KCi0tLSAyLjMgQXZhaWxhYmxlIG9wdGlvbnM6CgoJJEtESVIgcmVmZXJzIHRvIHRoZSBwYXRoIHRvIHRoZSBrZXJuZWwgc291cmNlIHRvcC1sZXZlbCBkaXJlY3RvcnkKCgltYWtlIC1DICRLRElSCgkJVXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdGhlIGtlcm5lbCBzb3VyY2UuCgkJJyRLRElSJyByZXByZXNlbnQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUga2VybmVsIHNvdXJjZSBpcy4KCQlNYWtlIHdpbGwgYWN0dWFsbHkgY2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQoJCXdoZW4gZXhlY3V0ZWQgYnV0IGNoYW5nZSBiYWNrIHdoZW4gZmluaXNoZWQuCgoJbWFrZSAtQyAkS0RJUiBNPWBwd2RgCgkJTT0gaXMgdXNlZCB0byB0ZWxsIGtidWlsZCB0aGF0IGFuIGV4dGVybmFsIG1vZHVsZSBpcwoJCWJlaW5nIGJ1aWx0LgoJCVRoZSBvcHRpb24gZ2l2ZW4gdG8gTT0gaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZXh0ZXJuYWwKCQltb2R1bGUgKGtidWlsZCBmaWxlKSBpcyBsb2NhdGVkLgoJCVdoZW4gYW4gZXh0ZXJuYWwgbW9kdWxlIGlzIGJlaW5nIGJ1aWx0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCgkJdXN1YWwgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlLgoKCW1ha2UgLUMgJEtESVIgU1VCRElSUz1gcHdkYAoJCVNhbWUgYXMgTT0uIFRoZSBTVUJESVJTPSBzeW50YXggaXMga2VwdCBmb3IgYmFja3dhcmRzCgkJY29tcGF0aWJpbGl0eS4KCi0tLSAyLjQgUHJlcGFyaW5nIHRoZSBrZXJuZWwgdHJlZSBmb3IgbW9kdWxlIGJ1aWxkCgoJVG8gbWFrZSBzdXJlIHRoZSBrZXJuZWwgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvCglidWlsZCBleHRlcm5hbCBtb2R1bGVzIHRoZSB0YXJnZXQgJ21vZHVsZXNfcHJlcGFyZScgbXVzdCBiZSB1c2VkLgoJJ21vZHVsZV9wcmVwYXJlJyBzb2xlbHkgZXhpc3RzIGFzIGEgc2ltcGxlIHdheSB0byBwcmVwYXJlCglhIGtlcm5lbCBmb3IgYnVpbGRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4KCU5vdGU6IG1vZHVsZXNfcHJlcGFyZSB3aWxsIG5vdCBidWlsZCBNb2R1bGUuc3ltdmVycyBldmVuIGlmCgkgICAgICBDT05GSUdfTU9EVUxFVkVSU0lPTklORyBpcyBzZXQuCgkgICAgICBUaGVyZWZvcmUgYSBmdWxsIGtlcm5lbCBidWlsZCBuZWVkcyB0byBiZSBleGVjdXRlZCB0byBtYWtlCgkgICAgICBtb2R1bGUgdmVyc2lvbmluZyB3b3JrLgoKCj09PSAzLiBFeGFtcGxlIGNvbW1hbmRzCgpUaGlzIGV4YW1wbGUgc2hvd3MgdGhlIGFjdHVhbCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCB3aGVuIGJ1aWxkaW5nCmFuIGV4dGVybmFsIG1vZHVsZSBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIGtlcm5lbC4KSW4gdGhlIGV4YW1wbGUgYmVsb3cgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzdXBwb3NlZCB0byB1c2UgdGhlCmZhY2lsaXR5IHRvIGxvY2F0ZSBvdXRwdXQgZmlsZXMgZm9yIGEga2VybmVsIGNvbXBpbGUgaW4gYSBkaWZmZXJlbnQKZGlyZWN0b3J5IHRoYW4gdGhlIGtlcm5lbCBzb3VyY2UgLSBidXQgdGhlIGV4YW1wbGVzIHdpbGwgYWxzbyB3b3JrCndoZW4gdGhlIHNvdXJjZSBhbmQgdGhlIG91dHB1dCBmaWxlcyBhcmUgbWl4ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgoKIyBLZXJuZWwgc291cmNlCi9saWIvbW9kdWxlcy88a2VybmVsLXZlcnNpb24+L3NvdXJjZSAtPiAvdXNyL3NyYy9saW51eC08dmVyc2lvbj4KCiMgT3V0cHV0IGZyb20ga2VybmVsIGNvbXBpbGUKL2xpYi9tb2R1bGVzLzxrZXJuZWwtdmVyc2lvbj4vYnVpbGQgLT4gL3Vzci9zcmMvbGludXgtPHZlcnNpb24+LXVwCgpDaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUga2J1aWxkIGZpbGUgaXMgbG9jYXRlZCBhbmQgZXhlY3V0ZQp0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIGJ1aWxkIHRoZSBtb2R1bGU6CgoJY2QgL2hvbWUvdXNlci9zcmMvbW9kdWxlCgltYWtlIC1DIC91c3Ivc3JjL2B1bmFtZSAtcmAvc291cmNlICAgICAgICAgICAgXAoJICAgICAgICBPPS9saWIvbW9kdWxlcy9gdW5hbWUtcmAvYnVpbGQgICAgICAgIFwKCSAgICAgICAgTT1gcHdkYAoKVGhlbiB0byBpbnN0YWxsIHRoZSBtb2R1bGUgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCgltYWtlIC1DIC91c3Ivc3JjL2B1bmFtZSAtcmAvc291cmNlICAgICAgICAgICAgXAoJICAgICAgICBPPS9saWIvbW9kdWxlcy9gdW5hbWUtcmAvYnVpbGQgICAgICAgIFwKCSAgICAgICAgTT1gcHdkYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCgkJbW9kdWxlc19pbnN0YWxsCgpJZiBvbmUgbG9va3MgY2xvc2VseSB5b3Ugd2lsbCBzZWUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGNvbW1hbmRzIGFzCmxpc3RlZCBiZWZvcmUgLSB3aXRoIHRoZSBkaXJlY3RvcmllcyBzcGVsbGVkIG91dC4KClRoZSBhYm92ZSBhcmUgcmF0aGVyIGxvbmcgY29tbWFuZHMsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXB0ZXIKbGlzdHMgYSBmZXcgdHJpY2tzIHRvIG1ha2UgaXQgYWxsIGVhc2llci4KCgo9PT0gNC4gQ3JlYXRpbmcgYSBrYnVpbGQgZmlsZSBmb3IgYW4gZXh0ZXJuYWwgbW9kdWxlCgprYnVpbGQgaXMgdGhlIGJ1aWxkIHN5c3RlbSBmb3IgdGhlIGtlcm5lbCwgYW5kIGV4dGVybmFsIG1vZHVsZXMKbXVzdCB1c2Uga2J1aWxkIHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIGNoYW5nZXMgaW4gdGhlIGJ1aWxkIHN5c3RlbQphbmQgdG8gcGljayB1cCB0aGUgcmlnaHQgZmxhZ3MgdG8gZ2NjIGV0Yy4KClRoZSBrYnVpbGQgZmlsZSB1c2VkIGFzIGlucHV0IHNoYWxsIGZvbGxvdyB0aGUgc3ludGF4IGRlc2NyaWJlZAppbiBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0LiBUaGlzIGNoYXB0ZXIgd2lsbCBpbnRyb2R1Y2UgYSBmZXcKbW9yZSB0cmlja3MgdG8gYmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCBleHRlcm5hbCBtb2R1bGVzLgoKSW4gdGhlIGZvbGxvd2luZyBhIE1ha2VmaWxlIHdpbGwgYmUgY3JlYXRlZCBmb3IgYSBtb2R1bGUgd2l0aCB0aGUKZm9sbG93aW5nIGZpbGVzOgoJODEyM19pZi5jCgk4MTIzX2lmLmgKCTgxMjNfcGNpLmMKCTgxMjNfYmluLm9fc2hpcHBlZAk8PSBCaW5hcnkgYmxvYgoKLS0tIDQuMSBTaGFyZWQgTWFrZWZpbGUgZm9yIG1vZHVsZSBhbmQga2VybmVsCgoJQW4gZXh0ZXJuYWwgbW9kdWxlIGFsd2F5cyBpbmNsdWRlcyBhIHdyYXBwZXIgTWFrZWZpbGUgc3VwcG9ydGluZwoJYnVpbGRpbmcgdGhlIG1vZHVsZSB1c2luZyAnbWFrZScgd2l0aCBubyBhcmd1bWVudHMuCglUaGUgTWFrZWZpbGUgcHJvdmlkZWQgd2lsbCBtb3N0IGxpa2VseSBpbmNsdWRlIGFkZGl0aW9uYWwKCWZ1bmN0aW9uYWxpdHkgc3VjaCBhcyB0ZXN0IHRhcmdldHMgZXRjLiBhbmQgdGhpcyBwYXJ0IHNoYWxsCgliZSBmaWx0ZXJlZCBhd2F5IGZyb20ga2J1aWxkIHNpbmNlIGl0IG1heSBpbXBhY3Qga2J1aWxkIGlmCgluYW1lIGNsYXNoZXMgb2NjdXJzLgoKCUV4YW1wbGUgMToKCQktLT4gZmlsZW5hbWU6IE1ha2VmaWxlCgkJaWZuZXEgKCQoS0VSTkVMUkVMRUFTRSksKQoJCSMga2J1aWxkIHBhcnQgb2YgbWFrZWZpbGUKCQlvYmotbSAgOj0gODEyMy5vCgkJODEyMy15IDo9IDgxMjNfaWYubyA4MTIzX3BjaS5vIDgxMjNfYmluLm8KCgkJZWxzZQoJCSMgTm9ybWFsIE1ha2VmaWxlCgoJCUtFUk5FTERJUiA6PSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9idWlsZAoJCWFsbDo6CgkJCSQoTUFLRSkgLUMgJChLRVJORUxESVIpIE09YHB3ZGAgJEAKCgkJIyBNb2R1bGUgc3BlY2lmaWMgdGFyZ2V0cwoJCWdlbmJpbjoKCQkJZWNobyAiWCIgPiA4MTIzX2Jpbi5vX3NoaXBwZWQKCgkJZW5kaWYKCglJbiBleGFtcGxlIDEgdGhlIGNoZWNrIGZvciBLRVJORUxSRUxFQVNFIGlzIHVzZWQgdG8gc2VwYXJhdGUKCXRoZSB0d28gcGFydHMgb2YgdGhlIE1ha2VmaWxlLiBrYnVpbGQgd2lsbCBvbmx5IHNlZSB0aGUgdHdvCglhc3NpZ25tZW50cyB3aGVyZWFzIG1ha2Ugd2lsbCBzZWUgZXZlcnl0aGluZyBleGNlcHQgdGhlIHR3bwoJa2J1aWxkIGFzc2lnbm1lbnRzLgoKCUluIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUga2VybmVsLCBrYnVpbGQgd2lsbCBsb29rIGZvciBhIGZpbGUgbmFtZWQKCUtidWlsZCBhbmQgYXMgc2Vjb25kIG9wdGlvbiBsb29rIGZvciBhIGZpbGUgbmFtZWQgTWFrZWZpbGUuCglVdGlsaXNpbmcgdGhlIEtidWlsZCBmaWxlIG1ha2VzIHVzIHNwbGl0IHVwIHRoZSBNYWtlZmlsZSBpbiBleGFtcGxlIDEKCWludG8gdHdvIGZpbGVzIGFzIHNob3duIGluIGV4YW1wbGUgMjoKCglFeGFtcGxlIDI6CgkJLS0+IGZpbGVuYW1lOiBLYnVpbGQKCQlvYmotbSAgOj0gODEyMy5vCgkJODEyMy15IDo9IDgxMjNfaWYubyA4MTIzX3BjaS5vIDgxMjNfYmluLm8KCgkJLS0+IGZpbGVuYW1lOiBNYWtlZmlsZQoJCUtFUk5FTERJUiA6PSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9idWlsZAoJCWFsbDo6CgkJCSQoTUFLRSkgLUMgJEtFUk5FTERJUiBNPWBwd2RgICRACgoJCSMgTW9kdWxlIHNwZWNpZmljIHRhcmdldHMKCQlnZW5iaW46CgkJCWVjaG8gIlgiID4gODEyM19iaW5fc2hpcHBlZAoKCglJbiBleGFtcGxlIDIgd2UgYXJlIGRvd24gdG8gdHdvIGZhaXJseSBzaW1wbGUgZmlsZXMgYW5kIGZvciBzaW1wbGUKCWZpbGVzIGFzIHVzZWQgaW4gdGhpcyBleGFtcGxlIHRoZSBzcGxpdCBpcyBxdWVzdGlvbmFibGUuIEJ1dCBzb21lCglleHRlcm5hbCBtb2R1bGVzIHVzZSBNYWtlZmlsZXMgb2Ygc2V2ZXJhbCBodW5kcmVkIGxpbmVzIGFuZCBoZXJlIGl0CglyZWFsbHkgcGF5cyBvZmYgdG8gc2VwYXJhdGUgdGhlIGtidWlsZCBwYXJ0IGZyb20gdGhlIHJlc3QuCglFeGFtcGxlIDMgc2hvd3MgYSBiYWNrd2FyZCBjb21wYXRpYmxlIHZlcnNpb24uCgoJRXhhbXBsZSAzOgoJCS0tPiBmaWxlbmFtZTogS2J1aWxkCgkJb2JqLW0gIDo9IDgxMjMubwoJCTgxMjMteSA6PSA4MTIzX2lmLm8gODEyM19wY2kubyA4MTIzX2Jpbi5vCgoJCS0tPiBmaWxlbmFtZTogTWFrZWZpbGUKCQlpZm5lcSAoJChLRVJORUxSRUxFQVNFKSwpCgkJaW5jbHVkZSBLYnVpbGQKCQllbHNlCgkJIyBOb3JtYWwgTWFrZWZpbGUKCgkJS0VSTkVMRElSIDo9IC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL2J1aWxkCgkJYWxsOjoKCQkJJChNQUtFKSAtQyAkS0VSTkVMRElSIE09YHB3ZGAgJEAKCgkJIyBNb2R1bGUgc3BlY2lmaWMgdGFyZ2V0cwoJCWdlbmJpbjoKCQkJZWNobyAiWCIgPiA4MTIzX2Jpbl9zaGlwcGVkCgoJCWVuZGlmCgoJCVRoZSB0cmljayBoZXJlIGlzIHRvIGluY2x1ZGUgdGhlIEtidWlsZCBmaWxlIGZyb20gTWFrZWZpbGUgc28KCQlpZiBhbiBvbGRlciB2ZXJzaW9uIG9mIGtidWlsZCBwaWNrcyB1cCB0aGUgTWFrZWZpbGUgdGhlIEtidWlsZAoJCWZpbGUgd2lsbCBiZSBpbmNsdWRlZC4KCi0tLSA0LjIgQmluYXJ5IGJsb2JzIGluY2x1ZGVkIGluIGEgbW9kdWxlCgoJU29tZSBleHRlcm5hbCBtb2R1bGVzIG5lZWRzIHRvIGluY2x1ZGUgYSAubyBhcyBhIGJsb2IuIGtidWlsZAoJaGFzIHN1cHBvcnQgZm9yIHRoaXMsIGJ1dCByZXF1aXJlcyB0aGUgYmxvYiBmaWxlIHRvIGJlIG5hbWVkCgk8ZmlsZW5hbWU+X3NoaXBwZWQuIEluIG91ciBleGFtcGxlIHRoZSBibG9iIGlzIG5hbWVkCgk4MTIzX2Jpbi5vX3NoaXBwZWQgYW5kIHdoZW4gdGhlIGtidWlsZCBydWxlcyBraWNrIGluIHRoZSBmaWxlCgk4MTIzX2Jpbi5vIGlzIGNyZWF0ZWQgYXMgYSBzaW1wbGUgY29weSBvZmYgdGhlIDgyMTNfYmluLm9fc2hpcHBlZCBmaWxlCgl3aXRoIHRoZSBfc2hpcHBlZCBwYXJ0IHN0cmlwcGVkIG9mIHRoZSBmaWxlbmFtZS4KCVRoaXMgYWxsb3dzIHRoZSA4MTIzX2Jpbi5vIGZpbGVuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIGFzc2lnbm1lbnQgdG8KCXRoZSBtb2R1bGUuCgoJRXhhbXBsZSA0OgoJCW9iai1tICA6PSA4MTIzLm8KCQk4MTIzLXkgOj0gODEyM19pZi5vIDgxMjNfcGNpLm8gODEyM19iaW4ubwoKCUluIGV4YW1wbGUgNCB0aGVyZSBpcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBvcmRpbmFyeSAuYy8uaCBmaWxlcwoJYW5kIHRoZSBiaW5hcnkgZmlsZS4gQnV0IGtidWlsZCB3aWxsIHBpY2sgdXAgZGlmZmVyZW50IHJ1bGVzIHRvIGNyZWF0ZQoJdGhlIC5vIGZpbGUuCgoKPT09IDUuIEluY2x1ZGUgZmlsZXMKCkluY2x1ZGUgZmlsZXMgYXJlIGEgbmVjZXNzaXR5IHdoZW4gYSAuYyBmaWxlIHVzZXMgc29tZXRoaW5nIGZyb20gYW5vdGhlciAuYwpmaWxlcyAobm90IHN0cmljdGx5IGluIHRoZSBzZW5zZSBvZiAuYyBidXQgaWYgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSBpcwp1c2VkKS4gQW55IG1vZHVsZSB0aGF0IGNvbnNpc3Qgb2YgbW9yZSB0aGFuIG9uZSAuYyBmaWxlIHdpbGwgaGF2ZSBhIC5oIGZpbGUKZm9yIG9uZSBvZiB0aGUgLmMgZmlsZXMuIAotIElmIHRoZSAuaCBmaWxlIG9ubHkgZGVzY3JpYmVzIGEgbW9kdWxlIGludGVybmFsIGludGVyZmFjZSB0aGVuIHRoZSAuaCBmaWxlCiAgc2hhbGwgYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgLmMgZmlsZXMuCi0gSWYgdGhlIC5oIGZpbGVzIGRlc2NyaWJlIGFuIGludGVyZmFjZSB1c2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwKICBsb2NhdGVkIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcywgdGhlIC5oIGZpbGVzIHNoYWxsIGJlIGxvY2F0ZWQgaW4KICBpbmNsdWRlL2xpbnV4LyBvciBvdGhlciBpbmNsdWRlLyBkaXJlY3RvcmllcyBhcyBhcHByb3ByaWF0ZS4KCk9uZSBleGNlcHRpb24gZm9yIHRoaXMgcnVsZSBpcyBsYXJnZXIgc3Vic3lzdGVtcyB0aGF0IGhhdmUgdGhlaXIgb3duIGRpcmVjdG9yeQp1bmRlciBpbmNsdWRlLyBzdWNoIGFzIGluY2x1ZGUvc2NzaS4gQW5vdGhlciBleGNlcHRpb24gaXMgYXJjaC1zcGVjaWZpYwouaCBmaWxlcyB3aGljaCBhcmUgbG9jYXRlZCB1bmRlciBpbmNsdWRlL2FzbS0kKEFSQ0gpLyouCgpFeHRlcm5hbCBtb2R1bGVzIGhhdmUgYSB0ZW5kZW5jeSB0byBsb2NhdGUgaW5jbHVkZSBmaWxlcyBpbiBhIHNlcGFyYXRlIGluY2x1ZGUvCmRpcmVjdG9yeSBhbmQgdGhlcmVmb3JlIG5lZWRzIHRvIGRlYWwgd2l0aCB0aGlzIGluIHRoZWlyIGtidWlsZCBmaWxlLgoKLS0tIDUuMSBIb3cgdG8gaW5jbHVkZSBmaWxlcyBmcm9tIHRoZSBrZXJuZWwgaW5jbHVkZSBkaXIKCglXaGVuIGEgbW9kdWxlIG5lZWRzIHRvIGluY2x1ZGUgYSBmaWxlIGZyb20gaW5jbHVkZS9saW51eC8gdGhlbiBvbmUKCWp1c3QgdXNlczoKCgkJI2luY2x1ZGUgPGxpbnV4L21vZHVsZXMuaD4KCglrYnVpbGQgd2lsbCBtYWtlIHN1cmUgdG8gYWRkIG9wdGlvbnMgdG8gZ2NjIHNvIHRoZSByZWxldmFudAoJZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkLgoJTGlrZXdpc2UgZm9yIC5oIGZpbGVzIHBsYWNlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIC5jIGZpbGUuCgoJCSNpbmNsdWRlICI4MTIzX2lmLmgiCgoJd2lsbCBkbyB0aGUgam9iLgoKLS0tIDUuMiBFeHRlcm5hbCBtb2R1bGVzIHVzaW5nIGFuIGluY2x1ZGUvIGRpcgoKCUV4dGVybmFsIG1vZHVsZXMgb2Z0ZW4gbG9jYXRlIHRoZWlyIC5oIGZpbGVzIGluIGEgc2VwYXJhdGUgaW5jbHVkZS8KCWRpcmVjdG9yeSBhbHRob3VnaCB0aGlzIGlzIG5vdCB1c3VhbCBrZXJuZWwgc3R5bGUuIFdoZW4gYW4gZXh0ZXJuYWwKCW1vZHVsZSB1c2VzIGFuIGluY2x1ZGUvIGRpciB0aGVuIGtidWlsZCBuZWVkcyB0byBiZSB0b2xkIHNvLgoJVGhlIHRyaWNrIGhlcmUgaXMgdG8gdXNlIGVpdGhlciBFWFRSQV9DRkxBR1MgKHRha2UgZWZmZWN0IGZvciBhbGwgLmMKCWZpbGVzKSBvciBDRkxBR1NfJEYubyAodGFrZSBlZmZlY3Qgb25seSBmb3IgYSBzaW5nbGUgZmlsZSkuCgoJSW4gb3VyIGV4YW1wbGUgaWYgd2UgbW92ZSA4MTIzX2lmLmggdG8gYSBzdWJkaXJlY3RvcnkgbmFtZWQgaW5jbHVkZS8KCXRoZSByZXN1bHRpbmcgS2J1aWxkIGZpbGUgd291bGQgbG9vayBsaWtlOgoKCQktLT4gZmlsZW5hbWU6IEtidWlsZAoJCW9iai1tICA6PSA4MTIzLm8KCgkJRVhUUkFfQ0ZMQUdTIDo9IC1JaW5jbHVkZQoJCTgxMjMteSA6PSA4MTIzX2lmLm8gODEyM19wY2kubyA4MTIzX2Jpbi5vCgoJTm90ZSB0aGF0IGluIHRoZSBhc3NpZ25tZW50IHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gLUkgYW5kIHRoZSBwYXRoLgoJVGhpcyBpcyBhIGtidWlsZCBsaW1pdGF0aW9uOiAgdGhlcmUgbXVzdCBiZSBubyBzcGFjZSBwcmVzZW50LgoKLS0tIDUuMyBFeHRlcm5hbCBtb2R1bGVzIHVzaW5nIHNldmVyYWwgZGlyZWN0b3JpZXMKCglJZiBhbiBleHRlcm5hbCBtb2R1bGUgZG9lcyBub3QgZm9sbG93IHRoZSB1c3VhbCBrZXJuZWwgc3R5bGUgYnV0CglkZWNpZGUgdG8gc3ByZWFkIGZpbGVzIG92ZXIgc2V2ZXJhbCBkaXJlY3RvcmllcyB0aGVuIGtidWlsZCBjYW4KCXN1cHBvcnQgdGhpcyB0b28uCgoJQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgoJCgl8CgkrLSBzcmMvY29tcGxleF9tYWluLmMKCXwgICArLSBoYWwvaGFyZHdhcmVpZi5jCgl8ICAgKy0gaGFsL2luY2x1ZGUvaGFyZHdhcmVpZi5oCgkrLSBpbmNsdWRlL2NvbXBsZXguaAoJCglUbyBidWlsZCBhIHNpbmdsZSBtb2R1bGUgbmFtZWQgY29tcGxleC5rbyB3ZSB0aGVuIG5lZWQgdGhlIGZvbGxvd2luZwoJa2J1aWxkIGZpbGU6CgoJS2J1aWxkOgoJCW9iai1tIDo9IGNvbXBsZXgubwoJCWNvbXBsZXgteSA6PSBzcmMvY29tcGxleF9tYWluLm8KCQljb21wbGV4LXkgKz0gc3JjL2hhbC9oYXJkd2FyZWlmLm8KCgkJRVhUUkFfQ0ZMQUdTIDo9IC1JJChzcmMpL2luY2x1ZGUKCQlFWFRSQV9DRkxBR1MgKz0gLUkkKHNyYylzcmMvaGFsL2luY2x1ZGUKCgoJa2J1aWxkIGtub3dzIGhvdyB0byBoYW5kbGUgLm8gZmlsZXMgbG9jYXRlZCBpbiBhbm90aGVyIGRpcmVjdG9yeSAtCglhbHRob3VnaCB0aGlzIGlzIE5PVCByZWNjb21tZW5kZWQgcHJhY3RpY2UuIFRoZSBzeW50YXggaXMgdG8gc3BlY2lmeQoJdGhlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBLYnVpbGQgZmlsZSBpcwoJbG9jYXRlZC4KCglUbyBmaW5kIHRoZSAuaCBmaWxlcyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgdGVsbCBrYnVpbGQgd2hlcmUgdG8gbG9vawoJZm9yIHRoZSAuaCBmaWxlcy4gV2hlbiBrYnVpbGQgZXhlY3V0ZXMgY3VycmVudCBkaXJlY3RvcnkgaXMgYWx3YXlzCgl0aGUgcm9vdCBvZiB0aGUga2VybmVsIHRyZWUgKGFyZ3VtZW50IHRvIC1DKSBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgdG8KCXRlbGwga2J1aWxkIGhvdyB0byBmaW5kIHRoZSAuaCBmaWxlcyB1c2luZyBhYnNvbHV0ZSBwYXRocy4KCSQoc3JjKSB3aWxsIHNwZWNpZnkgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUKCUtidWlsZCBmaWxlIGFyZSBsb2NhdGVkIHdoZW4gYmVpbmcgYnVpbGQgYXMgYW4gZXh0ZXJuYWwgbW9kdWxlLgoJVGhlcmVmb3JlIC1JJChzcmMpLyBpcyB1c2VkIHRvIHBvaW50IG91dCB0aGUgZGlyZWN0b3J5IG9mIHRoZSBLYnVpbGQKCWZpbGUgYW5kIGFueSBhZGRpdGlvbmFsIHBhdGggYXJlIGp1c3QgYXBwZW5kZWQuCgo9PT0gNi4gTW9kdWxlIGluc3RhbGxhdGlvbgoKTW9kdWxlcyB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCBhcmUgaW5zdGFsbGVkIGluIHRoZSBkaXJlY3Rvcnk6CgoJL2xpYi9tb2R1bGVzLyQoS0VSTkVMUkVMRUFTRSkva2VybmVsCgpFeHRlcm5hbCBtb2R1bGVzIGFyZSBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeToKCgkvbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKS9leHRyYQoKLS0tIDYuMSBJTlNUQUxMX01PRF9QQVRICgoJQWJvdmUgYXJlIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzLCBidXQgYXMgYWx3YXlzIHNvbWUgbGV2ZWwgb2YKCWN1c3RvbWl6YXRpb24gaXMgcG9zc2libGUuIE9uZSBjYW4gcHJlZml4IHRoZSBwYXRoIHVzaW5nIHRoZSB2YXJpYWJsZQoJSU5TVEFMTF9NT0RfUEFUSDoKCgkJJCBtYWtlIElOU1RBTExfTU9EX1BBVEg9L2Zyb2RvIG1vZHVsZXNfaW5zdGFsbAoJCT0+IEluc3RhbGwgZGlyOiAvZnJvZG8vbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKS9rZXJuZWwKCglJTlNUQUxMX01PRF9QQVRIIG1heSBiZSBzZXQgYXMgYW4gb3JkaW5hcnkgc2hlbGwgdmFyaWFibGUgb3IgYXMgaW4gdGhlCglleGFtcGxlIGFib3ZlIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY2FsbGluZyBtYWtlLgoJSU5TVEFMTF9NT0RfUEFUSCBoYXMgZWZmZWN0IGJvdGggd2hlbiBpbnN0YWxsaW5nIG1vZHVsZXMgaW5jbHVkZWQgaW4KCXRoZSBrZXJuZWwgYXMgd2VsbCBhcyB3aGVuIGluc3RhbGxpbmcgZXh0ZXJuYWwgbW9kdWxlcy4KCi0tLSA2LjIgSU5TVEFMTF9NT0RfRElSCgoJV2hlbiBpbnN0YWxsaW5nIGV4dGVybmFsIG1vZHVsZXMgdGhleSBhcmUgZGVmYXVsdCBpbnN0YWxsZWQgaW4gYQoJZGlyZWN0b3J5IHVuZGVyIC9saWIvbW9kdWxlcy8kKEtFUk5FTFJFTEVBU0UpL2V4dHJhLCBidXQgb25lIG1heSB3aXNoCgl0byBsb2NhdGUgbW9kdWxlcyBmb3IgYSBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGluIGEgc2VwYXJhdGUKCWRpcmVjdG9yeS4gRm9yIHRoaXMgcHVycG9zZSBvbmUgY2FuIHVzZSBJTlNUQUxMX01PRF9ESVIgdG8gc3BlY2lmeSBhbgoJYWx0ZXJuYXRpdmUgbmFtZSB0aGFuICdleHRyYScuCgoJCSQgbWFrZSBJTlNUQUxMX01PRF9ESVI9Z2FuZGFsZiAtQyBLRVJORUxESVIgXAoJCQlNPWBwd2RgIG1vZHVsZXNfaW5zdGFsbAoJCT0+IEluc3RhbGwgZGlyOiAvbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKS9nYW5kYWxmCgoKPT09IDcuIE1vZHVsZSB2ZXJzaW9uaW5nCgpNb2R1bGUgdmVyc2lvbmluZyBpcyBlbmFibGVkIGJ5IHRoZSBDT05GSUdfTU9EVkVSU0lPTlMgdGFnLgoKTW9kdWxlIHZlcnNpb25pbmcgaXMgdXNlZCBhcyBhIHNpbXBsZSBBQkkgY29uc2lzdGVuY3kgY2hlY2suIFRoZSBNb2R1bGUKdmVyc2lvbmluZyBjcmVhdGVzIGEgQ1JDIHZhbHVlIG9mIHRoZSBmdWxsIHByb3RvdHlwZSBmb3IgYW4gZXhwb3J0ZWQgc3ltYm9sIGFuZAp3aGVuIGEgbW9kdWxlIGlzIGxvYWRlZC91c2VkIHRoZW4gdGhlIENSQyB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBrZXJuZWwgYXJlCmNvbXBhcmVkIHdpdGggc2ltaWxhciB2YWx1ZXMgaW4gdGhlIG1vZHVsZS4gSWYgdGhleSBhcmUgbm90IGVxdWFsIHRoZW4gdGhlCmtlcm5lbCByZWZ1c2VzIHRvIGxvYWQgdGhlIG1vZHVsZS4KCkR1cmluZyBhIGtlcm5lbCBidWlsZCBhIGZpbGUgbmFtZWQgTW9kdWxlLnN5bXZlcnMgd2lsbCBiZSBnZW5lcmF0ZWQuIFRoaXMKZmlsZSBpbmNsdWRlcyB0aGUgc3ltYm9sIHZlcnNpb24gb2YgYWxsIHN5bWJvbHMgd2l0aGluIHRoZSBrZXJuZWwuIElmIHRoZSAKTW9kdWxlLnN5bXZlcnMgZmlsZSBpcyBzYXZlZCBmcm9tIHRoZSBsYXN0IGZ1bGwga2VybmVsIGNvbXBpbGUgb25lIGRvZXMgbm90CmhhdmUgdG8gZG8gYSBmdWxsIGtlcm5lbCBjb21waWxlIHRvIGJ1aWxkIGEgbW9kdWxlIHZlcnNpb24ncyBjb21wYXRpYmxlIG1vZHVsZS4KCj09PSA4LiBUaXBzICYgVHJpY2tzCgotLS0gOC4xIFRlc3RpbmcgZm9yIENPTkZJR19GT09fQkFSCgoJTW9kdWxlcyBvZnRlbiBuZWVkcyB0byBjaGVjayBmb3IgY2VydGFpbiBDT05GSUdfIG9wdGlvbnMgdG8gZGVjaWRlIGlmCglhIHNwZWNpZmljIGZlYXR1cmUgc2hhbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1vZHVsZS4gV2hlbiBrYnVpbGQgaXMgdXNlZAoJdGhpcyBpcyBkb25lIGJ5IHJlZmVyZW5jaW5nIHRoZSBDT05GSUdfIHZhcmlhYmxlIGRpcmVjdGx5LgoKCQkjZnMvZXh0Mi9NYWtlZmlsZQoJCW9iai0kKENPTkZJR19FWFQyX0ZTKSArPSBleHQyLm8KCgkJZXh0Mi15IDo9IGJhbGxvYy5vIGJpdG1hcC5vIGRpci5vCgkJZXh0Mi0kKENPTkZJR19FWFQyX0ZTX1hBVFRSKSArPSB4YXR0ci5vCgoJRXh0ZXJuYWwgbW9kdWxlcyBoYXZlIHRyYWRpdGlvbmFsbHkgdXNlZCBncmVwIHRvIGNoZWNrIGZvciBzcGVjaWZpYwoJQ09ORklHXyBzZXR0aW5ncyBkaXJlY3RseSBpbiAuY29uZmlnLiBUaGlzIHVzYWdlIGlzIGJyb2tlbi4KCUFzIGludHJvZHVjZWQgYmVmb3JlIGV4dGVybmFsIG1vZHVsZXMgc2hhbGwgdXNlIGtidWlsZCB3aGVuIGJ1aWxkaW5nCglhbmQgdGhlcmVmb3JlIGNhbiB1c2UgdGhlIHNhbWUgbWV0aG9kcyBhcyBpbi1rZXJuZWwgbW9kdWxlcyB3aGVuIHRlc3RpbmcKCWZvciBDT05GSUdfIGRlZmluaXRpb25zLgoK