LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6CVVwZGF0ZWQgZm9yIHRhYnMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBAZmlsZSBwY3JfcGVycGhsLmMNCiogXGJyaWVmIFBvd2VyLCBDbG9ja3MsIGFuZCBSZXNldHMgUGVyaXBoZXJhbCBTb3VyY2UgZmlsZQ0KKiBcYXV0aG9yIGp2YXNhbnRoDQoqIA0KKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUENSIFBlcmlwaGVyYWwgZnVuY3Rpb25zICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqIEBkZWZncm91cCBQQ1INCiAqICBAew0KICovDQoNCiNpbmNsdWRlICJjb21tb25fbGliLmgiDQojaW5jbHVkZSAicGNyLmgiDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qIEdlbmVyaWMgZnVuY3Rpb25zIHRvIHByb2dyYW0gYW5kIHJlYWQgMzItYml0IHZhbHVlcyBmcm9tIFBDUiBSZWdpc3RlcnMgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBXcml0ZXMgMzItYml0IHZhbHVlIGluIHRoZSBQQ1IgUmVnaXN0ZXINCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIA0KICogQHBhcmFtIHZhbHVlIC0gMzItYml0IHZhbHVlDQogKi8NCnZvaWQgcF9wY3JfcmVnX3dyaXRlKHVpbnQ4X3QgcGNyX3JlZ19pZCwgdWludDMyX3QgdmFsdWUpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSk7CQkNCg0KICAgIHBQQ1JfUmVnICs9IHBjcl9yZWdfaWQ7DQoNCiAgICAqcFBDUl9SZWcgPSB2YWx1ZTsJCQkNCn0NCg0KLyoqIFJlYWRzIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBQQ1IgUmVnaXN0ZXINCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIA0KICogQHJldHVybiB2YWx1ZSAtIDMyLWJpdCB2YWx1ZQ0KICovDQp1aW50MzJfdCBwX3Bjcl9yZWdfcmVhZCh1aW50OF90IHBjcl9yZWdfaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDMyX3QgcmV0VmFsOw0KDQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpOwkJDQoNCiAgICBwUENSX1JlZyArPSBwY3JfcmVnX2lkOwkNCg0KICAgIHJldFZhbCA9ICpwUENSX1JlZzsNCg0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgIEZ1bmN0aW9ucyB0byBzZXQsIGNsciBhbmQgZ2V0IGJpdHMgaW4gUENSIFJlZ2lzdGVycyAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFNldHMgYml0cyBpbiBhIFBDUiBSZWdpc3Rlcg0KICogQHBhcmFtIHBjcl9yZWdfaWQgLSBwY3IgcmVnaXN0ZXIgaWQgDQogKiBAcGFyYW0gYml0X21hc2sgLSBCaXQgbWFzayBvZiBiaXRzIHRvIHNldCANCiAqLw0Kdm9pZCBwX3Bjcl9yZWdfc2V0KHVpbnQ4X3QgcGNyX3JlZ19pZCwgdWludDMyX3QgYml0X21hc2spDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSk7CQkNCg0KICAgIHBQQ1JfUmVnICs9IHBjcl9yZWdfaWQ7DQoNCiAgICAqcFBDUl9SZWcgfD0gYml0X21hc2s7CQkJDQp9DQoNCi8qKiBDbGVhcnMgYml0cyBpbiBhIFBDUiBSZWdpc3Rlcg0KICogQHBhcmFtIHBjcl9yZWdfaWQgLSBwY3IgcmVnaXN0ZXIgaWQgDQogKiBAcGFyYW0gYml0X21hc2sgLSBCaXQgbWFzayBvZiBiaXRzIHRvIGNsZWFyIA0KICovDQp2b2lkIHBfcGNyX3JlZ19jbHIodWludDhfdCBwY3JfcmVnX2lkLCB1aW50MzJfdCBiaXRfbWFzaykNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKTsJCQ0KDQogICAgcFBDUl9SZWcgKz0gcGNyX3JlZ19pZDsNCg0KICAgICpwUENSX1JlZyAmPSB+Yml0X21hc2s7CQkJDQp9DQoNCi8qKiBSZWFkIGJpdHMgaW4gYSBQQ1IgUmVnaXN0ZXINCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIA0KICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byByZWFkIA0KICogQHJldHVybiB2YWx1ZSAtIDMyLWJpdCB2YWx1ZQ0KICovDQp1aW50MzJfdCBwX3Bjcl9yZWdfZ2V0KHVpbnQ4X3QgcGNyX3JlZ19pZCwgdWludDMyX3QgYml0X21hc2spDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDMyX3QgcmV0VmFsOw0KDQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpOwkJDQoNCiAgICBwUENSX1JlZyArPSBwY3JfcmVnX2lkOwkJDQoNCiAgICByZXRWYWwgPSAoKnBQQ1JfUmVnKSAmIGJpdF9tYXNrOw0KDQogICAgcmV0dXJuIHJldFZhbDsNCn0NCg0KLyoqIFNldHMgb3IgQ2xlYXJzIGJpdHMgaW4gYSBQQ1IgUmVnaXN0ZXIgLSBIZWxwZXIgRnVuY3Rpb24NCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIA0KICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byBzZXQgb3IgY2xlYXINCiAqIEBwYXJhbSBzZXRfY2xyX2ZsYWcgLSBGbGFnIHRvIHNldCAoMSkgb3IgY2xlYXIgKDApIGJpdHMgaW4gdGhlIFBDUiBSZWdpc3Rlcg0KICovDQp2b2lkIHBfcGNyX3JlZ191cGRhdGUodWludDhfdCBwY3JfcmVnX2lkLCB1aW50MzJfdCBiaXRfbWFzaywgdWludDhfdCBzZXRfY2xyX2ZsYWcpDQp7DQogICAgaWYgKHNldF9jbHJfZmxhZykNCiAgICB7DQogICAgICAgICAgICBwX3Bjcl9yZWdfc2V0KHBjcl9yZWdfaWQsIGJpdF9tYXNrKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgICAgIHBfcGNyX3JlZ19jbHIocGNyX3JlZ19pZCwgYml0X21hc2spOw0KICAgIH0gICAgICAgIA0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICBGdW5jdGlvbnMgdG8gb3BlcmF0ZSBvbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCg0KLyoqIFdyaXRlcyByZXF1aXJlZCBzbGVlcCBtb2RlIGluIFN5c3RlbSBTbGVlcCBDb250cm9sIFJlZ2lzdGVyDQogKiBAcGFyYW0gc2xlZXBfdmFsdWUgLSBTeXN0ZW0gU2xlZXAgY29udHJvbCB2YWx1ZSAoSGVhdnkvTGlnaHQvU2xlZXAgQWxsKQ0KICovDQp2b2lkIHBfcGNyX3N5c3RlbV9zbGVlcF9jdHJsX3dyaXRlKHVpbnQ4X3Qgc2xlZXBfdmFsdWUpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQoJDQogICAvKiBDaGVjayBmb3IgdmFsaWQgdmFsdWUgKi8NCiAgIGlmICgoc2xlZXBfdmFsdWUgPT0gU1lTVEVNX0xJR0hUX1NMRUVQKSB8fCANCgkJICAgIChzbGVlcF92YWx1ZSA9PSBTWVNURU1fTElHSFRfU0xFRVApIHx8DQoJICAgICAgIChzbGVlcF92YWx1ZSA9PSBTWVNURU1fTElHSFRfU0xFRVApKQ0KCSB7ICAgIA0KCQkJcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpCSsgUENSX1JFR19TWVNURU1fU0xFRVBfQ1RSTDsJDQoNCgkJCSpwUENSX1JlZyA9IChzbGVlcF92YWx1ZSAmIDB4Nyk7CQkNCgkgfQ0KfQ0KDQovKiogUmVhZHMgdGhlIFN5c3RlbSBTbGVlcCBDb250cm9sIFBDUiBSZWdpc3Rlcg0KICogQHJldHVybiB2YWx1ZSAtIGJ5dGUgMCBvZiB0aGUgc3lzdGVtIHNsZWVwIGNvbnRyb2wgUENSIHJlZ2lzdGVyDQogKi8NCnVpbnQ4X3QgcF9wY3Jfc3lzdGVtX3NsZWVwX2N0cmxfcmVhZCh2b2lkKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOw0KICAgIHVpbnQ4X3QgcmV0VmFsOw0KICAgIA0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKQkrIFBDUl9SRUdfU1lTVEVNX1NMRUVQX0NUUkw7CQkNCg0KICAgIHJldFZhbCA9ICh1aW50OF90KSgoKnBQQ1JfUmVnKSAmIDB4RkYpOw0KDQogICAgcmV0dXJuIHJldFZhbDsNCn0NCg0KDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgIEZ1bmN0aW9uIHRvIHByb2dyYW0gdG8gQ0xLIERpdmlkZSBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFdyaXRlcyB0aGUgY2xvY2sgZGl2aWRlIHZhbHVlIGluIHRoZSBQcm9jZXNzb3IgQ2xvY2sgQ29udHJvbCBSZWdpc3Rlcg0KICogQHBhcmFtIGNsa19kaXZpZGVfdmFsdWUgLSBjbGsgZGl2aWRlIHZhbHVlcywgdmFsaWQgdmFsdWVzIGluIGVudW0gUFJPQ0VTU09SX0NMS19ESVZJREVfVkFMVUUNCiAqLw0Kdm9pZCBwX3Bjcl9wcm9jZXNzb3JfY2xrX2N0cmxfd3JpdGUodWludDhfdCBjbGtfZGl2aWRlX3ZhbHVlKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwkJDQoNCiAgIC8qIENoZWNrIGZvciB2YWxpZCB2YWx1ZSAqLw0KICAgaWYgKCgoY2xrX2RpdmlkZV92YWx1ZSA+PSBQQ1JfQ1BVX0NMS19ESVZJREVfMSkgJiYgDQoJCSAgICAoY2xrX2RpdmlkZV92YWx1ZSA8PSBQQ1JfQ1BVX0NMS19ESVZJREVfNCkpIHx8DQoJICAgICAgIChjbGtfZGl2aWRlX3ZhbHVlID09IFBDUl9DUFVfQ0xLX0RJVklERV8xNikgfHwNCgkgICAgICAgIChjbGtfZGl2aWRlX3ZhbHVlID09IFBDUl9DUFVfQ0xLX0RJVklERV80OCkpDQoJIHsJDQoJCQlwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BST0NFU1NPUl9DTEtfQ1RSTDsJCQ0KDQoJCQkqcFBDUl9SZWcgPSAoY2xrX2RpdmlkZV92YWx1ZSAmIDB4RkYpOw0KCSB9DQoJDQp9DQoNCi8qKiBXcml0ZXMgdGhlIGNsb2NrIGRpdmlkZSB2YWx1ZSBpbiB0aGUgUHJvY2Vzc29yIENsb2NrIENvbnRyb2wgUmVnaXN0ZXINCiAqIEBwYXJhbSBub25lDQogKiBAIHJldHVybiB2YWx1ZSAtIGNsayBkaXZpZGUgdmFsdWUsIHZhbGlkIHZhbHVlcyBpbiBlbnVtIFBST0NFU1NPUl9DTEtfRElWSURFX1ZBTFVFDQogKi8NCnVpbnQ4X3QgcF9wY3JfcHJvY2Vzc29yX2Nsa19jdHJsX3JlYWQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50OF90IHJldFZhbDsJDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BST0NFU1NPUl9DTEtfQ1RSTDsJCQ0KDQoJICByZXRWYWwgPSAoKHVpbnQ4X3QpKCgqcFBDUl9SZWcpICYgMHhGRikpOw0KCQ0KICAgIHJldHVybiByZXRWYWw7DQoJDQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgIEZ1bmN0aW9uIHRvIHByb2dyYW0gdGhlIHNsb3cgY2xvY2sgZGl2aWRlIHZhbHVlICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiogV3JpdGUgdGhlIHNsb3cgY2xvY2sgZGl2aWRlIHZhbHVlIGluIHRoZSBTbG93IENsb2NrIENvbnRyb2wgUmVnaXN0ZXINCiAqIEBwYXJhbSBzbG93X2Nsa19kaXZpZGVfdmFsdWUgLSBzbG93IGNsayBkaXZpZGUgdmFsdWUNCiAqLw0Kdm9pZCBwX3Bjcl9zbG93X2Nsa19jdHJsX3dyaXRlKHVpbnQxNl90IHNsb3dfY2xrX2RpdmlkZV92YWx1ZSkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQ0KDQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19TTE9XX0NMS19DVFJMOwkJDQoNCiAgICAqcFBDUl9SZWcgPSAoc2xvd19jbGtfZGl2aWRlX3ZhbHVlICYgMHgzRkYpOwkNCg0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICBGdW5jdGlvbiB0byByZWFkIHRoZSBPc2NpbGxhdG9yIExvY2sgU3RhdHVzICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBSZWFkcyB0aGUgT3NjaWxsYXRvciBMb2NrIHN0YXR1cyBiaXQgaW4gdGhlIE9zY2lsbGF0b3IgSUQgUmVnaXN0ZXINCiAqIEByZXR1cm4gMSBpZiBPc2NpbGxhdG9yIExvY2sgU3RhdHVzIGJpdCBpcyBzZXQsIGVsc2UgMA0KICovDQp1aW50OF90IHBfcGNyX29zY2lsbGF0b3JfbG9ja19zdHNfZ2V0KHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDhfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX09TQ0lMTEFUT1JfSUQ7CQ0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX09TQ0lMTEFUT1JfTE9DS19TVEFUVVNfQklUTUFTSykNCiAgICB7DQogICAgICAgICAgICByZXRWYWwgPSAxOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gcmV0VmFsOw0KCQ0KfQ0KDQoNCi8qKiBSZWFkcyB0aGUgT3NjaWxsYXRvciBJRCBSZWdpc3Rlcg0KICogQHJldHVybiBvc2NpbGxhdG9yIElEIHZhbHVlDQogKi8NCnVpbnQxNl90IHBfcGNyX29zY2lsbGF0b3JfaWRfcmVnX3JlYWQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50MTZfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX09TQ0lMTEFUT1JfSUQ7CQ0KDQogICAgcmV0VmFsID0gKCh1aW50MTZfdCkoKCpwUENSX1JlZykgJiAweDFGRnUpKTsNCiAgICANCiAgICByZXR1cm4gcmV0VmFsOw0KCQ0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgRnVuY3Rpb25zIHRvIHJlYWQgdmFyaW91cyBwb3dlciBzdGF0dXMgaW4gUG93ZXIgUmVzZXQgcmVnaXN0ZXIgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFJlYWRzIHRoZSBWQ0MgUFdSR0QgU3RhdHVzIGJpdCANCiAqICAgICAgICBpbiB0aGUgUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyDQogKiBAcmV0dXJuIDEgaWYgVkNDIFBXUkdEIFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDANCiAqLw0KdWludDhfdCBwX3Bjcl9wd3JfcmVzZXRfdmNjX3B3cmRnX3N0c19nZXQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50OF90IHJldFZhbDsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsJDQoNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfUFdSX1JFU0VUX1NUU19WQ0NfUFdSR0RfUkVTRVRfU1RTX0JJVE1BU0spDQogICAgew0KICAgICAgICAgICAgcmV0VmFsID0gMTsNCiAgICB9DQogICAgDQogICAgcmV0dXJuIHJldFZhbDsJDQp9DQoNCi8qKiBSZWFkcyB0aGUgSG9zdCBSZXNldCBTdGF0dXMgYml0IA0KICogICAgICAgIGluIHRoZSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXINCiAqIEByZXR1cm4gMSBpZiBIb3N0IFJlc2V0IFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDANCiAqLw0KdWludDhfdCBwX3Bjcl9wd3JfcmVzZXRfaG9zdF9yZXNldF9zdHNfZ2V0KHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDhfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7CQ0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX1BXUl9SRVNFVF9TVFNfSE9TVF9SRVNFVF9TVFNfQklUTUFTSykNCiAgICB7DQogICAgICAgICAgICByZXRWYWwgPSAxOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gcmV0VmFsOwkNCn0NCg0KLyoqIFJlYWRzIHRoZSBWQkFUIFJlc2V0IFN0YXR1cyBiaXQgDQogKiAgICAgICAgaW4gdGhlIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3Rlcg0KICogQHJldHVybiAxIGlmIFZCQVQgUmVzZXQgU3RhdHVzIGJpdCBpcyBzZXQsIGVsc2UgMA0KICovDQp1aW50OF90IHBfcGNyX3B3cl9yZXNldF92YmF0X3Jlc2V0X3N0c19nZXQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50OF90IHJldFZhbDsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsJDQoNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfUFdSX1JFU0VUX1NUU19WQkFUX1JFU0VUX1NUU19CSVRNQVNLKQ0KICAgIHsNCiAgICAgICAgICAgIHJldFZhbCA9IDE7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogQ2xlYXJzIHRoZSBWQkFUIFJlc2V0IFN0YXR1cyBiaXQgDQogKiAgICAgICAgaW4gdGhlIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlciANCiAqLw0Kdm9pZCBwX3Bjcl9wd3JfcmVzZXRfdmJhdF9yZXNldF9zdHNfY2xyKHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CQkNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsNCg0KICAgIC8vIFdyaXRlIHRvIGNsZWFyDQogICAgKnBQQ1JfUmVnIHw9IFBDUl9QV1JfUkVTRVRfU1RTX1ZCQVRfUkVTRVRfU1RTX0JJVE1BU0s7DQoJDQp9DQoNCi8qKiBSZWFkcyB0aGUgVlRSIFJlc2V0IFN0YXR1cyBiaXQgDQogKiAgICAgICAgaW4gdGhlIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3Rlcg0KICogQHJldHVybiAxIGlmIFZUUiBSZXNldCBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwDQogKi8NCnVpbnQ4X3QgcF9wY3JfcHdyX3Jlc2V0X3Z0cl9yZXNldF9zdHNfZ2V0KHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDhfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7CQ0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX1BXUl9SRVNFVF9TVFNfVlRSX1JFU0VUX1NUU19CSVRNQVNLKQ0KICAgIHsNCiAgICAgICAgICAgIHJldFZhbCA9IDE7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogQ2xlYXJzIHRoZSBWVFIgUmVzZXQgU3RhdHVzIGJpdCANCiAqICAgICAgICBpbiB0aGUgUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIA0KICovDQp2b2lkIHBfcGNyX3B3cl9yZXNldF92dHJfcmVzZXRfc3RzX2Nscih2b2lkKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwkJDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7DQoNCiAgICAvLyBXcml0ZSB0byBjbGVhcg0KICAgICpwUENSX1JlZyB8PSBQQ1JfUFdSX1JFU0VUX1NUU19WVFJfUkVTRVRfU1RTX0JJVE1BU0s7DQoJDQp9DQoNCi8qKiBSZWFkcyB0aGUgSlRBRyBSZXNldCBTdGF0dXMgYml0IA0KICogICAgICAgIGluIHRoZSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXINCiAqIEByZXR1cm4gMSBpZiBKVEFHIFJlc2V0IFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDANCiAqLw0KdWludDhfdCBwX3Bjcl9wd3JfcmVzZXRfanRhZ19yZXNldF9zdHNfZ2V0KHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDhfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7CQ0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX1BXUl9SRVNFVF9TVFNfSlRBR19SRVNFVF9TVFNfQklUTUFTSykNCiAgICB7DQogICAgICAgICAgICByZXRWYWwgPSAxOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gcmV0VmFsOwkNCn0NCg0KLyoqIENsZWFycyB0aGUgSlRBRyBSZXNldCBTdGF0dXMgYml0IA0KICogICAgICAgIGluIHRoZSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgDQogKi8NCnZvaWQgcF9wY3JfcHdyX3Jlc2V0X2p0YWdfcmVzZXRfc3RzX2Nscih2b2lkKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwkJDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7DQoNCiAgICAvLyBXcml0ZSB0byBjbGVhcg0KICAgICpwUENSX1JlZyB8PSBQQ1JfUFdSX1JFU0VUX1NUU19KVEFHX1JFU0VUX1NUU19CSVRNQVNLOw0KCQ0KfQ0KDQovKiogUmVhZHMgdGhlIDMyS19BQ1RJVkUgc3RhdHVzIGJpdCANCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyDQogKiBAcmV0dXJuIDEgaWYgMzJfQUNUSVZFIGJpdCBpcyBzZXQsIGVsc2UgMA0KICovDQp1aW50OF90IHBfcGNyX3B3cl9yZXNldF8zMktfYWN0aXZlX3N0c19nZXQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50OF90IHJldFZhbDsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsJDQoNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfUFdSX1JFU0VUX1NUU18zMktfQUNUSVZFX1NUU19CSVRNQVNLKQ0KICAgIHsNCiAgICAgICAgICAgIHJldFZhbCA9IDE7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogUmVhZHMgdGhlIFBDSUNMS19BQ1RJVkUgc3RhdHVzIGJpdCANCiAqICAgICAgICBpbiB0aGUgUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyDQogKiBAcmV0dXJuIDEgaWYgUENJQ0xLX0FDVElWRSBiaXQgaXMgc2V0LCBlbHNlIDANCiAqLw0KdWludDhfdCBwX3Bjcl9wd3JfcmVzZXRfcGNpY2xrX2FjdGl2ZV9zdHNfZ2V0KHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDhfdCByZXRWYWw7DQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9TVFM7CQ0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX1BXUl9SRVNFVF9TVFNfUENJQ0xLX0FDVElWRV9TVFNfQklUTUFTSykNCiAgICB7DQogICAgICAgICAgICByZXRWYWwgPSAxOw0KICAgIH0JCQ0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogUmVhZHMgdGhlIEVTUEkgc3RhdHVzIGJpdCANCiAqICAgICAgICBpbiB0aGUgUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyDQogKiBAcmV0dXJuIDEgaWYgRVNQSUNMS19BQ1RJVkUgYml0IGlzIHNldCwgZWxzZSAwDQogKi8NCnVpbnQ4X3QgcF9wY3JfcHdyX3Jlc2V0X2VzcGljbGtfYWN0aXZlX3N0c19nZXQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsNCiAgICB1aW50OF90IHJldFZhbDsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsJDQoNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfUFdSX1JFU0VUX1NUU19FU1BJQ0xLX0FDVElWRV9TVFNfQklUTUFTSykNCiAgICB7DQogICAgICAgICAgICByZXRWYWwgPSAxOw0KICAgIH0JCQ0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogUmVhZHMgdGhlIFBvd2VyIHN0YXR1cyByZWcNCiAqIEByZXR1cm4gUG93ZXIgU3RhdHVzIFJlZyB2YWx1ZQ0KICovDQp1aW50MTZfdCBwX3Bjcl9wd3JfcmVzZXRfc3RzX2dldCh2b2lkKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOw0KICAgIHVpbnQxNl90IHJldFZhbDsNCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX1NUUzsJDQoNCiAgICByZXRWYWwgPSAodWludDE2X3QpKCgqcFBDUl9SZWcpICYgMHhGRkYpOw0KCQ0KCSAgcmV0dXJuIChyZXRWYWwpOyAgICANCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiogUmVhZHMgdGhlIFBvd2VyIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXINCiAqIEByZXR1cm4gUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3RlciB2YWx1ZQ0KICovDQp1aW50MTZfdCBwX3Bjcl9wd3JfcmVzZXRfY3RybF9yZWFkKHZvaWQpDQp7DQogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7DQogICAgdWludDE2X3QgcmV0VmFsOw0KDQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19QV1JfUkVTRVRfQ1RSTDsJDQoNCiAgICByZXRWYWwgPSAodWludDE2X3QpKCgqcFBDUl9SZWcpICYgMHgxRkZVTCk7ICAgIA0KICAgIA0KICAgIHJldHVybiByZXRWYWw7CQ0KfQ0KDQovKiogU2V0IHRoZSBQV1JfSU5WIGJpdCBpbiB0aGUgUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3Rlcg0KICogQHBhcmFtIHNldF9jbHIgdmFsdWUgMSBvciAwDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwX3Bjcl9wd3JfcmVzZXRfY3RybF9wd3JfaW52X3NldF9jbHIodWludDhfdCBzZXRfY2xyKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOyAgICANCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX0NUUkw7CQ0KDQoJICBpZiAoc2V0X2NscikNCgkJew0KICAgICAgICAqcFBDUl9SZWcgfD0gKFBDUl9QV1JfUkVTRVRfQ1RSTF9QV1JfSU5WX0JJVE1BU0spOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkgICAgKnBQQ1JfUmVnICY9IH4oUENSX1BXUl9SRVNFVF9DVFJMX1BXUl9JTlZfQklUTUFTSyk7DQoJCX0NCn0NCg0KLyoqIFNldCB0aGUgSE9TVCBSRVNFVCBTRUxFQ1QgYml0IGluIHRoZSBQb3dlciBSZXNldCBDb250cm9sIFJlZ2lzdGVyDQogKiBAcGFyYW0gc2V0X2NsciB2YWx1ZSAxIG9yIDANCiAqIEByZXR1cm4gbm9uZQ0KICovDQp2b2lkIHBfcGNyX3B3cl9yZXNldF9jdHJsX2hvc3RfcnN0X3NldF9jbHIodWludDhfdCBzZXRfY2xyKQ0Kew0KICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOyAgICANCg0KICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfUFdSX1JFU0VUX0NUUkw7CQ0KDQoJICBpZiAoc2V0X2NscikNCgkJew0KICAgICAgICAqcFBDUl9SZWcgfD0gKFBDUl9QV1JfUkVTRVRfQ1RSTF9IT1NUX1JTVF9TRUxFQ1RfQklUTUFTSyk7ICAgICAgIA0KCQl9DQoJCWVsc2UNCgkJew0KICAgICAgICAqcFBDUl9SZWcgJj0gfihQQ1JfUFdSX1JFU0VUX0NUUkxfSE9TVF9SU1RfU0VMRUNUX0JJVE1BU0spOyAgICAgICAJCQkNCgkJfQ0KfQ0KDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICBGdW5jdGlvbnMgZm9yIFN5c3RlbSBSZXNldCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFNldCB0aGUgU09GVF9TWVNfUkVTRVQgYml0IGluIHRoZSBTeXN0ZW0gUmVzZXQgUmVnaXN0ZXINCiAqIEBwYXJhbSBub25lDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwX3Bjcl9zeXN0ZW1fcmVzZXRfc2V0KCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsgICAgDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1NZU1RFTV9SRVNFVDsJDQoNCiAgICAqcFBDUl9SZWcgfD0gKDE8PDgpOyAgICAgICANCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgUEtFIENsb2NrIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogU2V0IHRoZSB2YWx1ZSBpbiBQS0UgQ0xPQ0sgUmVnaXN0ZXINCiAqIEBwYXJhbSBQS0UgQ2xvY2sgdmFsdWUgDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwX3Bjcl9wa2VfY2xvY2tfd3JpdGUodWludDhfdCBwa2VfY2xrX3ZhbCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsgICAgDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfVEVTVDA7CQ0KDQogICAgKnBQQ1JfUmVnID0gcGtlX2Nsa192YWw7DQp9DQoNCi8qKiBSZWFkIHRoZSB2YWx1ZSBpbiBQS0UgQ0xPQ0sgUmVnaXN0ZXINCiAqIEBub25lIA0KICogQHJldHVybiBQS0UgQ2xvY2sgdmFsdWUgDQogKi8NCnVpbnQ4X3QgcF9wY3JfcGtlX2Nsb2NrX3JlYWQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsgICAgDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfVEVTVDA7CQ0KDQogICAgcmV0dXJuICgodWludDhfdCkoKnBQQ1JfUmVnICYgMHhGRikpOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgRnVuY3Rpb25zIGZvciBPc2NpbGxhdG9yIGNhbGlicmF0aW9uIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogU2V0IHRoZSB2YWx1ZSBpbiBPc2NpbGxhdG9yIGNhbGlicmF0aW9uIFJlZ2lzdGVyDQogKiBAcGFyYW0gT3NjaWxsYXRvciBjYWxpYnJhdGlvbiB2YWx1ZSANCiAqIEByZXR1cm4gbm9uZQ0KICovDQp2b2lkIHBfcGNyX29zY19jYWxfd3JpdGUodWludDhfdCBvc2NfY2FsX3ZhbCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsgICAgDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfVEVTVDE7CQ0KDQogICAgKnBQQ1JfUmVnID0gb3NjX2NhbF92YWw7DQp9DQoNCi8qKiBSZWFkIHRoZSB2YWx1ZSBpbiBPc2MgY2FsIFJlZ2lzdGVyDQogKiBAbm9uZSANCiAqIEByZXR1cm4gT3NjIGNhbCB2YWx1ZSANCiAqLw0KdWludDhfdCBwX3Bjcl9vc2NfY2FsX3JlYWQodm9pZCkNCnsNCiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsgICAgDQoNCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfVEVTVDE7CQ0KDQogICAgcmV0dXJuICgodWludDhfdCkoKnBQQ1JfUmVnICYgMHhGRikpOw0KfQ0KDQovKiBlbmQgcGNyX3BlcnBobC5jICovDQovKiogICBAfQ0KICovDQo=