LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gICAgICAgICBIZWFkZXJzDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojaW5jbHVkZSAicGl0LmgiDQojaW5jbHVkZSA8Ym9hcmQuaD4NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vICAgICAgICAgR2xvYmFsIGZ1bmN0aW9ucw0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBJbml0aWFsaXplIHRoZSBQZXJpb2RpYyBJbnRlcnZhbCBUaW1lciB0byBnZW5lcmF0ZSBhIHRpY2sgYXQgdGhlIHNwZWNpZmllZA0KLy8vIHBlcmlvZCwgZ2l2ZW4gdGhlIGN1cnJlbnQgbWFzdGVyIGNsb2NrIGZyZXF1ZW5jeS4NCi8vLyBccGFyYW0gcGVyaW9kICBQZXJpb2QgaW4gtXNlY29uZC4NCi8vLyBccGFyYW0gcGl0X2ZyZXF1ZW5jeSAgTWFzdGVyIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHouDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBQSVRfSW5pdCh1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgcGl0X2ZyZXF1ZW5jeSkNCnsNCiAgICBBVDkxQ19CQVNFX1BJVEMtPlBJVENfUElNUiA9IHBlcmlvZD8gKHBlcmlvZCAqIHBpdF9mcmVxdWVuY3kgKyA4KSA+PiA0IDogMDsNCiAgICBBVDkxQ19CQVNFX1BJVEMtPlBJVENfUElNUiB8PSBBVDkxQ19QSVRDX1BJVEVOOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFNldCB0aGUgUGVyaW9kaWMgSW50ZXJ2YWwgVmFsdWUgb2YgdGhlIFBJVC4NCi8vLyBccGFyYW0gcGl2ICBQSVYgdmFsdWUgdG8gc2V0Lg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnZvaWQgUElUX1NldFBJVih1bnNpZ25lZCBpbnQgcGl2KQ0Kew0KICAgIEFUOTFDX0JBU0VfUElUQy0+UElUQ19QSU1SID0gKEFUOTFDX0JBU0VfUElUQy0+UElUQ19QSU1SICYgQVQ5MUNfUElUQ19QSVYpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBpdjsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBFbmFibGVzIHRoZSBQSVQgaWYgdGhpcyBpcyBub3QgYWxyZWFkeSB0aGUgY2FzZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp2b2lkIFBJVF9FbmFibGUodm9pZCkNCnsNCiAgICBBVDkxQ19CQVNFX1BJVEMtPlBJVENfUElNUiB8PSBBVDkxQ19QSVRDX1BJVEVOOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBFbmFibGUgdGhlIFBJVCBwZXJpb2RpYyBpbnRlcnJ1cHQuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnZvaWQgUElUX0VuYWJsZUlUKHZvaWQpDQp7DQogICAgQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gRGlzYWJsZXMgdGhlIFBJVCBwZXJpb2RpYyBpbnRlcnJ1cHQuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0Kdm9pZCBQSVRfRGlzYWJsZUlUKHZvaWQpDQp7DQogICAgQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJTVIgJj0gfkFUOTFDX1BJVENfUElUSUVOOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBQSVQgbW9kZSByZWdpc3Rlci4NCi8vLyBccmV0dXJuIFBJVF9NUiB2YWx1ZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp1bnNpZ25lZCBpbnQgUElUX0dldE1vZGUodm9pZCkNCnsNCiAgICByZXR1cm4gQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJTVI7DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFBJVCBzdGF0dXMgcmVnaXN0ZXIsIGNsZWFyaW5nIGl0IGFzIGEgc2lkZSBlZmZlY3QuDQovLy8gXHJldHVybiBQSVRfU1IgdmFsdWUuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdW5zaWduZWQgaW50IFBJVF9HZXRTdGF0dXModm9pZCkNCnsNCiAgICByZXR1cm4gQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJU1I7DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFBJVCBJbWFnZSBSZWdpc3RlciwgdG8gcmVhZCBQSUNOVCBhbmQgQ1BJViB3aXRob3V0DQovLy8gY2xlYXJpbmcgdGhlIGN1cnJlbnQgdmFsdWVzLg0KLy8vIFxyZXR1cm4gUElUX1BJSVIgdmFsdWUuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdW5zaWduZWQgaW50IFBJVF9HZXRQSUlSKHZvaWQpDQp7DQogICAgcmV0dXJuIEFUOTFDX0JBU0VfUElUQy0+UElUQ19QSUlSOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBQSVQgVmFsdWUgUmVnaXN0ZXIsIGNsZWFyaW5nIGl0IGFzIGEgc2lkZSBlZmZlY3QuDQovLy8gXHJldHVybiBQSVRfUElWUiB2YWx1ZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp1bnNpZ25lZCBpbnQgUElUX0dldFBJVlIodm9pZCkNCnsNCiAgICByZXR1cm4gQVQ5MUNfQkFTRV9QSVRDLT5QSVRDX1BJVlI7DQp9DQo=