LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIEZyZWVSVE9TK1RyYWNlIHYyLjIuMyBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLnNlDQogKg0KICogdHJjVXNlci5jDQogKg0KICogVGhlIHB1YmxpYyBBUEkgb2YgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCBQZXJjZXBpbyBBQi4gVGhlIHJlY29yZGVyIGxpYnJhcnkgaXMgZnJlZSBmb3INCiAqIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIHJlY29yZGVyIGxpYnJhcnkNCiAqIGluIGl0cyBvcmlnaW5hbCBmb3JtLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucyBpbiB0cmNQb3J0LmMgYW5kIHRyY1BvcnQuaA0KICogZ2l2ZW4gdGhhdCB0aGVzZSBtb2RpZmljYXRpb24gYXJlIGNsZWFybHkgbWFya2VkIGFzIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMNCiAqIGFuZCBkb2N1bWVudGVkIGluIHRoZSBpbml0aWFsIGNvbW1lbnQgc2VjdGlvbiBvZiB0aGVzZSBzb3VyY2UgZmlsZXMuIA0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlIA0KICogc29sZCBvciBpbiBvdGhlciB3YXlzIGNvbW1lcmNpYWxseSByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgZXhwbGljaXQgd3JpdHRlbiANCiAqIHBlcm1pc3Npb24gYnkgUGVyY2VwaW8gQUIuDQogKg0KICogRGlzY2xhaW1lciANCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kIA0KICogUGVyY2VwaW8gQUIgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gaXRzIHVzZSBvciBwZXJmb3JtYW5jZS4gUGVyY2VwaW8gQUIgZG9lcyANCiAqIG5vdCBhbmQgY2Fubm90IHdhcnJhbnQgdGhlIHBlcmZvcm1hbmNlIG9yIHJlc3VsdHMgeW91IG1heSBvYnRhaW4gYnkgdXNpbmcgdGhlIA0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yIA0KICogaW1wbGllZCwgYXMgdG8gbm9uaW5mcmluZ2VtZW50IG9mIHRoaXJkIHBhcnR5IHJpZ2h0cywgbWVyY2hhbnRhYmlsaXR5LCBvciANCiAqIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEluIG5vIGV2ZW50IHdpbGwgUGVyY2VwaW8gQUIsIGl0cyANCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwgDQogKiBpbmNpZGVudGFsIG9yIHNwZWNpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBsb3N0IHByb2ZpdHMgb3IgbG9zdCBzYXZpbmdzLCANCiAqIGV2ZW4gaWYgYSByZXByZXNlbnRhdGl2ZSBvZiBQZXJjZXBpbyBBQiBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSANCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbyANCiAqIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCwgY29uc2VxdWVudGlhbCBvciBzcGVjaWFsIA0KICogZGFtYWdlcywgb3IgdGhlIGV4Y2x1c2lvbiBvZiBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgbGltaXRhdGlvbnMgb24gaG93IGxvbmcgYW4gDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogRnJlZVJUT1MrVHJhY2UgaXMgYXZhaWxhYmxlIGFzIEZyZWUgRWRpdGlvbiBhbmQgaW4gdHdvIHByZW1pdW0gZWRpdGlvbnMuDQogKiBZb3UgbWF5IHVzZSB0aGUgcHJlbWl1bSBmZWF0dXJlcyBkdXJpbmcgMzAgZGF5cyBmb3IgZXZhbHVhdGlvbi4NCiAqIERvd25sb2FkIEZyZWVSVE9TK1RyYWNlIGF0IGh0dHA6Ly93d3cucGVyY2VwaW8uc2UvaW5kZXgucGhwP3BhZ2U9ZG93bmxvYWRzDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDEyLg0KICogd3d3LnBlcmNlcGlvLnNlDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAiRnJlZVJUT1MuaCINCiNpbmNsdWRlICJ0YXNrLmgiDQojaW5jbHVkZSAicXVldWUuaCINCg0KI2lmIChjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSkNCg0KI2luY2x1ZGUgInN0cmluZy5oIg0KI2luY2x1ZGUgInN0ZGFyZy5oIg0KI2luY2x1ZGUgInRyY1VzZXIuaCINCiNpbmNsdWRlICJ0cmNLZXJuZWwuaCINCg0KZXh0ZXJuIHVpbnQ4X3QgaW5FeGNsdWRlZFRhc2s7DQpleHRlcm4gdWludDhfdCBuSVNSYWN0aXZlOw0KZXh0ZXJuIHVpbnQ4X3QgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2s7DQpleHRlcm4gdWludDMyX3QgZHRzX21pbjsNCmV4dGVybiB1aW50MzJfdCBod3RjX2NvdW50X21heF9hZnRlcl90aWNrOw0KZXh0ZXJuIHVpbnQzMl90IGh3dGNfY291bnRfc3VtX2FmdGVyX3RpY2s7DQpleHRlcm4gdWludDMyX3QgaHd0Y19jb3VudF9zdW1fYWZ0ZXJfdGlja19jb3VudGVyOw0KZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNRdWV1ZUdldFF1ZXVlVHlwZSh2b2lkKik7DQpleHRlcm4gdW5zaWduZWQgY2hhciB1Y1F1ZXVlR2V0UXVldWVOdW1iZXIodm9pZCopOw0KZXh0ZXJuIGNoYXIqIHRyYWNlRXJyb3JNZXNzYWdlOw0KDQpzdGF0aWMgdm9pZCB2VHJhY2VNb25pdG9yVGFzayh2b2lkKTsNCiAgICANCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VNb25pdG9yVGFzaw0KICoNCiAqIEEgdGFzayB3aGljaCBwZXJpb2RpY2FsbHkgcmVwb3J0cyB0aGUgcmVjb3JkZXIgc3RhdHVzIHRvIHRoZSBjb25zb2xlLg0KICogVGhpcyBpcyBpbmNsdWRlZCBkZXBlbmRpbmcgb24gVVNFX1RSQUNFX1BST0dSRVNTX01PTklUT1JfVEFTSy4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCB2VHJhY2VNb25pdG9yVGFzayh2b2lkKQ0KeyAgICANCiAgICBwb3J0VGlja1R5cGUgeE5leHRXYWtlVGltZTsNCiAgICBjaGFyIGxvY2Fsc3ByaW50YnVmZmVyWzkwXTsNCiAgICBjaGFyKiBlcnIgPSBOVUxMOyAgICANCiAgICBjaGFyKiBsYXN0RXJyID0gTlVMTDsgICAgICANCiAgICAjZGVmaW5lIFNUQVRFX0lOSVQgMA0KICAgICNkZWZpbmUgU1RBVEVfU1RBUlRFRCAxDQogICAgI2RlZmluZSBTVEFURV9TVE9QUEVEIDIgICAgDQogICAgaW50IHN0YXRlID0gU1RBVEVfSU5JVDsNCiAgICANCiAgICB2VHJhY2VDb25zb2xlTWVzc2FnZSgiXG5ccltGcmVlUlRPUytUcmFjZV0gTW9uaXRvciB0YXNrIHN0YXJ0ZWQuLi5cblxyIik7DQoNCiAgICAvKiBJbml0aWFsaXNlIHhOZXh0V2FrZVRpbWUgLSB0aGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLiAqLw0KICAgIHhOZXh0V2FrZVRpbWUgPSB4VGFza0dldFRpY2tDb3VudCgpOw0KDQogICAgZm9yICg7OykNCiAgICB7DQogICAgICAgIGxhc3RFcnIgPSBlcnI7ICAgICAgICANCiAgICAgICAgZXJyID0geFRyYWNlR2V0TGFzdEVycm9yKCk7DQogICAgICAgIGlmIChlcnIgIT0gbGFzdEVycikNCiAgICAgICAgew0KICAgICAgICAgICAgc3ByaW50Zihsb2NhbHNwcmludGJ1ZmZlciwgIlxuXHJbRnJlZVJUT1MrVHJhY2VdIEVycm9yOiAlc1xuXHIiLCBlcnIpOw0KICAgICAgICAgICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UobG9jYWxzcHJpbnRidWZmZXIpOyANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1NUT1BQRUQgfHwgc3RhdGUgPT0gU1RBVEVfSU5JVCkgDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TVEFSVEVEOw0KICAgICAgICAgICAgICAgIHZUcmFjZUNvbnNvbGVNZXNzYWdlKCJcblxyW0ZyZWVSVE9TK1RyYWNlXSBSZWNvcmRlciBzdGFydGVkLlxuXHIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfSU5JVCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB2VHJhY2VDb25zb2xlTWVzc2FnZSgiXG5ccltGcmVlUlRPUytUcmFjZV0gUmVjb3JkZXIgbm90IHN0YXJ0ZWQuXG5cciIpOw0KICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfU1RBUlRFRCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+ZnJlcXVlbmN5ID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzcHJpbnRmKGxvY2Fsc3ByaW50YnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgIlxuXHJbRnJlZVJUT1MrVHJhY2VdIEV2ZW50IGNvdW50OiAlZCwgRHVyYXRpb246ICVkIG1zLiBbJWQgdGlja3NdXG5cciIsIA0KICAgICAgICAgICAgICAgICAgICBSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cywgDQogICAgICAgICAgICAgICAgICAgIFJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudFNlY29uZCoxMDAwICsgKFJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudCoxMDAwKS8gUmVjb3JkZXJEYXRhUHRyLT5mcmVxdWVuY3ksIHhUYXNrR2V0VGlja0NvdW50KCkpOw0KICAgICAgICAgICAgICAgIHZUcmFjZUNvbnNvbGVNZXNzYWdlKGxvY2Fsc3ByaW50YnVmZmVyKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7DQogICAgICAgICAgICAgICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIFJlY29yZGVyIHN0b3BwZWQuXG5cciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZUcmFjZVBvcnRFbmQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCg0KICAgICAgICB9DQoNCiAgICAvKiBQbGFjZSB0aGlzIHRhc2sgaW4gdGhlIGJsb2NrZWQgc3RhdGUgdW50aWwgaXQgaXMgdGltZSB0byBydW4gYWdhaW4uICovDQogICAgICAgIHZUYXNrRGVsYXlVbnRpbCggJnhOZXh0V2FrZVRpbWUsIFRSQUNFX1BST0dSRVNTX01PTklUT1JfVEFTS19QRVJJT0QpOw0KICAgICAgICANCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDbGVhcg0KICoNCiAqIFJlc2V0cyB0aGUgcmVjb3JkZXIuIE9ubHkgbmVjZXNzYXJ5IGlmIGEgcmVzdGFydCBpcyBkZXNpcmVkIC0gdGhpcyBpcyBub3QgDQogKiBuZWVkZWQgaW4gdGhlIHN0YXJ0dXAgaW5pdGlhbGl6YXRpb24uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDbGVhcih2b2lkKQ0Kew0KICAgIHRhc2tFTlRFUl9DUklUSUNBTCgpOw0KDQogICAgUmVjb3JkZXJEYXRhUHRyLT5hYnNUaW1lTGFzdEV2ZW50ID0gMDsNCiAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KICAgIFJlY29yZGVyRGF0YVB0ci0+bnVtRXZlbnRzID0gMDsNCiAgICBSZWNvcmRlckRhdGFQdHItPmJ1ZmZlcklzRnVsbCA9IDA7DQoNCiAgICB0YXNrRVhJVF9DUklUSUNBTCgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RhcnRTdGF0dXNNb25pdG9yDQogKg0KICogVGhpcyBzdGFydHMgYSB0YXNrIHRvIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZSByZWNvcmRlci4gDQogKiBUaGlzIHRhc2sgcGVyaW9kaWNhbGx5IHByaW50cyBhIGxpbmUgdG8gdGhlIGNvbnNvbGUgd2luZG93LCB3aGljaCBzaG93cyB0aGUgDQogKiBudW1iZXIgb2YgZXZlbnRzIHJlY29yZGVkIGFuZCB0aGUgbGF0ZXN0IHRpbWVzdGFtcC4gVGhpcyB0YXNrDQogKiBjYWxscyB2VHJhY2VQb3J0RW5kIHdoZW4gdGhlIHJlY29yZGVyIGhhcyBiZWVuIHN0b3BwZWQsIHdoZXJlIGN1c3RvbQ0KICogYWN0aW9ucyBjYW4gYmUgYWRkZWQsIGUuZy4sIHRvIHN0b3JlIHRoZSB0cmFjZSB0byBhIGZpbGUNCiAqIGlmIGEgZmlsZSBzeXN0ZW0gaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdGFydFN0YXR1c01vbml0b3Iodm9pZCkNCnsgICAgDQogICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIFN0YXJ0aW5nIFRyYWNlIFN0YXR1cyBNb25pdG9yLi4uXG5cciIpOw0KICAgICh2b2lkKXhUYXNrQ3JlYXRlKCAocGRUQVNLX0NPREUpdlRyYWNlTW9uaXRvclRhc2ssIChjb25zdCBzaWduZWQgY2hhciopIlRyYWNlTW9uIiwgVFJBQ0VfUFJPR1JFU1NfTU9OSVRPUl9UQVNLX1NUQUNLU0laRSwgTlVMTCwgVFJBQ0VfUFJPR1JFU1NfTU9OSVRPUl9UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlU3RhcnQNCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oIA0KICogaGFzIGEgdG9vIHNtYWxsIHZhbHVlIChOVEFTSywgTlFVRVVFLCBldGMpLg0KICogDQogKiBSZXR1cm5zIDEgaWYgdGhlIHJlY29yZGVyIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4NCiAqIFJldHVybnMgMCBpZiB0aGUgcmVjb3JkZXIgc3RhcnQgd2FzIHByZXZlbnRlZCBkdWUgdG8gYSBwcmV2aW91cyBpbnRlcm5hbCANCiAqIGVycm9yLiBJbiB0aGF0IGNhc2UsIGNoZWNrIHZUcmFjZUdldExhc3RFcnJvciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlIGluIA0KICogRnJlZVJUT1MrVHJhY2UgdjIuMi4yIG9yIGxhdGVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnVpbnQzMl90IHVpVHJhY2VTdGFydCh2b2lkKQ0KeyAgICAgICAgDQogICAgaWYgKHRyYWNlRXJyb3JNZXNzYWdlID09IE5VTEwpDQogICAgew0KICAgICAgICBSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlID0gMTsNCiAgICAgICAgdlRyYWNlU3RvcmVUYXNrc3dpdGNoKCk7IC8qIFJlZ2lzdGVyIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrICovDQogICAgfQ0KDQogICAgcmV0dXJuIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydCANCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oIA0KICogaGFzIGEgdG9vIHNtYWxsIHZhbHVlIChOVEFTSywgTlFVRVVFLCBldGMpLg0KICogDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiANCiAqIFdlIHJlY29tbWVuZCB1c2luZyB1aVRyYWNlU3RhcnQgaW5zdGVhZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0YXJ0KHZvaWQpDQp7ICAgICAgICANCiAgICAodm9pZCl1aVRyYWNlU3RhcnQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3ANCiAqDQogKiBTdG9wcyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyB2VHJhY2VTdGFydC4NCiAqIFRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIHJlY29yZGVyLiBVc2UgdlRyYWNlQ2xlYXIgaXMgdGhhdCBpcyBkZXNpcmVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcCh2b2lkKQ0Kew0KICAgIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPSAwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogeFRyYWNlR2V0TGFzdEVycm9yDQogKg0KICogR2l2ZXMgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSwgaWYgYW55LiBOVUxMIGlmIG5vIGVycm9yIG1lc3NhZ2UgaXMgc3RvcmVkLg0KICogVGhlIG1lc3NhZ2UgaXMgY2xlYXJlZCBvbiByZWFkLg0KICogQW55IGVycm9yIG1lc3NhZ2UgaXMgYWxzbyBwcmVzZW50ZWQgd2hlbiBvcGVuaW5nIGEgdHJhY2UgZmlsZSBpbiANCiAqIEZyZWVSVE9TK1RyYWNlIHYyLjIuMiBvciBsYXRlci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpjaGFyKiB4VHJhY2VHZXRMYXN0RXJyb3Iodm9pZCkNCnsgICANCiAgICByZXR1cm4gdHJhY2VFcnJvck1lc3NhZ2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcg0KICogDQogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUuIFVzZSB0aGlzIHRvZ2V0aGVyIHdpdGggDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkIA0KICogc29sdXRpb24sIGUuZy4sIGluIGNhc2UgYSBkZWJ1Z2dlciBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwbG9hZGluZyANCiAqIHRoZSBkYXRhLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQqIHZUcmFjZUdldFRyYWNlQnVmZmVyKHZvaWQpDQp7DQogICAgcmV0dXJuIFJlY29yZGVyRGF0YVB0cjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHVpVHJhY2VHZXRUcmFjZUJ1ZmZlclNpemUNCiAqIA0KICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUuIEZvciB1c2UgdG9nZXRoZXIgd2l0aCANCiAqIHZUcmFjZUdldFRyYWNlQnVmZmVyIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkIHNvbHV0aW9uLCANCiAqIGUuZy4sIGluIGNhc2UgYSBkZWJ1Z2dlciBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwbG9hZGluZyB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1aW50MzJfdCB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplKHZvaWQpDQp7DQogICAgcmV0dXJuIHNpemVvZihSZWNvcmRlckRhdGFUeXBlKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUV4Y2x1ZGVUYXNrDQogKiBFeGNsdWRlcyBhIHRhc2sgZnJvbSB0aGUgcmVjb3JkaW5nIHVzaW5nIGEgZmxhZyBpbiB0aGUgT2JqZWN0IFByb3BlcnR5IFRhYmxlLg0KICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHNvbWUgaXJyZWxldmFudCB0YXNrIGlzIHZlcnkgZnJlcXVlbnQgYW5kIGlzICJlYXRpbmcNCiAqIHVwIHRoZSBidWZmZXIiLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IA0KICogcHJlZmVyYWJseSBiZWZvcmUgc3RhcnRpbmcgdGhlIEZyZWVSVE9TIHNjaGVkdWxlci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUV4Y2x1ZGVUYXNrRnJvbVNjaGVkdWxpbmdUcmFjZShjb25zdCBjaGFyKiBuYW1lKQ0Kew0KICAgIG9iamVjdEhhbmRsZVR5cGUgaTsNCiAgICBpbnQzMl90IGZvdW5kID0gMDsNCiAgICBmb3IgKGkgPSAxOyBpIDwgUmVjb3JkZXJEYXRhUHRyLT5PYmplY3RQcm9wZXJ0eVRhYmxlLk51bWJlck9mT2JqZWN0c1BlckNsYXNzW1RSQUNFX0NMQVNTX1RBU0tdOyBpKyspDQogICAgew0KICAgICAgICBpZiAoc3RybmNtcChuYW1lLCANCiAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfTkFNRV9HRVQoVFJBQ0VfQ0xBU1NfVEFTSywgaSksIA0KICAgICAgICAgICAgICAgICAgICBSZWNvcmRlckRhdGFQdHItPk9iamVjdFByb3BlcnR5VGFibGUuTmFtZUxlbmd0aFBlckNsYXNzW1RSQUNFX0NMQVNTX1RBU0tdKSA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICBTRVRfVEFTS19GTEFHX0lTRVhDTFVERUQoaSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoIWZvdW5kKQ0KICAgIHsNCiAgICAgICAgdlRyYWNlRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRhc2sgdG8gZXhjbHVkZSEiKTsNCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRRdWV1ZU5hbWUNCiAqDQogKiBBc3NpZ25zIGEgbmFtZSB0byBhIEZyZWVSVE9TIFF1ZXVlLCBTZW1hcGhvcmUgb3IgTXV0ZXguIFRoaXMgZnVuY3Rpb24gc2hvdWxkDQogKiBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHF1ZXVlL211dGV4L3NlbWFwaG9yZS4gSWYgbm90IHVzaW5nIA0KICogdGhpcyBmdW5jdGlvbiwgdGhlIHF1ZXVlcy9tdXRleGVzL3NlbWFwaG9yZXMgd2lsbCBiZSBwcmVzZW50ZWQgYnkgdGhlaXINCiAqIG51bWVyaWMgaGFuZGxlIG9ubHkuDQogKg0KICogRXhhbXBsZToNCiAqICAgICBhY3R1YXRvclEgPSB4UXVldWVDcmVhdGUoMywgc2l6ZW9mKFF1ZXVlTWVzc2FnZSkpOw0KICogICAgIHZUcmFjZVNldFF1ZXVlTmFtZShhY3R1YXRvclEsICJBY3R1YXRvclF1ZXVlIik7DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRRdWV1ZU5hbWUodm9pZCogcXVldWUsIGNvbnN0IGNoYXIqIG5hbWUpDQp7DQogICAgaW50IHQgPSB1Y1F1ZXVlR2V0UXVldWVUeXBlKHF1ZXVlKTsgICAgDQogICAgdlRyYWNlU2V0T2JqZWN0TmFtZShUcmFjZU9iamVjdENsYXNzVGFibGVbdF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdEhhbmRsZVR5cGUpdWNRdWV1ZUdldFF1ZXVlTnVtYmVyKHF1ZXVlKSwgbmFtZSk7DQp9DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZA0KICogDQogKiBUaGlzIGRlZmluZXMgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50IGZvciB0aGUgY3VycmVudCB0YXNrLiBJdCB0ZWxscyANCiAqIHRoZSByZWNvcmRlciB0aGF0IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoaXMgdGFzayBpcyBmaW5pc2hlZCBhdCB0aGUgbmV4dCANCiAqIGtlcm5lbCBjYWxsIG9mIHRoZSB0YXNrLCBlLmcuLCBhIHRhc2tEZWxheSBvciBhIHF1ZXVlIHJlY2VpdmUuIFRoaXMgZnVuY3Rpb24gDQogKiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgYXBpIGZ1bmN0aW9uIGNhbGwgY29uc2lkZXJlZCB0byBiZSB0aGUgZW5kIA0KICogb2YgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZSwgaS5lLiwgdGhlIEluc3RhbmNlIEZpbmlzaCBFdmVudC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZCgpDQp7DQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgU0VUX1RBU0tfRkxBR19NQVJLSUZFKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKTsgICAgDQogICAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdnZUcmFjZVRhc2tTa2lwRGVmYXVsdEluc3RhbmNlRmluaXNoZWRFdmVudHMNCiAqDQogKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgaW1wbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50cywgc3VjaCBhcyANCiAqIHZUYXNrRGVsYXlVbnRpbCBvciB4UXVldWVSZWNlaXZlLCBpbiBhIHRhc2sgd2hlcmUgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIA0KICogRXZlbnQgaGFzIGJlZW4gZGVmaW5lZC4gVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgcmVjb3JkZXIgdGhhdCBvbmx5IHRoZSANCiAqIGV4cGxpY2l0bHkgZGVmaW5lZCBmdW5jdGlvbnMsIHVzaW5nIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQsIHNob3VsZCBiZQ0KICogdHJlYXRlZCBhcyBJbnN0YW5jZSBGaW5pc2ggRXZlbnRzIGZvciB0aGlzIHRhc2suIFRoZSBpbXBsaWNpdCBJbnN0YW5jZSBGaW5pc2ggDQogKiBFdmVudHMgYXJlIHRodXMgZGlzcmVnYXJkZWQgZm9yIHRoZSBjYWxsaW5nIHRhc2suDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VUYXNrU2tpcERlZmF1bHRJbnN0YW5jZUZpbmlzaGVkRXZlbnRzKCkNCnsgICAgDQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgUFJPUEVSVFlfVEFTS19JRkVfU0VSVklDRUNPREUoaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spID0gDQogICAgICAgICAgUkVTRVJWRURfRFVNTVlfQ09ERTsNCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBJbnRlcnJ1cHQgcmVjb3JkaW5nIGZ1bmN0aW9ucyANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9JU1JfVFJBQ0lORyA9PSAxKQ0KDQojZGVmaW5lIE1BWF9JU1JfTkVTVElORyAxNg0Kc3RhdGljIHVpbnQ4X3QgaXNyc3RhY2tbTUFYX0lTUl9ORVNUSU5HXTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVNldElTUlByb3BlcnRpZXMNCiAqIA0KICogUmVnaXN0ZXJzIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgaW4gdGhlIHJlY29yZGVyIGxpYnJhcnksIFRoaXMgbXVzdCBiZQ0KICogY2FsbGVkIGJlZm9yZSB1c2luZyB2VHJhY2VTdG9yZUlTUkJlZ2luIHRvIHN0b3JlIElTUiBldmVudHMuIFRoaXMgaXMgDQogKiB0eXBpY2FsbHkgY2FsbGVkIGluIHRoZSBzdGFydHVwIG9mIHRoZSBzeXN0ZW0sIGJlZm9yZSB0aGUgc2NoZWR1bGVyIGlzIA0KICogc3RhcnRlZC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgcG9ydEVOVEVSX0NSSVRJQ0FMKCk7IC8vIFJlcXVpcmVkIGlmIG5lc3RlZCBJU1JzIGFyZSBhbGxvd2VkDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgICAgIHBvcnRFWElUX0NSSVRJQ0FMKCk7DQogKiAgICAgICAgIC4uLg0KICogICAgICAgICBwb3J0RU5URVJfQ1JJVElDQUwoKTsgLy8gUmVxdWlyZWQgaWYgbmVzdGVkIElTUnMgYXJlIGFsbG93ZWQNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgICAgICAgcG9ydEVYSVRfQ1JJVElDQUwoKTsNCiAqICAgICB9DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlLCBjaGFyKiBuYW1lLCBjaGFyIHByaW9yaXR5KQ0Kew0KICAgIHZUcmFjZVNldE9iamVjdE5hbWUoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIG5hbWUpOw0KICAgIHZUcmFjZVNldFByaW9yaXR5UHJvcGVydHkoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIHByaW9yaXR5KTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSQmVnaW4NCiAqIA0KICogUmVnaXN0ZXJzIHRoZSBiZWdpbm5pbmcgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4gVGhpcyBtdXN0IG5vdCBiZQ0KICogaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBJU1IgY29udGFpbmluZyByZWNvcmRlciBsaWJyYXJ5IGNhbGxzLCBzbyBpZiBhbGxvd2luZw0KICogbmVzdGVkIElTUnMgdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuDQogKg0KICogRXhhbXBsZToNCiAqICAgICAjZGVmaW5lIElEX0lTUl9USU1FUjEgMSAgICAgICAvLyBsb3dlc3QgdmFsaWQgSUQgaXMgMQ0KICogICAgICNkZWZpbmUgUFJJT19PRl9JU1JfVElNRVIxIDMgIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKiAgICAgLi4uDQogKiAgICAgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqICAgICAuLi4NCiAqICAgICB2b2lkIElTUl9oYW5kbGVyKCkNCiAqICAgICB7DQogKiAgICAgICAgIHBvcnRFTlRFUl9DUklUSUNBTCgpOyAvLyBSZXF1aXJlZCBpZiBuZXN0ZWQgSVNScyBhcmUgYWxsb3dlZA0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkJlZ2luKElEX09GX0lTUl9USU1FUjEpOw0KICogICAgICAgICBwb3J0RVhJVF9DUklUSUNBTCgpOw0KICogICAgICAgICAuLi4NCiAqICAgICAgICAgcG9ydEVOVEVSX0NSSVRJQ0FMKCk7IC8vIFJlcXVpcmVkIGlmIG5lc3RlZCBJU1JzIGFyZSBhbGxvd2VkDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgICAgIHBvcnRFWElUX0NSSVRJQ0FMKCk7DQogKiAgICAgfQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JCZWdpbihvYmplY3RIYW5kbGVUeXBlIGhhbmRsZSkNCnsNCiAgICB1aW50MTZfdCBkdHM0Ow0KICAgIFRTRXZlbnQqIHRzID0gTlVMTDsNCg0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsgICAgDQogICAgICAgIGR0czQgPSAodWludDE2X3QpcHJ2VHJhY2VHZXREVFMoMHhGRkZGKTsNCg0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8gICAgDQogICAgICAgIHsgICAgDQogICAgICAgICAgICBpZiAobklTUmFjdGl2ZSA8IE1BWF9JU1JfTkVTVElORykNCiAgICAgICAgICAgIHsgICAgDQogICAgICAgICAgICAgICAgaXNyc3RhY2tbbklTUmFjdGl2ZV0gPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgbklTUmFjdGl2ZSsrOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRzID0gKFRTRXZlbnQqKXhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQogICAgICAgICAgICAgICAgaWYgKHRzICE9IE5VTEwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0cy0+dHlwZSA9IFRTX0lTUl9CRUdJTjsNCiAgICAgICAgICAgICAgICAgICAgdHMtPmR0cyA9IGR0czQ7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgICAgIHBydlRyYWNlVXBkYXRlQ291bnRlcnMoKTsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgeyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBvY2N1ciB1bmxlc3Mgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcgKi8gICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2VHJhY2VFcnJvcigiVG9vIG1hbnkgbmVzdGVkIGludGVycnVwdHMhIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkVuZA0KICogDQogKiBSZWdpc3RlcnMgdGhlIGVuZCBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLiBUaGlzIG11c3Qgbm90IGJlDQogKiBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIElTUiBjb250YWluaW5nIHJlY29yZGVyIGxpYnJhcnkgY2FsbHMsIHNvIGlmIGFsbG93aW5nDQogKiBuZXN0ZWQgSVNScyB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgcG9ydEVOVEVSX0NSSVRJQ0FMKCk7IC8vIFJlcXVpcmVkIGlmIG5lc3RlZCBJU1JzIGFyZSBhbGxvd2VkDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgICAgIHBvcnRFWElUX0NSSVRJQ0FMKCk7DQogKiAgICAgICAgIC4uLg0KICogICAgICAgICBwb3J0RU5URVJfQ1JJVElDQUwoKTsgLy8gUmVxdWlyZWQgaWYgbmVzdGVkIElTUnMgYXJlIGFsbG93ZWQNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgICAgICAgcG9ydEVYSVRfQ1JJVElDQUwoKTsNCiAqICAgICB9DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdG9yZUlTUkVuZCh2b2lkKQ0Kew0KICAgIFRTRXZlbnQqIHRzOw0KICAgIHVpbnQxNl90IGR0czU7DQoNCiAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCiAgICB7ICAgICAgICANCiAgICAgICAgZHRzNSA9ICh1aW50MTZfdClwcnZUcmFjZUdldERUUygweEZGRkYpOw0KDQogICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlKSAvKiBOZWVkIHRvIHJlcGVhdCB0aGlzIGNoZWNrISAqLyAgICANCiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHRzID0gKFRTRXZlbnQqKXhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQogICAgICAgICAgICBpZiAodHMgIT0gTlVMTCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAobklTUmFjdGl2ZSA+IDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gdG8gYW5vdGhlciBpc3IgKi8NCiAgICAgICAgICAgICAgICAgICAgdHMtPnR5cGUgPSBUU19JU1JfUkVTVU1FOw0KICAgICAgICAgICAgICAgICAgICB0cy0+b2JqSGFuZGxlID0gaXNyc3RhY2tbbklTUmFjdGl2ZV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0byB0YXNrICovDQogICAgICAgICAgICAgICAgICAgIHRzLT50eXBlID0gVFNfVEFTS19SRVNVTUU7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdHMtPmR0cyA9IGR0czU7DQogICAgICAgICAgICAgICAgbklTUmFjdGl2ZS0tOw0KICAgICAgICAgICAgICAgIHBydlRyYWNlVXBkYXRlQ291bnRlcnMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KI2VuZGlmDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFVzZXIgRXZlbnQgZnVuY3Rpb25zDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgKElOQ0xVREVfVVNFUl9FVkVOVFMgPT0gMSkNCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVVzZXJFdmVudA0KICoNCiAqIEJhc2ljIHVzZXIgZXZlbnQgKFN0YW5kYXJkIGFuZCBQcm9mZXNzaW9uYWwgRWRpdGlvbiBvbmx5KQ0KICogDQogKiBHZW5lcmF0ZXMgYSBVc2VyIEV2ZW50IHdpdGggYSB0ZXh0IGxhYmVsLiBUaGUgbGFiZWwgaXMgY3JlYXRlZC9sb29rZWQgdXANCiAqIGluIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcgeFRyYWNlT3BlbkxhYmVsLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVXNlckV2ZW50KHRyYWNlTGFiZWwgZXZlbnRMYWJlbCkNCnsNCiAgICBVc2VyRXZlbnQqIHVlOw0KICAgIHVpbnQ4X3QgZHRzMTsNCg0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmICghIGluRXhjbHVkZWRUYXNrIHx8IG5JU1JhY3RpdmUgKSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykgICAgDQogICAgeyAgICANCiAgICAgICAgdGFza0VOVEVSX0NSSVRJQ0FMKCk7DQoNCiAgICAgICAgZHRzMSA9ICh1aW50OF90KXBydlRyYWNlR2V0RFRTKDB4RkYpOw0KDQogICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlKSAvKiBOZWVkIHRvIHJlcGVhdCB0aGlzIGNoZWNrISAqLyAgICANCiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgdWUgPSAoVXNlckV2ZW50KikgeFRyYWNlTmV4dEZyZWVFdmVudEJ1ZmZlclNsb3QoKTsNCiAgICAgICAgICAgIGlmICh1ZSAhPSBOVUxMKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHVlLT5kdHMgPSBkdHMxOw0KICAgICAgICAgICAgICAgIHVlLT50eXBlID0gVVNFUl9FVkVOVDsNCiAgICAgICAgICAgICAgICB1ZS0+cGF5bG9hZCA9IGV2ZW50TGFiZWw7DQogICAgICAgICAgICAgICAgcHJ2VHJhY2VVcGRhdGVDb3VudGVycygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRhc2tFWElUX0NSSVRJQ0FMKCk7DQogICAgfQ0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0KDQovKiBvbmUgd29yZCAoMzIgYml0KSBpcyByZXF1aXJlZCBmb3IgdGhlIFVTRVJfRVZFTlQgZW50cnksIDggd29yZHMgDQooOCozMiBiaXQgPSAzMiBieXRlKSBhdmFpbGFibGUgZm9yIGFyZ3VtZW50IGRhdGEgKi8NCiNkZWZpbmUgTUFYX0FSR19TSVpFICg0KzMyKSAgICANCg0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQ4KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQxNih2b2lkICogYnVmZmVyLCB1aW50OF90IGluZGV4LCB1aW50MTZfdCB2YWx1ZSk7DQpzdGF0aWMgdWludDhfdCB3cml0ZUludDMyKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsNCg0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQpzdGF0aWMgdWludDhfdCB3cml0ZUZsb2F0KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaW5kZXgsIGZsb2F0IHZhbHVlKTsNCnN0YXRpYyB1aW50OF90IHdyaXRlRG91YmxlKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaW5kZXgsIGRvdWJsZSB2YWx1ZSk7DQojZW5kaWYNCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlSW50OCh2b2lkICogYnVmZmVyLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQ0KeyAgICANCiAgICANCiAgICBpZiAoaW5kZXggKyAxID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaW5kZXhdID0gdmFsdWU7DQoNCiAgICByZXR1cm4gaW5kZXggKyAxOw0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQxNih2b2lkICogYnVmZmVyLCB1aW50OF90IGluZGV4LCB1aW50MTZfdCB2YWx1ZSkNCnsNCiAgICAvKiBBbGlnbiB0byBtdWx0aXBsZSBvZiAyICovDQogICAgd2hpbGUgKChpbmRleCAlIDIpICE9IDApDQogICAgeyAgICAgICAgDQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpbmRleF0gPSAwOw0KICAgICAgICBpbmRleCsrOyAgICAgICAgDQogICAgfQ0KICAgIA0KICAgIGlmIChpbmRleCArIDIgPiBNQVhfQVJHX1NJWkUpDQogICAgew0KICAgICAgICByZXR1cm4gMjU1Ow0KICAgIH0NCg0KICAgICgodWludDE2X3QqKWJ1ZmZlcilbaW5kZXgvMl0gPSB2YWx1ZTsNCg0KICAgIHJldHVybiBpbmRleCArIDI7DQp9DQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZUludDMyKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaW5kZXgsIHVpbnQzMl90IHZhbHVlKQ0Kew0KICAgIA0KICAgIC8qIEEgMzIgYml0IHZhbHVlIHNob3VsZCBiZWdpbiBhdCBhbiBldmVuIDQtYnl0ZSBhZGRyZXNzICovDQogICAgd2hpbGUgKChpbmRleCAlIDQpICE9IDApDQogICAgew0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaW5kZXhdID0gMDsNCiAgICAgICAgaW5kZXgrKzsNCiAgICB9DQogICAgDQogICAgaWYgKGluZGV4ICsgNCA+IE1BWF9BUkdfU0laRSkNCiAgICB7DQogICAgICAgIHJldHVybiAyNTU7DQogICAgfSAgICAgICAgDQoNCiAgICAoKHVpbnQzMl90KilidWZmZXIpW2luZGV4LzRdID0gdmFsdWU7DQoNCiAgICByZXR1cm4gaW5kZXggKyA0Ow0KfQ0KDQojaWYgKElOQ0xVREVfRkxPQVRfU1VQUE9SVCkNCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlRmxvYXQodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpbmRleCwgZmxvYXQgdmFsdWUpDQp7DQogICAgLyogQSAzMiBiaXQgdmFsdWUgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4gNC1ieXRlIGFkZHJlc3MgKi8NCiAgICB3aGlsZSAoKGluZGV4ICUgNCkgIT0gMCkNCiAgICB7DQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpbmRleF0gPSAwOw0KICAgICAgICBpbmRleCsrOw0KICAgIH0NCg0KICAgIGlmIChpbmRleCArIDQgPiBNQVhfQVJHX1NJWkUpDQogICAgew0KICAgICAgICByZXR1cm4gMjU1Ow0KICAgIH0gICAgICAgIA0KDQogICAgKChmbG9hdCopYnVmZmVyKVtpbmRleC80XSA9IHZhbHVlOw0KICAgIA0KICAgIHJldHVybiBpbmRleCArIDQ7DQp9DQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZURvdWJsZSh2b2lkICogYnVmZmVyLCB1aW50OF90IGluZGV4LCBkb3VibGUgdmFsdWUpDQp7DQogICAgLyogVGhlIGRvdWJsZSBpcyB3cml0dGVuIGFzIHR3byAzMiBiaXQgdmFsdWVzLCBhbmQgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4gDQogICAgNC1ieXRlIGFkZHJlc3MgKHRvIGF2b2lkIGhhdmluZyB0byBhbGlnbiB3aXRoIDggYnl0ZSkgKi8NCiAgICB3aGlsZSAoaW5kZXggJSA0ICE9IDApDQogICAgew0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaW5kZXhdID0gMDsNCiAgICAgICAgaW5kZXgrKzsgICAgICAgIA0KICAgIH0NCiAgICANCiAgICBpZiAoaW5kZXggKyA4ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9ICAgICAgIA0KICAgIA0KICAgICgodWludDMyX3QqKWJ1ZmZlcilbaW5kZXgvNCswXSA9ICgodWludDMyX3QqKSZ2YWx1ZSlbMF07DQogICAgKCh1aW50MzJfdCopYnVmZmVyKVtpbmRleC80KzFdID0gKCh1aW50MzJfdCopJnZhbHVlKVsxXTsNCg0KICAgIHJldHVybiBpbmRleCArIDg7DQp9DQoNCiNlbmRpZg0KDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlUHJpbnRGIA0KICogDQogKiBBZHZhbmNlZCB1c2VyIGV2ZW50cyAoUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqDQogKiBHZW5lcmF0ZXMgVXNlciBFdmVudCB3aXRoIGZvcm1hdHRlZCB0ZXh0IGFuZCBkYXRhLCBzaW1pbGFyIHRvIGEgInByaW50ZiIuDQogKiBJdCBpcyB2ZXJ5IGZhc3QgY29tcGFyZWQgdG8gYSBub3JtYWwgInByaW50ZiIgc2luY2UgdGhpcyBmdW5jdGlvbiBvbmx5IA0KICogc3RvcmVzIHRoZSBhcmd1bWVudHMuIFRoZSBhY3R1YWwgZm9ybWF0dGluZyBpcyBkb25lDQogKiBvbiB0aGUgaG9zdCBQQyB3aGVuIHRoZSB0cmFjZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIHZpZXdlciB0b29sLiANCiAqDQogKiBVc2VyIEV2ZW50IGxhYmVscyBhcmUgY3JlYXRlZCB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKiBFeGFtcGxlOg0KICoNCiAqICAgICB0cmFjZUxhYmVsIGFkY191ZWNoYW5uZWwgPSB4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsIA0KICogICAgICAgICAgICAgICAgICJBREMgY2hhbm5lbCAlZDogJWxmIHZvbHRzIiwgDQogKiAgICAgICAgICAgICAgICAgY2gsIChkb3VibGUpYWRjX3JlYWRpbmcvKGRvdWJsZSlzY2FsZSk7DQogKg0KICogVGhpcyBjYW4gYmUgY29tYmluZWQgaW50byBvbmUgbGluZSwgaWYgZGVzaXJlZCwgYnV0IHRoaXMgaXMgc2xvd2VyOg0KICoNCiAqICAgICB2VHJhY2VQcmludCh4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpLCANCiAqICAgICAgICAgICAgICAgICAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsIA0KICogICAgICAgICAgICAgICAgIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIENhbGxpbmcgeFRyYWNlT3BlbkxhYmVsIG11bHRpcGxlIHRpbWVzIHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgZW50cmllcywgYnV0DQogKiBpdCBpcyBvZiBjb3Vyc2UgZmFzdGVyIHRvIGp1c3QgZG8gaXQgb25jZSwgYW5kIHRoZW4ga2VlcCB0aGUgaGFuZGxlIGZvciBsYXRlciANCiAqIHVzZS4gSWYgeW91IGRvbrR0IGhhdmUgYW55IGRhdGEgYXJndW1lbnRzLCBvbmx5IGEgdGV4dCBsYWJlbC9zdHJpbmcsIGl0IGlzIA0KICogYmV0dGVyIHRvIHVzZSB2VHJhY2VVc2VyRXZlbnQgLSBpdCBpcyBmYXN0ZXIuDQogKg0KICogRm9ybWF0IHNwZWNpZmllcnMgc3VwcG9ydGVkOg0KICogICVkIC0gMzIgYml0IHNpZ25lZCBpbnRlZ2VyDQogKiAgJXUgLSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICVmIC0gMzIgYml0IGZsb2F0DQogKiAgJXMgLSBzdHJpbmcgKGlzIGNvcGllZCB0byB0aGUgcmVjb3JkZXIgc3ltYm9sIHRhYmxlKQ0KICogICVoZCAtIDE2IGJpdCBzaWduZWQgaW50ZWdlcg0KICogICVodSAtIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWJkIC0gOCBiaXQgc2lnbmVkIGludGVnZXINCiAqICAlYnUgLSA4IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWxmIC0gZG91YmxlLXByZWNpc2lvbiBmbG9hdA0KICogDQogKiBVcCB0byAxNSBkYXRhIGFyZ3VtZW50cyBhcmUgYWxsb3dlZCwgd2l0aCBhIHRvdGFsIHNpemUgb2YgbWF4aW11bSAzMiBieXRlLg0KICogSW4gY2FzZSB0aGlzIGlzIGV4Y2VlZGVkLCB0aGUgdXNlciBldmVudCBpcyBjaGFuZ2VkIGludG8gYW4gZXJyb3IgbWVzc2FnZS4NCiAqIA0KICogVGhlIGRhdGEgaXMgc3RvcmVkIGluIHRyYWNlIGJ1ZmZlciwgYW5kIGlzIHBhY2tlZCB0byBhbGxvdyBzdG9yaW5nIG11bHRpcGxlIA0KICogc21hbGxlciBkYXRhIGVudHJpZXMgaW4gdGhlIHNhbWUgNC1ieXRlIHJlY29yZCwgZS5nLiwgZm91ciA4LWJpdCB2YWx1ZXMuDQogKiBBIHN0cmluZyByZXF1aXJlcyB0d28gYnl0ZXMsIGFzIHRoZSBzeW1ib2wgdGFibGUgaXMgbGltaXRlZCB0byA2NEsuIFN0b3JpbmcgYSANCiAqIGRvdWJsZSAoJWxmKSB1c2VzIHR3byByZWNvcmRzLCBzbyB0aGlzIGlzIHF1aXRlIGNvc3RseS4gVXNlIGZsb2F0ICglZikgdW5sZXNzDQogKiB0aGUgaGlnaGVyIHByZWNpc2lvbiBpcyByZWFsbHkgbmVjZXNzYXJ5Lg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlUHJpbnRGKHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgY29uc3QgY2hhciogZm9ybWF0U3RyLCAuLi4pDQp7DQogICAgVXNlckV2ZW50KiB1ZTE7DQogICAgdmFfbGlzdCB2bDsNCiAgICB1aW50OF90IGFyZ0NvdW50ZXIgPSAwOw0KICAgIHVpbnQ4X3QgaW5kZXggPSAwOw0KICAgIHVpbnQ4X3Qgbm9mRXZlbnRFbnRyaWVzID0gMDsNCiAgICB1aW50MTZfdCBmb3JtYXRTdHJJbmRleCA9IDA7ICAgIA0KDQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiBUaGUgYXJyYXkgdGVtcERhdGFCdWZmZXIgaXMgYSBsb2NhbCBidWZmZXIgdXNlZCBpbiBhIHR3by1waGFzZSBjb21taXQgb2YgDQogICAgKiB0aGUgZXZlbnQgZGF0YSwgc2luY2UgYSB2VHJhY2VQcmludEYgbWF5IHNwYW4gb3ZlciBtdWx0aXBsZSBzbG90cyBpbiB0aGUgDQogICAgKiBidWZmZXIuDQogICAgKiBUaGlzIGJ1ZmZlciBjYW4gYmUgbWFkZSBsYXJnZXIsIG9mIGNvdXJzZSwgYnV0IHJlbWVtYmVyIHRoZSByaXNrIGZvciANCiAgICAqIHN0YWNrIG92ZXJmbG93LiBOb3RlOiBUaGlzIHNob3VsZCBiZSBhIExPQ0FMIGJ1ZmZlciwgbXVzdCBub3QgYmUgbWFkZSANCiAgICAqIGdsb2JhbC4gVGhhdCB3b3VsZCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gd2hlbiB0d28gY2FsbHMgdG8gdlRyYWNlUHJpbnRGDQogICAgKiBmcm9tIGRpZmZlcmVudCB0YXNrcyBvdmVybGFwcyAoaW50ZXJydXB0cyBhcmUgb25seSBkaXNhYmxlZCBpbiBhIHNtYWxsIA0KICAgICogcGFydCBvZiB0aGlzIGZ1bmN0aW9uLCBvdGhlcndpc2UgZW5hYmxlZCkNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogICAgdWludDMyX3QgZHVtbXkgPSAwOyAgICAgICAgICAgICAgICAgLyogZm9yIHRoZSBhbGlnbm1lbnQgb2YgdGVtcERhdGFCdWZmZXIqLw0KICAgIHVpbnQ4X3QgdGVtcERhdGFCdWZmZXJbTUFYX0FSR19TSVpFXTsgICANCiAgICBkdW1teSA9IGR1bW15OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncyovDQoNCiAgICBpZiAoKGluRXhjbHVkZWRUYXNrID09IDApICYmDQogICAgICAgIChuSVNSYWN0aXZlID09IDApICYmDQogICAgICAgIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlID09IDEpICYmDQogICAgICAgIChoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzayA+IDApKQ0KICAgIHsgICAgICAgIA0KICAgICAgICAvKiBGaXJzdCwgd3JpdGUgdGhlICJwcmltYXJ5IiB1c2VyIGV2ZW50IGVudHJ5IGluIHRoZSBsb2NhbCBidWZmZXIsIGJ1dCANCiAgICAgICAgbGV0IHRoZSBldmVudCB0eXBlIGJlICJFVkVOVF9CRUlOR19XUklUVEVOIiBmb3Igbm93Li4uKi8NCg0KICAgICAgICB1ZTEgPSAoVXNlckV2ZW50KikoJnRlbXBEYXRhQnVmZmVyWzBdKTsgICAgICAgICANCiAgICAgICAgdWUxLT50eXBlID0gRVZFTlRfQkVJTkdfV1JJVFRFTjsgICAgICAvKiBVcGRhdGUgdGhpcyBhcyB0aGUgbGFzdCBzdGVwICovDQogICAgICAgIA0KICAgICAgICBpbmRleCA9IDQ7DQogICAgICAgIGZvcm1hdFN0ckluZGV4ID0gMDsNCiAgICAgICAgdmFfc3RhcnQodmwsIGZvcm1hdFN0cik7ICAgICAgICAgIC8qIEJlZ2luIHJlYWRpbmcgdGhlIGFyZ3VtZW50cyBsaXN0ICovDQoNCiAgICAgICAgd2hpbGUgKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gIT0gJ1wwJykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPT0gJyUnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFyZ0NvdW50ZXIrKzsNCg0KICAgICAgICAgICAgICAgIGlmIChhcmdDb3VudGVyID4gMTUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2VHJhY2VFcnJvcigidlRyYWNlUHJpbnRGIC0gVG9vIG1hbnkgYXJndW1lbnRzLCBtYXggMTUgYWxsb3dlZCEiKTsNCiAgICAgICAgICAgICAgICAgICAgdmFfZW5kKHZsKTsgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSAiW3ZUcmFjZVByaW50RiBlcnJvcl0gVG9vIG1hbnkgYXJndW1lbnRzLCBtYXggMTUgYWxsb3dlZCEiOw0KICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDQ7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRoZXNlIGJlbG93IGNvZGUgd3JpdGVzIHJhdyBkYXRhIChwcmltaXRpdmUgZGF0YXR5cGVzKSBpbiB0aGUgZXZlbnQgYnVmZmVyLCANCiAqIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBldmVudCBzdHJ1Y3RzICh3aGVyZSBieXRlIDAgaXMgZXZlbnQgdHlwZSkuDQogKiBUaGVzZSBkYXRhIGVudHJpZXMgbXVzdCBuZXZlciBiZSBpbnRlcnByZXRlZCBhcyByZWFsIGV2ZW50IGRhdGEsIGFzIHRoZSB0eXBlDQogKiBmaWVsZCB3b3VsZCBiZSBtaXNsZWFkaW5nIHNpbmNlIHVzZWQgZm9yIHBheWxvYWQgZGF0YS4gDQogKiANCiAqIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIGVuY29kaW5nIGRlcGVuZHMgb24gdHdvIG1lY2hhbmlzbXM6DQogKiANCiAqIDEuIEFuIGluaXRpYWwgVVNFUl9FVkVOVCwgd2hpY2ggdHlwZSBjb2RlIHRlbGxzIHRoZSBudW1iZXIgb2YgMzItYml0IGRhdGEgDQogKiBlbnRpcmVzIHRoYXQgZm9sbG93cy4gKGNvZGUgLSBVU0VSX0VWRU5UID0gbnVtYmVyIG9mIGRhdGEgZW50cmllcykuIA0KICogTm90ZSB0aGF0IGEgZGF0YSBlbnRyeSBjb3JyZXNwb25kcyB0byB0aGUgc2xvdHMgdGhhdCBub3JtYWxseSBjb3JyZXNwb25kcyB0byANCiAqIG9uZSAoMSkgZXZlbnQsIGkuZS4sIDMyIGJpdHMuIHZUcmFjZVByaW50RiBtYXkgZW5jb2RlIHNldmVyYWwgcGllY2VzIG9mIGRhdGEgDQogKiBpbiBvbmUgZGF0YSBlbnRyeSwgZS5nLiwgdHdvIDE2LWJpdCB2YWx1ZXMgb3IgZm91ciA4LWJpdCB2YWx1ZXMsIG9uZSAxNi1iaXQNCiAqIHZhbHVlIGZvbGxvd2VzIGJ5IHR3byA4LWJpdCB2YWx1ZXMsIGV0Yy4NCiAqDQogKiAyLiBBIHR3by1waGFzZSBjb21taXQgcHJvY2VkdXJlLCB3aGVyZSB0aGUgVVNFUl9FVkVOVCBhbmQgZGF0YSBlbnRyaWVzIGFyZSANCiAqIHdyaXR0ZW4gdG8gYSBsb2NhbCBidWZmZXIgYXQgZmlyc3QsIGFuZCB3aGVuIGFsbCBjaGVja3MgYXJlIE9LIHRoZW4gY29waWVkIHRvDQogKiB0aGUgbWFpbiBldmVudCBidWZmZXIgdXNpbmcgYSBmYXN0IG1lbWNweS4gVGhlIGV2ZW50IGNvZGUgaXMgZmluYWxpemVkIGFzIHRoZQ0KICogdmVyeSBsYXN0IHN0ZXAuIEJlZm9yZSB0aGF0IHRoYXQgc3RlcCwgdGhlIGV2ZW50IGNvZGUgaW5kaWNhdGVzIGFuIHVuZmluaXNoZWQNCiAqIGV2ZW50LCB3aGljaCBjYXVzZXMgaXQgdG8gYmUgaWdub3JlZCBhbmQgc3RvcCB0aGUgbG9hZGluZyBvZiB0aGUgZmlsZSAoc2luY2UgDQogKiBhbiB1bmZpbmlzaGVkIGV2ZW50IGlzIHRoZSBsYXN0IGV2ZW50IGluIHRoZSB0cmFjZSkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAgICAgICAgICAgICAgIGZvcm1hdFN0ckluZGV4Kys7DQogICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdkJzogICAgaW5kZXggPSB3cml0ZUludDMyKHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICd1JzogICAgaW5kZXggPSB3cml0ZUludDMyKHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdzJzogICAgaW5kZXggPSB3cml0ZUludDE2KHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCl4VHJhY2VPcGVuTGFiZWwoKGNoYXIqKXZhX2FyZyh2bCwgdWludDMyX3QpKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFllcywgImRvdWJsZSIgYXMgdHlwZSBhbHNvIGluIHRoZSBmbG9hdCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZS4gVGhpcyBzaW5jZSAiZmxvYXQiIGlzIHByb21vdGVkIGludG8gImRvdWJsZSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSB2YV9hcmcgc3R1ZmYuICovDQogICAgICAgICAgICAgICAgY2FzZSAnZic6ICAgIGluZGV4ID0gd3JpdGVGbG9hdCh0ZW1wRGF0YUJ1ZmZlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdmFfYXJnKHZsLCBkb3VibGUpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICANCiNlbHNlDQovKiBObyBzdXBwb3J0IGZvciBmbG9hdHMsIGJ1dCBhdHRlbXB0IHRvIHN0b3JlIGEgZmxvYXQgdXNlciBldmVudA0KYXZvaWQgYSBwb3NzaWJsZSBjcmFzaCBkdWUgdG8gZmxvYXQgcmVmZXJlbmNlLiBJbnN0ZWFkIHN0b3JlIHRoZSANCmRhdGEgb24gdWludF8zMiBmb3JtYXQgKHdpbGwgbm90IGJlIGRpc3BsYXllZCBhbnl3YXkpLiBUaGlzIGlzIGp1c3QNCnRvIGtlZXAgdmFfYXJnIGFuZCBpbmRleCBjb25zaXN0ZW50LiAqLw0KDQogICAgICAgICAgICAgICAgY2FzZSAnZic6ICAgIGluZGV4ID0gd3JpdGVJbnQzMih0ZW1wRGF0YUJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOyANCiNlbmRpZg0KICAgICAgICAgICAgICAgIGNhc2UgJ2wnOg0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQogICAgICAgICAgICAgICAgICAgIHsNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzogICAgIGluZGV4ID0gd3JpdGVEb3VibGUodGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSl2YV9hcmcodmwsIGRvdWJsZSkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiNlbHNlDQovKiBObyBzdXBwb3J0IGZvciBmbG9hdHMsIGJ1dCBhdHRlbXB0IHRvIHN0b3JlIGEgZmxvYXQgdXNlciBldmVudA0KYXZvaWQgYSBwb3NzaWJsZSBjcmFzaCBkdWUgdG8gZmxvYXQgcmVmZXJlbmNlLiBJbnN0ZWFkIHN0b3JlIHRoZSANCmRhdGEgb24gdWludF8zMiBmb3JtYXQgKHdpbGwgbm90IGJlIGRpc3BsYXllZCBhbnl3YXkpLiBUaGlzIGlzIGp1c3QNCnRvIGtlZXAgdmFfYXJnIGFuZCBpbmRleCBjb25zaXN0ZW50LiAqLw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzogICAgaW5kZXggPSB3cml0ZUludDMyKHRlbXBEYXRhQnVmZmVyLCAvKiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIG5vdCBiZSBzaG93biBhbnl3YXkgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB3cml0ZUludDMyKHRlbXBEYXRhQnVmZmVyLCAvKiBEbyBpdCB0d2ljZSwgdG8gd3JpdGUgaW4gdG90YWwgOCBieXRlcyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpdmFfYXJnKHZsLCBkb3VibGUpKTsgDQojZW5kaWYNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2gnOg0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6ICAgIGluZGV4ID0gd3JpdGVJbnQxNih0ZW1wRGF0YUJ1ZmZlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOiAgICBpbmRleCA9IHdyaXRlSW50MTYodGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6ICAgIGluZGV4ID0gd3JpdGVJbnQ4KHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6ICAgIGluZGV4ID0gd3JpdGVJbnQ4KHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOyAgICANCiAgICAgICAgICAgIGlmIChpbmRleCA9PSAyNTUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFfZW5kKHZsKTsNCiAgICAgICAgICAgICAgICB2VHJhY2VFcnJvcigidlRyYWNlUHJpbnRGIC0gVG9vIGxhcmdlIGFyZ3VtZW50cywgbWF4IDMyIGJ5dGUgYWxsb3dlZCEiKTsNCiAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSAiW3ZUcmFjZVByaW50RiBlcnJvcl0gVG9vIGxhcmdlIGFyZ3VtZW50cywgbWF4IDMyIGJ5dGUgYWxsb3dlZCEiOw0KICAgICAgICAgICAgICAgIGluZGV4ID0gNDsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhX2VuZCh2bCk7DQoNCiAgICAgICAgLyogU3RvcmUgdGhlIGZvcm1hdCBzdHJpbmcsIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIGNoYW5uZWwgc3ltYm9sICovDQogICAgICAgIHVlMS0+cGF5bG9hZCA9IHBydlRyYWNlT3BlblN5bWJvbChmb3JtYXRTdHIsIGV2ZW50TGFiZWwpOyAgICAgDQoNCiAgICAgICAgdGFza0VOVEVSX0NSSVRJQ0FMKCk7ICAgIA0KDQogICAgICAgIHVlMS0+ZHRzID0gKHVpbnQ4X3QpcHJ2VHJhY2VHZXREVFMoMHhGRik7DQogICAgICAgIGlmICghIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qIEFib3J0LCBzaW5jZSBhbiBYVFMgZXZlbnQgKGNyZWF0ZWQgYnkgcHJ2VHJhY2VHZXREVFMpIGZpbGxlZCB0aGUgDQogICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgcmVjb3JkZXIgc3RvcHBlZCBzaW5jZSBub3QgY2lyY3VsYXIgYnVmZmVyLiAqLw0KICAgICAgICAgICAgdGFza0VYSVRfQ1JJVElDQUwoKTsgICAgDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICBub2ZFdmVudEVudHJpZXMgPSAoaW5kZXgrMykvNDsNCg0KICAgICAgICAvKiBJZiB0aGUgZGF0YSBkb2VzIG5vdCBmaXQgaW4gdGhlIHJlbWFpbmluZyBtYWluIGJ1ZmZlciwgd3JhcCBhcm91bmQgdG8gDQogICAgICAgIDAgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIHN0b3AgdGhlIHJlY29yZGVyIGFuZCBxdWl0KS4gKi8NCiAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCArIG5vZkV2ZW50RW50cmllcyA+IFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzKQ0KICAgICAgICB7DQojaWYgKFJFQ09SREVSX1NUT1JFX01PREUgPT0gU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCiAgICAgICAgICAgICh2b2lkKW1lbXNldCgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLCANCiAgICAgICAgICAgICAgICAgICAwLCANCiAgICAgICAgICAgICAgICAgICAoUmVjb3JkZXJEYXRhUHRyLT5tYXhFdmVudHMgLSBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXgpKjQpOw0KICAgICAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCiAgICAgICAgICAgIFJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCiNlbHNlDQogICAgICAgICAgICAvKiBBYm9ydCBhbmQgc3RvcCByZWNvcmRlciwgc2luY2UgdGhlIGV2ZW50IGRhdGEgd2lsbCBub3QgZml0IGluIHRoZQ0KICAgICAgICAgICAgYnVmZmVyIGFuZCBub3QgY2lyY3VsYXIgYnVmZmVyIGluIHRoaXMgY2FzZS4uLiAqLw0KICAgICAgICAgICAgdGFza0VYSVRfQ1JJVElDQUwoKTsNCiAgICAgICAgICAgIHZUcmFjZVN0b3AoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiNlbmRpZg0KICAgICAgICB9DQogICAgDQojaWYgKFJFQ09SREVSX1NUT1JFX01PREUgPT0gU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCiAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgYnVmZmVyIHRvIGJlIG92ZXJ3cml0dGVuIGRvZXMgbm90IGNvbnRhaW4gYW55IHVzZXIgDQogICAgICAgIGV2ZW50cyB0aGF0IHdvdWxkIGJlIHBhcnRpYWxseSBvdmVyd3JpdHRlbi4gSWYgc28sIHRoZXkgbXVzdCBiZSAia2lsbGVkIg0KICAgICAgICBieSByZXBsYWNpbmcgdGhlIHVzZXIgZXZlbnQgYW5kIGZvbGxvd2luZyBkYXRhIHdpdGggTlVMTCBldmVudHMgKGkuZS4sIA0KICAgICAgICB1c2luZyBhIG1lbXNldCB0byB6ZXJvKS4qLw0KICAgICAgICBwcnZDaGVja0RhdGFUb0JlT3ZlcndyaXR0ZW5Gb3JNdWx0aUVudHJ5VXNlckV2ZW50cyhub2ZFdmVudEVudHJpZXMpOw0KI2VuZGlmDQogICAgICAgIC8qIENvcHkgdGhlIGxvY2FsIGJ1ZmZlciB0byB0aGUgbWFpbiBidWZmZXIgKi8NCiAgICAgICAgKHZvaWQpbWVtY3B5KCYgUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGFbUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICogNF0sIA0KICAgICAgICAgICAgICAgdGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgaW5kZXgpOw0KDQogICAgICAgIC8qIFVwZGF0ZSB0aGUgZXZlbnQgdHlwZSwgaS5lLiwgbnVtYmVyIG9mIGRhdGEgZW50cmllcyBmb2xsb3dpbmcgdGhlIA0KICAgICAgICBtYWluIFVTRVJfRVZFTlQgZW50cnkgKE5vdGU6IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgdGhlIG1lbWNweSwgDQogICAgICAgIGJ1dCB3aXRoaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24hKSovDQogICAgICAgIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdID0gDQogICAgICAgICAgKHVpbnQ4X3QpIFVTRVJfRVZFTlQgKyBub2ZFdmVudEVudHJpZXMgLSAxOyAgICANCiAgICAgICAgDQogICAgICAgIC8qIFVwZGF0ZSB0aGUgbWFpbiBidWZmZXIgZXZlbnQgaW5kZXggKGFscmVhZHkgY2hlY2tlZCB0aGF0IGl0IGZpdHMgaW4gDQogICAgICAgIHRoZSBidWZmZXIsIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHdyYXBwaW5nKSovDQogICAgICAgIA0KICAgICAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggKz0gbm9mRXZlbnRFbnRyaWVzOw0KICAgICAgICBSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cyArPSBub2ZFdmVudEVudHJpZXM7DQogICAgICAgIA0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID49IEVWRU5UX0JVRkZFUl9TSVpFKQ0KICAgICAgICB7DQogICAgICAgIA0KI2lmIChSRUNPUkRFUl9TVE9SRV9NT0RFID09IFNUT1JFX01PREVfUklOR19CVUZGRVIpDQogICAgICAgICAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KICAgICAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5idWZmZXJJc0Z1bGwgPSAxOw0KI2Vsc2UNCiAgICAgICAgICAgIHZUcmFjZVN0b3AoKTsNCiNlbmRpZg0KICAgICAgICB9DQoNCiAgICAgICAgdGFza0VYSVRfQ1JJVElDQUwoKTsNCiAgICB9DQp9DQogICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogeFRyYWNlT3BlbkxhYmVsDQogKiANCiAqIENyZWF0ZXMgdXNlciBldmVudCBsYWJlbHMgZm9yIHVzZXIgZXZlbnQgY2hhbm5lbHMgb3IgZm9yIGluZGl2aWR1YWwgZXZlbnRzLg0KICogVXNlciBldmVudHMgY2FuIGJlIHVzZWQgdG8gbG9nIGFwcGxpY2F0aW9uIGV2ZW50cyBhbmQgZGF0YSBmb3IgZGlzcGxheSBpbg0KICogdGhlIHZpc3VhbGl6YXRpb24gdG9vbC4gQSB1c2VyIGV2ZW50IGlzIGlkZW50aWZpZWQgYnkgYSBsYWJlbCwgaS5lLiwgYSBzdHJpbmcsDQogKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHJlY29yZGVyJ3Mgc3ltYm9sIHRhYmxlLg0KICogV2hlbiBsb2dnaW5nIGEgdXNlciBldmVudCwgYSBudW1lcmljIGhhbmRsZSAocmVmZXJlbmNlKSB0byB0aGlzIHN0cmluZyBpcw0KICogdXNlZCB0byBpZGVudGlmeSB0aGUgZXZlbnQuIFRoaXMgaXMgb2J0YWluZWQgYnkgY2FsbGluZyANCiAqIA0KICogICAgIHhUcmFjZU9wZW5MYWJlbCgpDQogKg0KICogd2hpaGMgYWRkcyB0aGUgc3RyaW5nIHRvIHRoZSBzeW1ib2wgdGFibGUgKGlmIG5vdCBhbHJlYWR5IHByZXNlbnQpDQogKiBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGUuDQogKg0KICogVGhpcyBjYW4gYmUgdXNlZCBpbiB0d28gd2F5czoNCiAqDQogKiAxLiBUaGUgaGFuZGxlIGlzIGxvb2tlZCB1cCBldmVyeSB0aW1lLCB3aGVuIHN0b3JpbmcgdGhlIHVzZXIgZXZlbnQuDQogKg0KICogRXhhbXBsZToNCiAqICAgICB2VHJhY2VVc2VyRXZlbnQoeFRyYWNlT3BlbkxhYmVsKCJNeVVzZXJFdmVudCIpKTsNCiAqDQogKiAyLiBUaGUgbGFiZWwgaXMgcmVnaXN0ZXJlZCBqdXN0IG9uY2UsIHdpdGggdGhlIGhhbmRsZSBzdG9yZWQgaW4gYW4NCiAqICBhcHBsaWNhdGlvbiB2YXJpYWJsZSAtIG11Y2ggbGlrZSB1c2luZyBhIGZpbGUgaGFuZGxlLg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgbXlFdmVudEhhbmRsZSA9IHhUcmFjZU9wZW5MYWJlbCgiTXlVc2VyRXZlbnQiKTsNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VVc2VyRXZlbnQobXlFdmVudEhhbmRsZSk7DQogKg0KICogVGhlIHNlY29uZCBvcHRpb24gaXMgZmFzdGVyIHNpbmNlIG5vIGxvb2t1cCBpcyByZXF1aXJlZCBvbiBlYWNoIGV2ZW50LCBhbmQgDQogKiB0aGVyZWZvcmUgcmVjb21tZW5kZWQgZm9yIHVzZXIgZXZlbnRzIHRoYXQgYXJlIGZyZXF1ZW50bHkNCiAqIGV4ZWN1dGVkIGFuZC9vciBsb2NhdGVkIGluIHRpbWUtY3JpdGljYWwgY29kZS4gVGhlIGxvb2t1cCBvcGVyYXRpb24gaXMNCiAqIGhvd2V2ZXIgZmFpcmx5IGZhc3QgZHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIHN5bWJvbCB0YWJsZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp0cmFjZUxhYmVsIHhUcmFjZU9wZW5MYWJlbChjaGFyKiBsYWJlbCkNCnsNCiAgICByZXR1cm4gcHJ2VHJhY2VPcGVuU3ltYm9sKGxhYmVsLCAwKTsNCn0NCiNlbmRpZg0KI2VuZGlmDQoNCg==