LyoqIEBmaWxlDQogIFRoZSBFRkkgTGVnYWN5IEJJT1MgUGF0Zm9ybSBQcm90b2NvbCBpcyB1c2VkIHRvIG1hdGUgYSBMZWdhY3kxNiANCiAgaW1wbGVtZW50YXRpb24gd2l0aCB0aGlzIEVGSSBjb2RlLiBUaGUgRUZJIGRyaXZlciB0aGF0IHByb2R1Y2VzIA0KICB0aGUgTGVnYWN5IEJJT1MgcHJvdG9jb2wgaXMgZ2VuZXJpYyBhbmQgY29uc3VtZXMgdGhpcyBwcm90b2NvbC4NCiAgQSBkcml2ZXIgdGhhdCBtYXRjaGVzIHRoZSBMZWdhY3kxNiBwcm9kdWNlcyB0aGlzIHByb3RvY29sDQoNCiAgQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlICAgICAgICAgDQogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQgICAgICAgIA0KICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgICAgICAgICAgICAgICAgICAgICANCiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4gICAgDQoNCiAgTW9kdWxlIE5hbWU6ICBMZWdhY3lCaW9zUGxhdGZvcm0uaA0KDQogIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOg0KICBUaGlzIHByb3RvY29sIGlzIGRlZmluZWQgaW4gRnJhbWV3b3JrIGZvciBFRkkgQ29tcGF0aWJpbGl0eSBTdXBwb3J0IE1vZHVsZSBzcGVjDQogIFZlcnNpb24gMC45Ng0KKiovDQoNCiNpZm5kZWYgX0VGSV9MRUdBQ1lfQklPU19QTEFURk9STV9IDQojZGVmaW5lIF9FRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fSA0KDQojZGVmaW5lIEVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9QUk9UT0NPTF9HVUlEIFwNCiAgeyBcDQogICAgMHg3ODM2NThhMywgMHg0MTcyLCAweDQ0MjEsIHsweGEyLCAweDk5LCAweGUwLCAweDksIDB4NywgMHg5YywgMHhjLCAweGI0IH0gXA0KICB9DQoNCnR5cGVkZWYgc3RydWN0IF9FRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fUFJPVE9DT0wgRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX1BST1RPQ09MOw0KDQojcHJhZ21hIHBhY2soMSkNCi8vDQovLyBEZWZpbmUgc3RydWN0dXJlcyBmb3IgR2V0T2VtSW50RGF0YQ0KLy8gIE5vdGU6DQovLyAgICBPZW1JbnREYXRhRWxlbmVudCBpcyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzIGZyb20gMCB0byBDb3VudC0xLg0KLy8gICAgUmF3RGF0YSBpcyBhbiBhcnJheSBvZiBieXRlcyBmcm9tIDAgdG8gUmFtRGF0YUxlbmd0aC0xLg0KLy8NCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDE2ICBJbnQ7DQogIFVJTlQxNiAgQXg7DQogIFVJTlQzMiAgUmF3RGF0YUxlbmd0aDsNCiAgVUlOVDggICBSYXdEYXRhWzFdOw0KfSBFRklfT0VNX0lOVF9EQVRBX0VMRU1FTlQ7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBDb3VudDsNCiAgRUZJX09FTV9JTlRfREFUQV9FTEVNRU5UICBPZW1JbnREYXRhRWxlbWVudFsxXTsNCn0gRUZJX09FTV9JTlRfREFUQTsNCiNwcmFnbWEgcGFjaygpDQoNCnR5cGVkZWYgZW51bSB7DQogIEVmaUdldFBsYXRmb3JtQmluYXJ5TXBUYWJsZSAgICAgID0gMCwNCiAgRWZpR2V0UGxhdGZvcm1CaW5hcnlPZW1JbnREYXRhICAgPSAxLA0KICBFZmlHZXRQbGF0Zm9ybUJpbmFyeU9lbTE2RGF0YSAgICA9IDIsDQogIEVmaUdldFBsYXRmb3JtQmluYXJ5T2VtMzJEYXRhICAgID0gMywNCiAgRWZpR2V0UGxhdGZvcm1CaW5hcnlUcG1CaW5hcnkgICAgPSA0LA0KICBFZmlHZXRQbGF0Zm9ybUJpbmFyeVN5c3RlbVJvbSAgICA9IDUsDQogIEVmaUdldFBsYXRmb3JtUGNpRXhwcmVzc0Jhc2UgICAgID0gNiwNCiAgRWZpR2V0UGxhdGZvcm1QbW1TaXplICAgICAgICAgICAgPSA3LA0KICBFZmlHZXRQbGF0Zm9ybUVuZE9wcm9tU2hhZG93QWRkciA9IDgsDQoNCn0gRUZJX0dFVF9QTEFURk9STV9JTkZPX01PREU7DQoNCnR5cGVkZWYgZW51bSB7DQogIEVmaUdldFBsYXRmb3JtVmdhSGFuZGxlICAgICAgID0gMCwNCiAgRWZpR2V0UGxhdGZvcm1JZGVIYW5kbGUgICAgICAgPSAxLA0KICBFZmlHZXRQbGF0Zm9ybUlzYUJ1c0hhbmRsZSAgICA9IDIsDQogIEVmaUdldFBsYXRmb3JtVXNiSGFuZGxlICAgICAgID0gMw0KfSBFRklfR0VUX1BMQVRGT1JNX0hBTkRMRV9NT0RFOw0KDQp0eXBlZGVmIGVudW0gew0KICBFZmlQbGF0Zm9ybUhvb2tQcmVwYXJlVG9TY2FuUm9tID0gMCwNCiAgRWZpUGxhdGZvcm1Ib29rU2hhZG93U2VydmljZVJvbXM9IDEsDQogIEVmaVBsYXRmb3JtSG9va0FmdGVyUm9tSW5pdCAgICAgPSAyDQp9IEVGSV9HRVRfUExBVEZPUk1fSE9PS19NT0RFOw0KDQovKioNCiAgRmluZHMgdGhlIGJpbmFyeSBkYXRhIG9yIG90aGVyIHBsYXRmb3JtIGluZm9ybWF0aW9uLg0KDQogIEBwYXJhbSAgVGhpcyBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLg0KICBAcGFyYW0gIE1vZGUgU3BlY2lmaWVzIHdoYXQgZGF0YSB0byByZXR1cm4NCiAgQHBhcmFtICBUYWJsZSBQb2ludGVyIHRvIE1QIHRhYmxlLg0KICBAcGFyYW0gIFRhYmxlU2l6ZSBTaXplIGluIGJ5dGVzIG9mIHRhYmxlLg0KICBAcGFyYW0gIExvY2F0aW9uIExlZ2FjeSByZWdpb24gcmVxdWVzdGVkDQogIDB4MDAgPSBBbnkgbG9jYXRpb24NCiAgQml0IDAgPSAweEYwMDAwIHJlZ2lvbg0KICBCaXQgMSA9IDB4RTAwMDAgcmVnaW9uDQogIE11bHRpcGxlIGJpdHMgY2FuIGJlIHNldA0KICBAcGFyYW0gIEFsaWdubWVudCBBZGRyZXNzIGFsaWdubWVudCBmb3IgYWxsb2NhdGlvbi4NCiAgQml0IG1hcHBlZC4gRmlyc3Qgbm9uLXplcm8gYml0IGZyb20gcmlnaHQNCiAgaXMgYWxpZ25tZW50Lg0KICBAcGFyYW0gIExlZ2FjeVNlZ21lbnQgU2VnbWVudCBpbiBMZWdhY3lCaW9zIHdoZXJlIFRhYmxlIGlzIHN0b3JlZA0KICBAcGFyYW0gIExlZ2FjeU9mZnNldCBPZmZzZXQgaW4gTGVnYWN5QmlvcyB3aGVyZSBUYWJsZSBpcyBzdG9yZWQNCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyBEYXRhIHdhcyByZXR1cm5lZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgIEVGSV9VTlNVUFBPUlRFRCBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHBsYXRmb3JtLg0KICBAcmV0dmFsICBFRklfTk9UX0ZPVU5EIEJpbmFyeSBpbWFnZSBvciB0YWJsZSBub3QgZm91bmQuDQoNCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX0dFVF9QTEFURk9STV9JTkZPKSAoDQogIElOIEVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9QUk9UT0NPTCAgICpUaGlzLA0KICBJTiBFRklfR0VUX1BMQVRGT1JNX0lORk9fTU9ERSAgICAgICAgICBNb2RlLA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlRhYmxlLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVTaXplLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTG9jYXRpb24sDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpBbGlnbm1lbnQsDQogIElOICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FjeVNlZ21lbnQsDQogIElOICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FjeU9mZnNldA0KICApDQo7DQoNCi8qKg0KICBSZXR1cm5zIGEgYnVmZmVyIG9mIGhhbmRsZXMgZm9yIHRoZSByZXF1ZXN0ZWQgc3ViLWZ1bmN0aW9uLg0KDQogIEBwYXJhbSAgVGhpcyBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLg0KICBAcGFyYW0gIE1vZGUgU3BlY2lmaWVzIHdoYXQgaGFuZGxlIHRvIHJldHVybi4NCiAgQHBhcmFtICBUeXBlIFR5cGUgZnJvbSBEZXZpY2UgUGF0aCBmb3IgSGFuZGxlIHRvIHJlcHJlc2VudC4NCiAgQHBhcmFtICBIYW5kbGVCdWZmZXIgSGFuZGxlcyBvZiB0aGUgZGV2aWNlL2NvbnRyb2xsZXIgaW4gcHJpb3JpdHkgb3JkZXINCiAgd2l0aCBIYW5kbGVCdWZmZXJbMF0gaGlnaGVzdCBwcmlvcml0eS4NCiAgQHBhcmFtICBIYW5kbGVDb3VudCBOdW1iZXIgb2YgaGFuZGxlcyBpbiB0aGUgYnVmZmVyLg0KICBAcGFyYW0gIEFkZGl0aW9uYWxEYXRhIE1vZGUgc3BlY2lmaWMuDQoNCiAgQHJldHZhbCAgRUZJX1NVQ0NFU1MgSGFuZGxlIGlzIHZhbGlkDQogIEByZXR2YWwgIEVGSV9VTlNVUFBPUlRFRCBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHBsYXRmb3JtLg0KICBAcmV0dmFsICBFRklfTk9UX0ZPVU5EIEhhbmRsZSBpcyBub3Qga25vd24NCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fR0VUX1BMQVRGT1JNX0hBTkRMRSkgKA0KICBJTiBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fUFJPVE9DT0wgICAqVGhpcywNCiAgSU4gRUZJX0dFVF9QTEFURk9STV9IQU5ETEVfTU9ERSAgICAgICAgTW9kZSwNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwNCiAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgKipIYW5kbGVCdWZmZXIsDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIYW5kbGVDb3VudCwNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipBZGRpdGlvbmFsRGF0YSBPUFRJT05BTA0KICApDQo7DQoNCi8qKg0KICBMb2FkIGFuZCBpbml0aWFsaXplIHRoZSBMZWdhY3kgQklPUyBTTU0gaGFuZGxlci4NCg0KICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4NCiAgQHBhcmFtICBFZmlUb0xlZ2FjeTE2Qm9vdFRhYmxlIFBvaW50ZXIgdG8gTGVnYWN5MTYgYm9vdCB0YWJsZS4NCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyBTTU0gY29kZSBsb2FkZWQuDQogIEByZXR2YWwgIEVGSV9ERVZJQ0VfRVJST1IgU01NIGNvZGUgZmFpbGVkIHRvIGxvYWQNCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fU01NX0lOSVQpICgNCiAgSU4gRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX1BST1RPQ09MICAgKlRoaXMsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFZmlUb0xlZ2FjeTE2Qm9vdFRhYmxlDQogICkNCjsNCg0KLyoqDQogIEFsbG93cyBwbGF0Zm9ybSB0byBwZXJmb3JtIGFueSByZXF1aXJlZCBhY3Rpb24gYWZ0ZXIgYSBMZWdhY3lCaW9zIG9wZXJhdGlvbi4NCg0KICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4NCiAgQHBhcmFtICBNb2RlIFNwZWNpZmllcyB3aGF0IGhhbmRsZSB0byByZXR1cm4uDQogIEBwYXJhbSAgVHlwZSBNb2RlIHNwZWNpZmljLg0KICBAcGFyYW0gIERldmljZUhhbmRsZSBMaXN0IG9mIFBDSSBkZXZpY2VzIGluIHRoZSBzeXN0ZW0uDQogIEBwYXJhbSAgU2hhZG93QWRkcmVzcyBGaXJzdCBmcmVlIE9wUk9NIGFyZWEsIGFmdGVyIG90aGVyIE9wUk9NcyBoYXZlIGJlZW4gZGlzcGF0Y2hlZC4NCiAgQHBhcmFtICBDb21wYXRpYmlsaXR5MTZUYWJsZSBQb2ludGVyIHRvIENvbXBhdGliaWxpdHkxNlRhYmxlLg0KICBAcGFyYW0gIEFkZGl0aW9uYWxEYXRhIE1vZGUgc3BlY2lmaWMgUG9pbnRlciB0byBhZGRpdGlvbmFsIGRhdGEgcmV0dXJuZWQgqEMgbW9kZSBzcGVjaWZpYy4NCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyBSb21JbWFnZSBpcyB2YWxpZA0KICBAcmV0dmFsICBFRklfVU5TVVBQT1JURUQgTW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBwbGF0Zm9ybS4NCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fSE9PS1MpICgNCiAgSU4gRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX1BST1RPQ09MICAgKlRoaXMsDQogIElOIEVGSV9HRVRfUExBVEZPUk1fSE9PS19NT0RFICAgICAgICAgIE1vZGUsDQogIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUhhbmRsZSwNCiAgSU4gIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgKlNoYWRvd0FkZHJlc3MsDQogIElOICBFRklfQ09NUEFUSUJJTElUWTE2X1RBQkxFICAgICAgICAgICpDb21wYXRpYmlsaXR5MTZUYWJsZSwNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipBZGRpdGlvbmFsRGF0YSBPUFRJT05BTA0KICApDQo7DQoNCi8qKg0KICBSZXR1cm5zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBQQ0kgSVJRIHJvdXRpbmcuDQoNCiAgQHBhcmFtICBUaGlzIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuDQogIEBwYXJhbSAgUm91dGluZ1RhYmxlIFBvaW50ZXIgdG8gUENJIElSUSBSb3V0aW5nIHRhYmxlLg0KICBAcGFyYW0gIFJvdXRpbmdUYWJsZUVudHJpZXMgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUuDQogIEBwYXJhbSAgTG9jYWxQaXJxVGFibGUgJFBJUiB0YWJsZQ0KICBAcGFyYW0gIFBpcnFUYWJsZVNpemUgJFBJUiB0YWJsZSBzaXplDQogIEBwYXJhbSAgTG9jYWxJcnFQcmlvcml0eVRhYmxlIExpc3Qgb2YgaW50ZXJydXB0cyBpbiBwcmlvcml0eSBvcmRlciB0byBhc3NpZ24NCiAgQHBhcmFtICBJcnFQcmlvcml0eVRhYmxlRW50cmllcy0gTnVtYmVyIG9mIGVudHJpZXMgaW4gcHJpb3JpdHkgdGFibGUNCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyBEYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuDQoNCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX0dFVF9ST1VUSU5HX1RBQkxFKSAoDQogIElOIEVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9QUk9UT0NPTCAgICpUaGlzLA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlJvdXRpbmdUYWJsZSwNCiAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJvdXRpbmdUYWJsZUVudHJpZXMsDQogIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqTG9jYWxQaXJxVGFibGUsIE9QVElPTkFMDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQaXJxVGFibGVTaXplLCBPUFRJT05BTA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKkxvY2FsSXJxUHJpb3JpdHlUYWJsZSwgT1BUSU9OQUwNCiAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKklycVByaW9yaXR5VGFibGVFbnRyaWVzIE9QVElPTkFMDQogICkNCjsNCg0KLyoqDQogIFRyYW5zbGF0ZXMgdGhlIGdpdmVuIFBJUlEgYWNjb3VudGluZyBmb3IgYnJpZGdlDQoNCiAgQHBhcmFtICBUaGlzIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuDQogIEBwYXJhbSAgUGNpQnVzIFBDSSBidXMgbnVtYmVyIGZvciB0aGlzIGRldmljZS4NCiAgQHBhcmFtICBQY2lEZXZpY2UgUENJIGRldmljZSBudW1iZXIgZm9yIHRoaXMgZGV2aWNlLg0KICBAcGFyYW0gIFBjaUZ1bmN0aW9uIFBDSSBmdW5jdGlvbiBudW1iZXIgZm9yIHRoaXMgZGV2aWNlLg0KICBAcGFyYW0gIFBpcnEgSW5wdXQgaXMgUElSUSByZXBvcnRlZCBieSBkZXZpY2UsIG91dHB1dCBpcyB0cnVlIFBJUlEuDQogIEBwYXJhbSAgUGNpSXJxIFRoZSBJUlEgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGUgUElSUSBvciB0aGUgSVJRIHRvIGJlDQogIGFzc2lnbmVkIHRvIHRoZSBQSVJRLg0KDQogIEByZXR2YWwgIEVGSV9TVUNDRVNTIFRoZSBQSVJRIHdhcyB0cmFuc2xhdGVkLg0KDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9UUkFOU0xBVEVfUElSUSkgKA0KICBJTiBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fUFJPVE9DT0wgICAqVGhpcywNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGNpQnVzLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQY2lEZXZpY2UsDQogIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBjaUZ1bmN0aW9uLA0KICBJTiAgT1VUIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAqUGlycSwNCiAgT1VUIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjaUlycQ0KICApDQo7DQoNCi8qKg0KICBBdHRlbXB0IHRvIGxlZ2FjeSBib290IHRoZSBCb290T3B0aW9uLiBJZiB0aGUgRUZJIGNvbnRleHRlZCBoYXMgYmVlbiANCiAgY29tcHJvbWlzZWQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4uDQoNCiAgQHBhcmFtICBUaGlzIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuDQogIEBwYXJhbSAgQmJzRGV2aWNlUGF0aCBFRkkgRGV2aWNlIFBhdGggZnJvbSBCb290WFhYWCB2YXJpYWJsZS4NCiAgQHBhcmFtICBCYnNUYWJsZSBJbnRlcm5hbCBCQlMgdGFibGUuDQogIEBwYXJhbSAgTG9hZE9wdGlvblNpemUgU2l6ZSBvZiBMb2FkT3B0aW9uIGluIHNpemUuDQogIEBwYXJhbSAgTG9hZE9wdGlvbiBMb2FkT3B0aW9uIGZyb20gQm9vdFhYWFggdmFyaWFibGUNCiAgQHBhcmFtICBFZmlUb0xlZ2FjeTE2Qm9vdFRhYmxlIFBvaW50ZXIgdG8gQm9vdFRhYmxlIHN0cnVjdHVyZQ0KDQogIEByZXR2YWwgIEVGSV9TVUNDRVNTIFJlYWR5IHRvIGJvb3QuDQoNCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX1BSRVBBUkVfVE9fQk9PVCkgKA0KICBJTiBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fUFJPVE9DT0wgICAqVGhpcywNCiAgSU4gIEJCU19CQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKkJic0RldmljZVBhdGgsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCYnNUYWJsZSwNCiAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE9wdGlvbnNTaXplLA0KICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTG9hZE9wdGlvbnMsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFZmlUb0xlZ2FjeTE2Qm9vdFRhYmxlDQogICkNCjsNCg0KLyoqDQogIEBwYXIgUHJvdG9jb2wgRGVzY3JpcHRpb246DQogIEFic3RyYWN0cyB0aGUgcGxhdGZvcm0gcG9ydGlvbiBvZiB0aGUgdHJhZGl0aW9uYWwgQklPUy4gDQoNCiAgQHBhcmFtIEdldFBsYXRmb3JtSW5mbw0KICBHZXRzIGJpbmFyeSBkYXRhIG9yIG90aGVyIHBsYXRmb3JtIGluZm9ybWF0aW9uLg0KDQogIEBwYXJhbSBHZXRQbGF0Zm9ybUhhbmRsZQ0KICBSZXR1cm5zIGEgYnVmZmVyIG9mIGFsbCBoYW5kbGVzIG1hdGNoaW5nIHRoZSByZXF1ZXN0ZWQgc3ViZnVuY3Rpb24uIA0KDQogIEBwYXJhbSBTbW1Jbml0DQogIExvYWRzIGFuZCBpbml0aWFsaXplcyB0aGUgdHJhZGl0aW9uYWwgQklPUyBTTU0gaGFuZGxlci4NCg0KICBAcGFyYW0gUGxhdGZvcm1Ib29rcw0KICBBbGxvd3MgcGxhdGZvcm0gdG8gcGVyZm9ybSBhbnkgcmVxdWlyZWQgYWN0aW9ucyBhZnRlciBhIExlZ2FjeUJpb3Mgb3BlcmF0aW9uLg0KDQogIEBwYXJhbSBHZXRSb3V0aW5nVGFibGUNCiAgR2V0cyAkUElSIHRhYmxlLiANCg0KICBAcGFyYW0gVHJhbnNsYXRlUGlycSANCiAgVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gUElSUSB0byB0aGUgZmluYWwgdmFsdWUgYWZ0ZXIgdHJhdmVyc2luZyBhbnkgUENJIGJyaWRnZXMuIA0KDQogIEBwYXJhbSBQcmVwYXJlVG9Cb290DQogIEZpbmFsIHBsYXRmb3JtIGZ1bmN0aW9uIGJlZm9yZSB0aGUgc3lzdGVtIGF0dGVtcHRzIHRvIGJvb3QgdG8gYSB0cmFkaXRpb25hbCBPUy4gDQoNCioqLw0Kc3RydWN0IF9FRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fUFJPVE9DT0wgew0KICBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fR0VUX1BMQVRGT1JNX0lORk8gICAgR2V0UGxhdGZvcm1JbmZvOw0KICBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fR0VUX1BMQVRGT1JNX0hBTkRMRSAgR2V0UGxhdGZvcm1IYW5kbGU7DQogIEVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9TTU1fSU5JVCAgICAgICAgICAgICBTbW1Jbml0Ow0KICBFRklfTEVHQUNZX0JJT1NfUExBVEZPUk1fSE9PS1MgICAgICAgICAgICAgICAgUGxhdGZvcm1Ib29rczsNCiAgRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX0dFVF9ST1VUSU5HX1RBQkxFICAgIEdldFJvdXRpbmdUYWJsZTsNCiAgRUZJX0xFR0FDWV9CSU9TX1BMQVRGT1JNX1RSQU5TTEFURV9QSVJRICAgICAgIFRyYW5zbGF0ZVBpcnE7DQogIEVGSV9MRUdBQ1lfQklPU19QTEFURk9STV9QUkVQQVJFX1RPX0JPT1QgICAgICBQcmVwYXJlVG9Cb290Ow0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlMZWdhY3lCaW9zUGxhdGZvcm1Qcm90b2NvbEd1aWQ7DQoNCiNlbmRpZg0K