LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3RpbTEuYw0KKiBBdXRob3IgICAgICAgICAgICAgOiBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKiBEYXRlIEZpcnN0IElzc3VlZCAgOiAwOS8yOS8yMDA2DQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFRJTTEgc29mdHdhcmUgZnVuY3Rpb25zLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogSGlzdG9yeToNCiogMDQvMDIvMjAwNzogVjAuMg0KKiBtbS9kZC95eXl5OiBWMC4xDQoqIDA5LzI5LzIwMDY6IFYwLjAxDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfdGltMS5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIC0tLS0tLS0tLS0tLSBUSU0xIHJlZ2lzdGVycyBiaXQgYWRkcmVzcyBpbiB0aGUgYWxpYXMgcmVnaW9uIC0tLS0tLS0tLS0tICovDQojZGVmaW5lIFRJTTFfT0ZGU0VUICAgIChUSU0xX0JBU0UgLSBQRVJJUEhfQkFTRSkNCg0KLyogLS0tIFRJTTEgQ1IxIFJlZ2lzdGVyIC0tLSovDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0VOIGJpdCAqLw0KI2RlZmluZSBDUjFfT0ZGU0VUICAgICAgICAoVElNMV9PRkZTRVQgKyAweDAwKQ0KI2RlZmluZSBDRU5fQml0TnVtYmVyICAgICAweDAwDQojZGVmaW5lIENSMV9DRU5fQkIgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUjFfT0ZGU0VUICogMzIpICsgKENFTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFVESVMgYml0ICovDQojZGVmaW5lIFVESVNfQml0TnVtYmVyICAgIDB4MDENCiNkZWZpbmUgQ1IxX1VESVNfQkIgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSMV9PRkZTRVQgKiAzMikgKyAoVURJU19CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFVSUyBiaXQgKi8NCiNkZWZpbmUgVVJTX0JpdE51bWJlciAgICAgMHgwMg0KI2RlZmluZSBDUjFfVVJTX0JCICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IxX09GRlNFVCAqIDMyKSArIChVUlNfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPUE0gYml0ICovDQojZGVmaW5lIE9QTV9CaXROdW1iZXIgICAgIDB4MDMNCiNkZWZpbmUgQ1IxX09QTV9CQiAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSMV9PRkZTRVQgKiAzMikgKyAoT1BNX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQVJQRSBiaXQgKi8NCiNkZWZpbmUgQVJQRV9CaXROdW1iZXIgICAgMHgwNw0KI2RlZmluZSBDUjFfQVJQRV9CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IxX09GRlNFVCAqIDMyKSArIChBUlBFX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gVElNMSBDUjIgUmVnaXN0ZXIgLS0tICovDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0NQQyBiaXQgKi8NCiNkZWZpbmUgQ1IyX09GRlNFVCAgICAgICAgKFRJTTFfT0ZGU0VUICsgMHgwNCkNCiNkZWZpbmUgQ0NQQ19CaXROdW1iZXIgICAgMHgwMA0KI2RlZmluZSBDUjJfQ0NQQ19CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChDQ1BDX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0NVUyBiaXQgKi8NCiNkZWZpbmUgQ0NVU19CaXROdW1iZXIgICAgMHgwMg0KI2RlZmluZSBDUjJfQ0NVU19CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChDQ1VTX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0NEUyBiaXQgKi8NCiNkZWZpbmUgQ0NEU19CaXROdW1iZXIgICAgMHgwMw0KI2RlZmluZSBDUjJfQ0NEU19CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChDQ0RTX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgVEkxUyBiaXQgKi8NCiNkZWZpbmUgVEkxU19CaXROdW1iZXIgICAgMHgwNw0KI2RlZmluZSBDUjJfVEkxU19CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChUSTFTX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0lTMSBiaXQgKi8NCiNkZWZpbmUgT0lTMV9CaXROdW1iZXIgICAgMHgwOA0KI2RlZmluZSBDUjJfT0lTMV9CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChPSVMxX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0lTMU4gYml0ICovDQojZGVmaW5lIE9JUzFOX0JpdE51bWJlciAgIDB4MDkNCiNkZWZpbmUgQ1IyX09JUzFOX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSMl9PRkZTRVQgKiAzMikgKyAoT0lTMU5fQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPSVMyIGJpdCAqLw0KI2RlZmluZSBPSVMyX0JpdE51bWJlciAgICAweDBBDQojZGVmaW5lIENSMl9PSVMyX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSMl9PRkZTRVQgKiAzMikgKyAoT0lTMl9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIE9JUzJOIGJpdCAqLw0KI2RlZmluZSBPSVMyTl9CaXROdW1iZXIgICAweDBCDQojZGVmaW5lIENSMl9PSVMyTl9CQiAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUjJfT0ZGU0VUICogMzIpICsgKE9JUzJOX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0lTMyBiaXQgKi8NCiNkZWZpbmUgT0lTM19CaXROdW1iZXIgICAgMHgwQw0KI2RlZmluZSBDUjJfT0lTM19CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1IyX09GRlNFVCAqIDMyKSArIChPSVMzX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0lTM04gYml0ICovDQojZGVmaW5lIE9JUzNOX0JpdE51bWJlciAgIDB4MEQNCiNkZWZpbmUgQ1IyX09JUzNOX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSMl9PRkZTRVQgKiAzMikgKyAoT0lTM05fQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPSVM0IGJpdCAqLw0KI2RlZmluZSBPSVM0X0JpdE51bWJlciAgICAweDBFDQojZGVmaW5lIENSMl9PSVM0X0JCICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUjJfT0ZGU0VUICogMzIpICsgKE9JUzRfQml0TnVtYmVyICogNCkpDQoNCi8qIC0tLSBUSU0xIFNNQ1IgUmVnaXN0ZXIgLS0tICovDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgTVNNIGJpdCAqLw0KI2RlZmluZSBTTUNSX09GRlNFVCAgICAgICAoVElNMV9PRkZTRVQgKyAweDA4KQ0KI2RlZmluZSBNU01fQml0TnVtYmVyICAgICAweDA3DQojZGVmaW5lIFNNQ1JfTVNNX0JCICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChTTUNSX09GRlNFVCAqIDMyKSArIChNU01fQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBFQ0UgYml0ICovDQojZGVmaW5lIEVDRV9CaXROdW1iZXIgICAgIDB4MEUNCiNkZWZpbmUgU01DUl9FQ0VfQkIgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKFNNQ1JfT0ZGU0VUICogMzIpICsgKEVDRV9CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tIFRJTTEgRUdSIFJlZ2lzdGVyIC0tLSAqLw0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFVHIGJpdCAqLw0KI2RlZmluZSBFR1JfT0ZGU0VUICAgICAgICAoVElNMV9PRkZTRVQgKyAweDE0KQ0KI2RlZmluZSBVR19CaXROdW1iZXIgICAgICAweDAwDQojZGVmaW5lIEVHUl9VR19CQiAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChFR1JfT0ZGU0VUICogMzIpICsgKFVHX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gVElNMSBDQ0VSIFJlZ2lzdGVyIC0tLSAqLw0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENDMUUgYml0ICovDQojZGVmaW5lIENDRVJfT0ZGU0VUICAgICAgIChUSU0xX09GRlNFVCArIDB4MjApDQojZGVmaW5lIENDMUVfQml0TnVtYmVyICAgIDB4MDANCiNkZWZpbmUgQ0NFUl9DQzFFX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENDRVJfT0ZGU0VUICogMzIpICsgKENDMUVfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQzFQIGJpdCAqLw0KI2RlZmluZSBDQzFQX0JpdE51bWJlciAgICAweDAxDQojZGVmaW5lIENDRVJfQ0MxUF9CQiAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ0VSX09GRlNFVCAqIDMyKSArIChDQzFQX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0MxTkUgYml0ICovDQojZGVmaW5lIENDMU5FX0JpdE51bWJlciAgIDB4MDINCiNkZWZpbmUgQ0NFUl9DQzFORV9CQiAgICAgKFBFUklQSF9CQl9CQVNFICsgKENDRVJfT0ZGU0VUICogMzIpICsgKENDMU5FX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0MxTlAgYml0ICovDQojZGVmaW5lIENDMU5QX0JpdE51bWJlciAgIDB4MDMNCiNkZWZpbmUgQ0NFUl9DQzFOUF9CQiAgICAgKFBFUklQSF9CQl9CQVNFICsgKENDRVJfT0ZGU0VUICogMzIpICsgKENDMU5QX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0MyRSBiaXQgKi8NCiNkZWZpbmUgQ0MyRV9CaXROdW1iZXIgICAgMHgwNA0KI2RlZmluZSBDQ0VSX0NDMkVfQkIgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NFUl9PRkZTRVQgKiAzMikgKyAoQ0MyRV9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENDMlAgYml0ICovDQojZGVmaW5lIENDMlBfQml0TnVtYmVyICAgIDB4MDUNCiNkZWZpbmUgQ0NFUl9DQzJQX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENDRVJfT0ZGU0VUICogMzIpICsgKENDMlBfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQzJORSBiaXQgKi8NCiNkZWZpbmUgQ0MyTkVfQml0TnVtYmVyICAgMHgwNg0KI2RlZmluZSBDQ0VSX0NDMk5FX0JCICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NFUl9PRkZTRVQgKiAzMikgKyAoQ0MyTkVfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQzJOUCBiaXQgKi8NCiNkZWZpbmUgQ0MyTlBfQml0TnVtYmVyICAgMHgwNw0KI2RlZmluZSBDQ0VSX0NDMk5QX0JCICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NFUl9PRkZTRVQgKiAzMikgKyAoQ0MyTlBfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQzNFIGJpdCAqLw0KI2RlZmluZSBDQzNFX0JpdE51bWJlciAgICAweDA4DQojZGVmaW5lIENDRVJfQ0MzRV9CQiAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ0VSX09GRlNFVCAqIDMyKSArIChDQzNFX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0MzUCBiaXQgKi8NCiNkZWZpbmUgQ0MzUF9CaXROdW1iZXIgICAgMHgwOQ0KI2RlZmluZSBDQ0VSX0NDM1BfQkIgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NFUl9PRkZTRVQgKiAzMikgKyAoQ0MzUF9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENDM05FIGJpdCAqLw0KI2RlZmluZSBDQzNORV9CaXROdW1iZXIgICAweDBBDQojZGVmaW5lIENDRVJfQ0MzTkVfQkIgICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ0VSX09GRlNFVCAqIDMyKSArIChDQzNORV9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENDM05QIGJpdCAqLw0KI2RlZmluZSBDQzNOUF9CaXROdW1iZXIgICAweDBCDQojZGVmaW5lIENDRVJfQ0MzTlBfQkIgICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ0VSX09GRlNFVCAqIDMyKSArIChDQzNOUF9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIENDNEUgYml0ICovDQojZGVmaW5lIENDNEVfQml0TnVtYmVyICAgIDB4MEMNCiNkZWZpbmUgQ0NFUl9DQzRFX0JCICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENDRVJfT0ZGU0VUICogMzIpICsgKENDNEVfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBDQzRQIGJpdCAqLw0KI2RlZmluZSBDQzRQX0JpdE51bWJlciAgICAweDBEDQojZGVmaW5lIENDRVJfQ0M0UF9CQiAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ0VSX09GRlNFVCAqIDMyKSArIChDQzRQX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gVElNMSBCRFRSIFJlZ2lzdGVyIC0tLSAqLw0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIE1PRSBiaXQgKi8NCiNkZWZpbmUgQkRUUl9PRkZTRVQgICAgICAgKFRJTTFfT0ZGU0VUICsgMHg0NCkNCiNkZWZpbmUgTU9FX0JpdE51bWJlciAgICAgMHgwRg0KI2RlZmluZSBCRFRSX01PRV9CQiAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQkRUUl9PRkZTRVQgKiAzMikgKyAoTU9FX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gVElNMSBDQ01SMSBSZWdpc3RlciAtLS0gKi8NCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPQzFGRSBiaXQgKi8NCiNkZWZpbmUgQ0NNUjFfT0ZGU0VUICAgICAgKFRJTTFfT0ZGU0VUICsgMHgxOCkNCiNkZWZpbmUgT0MxRkVfQml0TnVtYmVyICAgMHgwMg0KI2RlZmluZSBDQ01SMV9PQzFGRV9CQiAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NNUjFfT0ZGU0VUICogMzIpICsgKE9DMUZFX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0MxUEUgYml0ICovDQojZGVmaW5lIE9DMVBFX0JpdE51bWJlciAgIDB4MDMNCiNkZWZpbmUgQ0NNUjFfT0MxUEVfQkIgICAgKFBFUklQSF9CQl9CQVNFICsgKENDTVIxX09GRlNFVCAqIDMyKSArIChPQzFQRV9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIE9DMkZFIGJpdCAqLw0KI2RlZmluZSBPQzJGRV9CaXROdW1iZXIgICAweDBBDQojZGVmaW5lIENDTVIxX09DMkZFX0JCICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ01SMV9PRkZTRVQgKiAzMikgKyAoT0MyRkVfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPQzJQRSBiaXQgKi8NCiNkZWZpbmUgT0MyUEVfQml0TnVtYmVyICAgMHgwQg0KI2RlZmluZSBDQ01SMV9PQzJQRV9CQiAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NNUjFfT0ZGU0VUICogMzIpICsgKE9DMlBFX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gVElNMSBDQ01SMiBSZWdpc3RlciAtLS0tICovDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0MzRkUgYml0ICovDQojZGVmaW5lIENDTVIyX09GRlNFVCAgICAgIChUSU0xX09GRlNFVCArIDB4MUMpDQojZGVmaW5lIE9DM0ZFX0JpdE51bWJlciAgIDB4MDINCiNkZWZpbmUgQ0NNUjJfT0MzRkVfQkIgICAgKFBFUklQSF9CQl9CQVNFICsgKENDTVIyX09GRlNFVCAqIDMyKSArIChPQzNGRV9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIE9DM1BFIGJpdCAqLw0KI2RlZmluZSBPQzNQRV9CaXROdW1iZXIgICAweDAzDQojZGVmaW5lIENDTVIyX09DM1BFX0JCICAgIChQRVJJUEhfQkJfQkFTRSArIChDQ01SMl9PRkZTRVQgKiAzMikgKyAoT0MzUEVfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBPQzRGRSBiaXQgKi8NCiNkZWZpbmUgT0M0RkVfQml0TnVtYmVyICAgMHgwQQ0KI2RlZmluZSBDQ01SMl9PQzRGRV9CQiAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0NNUjJfT0ZGU0VUICogMzIpICsgKE9DNEZFX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgT0M0UEUgYml0ICovDQojZGVmaW5lIE9DNFBFX0JpdE51bWJlciAgIDB4MEINCiNkZWZpbmUgQ0NNUjJfT0M0UEVfQkIgICAgKFBFUklQSF9CQl9CQVNFICsgKENDTVIyX09GRlNFVCAqIDMyKSArIChPQzRQRV9CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTTEgcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qIFRJTTEgQ1IxIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX0NvdW50ZXJNb2RlX01hc2sgICAgICAgICAgICAgICAgKCh1MTYpMHgwMzlGKQ0KI2RlZmluZSBDUjFfQ0tEX01hc2sgICAgICAgICAgICAgICAgICAgICAgICAoKHUxNikweDAwRkYpDQoNCi8qIFRJTTEgQ1IyIE1hc2sgKi8NCiNkZWZpbmUgQ1IyX01NU19NYXNrICAgICAgICAgICAgICAgICAgICAgICAgKCh1MTYpMHgwMDgwKQ0KDQovKiBUSU0xIFNNQ1IgTWFzayAqLw0KI2RlZmluZSBTTUNSX1NNU19NYXNrICAgICAgICAgICAgICAgICAgICAgICAoKHUxNikweEZGRjApDQojZGVmaW5lIFNNQ1JfRVRSX01hc2sgICAgICAgICAgICAgICAgICAgICAgICgodTE2KTB4NDBGNykNCiNkZWZpbmUgU01DUl9UU19NYXNrICAgICAgICAgICAgICAgICAgICAgICAgKCh1MTYpMHhGRjg3KQ0KI2RlZmluZSBTTUNSX0VDRV9TZXQgICAgICAgICAgICAgICAgICAgICAgICAoKHUxNikweDAwMDEpDQoNCi8qIFRJTTEgQ0NNUnggTWFzayAqLw0KI2RlZmluZSBDQ01SX0NDMTNTX01hc2sgICAgICAgICAgICAgICAgICAgICAoKHUxNikweEZGRkMpDQojZGVmaW5lIENDTVJfQ0MyNFNfTWFzayAgICAgICAgICAgICAgICAgICAgICgodTE2KTB4RkNGRikNCiNkZWZpbmUgQ0NNUl9USTEzRGlyZWN0X1NldCAgICAgICAgICAgICAgICAgKCh1MTYpMHgwMDAxKQ0KI2RlZmluZSBDQ01SX1RJMjREaXJlY3RfU2V0ICAgICAgICAgICAgICAgICAoKHUxNikweDAxMDApDQojZGVmaW5lIENDTVJfT0NNMTNfTWFzayAgICAgICAgICAgICAgICAgICAgICgodTE2KTB4N0YwRikNCiNkZWZpbmUgQ0NNUl9PQ00yNF9NYXNrICAgICAgICAgICAgICAgICAgICAgKCh1MTYpMHgwRjdGKQ0KI2RlZmluZSBDQ01SX0lDMTNQU0NfTWFzayAgICAgICAgICAgICAgICAgICAoKHUxNikweEZGRjMpDQojZGVmaW5lIENDTVJfSUMyNFBTQ19NYXNrICAgICAgICAgICAgICAgICAgICgodTE2KTB4RjNGRikNCiNkZWZpbmUgQ0NNUl9JQzEzRl9NYXNrICAgICAgICAgICAgICAgICAgICAgKCh1MTYpMHhGRjBGKQ0KI2RlZmluZSBDQ01SX0lDMjRGX01hc2sgICAgICAgICAgICAgICAgICAgICAoKHUxNikweDBGRkYpDQojZGVmaW5lIE9DMTNNb2RlX01hc2sJCSAgICAgICAgICAgICAgICAoKHUxNikweEZGMDApDQojZGVmaW5lIE9DMjRNb2RlX01hc2sJCSAgICAgICAgICAgICAgICAoKHUxNikweDAwRkYpDQoNCi8qIFRJTTEgQ0NFUiBTZXQvUmVzZXQgQml0ICovDQojZGVmaW5lIENDRVJfQ0NFX1NldCAgICAgICAgICAgICAgICAgICAgICAgICgodTE2KTB4MDAwMSkNCiNkZWZpbmUgQ0NFUl9DQ0VfUmVzZXQgICAgICAgICAgICAgICAgICAgICAgKCh1MTYpMHgwMDAwKQ0KDQovKiBUSU0xIERNQSBNYXNrICovDQojZGVmaW5lIERDUl9ETUFfTWFzayAgICAgICAgICAgICAgICAgICAgICAgICgodTE2KTB4MDAwMCkNCg0KLyogVElNMSBwcml2YXRlIE1hc2tzICovDQojZGVmaW5lIFRJTTFfUGVyaW9kX1Jlc2V0X01hc2sgICAgICAgICAgICAgICAoKHUxNikweEZGRkYpDQojZGVmaW5lIFRJTTFfUHJlc2NhbGVyX1Jlc2V0X01hc2sgICAgICAgICAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTTFfUmVwZXRpdGlvbkNvdW50ZXJfUmVzZXRfTWFzayAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTTFfUHVsc2VfUmVzZXRfTWFzayAgICAgICAgICAgICAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTTFfSUNGaWx0ZXJfTWFzayAgICAgICAgICAgICAgICAgICAoKHU4KTB4MDApDQojZGVmaW5lIFRJTTFfRGVhZFRpbWVfUmVzZXRfTWFzayAgICAgICAgICAgICAoKHUxNikweDAwMDApDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnN0YXRpYyB2b2lkIEVUUl9Db25maWcodTE2IFRJTTFfRXh0VFJHUHJlc2NhbGVyLCB1MTYgVElNMV9FeHRUUkdQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgdTE2IEV4dFRSR0ZpbHRlcik7DQpzdGF0aWMgdm9pZCBUSTFfQ29uZmlnKHUxNiBUSU0xX0lDUG9sYXJpdHksIHUxNiBUSU0xX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1OCBUSU0xX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJMl9Db25maWcodTE2IFRJTTFfSUNQb2xhcml0eSwgdTE2IFRJTTFfSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHU4IFRJTTFfSUNGaWx0ZXIpOw0Kc3RhdGljIHZvaWQgVEkzX0NvbmZpZyh1MTYgVElNMV9JQ1BvbGFyaXR5LCB1MTYgVElNMV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNMV9JQ0ZpbHRlcik7DQpzdGF0aWMgdm9pZCBUSTRfQ29uZmlnKHUxNiBUSU0xX0lDUG9sYXJpdHksIHUxNiBUSU0xX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1OCBUSU0xX0lDRmlsdGVyKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFRJTTEgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfRGVJbml0KHZvaWQpDQp7DQogIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMSwgRU5BQkxFKTsNCiAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xLCBESVNBQkxFKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1RpbWVCYXNlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBUSU0xIFRpbWUgQmFzZSBVbml0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNMV9UaW1lQmFzZUluaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTTFfVGltZUJhc2VJbml0VHlwZURlZg0KKiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yDQoqICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFRJTTEgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9UaW1lQmFzZUluaXQoVElNMV9UaW1lQmFzZUluaXRUeXBlRGVmKiBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdCkNCnsNCiAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9DT1VOVEVSX01PREUoVElNMV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTTFfQ291bnRlck1vZGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfQ0tEX0RJVihUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNMV9DbG9ja0RpdmlzaW9uKSk7DQoNCiAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovDQogIFRJTTEtPkFSUiA9IFRJTTFfVGltZUJhc2VJbml0U3RydWN0LT5USU0xX1BlcmlvZCA7DQoNCiAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgVElNMS0+UFNDID0gVElNMV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTTFfUHJlc2NhbGVyOw0KDQogIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlIGFuZCBzZXQgdGhlIGNsb2NrIGRpdmlzaW9uICovDQogIFRJTTEtPkNSMSAmPSBDUjFfQ0tEX01hc2sgJiBDUjFfQ291bnRlck1vZGVfTWFzazsNCiAgVElNMS0+Q1IxIHw9ICh1MzIpVElNMV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTTFfQ2xvY2tEaXZpc2lvbiB8DQogICAgICAgICAgICAgICBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNMV9Db3VudGVyTW9kZTsNCg0KICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLw0KICBUSU0xLT5SQ1IgPSBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNMV9SZXBldGl0aW9uQ291bnRlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DMUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgVElNMSBDaGFubmVsMSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTTFfT0NJbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU0xX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgVElNMSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DMUluaXQoVElNMV9PQ0luaXRUeXBlRGVmKiBUSU0xX09DSW5pdFN0cnVjdCkNCnsNCiAgdTE2IHRtcGNjbXIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DX01PREUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NNb2RlKSk7DQogIGFzc2VydChJU19USU0xX09VVFBVVF9TVEFURShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PdXRwdXRTdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PVVRQVVROX1NUQVRFKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dE5TdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ19QT0xBUklUWShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ1BvbGFyaXR5KSk7DQogIGFzc2VydChJU19USU0xX09DTl9QT0xBUklUWShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05Qb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ0lETEVfU1RBVEUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NJZGxlU3RhdGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfT0NOSURMRV9TVEFURShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05JZGxlU3RhdGUpKTsgDQoNCiAgdG1wY2NtciA9IFRJTTEtPkNDTVIxOw0KDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgKih2dTMyICopIENDRVJfQ0MxRV9CQiA9IENDRVJfQ0NFX1Jlc2V0Ow0KDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBCaXRzICovDQogICB0bXBjY21yICY9IE9DMTNNb2RlX01hc2s7DQoNCiAgLyogU2V0IHRoZSBPdXB1dCBDb21wYXJlIE1vZGUgKi8NCiAgdG1wY2NtciB8PSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ01vZGU7DQoNCiAgVElNMS0+Q0NNUjEgPSB0bXBjY21yOw0KDQogIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovDQogICoodnUzMiAqKSBDQ0VSX0NDMUVfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PdXRwdXRTdGF0ZTsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQogICoodnUzMiAqKSBDQ0VSX0NDMU5FX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT3V0cHV0TlN0YXRlOw0KDQogIC8qIFNldCB0aGUgT3V0cHV0IFBvbGFyaXR5ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMVBfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ1BvbGFyaXR5Ow0KDQogIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8NCiAgKih2dTMyICopIENDRVJfQ0MxTlBfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05Qb2xhcml0eTsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQogICoodnUzMiAqKSBDUjJfT0lTMV9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DSWRsZVN0YXRlOw0KDQogIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLw0KICAqKHZ1MzIgKikgQ1IyX09JUzFOX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NOSWRsZVN0YXRlOw0KDQogIC8qIFNldCB0aGUgUHVsc2UgdmFsdWUgKi8NCiAgVElNMS0+Q0NSMSA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX1B1bHNlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfT0MySW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBUSU0xIENoYW5uZWwyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNMV9PQ0luaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTTFfT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBUSU0xIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MySW5pdChUSU0xX09DSW5pdFR5cGVEZWYqIFRJTTFfT0NJbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wY2NtciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfT0NfTU9ERShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ01vZGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfT1VUUFVUX1NUQVRFKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dFN0YXRlKSk7DQogIGFzc2VydChJU19USU0xX09VVFBVVE5fU1RBVEUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT3V0cHV0TlN0YXRlKSk7DQogIGFzc2VydChJU19USU0xX09DX1BPTEFSSVRZKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DUG9sYXJpdHkpKTsNCiAgYXNzZXJ0KElTX1RJTTFfT0NOX1BPTEFSSVRZKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTlBvbGFyaXR5KSk7DQogIGFzc2VydChJU19USU0xX09DSURMRV9TVEFURShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ0lkbGVTdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ05JRExFX1NUQVRFKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTklkbGVTdGF0ZSkpOw0KDQogIHRtcGNjbXIgPSBUSU0xLT5DQ01SMTsNCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMkVfQkIgPSBDQ0VSX0NDRV9SZXNldDsNCg0KICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgQml0cyAqLw0KICAgdG1wY2NtciAmPSBPQzI0TW9kZV9NYXNrOw0KDQogIC8qIFNldCB0aGUgT3VwdXQgQ29tcGFyZSBNb2RlICovDQogIHRtcGNjbXIgfD0gKHUzMilUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ01vZGUgPDwgODsNCg0KICBUSU0xLT5DQ01SMSA9ICh1MTYpdG1wY2NtcjsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzJFX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT3V0cHV0U3RhdGU7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzJORV9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dE5TdGF0ZTsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBQb2xhcml0eSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzJQX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NQb2xhcml0eTsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMk5QX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NOUG9sYXJpdHk7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLw0KICAqKHZ1MzIgKikgQ1IyX09JUzJfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ0lkbGVTdGF0ZTsNCg0KICAvKiBTZXQgdGhlIE91dHB1dCBOIElkbGUgc3RhdGUgKi8NCiAgKih2dTMyICopIENSMl9PSVMyTl9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTklkbGVTdGF0ZTsNCg0KICAvKiBTZXQgdGhlIFB1bHNlIHZhbHVlICovDQogIFRJTTEtPkNDUjIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9QdWxzZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DM0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgVElNMSBDaGFubmVsMyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTTFfT0NJbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU0xX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgVElNMSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DM0luaXQoVElNMV9PQ0luaXRUeXBlRGVmKiBUSU0xX09DSW5pdFN0cnVjdCkNCnsNCiAgdTE2IHRtcGNjbXIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DX01PREUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NNb2RlKSk7DQogIGFzc2VydChJU19USU0xX09VVFBVVF9TVEFURShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PdXRwdXRTdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PVVRQVVROX1NUQVRFKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dE5TdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ19QT0xBUklUWShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ1BvbGFyaXR5KSk7DQogIGFzc2VydChJU19USU0xX09DTl9QT0xBUklUWShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05Qb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ0lETEVfU1RBVEUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NJZGxlU3RhdGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfT0NOSURMRV9TVEFURShUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05JZGxlU3RhdGUpKTsNCg0KICB0bXBjY21yID0gVElNMS0+Q0NNUjI7DQoNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzNFX0JCID0gQ0NFUl9DQ0VfUmVzZXQ7DQoNCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgIHRtcGNjbXIgJj0gT0MxM01vZGVfTWFzazsNCg0KICAvKiBTZXQgdGhlIE91cHV0IENvbXBhcmUgTW9kZSAqLw0KICB0bXBjY21yIHw9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTW9kZTsNCg0KICBUSU0xLT5DQ01SMiA9IHRtcGNjbXI7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8NCiAgKih2dTMyICopIENDRVJfQ0MzRV9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dFN0YXRlOw0KDQogIC8qIFNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCiAgKih2dTMyICopIENDRVJfQ0MzTkVfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PdXRwdXROU3RhdGU7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgKi8NCiAgKih2dTMyICopIENDRVJfQ0MzUF9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DUG9sYXJpdHk7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzNOUF9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTlBvbGFyaXR5Ow0KDQogIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCiAgKih2dTMyICopIENSMl9PSVMzX0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NJZGxlU3RhdGU7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQogICoodnUzMiAqKSBDUjJfT0lTM05fQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05JZGxlU3RhdGU7DQoNCiAgLyogU2V0IHRoZSBQdWxzZSB2YWx1ZSAqLw0KICBUSU0xLT5DQ1IzID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfUHVsc2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzRJbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIFRJTTEgQ2hhbm5lbDQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU0xX09DSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNMV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQoqICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTTEgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9PQzRJbml0KFRJTTFfT0NJbml0VHlwZURlZiogVElNMV9PQ0luaXRTdHJ1Y3QpDQp7DQogIHUzMiB0bXBjY21yID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ19NT0RFKFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTW9kZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PVVRQVVRfU1RBVEUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT3V0cHV0U3RhdGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfT0NfUE9MQVJJVFkoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NQb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ0lETEVfU1RBVEUoVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NJZGxlU3RhdGUpKTsNCg0KICB0bXBjY21yID0gVElNMS0+Q0NNUjI7DQoNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzRFX0JCID0gQ0NFUl9DQ0VfUmVzZXQ7DQoNCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgIHRtcGNjbXIgJj0gT0MyNE1vZGVfTWFzazsNCg0KICAvKiBTZXQgdGhlIE91cHV0IENvbXBhcmUgTW9kZSAqLw0KICB0bXBjY21yIHw9ICh1MzIpVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NNb2RlIDw8IDg7DQoNCiAgVElNMS0+Q0NNUjIgPSAodTE2KXRtcGNjbXI7DQoNCiAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8NCiAgKih2dTMyICopIENDRVJfQ0M0RV9CQiA9IFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dFN0YXRlOw0KDQogIC8qIFNldCB0aGUgT3V0cHV0IFBvbGFyaXR5ICovDQogICoodnUzMiAqKSBDQ0VSX0NDNFBfQkIgPSBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ1BvbGFyaXR5Ow0KDQogIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8NCiAgKih2dTMyICopIENSMl9PSVM0X0JCID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NJZGxlU3RhdGU7DQoNCiAgLyogU2V0IHRoZSBQdWxzZSB2YWx1ZSAqLw0KICBUSU0xLT5DQ1I0ID0gVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfUHVsc2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9CRFRSQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGU6IEJyZWFrIGZlYXR1cmUsIGRlYWQgdGltZSwgTG9jayBsZXZlbCwgdGhlIE9TU0ksDQoqICAgICAgICAgICAgICAgICAgdGhlIE9TU1IgU3RhdGUgYW5kIHRoZSBBT0UoYXV0b21hdGljIG91dHB1dCBlbmFibGUpLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9CRFRSSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTTFfQkRUUkluaXRUeXBlRGVmDQoqICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgQkRUUiBSZWdpc3RlciBjb25maWd1cmF0aW9uDQoqICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTTEgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9CRFRSQ29uZmlnKFRJTTFfQkRUUkluaXRUeXBlRGVmICpUSU0xX0JEVFJJbml0U3RydWN0KQ0Kew0KICB1MTYgdG1wYmR0ciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfT1NTUl9TVEFURShUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX09TU1JTdGF0ZSkpOw0KICBhc3NlcnQoSVNfVElNMV9PU1NJX1NUQVRFKFRJTTFfQkRUUkluaXRTdHJ1Y3QtPlRJTTFfT1NTSVN0YXRlKSk7DQogIGFzc2VydChJU19USU0xX0xPQ0tfTEVWRUwoVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9MT0NLTGV2ZWwpKTsNCiAgYXNzZXJ0KElTX1RJTTFfQlJFQUtfU1RBVEUoVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9CcmVhaykpOw0KICBhc3NlcnQoSVNfVElNMV9CUkVBS19QT0xBUklUWShUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0JyZWFrUG9sYXJpdHkpKTsNCiAgYXNzZXJ0KElTX1RJTTFfQVVUT01BVElDX09VVFBVVF9TVEFURShUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0F1dG9tYXRpY091dHB1dCkpOw0KDQogIHRtcGJkdHIgPSBUSU0xLT5CRFRSOw0KDQogIC8qIFNldCB0aGUgTG9jayBsZXZlbCwgdGhlIEJyZWFrIGVuYWJsZSBCaXQgYW5kIHRoZSBQbG9hcml0eSwgdGhlIE9TU1IgU3RhdGUsDQogICAgIHRoZSBPU1NJIFN0YXRlLCB0aGUgZGVhZCB0aW1lIHZhbHVlIGFuZCB0aGUgQXV0b21hdGljIE91dHB1dCBFbmFibGUgQml0ICovDQoNCiAgdG1wYmR0ciA9ICh1MzIpVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9PU1NSU3RhdGUgfCBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX09TU0lTdGF0ZSB8DQogICAgICAgICAgICAgVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9MT0NLTGV2ZWwgfCBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0RlYWRUaW1lIHwNCgkJCSBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0JyZWFrIHwgVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9CcmVha1BvbGFyaXR5IHwNCiAgICAgICAgICAgICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0F1dG9tYXRpY091dHB1dDsNCg0KICBUSU0xLT5CRFRSID0gdG1wYmR0cjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0lDSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBUSU0xIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU0xX0lDSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUNJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNMV9JQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgICAgVElNMSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0lDSW5pdChUSU0xX0lDSW5pdFR5cGVEZWYqIFRJTTFfSUNJbml0U3RydWN0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9DSEFOTkVMKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0NoYW5uZWwpKTsNCiAgYXNzZXJ0KElTX1RJTTFfSUNfUE9MQVJJVFkoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNMV9JQ19TRUxFQ1RJT04oVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNTZWxlY3Rpb24pKTsNCiAgYXNzZXJ0KElTX1RJTTFfSUNfUFJFU0NBTEVSKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUHJlc2NhbGVyKSk7DQogIGFzc2VydChJU19USU0xX0lDX0ZJTFRFUihUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ0ZpbHRlcikpOw0KDQogIGlmIChUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9DaGFubmVsID09IFRJTTFfQ2hhbm5lbF8xKQ0KICB7DQogICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTFfQ29uZmlnKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDRmlsdGVyKTsNCg0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU0xX1NldElDMVByZXNjYWxlcihUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZSBpZiAoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfQ2hhbm5lbCA9PSBUSU0xX0NoYW5uZWxfMikNCiAgew0KICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQogICAgVEkyX0NvbmZpZyhUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1BvbGFyaXR5LA0KICAgICAgICAgICAgICAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ0ZpbHRlcik7DQoNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNMV9TZXRJQzJQcmVzY2FsZXIoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQcmVzY2FsZXIpOw0KICB9DQogIGVsc2UgaWYgKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0NoYW5uZWwgPT0gVElNMV9DaGFubmVsXzMpDQogIHsNCiAgICAvKiBUSTMgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJM19Db25maWcoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTTFfU2V0SUMzUHJlc2NhbGVyKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUHJlc2NhbGVyKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJNF9Db25maWcoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTTFfU2V0SUM0UHJlc2NhbGVyKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUHJlc2NhbGVyKTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfUFdNSUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgcGVyaXBoZXJhbCBpbiBQV00gSW5wdXQgTW9kZSBhY2NvcmRpbmcgDQoqICAgICAgICAgICAgICAgICAgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBUSU0xX0lDSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUNJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNMV9JQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgICAgVElNMSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1BXTUlDb25maWcoVElNMV9JQ0luaXRUeXBlRGVmKiBUSU0xX0lDSW5pdFN0cnVjdCkNCnsNCiAgdTggSUNQb2xhcml0eSA9IFRJTTFfSUNQb2xhcml0eV9SaXNpbmc7DQogIHU4IElDU2VsZWN0aW9uID0gVElNMV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9QV01JX0NIQU5ORUwoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfQ2hhbm5lbCkpOw0KICBhc3NlcnQoSVNfVElNMV9JQ19QT0xBUklUWShUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1BvbGFyaXR5KSk7DQogIGFzc2VydChJU19USU0xX0lDX1NFTEVDVElPTihUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1NlbGVjdGlvbikpOw0KICBhc3NlcnQoSVNfVElNMV9JQ19QUkVTQ0FMRVIoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQcmVzY2FsZXIpKTsNCg0KICAvKiBTZWxlY3QgdGhlIE9wcG9zaXRlIElucHV0IFBvbGFyaXR5ICovDQogIGlmIChUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1BvbGFyaXR5ID09IFRJTTFfSUNQb2xhcml0eV9SaXNpbmcpDQogIHsNCiAgICBJQ1BvbGFyaXR5ID0gVElNMV9JQ1BvbGFyaXR5X0ZhbGxpbmc7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgSUNQb2xhcml0eSA9IFRJTTFfSUNQb2xhcml0eV9SaXNpbmc7DQogIH0NCg0KICAvKiBTZWxlY3QgdGhlIE9wcG9zaXRlIElucHV0ICovDQogIGlmIChUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1NlbGVjdGlvbiA9PSBUSU0xX0lDU2VsZWN0aW9uX0RpcmVjdFRJKQ0KICB7DQogICAgSUNTZWxlY3Rpb24gPSBUSU0xX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgSUNTZWxlY3Rpb24gPSBUSU0xX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KICB9DQoNCiAgaWYgKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0NoYW5uZWwgPT0gVElNMV9DaGFubmVsXzEpDQogIHsNCiAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMV9Db25maWcoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQb2xhcml0eSwgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ0ZpbHRlcik7DQoNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNMV9TZXRJQzFQcmVzY2FsZXIoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQcmVzY2FsZXIpOw0KDQogICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTJfQ29uZmlnKElDUG9sYXJpdHksIElDU2VsZWN0aW9uLCBUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ0ZpbHRlcik7DQoNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNMV9TZXRJQzJQcmVzY2FsZXIoVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQcmVzY2FsZXIpOw0KICB9DQogIGVsc2UNCiAgewkgDQogICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTJfQ29uZmlnKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUG9sYXJpdHksIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTTFfU2V0SUMyUHJlc2NhbGVyKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUHJlc2NhbGVyKTsNCg0KICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovDQogICAgVEkxX0NvbmZpZyhJQ1BvbGFyaXR5LCBJQ1NlbGVjdGlvbiwgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTTFfU2V0SUMxUHJlc2NhbGVyKFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDUHJlc2NhbGVyKTsNCiAgfQ0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVElNMV9PQ0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBUSU0xX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DU3RydWN0SW5pdChUSU0xX09DSW5pdFR5cGVEZWYqIFRJTTFfT0NJbml0U3RydWN0KQ0Kew0KICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLw0KICBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ01vZGUgPSBUSU0xX09DTW9kZV9UaW1pbmc7DQogIFRJTTFfT0NJbml0U3RydWN0LT5USU0xX091dHB1dFN0YXRlID0gVElNMV9PdXRwdXRTdGF0ZV9EaXNhYmxlOw0KICBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PdXRwdXROU3RhdGUgPSBUSU0xX091dHB1dE5TdGF0ZV9EaXNhYmxlOw0KICBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9QdWxzZSA9IFRJTTFfUHVsc2VfUmVzZXRfTWFzazsNCiAgVElNMV9PQ0luaXRTdHJ1Y3QtPlRJTTFfT0NQb2xhcml0eSA9IFRJTTFfT0NQb2xhcml0eV9IaWdoOw0KICBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ05Qb2xhcml0eSA9IFRJTTFfT0NQb2xhcml0eV9IaWdoOw0KICBUSU0xX09DSW5pdFN0cnVjdC0+VElNMV9PQ0lkbGVTdGF0ZSA9IFRJTTFfT0NJZGxlU3RhdGVfUmVzZXQ7DQogIFRJTTFfT0NJbml0U3RydWN0LT5USU0xX09DTklkbGVTdGF0ZSA9IFRJTTFfT0NOSWRsZVN0YXRlX1Jlc2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfSUNTdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBUSU0xX0lDSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUNJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTTFfSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfSUNTdHJ1Y3RJbml0KFRJTTFfSUNJbml0VHlwZURlZiogVElNMV9JQ0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0NoYW5uZWwgPSBUSU0xX0NoYW5uZWxfMTsNCiAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNTZWxlY3Rpb24gPSBUSU0xX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KICBUSU0xX0lDSW5pdFN0cnVjdC0+VElNMV9JQ1BvbGFyaXR5ID0gVElNMV9JQ1BvbGFyaXR5X1Jpc2luZzsNCiAgVElNMV9JQ0luaXRTdHJ1Y3QtPlRJTTFfSUNQcmVzY2FsZXIgPSBUSU0xX0lDUFNDX0RJVjE7DQogIFRJTTFfSUNJbml0U3RydWN0LT5USU0xX0lDRmlsdGVyID0gVElNMV9JQ0ZpbHRlcl9NYXNrOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfVGltZUJhc2VTdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfVGltZUJhc2VJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTTFfVGltZUJhc2VJbml0VHlwZURlZg0KKiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfVGltZUJhc2VTdHJ1Y3RJbml0KFRJTTFfVGltZUJhc2VJbml0VHlwZURlZiogVElNMV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTTFfVGltZUJhc2VJbml0U3RydWN0LT5USU0xX1BlcmlvZCA9IFRJTTFfUGVyaW9kX1Jlc2V0X01hc2s7DQogIFRJTTFfVGltZUJhc2VJbml0U3RydWN0LT5USU0xX1ByZXNjYWxlciA9IFRJTTFfUHJlc2NhbGVyX1Jlc2V0X01hc2s7DQogIFRJTTFfVGltZUJhc2VJbml0U3RydWN0LT5USU0xX0Nsb2NrRGl2aXNpb24gPSBUSU0xX0NLRF9ESVYxOw0KICBUSU0xX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNMV9Db3VudGVyTW9kZSA9IFRJTTFfQ291bnRlck1vZGVfVXA7DQogIFRJTTFfVGltZUJhc2VJbml0U3RydWN0LT5USU0xX1JlcGV0aXRpb25Db3VudGVyID0gVElNMV9SZXBldGl0aW9uQ291bnRlcl9SZXNldF9NYXNrOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfQkRUUlN0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFRJTTFfQkRUUkluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0JEVFJJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTTFfQkRUUkluaXRUeXBlRGVmDQoqICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9CRFRSU3RydWN0SW5pdChUSU0xX0JEVFJJbml0VHlwZURlZiogVElNMV9CRFRSSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCiAgVElNMV9CRFRSSW5pdFN0cnVjdC0+VElNMV9PU1NSU3RhdGUgPSBUSU0xX09TU1JTdGF0ZV9EaXNhYmxlOw0KICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX09TU0lTdGF0ZSA9IFRJTTFfT1NTSVN0YXRlX0Rpc2FibGU7DQogIFRJTTFfQkRUUkluaXRTdHJ1Y3QtPlRJTTFfTE9DS0xldmVsID0gVElNMV9MT0NLTGV2ZWxfT0ZGOw0KICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0RlYWRUaW1lID0gVElNMV9EZWFkVGltZV9SZXNldF9NYXNrOw0KICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0JyZWFrID0gVElNMV9CcmVha19EaXNhYmxlOw0KICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0JyZWFrUG9sYXJpdHkgPSBUSU0xX0JyZWFrUG9sYXJpdHlfTG93Ow0KICBUSU0xX0JEVFJJbml0U3RydWN0LT5USU0xX0F1dG9tYXRpY091dHB1dCA9IFRJTTFfQXV0b21hdGljT3V0cHV0X0Rpc2FibGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9DbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0xIHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU0xIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgLyogc2V0IG9yIFJlc2V0IHRoZSBDRU4gQml0ICovDQogICoodnUzMiAqKSBDUjFfQ0VOX0JCID0gKHUxNilOZXdTdGF0ZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0N0cmxQV01PdXRwdXRzDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMSBwZXJpcGhlcmFsIE1haW4gT3V0cHV0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTTEgcGVyaXBoZXJhbCBNYWluIE91dHB1dHMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0N0cmxQV01PdXRwdXRzKEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3c3RhdGUpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIE1PRSBCaXQgKi8NCiAgKih2dTMyICopIEJEVFJfTU9FX0JCID0gKHUxNilOZXdzdGF0ZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFRJTTEgaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSVQ6IHNwZWNpZmllcyB0aGUgVElNMSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX1VwZGF0ZTogVElNMSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX0NDMTogVElNMSBDYXB0dXJlIENvbXBhcmUgMSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0MyOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAyIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9DQzM6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDMgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX0NDNDogVElNMSBDYXB0dXJlIENvbXBhcmUgNCBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0NVcGRhdGU6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIFVwZGF0ZSBJbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfVHJpZ2dlcjogVElNMSBUcmlnZ2VyIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9CcmVhazogVElNMSBCcmVhayBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU0xIGludGVycnVwdHMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0lUQ29uZmlnKHUxNiBUSU0xX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0lUKFRJTTFfSVQpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBJbnRlcnJ1cHQgc291cmNlcyAqLw0KICAgIFRJTTEtPkRJRVIgfD0gVElNMV9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBJbnRlcnJ1cHQgc291cmNlcyAqLw0KICAgIFRJTTEtPkRJRVIgJj0gKHUxNil+VElNMV9JVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfRE1BQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMZJzIERNQSBpbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0RNQUJhc2U6IERNQSBCYXNlIGFkZHJlc3MuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQUJhc2VfQ1IxLCBUSU0xX0RNQUJhc2VfQ1IyLCBUSU0xX0RNQUJhc2VfU01DUiwNCiogICAgICAgICAgICAgICAgICAgICAgICAgVElNMV9ETUFCYXNlX0RJRVIsIFRJTTFfRE1BQmFzZV9TUiwgVElNMV9ETUFCYXNlX0VHUiwNCiogICAgICAgICAgICAgICAgICAgICAgICAgVElNMV9ETUFCYXNlX0NDTVIxLCBUSU0xX0RNQUJhc2VfQ0NNUjIsIFRJTTFfRE1BQmFzZV9DQ0VSLA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBUSU0xX0RNQUJhc2VfQ05ULCBUSU0xX0RNQUJhc2VfUFNDLCBUSU0xX0RNQUJhc2VfQVJSLA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBUSU0xX0RNQUJhc2VfUkNSLCBUSU0xX0RNQUJhc2VfQ0NSMSwgVElNMV9ETUFCYXNlX0NDUjIsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJTTFfRE1BQmFzZV9DQ1IzLCBUSU0xX0RNQUJhc2VfQ0NSNCwgVElNMV9ETUFCYXNlX0JEVFIsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJTTFfRE1BQmFzZV9EQ1IuDQoqICAgICAgICAgICAgICAgICAgIC0gVElNMV9ETUFCdXJzdExlbmd0aDogRE1BIEJ1cnN0IGxlbmd0aC4NCiogICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIGJldHdlZW46DQoqICAgICAgICAgICAgICAgICAgICAgVElNMV9ETUFCdXJzdExlbmd0aF8xQnl0ZSBhbmQgVElNMV9ETUFCdXJzdExlbmd0aF8xOEJ5dGVzLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0RNQUNvbmZpZyh1MTYgVElNMV9ETUFCYXNlLCB1MTYgVElNMV9ETUFCdXJzdExlbmd0aCkNCnsNCiAgdTMyIHRtcGRjciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfRE1BX0JBU0UoVElNMV9ETUFCYXNlKSk7DQogIGFzc2VydChJU19USU0xX0RNQV9MRU5HVEgoVElNMV9ETUFCdXJzdExlbmd0aCkpOw0KDQogIHRtcGRjciA9IFRJTTEtPkRDUjsNCg0KICAvKiBSZXNldCB0aGUgREJBIGFuZCB0aGUgREJMIEJpdHMgKi8NCiAgdG1wZGNyICY9IERDUl9ETUFfTWFzazsNCg0KICAvKiBTZXQgdGhlIERNQSBCYXNlIGFuZCB0aGUgRE1BIEJ1cnN0IExlbmd0aCAqLw0KICB0bXBkY3IgfD0gVElNMV9ETUFCYXNlIHwgVElNMV9ETUFCdXJzdExlbmd0aDsNCg0KICBUSU0xLT5EQ1IgPSAodTE2KXRtcGRjcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0RNQUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTTGScyBETUEgUmVxdWVzdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0RNQVNvdXJjZXM6IHNwZWNpZmllcyB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRE1BX1VwZGF0ZTogVElNMSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQV9DQzE6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQV9DQzI6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQV9DQzM6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQV9DQzQ6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0RNQV9DT006IFRJTTEgQ2FwdHVyZSBDb21wYXJlIFVwZGF0ZSBETUENCiogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRE1BX1RyaWdnZXI6IFRJTTEgVHJpZ2dlciBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9ETUFDbWQodTE2IFRJTTFfRE1BU291cmNlLCBGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIHUzMiB0bXBkaWVyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9ETUFfU09VUkNFKFRJTTFfRE1BU291cmNlKSk7DQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgdG1wZGllciA9IFRJTTEtPkRJRVI7DQoNCiAgaWYgKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgRE1BIHNvdXJjZXMgKi8NCiAgICB0bXBkaWVyIHw9IFRJTTFfRE1BU291cmNlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIERNQSBzb3VyY2VzICovDQogICAgdG1wZGllciAmPSAodTE2KX5USU0xX0RNQVNvdXJjZTsNCiAgfQ0KICBUSU0xLT5ESUVSID0gKHUxNil0bXBkaWVyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfSW50ZXJuYWxDbG9ja0NvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgaW50ZXJybmFsIENsb2NrDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0ludGVybmFsQ2xvY2tDb25maWcodm9pZCkNCnsNCiAgLyogRGlzYWJsZSBzbGF2ZSBtb2RlIHRvIGNsb2NrIHRoZSBwcmVzY2FsZXIgZGlyZWN0bHkgd2l0aCB0aGUgaW50ZXJuYWwgY2xvY2sgKi8NCiAgVElNMS0+U01DUiAmPSAgU01DUl9TTVNfTWFzazsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9FVFJDbG9ja01vZGUxQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBFeHRlcm5hbCBjbG9jayBNb2RlMQ0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9FeHRUUkdQcmVzY2FsZXI6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4NCiogICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUFNDX09GRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BTQ19ESVYyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUFNDX0RJVjQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQU0NfRElWOC4NCiogICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KKiAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQb2xhcml0eV9JbnZlcnRlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkDQoqICAgICAgICAgICAgICAgICAgLSBFeHRUUkdGaWx0ZXI6IEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0VUUkNsb2NrTW9kZTFDb25maWcodTE2IFRJTTFfRXh0VFJHUHJlc2NhbGVyLCB1MTYgVElNMV9FeHRUUkdQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IEV4dFRSR0ZpbHRlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfRVhUX1BSRVNDQUxFUihUSU0xX0V4dFRSR1ByZXNjYWxlcikpOw0KICBhc3NlcnQoSVNfVElNMV9FWFRfUE9MQVJJVFkoVElNMV9FeHRUUkdQb2xhcml0eSkpOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KICBFVFJfQ29uZmlnKFRJTTFfRXh0VFJHUHJlc2NhbGVyLCBUSU0xX0V4dFRSR1BvbGFyaXR5LCBFeHRUUkdGaWx0ZXIpOw0KDQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgVElNMS0+U01DUiAmPSBTTUNSX1NNU19NYXNrOw0KICBUSU0xLT5TTUNSIHw9IFRJTTFfU2xhdmVNb2RlX0V4dGVybmFsMTsNCiAgDQogIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzZWxlY3Rpb24gOiBFVFJGICovDQogIFRJTTEtPlNNQ1IgJj0gU01DUl9UU19NYXNrOw0KICBUSU0xLT5TTUNSIHw9IFRJTTFfVFNfRVRSRjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0VUUkNsb2NrTW9kZTJDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIEV4dGVybmFsIGNsb2NrIE1vZGUyDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0V4dFRSR1ByZXNjYWxlcjogVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KKiAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQU0NfT0ZGDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUFNDX0RJVjINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQU0NfRElWNA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BTQ19ESVY4DQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BvbGFyaXR5OiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4NCiogICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQb2xhcml0eV9Ob25JbnZlcnRlZA0KKiAgICAgICAgICAgICAgICAgIC0gRXh0VFJHRmlsdGVyOiBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9FVFJDbG9ja01vZGUyQ29uZmlnKHUxNiBUSU0xX0V4dFRSR1ByZXNjYWxlciwgdTE2IFRJTTFfRXh0VFJHUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBFeHRUUkdGaWx0ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0VYVF9QUkVTQ0FMRVIoVElNMV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0KElTX1RJTTFfRVhUX1BPTEFSSVRZKFRJTTFfRXh0VFJHUG9sYXJpdHkpKTsNCg0KICAvKiBDb25maWd1cmUgdGhlIEVUUiBDbG9jayBzb3VyY2UgKi8NCiAgRVRSX0NvbmZpZyhUSU0xX0V4dFRSR1ByZXNjYWxlciwgVElNMV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCg0KICAvKiBFbmFibGUgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUyICovDQogICoodnUzMiAqKSBTTUNSX0VDRV9CQiA9IFNNQ1JfRUNFX1NldDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0lUUnhFeHRlcm5hbENsb2NrQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBJbnRlcm5hbCBUcmlnZ2VyIGFzIEV4dGVybmFsIENsb2NrDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0lUUlNvdXJjZTogSW50ZXJuYWwgVHJpZ2dlciBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RTX0lUUjE6IEludGVybmFsIFRyaWdnZXIgMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RTX0lUUjI6IEludGVybmFsIFRyaWdnZXIgMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0lUUnhFeHRlcm5hbENsb2NrQ29uZmlnKHUxNiBUSU0xX0lucHV0VHJpZ2dlclNvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oVElNMV9JbnB1dFRyaWdnZXJTb3VyY2UpKTsNCiAgDQogIC8qIFNlbGVjdCB0aGUgSW50ZXJuYWwgVHJpZ2dlciAqLw0KICBUSU0xX1NlbGVjdElucHV0VHJpZ2dlcihUSU0xX0lucHV0VHJpZ2dlclNvdXJjZSk7DQoNCiAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KICBUSU0xLT5TTUNSIHw9IFRJTTFfU2xhdmVNb2RlX0V4dGVybmFsMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1RJeEV4dGVybmFsQ2xvY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIFRyaWdnZXIgYXMgRXh0ZXJuYWwgQ2xvY2sNCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfVEl4RXh0ZXJuYWxDTEtTb3VyY2U6IFRyaWdnZXIgc291cmNlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RTX1RJMUZQMTogRmlsdGVyZWQgVElNMSBJbnB1dCAxDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfVEkyRlAyOiBGaWx0ZXJlZCBUSU0xIElucHV0IDINCiogICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBUSXggUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQb2xhcml0eV9SaXNpbmcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAgLSBJQ0ZpbHRlciA6IHNwZWNpZmllcyB0aGUgZmlsdGVyIHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MCBhbmQgMHhGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1RJeEV4dGVybmFsQ2xvY2tDb25maWcodTE2IFRJTTFfVEl4RXh0ZXJuYWxDTEtTb3VyY2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBUSU0xX0lDUG9sYXJpdHksIHU4IElDRmlsdGVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9USVhfVFJJR0dFUl9TRUxFQ1RJT04oVElNMV9USXhFeHRlcm5hbENMS1NvdXJjZSkpOw0KICBhc3NlcnQoSVNfVElNMV9JQ19QT0xBUklUWShUSU0xX0lDUG9sYXJpdHkpKTsNCiAgYXNzZXJ0KElTX1RJTTFfSUNfRklMVEVSKElDRmlsdGVyKSk7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBUSU0xIElucHV0IENsb2NrIFNvdXJjZSAqLw0KICBpZiAoVElNMV9USXhFeHRlcm5hbENMS1NvdXJjZSA9PSBUSU0xX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTIpDQogIHsNCiAgICBUSTJfQ29uZmlnKFRJTTFfSUNQb2xhcml0eSwgVElNMV9JQ1NlbGVjdGlvbl9EaXJlY3RUSSwgSUNGaWx0ZXIpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFRJMV9Db25maWcoVElNMV9JQ1BvbGFyaXR5LCBUSU0xX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQogIH0NCg0KICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovDQogIFRJTTFfU2VsZWN0SW5wdXRUcmlnZ2VyKFRJTTFfVEl4RXh0ZXJuYWxDTEtTb3VyY2UpOw0KDQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgVElNMS0+U01DUiB8PSBUSU0xX1NsYXZlTW9kZV9FeHRlcm5hbDE7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2VsZWN0SW5wdXRUcmlnZ2VyDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgVElNMSBJbnB1dCBUcmlnZ2VyIHNvdXJjZQ0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9JbnB1dFRyaWdnZXJTb3VyY2U6IFRoZSBUcmlnZ2VyIHNvdXJjZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFNfVEkxRl9FRDogVEkxIEVkZ2UgRGV0ZWN0b3INCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UU19USTFGUDE6IEZpbHRlcmVkIFRpbWVyIElucHV0IDENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UU19USTJGUDI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UU19FVFJGOiBFeHRlcm5hbCBUcmlnZ2VyIGlucHV0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2VsZWN0SW5wdXRUcmlnZ2VyKHUxNiBUSU0xX0lucHV0VHJpZ2dlclNvdXJjZSkNCnsNCiAgdTMyIHRtcHNtY3IgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX1RSSUdHRVJfU0VMRUNUSU9OKFRJTTFfSW5wdXRUcmlnZ2VyU291cmNlKSk7DQoNCiAgdG1wc21jciA9IFRJTTEtPlNNQ1I7DQoNCiAgLyogU2VsZWN0IHRoZSBUZ2lnZ2VyIFNvdXJjZSAqLw0KICB0bXBzbWNyICY9IFNNQ1JfVFNfTWFzazsNCiAgdG1wc21jciB8PSBUSU0xX0lucHV0VHJpZ2dlclNvdXJjZTsNCg0KICBUSU0xLT5TTUNSID0gKHUxNil0bXBzbWNyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfVXBkYXRlRGlzYWJsZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgRGlzYWJsZXMgdGhlIFRJTTEgVXBkYXRlIGV2ZW50Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfVXBkYXRlRGlzYWJsZUNvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBVRElTIEJpdCAqLw0KICAqKHZ1MzIgKikgQ1IxX1VESVNfQkIgPSAodTE2KU5ld3N0YXRlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfVXBkYXRlUmVxdWVzdENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIFRJTTEgVXBkYXRlIFJlcXVlc3QgSW50ZXJydXB0IHNvdXJjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfVXBkYXRlU291cmNlOiBzcGVjaWZpZXMgdGhlIFVwZGF0ZSBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1VwZGF0ZVNvdXJjZV9SZWd1bGFyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVXBkYXRlU291cmNlX0dsb2JhbA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1VwZGF0ZVJlcXVlc3RDb25maWcodTggVElNMV9VcGRhdGVTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX1VQREFURV9TT1VSQ0UoVElNMV9VcGRhdGVTb3VyY2UpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIFVSUyBCaXQgKi8NCiAgKih2dTMyICopIENSMV9VUlNfQkIgPSBUSU0xX1VwZGF0ZVNvdXJjZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NlbGVjdEhhbGxTZW5zb3INCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0xknMgSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNMSBIYWxsIHNlbnNvciBpbnRlcmZhY2UNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZWxlY3RIYWxsU2Vuc29yKEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3c3RhdGUpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIFRJMVMgQml0ICovDQogICoodnUzMiAqKSBDUjJfVEkxU19CQiA9ICh1MTYpTmV3c3RhdGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9TZWxlY3RPUE0NCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0xknMgT25lIFB1bHNlIE1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09QTW9kZTogc3BlY2lmaWVzIHRoZSBPUE0gTW9kZSB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgIC0gVElNMV9PUE1vZGVfU2luZ2xlDQoqICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT1BNb2RlX1JlcGV0aXRpdmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZWxlY3RPbmVQdWxzZU1vZGUodTE2IFRJTTFfT1BNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PUE1fTU9ERShUSU0xX09QTW9kZSkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT1BNIEJpdCAqLw0KICAqKHZ1MzIgKikgQ1IxX09QTV9CQiA9IFRJTTFfT1BNb2RlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2VsZWN0T3V0cHV0VHJpZ2dlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIFRJTTEgVHJpZ2dlciBPdXRwdXQgTW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfVFJHT1NvdXJjZTogc3BlY2lmaWVzIHRoZSBUcmlnZ2VyIE91dHB1dCBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtdGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFJHT1NvdXJjZV9SZXNldA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RSR09Tb3VyY2VfRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFJHT1NvdXJjZV9VcGRhdGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UUkdPU291cmNlX09DMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RSR09Tb3VyY2VfT0MxUmVmDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfVFJHT1NvdXJjZV9PQzJSZWYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9UUkdPU291cmNlX09DM1JlZg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1RSR09Tb3VyY2VfT0M0UmVmDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2VsZWN0T3V0cHV0VHJpZ2dlcih1MTYgVElNMV9UUkdPU291cmNlKQ0Kew0KICB1MzIgdG1wY3IyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9UUkdPX1NPVVJDRShUSU0xX1RSR09Tb3VyY2UpKTsNCg0KICB0bXBjcjIgPSBUSU0xLT5DUjI7DQoNCiAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovDQogIHRtcGNyMiAmPSBDUjJfTU1TX01hc2s7DQoNCiAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLw0KICB0bXBjcjIgfD0gIFRJTTFfVFJHT1NvdXJjZTsNCg0KICBUSU0xLT5DUjIgPSAodTE2KXRtcGNyMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NlbGVjdFNsYXZlTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIFRJTTEgU2xhdmUgTW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfU2xhdmVNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTTEgU2xhdmUgTW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9TbGF2ZU1vZGVfUmVzZXQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9TbGF2ZU1vZGVfR2F0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9TbGF2ZU1vZGVfVHJpZ2dlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX1NsYXZlTW9kZV9FeHRlcm5hbDENCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZWxlY3RTbGF2ZU1vZGUodTE2IFRJTTFfU2xhdmVNb2RlKQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfU0xBVkVfTU9ERShUSU0xX1NsYXZlTW9kZSkpOw0KDQogIHRtcHNtY3IgPSBUSU0xLT5TTUNSOw0KDQogIC8qIFJlc2V0IHRoZSBTTVMgQml0cyAqLw0KICB0bXBzbWNyICY9IFNNQ1JfU01TX01hc2s7DQoNCiAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovDQogIHRtcHNtY3IgfD0gVElNMV9TbGF2ZU1vZGU7DQoNCiAgVElNMS0+U01DUiA9ICh1MTYpdG1wc21jcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NlbGVjdE1hc3RlclNsYXZlTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgb3IgUmVzZXRzIHRoZSBUSU0xIE1hc3Rlci9TbGF2ZSBNb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9NYXN0ZXJTbGF2ZU1vZGU6IHNwZWNpZmllcyB0aGUgVElNMSBNYXN0ZXIgU2xhdmUgTW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9NYXN0ZXJTbGF2ZU1vZGVfRW5hYmxlOiBzeW5jaHJvbml6YXRpb24gYmV0d2Vlbg0KKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCB0aW1lciBhbmQgaXRzIHNsYXZlcyAodGhyb3VnaCBUUkdPKS4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9NYXN0ZXJTbGF2ZU1vZGVfRGlzYWJsZTogTm8gYWN0aW9uDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2VsZWN0TWFzdGVyU2xhdmVNb2RlKHUxNiBUSU0xX01hc3RlclNsYXZlTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfTVNNX1NUQVRFKFRJTTFfTWFzdGVyU2xhdmVNb2RlKSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBNU00gQml0ICovDQogICoodnUzMiAqKSBTTUNSX01TTV9CQiA9IFRJTTFfTWFzdGVyU2xhdmVNb2RlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfRW5jb2RlckludGVyZmFjZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgRW5jb2RlciBJbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0VuY29kZXJNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTTEgRW5jb2RlciBNb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FbmNvZGVyTW9kZV9USTE6IENvdW50ZXIgY291bnRzIG9uIFRJMUZQMSBlZGdlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBUSTJGUDIgbGV2ZWwuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRW5jb2Rlck1vZGVfVEkyOiBDb3VudGVyIGNvdW50cyBvbiBUSTJGUDIgZWRnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0VuY29kZXJNb2RlX1RJMTI6IENvdW50ZXIgY291bnRzIG9uIGJvdGggVEkxRlAxIGFuZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiB0aGUgb3RoZXIgaW5wdXQuDQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDMVBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIElDMSBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfRmFsbGluZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfUmlzaW5nDQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDMlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIElDMiBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfRmFsbGluZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfUmlzaW5nDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfRW5jb2RlckludGVyZmFjZUNvbmZpZyh1MTYgVElNMV9FbmNvZGVyTW9kZSwgdTE2IFRJTTFfSUMxUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBUSU0xX0lDMlBvbGFyaXR5KQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfRU5DT0RFUl9NT0RFKFRJTTFfRW5jb2Rlck1vZGUpKTsNCiAgYXNzZXJ0KElTX1RJTTFfSUNfUE9MQVJJVFkoVElNMV9JQzFQb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNMV9JQ19QT0xBUklUWShUSU0xX0lDMlBvbGFyaXR5KSk7DQoNCiAgdG1wc21jciA9IFRJTTEtPlNNQ1I7DQogIHRtcGNjbXIxID0gVElNMS0+Q0NNUjE7DQoNCiAgLyogU2V0IHRoZSBlbmNvZGVyIE1vZGUgKi8NCiAgdG1wc21jciAmPSBTTUNSX1NNU19NYXNrOw0KICB0bXBzbWNyIHw9IFRJTTFfRW5jb2Rlck1vZGU7DQoNCiAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovDQogIHRtcGNjbXIxICY9IENDTVJfQ0MxM1NfTWFzayAmIENDTVJfQ0MyNFNfTWFzazsNCiAgdG1wY2NtcjEgfD0gQ0NNUl9USTEzRGlyZWN0X1NldCB8IENDTVJfVEkyNERpcmVjdF9TZXQ7DQoNCiAgLyogU2V0IHRoZSBUSTEgYW5kIHRoZSBUSTIgUG9sYXJpdGllcyAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzFQX0JCID0gVElNMV9JQzFQb2xhcml0eTsNCiAgKih2dTMyICopIENDRVJfQ0MyUF9CQiA9IFRJTTFfSUMyUG9sYXJpdHk7DQoNCiAgVElNMS0+U01DUiA9ICh1MTYpdG1wc21jcjsNCg0KICBUSU0xLT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9QcmVzY2FsZXJDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIFByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUNCiogICAgICAgICAgICAgICAgICAtIFRJTTFfUFNDUmVsb2FkTW9kZTogc3BlY2lmaWVzIHRoZSBUSU0xIFByZXNjYWxlciBSZWxvYWQgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9QU0NSZWxvYWRNb2RlX1VwZGF0ZTogVGhlIFByZXNjYWxlciBpcyBsb2FkZWQgYXQNCiogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVwZGF0ZSBldmVudC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9QU0NSZWxvYWRNb2RlX0ltbWVkaWF0ZTogVGhlIFByZXNjYWxlciBpcyBsb2FkZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRseS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9QcmVzY2FsZXJDb25maWcodTE2IFByZXNjYWxlciwgdTE2IFRJTTFfUFNDUmVsb2FkTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfUFJFU0NBTEVSX1JFTE9BRChUSU0xX1BTQ1JlbG9hZE1vZGUpKTsNCg0KICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLw0KICBUSU0xLT5QU0MgPSBQcmVzY2FsZXI7DQoNCiAgLyogU2V0IG9yIHJlc2V0IHRoZSBVRyBCaXQgKi8NCiAgKih2dTMyICopIEVHUl9VR19CQiA9IFRJTTFfUFNDUmVsb2FkTW9kZTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9Db3VudGVyTW9kZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFNwZWNpZmllcyB0aGUgVElNMSBDb3VudGVyIE1vZGUgdG8gYmUgdXNlZC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfQ291bnRlck1vZGU6IHNwZWNpZmllcyB0aGUgQ291bnRlciBNb2RlIHRvIGJlIHVzZWQNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ291bnRlck1vZGVfVXA6IFRJTTEgVXAgQ291bnRpbmcgTW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NvdW50ZXJNb2RlX0Rvd246IFRJTTEgRG93biBDb3VudGluZyBNb2RlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDE6IFRJTTEgQ2VudGVyIEFsaWduZWQgTW9kZTENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMjogVElNMSBDZW50ZXIgQWxpZ25lZCBNb2RlMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQzOiBUSU0xIENlbnRlciBBbGlnbmVkIE1vZGUzDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfQ291bnRlck1vZGVDb25maWcodTE2IFRJTTFfQ291bnRlck1vZGUpDQp7DQogIHUzMiB0bXBjcjEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0NPVU5URVJfTU9ERShUSU0xX0NvdW50ZXJNb2RlKSk7DQoNCiAgdG1wY3IxID0gVElNMS0+Q1IxOw0KDQogIC8qIFJlc2V0IHRoZSBDTVMgYW5kIERJUiBCaXRzICovDQogIHRtcGNyMSAmPSBDUjFfQ291bnRlck1vZGVfTWFzazsNCg0KICAvKiBTZXQgdGhlIENvdW50ZXIgTW9kZSAqLw0KICB0bXBjcjEgfD0gVElNMV9Db3VudGVyTW9kZTsNCg0KICBUSU0xLT5DUjEgPSAodTE2KXRtcGNyMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0ZvcmNlZE9DMUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEZvcmNlcyB0aGUgVElNMSBDaGFubmVsMSBvdXRwdXQgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIA0KKiAgICAgICAgICAgICAgICAgIGxldmVsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8NCiogICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzFSRUYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmU6IEZvcmNlIGluYWN0aXZlIGxldmVsIG9uDQoqICAgICAgICAgICAgICAgICAgICAgICAgIE9DMVJFRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9Gb3JjZWRPQzFDb25maWcodTE2IFRJTTFfRm9yY2VkQWN0aW9uKQ0Kew0KICB1MzIgdG1wY2NtcjEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0ZPUkNFRF9BQ1RJT04oVElNMV9Gb3JjZWRBY3Rpb24pKTsNCg0KICB0bXBjY21yMSA9IFRJTTEtPkNDTVIxOw0KDQogIC8qIFJlc2V0IHRoZSBPQ00gQml0cyAqLw0KICB0bXBjY21yMSAmPSBDQ01SX09DTTEzX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIFRoZSBGb3JjZWQgb3V0cHV0IE1vZGUgKi8NCiAgdG1wY2NtcjEgfD0gVElNMV9Gb3JjZWRBY3Rpb247DQoNCiAgVElNMS0+Q0NNUjEgPSAodTE2KXRtcGNjbXIxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfRm9yY2VkT0MyQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRm9yY2VzIHRoZSBUSU0xIENoYW5uZWwyIG91dHB1dCB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgDQoqICAgICAgICAgICAgICAgICAgbGV2ZWwuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0bw0KKiAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3YXZlZm9ybS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DMlJFRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgT0MyUkVGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0ZvcmNlZE9DMkNvbmZpZyh1MTYgVElNMV9Gb3JjZWRBY3Rpb24pDQp7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfRk9SQ0VEX0FDVElPTihUSU0xX0ZvcmNlZEFjdGlvbikpOw0KDQogIHRtcGNjbXIxID0gVElNMS0+Q0NNUjE7DQoNCiAgLyogUmVzZXQgdGhlIE9DTSBCaXRzICovDQogIHRtcGNjbXIxICY9IENDTVJfT0NNMjRfTWFzazsNCg0KICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KICB0bXBjY21yMSB8PSAodTMyKVRJTTFfRm9yY2VkQWN0aW9uIDw8IDg7DQoNCiAgVElNMS0+Q0NNUjEgPSAodTE2KXRtcGNjbXIxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfRm9yY2VkT0MzQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRm9yY2VzIHRoZSBUSU0xIENoYW5uZWwzIG91dHB1dCB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgDQoqICAgICAgICAgICAgICAgICAgbGV2ZWwuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0bw0KKiAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3YXZlZm9ybS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DM1JFRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgT0MzUkVGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0ZvcmNlZE9DM0NvbmZpZyh1MTYgVElNMV9Gb3JjZWRBY3Rpb24pDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfRk9SQ0VEX0FDVElPTihUSU0xX0ZvcmNlZEFjdGlvbikpOw0KDQogIHRtcGNjbXIyID0gVElNMS0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIE9DTSBCaXRzICovDQogIHRtcGNjbXIyICY9IENDTVJfT0NNMTNfTWFzazsNCg0KICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KICB0bXBjY21yMiB8PSBUSU0xX0ZvcmNlZEFjdGlvbjsNCg0KICBUSU0xLT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9Gb3JjZWRPQzRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBGb3JjZXMgdGhlIFRJTTEgQ2hhbm5lbDQgb3V0cHV0IHdhdmVmb3JtIHRvIGFjdGl2ZSBvciBpbmFjdGl2ZSANCiogICAgICAgICAgICAgICAgICBsZXZlbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvDQoqICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0M0UkVGDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbg0KKiAgICAgICAgICAgICAgICAgICAgICAgICBPQzRSRUYuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfRm9yY2VkT0M0Q29uZmlnKHUxNiBUSU0xX0ZvcmNlZEFjdGlvbikNCnsNCiAgdTMyIHRtcGNjbXIyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9GT1JDRURfQUNUSU9OKFRJTTFfRm9yY2VkQWN0aW9uKSk7DQoNCiAgdG1wY2NtcjIgPSBUSU0xLT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgT0NNIEJpdHMgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9PQ00yNF9NYXNrOw0KDQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIyIHw9ICh1MTYpKCh1MTYpVElNMV9Gb3JjZWRBY3Rpb24gPDwgOCk7DQoNCiAgVElNMS0+Q0NNUjIgPSAodTE2KXRtcGNjbXIyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfQVJSUHJlbG9hZENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQVJSLg0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfQVJSUHJlbG9hZENvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBBUlBFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ1IxX0FSUEVfQkIgPSAodTE2KU5ld3N0YXRlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2VsZWN0Q09NDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgVElNMSBwZXJpcGhlcmFsIENvbW11dGF0aW9uIGV2ZW50Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQ29tbXV0YXRpb24gZXZlbnQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1NlbGVjdENPTShGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQ1VTIEJpdCAqLw0KICAqKHZ1MzIgKikgQ1IyX0NDVVNfQkIgPSAodTE2KU5ld3N0YXRlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2VsZWN0Q0NETUENCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBUSU0xIHBlcmlwaGVyYWwgQ2FwdHVyZSBDb21wYXJlIERNQSBzb3VyY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDYXB0dXJlIENvbXBhcmUgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZWxlY3RDQ0RNQShGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQ0RTIEJpdCAqLw0KICAqKHZ1MzIgKikgQ1IyX0NDRFNfQkIgPSAodTE2KU5ld3N0YXRlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfQ0NQcmVsb2FkQ29udHJvbA0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgb3IgUmVzZXRzIHRoZSBUSU0xIHBlcmlwaGVyYWwgQ2FwdHVyZSBDb21wYXJlIFByZWxvYWQgDQoqICAgICAgICAgICAgICAgICAgQ29udHJvbCBiaXQuDQoqIElucHV0ICAgICAgICAgIDogLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDYXB0dXJlIENvbXBhcmUgUHJlbG9hZCBDb250cm9sIGJpdA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9DQ1ByZWxvYWRDb250cm9sKEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3c3RhdGUpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDUEMgQml0ICovDQogICoodnUzMiAqKSBDUjJfQ0NQQ19CQiA9ICh1MTYpTmV3c3RhdGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzFQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgUmVnaXN0ZXIgb24gQ0NSMS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkDQoqICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUHJlbG9hZF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MxUHJlbG9hZENvbmZpZyh1MTYgVElNMV9PQ1ByZWxvYWQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DUFJFTE9BRF9TVEFURShUSU0xX09DUHJlbG9hZCkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT0MxUEUgQml0ICovDQogICoodnUzMiAqKSBDQ01SMV9PQzFQRV9CQiA9ICh1MTYpVElNMV9PQ1ByZWxvYWQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzJQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgUmVnaXN0ZXIgb24gQ0NSMi4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkDQoqICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUHJlbG9hZF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MyUHJlbG9hZENvbmZpZyh1MTYgVElNMV9PQ1ByZWxvYWQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DUFJFTE9BRF9TVEFURShUSU0xX09DUHJlbG9hZCkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT0MyUEUgQml0ICovDQogICoodnUzMiAqKSBDQ01SMV9PQzJQRV9CQiA9ICh1MTYpVElNMV9PQ1ByZWxvYWQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzNQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgUmVnaXN0ZXIgb24gQ0NSMy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkDQoqICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUHJlbG9hZF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MzUHJlbG9hZENvbmZpZyh1MTYgVElNMV9PQ1ByZWxvYWQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DUFJFTE9BRF9TVEFURShUSU0xX09DUHJlbG9hZCkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT0MzUEUgQml0ICovDQogICoodnUzMiAqKSBDQ01SMl9PQzNQRV9CQiA9ICh1MTYpVElNMV9PQ1ByZWxvYWQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzRQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMSBwZXJpcGhlcmFsIFByZWxvYWQgUmVnaXN0ZXIgb24gQ0NSNC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBQcmVsb2FkDQoqICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUHJlbG9hZF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0M0UHJlbG9hZENvbmZpZyh1MTYgVElNMV9PQ1ByZWxvYWQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DUFJFTE9BRF9TVEFURShUSU0xX09DUHJlbG9hZCkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT0M0UEUgQml0ICovDQogICoodnUzMiAqKSBDQ01SMl9PQzRQRV9CQiA9ICh1MTYpVElNMV9PQ1ByZWxvYWQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzFGYXN0Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBDYXB0dXJlIENvbXBhcmUgMSBGYXN0IGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBiaXQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DRmFzdF9FbmFibGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ0Zhc3RfRGlzYWJsZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DMUZhc3RDb25maWcodTE2IFRJTTFfT0NGYXN0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ0ZBU1RfU1RBVEUoVElNMV9PQ0Zhc3QpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIE9DMUZFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NNUjFfT0MxRkVfQkIgPSAodTE2KVRJTTFfT0NGYXN0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfT0MyRmFzdENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgQ2FwdHVyZSBDb21wYXJlIEZhc3QgZmVhdHVyZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIGJpdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NGYXN0X0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DRmFzdF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MyRmFzdENvbmZpZyh1MTYgVElNMV9PQ0Zhc3QpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DRkFTVF9TVEFURShUSU0xX09DRmFzdCkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgT0MyRkUgQml0ICovDQogICoodnUzMiAqKSBDQ01SMV9PQzJGRV9CQiA9ICh1MTYpVElNMV9PQ0Zhc3Q7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzNGYXN0Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBDYXB0dXJlIENvbXBhcmUgRmFzdCBmZWF0dXJlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9PQ0Zhc3Q6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBFbmFibGUgYml0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ0Zhc3RfRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NGYXN0X0Rpc2FibGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9PQzNGYXN0Q29uZmlnKHUxNiBUSU0xX09DRmFzdCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfT0NGQVNUX1NUQVRFKFRJTTFfT0NGYXN0KSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBPQzNGRSBCaXQgKi8NCiAgKih2dTMyICopIENDTVIyX09DM0ZFX0JCID0gKHUxNilUSU0xX09DRmFzdDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DNEZhc3RDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIENhcHR1cmUgQ29tcGFyZSBGYXN0IGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBiaXQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DRmFzdF9FbmFibGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ0Zhc3RfRGlzYWJsZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DNEZhc3RDb25maWcodTE2IFRJTTFfT0NGYXN0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ0ZBU1RfU1RBVEUoVElNMV9PQ0Zhc3QpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIE9DNEZFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NNUjJfT0M0RkVfQkIgPSAodTE2KVRJTTFfT0NGYXN0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfR2VuZXJhdGVFdmVudA0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgZXZlbnQgdG8gYmUgZ2VuZXJhdGUgYnkgc29mdHdhcmUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0V2ZW50U291cmNlOiBzcGVjaWZpZXMgdGhlIGV2ZW50IHNvdXJjZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FdmVudFNvdXJjZV9VcGRhdGU6IFRJTTEgdXBkYXRlIEV2ZW50IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V2ZW50U291cmNlX0NDMTogVElNMSBDYXB0dXJlIENvbXBhcmUgMSBFdmVudCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FdmVudFNvdXJjZV9DQzI6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDIgRXZlbnQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXZlbnRTb3VyY2VfQ0MzOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAzIEV2ZW50IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V2ZW50U291cmNlX0NDNDogVElNMSBDYXB0dXJlIENvbXBhcmUgNCBFdmVudCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FdmVudFNvdXJjZV9DT006IFRJTTEgQ09NIEV2ZW50IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V2ZW50U291cmNlX1RyaWdnZXI6IFRJTTEgVHJpZ2dlciBFdmVudCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FdmVudFNvdXJjZUJyZWFrOiBUSU0xIEJyZWFrIEV2ZW50IHNvdXJjZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0dlbmVyYXRlRXZlbnQodTE2IFRJTTFfRXZlbnRTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0VWRU5UX1NPVVJDRShUSU0xX0V2ZW50U291cmNlKSk7DQoNCiAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovDQogIFRJTTEtPkVHUiB8PSBUSU0xX0V2ZW50U291cmNlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfT0MxUG9sYXJpdHlDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIENoYW5uZWwgMSBwb2xhcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzEgUG9sYXJpdHkNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9PQzFQb2xhcml0eUNvbmZpZyh1MTYgVElNMV9PQ1BvbGFyaXR5KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ19QT0xBUklUWShUSU0xX09DUG9sYXJpdHkpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDMVAgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMVBfQkIgPSAodTE2KVRJTTFfT0NQb2xhcml0eTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DMU5Qb2xhcml0eUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgQ2hhbm5lbCAxTiBwb2xhcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzFOIFBvbGFyaXR5DQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MxTlBvbGFyaXR5Q29uZmlnKHUxNiBUSU0xX09DUG9sYXJpdHkpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DX1BPTEFSSVRZKFRJTTFfT0NQb2xhcml0eSkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MzUCBCaXQgKi8NCiAgKih2dTMyICopIENDRVJfQ0MxTlBfQkIgPSAodTE2KVRJTTFfT0NQb2xhcml0eTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX09DMlBvbGFyaXR5Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBDaGFubmVsIDIgcG9sYXJpdHkuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MyIFBvbGFyaXR5DQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfT0MyUG9sYXJpdHlDb25maWcodTE2IFRJTTFfT0NQb2xhcml0eSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfT0NfUE9MQVJJVFkoVElNMV9PQ1BvbGFyaXR5KSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzJQIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzJQX0JCID0gKHUxNilUSU0xX09DUG9sYXJpdHk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzJOUG9sYXJpdHlDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIENoYW5uZWwgMk4gcG9sYXJpdHkuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MyTiBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DMk5Qb2xhcml0eUNvbmZpZyh1MTYgVElNMV9PQ1BvbGFyaXR5KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ19QT0xBUklUWShUSU0xX09DUG9sYXJpdHkpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDM1AgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMk5QX0JCID0gKHUxNilUSU0xX09DUG9sYXJpdHk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9PQzNQb2xhcml0eUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTTEgQ2hhbm5lbCAzIHBvbGFyaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMyBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX09DM1BvbGFyaXR5Q29uZmlnKHUxNiBUSU0xX09DUG9sYXJpdHkpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX09DX1BPTEFSSVRZKFRJTTFfT0NQb2xhcml0eSkpOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MzUCBCaXQgKi8NCiAgKih2dTMyICopIENDRVJfQ0MzUF9CQiA9ICh1MTYpVElNMV9PQ1BvbGFyaXR5Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfT0MzTlBvbGFyaXR5Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNMSBDaGFubmVsIDNOIHBvbGFyaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DM04gUG9sYXJpdHkNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9PQzNOUG9sYXJpdHlDb25maWcodTE2IFRJTTFfT0NQb2xhcml0eSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfT0NfUE9MQVJJVFkoVElNMV9PQ1BvbGFyaXR5KSk7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzNQIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzNOUF9CQiA9ICh1MTYpVElNMV9PQ1BvbGFyaXR5Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfT0M0UG9sYXJpdHlDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0xIENoYW5uZWwgNCBwb2xhcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzQgUG9sYXJpdHkNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9PQzRQb2xhcml0eUNvbmZpZyh1MTYgVElNMV9PQ1BvbGFyaXR5KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9PQ19QT0xBUklUWShUSU0xX09DUG9sYXJpdHkpKTsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDNFAgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDNFBfQkIgPSAodTE2KVRJTTFfT0NQb2xhcml0eTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0NDeENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTTEgQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfQ2hhbm5lbDogc3BlY2lmaWVzIHRoZSBUSU0xIENoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9DaGFubmVsMTogVElNMSBDaGFubmVsMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NoYW5uZWwyOiBUSU0xIENoYW5uZWwyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ2hhbm5lbDM6IFRJTTEgQ2hhbm5lbDMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9DaGFubmVsNDogVElNMSBDaGFubmVsNA0KKiAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogc3BlY2lmaWVzIHRoZSBUSU0xIENoYW5uZWwgQ0N4RSBiaXQgbmV3IHN0YXRlLg0KKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9DQ3hDbWQodTE2IFRJTTFfQ2hhbm5lbCwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9DSEFOTkVMKFRJTTFfQ2hhbm5lbCkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdzdGF0ZSkpOw0KDQogIGlmKFRJTTFfQ2hhbm5lbCA9PSBUSU0xX0NoYW5uZWxfMSkNCiAgew0KICAgIC8qIFNldCBvciBSZXNldCB0aGUgQ0MxRSBCaXQgKi8NCiAgICAqKHZ1MzIgKikgQ0NFUl9DQzFFX0JCID0gKHUxNilOZXdzdGF0ZTsgIA0KICB9DQogIGVsc2UgaWYoVElNMV9DaGFubmVsID09IFRJTTFfQ2hhbm5lbF8yKQ0KICB7DQogICAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KICAgICoodnUzMiAqKSBDQ0VSX0NDMkVfQkIgPSAodTE2KU5ld3N0YXRlOw0KICB9DQogIGVsc2UgaWYoVElNMV9DaGFubmVsID09IFRJTTFfQ2hhbm5lbF8zKQ0KICB7DQogICAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzNFIEJpdCAqLw0KICAgICoodnUzMiAqKSBDQ0VSX0NDM0VfQkIgPSAodTE2KU5ld3N0YXRlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNldCBvciBSZXNldCB0aGUgQ0M0RSBCaXQgKi8NCiAgICAqKHZ1MzIgKikgQ0NFUl9DQzRFX0JCID0gKHUxNilOZXdzdGF0ZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfQ0N4TkNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTTEgQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeE4uDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgVElNMSBDaGFubmVsDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ2hhbm5lbDE6IFRJTTEgQ2hhbm5lbDENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9DaGFubmVsMjogVElNMSBDaGFubmVsMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NoYW5uZWwzOiBUSU0xIENoYW5uZWwzDQoqICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBzcGVjaWZpZXMgdGhlIFRJTTEgQ2hhbm5lbCBDQ3hORSBiaXQgbmV3IHN0YXRlLg0KKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9DQ3hOQ21kKHUxNiBUSU0xX0NoYW5uZWwsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfQ09NUExFTUVOVEFSWV9DSEFOTkVMKFRJTTFfQ2hhbm5lbCkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdzdGF0ZSkpOw0KDQogIGlmKFRJTTFfQ2hhbm5lbCA9PSBUSU0xX0NoYW5uZWxfMSkNCiAgew0KICAgIC8qIFNldCBvciBSZXNldCB0aGUgQ0MxTkUgQml0ICovDQogICAgKih2dTMyICopIENDRVJfQ0MxTkVfQkIgPSAodTE2KU5ld3N0YXRlOyAgDQogIH0NCiAgZWxzZSBpZihUSU0xX0NoYW5uZWwgPT0gVElNMV9DaGFubmVsXzIpDQogIHsNCiAgICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDMk5FIEJpdCAqLw0KICAgICoodnUzMiAqKSBDQ0VSX0NDMk5FX0JCID0gKHUxNilOZXdzdGF0ZTsNCiAgfQ0KICBlbHNlIA0KICB7DQogICAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzNORSBCaXQgKi8NCiAgICAqKHZ1MzIgKikgQ0NFUl9DQzNORV9CQiA9ICh1MTYpTmV3c3RhdGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NlbGVjdE9DeE0NCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBUSU0xIE91cHV0IENvbXBhcmUgTW9kZS4NCiogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBjaGFubmVsIGJlZm9yZSBjaGFuZ2luZyANCiogICAgICAgICAgICAgICAgICB0aGUgT3VwdXQgQ29tcGFyZSBNb2RlLiBVc2VyIGhhcyB0byBlbmFibGUgdGhpcyBjaGFubmVsIHVzaW5nDQoqICAgICAgICAgICAgICAgICAgVElNMV9DQ3hDbWQgYW5kIFRJTTFfQ0N4TkNtZCBmdW5jdGlvbnMuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgVElNMSBDaGFubmVsDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ2hhbm5lbDE6IFRJTTEgQ2hhbm5lbDENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9DaGFubmVsMjogVElNMSBDaGFubmVsMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NoYW5uZWwzOiBUSU0xIENoYW5uZWwzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ2hhbm5lbDQ6IFRJTTEgQ2hhbm5lbDQNCiogICAgICAgICAgICAgICAgICAtIFRJTTFfT0NNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTTEgT3V0cHV0IENvbXBhcmUgTW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ01vZGVfVGltaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfT0NNb2RlX0FjdGl2ZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DTW9kZV9Ub2dnbGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9PQ01vZGVfUFdNMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX09DTW9kZV9QV00yDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRm9yY2VkQWN0aW9uX0FjdGl2ZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1NlbGVjdE9DeE0odTE2IFRJTTFfQ2hhbm5lbCwgdTE2IFRJTTFfT0NNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9DSEFOTkVMKFRJTTFfQ2hhbm5lbCkpOw0KICBhc3NlcnQoSVNfVElNMV9PQ00oVElNMV9PQ01vZGUpKTsNCg0KICBpZihUSU0xX0NoYW5uZWwgPT0gVElNMV9DaGFubmVsXzEpDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICAgKih2dTMyICopIENDRVJfQ0MxRV9CQiA9IENDRVJfQ0NFX1Jlc2V0Ow0KDQogICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgICBUSU0xLT5DQ01SMSAmPSBPQzEzTW9kZV9NYXNrOw0KDQogICAgLyogU2V0IHRoZSBPdXB1dCBDb21wYXJlIE1vZGUgKi8NCiAgICBUSU0xLT5DQ01SMSB8PSBUSU0xX09DTW9kZTsNCiAgfQ0KICBlbHNlIGlmKFRJTTFfQ2hhbm5lbCA9PSBUSU0xX0NoYW5uZWxfMikNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgICAqKHZ1MzIgKikgQ0NFUl9DQzJFX0JCID0gQ0NFUl9DQ0VfUmVzZXQ7DQoNCiAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgQml0cyAqLw0KICAgIFRJTTEtPkNDTVIxICY9IE9DMjRNb2RlX01hc2s7DQoNCiAgICAvKiBTZXQgdGhlIE91cHV0IENvbXBhcmUgTW9kZSAqLw0KICAgIFRJTTEtPkNDTVIxIHw9ICh1MTYpKCh1MTYpVElNMV9PQ01vZGUgPDwgOCk7DQogIH0NCiAgZWxzZSBpZihUSU0xX0NoYW5uZWwgPT0gVElNMV9DaGFubmVsXzMpDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICAgKih2dTMyICopIENDRVJfQ0MzRV9CQiA9IENDRVJfQ0NFX1Jlc2V0Ow0KDQogICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgICBUSU0xLT5DQ01SMiAmPSBPQzEzTW9kZV9NYXNrOw0KDQogICAgLyogU2V0IHRoZSBPdXB1dCBDb21wYXJlIE1vZGUgKi8NCiAgICBUSU0xLT5DQ01SMiB8PSBUSU0xX09DTW9kZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICAgKih2dTMyICopIENDRVJfQ0M0RV9CQiA9IENDRVJfQ0NFX1Jlc2V0Ow0KDQogICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgICBUSU0xLT5DQ01SMiAmPSBPQzI0TW9kZV9NYXNrOw0KDQogICAgLyogU2V0IHRoZSBPdXB1dCBDb21wYXJlIE1vZGUgKi8NCiAgICBUSU0xLT5DQ01SMiB8PSAodTE2KSgodTE2KVRJTTFfT0NNb2RlIDw8IDgpOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9TZXRBdXRvcmVsb2FkDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNMSBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQXV0b3JlbG9hZDogc3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZXRBdXRvcmVsb2FkKHUxNiBBdXRvcmVsb2FkKQ0Kew0KICAvKiBTZXQgdGhlIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNMS0+QVJSID0gQXV0b3JlbG9hZDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NldENvbXBhcmUxDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNMSBDYXB0dXJlIENvbXBhcmUxIFJlZ2lzdGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQ29tcGFyZTE6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlMSByZWdpc3RlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2V0Q29tcGFyZTEodTE2IENvbXBhcmUxKQ0Kew0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTEgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNMS0+Q0NSMSA9IENvbXBhcmUxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2V0Q29tcGFyZTINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU0xIENhcHR1cmUgQ29tcGFyZTIgUmVnaXN0ZXIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBDb21wYXJlMjogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZXRDb21wYXJlMih1MTYgQ29tcGFyZTIpDQp7DQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlMiBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU0xLT5DQ1IyID0gQ29tcGFyZTI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9TZXRDb21wYXJlMw0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTTEgQ2FwdHVyZSBDb21wYXJlMyBSZWdpc3RlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIENvbXBhcmUzOiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTMgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1NldENvbXBhcmUzKHUxNiBDb21wYXJlMykNCnsNCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUzIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTTEtPkNDUjMgPSBDb21wYXJlMzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NldENvbXBhcmU0DQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNMSBDYXB0dXJlIENvbXBhcmU0IFJlZ2lzdGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQ29tcGFyZTQ6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlNCByZWdpc3RlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2V0Q29tcGFyZTQodTE2IENvbXBhcmU0KQ0Kew0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNMS0+Q0NSNCA9IENvbXBhcmU0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfU2V0SUMxUHJlc2NhbGVyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNMSBJbnB1dCBDYXB0dXJlIDEgcHJlc2NhbGVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9JQzFQcmVzY2FsZXI6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgIG5ldyB2YWx1ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfU2V0SUMxUHJlc2NhbGVyKHUxNiBUSU0xX0lDMVByZXNjYWxlcikNCnsNCiAgdTMyIHRtcGNjbXIxID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0lDX1BSRVNDQUxFUihUSU0xX0lDMVByZXNjYWxlcikpOw0KDQogIHRtcGNjbXIxID0gVElNMS0+Q0NNUjE7DQoNCiAgLyogUmVzZXQgdGhlIElDMVBTQyBCaXRzICovDQogIHRtcGNjbXIxICY9IENDTVJfSUMxM1BTQ19NYXNrOw0KDQogIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovDQogIHRtcGNjbXIxIHw9IFRJTTFfSUMxUHJlc2NhbGVyOw0KDQogIFRJTTEtPkNDTVIxID0gKHUxNil0bXBjY21yMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NldElDMlByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSAyIHByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUMyUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgcHJlc2NhbGVyDQoqICAgICAgICAgICAgICAgICAgICBuZXcgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1NldElDMlByZXNjYWxlcih1MTYgVElNMV9JQzJQcmVzY2FsZXIpDQp7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfSUNfUFJFU0NBTEVSKFRJTTFfSUMyUHJlc2NhbGVyKSk7DQoNCiAgdG1wY2NtcjEgPSBUSU0xLT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgSUMyUFNDIEJpdHMgKi8NCiAgdG1wY2NtcjEgJj0gQ0NNUl9JQzI0UFNDX01hc2s7DQoNCiAgLyogU2V0IHRoZSBJQzJQU0MgdmFsdWUgKi8NCiAgdG1wY2NtcjEgfD0gKHUxNikoKHUxNilUSU0xX0lDMlByZXNjYWxlciA8PCA4KTsNCg0KICBUSU0xLT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9TZXRJQzNQcmVzY2FsZXINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU0xIElucHV0IENhcHR1cmUgMyBwcmVzY2FsZXIuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0lDM1ByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIHByZXNjYWxlcg0KKiAgICAgICAgICAgICAgICAgICAgbmV3IHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZXRJQzNQcmVzY2FsZXIodTE2IFRJTTFfSUMzUHJlc2NhbGVyKQ0Kew0KICB1MzIgdG1wY2NtcjIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0lDX1BSRVNDQUxFUihUSU0xX0lDM1ByZXNjYWxlcikpOw0KDQogIHRtcGNjbXIyID0gVElNMS0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIElDM1BTQyBCaXRzICovDQogIHRtcGNjbXIyICY9IENDTVJfSUMxM1BTQ19NYXNrOw0KDQogIC8qIFNldCB0aGUgSUMzUFNDIHZhbHVlICovDQogIHRtcGNjbXIyIHw9IFRJTTFfSUMzUHJlc2NhbGVyOw0KDQogIFRJTTEtPkNDTVIyID0gKHUxNil0bXBjY21yMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX1NldElDNFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSA0IHByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUM0UHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgcHJlc2NhbGVyDQoqICAgICAgICAgICAgICAgICAgICBuZXcgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX1NldElDNFByZXNjYWxlcih1MTYgVElNMV9JQzRQcmVzY2FsZXIpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfSUNfUFJFU0NBTEVSKFRJTTFfSUM0UHJlc2NhbGVyKSk7DQoNCiAgdG1wY2NtcjIgPSBUSU0xLT5DQ01SMjsNCg0KICAvKiBSZXNldCB0aGUgSUM0UFNDIEJpdHMgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9JQzI0UFNDX01hc2s7DQoNCiAgLyogU2V0IHRoZSBJQzRQU0MgdmFsdWUgKi8NCiAgdG1wY2NtcjIgfD0gKHUxNikoKHUxNilUSU0xX0lDNFByZXNjYWxlciA8PCA4KTsNCg0KICBUSU0xLT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9TZXRDbG9ja0RpdmlzaW9uDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNMSBDbG9jayBEaXZpc2lvbiB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfQ0tEOiBzcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uIHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NLRF9ESVYxOiBURFRTID0gVGNrX3RpbQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0NLRF9ESVYyOiBURFRTID0gMipUY2tfdGltDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfQ0tEX0RJVjQ6IFREVFMgPSA0KlRja190aW0NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNMV9TZXRDbG9ja0RpdmlzaW9uKHUxNiBUSU0xX0NLRCkNCnsNCiAgdTMyIHRtcGNyMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTTFfQ0tEX0RJVihUSU0xX0NLRCkpOw0KDQogIHRtcGNyMSA9IFRJTTEtPkNSMTsNCg0KICAvKiBSZXNldCB0aGUgQ0tEIEJpdHMgKi8NCiAgdG1wY3IxICY9IENSMV9DS0RfTWFzazsNCg0KICAvKiBTZXQgdGhlIENLRCB2YWx1ZSAqLw0KICB0bXBjcjEgfD0gVElNMV9DS0Q7DQoNCiAgVElNMS0+Q1IxID0gKHUxNil0bXBjcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRDYXB0dXJlMQ0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSAxIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ2FwdHVyZSBDb21wYXJlIDEgUmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTTFfR2V0Q2FwdHVyZTEodm9pZCkNCnsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDEgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTTEtPkNDUjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRDYXB0dXJlMg0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSAyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ2FwdHVyZSBDb21wYXJlIDIgUmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTTFfR2V0Q2FwdHVyZTIodm9pZCkNCnsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTTEtPkNDUjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRDYXB0dXJlMw0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSAzIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ2FwdHVyZSBDb21wYXJlIDMgUmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTTFfR2V0Q2FwdHVyZTModm9pZCkNCnsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDMgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTTEtPkNDUjM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRDYXB0dXJlNA0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTTEgSW5wdXQgQ2FwdHVyZSA0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ2FwdHVyZSBDb21wYXJlIDQgUmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTTFfR2V0Q2FwdHVyZTQodm9pZCkNCnsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTTEtPkNDUjQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRDb3VudGVyDQoqIERlc2NyaXB0aW9uICAgIDogR2V0cyB0aGUgVElNMSBDb3VudGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ291bnRlciBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNMV9HZXRDb3VudGVyKHZvaWQpDQp7DQogIC8qIEdldCB0aGUgQ291bnRlciBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNMS0+Q05UOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfR2V0UHJlc2NhbGVyDQoqIERlc2NyaXB0aW9uICAgIDogR2V0cyB0aGUgVElNMSBQcmVzY2FsZXIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTTFfR2V0UHJlc2NhbGVyKHZvaWQpDQp7DQogIC8qIEdldCB0aGUgUHJlc2NhbGVyIFJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiBUSU0xLT5QU0M7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0xIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9GTEFHX1VwZGF0ZTogVElNMSB1cGRhdGUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0MxOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAxIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9GTEFHX0NDMjogVElNMSBDYXB0dXJlIENvbXBhcmUgMiBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzM6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDMgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0M0OiBUSU0xIENhcHR1cmUgQ29tcGFyZSA0IEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9GTEFHX0NPTTogVElNMSBDb21tdXRhdGlvbiBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19UcmlnZ2VyOiBUSU0xIFRyaWdnZXIgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQnJlYWs6IFRJTTEgQnJlYWsgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0MxT0Y6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDEgb3ZlcmNhcHR1cmUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0MyT0Y6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDIgb3ZlcmNhcHR1cmUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0MzT0Y6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDMgb3ZlcmNhcHR1cmUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0M0T0Y6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDQgb3ZlcmNhcHR1cmUgRmxhZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFRJTTFfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFRJTTFfR2V0RmxhZ1N0YXR1cyh1MTYgVElNMV9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0dFVF9GTEFHKFRJTTFfRkxBRykpOw0KDQogIGlmICgoVElNMS0+U1IgJiBUSU0xX0ZMQUcpICE9ICh1MTYpUkVTRVQgKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNMV9DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFRJTTGScyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfVXBkYXRlOiBUSU0xIHVwZGF0ZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzE6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDEgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ0MyOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9GTEFHX0NDMzogVElNMSBDYXB0dXJlIENvbXBhcmUgMyBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzQ6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDQgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0ZMQUdfQ09NOiBUSU0xIENvbW11dGF0aW9uIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9GTEFHX1RyaWdnZXI6IFRJTTEgVHJpZ2dlciBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19CcmVhazogVElNMSBCcmVhayBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzFPRjogVElNMSBDYXB0dXJlIENvbXBhcmUgMSBvdmVyY2FwdHVyZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzJPRjogVElNMSBDYXB0dXJlIENvbXBhcmUgMiBvdmVyY2FwdHVyZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzNPRjogVElNMSBDYXB0dXJlIENvbXBhcmUgMyBvdmVyY2FwdHVyZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRkxBR19DQzRPRjogVElNMSBDYXB0dXJlIENvbXBhcmUgNCBvdmVyY2FwdHVyZSBGbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTTFfQ2xlYXJGbGFnKHUxNiBUSU0xX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU0xX0NMRUFSX0ZMQUcoVElNMV9GTEFHKSk7DQoNCiAgLyogQ2xlYXIgdGhlIGZsYWdzICovDQogIFRJTTEtPlNSICY9ICh1MTYpflRJTTFfRkxBRzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU0xX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIFRJTTEgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0lUOiBzcGVjaWZpZXMgdGhlIFRJTTEgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfVXBkYXRlOiBUSU0xIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0MxOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAxIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9DQzI6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX0NDMzogVElNMSBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0M0OiBUSU0xIENhcHR1cmUgQ29tcGFyZSA0IEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9DT006IFRJTTEgQ29tbXV0YXRpb24gSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX1RyaWdnZXI6IFRJTTEgVHJpZ2dlciBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQnJlYWs6IFRJTTEgQnJlYWsgSW50ZXJydXB0IHNvdXJjZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIHRoZSBUSU0xX0lUKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgVElNMV9HZXRJVFN0YXR1cyh1MTYgVElNMV9JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIA0KICB1MTYgVElNMV9pdFN0YXR1cyA9IDB4MCwgVElNMV9pdEVuYWJsZSA9IDB4MDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9HRVRfSVQoVElNMV9JVCkpOw0KICANCiAgVElNMV9pdFN0YXR1cyA9IFRJTTEtPlNSICYgVElNMV9JVDsNCiAgDQogIFRJTTFfaXRFbmFibGUgPSBUSU0xLT5ESUVSICYgVElNMV9JVDsNCg0KICBpZiAoKFRJTTFfaXRTdGF0dXMgIT0gKHUxNilSRVNFVCApICYmIChUSU0xX2l0RW5hYmxlICE9ICh1MTYpUkVTRVQgKSkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTTFfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFRJTTEncyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9JVDogc3BlY2lmaWVzIHRoZSBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfVXBkYXRlOiBUSU0xIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0MxOiBUSU0xIENhcHR1cmUgQ29tcGFyZSAxIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9DQzI6IFRJTTEgQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX0NDMzogVElNMSBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQ0M0OiBUSU0xIENhcHR1cmUgQ29tcGFyZSA0IEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JVF9DT006IFRJTTEgQ29tbXV0YXRpb24gSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lUX1RyaWdnZXI6IFRJTTEgVHJpZ2dlciBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSVRfQnJlYWs6IFRJTTEgQnJlYWsgSW50ZXJydXB0IHNvdXJjZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU0xX0NsZWFySVRQZW5kaW5nQml0KHUxNiBUSU0xX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNMV9JVChUSU0xX0lUKSk7DQoNCiAgLyogQ2xlYXIgdGhlIElUIHBlbmRpbmcgQml0ICovDQogIFRJTTEtPlNSICY9ICh1MTYpflRJTTFfSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEkxX0NvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZSB0aGUgVEkxIGFzIElucHV0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BvbGFyaXR5X1Jpc2luZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfRmFsbGluZw0KKiAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTogVElNMSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbm5lY3RlZCB0byBJQzEuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNMSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbm5lY3RlZCB0byBJQzIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb25fVFJHSTpUSU0xIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIFRSR0kuDQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIFRJMV9Db25maWcodTE2IFRJTTFfSUNQb2xhcml0eSwgdTE2IFRJTTFfSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHU4IFRJTTFfSUNGaWx0ZXIpDQp7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgdG1wY2NtcjEgPSBUSU0xLT5DQ01SMTsNCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMUVfQkIgPSBDQ0VSX0NDRV9SZXNldDsNCg0KICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KICB0bXBjY21yMSAmPSBDQ01SX0NDMTNTX01hc2sgJiBDQ01SX0lDMTNGX01hc2s7DQogIHRtcGNjbXIxIHw9ICh1MTYpVElNMV9JQ1NlbGVjdGlvbiB8ICh1MTYpKCh1MTYpVElNMV9JQ0ZpbHRlciA8PCA0KTsNCg0KICBUSU0xLT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQoNCiAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzFQX0JCID0gVElNMV9JQ1BvbGFyaXR5Ow0KDQogIC8qIFNldCB0aGUgQ0NFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzFFX0JCID0gQ0NFUl9DQ0VfU2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJMl9Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmUgdGhlIFRJMiBhcyBJbnB1dC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQb2xhcml0eV9SaXNpbmcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTTEgSW5wdXQgMiBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk6IFRJTTEgSW5wdXQgMiBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUMxLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uX1RSR0k6IFRJTTEgSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gVFJHSS4NCiogICAgICAgICAgICAgICAgICAtIFRJTTFfSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgVEkyX0NvbmZpZyh1MTYgVElNMV9JQ1BvbGFyaXR5LCB1MTYgVElNMV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNMV9JQ0ZpbHRlcikNCnsNCiAgdTMyIHRtcGNjbXIxID0gMDsNCg0KICB0bXBjY21yMSA9IFRJTTEtPkNDTVIxOw0KDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgKih2dTMyICopIENDRVJfQ0MyRV9CQiA9IENDRVJfQ0NFX1Jlc2V0Ow0KDQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9IENDTVJfQ0MyNFNfTWFzayAmIENDTVJfSUMyNEZfTWFzazsNCiAgdG1wY2NtcjEgfD0gKHUxNikoKHUxNilUSU0xX0lDU2VsZWN0aW9uIDw8IDgpIHwgKHUxNikoKHUxNilUSU0xX0lDRmlsdGVyIDw8MTIpOw0KDQogIFRJTTEtPkNDTVIxID0gKHUxNil0bXBjY21yMTsNCg0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMlBfQkIgPSBUSU0xX0lDUG9sYXJpdHk7DQoNCiAgLyogU2V0IHRoZSBDQ0UgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDMkVfQkIgPSBDQ0VSX0NDRV9TZXQ7DQoNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSTNfQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlIHRoZSBUSTMgYXMgSW5wdXQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU0xX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDUG9sYXJpdHlfUmlzaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQb2xhcml0eV9GYWxsaW5nDQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0xIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8NCiogICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29ubmVjdGVkIHRvIElDMy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0xIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8NCiogICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29ubmVjdGVkIHRvIElDNC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1NlbGVjdGlvbl9UUkdJOiBUSU0xIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIFRSR0kuDQoqICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIFRJM19Db25maWcodTE2IFRJTTFfSUNQb2xhcml0eSwgdTE2IFRJTTFfSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHU4IFRJTTFfSUNGaWx0ZXIpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgdG1wY2NtcjIgPSBUSU0xLT5DQ01SMjsNCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDM0VfQkIgPSBDQ0VSX0NDRV9SZXNldDsNCg0KICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KICB0bXBjY21yMiAmPSBDQ01SX0NDMTNTX01hc2sgJiBDQ01SX0lDMTNGX01hc2s7DQogIHRtcGNjbXIyIHw9ICh1MTYpVElNMV9JQ1NlbGVjdGlvbiB8ICh1MTYpKCh1MTYpVElNMV9JQ0ZpbHRlciA8PCA0KTsNCg0KICBUSU0xLT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQoNCiAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzNQX0JCID0gVElNMV9JQ1BvbGFyaXR5Ow0KDQogIC8qIFNldCB0aGUgQ0NFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzNFX0JCID0gQ0NFUl9DQ0VfU2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJNF9Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmUgdGhlIFRJNCBhcyBJbnB1dC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTTFfSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNQb2xhcml0eV9SaXNpbmcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTTEgSW5wdXQgNCBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUM0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk6IFRJTTEgSW5wdXQgNCBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUMzLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0lDU2VsZWN0aW9uX1RSR0k6IFRJTTEgSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gVFJHSS4NCiogICAgICAgICAgICAgICAgICAtIFRJTTFfSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgVEk0X0NvbmZpZyh1MTYgVElNMV9JQ1BvbGFyaXR5LCB1MTYgVElNMV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNMV9JQ0ZpbHRlcikNCnsNCiAgdTMyIHRtcGNjbXIyID0gMDsNCg0KICB0bXBjY21yMiA9IFRJTTEtPkNDTVIyOw0KICANCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICAqKHZ1MzIgKikgQ0NFUl9DQzRFX0JCID0gQ0NFUl9DQ0VfUmVzZXQ7DQoNCiAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9DQzI0U19NYXNrICYgQ0NNUl9JQzI0Rl9NYXNrOw0KICB0bXBjY21yMiB8PSAodTE2KSgodTE2KVRJTTFfSUNTZWxlY3Rpb24gPDwgOCkgfCAodTE2KSgodTE2KVRJTTFfSUNGaWx0ZXIgPDwgMTIpOw0KDQogIFRJTTEtPkNDTVIyID0gKHUxNil0bXBjY21yMjsNCg0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5ICovDQogICoodnUzMiAqKSBDQ0VSX0NDNFBfQkIgPSBUSU0xX0lDUG9sYXJpdHk7DQoNCiAgLyogU2V0IHRoZSBDQ0UgQml0ICovDQogICoodnUzMiAqKSBDQ0VSX0NDNEVfQkIgPSBDQ0VSX0NDRV9TZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRVRSX0NvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgVHJpZ2dlcg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNMV9FeHRUUkdQcmVzY2FsZXI6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUFNDX09GRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BTQ19ESVYyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUFNDX0RJVjQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQU0NfRElWOA0KKiAgICAgICAgICAgICAgICAgIC0gVElNMV9FeHRUUkdQb2xhcml0eTogVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU0xX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTTFfRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQNCiogICAgICAgICAgICAgICAgICAtIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgRVRSX0NvbmZpZyh1MTYgVElNMV9FeHRUUkdQcmVzY2FsZXIsIHUxNiBUSU0xX0V4dFRSR1BvbGFyaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICB1MTYgRXh0VFJHRmlsdGVyKQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQoNCiAgdG1wc21jciA9IFRJTTEtPlNNQ1I7DQoNCiAgLyogU2V0IHRoZSBQcmVzY2FsZXIsIHRoZSBGaWx0ZXIgdmFsdWUgYW5kIHRoZSBQb2xhcml0eSAqLw0KICB0bXBzbWNyICY9IFNNQ1JfRVRSX01hc2s7DQogIHRtcHNtY3IgfD0gVElNMV9FeHRUUkdQcmVzY2FsZXIgfCBUSU0xX0V4dFRSR1BvbGFyaXR5IHwgKHUxNikoKHUxNilFeHRUUkdGaWx0ZXIgPDwgOCk7DQoNCiAgVElNMS0+U01DUiA9ICh1MTYpdG1wc21jcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA3IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==