LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjR4eF9yY2MuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjEuMC4wDQogICogQGRhdGUgICAgMzAtU2VwdGVtYmVyLTIwMTENCiAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIA0KICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVzZXQgYW5kIGNsb2NrIGNvbnRyb2wgKFJDQykgcGVyaXBoZXJhbDoNCiAgKiAgICAgICAgICAgLSBJbnRlcm5hbC9leHRlcm5hbCBjbG9ja3MsIFBMTCwgQ1NTIGFuZCBNQ08gY29uZmlndXJhdGlvbg0KICAqICAgICAgICAgICAtIFN5c3RlbSwgQUhCIGFuZCBBUEIgYnVzc2VzIGNsb2NrcyBjb25maWd1cmF0aW9uDQogICogICAgICAgICAgIC0gUGVyaXBoZXJhbCBjbG9ja3MgY29uZmlndXJhdGlvbg0KICAqICAgICAgICAgICAtIEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQNCiAgKg0KICAqICBAdmVyYmF0aW0NCiAgKiAgICAgICAgICAgICAgIA0KICAqICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0Mgc3BlY2lmaWMgZmVhdHVyZXMNCiAgKiAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICogICAgDQogICogICAgICAgICAgQWZ0ZXIgcmVzZXQgdGhlIGRldmljZSBpcyBydW5uaW5nIGZyb20gSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIA0KICAqICAgICAgICAgIChIU0kgMTZNSHopIHdpdGggRmxhc2ggMCB3YWl0IHN0YXRlLCBGbGFzaCBwcmVmZXRjaCBidWZmZXIsIEQtQ2FjaGUgDQogICogICAgICAgICAgYW5kIEktQ2FjaGUgYXJlIGRpc2FibGVkLCBhbmQgYWxsIHBlcmlwaGVyYWxzIGFyZSBvZmYgZXhjZXB0IGludGVybmFsDQogICogICAgICAgICAgU1JBTSwgRmxhc2ggYW5kIEpUQUcuDQogICogICAgICAgICAgIC0gVGhlcmUgaXMgbm8gcHJlc2NhbGVyIG9uIEhpZ2ggc3BlZWQgKEFIQikgYW5kIExvdyBzcGVlZCAoQVBCKSBidXNzZXM7DQogICogICAgICAgICAgICAgYWxsIHBlcmlwaGVyYWxzIG1hcHBlZCBvbiB0aGVzZSBidXNzZXMgYXJlIHJ1bm5pbmcgYXQgSFNJIHNwZWVkLg0KICAqICAgICAgIAkgIC0gVGhlIGNsb2NrIGZvciBhbGwgcGVyaXBoZXJhbHMgaXMgc3dpdGNoZWQgb2ZmLCBleGNlcHQgdGhlIFNSQU0gYW5kIEZMQVNILg0KICAqICAgICAgICAgICAtIEFsbCBHUElPcyBhcmUgaW4gaW5wdXQgZmxvYXRpbmcgc3RhdGUsIGV4Y2VwdCB0aGUgSlRBRyBwaW5zIHdoaWNoDQogICogICAgICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIGJlIHVzZWQgZm9yIGRlYnVnIHB1cnBvc2UuDQogICogICAgICAgIA0KICAqICAgICAgICAgIE9uY2UgdGhlIGRldmljZSBzdGFydGVkIGZyb20gcmVzZXQsIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGhhcyB0bzogICAgICAgIA0KICAqICAgICAgICAgICAtIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaw0KICAqICAgICAgICAgICAgIChpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgaGlnaGVyIGZyZXF1ZW5jeS9wZXJmb3JtYW5jZSkNCiAgKiAgICAgICAgICAgLSBDb25maWd1cmUgdGhlIFN5c3RlbSBjbG9jayBmcmVxdWVuY3kgYW5kIEZsYXNoIHNldHRpbmdzICANCiAgKiAgICAgICAgICAgLSBDb25maWd1cmUgdGhlIEFIQiBhbmQgQVBCIGJ1c3NlcyBwcmVzY2FsZXJzDQogICogICAgICAgICAgIC0gRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIHBlcmlwaGVyYWwocykgdG8gYmUgdXNlZA0KICAqICAgICAgICAgICAtIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlKHMpIGZvciBwZXJpcGhlcmFscyB3aGljaCBjbG9ja3MgYXJlIG5vdA0KICAqICAgICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGUgU3lzdGVtIGNsb2NrIChJMlMsIFJUQywgQURDLCBVU0IgT1RHIEZTL1NESU8vUk5HKSAgICAgIA0KICAqICAgICAgICAgICAgICAgICAgICAgICAgDQogICogIEBlbmR2ZXJiYXRpbQ0KICAqICAgIA0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAYXR0ZW50aW9uDQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMSBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmY0eHhfcmNjLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkY0eHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUkNDIA0KICAqIEBicmllZiBSQ0MgZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLyANCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAtLS0tLS0tLS0tLS0gUkNDIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0tICovDQojZGVmaW5lIFJDQ19PRkZTRVQgICAgICAgICAgICAgICAgKFJDQ19CQVNFIC0gUEVSSVBIX0JBU0UpDQovKiAtLS0gQ1IgUmVnaXN0ZXIgLS0tKi8NCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBIU0lPTiBiaXQgKi8NCiNkZWZpbmUgQ1JfT0ZGU0VUICAgICAgICAgICAgICAgICAoUkNDX09GRlNFVCArIDB4MDApDQojZGVmaW5lIEhTSU9OX0JpdE51bWJlciAgICAgICAgICAgMHgwMA0KI2RlZmluZSBDUl9IU0lPTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoSFNJT05fQml0TnVtYmVyICogNCkpDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ1NTT04gYml0ICovDQojZGVmaW5lIENTU09OX0JpdE51bWJlciAgICAgICAgICAgMHgxMw0KI2RlZmluZSBDUl9DU1NPTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoQ1NTT05fQml0TnVtYmVyICogNCkpDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUExMT04gYml0ICovDQojZGVmaW5lIFBMTE9OX0JpdE51bWJlciAgICAgICAgICAgMHgxOA0KI2RlZmluZSBDUl9QTExPTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoUExMT05fQml0TnVtYmVyICogNCkpDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUExMSTJTT04gYml0ICovDQojZGVmaW5lIFBMTEkyU09OX0JpdE51bWJlciAgICAgICAgMHgxQQ0KI2RlZmluZSBDUl9QTExJMlNPTl9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoUExMSTJTT05fQml0TnVtYmVyICogNCkpDQoNCi8qIC0tLSBDRkdSIFJlZ2lzdGVyIC0tLSovDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgSTJTU1JDIGJpdCAqLw0KI2RlZmluZSBDRkdSX09GRlNFVCAgICAgICAgICAgICAgIChSQ0NfT0ZGU0VUICsgMHgwOCkNCiNkZWZpbmUgSTJTU1JDX0JpdE51bWJlciAgICAgICAgICAweDE3DQojZGVmaW5lIENGR1JfSTJTU1JDX0JCICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENGR1JfT0ZGU0VUICogMzIpICsgKEkyU1NSQ19CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tIEJEQ1IgUmVnaXN0ZXIgLS0tKi8NCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSVENFTiBiaXQgKi8NCiNkZWZpbmUgQkRDUl9PRkZTRVQgICAgICAgICAgICAgICAoUkNDX09GRlNFVCArIDB4NzApDQojZGVmaW5lIFJUQ0VOX0JpdE51bWJlciAgICAgICAgICAgMHgwRg0KI2RlZmluZSBCRENSX1JUQ0VOX0JCICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChCRENSX09GRlNFVCAqIDMyKSArIChSVENFTl9CaXROdW1iZXIgKiA0KSkNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBCRFJTVCBiaXQgKi8NCiNkZWZpbmUgQkRSU1RfQml0TnVtYmVyICAgICAgICAgICAweDEwDQojZGVmaW5lIEJEQ1JfQkRSU1RfQkIgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKEJEQ1JfT0ZGU0VUICogMzIpICsgKEJEUlNUX0JpdE51bWJlciAqIDQpKQ0KLyogLS0tIENTUiBSZWdpc3RlciAtLS0qLw0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIExTSU9OIGJpdCAqLw0KI2RlZmluZSBDU1JfT0ZGU0VUICAgICAgICAgICAgICAgIChSQ0NfT0ZGU0VUICsgMHg3NCkNCiNkZWZpbmUgTFNJT05fQml0TnVtYmVyICAgICAgICAgICAweDAwDQojZGVmaW5lIENTUl9MU0lPTl9CQiAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENTUl9PRkZTRVQgKiAzMikgKyAoTFNJT05fQml0TnVtYmVyICogNCkpDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJDQyByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiBDRkdSIHJlZ2lzdGVyIGJpdCBtYXNrICovDQojZGVmaW5lIENGR1JfTUNPMl9SRVNFVF9NQVNLICAgICAgKCh1aW50MzJfdCkweDA3RkZGRkZGKQ0KI2RlZmluZSBDRkdSX01DTzFfUkVTRVRfTUFTSyAgICAgICgodWludDMyX3QpMHhGODlGRkZGRikNCg0KLyogUkNDIEZsYWcgTWFzayAqLw0KI2RlZmluZSBGTEFHX01BU0sgICAgICAgICAgICAgICAgICgodWludDhfdCkweDFGKQ0KDQovKiBDUiByZWdpc3RlciBieXRlIDMgKEJpdHNbMjM6MTZdKSBiYXNlIGFkZHJlc3MgKi8NCiNkZWZpbmUgQ1JfQllURTNfQUREUkVTUyAgICAgICAgICAoKHVpbnQzMl90KTB4NDAwMjM4MDIpDQoNCi8qIENJUiByZWdpc3RlciBieXRlIDIgKEJpdHNbMTU6OF0pIGJhc2UgYWRkcmVzcyAqLw0KI2RlZmluZSBDSVJfQllURTJfQUREUkVTUyAgICAgICAgICgodWludDMyX3QpKFJDQ19CQVNFICsgMHgwQyArIDB4MDEpKQ0KDQovKiBDSVIgcmVnaXN0ZXIgYnl0ZSAzIChCaXRzWzIzOjE2XSkgYmFzZSBhZGRyZXNzICovDQojZGVmaW5lIENJUl9CWVRFM19BRERSRVNTICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0JBU0UgKyAweDBDICsgMHgwMikpDQoNCi8qIEJEQ1IgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovDQojZGVmaW5lIEJEQ1JfQUREUkVTUyAgICAgICAgICAgICAgKFBFUklQSF9CQVNFICsgQkRDUl9PRkZTRVQpDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIF9fSSB1aW50OF90IEFQQkFIQlByZXNjVGFibGVbMTZdID0gezAsIDAsIDAsIDAsIDEsIDIsIDMsIDQsIDEsIDIsIDMsIDQsIDYsIDcsIDgsIDl9Ow0KDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLyANCg0KLyoqIEBkZWZncm91cCBSQ0NfR3JvdXAxIEludGVybmFsIGFuZCBleHRlcm5hbCBjbG9ja3MsIFBMTCwgQ1NTIGFuZCBNQ08gY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAqICBAYnJpZWYgICBJbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2xvY2tzLCBQTEwsIENTUyBhbmQgTUNPIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIA0KICoNCkB2ZXJiYXRpbSAgIA0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgIEludGVybmFsL2V4dGVybmFsIGNsb2NrcywgUExMLCBDU1MgYW5kIE1DTyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KDQogIFRoaXMgc2VjdGlvbiBwcm92aWRlIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgdGhlIGludGVybmFsL2V4dGVybmFsIGNsb2NrcywNCiAgUExMcywgQ1NTIGFuZCBNQ08gcGlucy4NCiAgDQogIDEuIEhTSSAoaGlnaC1zcGVlZCBpbnRlcm5hbCksIDE2IE1IeiBmYWN0b3J5LXRyaW1tZWQgUkMgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoDQogICAgIHRoZSBQTEwgYXMgU3lzdGVtIGNsb2NrIHNvdXJjZS4NCg0KICAyLiBMU0kgKGxvdy1zcGVlZCBpbnRlcm5hbCksIDMyIEtIeiBsb3cgY29uc3VtcHRpb24gUkMgdXNlZCBhcyBJV0RHIGFuZC9vciBSVEMNCiAgICAgY2xvY2sgc291cmNlLg0KDQogIDMuIEhTRSAoaGlnaC1zcGVlZCBleHRlcm5hbCksIDQgdG8gMjYgTUh6IGNyeXN0YWwgb3NjaWxsYXRvciB1c2VkIGRpcmVjdGx5IG9yDQogICAgIHRocm91Z2ggdGhlIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlLiBDYW4gYmUgdXNlZCBhbHNvIGFzIFJUQyBjbG9jayBzb3VyY2UuDQoNCiAgNC4gTFNFIChsb3ctc3BlZWQgZXh0ZXJuYWwpLCAzMiBLSHogb3NjaWxsYXRvciB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UuICAgDQoNCiAgNS4gUExMIChjbG9ja2VkIGJ5IEhTSSBvciBIU0UpLCBmZWF0dXJpbmcgdHdvIGRpZmZlcmVudCBvdXRwdXQgY2xvY2tzOg0KICAgICAgLSBUaGUgZmlyc3Qgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2ggc3BlZWQgc3lzdGVtIGNsb2NrICh1cCB0byAxNjggTUh6KQ0KICAgICAgLSBUaGUgc2Vjb25kIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFVTQiBPVEcgRlMgKDQ4IE1IeiksDQogICAgICAgIHRoZSByYW5kb20gYW5hbG9nIGdlbmVyYXRvciAoPD00OCBNSHopIGFuZCB0aGUgU0RJTyAoPD0gNDggTUh6KS4NCg0KICA2LiBQTExJMlMgKGNsb2NrZWQgYnkgSFNJIG9yIEhTRSksIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYWNjdXJhdGUgY2xvY2sgdG8gYWNoaWV2ZSANCiAgICAgaGlnaC1xdWFsaXR5IGF1ZGlvIHBlcmZvcm1hbmNlIG9uIHRoZSBJMlMgaW50ZXJmYWNlLg0KICANCiAgNy4gQ1NTIChDbG9jayBzZWN1cml0eSBzeXN0ZW0pLCBvbmNlIGVuYWJsZSBhbmQgaWYgYSBIU0UgY2xvY2sgZmFpbHVyZSBvY2N1cnMgDQogICAgIChIU0UgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlKSwgdGhlIFN5c3RlbSBjbG9jaw0KICAgICBpcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIEhTSSBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBpZiBlbmFibGVkLiANCiAgICAgVGhlIGludGVycnVwdCBpcyBsaW5rZWQgdG8gdGhlIENvcnRleC1NNCBOTUkgKE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHQpIA0KICAgICBleGNlcHRpb24gdmVjdG9yLiAgIA0KDQogIDguIE1DTzEgKG1pY3JvY29udHJvbGxlciBjbG9jayBvdXRwdXQpLCB1c2VkIHRvIG91dHB1dCBIU0ksIExTRSwgSFNFIG9yIFBMTA0KICAgICBjbG9jayAodGhyb3VnaCBhIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXIpIG9uIFBBOCBwaW4uDQoNCiAgOS4gTUNPMiAobWljcm9jb250cm9sbGVyIGNsb2NrIG91dHB1dCksIHVzZWQgdG8gb3V0cHV0IEhTRSwgUExMLCBTWVNDTEsgb3IgUExMSTJTDQogICAgIGNsb2NrICh0aHJvdWdoIGEgY29uZmlndXJhYmxlIHByZXNjYWxlcikgb24gUEM5IHBpbi4NCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBSZXNldHMgdGhlIFJDQyBjbG9jayBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlLg0KICAqIEBub3RlICAgVGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUgb2YgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYmVsb3c6DQogICogICAgICAgICAgICAtIEhTSSBPTiBhbmQgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlDQogICogICAgICAgICAgICAtIEhTRSwgUExMIGFuZCBQTExJMlMgT0ZGDQogICogICAgICAgICAgICAtIEFIQiwgQVBCMSBhbmQgQVBCMiBwcmVzY2FsZXIgc2V0IHRvIDEuDQogICogICAgICAgICAgICAtIENTUywgTUNPMSBhbmQgTUNPMiBPRkYNCiAgKiAgICAgICAgICAgIC0gQWxsIGludGVycnVwdHMgZGlzYWJsZWQNCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlDQogICogICAgICAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2tzDQogICogICAgICAgICAgICAtIExTSSwgTFNFIGFuZCBSVEMgY2xvY2tzIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfRGVJbml0KHZvaWQpDQp7DQogIC8qIFNldCBIU0lPTiBiaXQgKi8NCiAgUkNDLT5DUiB8PSAodWludDMyX3QpMHgwMDAwMDAwMTsNCg0KICAvKiBSZXNldCBDRkdSIHJlZ2lzdGVyICovDQogIFJDQy0+Q0ZHUiA9IDB4MDAwMDAwMDA7DQoNCiAgLyogUmVzZXQgSFNFT04sIENTU09OIGFuZCBQTExPTiBiaXRzICovDQogIFJDQy0+Q1IgJj0gKHVpbnQzMl90KTB4RkVGNkZGRkY7DQoNCiAgLyogUmVzZXQgUExMQ0ZHUiByZWdpc3RlciAqLw0KICBSQ0MtPlBMTENGR1IgPSAweDI0MDAzMDEwOw0KDQogIC8qIFJlc2V0IEhTRUJZUCBiaXQgKi8NCiAgUkNDLT5DUiAmPSAodWludDMyX3QpMHhGRkZCRkZGRjsNCg0KICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovDQogIFJDQy0+Q0lSID0gMHgwMDAwMDAwMDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkuDQogICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgSFNFIChSQ0NfSFNFX09OIG9yIFJDQ19IU0VfQnlwYXNzKSwgdGhlIGFwcGxpY2F0aW9uDQogICogICAgICAgICBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTRSBjbG9jaw0KICAqICAgICAgICAgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUExMIGFuZC9vciBzeXN0ZW0gY2xvY2suDQogICogQG5vdGUgICBIU0Ugc3RhdGUgY2FuIG5vdCBiZSBjaGFuZ2VkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUNCiAgKiAgICAgICAgIFBMTCBhcyBzeXN0ZW0gY2xvY2suIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlDQogICogICAgICAgICBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gY2hhbmdlIHRoZSBIU0Ugc3RhdGUgKGV4LiBkaXNhYmxlIGl0KS4NCiAgKiBAbm90ZSAgIFRoZSBIU0UgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuICANCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcmVzZXQgdGhlIENTU09OIGJpdCwgc28gaWYgdGhlIENsb2NrIHNlY3VyaXR5IHN5c3RlbShDU1MpDQogICogICAgICAgICB3YXMgcHJldmlvdXNseSBlbmFibGVkIHlvdSBoYXZlIHRvIGVuYWJsZSBpdCBhZ2FpbiBhZnRlciBjYWxsaW5nIHRoaXMNCiAgKiAgICAgICAgIGZ1bmN0aW9uLiAgICANCiAgKiBAcGFyYW0gIFJDQ19IU0U6IHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0hTRV9PRkY6IHR1cm4gT0ZGIHRoZSBIU0Ugb3NjaWxsYXRvciwgSFNFUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXINCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgSFNFIG9zY2lsbGF0b3IgY2xvY2sgY3ljbGVzLg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSFNFX09OOiB0dXJuIE9OIHRoZSBIU0Ugb3NjaWxsYXRvcg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSFNFX0J5cGFzczogSFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfSFNFQ29uZmlnKHVpbnQ4X3QgUkNDX0hTRSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0UoUkNDX0hTRSkpOw0KDQogIC8qIFJlc2V0IEhTRU9OIGFuZCBIU0VCWVAgYml0cyBiZWZvcmUgY29uZmlndXJpbmcgdGhlIEhTRSAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAqKF9fSU8gdWludDhfdCAqKSBDUl9CWVRFM19BRERSRVNTID0gUkNDX0hTRV9PRkY7DQoNCiAgLyogU2V0IHRoZSBuZXcgSFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICooX19JTyB1aW50OF90ICopIENSX0JZVEUzX0FERFJFU1MgPSBSQ0NfSFNFOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFdhaXRzIGZvciBIU0Ugc3RhcnQtdXAuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9ucyB3YWl0cyBvbiBIU0VSRFkgZmxhZyB0byBiZSBzZXQgYW5kIHJldHVybiBTVUNDRVNTIGlmIA0KICAqICAgICAgICAgdGhpcyBmbGFnIGlzIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgRVJST1IgaWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCANCiAgKiAgICAgICAgIGFuZCB0aGlzIGZsYWcgaXMgbm90IHNldC4gVGhlIHRpbWVvdXQgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgY29uc3RhbnQNCiAgKiAgICAgICAgIEhTRV9TVEFSVFVQX1RJTUVPVVQgaW4gc3RtMzJmNHh4LmggZmlsZS4gWW91IGNhbiB0YWlsb3IgaXQgZGVwZW5kaW5nDQogICogICAgICAgICBvbiB0aGUgSFNFIGNyeXN0YWwgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiANCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOg0KICAqICAgICAgICAgIC0gU1VDQ0VTUzogSFNFIG9zY2lsbGF0b3IgaXMgc3RhYmxlIGFuZCByZWFkeSB0byB1c2UNCiAgKiAgICAgICAgICAtIEVSUk9SOiBIU0Ugb3NjaWxsYXRvciBub3QgeWV0IHJlYWR5DQogICovDQpFcnJvclN0YXR1cyBSQ0NfV2FpdEZvckhTRVN0YXJ0VXAodm9pZCkNCnsNCiAgX19JTyB1aW50MzJfdCBzdGFydHVwY291bnRlciA9IDA7DQogIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOw0KICBGbGFnU3RhdHVzIGhzZXN0YXR1cyA9IFJFU0VUOw0KICAvKiBXYWl0IHRpbGwgSFNFIGlzIHJlYWR5IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8NCiAgZG8NCiAgew0KICAgIGhzZXN0YXR1cyA9IFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX0hTRVJEWSk7DQogICAgc3RhcnR1cGNvdW50ZXIrKzsNCiAgfSB3aGlsZSgoc3RhcnR1cGNvdW50ZXIgIT0gSFNFX1NUQVJUVVBfVElNRU9VVCkgJiYgKGhzZXN0YXR1cyA9PSBSRVNFVCkpOw0KDQogIGlmIChSQ0NfR2V0RmxhZ1N0YXR1cyhSQ0NfRkxBR19IU0VSRFkpICE9IFJFU0VUKQ0KICB7DQogICAgc3RhdHVzID0gU1VDQ0VTUzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBzdGF0dXMgPSBFUlJPUjsNCiAgfQ0KICByZXR1cm4gKHN0YXR1cyk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLg0KICAqIEBub3RlICAgVGhlIGNhbGlicmF0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIHZhcmlhdGlvbnMgaW4gdm9sdGFnZQ0KICAqICAgICAgICAgYW5kIHRlbXBlcmF0dXJlIHRoYXQgaW5mbHVlbmNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGludGVybmFsIEhTSSBSQy4NCiAgKiBAcGFyYW0gIEhTSUNhbGlicmF0aW9uVmFsdWU6IHNwZWNpZmllcyB0aGUgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUuDQogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMHgxRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FkanVzdEhTSUNhbGlicmF0aW9uVmFsdWUodWludDhfdCBIU0lDYWxpYnJhdGlvblZhbHVlKQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NBTElCUkFUSU9OX1ZBTFVFKEhTSUNhbGlicmF0aW9uVmFsdWUpKTsNCg0KICB0bXByZWcgPSBSQ0MtPkNSOw0KDQogIC8qIENsZWFyIEhTSVRSSU1bNDowXSBiaXRzICovDQogIHRtcHJlZyAmPSB+UkNDX0NSX0hTSVRSSU07DQoNCiAgLyogU2V0IHRoZSBIU0lUUklNWzQ6MF0gYml0cyBhY2NvcmRpbmcgdG8gSFNJQ2FsaWJyYXRpb25WYWx1ZSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KUhTSUNhbGlicmF0aW9uVmFsdWUgPDwgMzsNCg0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q1IgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLg0KICAqIEBub3RlICAgVGhlIEhTSSBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4NCiAgKiAgICAgICAgIEl0IGlzIHVzZWQgKGVuYWJsZWQgYnkgaGFyZHdhcmUpIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIgc3RhcnR1cA0KICAqICAgICAgICAgZnJvbSBSZXNldCwgd2FrZXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlLCBvciBpbiBjYXNlIG9mIGZhaWx1cmUNCiAgKiAgICAgICAgIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrDQogICogICAgICAgICBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLiAgICAgICAgICAgICANCiAgKiBAbm90ZSAgIEhTSSBjYW4gbm90IGJlIHN0b3BwZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiBJbiB0aGlzIGNhc2UsDQogICogICAgICAgICB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2Ugb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIHN0b3AgdGhlIEhTSS4gIA0KICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTSVJEWQ0KICAqICAgICAgICAgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTSSBjbG9jayBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIGFzDQogICogICAgICAgICBzeXN0ZW0gY2xvY2sgc291cmNlLiAgDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBIU0kuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAbm90ZSAgIFdoZW4gdGhlIEhTSSBpcyBzdG9wcGVkLCBIU0lSRFkgZmxhZyBnb2VzIGxvdyBhZnRlciA2IEhTSSBvc2NpbGxhdG9yDQogICogICAgICAgICBjbG9jayBjeWNsZXMuICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0hTSUNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIENSX0hTSU9OX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEV4dGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0UpLg0KICAqIEBub3RlICAgQXMgdGhlIExTRSBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bw0KICAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcgDQogICogICAgICAgICBQV1JfQmFja3VwQWNjZXNzQ21kKEVOQUJMRSkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZSB0aGUgTFNFDQogICogICAgICAgICAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4gIA0KICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIExTRSAoUkNDX0xTRV9PTiBvciBSQ0NfTFNFX0J5cGFzcyksIHRoZSBhcHBsaWNhdGlvbg0KICAqICAgICAgICAgc29mdHdhcmUgc2hvdWxkIHdhaXQgb24gTFNFUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0UgY2xvY2sNCiAgKiAgICAgICAgIGlzIHN0YWJsZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2xvY2sgdGhlIFJUQy4NCiAgKiBAcGFyYW0gIFJDQ19MU0U6IHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0xTRV9PRkY6IHR1cm4gT0ZGIHRoZSBMU0Ugb3NjaWxsYXRvciwgTFNFUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXINCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgTFNFIG9zY2lsbGF0b3IgY2xvY2sgY3ljbGVzLg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfTFNFX09OOiB0dXJuIE9OIHRoZSBMU0Ugb3NjaWxsYXRvcg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfTFNFX0J5cGFzczogTFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfTFNFQ29uZmlnKHVpbnQ4X3QgUkNDX0xTRSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0UoUkNDX0xTRSkpOw0KDQogIC8qIFJlc2V0IExTRU9OIGFuZCBMU0VCWVAgYml0cyBiZWZvcmUgY29uZmlndXJpbmcgdGhlIExTRSAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBSZXNldCBMU0VPTiBiaXQgKi8NCiAgKihfX0lPIHVpbnQ4X3QgKikgQkRDUl9BRERSRVNTID0gUkNDX0xTRV9PRkY7DQoNCiAgLyogUmVzZXQgTFNFQllQIGJpdCAqLw0KICAqKF9fSU8gdWludDhfdCAqKSBCRENSX0FERFJFU1MgPSBSQ0NfTFNFX09GRjsNCg0KICAvKiBDb25maWd1cmUgTFNFIChSQ0NfTFNFX09GRiBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGNvZGUgc2VjdGlvbiBhYm92ZSkgKi8NCiAgc3dpdGNoIChSQ0NfTFNFKQ0KICB7DQogICAgY2FzZSBSQ0NfTFNFX09OOg0KICAgICAgLyogU2V0IExTRU9OIGJpdCAqLw0KICAgICAgKihfX0lPIHVpbnQ4X3QgKikgQkRDUl9BRERSRVNTID0gUkNDX0xTRV9PTjsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgUkNDX0xTRV9CeXBhc3M6DQogICAgICAvKiBTZXQgTFNFQllQIGFuZCBMU0VPTiBiaXRzICovDQogICAgICAqKF9fSU8gdWludDhfdCAqKSBCRENSX0FERFJFU1MgPSBSQ0NfTFNFX0J5cGFzcyB8IFJDQ19MU0VfT047DQogICAgICBicmVhazsNCiAgICBkZWZhdWx0Og0KICAgICAgYnJlYWs7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4NCiAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBMU0ksIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiANCiAgKiAgICAgICAgIExTSVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgTFNJIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuDQogICogICAgICAgICBiZSB1c2VkIHRvIGNsb2NrIHRoZSBJV0RHIGFuZC9vciB0aGUgUlRDLg0KICAqIEBub3RlICAgTFNJIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgdGhlIElXREcgaXMgcnVubmluZy4gIA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgTFNJLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQG5vdGUgICBXaGVuIHRoZSBMU0kgaXMgc3RvcHBlZCwgTFNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBMU0kgb3NjaWxsYXRvcg0KICAqICAgICAgICAgY2xvY2sgY3ljbGVzLiANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0xTSUNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIENTUl9MU0lPTl9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBmYWN0b3JzLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4NCiAgKiAgDQogICogQHBhcmFtICBSQ0NfUExMU291cmNlOiBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX1BMTFNvdXJjZV9IU0k6IEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQ0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfUExMU291cmNlX0hTRTogSFNFIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5DQogICogQG5vdGUgICBUaGlzIGNsb2NrIHNvdXJjZSAoUkNDX1BMTFNvdXJjZSkgaXMgY29tbW9uIGZvciB0aGUgbWFpbiBQTEwgYW5kIFBMTEkyUy4gIA0KICAqICANCiAgKiBAcGFyYW0gIFBMTE06IHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDYzLg0KICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExNIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTyBpbnB1dA0KICAqICAgICAgICAgZnJlcXVlbmN5IHJhbmdlcyBmcm9tIDEgdG8gMiBNSHouIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNlbGVjdCBhIGZyZXF1ZW5jeQ0KICAqICAgICAgICAgb2YgMiBNSHogdG8gbGltaXQgUExMIGppdHRlci4NCiAgKiAgDQogICogQHBhcmFtICBQTExOOiBzcGVjaWZpZXMgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2sNCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMTkyIGFuZCA0MzIuDQogICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTE4gcGFyYW1ldGVyIGNvcnJlY3RseSB0byBlbnN1cmUgdGhhdCB0aGUgVkNPDQogICogICAgICAgICBvdXRwdXQgZnJlcXVlbmN5IGlzIGJldHdlZW4gMTkyIGFuZCA0MzIgTUh6Lg0KICAqICAgDQogICogQHBhcmFtICBQTExQOiBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgbWFpbiBzeXN0ZW0gY2xvY2sgKFNZU0NMSykNCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSB7MiwgNCwgNiwgb3IgOH0uDQogICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTFAgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QgZXhjZWVkIDE2OCBNSHogb24NCiAgKiAgICAgICAgIHRoZSBTeXN0ZW0gY2xvY2sgZnJlcXVlbmN5Lg0KICAqICANCiAgKiBAcGFyYW0gIFBMTFE6IHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBPVEcgRlMsIFNESU8gYW5kIFJORyBjbG9ja3MNCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gNCBhbmQgMTUuDQogICogQG5vdGUgICBJZiB0aGUgVVNCIE9URyBGUyBpcyB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBoYXZlIHRvIHNldCB0aGUNCiAgKiAgICAgICAgIFBMTFEgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBoYXZlIDQ4IE1IeiBjbG9jayBmb3IgdGhlIFVTQi4gSG93ZXZlciwNCiAgKiAgICAgICAgIHRoZSBTRElPIGFuZCBSTkcgbmVlZCBhIGZyZXF1ZW5jeSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDQ4IE1IeiB0byB3b3JrDQogICogICAgICAgICBjb3JyZWN0bHkuDQogICogICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BMTENvbmZpZyh1aW50MzJfdCBSQ0NfUExMU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExQLCB1aW50MzJfdCBQTExRKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTF9TT1VSQ0UoUkNDX1BMTFNvdXJjZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTE1fVkFMVUUoUExMTSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTE5fVkFMVUUoUExMTikpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFBfVkFMVUUoUExMUCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFFfVkFMVUUoUExMUSkpOw0KDQogIFJDQy0+UExMQ0ZHUiA9IFBMTE0gfCAoUExMTiA8PCA2KSB8ICgoKFBMTFAgPj4gMSkgLTEpIDw8IDE2KSB8IChSQ0NfUExMU291cmNlKSB8DQogICAgICAgICAgICAgICAgIChQTExRIDw8IDI0KTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBtYWluIFBMTC4NCiAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBtYWluIFBMTCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIA0KICAqICAgICAgICAgUExMUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBQTEwgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4NCiAgKiAgICAgICAgIGJlIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4NCiAgKiBAbm90ZSAgIFRoZSBtYWluIFBMTCBjYW4gbm90IGJlIGRpc2FibGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQ0KICAqIEBub3RlICAgVGhlIG1haW4gUExMIGlzIGRpc2FibGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIG1haW4gUExMLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUExMQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgKihfX0lPIHVpbnQzMl90ICopIENSX1BMTE9OX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFBMTEkyUyBjbG9jayBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZmFjdG9ycy4NCiAgKiAgDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIFBMTEkyUyBpcyBkaXNhYmxlZC4NCiAgKiBAbm90ZSAgIFBMTEkyUyBjbG9jayBzb3VyY2UgaXMgY29tbW9uIHdpdGggdGhlIG1haW4gUExMIChjb25maWd1cmVkIGluIA0KICAqICAgICAgICAgUkNDX1BMTENvbmZpZyBmdW5jdGlvbiApICANCiAgKiAgICAgICAgICAgICANCiAgKiBAcGFyYW0gIFBMTEkyU046IHNwZWNpZmllcyB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTExJMlMgVkNPIG91dHB1dCBjbG9jaw0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxOTIgYW5kIDQzMi4NCiAgKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMSTJTTiBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGVuc3VyZSB0aGF0IHRoZSBWQ08gDQogICogICAgICAgICBvdXRwdXQgZnJlcXVlbmN5IGlzIGJldHdlZW4gMTkyIGFuZCA0MzIgTUh6Lg0KICAqICAgIA0KICAqIEBwYXJhbSAgUExMSTJTUjogc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIEkyUyBjbG9jaw0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAyIGFuZCA3Lg0KICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExJMlNSIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gbm90IGV4Y2VlZCAxOTIgTUh6DQogICogICAgICAgICBvbiB0aGUgSTJTIGNsb2NrIGZyZXF1ZW5jeS4NCiAgKiAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUExMSTJTQ29uZmlnKHVpbnQzMl90IFBMTEkyU04sIHVpbnQzMl90IFBMTEkyU1IpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTTl9WQUxVRShQTExJMlNOKSk7DQogIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTUl9WQUxVRShQTExJMlNSKSk7DQoNCiAgUkNDLT5QTExJMlNDRkdSID0gKFBMTEkyU04gPDwgNikgfCAoUExMSTJTUiA8PCAyOCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUExMSTJTLiANCiAgKiBAbm90ZSAgIFRoZSBQTExJMlMgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLiAgDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBQTExJMlMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19QTExJMlNDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAqKF9fSU8gdWludDMyX3QgKikgQ1JfUExMSTJTT05fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLg0KICAqIEBub3RlICAgSWYgYSBmYWlsdXJlIGlzIGRldGVjdGVkIG9uIHRoZSBIU0Ugb3NjaWxsYXRvciBjbG9jaywgdGhpcyBvc2NpbGxhdG9yDQogICogICAgICAgICBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGFuZCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHRvIGluZm9ybSB0aGUNCiAgKiAgICAgICAgIHNvZnR3YXJlIGFib3V0IHRoZSBmYWlsdXJlIChDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0LCBDU1NJKSwNCiAgKiAgICAgICAgIGFsbG93aW5nIHRoZSBNQ1UgdG8gcGVyZm9ybSByZXNjdWUgb3BlcmF0aW9ucy4gVGhlIENTU0kgaXMgbGlua2VkIHRvIA0KICAqICAgICAgICAgdGhlIENvcnRleC1NNCBOTUkgKE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHQpIGV4Y2VwdGlvbiB2ZWN0b3IuICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4NCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19DbG9ja1NlY3VyaXR5U3lzdGVtQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgKihfX0lPIHVpbnQzMl90ICopIENSX0NTU09OX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMSBwaW4oUEE4KS4NCiAgKiBAbm90ZSAgIFBBOCBzaG91bGQgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZS4NCiAgKiBAcGFyYW0gIFJDQ19NQ08xU291cmNlOiBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzFTb3VyY2VfSFNJOiBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPMSBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzFTb3VyY2VfTFNFOiBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPMSBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzFTb3VyY2VfSFNFOiBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPMSBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzFTb3VyY2VfUExMQ0xLOiBtYWluIFBMTCBjbG9jayBzZWxlY3RlZCBhcyBNQ08xIHNvdXJjZQ0KICAqIEBwYXJhbSAgUkNDX01DTzFEaXY6IHNwZWNpZmllcyB0aGUgTUNPMSBwcmVzY2FsZXIuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzFEaXZfMTogbm8gZGl2aXNpb24gYXBwbGllZCB0byBNQ08xIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08xRGl2XzI6IGRpdmlzaW9uIGJ5IDIgYXBwbGllZCB0byBNQ08xIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08xRGl2XzM6IGRpdmlzaW9uIGJ5IDMgYXBwbGllZCB0byBNQ08xIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08xRGl2XzQ6IGRpdmlzaW9uIGJ5IDQgYXBwbGllZCB0byBNQ08xIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08xRGl2XzU6IGRpdmlzaW9uIGJ5IDUgYXBwbGllZCB0byBNQ08xIGNsb2NrDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19NQ08xQ29uZmlnKHVpbnQzMl90IFJDQ19NQ08xU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPMURpdikNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPMVNPVVJDRShSQ0NfTUNPMVNvdXJjZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTzFESVYoUkNDX01DTzFEaXYpKTsgIA0KDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCg0KICAvKiBDbGVhciBNQ08xWzE6MF0gYW5kIE1DTzFQUkVbMjowXSBiaXRzICovDQogIHRtcHJlZyAmPSBDRkdSX01DTzFfUkVTRVRfTUFTSzsNCg0KICAvKiBTZWxlY3QgTUNPMSBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlciAqLw0KICB0bXByZWcgfD0gUkNDX01DTzFTb3VyY2UgfCBSQ0NfTUNPMURpdjsNCg0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q0ZHUiA9IHRtcHJlZzsgIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMiBwaW4oUEM5KS4NCiAgKiBAbm90ZSAgIFBDOSBzaG91bGQgYmUgY29uZmlndXJlZCBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZS4NCiAgKiBAcGFyYW0gIFJDQ19NQ08yU291cmNlOiBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzJTb3VyY2VfU1lTQ0xLOiBTeXN0ZW0gY2xvY2sgKFNZU0NMSykgc2VsZWN0ZWQgYXMgTUNPMiBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzJTb3VyY2VfUExMSTJTQ0xLOiBQTExJMlMgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPMiBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzJTb3VyY2VfSFNFOiBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPMiBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzJTb3VyY2VfUExMQ0xLOiBtYWluIFBMTCBjbG9jayBzZWxlY3RlZCBhcyBNQ08yIHNvdXJjZQ0KICAqIEBwYXJhbSAgUkNDX01DTzJEaXY6IHNwZWNpZmllcyB0aGUgTUNPMiBwcmVzY2FsZXIuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX01DTzJEaXZfMTogbm8gZGl2aXNpb24gYXBwbGllZCB0byBNQ08yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08yRGl2XzI6IGRpdmlzaW9uIGJ5IDIgYXBwbGllZCB0byBNQ08yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08yRGl2XzM6IGRpdmlzaW9uIGJ5IDMgYXBwbGllZCB0byBNQ08yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08yRGl2XzQ6IGRpdmlzaW9uIGJ5IDQgYXBwbGllZCB0byBNQ08yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19NQ08yRGl2XzU6IGRpdmlzaW9uIGJ5IDUgYXBwbGllZCB0byBNQ08yIGNsb2NrDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19NQ08yQ29uZmlnKHVpbnQzMl90IFJDQ19NQ08yU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPMkRpdikNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfTUNPMlNPVVJDRShSQ0NfTUNPMlNvdXJjZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTzJESVYoUkNDX01DTzJEaXYpKTsNCiAgDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCiAgDQogIC8qIENsZWFyIE1DTzIgYW5kIE1DTzJQUkVbMjowXSBiaXRzICovDQogIHRtcHJlZyAmPSBDRkdSX01DTzJfUkVTRVRfTUFTSzsNCg0KICAvKiBTZWxlY3QgTUNPMiBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlciAqLw0KICB0bXByZWcgfD0gUkNDX01DTzJTb3VyY2UgfCBSQ0NfTUNPMkRpdjsNCg0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q0ZHUiA9IHRtcHJlZzsgIA0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFJDQ19Hcm91cDIgU3lzdGVtIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAqICBAYnJpZWYgICBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAqDQpAdmVyYmF0aW0gICANCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNzZXMgY2xvY2tzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQoNCiAgVGhpcyBzZWN0aW9uIHByb3ZpZGUgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgU3lzdGVtLCBBSEIsIEFQQjEgYW5kIA0KICBBUEIyIGJ1c3NlcyBjbG9ja3MuDQogIA0KICAxLiBTZXZlcmFsIGNsb2NrIHNvdXJjZXMgY2FuIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jayAoU1lTQ0xLKTogSFNJLA0KICAgICBIU0UgYW5kIFBMTC4NCiAgICAgVGhlIEFIQiBjbG9jayAoSENMSykgaXMgZGVyaXZlZCBmcm9tIFN5c3RlbSBjbG9jayB0aHJvdWdoIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXINCiAgICAgYW5kIHVzZWQgdG8gY2xvY2sgdGhlIENQVSwgbWVtb3J5IGFuZCBwZXJpcGhlcmFscyBtYXBwZWQgb24gQUhCIGJ1cyAoRE1BLCBHUElPLi4uKS4NCiAgICAgQVBCMSAoUENMSzEpIGFuZCBBUEIyIChQQ0xLMikgY2xvY2tzIGFyZSBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHRocm91Z2ggDQogICAgIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXJzIGFuZCB1c2VkIHRvIGNsb2NrIHRoZSBwZXJpcGhlcmFscyBtYXBwZWQgb24gdGhlc2UgYnVzc2VzLg0KICAgICBZb3UgY2FuIHVzZSAiUkNDX0dldENsb2Nrc0ZyZXEoKSIgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZXNlIGNsb2Nrcy4gIA0KDQpAbm90ZSBBbGwgdGhlIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFN5c3RlbSBjbG9jayAoU1lTQ0xLKSBleGNlcHQ6DQogICAgICAgLSBJMlM6IHRoZSBJMlMgY2xvY2sgY2FuIGJlIGRlcml2ZWQgZWl0aGVyIGZyb20gYSBzcGVjaWZpYyBQTEwgKFBMTEkyUykgb3INCiAgICAgICAgICBmcm9tIGFuIGV4dGVybmFsIGNsb2NrIG1hcHBlZCBvbiB0aGUgSTJTX0NLSU4gcGluLiANCiAgICAgICAgICBZb3UgaGF2ZSB0byB1c2UgUkNDX0kyU0NMS0NvbmZpZygpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0aGlzIGNsb2NrLiANCiAgICAgICAtIFJUQzogdGhlIFJUQyBjbG9jayBjYW4gYmUgZGVyaXZlZCBlaXRoZXIgZnJvbSB0aGUgTFNJLCBMU0Ugb3IgSFNFIGNsb2NrDQogICAgICAgICAgZGl2aWRlZCBieSAyIHRvIDMxLiBZb3UgaGF2ZSB0byB1c2UgUkNDX1JUQ0NMS0NvbmZpZygpIGFuZCBSQ0NfUlRDQ0xLQ21kKCkNCiAgICAgICAgICBmdW5jdGlvbnMgdG8gY29uZmlndXJlIHRoaXMgY2xvY2suIA0KICAgICAgIC0gVVNCIE9URyBGUywgU0RJTyBhbmQgUlRDOiBVU0IgT1RHIEZTIHJlcXVpcmUgYSBmcmVxdWVuY3kgZXF1YWwgdG8gNDggTUh6DQogICAgICAgICAgdG8gd29yayBjb3JyZWN0bHksIHdoaWxlIHRoZSBTRElPIHJlcXVpcmUgYSBmcmVxdWVuY3kgZXF1YWwgb3IgbG93ZXIgdGhhbg0KICAgICAgICAgIHRvIDQ4LiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgb2YgdGhlIG1haW4gUExMIHRocm91Z2ggUExMUSBkaXZpZGVyLg0KICAgICAgIC0gSVdERyBjbG9jayB3aGljaCBpcyBhbHdheXMgdGhlIExTSSBjbG9jay4NCiAgICAgICANCiAgMi4gVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEsgYW5kIEhDTEsgaXMgMTY4IE1IeiwgUENMSzIgODIgTUh6IGFuZCBQQ0xLMSA0MiBNSHouDQogICAgIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBzaG91bGQgYmUgDQogICAgIGFkYXB0ZWQgYWNjb3JkaW5nbHk6DQogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICANCiB8IExhdGVuY3kgICAgICAgfCAgICAgICAgICAgICAgICBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoTUh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiB8ICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgIA0KIHwgICAgICAgICAgICAgICB8IHZvbHRhZ2UgcmFuZ2UgIHwgdm9sdGFnZSByYW5nZSAgfCB2b2x0YWdlIHJhbmdlICAgfCB2b2x0YWdlIHJhbmdlICAgfA0KIHwgICAgICAgICAgICAgICB8IDIuNyBWIC0gMy42IFYgIHwgMi40IFYgLSAyLjcgViAgfCAyLjEgViAtIDIuNCBWICAgfCAxLjggViAtIDIuMSBWICAgfA0KIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgDQogfDBXUygxQ1BVIGN5Y2xlKXwwIDwgSENMSyA8PSAzMCAgfDAgPCBIQ0xLIDw9IDI0ICB8MCA8IEhDTEsgPD0gMTggICB8MCA8IEhDTEsgPD0gMTYgICB8DQogfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18ICAgDQogfDFXUygyQ1BVIGN5Y2xlKXwzMCA8IEhDTEsgPD0gNjAgfDI0IDwgSENMSyA8PSA0OCB8MTggPCBIQ0xLIDw9IDM2ICB8MTYgPCBIQ0xLIDw9IDMyICB8IA0KIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCAgIA0KIHwyV1MoM0NQVSBjeWNsZSl8NjAgPCBIQ0xLIDw9IDkwIHw0OCA8IEhDTEsgPD0gNzIgfDM2IDwgSENMSyA8PSA1NCAgfDMyIDwgSENMSyA8PSA0OCAgfA0KIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCANCiB8M1dTKDRDUFUgY3ljbGUpfDkwIDwgSENMSyA8PSAxMjB8NzIgPCBIQ0xLIDw9IDk2IHw1NCA8IEhDTEsgPD0gNzIgIHw0OCA8IEhDTEsgPD0gNjQgIHwNCiB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwgDQogfDRXUyg1Q1BVIGN5Y2xlKXwxMjA8IEhDTEsgPD0gMTUwfDk2IDwgSENMSyA8PSAxMjB8NzIgPCBIQ0xLIDw9IDkwICB8NjQgPCBIQ0xLIDw9IDgwICB8DQogfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18IA0KIHw1V1MoNkNQVSBjeWNsZSl8MTIwPCBIQ0xLIDw9IDE2OHwxMjA8IEhDTEsgPD0gMTQ0fDkwIDwgSENMSyA8PSAxMDggfDgwIDwgSENMSyA8PSA5NiAgfCANCiB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwgDQogfDZXUyg3Q1BVIGN5Y2xlKXwgICAgICBOQSAgICAgICAgfDE0NDwgSENMSyA8PSAxNjh8MTA4IDwgSENMSyA8PSAxMjB8OTYgPCBIQ0xLIDw9IDExMiB8IA0KIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCANCiB8N1dTKDhDUFUgY3ljbGUpfCAgICAgIE5BICAgICAgICB8ICAgICAgTkEgICAgICAgIHwxMjAgPCBIQ0xLIDw9IDEzOHwxMTIgPCBIQ0xLIDw9IDEyMHwgDQogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgIA0KICAgQG5vdGUgV2hlbiBWT1MgYml0IChpbiBQV1JfQ1IgcmVnaXN0ZXIpIGlzIHJlc2V0IHRvICcwkiwgdGhlIG1heGltdW0gdmFsdWUgb2YgSENMSyBpcyAxNDQgTUh6Lg0KICAgICAgICAgWW91IGNhbiB1c2UgUFdSX01haW5SZWd1bGF0b3JNb2RlQ29uZmlnKCkgZnVuY3Rpb24gdG8gc2V0IG9yIHJlc2V0IHRoaXMgYml0Lg0KDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4NCiAgKiBAbm90ZSAgIFRoZSBIU0kgaXMgdXNlZCAoZW5hYmxlZCBieSBoYXJkd2FyZSkgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSBhZnRlcg0KICAqICAgICAgICAgc3RhcnR1cCBmcm9tIFJlc2V0LCB3YWtlLXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlLCBvciBpbiBjYXNlDQogICogICAgICAgICBvZiBmYWlsdXJlIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzIHN5c3RlbSBjbG9jaw0KICAqICAgICAgICAgKGlmIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLg0KICAqIEBub3RlICAgQSBzd2l0Y2ggZnJvbSBvbmUgY2xvY2sgc291cmNlIHRvIGFub3RoZXIgb2NjdXJzIG9ubHkgaWYgdGhlIHRhcmdldA0KICAqICAgICAgICAgY2xvY2sgc291cmNlIGlzIHJlYWR5IChjbG9jayBzdGFibGUgYWZ0ZXIgc3RhcnR1cCBkZWxheSBvciBQTEwgbG9ja2VkKS4gDQogICogICAgICAgICBJZiBhIGNsb2NrIHNvdXJjZSB3aGljaCBpcyBub3QgeWV0IHJlYWR5IGlzIHNlbGVjdGVkLCB0aGUgc3dpdGNoIHdpbGwNCiAgKiAgICAgICAgIG9jY3VyIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSB3aWxsIGJlIHJlYWR5LiANCiAgKiAgICAgICAgIFlvdSBjYW4gdXNlIFJDQ19HZXRTWVNDTEtTb3VyY2UoKSBmdW5jdGlvbiB0byBrbm93IHdoaWNoIGNsb2NrIGlzDQogICogICAgICAgICBjdXJyZW50bHkgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiANCiAgKiBAcGFyYW0gIFJDQ19TWVNDTEtTb3VyY2U6IHNwZWNpZmllcyB0aGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19TWVNDTEtTb3VyY2VfSFNJOiAgICBIU0kgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQ0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfU1lTQ0xLU291cmNlX0hTRTogICAgSFNFIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX1NZU0NMS1NvdXJjZV9QTExDTEs6IFBMTCBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19TWVNDTEtDb25maWcodWludDMyX3QgUkNDX1NZU0NMS1NvdXJjZSkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NZU0NMS19TT1VSQ0UoUkNDX1NZU0NMS1NvdXJjZSkpOw0KDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCg0KICAvKiBDbGVhciBTV1sxOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IH5SQ0NfQ0ZHUl9TVzsNCg0KICAvKiBTZXQgU1dbMTowXSBiaXRzIGFjY29yZGluZyB0byBSQ0NfU1lTQ0xLU291cmNlIHZhbHVlICovDQogIHRtcHJlZyB8PSBSQ0NfU1lTQ0xLU291cmNlOw0KDQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGNsb2NrIHNvdXJjZSB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lDQogICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nOg0KICAqICAgICAgICAgICAgICAtIDB4MDA6IEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqICAgICAgICAgICAgICAtIDB4MDQ6IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqICAgICAgICAgICAgICAtIDB4MDg6IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqLw0KdWludDhfdCBSQ0NfR2V0U1lTQ0xLU291cmNlKHZvaWQpDQp7DQogIHJldHVybiAoKHVpbnQ4X3QpKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1NXUykpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEFIQiBjbG9jayAoSENMSykuDQogICogQG5vdGUgICBEZXBlbmRpbmcgb24gdGhlIGRldmljZSB2b2x0YWdlIHJhbmdlLCB0aGUgc29mdHdhcmUgaGFzIHRvIHNldCBjb3JyZWN0bHkNCiAgKiAgICAgICAgIHRoZXNlIGJpdHMgdG8gZW5zdXJlIHRoYXQgSENMSyBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJlcXVlbmN5DQogICogICAgICAgICAoZm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBzZWN0aW9uIGFib3ZlDQogICogICAgICAgICAgICJDUFUsIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMiKQ0KICAqIEBwYXJhbSAgUkNDX1NZU0NMSzogZGVmaW5lcyB0aGUgQUhCIGNsb2NrIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIA0KICAqICAgICAgICAgdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjE6IEFIQiBjbG9jayA9IFNZU0NMSw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjI6IEFIQiBjbG9jayA9IFNZU0NMSy8yDQogICogICAgICAgICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2NDogQUhCIGNsb2NrID0gU1lTQ0xLLzQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX1NZU0NMS19EaXY4OiBBSEIgY2xvY2sgPSBTWVNDTEsvOA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjE2OiBBSEIgY2xvY2sgPSBTWVNDTEsvMTYNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX1NZU0NMS19EaXY2NDogQUhCIGNsb2NrID0gU1lTQ0xLLzY0DQogICogICAgICAgICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2MTI4OiBBSEIgY2xvY2sgPSBTWVNDTEsvMTI4DQogICogICAgICAgICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2MjU2OiBBSEIgY2xvY2sgPSBTWVNDTEsvMjU2DQogICogICAgICAgICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2NTEyOiBBSEIgY2xvY2sgPSBTWVNDTEsvNTEyDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19IQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19TWVNDTEspDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hDTEsoUkNDX1NZU0NMSykpOw0KDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCg0KICAvKiBDbGVhciBIUFJFWzM6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gflJDQ19DRkdSX0hQUkU7DQoNCiAgLyogU2V0IEhQUkVbMzowXSBiaXRzIGFjY29yZGluZyB0byBSQ0NfU1lTQ0xLIHZhbHVlICovDQogIHRtcHJlZyB8PSBSQ0NfU1lTQ0xLOw0KDQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgTG93IFNwZWVkIEFQQiBjbG9jayAoUENMSzEpLg0KICAqIEBwYXJhbSAgUkNDX0hDTEs6IGRlZmluZXMgdGhlIEFQQjEgY2xvY2sgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gDQogICogICAgICAgICB0aGUgQUhCIGNsb2NrIChIQ0xLKS4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSENMS19EaXYxOiAgQVBCMSBjbG9jayA9IEhDTEsNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0hDTEtfRGl2MjogIEFQQjEgY2xvY2sgPSBIQ0xLLzINCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0hDTEtfRGl2NDogIEFQQjEgY2xvY2sgPSBIQ0xLLzQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0hDTEtfRGl2ODogIEFQQjEgY2xvY2sgPSBIQ0xLLzgNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0hDTEtfRGl2MTY6IEFQQjEgY2xvY2sgPSBIQ0xLLzE2DQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19QQ0xLMUNvbmZpZyh1aW50MzJfdCBSQ0NfSENMSykNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0hDTEspKTsNCg0KICB0bXByZWcgPSBSQ0MtPkNGR1I7DQoNCiAgLyogQ2xlYXIgUFBSRTFbMjowXSBiaXRzICovDQogIHRtcHJlZyAmPSB+UkNDX0NGR1JfUFBSRTE7DQoNCiAgLyogU2V0IFBQUkUxWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUkNDX0hDTEsgdmFsdWUgKi8NCiAgdG1wcmVnIHw9IFJDQ19IQ0xLOw0KDQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEhpZ2ggU3BlZWQgQVBCIGNsb2NrIChQQ0xLMikuDQogICogQHBhcmFtICBSQ0NfSENMSzogZGVmaW5lcyB0aGUgQVBCMiBjbG9jayBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSANCiAgKiAgICAgICAgIHRoZSBBSEIgY2xvY2sgKEhDTEspLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19IQ0xLX0RpdjE6ICBBUEIyIGNsb2NrID0gSENMSw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSENMS19EaXYyOiAgQVBCMiBjbG9jayA9IEhDTEsvMg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSENMS19EaXY0OiAgQVBCMiBjbG9jayA9IEhDTEsvNA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSENMS19EaXY4OiAgQVBCMiBjbG9jayA9IEhDTEsvOA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSENMS19EaXYxNjogQVBCMiBjbG9jayA9IEhDTEsvMTYNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BDTEsyQ29uZmlnKHVpbnQzMl90IFJDQ19IQ0xLKQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfUENMSyhSQ0NfSENMSykpOw0KDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCg0KICAvKiBDbGVhciBQUFJFMlsyOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IH5SQ0NfQ0ZHUl9QUFJFMjsNCg0KICAvKiBTZXQgUFBSRTJbMjowXSBiaXRzIGFjY29yZGluZyB0byBSQ0NfSENMSyB2YWx1ZSAqLw0KICB0bXByZWcgfD0gUkNDX0hDTEsgPDwgMzsNCg0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q0ZHUiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBmcmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgb24gY2hpcCBjbG9ja3M7IFNZU0NMSywgSENMSywgDQogICogICAgICAgICBQQ0xLMSBhbmQgUENMSzIuICAgICAgIA0KICAqIA0KICAqIEBub3RlICAgVGhlIHN5c3RlbSBmcmVxdWVuY3kgY29tcHV0ZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhlIHJlYWwgDQogICogICAgICAgICBmcmVxdWVuY3kgaW4gdGhlIGNoaXAuIEl0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHByZWRlZmluZWQgDQogICogICAgICAgICBjb25zdGFudCBhbmQgdGhlIHNlbGVjdGVkIGNsb2NrIHNvdXJjZToNCiAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTSV9WQUxVRSgqKQ0KICAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIEhTRSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gSFNFX1ZBTFVFKCoqKQ0KICAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIFBMTCwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gSFNFX1ZBTFVFKCoqKSANCiAgKiAgICAgICAgICAgb3IgSFNJX1ZBTFVFKCopIG11bHRpcGxpZWQvZGl2aWRlZCBieSB0aGUgUExMIGZhY3RvcnMuICAgICAgICAgDQogICogQG5vdGUgICAgICgqKSBIU0lfVkFMVUUgaXMgYSBjb25zdGFudCBkZWZpbmVkIGluIHN0bTMyZjR4eC5oIGZpbGUgKGRlZmF1bHQgdmFsdWUNCiAgKiAgICAgICAgICAgICAgIDE2IE1IeikgYnV0IHRoZSByZWFsIHZhbHVlIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgdmFyaWF0aW9ucw0KICAqICAgICAgICAgICAgICAgaW4gdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUuDQogICogQG5vdGUgICAgICgqKikgSFNFX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiBzdG0zMmY0eHguaCBmaWxlIChkZWZhdWx0IHZhbHVlDQogICogICAgICAgICAgICAgICAgMjUgTUh6KSwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQgSFNFX1ZBTFVFIGlzIHNhbWUgYXMgdGhlIHJlYWwNCiAgKiAgICAgICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heQ0KICAqICAgICAgICAgICAgICAgIGhhdmUgd3JvbmcgcmVzdWx0Lg0KICAqICAgICAgICAgICAgICAgIA0KICAqIEBub3RlICAgVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG5vdCBjb3JyZWN0IHdoZW4gdXNpbmcgZnJhY3Rpb25hbA0KICAqICAgICAgICAgdmFsdWUgZm9yIEhTRSBjcnlzdGFsLg0KICAqICAgDQogICogQHBhcmFtICBSQ0NfQ2xvY2tzOiBwb2ludGVyIHRvIGEgUkNDX0Nsb2Nrc1R5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgaG9sZA0KICAqICAgICAgICAgIHRoZSBjbG9ja3MgZnJlcXVlbmNpZXMuDQogICogICAgIA0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjb21wdXRlIHRoZSANCiAgKiAgICAgICAgIGJhdWRyYXRlIGZvciB0aGUgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyBvciBjb25maWd1cmUgb3RoZXIgcGFyYW1ldGVycy4NCiAgKiBAbm90ZSAgIEVhY2ggdGltZSBTWVNDTEssIEhDTEssIFBDTEsxIGFuZC9vciBQQ0xLMiBjbG9jayBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uDQogICogICAgICAgICBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZSdzIGZpZWxkLiBPdGhlcndpc2UsIGFueQ0KICAqICAgICAgICAgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0Lg0KICAqICAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfR2V0Q2xvY2tzRnJlcShSQ0NfQ2xvY2tzVHlwZURlZiogUkNDX0Nsb2NrcykNCnsNCiAgdWludDMyX3QgdG1wID0gMCwgcHJlc2MgPSAwLCBwbGx2Y28gPSAwLCBwbGxwID0gMiwgcGxsc291cmNlID0gMCwgcGxsbSA9IDI7DQoNCiAgLyogR2V0IFNZU0NMSyBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcCA9IFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1NXUzsNCg0KICBzd2l0Y2ggKHRtcCkNCiAgew0KICAgIGNhc2UgMHgwMDogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8NCiAgICAgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSBIU0lfVkFMVUU7DQogICAgICBicmVhazsNCiAgICBjYXNlIDB4MDQ6ICAvKiBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgIHNvdXJjZSAqLw0KICAgICAgUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSA9IEhTRV9WQUxVRTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgMHgwODogIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovDQoNCiAgICAgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTE0pICogUExMTg0KICAgICAgICAgU1lTQ0xLID0gUExMX1ZDTyAvIFBMTFANCiAgICAgICAgICovICAgIA0KICAgICAgcGxsc291cmNlID0gKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFNSQykgPj4gMjI7DQogICAgICBwbGxtID0gUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMTTsNCiAgICAgIA0KICAgICAgaWYgKHBsbHNvdXJjZSAhPSAwKQ0KICAgICAgew0KICAgICAgICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovDQogICAgICAgIHBsbHZjbyA9IChIU0VfVkFMVUUgLyBwbGxtKSAqICgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMTikgPj4gNik7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8NCiAgICAgICAgcGxsdmNvID0gKEhTSV9WQUxVRSAvIHBsbG0pICogKChSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExOKSA+PiA2KTsgICAgICANCiAgICAgIH0NCg0KICAgICAgcGxscCA9ICgoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFApID4+MTYpICsgMSApICoyOw0KICAgICAgUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSA9IHBsbHZjby9wbGxwOw0KICAgICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSBIU0lfVkFMVUU7DQogICAgICBicmVhazsNCiAgfQ0KICAvKiBDb21wdXRlIEhDTEssIFBDTEsxIGFuZCBQQ0xLMiBjbG9ja3MgZnJlcXVlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KICAvKiBHZXQgSENMSyBwcmVzY2FsZXIgKi8NCiAgdG1wID0gUkNDLT5DRkdSICYgUkNDX0NGR1JfSFBSRTsNCiAgdG1wID0gdG1wID4+IDQ7DQogIHByZXNjID0gQVBCQUhCUHJlc2NUYWJsZVt0bXBdOw0KICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLw0KICBSQ0NfQ2xvY2tzLT5IQ0xLX0ZyZXF1ZW5jeSA9IFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPj4gcHJlc2M7DQoNCiAgLyogR2V0IFBDTEsxIHByZXNjYWxlciAqLw0KICB0bXAgPSBSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMTsNCiAgdG1wID0gdG1wID4+IDEwOw0KICBwcmVzYyA9IEFQQkFIQlByZXNjVGFibGVbdG1wXTsNCiAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovDQogIFJDQ19DbG9ja3MtPlBDTEsxX0ZyZXF1ZW5jeSA9IFJDQ19DbG9ja3MtPkhDTEtfRnJlcXVlbmN5ID4+IHByZXNjOw0KDQogIC8qIEdldCBQQ0xLMiBwcmVzY2FsZXIgKi8NCiAgdG1wID0gUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTI7DQogIHRtcCA9IHRtcCA+PiAxMzsNCiAgcHJlc2MgPSBBUEJBSEJQcmVzY1RhYmxlW3RtcF07DQogIC8qIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLw0KICBSQ0NfQ2xvY2tzLT5QQ0xLMl9GcmVxdWVuY3kgPSBSQ0NfQ2xvY2tzLT5IQ0xLX0ZyZXF1ZW5jeSA+PiBwcmVzYzsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NfR3JvdXAzIFBlcmlwaGVyYWwgY2xvY2tzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBjbG9ja3MgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgIFBlcmlwaGVyYWwgY2xvY2tzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQoNCiAgVGhpcyBzZWN0aW9uIHByb3ZpZGUgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgUGVyaXBoZXJhbCBjbG9ja3MuIA0KICANCiAgMS4gVGhlIFJUQyBjbG9jayB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlIExTSSwgTFNFIG9yIEhTRSBjbG9jayBkaXZpZGVkIGJ5IDIgdG8gMzEuDQogICAgIA0KICAyLiBBZnRlciByZXN0YXJ0IGZyb20gUmVzZXQgb3Igd2FrZXVwIGZyb20gU1RBTkRCWSwgYWxsIHBlcmlwaGVyYWxzIGFyZSBvZmYNCiAgICAgZXhjZXB0IGludGVybmFsIFNSQU0sIEZsYXNoIGFuZCBKVEFHLiBCZWZvcmUgdG8gc3RhcnQgdXNpbmcgYSBwZXJpcGhlcmFsIHlvdQ0KICAgICBoYXZlIHRvIGVuYWJsZSBpdHMgaW50ZXJmYWNlIGNsb2NrLiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgUkNDX0FIQlBlcmlwaENsb2NrQ21kKCkNCiAgICAgLCBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKCkgYW5kIFJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoKSBmdW5jdGlvbnMuDQoNCiAgMy4gVG8gcmVzZXQgdGhlIHBlcmlwaGVyYWxzIGNvbmZpZ3VyYXRpb24gKHRvIHRoZSBkZWZhdWx0IHN0YXRlIGFmdGVyIGRldmljZSByZXNldCkNCiAgICAgeW91IGNhbiB1c2UgUkNDX0FIQlBlcmlwaFJlc2V0Q21kKCksIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoKSBhbmQgDQogICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoKSBmdW5jdGlvbnMuDQogICAgIA0KICA0LiBUbyBmdXJ0aGVyIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbiBpbiBTTEVFUCBtb2RlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyBjYW4NCiAgICAgYmUgZGlzYWJsZWQgcHJpb3IgdG8gZXhlY3V0aW5nIHRoZSBXRkkgb3IgV0ZFIGluc3RydWN0aW9ucy4gWW91IGNhbiBkbyB0aGlzDQogICAgIHVzaW5nIFJDQ19BSEJQZXJpcGhDbG9ja0xQTW9kZUNtZCgpLCBSQ0NfQVBCMlBlcmlwaENsb2NrTFBNb2RlQ21kKCkgYW5kDQogICAgIFJDQ19BUEIxUGVyaXBoQ2xvY2tMUE1vZGVDbWQoKSBmdW5jdGlvbnMuICANCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBSVEMgY2xvY2sgKFJUQ0NMSykuDQogICogQG5vdGUgICBBcyB0aGUgUlRDIGNsb2NrIGNvbmZpZ3VyYXRpb24gYml0cyBhcmUgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlDQogICogICAgICAgICBhY2Nlc3MgaXMgZGVuaWVkIHRvIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUNCiAgKiAgICAgICAgIGFjY2VzcyB1c2luZyBQV1JfQmFja3VwQWNjZXNzQ21kKEVOQUJMRSkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZQ0KICAqICAgICAgICAgdGhlIFJUQyBjbG9jayBzb3VyY2UgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuICAgIA0KICAqIEBub3RlICAgT25jZSB0aGUgUlRDIGNsb2NrIGlzIGNvbmZpZ3VyZWQgaXQgY2FuJ3QgYmUgY2hhbmdlZCB1bmxlc3MgdGhlICANCiAgKiAgICAgICAgIEJhY2t1cCBkb21haW4gaXMgcmVzZXQgdXNpbmcgUkNDX0JhY2t1cFJlc2V0Q21kKCkgZnVuY3Rpb24sIG9yIGJ5DQogICogICAgICAgICBhIFBvd2VyIE9uIFJlc2V0IChQT1IpLg0KICAqICAgIA0KICAqIEBwYXJhbSAgUkNDX1JUQ0NMS1NvdXJjZTogc3BlY2lmaWVzIHRoZSBSVEMgY2xvY2sgc291cmNlLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19SVENDTEtTb3VyY2VfTFNFOiBMU0Ugc2VsZWN0ZWQgYXMgUlRDIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19SVENDTEtTb3VyY2VfTFNJOiBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19SVENDTEtTb3VyY2VfSFNFX0Rpdng6IEhTRSBjbG9jayBkaXZpZGVkIGJ5IHggc2VsZWN0ZWQNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgUlRDIGNsb2NrLCB3aGVyZSB4OlsyLDMxXQ0KICAqICANCiAgKiBAbm90ZSAgIElmIHRoZSBMU0Ugb3IgTFNJIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQyBjb250aW51ZXMgdG8NCiAgKiAgICAgICAgIHdvcmsgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2RlcywgYW5kIGNhbiBiZSB1c2VkIGFzIHdha2V1cCBzb3VyY2UuDQogICogICAgICAgICBIb3dldmVyLCB3aGVuIHRoZSBIU0UgY2xvY2sgaXMgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlLCB0aGUgUlRDDQogICogICAgICAgICBjYW5ub3QgYmUgdXNlZCBpbiBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLiAgICANCiAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSBmb3IgUlRDIGlzIDFNSHogKHdoZW4gdXNpbmcgSFNFIGFzDQogICogICAgICAgICBSVEMgY2xvY2sgc291cmNlKS4NCiAgKiAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19SVENDTEtDb25maWcodWludDMyX3QgUkNDX1JUQ0NMS1NvdXJjZSkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1JUQ0NMS19TT1VSQ0UoUkNDX1JUQ0NMS1NvdXJjZSkpOw0KDQogIGlmICgoUkNDX1JUQ0NMS1NvdXJjZSAmIDB4MDAwMDAzMDApID09IDB4MDAwMDAzMDApDQogIHsgLyogSWYgSFNFIGlzIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UsIGNvbmZpZ3VyZSBIU0UgZGl2aXNpb24gZmFjdG9yIGZvciBSVEMgY2xvY2sgKi8NCiAgICB0bXByZWcgPSBSQ0MtPkNGR1I7DQoNCiAgICAvKiBDbGVhciBSVENQUkVbNDowXSBiaXRzICovDQogICAgdG1wcmVnICY9IH5SQ0NfQ0ZHUl9SVENQUkU7DQoNCiAgICAvKiBDb25maWd1cmUgSFNFIGRpdmlzaW9uIGZhY3RvciBmb3IgUlRDIGNsb2NrICovDQogICAgdG1wcmVnIHw9IChSQ0NfUlRDQ0xLU291cmNlICYgMHhGRkZGQ0ZGKTsNCg0KICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgICBSQ0MtPkNGR1IgPSB0bXByZWc7DQogIH0NCiAgICANCiAgLyogU2VsZWN0IHRoZSBSVEMgY2xvY2sgc291cmNlICovDQogIFJDQy0+QkRDUiB8PSAoUkNDX1JUQ0NMS1NvdXJjZSAmIDB4MDAwMDBGRkYpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFJUQyBjbG9jay4NCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgYWZ0ZXIgdGhlIFJUQyBjbG9jayBzb3VyY2Ugd2FzIHNlbGVjdGVkDQogICogICAgICAgICB1c2luZyB0aGUgUkNDX1JUQ0NMS0NvbmZpZyBmdW5jdGlvbi4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFJUQyBjbG9jay4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1JUQ0NMS0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIEJEQ1JfUlRDRU5fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIG9yIHJlbGVhc2VzIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0Lg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIFJUQyBwZXJpcGhlcmFsIChpbmNsdWRpbmcgdGhlIGJhY2t1cCByZWdpc3RlcnMpDQogICogICAgICAgICBhbmQgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGluIFJDQ19DU1IgcmVnaXN0ZXIuDQogICogQG5vdGUgICBUaGUgQktQU1JBTSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyByZXNldC4gICAgDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0Lg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19CYWNrdXBSZXNldENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogICooX19JTyB1aW50MzJfdCAqKSBCRENSX0JEUlNUX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEkyUyBjbG9jayBzb3VyY2UgKEkyU0NMSykuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgSTJTIEFQQiBjbG9jay4NCiAgKiBAcGFyYW0gIFJDQ19JMlNDTEtTb3VyY2U6IHNwZWNpZmllcyB0aGUgSTJTIGNsb2NrIHNvdXJjZS4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSTJTMkNMS1NvdXJjZV9QTExJMlM6IFBMTEkyUyBjbG9jayB1c2VkIGFzIEkyUyBjbG9jayBzb3VyY2UNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0kyUzJDTEtTb3VyY2VfRXh0OiBFeHRlcm5hbCBjbG9jayBtYXBwZWQgb24gdGhlIEkyU19DS0lOIHBpbg0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgSTJTIGNsb2NrIHNvdXJjZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfSTJTQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19JMlNDTEtTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfSTJTQ0xLX1NPVVJDRShSQ0NfSTJTQ0xLU291cmNlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIENGR1JfSTJTU1JDX0JCID0gUkNDX0kyU0NMS1NvdXJjZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2suDQogICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykNCiAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZSANCiAgKiAgICAgICAgIHVzaW5nIGl0LiAgIA0KICAqIEBwYXJhbSAgUkNDX0FIQlBlcmlwaDogc3BlY2lmaWVzIHRoZSBBSEIxIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9BOiAgICAgICBHUElPQSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPQjogICAgICAgR1BJT0IgY2xvY2sgDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9DOiAgICAgICBHUElPQyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPRDogICAgICAgR1BJT0QgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0U6ICAgICAgIEdQSU9FIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9GOiAgICAgICBHUElPRiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPRzogICAgICAgR1BJT0cgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0c6ICAgICAgIEdQSU9HIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9JOiAgICAgICBHUElPSSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9DUkM6ICAgICAgICAgQ1JDIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0JLUFNSQU06ICAgICBCS1BTUkFNIGludGVyZmFjZSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9DQ01EQVRBUkFNRU4gQ0NNIGRhdGEgUkFNIGludGVyZmFjZSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9ETUExOiAgICAgICAgRE1BMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9ETUEyOiAgICAgICAgRE1BMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9FVEhfTUFDOiAgICAgRXRoZXJuZXQgTUFDIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0VUSF9NQUNfVHg6ICBFdGhlcm5ldCBUcmFuc21pc3Npb24gY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRVRIX01BQ19SeDogIEV0aGVybmV0IFJlY2VwdGlvbiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9FVEhfTUFDX1BUUDogRXRoZXJuZXQgUFRQIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX09UR19IUzogICAgICBVU0IgT1RHIEhTIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX09UR19IU19VTFBJOiBVU0IgT1RHIEhTIFVMUEkgY2xvY2sNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19BSEIxUGVyaXBoQ2xvY2tDbWQodWludDMyX3QgUkNDX0FIQjFQZXJpcGgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BSEIxX0NMT0NLX1BFUklQSChSQ0NfQUhCMVBlcmlwaCkpOw0KDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BSEIxRU5SIHw9IFJDQ19BSEIxUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCMUVOUiAmPSB+UkNDX0FIQjFQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBSEIyIHBlcmlwaGVyYWwgY2xvY2suDQogICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykNCiAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZSANCiAgKiAgICAgICAgIHVzaW5nIGl0LiANCiAgKiBAcGFyYW0gIFJDQ19BSEJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCMiBwZXJpcGhlcmFsIHRvIGdhdGVzIGl0cyBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMlBlcmlwaF9EQ01JOiAgIERDTUkgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjJQZXJpcGhfQ1JZUDogICBDUllQIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIyUGVyaXBoX0hBU0g6ICAgSEFTSCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMlBlcmlwaF9STkc6ICAgIFJORyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMlBlcmlwaF9PVEdfRlM6IFVTQiBPVEcgRlMgY2xvY2sNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19BSEIyUGVyaXBoQ2xvY2tDbWQodWludDMyX3QgUkNDX0FIQjJQZXJpcGgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BSEIyX1BFUklQSChSQ0NfQUhCMlBlcmlwaCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BSEIyRU5SIHw9IFJDQ19BSEIyUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCMkVOUiAmPSB+UkNDX0FIQjJQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2suDQogICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykNCiAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZSANCiAgKiAgICAgICAgIHVzaW5nIGl0LiANCiAgKiBAcGFyYW0gIFJDQ19BSEJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCMyBwZXJpcGhlcmFsIHRvIGdhdGVzIGl0cyBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlOiBSQ0NfQUhCM1BlcmlwaF9GU01DDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCM1BlcmlwaENsb2NrQ21kKHVpbnQzMl90IFJDQ19BSEIzUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCM19QRVJJUEgoUkNDX0FIQjNQZXJpcGgpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BSEIzRU5SIHw9IFJDQ19BSEIzUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCM0VOUiAmPSB+UkNDX0FIQjNQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBMb3cgU3BlZWQgQVBCIChBUEIxKSBwZXJpcGhlcmFsIGNsb2NrLg0KICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpDQogICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUgDQogICogICAgICAgICB1c2luZyBpdC4gDQogICogQHBhcmFtICBSQ0NfQVBCMVBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIxIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTI6ICAgVElNMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0zOiAgIFRJTTMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNNDogICBUSU00IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTU6ICAgVElNNSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU02OiAgIFRJTTYgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNNzogICBUSU03IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTEyOiAgVElNMTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNMTM6ICBUSU0xMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0xNDogIFRJTTE0IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1dXREc6ICAgV1dERyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9TUEkyOiAgIFNQSTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfU1BJMzogICBTUEkzIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VTQVJUMjogVVNBUlQyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VTQVJUMzogVVNBUlQzIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VBUlQ0OiAgVUFSVDQgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVUFSVDU6ICBVQVJUNSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9JMkMxOiAgIEkyQzEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfSTJDMjogICBJMkMyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0kyQzM6ICAgSTJDMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9DQU4xOiAgIENBTjEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfQ0FOMjogICBDQU4yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1BXUjogICAgUFdSIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0RBQzogICAgREFDIGNsb2NrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQVBCMVBlcmlwaENsb2NrQ21kKHVpbnQzMl90IFJDQ19BUEIxUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQVBCMV9QRVJJUEgoUkNDX0FQQjFQZXJpcGgpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BUEIxRU5SIHw9IFJDQ19BUEIxUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QVBCMUVOUiAmPSB+UkNDX0FQQjFQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBIaWdoIFNwZWVkIEFQQiAoQVBCMikgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQ0KICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlIA0KICAqICAgICAgICAgdXNpbmcgaXQuDQogICogQHBhcmFtICBSQ0NfQVBCMlBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIyIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1RJTTE6ICAgVElNMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU04OiAgIFRJTTggY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVVNBUlQxOiBVU0FSVDEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVVNBUlQ2OiBVU0FSVDYgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfQURDMTogICBBREMxIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX0FEQzI6ICAgQURDMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9BREMzOiAgIEFEQzMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfU0RJTzogICBTRElPIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1NQSTE6ICAgU1BJMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9TWVNDRkc6IFNZU0NGRyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU05OiAgIFRJTTkgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVElNMTA6ICBUSU0xMCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU0xMTogIFRJTTExIGNsb2NrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKHVpbnQzMl90IFJDQ19BUEIyUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQVBCMl9QRVJJUEgoUkNDX0FQQjJQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJDQy0+QVBCMkVOUiB8PSBSQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjJFTlIgJj0gflJDQ19BUEIyUGVyaXBoOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIG9yIHJlbGVhc2VzIEFIQjEgcGVyaXBoZXJhbCByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19BSEIxUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFIQjEgcGVyaXBoZXJhbCB0byByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPQTogICBHUElPQSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPQjogICBHUElPQiBjbG9jayANCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0M6ICAgR1BJT0MgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0Q6ICAgR1BJT0QgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0U6ICAgR1BJT0UgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0Y6ICAgR1BJT0YgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0c6ICAgR1BJT0cgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0c6ICAgR1BJT0cgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0k6ICAgR1BJT0kgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfQ1JDOiAgICAgQ1JDIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0RNQTE6ICAgIERNQTEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRE1BMjogICAgRE1BMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9FVEhfTUFDOiBFdGhlcm5ldCBNQUMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfT1RHX0hTOiAgVVNCIE9URyBIUyBjbG9jaw0KICAqICAgICAgICAgICAgICAgICAgDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCMVBlcmlwaFJlc2V0Q21kKHVpbnQzMl90IFJDQ19BSEIxUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCMV9SRVNFVF9QRVJJUEgoUkNDX0FIQjFQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJDQy0+QUhCMVJTVFIgfD0gUkNDX0FIQjFQZXJpcGg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUkNDLT5BSEIxUlNUUiAmPSB+UkNDX0FIQjFQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBGb3JjZXMgb3IgcmVsZWFzZXMgQUhCMiBwZXJpcGhlcmFsIHJlc2V0Lg0KICAqIEBwYXJhbSAgUkNDX0FIQjJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCMiBwZXJpcGhlcmFsIHRvIHJlc2V0Lg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIyUGVyaXBoX0RDTUk6ICAgRENNSSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMlBlcmlwaF9DUllQOiAgIENSWVAgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjJQZXJpcGhfSEFTSDogICBIQVNIIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIyUGVyaXBoX1JORzogICAgUk5HIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIyUGVyaXBoX09UR19GUzogVVNCIE9URyBGUyBjbG9jaw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgcmVzZXQuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FIQjJQZXJpcGhSZXNldENtZCh1aW50MzJfdCBSQ0NfQUhCMlBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FIQjJfUEVSSVBIKFJDQ19BSEIyUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFIQjJSU1RSIHw9IFJDQ19BSEIyUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCMlJTVFIgJj0gflJDQ19BSEIyUGVyaXBoOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIG9yIHJlbGVhc2VzIEFIQjMgcGVyaXBoZXJhbCByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19BSEIzUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFIQjMgcGVyaXBoZXJhbCB0byByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlOiBSQ0NfQUhCM1BlcmlwaF9GU01DDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCM1BlcmlwaFJlc2V0Q21kKHVpbnQzMl90IFJDQ19BSEIzUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCM19QRVJJUEgoUkNDX0FIQjNQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJDQy0+QUhCM1JTVFIgfD0gUkNDX0FIQjNQZXJpcGg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUkNDLT5BSEIzUlNUUiAmPSB+UkNDX0FIQjNQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBGb3JjZXMgb3IgcmVsZWFzZXMgTG93IFNwZWVkIEFQQiAoQVBCMSkgcGVyaXBoZXJhbCByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19BUEIxUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFQQjEgcGVyaXBoZXJhbCB0byByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0yOiAgIFRJTTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNMzogICBUSU0zIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTQ6ICAgVElNNCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU01OiAgIFRJTTUgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNNjogICBUSU02IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTc6ICAgVElNNyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0xMjogIFRJTTEyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTEzOiAgVElNMTMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNMTQ6ICBUSU0xNCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9XV0RHOiAgIFdXREcgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfU1BJMjogICBTUEkyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1NQSTM6ICAgU1BJMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9VU0FSVDI6IFVTQVJUMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9VU0FSVDM6IFVTQVJUMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9VQVJUNDogIFVBUlQ0IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VBUlQ1OiAgVUFSVDUgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfSTJDMTogICBJMkMxIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0kyQzI6ICAgSTJDMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9JMkMzOiAgIEkyQzMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfQ0FOMTogICBDQU4xIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0NBTjI6ICAgQ0FOMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9QV1I6ICAgIFBXUiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9EQUM6ICAgIERBQyBjbG9jaw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgcmVzZXQuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FQQjFQZXJpcGhSZXNldENtZCh1aW50MzJfdCBSQ0NfQVBCMVBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FQQjFfUEVSSVBIKFJDQ19BUEIxUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BUEIxUlNUUiB8PSBSQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjFSU1RSICY9IH5SQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyBvciByZWxlYXNlcyBIaWdoIFNwZWVkIEFQQiAoQVBCMikgcGVyaXBoZXJhbCByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19BUEIyUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFQQjIgcGVyaXBoZXJhbCB0byByZXNldC4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU0xOiAgIFRJTTEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVElNODogICBUSU04IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1VTQVJUMTogVVNBUlQxIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1VTQVJUNjogVVNBUlQ2IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX0FEQzE6ICAgQURDMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9BREMyOiAgIEFEQzIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfQURDMzogICBBREMzIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1NESU86ICAgU0RJTyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9TUEkxOiAgIFNQSTEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfU1lTQ0ZHOiBTWVNDRkcgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVElNOTogICBUSU05IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1RJTTEwOiAgVElNMTAgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVElNMTE6ICBUSU0xMSBjbG9jaw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgcmVzZXQuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FQQjJQZXJpcGhSZXNldENtZCh1aW50MzJfdCBSQ0NfQVBCMlBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FQQjJfUkVTRVRfUEVSSVBIKFJDQ19BUEIyUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BUEIyUlNUUiB8PSBSQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjJSU1RSICY9IH5SQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEFIQjEgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4NCiAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UNCiAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLg0KICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4NCiAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4NCiAgKiBAcGFyYW0gIFJDQ19BSEJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCMSBwZXJpcGhlcmFsIHRvIGdhdGVzIGl0cyBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPQTogICAgICAgR1BJT0EgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0I6ICAgICAgIEdQSU9CIGNsb2NrIA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPQzogICAgICAgR1BJT0MgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0Q6ICAgICAgIEdQSU9EIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9FOiAgICAgICBHUElPRSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPRjogICAgICAgR1BJT0YgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfR1BJT0c6ICAgICAgIEdQSU9HIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0dQSU9HOiAgICAgICBHUElPRyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9HUElPSTogICAgICAgR1BJT0kgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfQ1JDOiAgICAgICAgIENSQyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9CS1BTUkFNOiAgICAgQktQU1JBTSBpbnRlcmZhY2UgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRE1BMTogICAgICAgIERNQTEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRE1BMjogICAgICAgIERNQTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRVRIX01BQzogICAgIEV0aGVybmV0IE1BQyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9FVEhfTUFDX1R4OiAgRXRoZXJuZXQgVHJhbnNtaXNzaW9uIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIxUGVyaXBoX0VUSF9NQUNfUng6ICBFdGhlcm5ldCBSZWNlcHRpb24gY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjFQZXJpcGhfRVRIX01BQ19QVFA6IEV0aGVybmV0IFBUUCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9PVEdfSFM6ICAgICAgVVNCIE9URyBIUyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMVBlcmlwaF9PVEdfSFNfVUxQSTogVVNCIE9URyBIUyBVTFBJIGNsb2NrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCMVBlcmlwaENsb2NrTFBNb2RlQ21kKHVpbnQzMl90IFJDQ19BSEIxUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCMV9MUE1PREVfUEVSSVBIKFJDQ19BSEIxUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BSEIxTFBFTlIgfD0gUkNDX0FIQjFQZXJpcGg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUkNDLT5BSEIxTFBFTlIgJj0gflJDQ19BSEIxUGVyaXBoOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLg0KICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQ0KICAqICAgICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4NCiAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uDQogICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuDQogICogQHBhcmFtICBSQ0NfQUhCUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFIQjIgcGVyaXBoZXJhbCB0byBnYXRlcyBpdHMgY2xvY2suDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjJQZXJpcGhfRENNSTogICBEQ01JIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BSEIyUGVyaXBoX0NSWVA6ICAgQ1JZUCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQUhCMlBlcmlwaF9IQVNIOiAgIEhBU0ggY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjJQZXJpcGhfUk5HOiAgICBSTkcgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FIQjJQZXJpcGhfT1RHX0ZTOiBVU0IgT1RHIEZTIGNsb2NrICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19BSEIyUGVyaXBoQ2xvY2tMUE1vZGVDbWQodWludDMyX3QgUkNDX0FIQjJQZXJpcGgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BSEIyX1BFUklQSChSQ0NfQUhCMlBlcmlwaCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJDQy0+QUhCMkxQRU5SIHw9IFJDQ19BSEIyUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCMkxQRU5SICY9IH5SQ0NfQUhCMlBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4NCiAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UNCiAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLg0KICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4NCiAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4NCiAgKiBAcGFyYW0gIFJDQ19BSEJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCMyBwZXJpcGhlcmFsIHRvIGdhdGVzIGl0cyBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlOiBSQ0NfQUhCM1BlcmlwaF9GU01DDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCM1BlcmlwaENsb2NrTFBNb2RlQ21kKHVpbnQzMl90IFJDQ19BSEIzUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCM19QRVJJUEgoUkNDX0FIQjNQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFIQjNMUEVOUiB8PSBSQ0NfQUhCM1BlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFIQjNMUEVOUiAmPSB+UkNDX0FIQjNQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuDQogICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlDQogICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4NCiAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uDQogICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuDQogICogQHBhcmFtICBSQ0NfQVBCMVBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIxIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTI6ICAgVElNMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0zOiAgIFRJTTMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNNDogICBUSU00IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTU6ICAgVElNNSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU02OiAgIFRJTTYgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNNzogICBUSU03IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1RJTTEyOiAgVElNMTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVElNMTM6ICBUSU0xMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0xNDogIFRJTTE0IGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1dXREc6ICAgV1dERyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9TUEkyOiAgIFNQSTIgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfU1BJMzogICBTUEkzIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VTQVJUMjogVVNBUlQyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VTQVJUMzogVVNBUlQzIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1VBUlQ0OiAgVUFSVDQgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfVUFSVDU6ICBVQVJUNSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9JMkMxOiAgIEkyQzEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfSTJDMjogICBJMkMyIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0kyQzM6ICAgSTJDMyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9DQU4xOiAgIENBTjEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjFQZXJpcGhfQ0FOMjogICBDQU4yIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX1BXUjogICAgUFdSIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIxUGVyaXBoX0RBQzogICAgREFDIGNsb2NrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQVBCMVBlcmlwaENsb2NrTFBNb2RlQ21kKHVpbnQzMl90IFJDQ19BUEIxUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQVBCMV9QRVJJUEgoUkNDX0FQQjFQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFQQjFMUEVOUiB8PSBSQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjFMUEVOUiAmPSB+UkNDX0FQQjFQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuDQogICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlDQogICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4NCiAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uDQogICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuDQogICogQHBhcmFtICBSQ0NfQVBCMlBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIyIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1RJTTE6ICAgVElNMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU04OiAgIFRJTTggY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVVNBUlQxOiBVU0FSVDEgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVVNBUlQ2OiBVU0FSVDYgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfQURDMTogICBBREMxIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX0FEQzI6ICAgQURDMiBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9BREMzOiAgIEFEQzMgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfU0RJTzogICBTRElPIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19BUEIyUGVyaXBoX1NQSTE6ICAgU1BJMSBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9TWVNDRkc6IFNZU0NGRyBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU05OiAgIFRJTTkgY2xvY2sNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfVElNMTA6ICBUSU0xMCBjbG9jaw0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9USU0xMTogIFRJTTExIGNsb2NrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQVBCMlBlcmlwaENsb2NrTFBNb2RlQ21kKHVpbnQzMl90IFJDQ19BUEIyUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQVBCMl9QRVJJUEgoUkNDX0FQQjJQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFQQjJMUEVOUiB8PSBSQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjJMUEVOUiAmPSB+UkNDX0FQQjJQZXJpcGg7DQogIH0NCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NfR3JvdXA0IEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQgZnVuY3Rpb25zDQogKiAgQGJyaWVmICAgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudCBmdW5jdGlvbnMgDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgIEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQgZnVuY3Rpb25zDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFJDQyBpbnRlcnJ1cHRzLg0KICAqIEBwYXJhbSAgUkNDX0lUOiBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9MU0lSRFk6IExTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX0xTRVJEWTogTFNFIHJlYWR5IGludGVycnVwdA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSVRfSFNJUkRZOiBIU0kgcmVhZHkgaW50ZXJydXB0DQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9IU0VSRFk6IEhTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX1BMTFJEWTogbWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0DQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9QTExJMlNSRFk6IFBMTEkyUyByZWFkeSBpbnRlcnJ1cHQgIA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFJDQyBpbnRlcnJ1cHRzLg0KICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19JVENvbmZpZyh1aW50OF90IFJDQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0lUKFJDQ19JVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8gUkNDX0NJUlsxNDo4XSBiaXRzIHRvIGVuYWJsZSB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyAqLw0KICAgICooX19JTyB1aW50OF90ICopIENJUl9CWVRFMl9BRERSRVNTIHw9IFJDQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQZXJmb3JtIEJ5dGUgYWNjZXNzIHRvIFJDQ19DSVJbMTQ6OF0gYml0cyB0byBkaXNhYmxlIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzICovDQogICAgKihfX0lPIHVpbnQ4X3QgKikgQ0lSX0JZVEUyX0FERFJFU1MgJj0gKHVpbnQ4X3QpflJDQ19JVDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUkNDIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiAgKiBAcGFyYW0gIFJDQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfSFNJUkRZOiBIU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQ0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfRkxBR19IU0VSRFk6IEhTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQogICogICAgICAgICAgICBAYXJnIFJDQ19GTEFHX1BMTFJEWTogbWFpbiBQTEwgY2xvY2sgcmVhZHkNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfUExMSTJTUkRZOiBQTExJMlMgY2xvY2sgcmVhZHkNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfTFNFUkRZOiBMU0Ugb3NjaWxsYXRvciBjbG9jayByZWFkeQ0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfRkxBR19MU0lSRFk6IExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQogICogICAgICAgICAgICBAYXJnIFJDQ19GTEFHX0JPUlJTVDogUE9SL1BEUiBvciBCT1IgcmVzZXQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfUElOUlNUOiBQaW4gcmVzZXQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfUE9SUlNUOiBQT1IvUERSIHJlc2V0DQogICogICAgICAgICAgICBAYXJnIFJDQ19GTEFHX1NGVFJTVDogU29mdHdhcmUgcmVzZXQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfSVdER1JTVDogSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0ZMQUdfV1dER1JTVDogV2luZG93IFdhdGNoZG9nIHJlc2V0DQogICogICAgICAgICAgICBAYXJnIFJDQ19GTEFHX0xQV1JSU1Q6IExvdyBQb3dlciByZXNldA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBSQ0NfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgUkNDX0dldEZsYWdTdGF0dXModWludDhfdCBSQ0NfRkxBRykNCnsNCiAgdWludDMyX3QgdG1wID0gMDsNCiAgdWludDMyX3Qgc3RhdHVzcmVnID0gMDsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0ZMQUcoUkNDX0ZMQUcpKTsNCg0KICAvKiBHZXQgdGhlIFJDQyByZWdpc3RlciBpbmRleCAqLw0KICB0bXAgPSBSQ0NfRkxBRyA+PiA1Ow0KICBpZiAodG1wID09IDEpICAgICAgICAgICAgICAgLyogVGhlIGZsYWcgdG8gY2hlY2sgaXMgaW4gQ1IgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHN0YXR1c3JlZyA9IFJDQy0+Q1I7DQogIH0NCiAgZWxzZSBpZiAodG1wID09IDIpICAgICAgICAgIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIEJEQ1IgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHN0YXR1c3JlZyA9IFJDQy0+QkRDUjsNCiAgfQ0KICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZmxhZyB0byBjaGVjayBpcyBpbiBDU1IgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHN0YXR1c3JlZyA9IFJDQy0+Q1NSOw0KICB9DQoNCiAgLyogR2V0IHRoZSBmbGFnIHBvc2l0aW9uICovDQogIHRtcCA9IFJDQ19GTEFHICYgRkxBR19NQVNLOw0KICBpZiAoKHN0YXR1c3JlZyAmICgodWludDMyX3QpMSA8PCB0bXApKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBmbGFnIHN0YXR1cyAqLw0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgUkNDIHJlc2V0IGZsYWdzLg0KICAqICAgICAgICAgVGhlIHJlc2V0IGZsYWdzIGFyZTogUkNDX0ZMQUdfUElOUlNULCBSQ0NfRkxBR19QT1JSU1QsICBSQ0NfRkxBR19TRlRSU1QsDQogICogICAgICAgICBSQ0NfRkxBR19JV0RHUlNULCBSQ0NfRkxBR19XV0RHUlNULCBSQ0NfRkxBR19MUFdSUlNUDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19DbGVhckZsYWcodm9pZCkNCnsNCiAgLyogU2V0IFJNVkYgYml0IHRvIGNsZWFyIHRoZSByZXNldCBmbGFncyAqLw0KICBSQ0MtPkNTUiB8PSBSQ0NfQ1NSX1JNVkY7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSQ0MgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQogICogQHBhcmFtICBSQ0NfSVQ6IHNwZWNpZmllcyB0aGUgUkNDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX0xTSVJEWTogTFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9IU0lSRFk6IEhTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX0hTRVJEWTogSFNFIHJlYWR5IGludGVycnVwdA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBtYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX1BMTEkyU1JEWTogUExMSTJTIHJlYWR5IGludGVycnVwdCAgDQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9DU1M6IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgUkNDX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgUkNDX0dldElUU3RhdHVzKHVpbnQ4X3QgUkNDX0lUKQ0Kew0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0dFVF9JVChSQ0NfSVQpKTsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgUkNDIGludGVycnVwdCAqLw0KICBpZiAoKFJDQy0+Q0lSICYgUkNDX0lUKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBSQ0NfSVQgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgUkNDJ3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIFJDQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX0xTSVJEWTogTFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9IU0lSRFk6IEhTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX0hTRVJEWTogSFNFIHJlYWR5IGludGVycnVwdA0KICAqICAgICAgICAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBtYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgICAgICAgIEBhcmcgUkNDX0lUX1BMTEkyU1JEWTogUExMSTJTIHJlYWR5IGludGVycnVwdCAgDQogICogICAgICAgICAgICBAYXJnIFJDQ19JVF9DU1M6IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0NsZWFySVRQZW5kaW5nQml0KHVpbnQ4X3QgUkNDX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMRUFSX0lUKFJDQ19JVCkpOw0KDQogIC8qIFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8gUkNDX0NJUlsyMzoxNl0gYml0cyB0byBjbGVhciB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0DQogICAgIHBlbmRpbmcgYml0cyAqLw0KICAqKF9fSU8gdWludDhfdCAqKSBDSVJfQllURTNfQUREUkVTUyA9IFJDQ19JVDsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKioNCiAgKiBAfQ0KICAqLyANCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMSBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=