ZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZS5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlLmphdmEKaW5kZXggYzFlNDQ1Ni4uMzIzMTlmYSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlLmphdmEKQEAgLTEsNiArMSw2IEBACiBwYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbDsKIAotcHVibGljIGludGVyZmFjZSBPRk1lc3NhZ2UgeworcHVibGljIGludGVyZmFjZSBPRk1lc3NhZ2UgZXh0ZW5kcyBPRk9iamVjdCB7CiAgICAgaW50IGdldFhpZCgpOwogCiAgICAgT0ZUeXBlIGdldFR5cGUoKTsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZVdyaXRlci5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlV3JpdGVyLmphdmEKaW5kZXggODRlNTUwNy4uYmNjYTFmZCAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlV3JpdGVyLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZNZXNzYWdlV3JpdGVyLmphdmEKQEAgLTQsNSArNCw1IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LmV4Y2VwdGlvbnMuT0ZQYXJzZUVycm9yOwogCiBwdWJsaWMgaW50ZXJmYWNlIE9GTWVzc2FnZVdyaXRlcjxUPiB7Ci0gICAgcHVibGljIGludCB3cml0ZShDaGFubmVsQnVmZmVyIGJiLCBUIG1lc3NhZ2UpIHRocm93cyBPRlBhcnNlRXJyb3I7CisgICAgcHVibGljIHZvaWQgd3JpdGUoQ2hhbm5lbEJ1ZmZlciBiYiwgVCBtZXNzYWdlKSB0aHJvd3MgT0ZQYXJzZUVycm9yOwogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZPYmplY3QuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GT2JqZWN0LmphdmEKaW5kZXggNGE3NTU3Zi4uMTQwMTgyYiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZPYmplY3QuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9PRk9iamVjdC5qYXZhCkBAIC0zLDE3ICszLDE1IEBACiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyOwogCiAvKioKLSAqICBCYXNlIGludGVyZmFjZSBvZiBhbGwgT3BlbkZsb3cgb2JqZWN0cyAoZS5nLiwgbWVzc2FnZXMsIGFjdGlvbnMsIHN0YXRzLCBldGMuKQorICogQmFzZSBpbnRlcmZhY2Ugb2YgYWxsIE9wZW5GbG93IG9iamVjdHMgKGUuZy4sIG1lc3NhZ2VzLCBhY3Rpb25zLCBzdGF0cywgZXRjLikKICAqCi0gKiAgQWxsIG9iamVjdHMgaGF2ZSBhIGxlbmd0aCBhbmQgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gZnJvbSBhIGJ1ZmZlci4KLSAqICBXaGVuIHdyaXRpbmcsIHRoZSBsZW5ndGggZmllbGQgaXMgZHluYW1pY2FsbHkgdXBkYXRlZCwgc28gaXQgbmVlZCBub3QgYmUKLSAqICBtYW5hZ2VkIG1hbnVhbGx5LiAgSG93ZXZlciwgeW91IGNhbiBvdmVycmlkZSB0aGUgYXV0byBjYWxjdWxhdGVkIGxlbmd0aCB3aXRoCi0gKiAgb3ZlcnJpZGVMZW5ndGgoKSBjYWxsLCBpZiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIGludGVudGlvbmFsbHkgY3JlYXRlCi0gKiAgbWFsZm9ybWVkIHBhY2tldHMsIGZvciBleGFtcGxlLCBmb3IgbmVnYXRpdmUgdGVzdGluZy4KKyAqIEFsbCBvYmplY3RzIGhhdmUgYSBsZW5ndGggYW5kIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGZyb20gYSBidWZmZXIuIFdoZW4KKyAqIHdyaXRpbmcsIHRoZSBsZW5ndGggZmllbGQgaXMgZHluYW1pY2FsbHkgdXBkYXRlZCwgc28gaXQgbmVlZCBub3QgYmUgbWFuYWdlZAorICogbWFudWFsbHkuIEhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGF1dG8gY2FsY3VsYXRlZCBsZW5ndGggd2l0aAorICogb3ZlcnJpZGVMZW5ndGgoKSBjYWxsLCBpZiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIGludGVudGlvbmFsbHkgY3JlYXRlCisgKiBtYWxmb3JtZWQgcGFja2V0cywgZm9yIGV4YW1wbGUsIGZvciBuZWdhdGl2ZSB0ZXN0aW5nLgogICovCiAKLQogcHVibGljIGludGVyZmFjZSBPRk9iamVjdCB7CiAgICAgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgYmIpOwotICAgIGludCBnZXRMZW5ndGgoKTsKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL1dpbGRjYXJkcy5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvV2lsZGNhcmRzLmphdmEKaW5kZXggMjViMmMyMS4uZTE5OTNmNSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvV2lsZGNhcmRzLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvV2lsZGNhcmRzLmphdmEKQEAgLTEsNSArMSw2NTYgQEAKKy8qKgorICogICAgQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4KKyAqCisgKiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heQorICogICAgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyAqICAgIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiAgICBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiovCisKIHBhY2thZ2Ugb3JnLm9wZW5mbG93LnByb3RvY29sOwogCi1wdWJsaWMgY2xhc3MgV2lsZGNhcmRzIHsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi19CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CisKKy8qKgorICogYSBtb3JlIHVzZXIgZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpbGRjYXJkcyBiaXRzIGluIGFuIE9wZW5GbG93CisgKiBtYXRjaC4gVGhlIFdpbGRjYXJkcyBvYmplY3QgaXMKKyAqIDx1bD4KKyAqIDxsaT5pbW11dGFibGUgKGkuZS4sIHRocmVhZHNhZmUpPC9saT4KKyAqIDxsaT5pbnN0YW5jZSBtYW5hZ2VkIChkb24ndCBpbnN0YW50aWF0ZSBpdCB5b3Vyc2VsZiksIGluc3RlYWQgY2FsbCAib2YiPC9saT4KKyAqIDx1bD4KKyAqIDxwPgorICogWW91IGNhbiBjb25zdHJ1Y3QgYSBXaWxkY2FyZCBvYmplY3QgZnJvbSBlaXRoZXIgaXRzIGludGVnZXIgcmVwcmVzZW50YXRpb24KKyAqIDwvcD4KKyAqIDxjb2RlPgorICogICAgV2lsZGNhcmQub2YoMHgzODIwZTApOworICogIDwvY29kZT4KKyAqIDxwPgorICogT3Igc3RhcnQgd2l0aCBlaXRoZXIgYW4gZW1wdHkgb3IgZnVsbCB3aWxkY2FyZCwgYW5kIHNlbGVjdC91bnNlbGVjdCBmb28uCisgKiA8L3A+CisgKiA8Y29kZT4KKyAqICBXaWxkY2FyZCB3ID0gV2lsZGNhcmRzLk5PTkUKKyAqICAgICAgICAgICAgICAgIC5zZXQoRmxhZy5ETF9TUkMsIEZsYWcuIERMX0RTVCwgRmxhZy5ETF9WTEFOX1BDUCkKKyAqICAgICAgICAgICAgICAgIC5zZXROd0RzdE1hc2soOCkKKyAqICAgICAgICAgICAgICAgIC5zZXROd1NyY01hc2soOCk7CisgKiAgPC9jb2RlPgorICogPHA+CisgKiA8Yj5SZW1lbWJlcjo8L2I+IFdpbGRjYXJkcyBvYmplY3RzIGFyZSBpbW11dGFibGUuIHNldC4uLiBvcGVyYXRpb25zIGhhdmUKKyAqIDxiPk5PIEVGRkVDVDwvYj4gb24gdGhlIGN1cnJlbnQgd2lsZGNhcmQgb2JqZWN0LiBZb3UgSEFWRSB0byB1c2UgdGhlIHJldHVybmVkCisgKiBjaGFuZ2VkIG9iamVjdC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEFuZHJlYXMgV3VuZHNhbSA8YW5kcmVhcy53dW5kc2FtQGJpZ3N3aXRjaC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBXaWxkY2FyZHMgeworICAgIHB1YmxpYyBjbGFzcyBPRldpbGRjYXJkRmxhZ3MgeworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19BTEwgPSAoKDEgPDwgMjIpIC0gMSk7CisKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfSU5fUE9SVCA9IDEgPDwgMDsgLyogU3dpdGNoIGlucHV0IHBvcnQuICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0RMX1ZMQU4gPSAxIDw8IDE7IC8qIFZMQU4gaWQuICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0RMX1NSQyA9IDEgPDwgMjsgLyogRXRoZXJuZXQgc291cmNlIGFkZHJlc3MuICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0RMX0RTVCA9IDEgPDwgMzsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFdGhlcm5ldCBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0RMX1RZUEUgPSAxIDw8IDQ7IC8qIEV0aGVybmV0IGZyYW1lIHR5cGUuICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX05XX1BST1RPID0gMSA8PCA1OyAvKiBJUCBwcm90b2NvbC4gKi8KKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfVFBfU1JDID0gMSA8PCA2OyAvKiBUQ1AvVURQIHNvdXJjZSBwb3J0LiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19UUF9EU1QgPSAxIDw8IDc7IC8qIFRDUC9VRFAgZGVzdGluYXRpb24gcG9ydC4gKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBJUCBzb3VyY2UgYWRkcmVzcyB3aWxkY2FyZCBiaXQgY291bnQuIDAgaXMgZXhhY3QgbWF0Y2gsIDEgaWdub3JlcyB0aGUKKyAgICAgICAgICogTFNCLCAyIGlnbm9yZXMgdGhlIDIgbGVhc3Qtc2lnbmlmaWNhbnQgYml0cywgLi4uLCAzMiBhbmQgaGlnaGVyIHdpbGRjYXJkCisgICAgICAgICAqIHRoZSBlbnRpcmUgZmllbGQuIFRoaXMgaXMgdGhlICpvcHBvc2l0ZSogb2YgdGhlIHVzdWFsIGNvbnZlbnRpb24gd2hlcmUKKyAgICAgICAgICogZS5nLiAvMjQgaW5kaWNhdGVzIHRoYXQgOCBiaXRzIChub3QgMjQgYml0cykgYXJlIHdpbGRjYXJkZWQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19TUkNfU0hJRlQgPSA4OworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19TUkNfQklUUyA9IDY7CisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX05XX1NSQ19NQVNLID0gKCgxIDw8IE9GUEZXX05XX1NSQ19CSVRTKSAtIDEpIDw8IE9GUEZXX05XX1NSQ19TSElGVDsKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfU1JDX0FMTCA9IDMyIDw8IE9GUEZXX05XX1NSQ19TSElGVDsKKworICAgICAgICAvKiBJUCBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpbGRjYXJkIGJpdCBjb3VudC4gU2FtZSBmb3JtYXQgYXMgc291cmNlLiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19EU1RfU0hJRlQgPSAxNDsKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfRFNUX0JJVFMgPSA2OworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19EU1RfTUFTSyA9ICgoMSA8PCBPRlBGV19OV19EU1RfQklUUykgLSAxKSA8PCBPRlBGV19OV19EU1RfU0hJRlQ7CisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX05XX0RTVF9BTEwgPSAzMiA8PCBPRlBGV19OV19EU1RfU0hJRlQ7CisKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfRExfVkxBTl9QQ1AgPSAxIDw8IDIwOyAvKiBWTEFOIHByaW9yaXR5LiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19UT1MgPSAxIDw8IDIxOyAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJUCBUb1MgKERTQ1AgZmllbGQsIDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0FMTF9TQU5JVElaRUQgPSAoKCgxIDw8IDIyKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+T0ZQRldfTldfU1JDX01BU0sgJiB+T0ZQRldfTldfRFNUX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9GUEZXX05XX1NSQ19BTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT0ZQRldfTldfRFNUX0FMTDsKKworCisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBXaWxkY2FyZHMgRlVMTCA9IG5ldyBXaWxkY2FyZHMoT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0FMTF9TQU5JVElaRUQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVUxMX0lOVCA9IEZVTEwuZ2V0SW50KCk7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFdpbGRjYXJkcyBFWEFDVCA9IG5ldyBXaWxkY2FyZHMoMCk7CisKKyAgICAvLyBmbG9vZGxpZ2h0IGNvbW1vbiBjYXNlOiBtYXRjaGVzIG9uIGlucG9ydCArIGwyCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5UX0lOUE9SVF9MMl9NQVRDSCA9IDB4MzgyMGUwOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgV2lsZGNhcmRzIElOUE9SVF9MMl9NQVRDSCA9IG5ldyBXaWxkY2FyZHMoCisgICAgICAgICAgICBJTlRfSU5QT1JUX0wyX01BVENIKTsKKworICAgIC8qKgorICAgICAqIGVudW0gdHlwZSBmb3IgdGhlIGJpbmFyeSBmbGFncyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIHdpbGRjYXJkcyBmaWVsZCBvZgorICAgICAqIGFuIE9GV2lsZGNhcmRGbGFncy4gUmVwbGFjZXMgdGhlIHVud2llbGR5IGMtaXNoIGludCBjb25zdGFudHMgaW4gT0ZXaWxkY2FyZEZsYWdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBGbGFnIHsKKyAgICAgICAgSU5fUE9SVChPRldpbGRjYXJkRmxhZ3MuT0ZQRldfSU5fUE9SVCksICAvKiBTd2l0Y2ggaW5wdXQgcG9ydC4gKi8KKyAgICAgICAgRExfVkxBTihPRldpbGRjYXJkRmxhZ3MuT0ZQRldfRExfVkxBTiksIC8qIFZMQU4gaWQuICovCisgICAgICAgIERMX1NSQyhPRldpbGRjYXJkRmxhZ3MuT0ZQRldfRExfU1JDKSwgLyogRXRoZXJuZXQgc291cmNlIGFkZHJlc3MuICovCisgICAgICAgIERMX0RTVChPRldpbGRjYXJkRmxhZ3MuT0ZQRldfRExfRFNUKSwgLyogRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkciAqLworICAgICAgICBETF9UWVBFKE9GV2lsZGNhcmRGbGFncy5PRlBGV19ETF9UWVBFKSwgLyogRXRoZXJuZXQgZnJhbWUgdHlwZS4gKi8KKyAgICAgICAgTldfUFJPVE8oT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1BST1RPKSwgLyogSVAgcHJvdG9jb2wuICovCisgICAgICAgIFRQX1NSQyhPRldpbGRjYXJkRmxhZ3MuT0ZQRldfVFBfU1JDKSwgLyogVENQL1VEUCBzb3VyY2UgcG9ydC4gKi8KKyAgICAgICAgVFBfRFNUKE9GV2lsZGNhcmRGbGFncy5PRlBGV19UUF9EU1QpLCAvKiBUQ1AvVURQIGRlc3RpbmF0aW9uIHBvcnQuICovCisgICAgICAgIERMX1ZMQU5fUENQKE9GV2lsZGNhcmRGbGFncy5PRlBGV19ETF9WTEFOX1BDUCksIC8qIFZMQU4gcHJpb3JpdHkuICovCisgICAgICAgIE5XX1NSQygtMSkgeyAvKgorICAgICAgICAgICAgICAgICAgICAgICogdmlydHVhbCBOV19TUkMgZmxhZyA9PiB0cmFuc2xhdGVzIHRvIHRoZSBzdHJhbmdlIDYgYml0cworICAgICAgICAgICAgICAgICAgICAgICogaW4gdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gaXNCb2xlYW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGludCBnZXRJbnQoaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoZmxhZ3MgJiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX01BU0spID4+IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfU0hJRlQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGludCBzZXRJbnQoaW50IGZsYWdzLCBpbnQgc3JjTWFzaykgeworICAgICAgICAgICAgICAgIHJldHVybiAoZmxhZ3MgJiB+T0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1NSQ19NQVNLKSB8IChzcmNNYXNrIDw8IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfU0hJRlQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGludCB3aWxkY2FyZChpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ3MgJiB+T0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1NSQ19NQVNLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGludCBtYXRjaE9uKGludCBmbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiBmbGFncyB8IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfQUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gaXNQYXJ0aWFsbHlPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW50VmFsdWUgPSBnZXRJbnQoZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiBpbnRWYWx1ZSA+IDAgJiYgaW50VmFsdWUgPCAzMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGlzRnVsbHlPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KGZsYWdzKSA+PSAzMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorICAgICAgICBOV19EU1QoLTEpIHsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAqIHZpcnR1YWwgTldfU1JDIGZsYWcgPT4gdHJhbnNsYXRlcyB0byB0aGUgc3RyYW5nZSA2IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAqIGluIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGlzQm9sZWFuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgZ2V0SW50KGludCBmbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiAoKGZsYWdzICYgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9NQVNLKSA+PiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX1NISUZUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgc2V0SW50KGludCBmbGFncywgaW50IHNyY01hc2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZsYWdzICYgfk9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19EU1RfTUFTSykgfCAoc3JjTWFzayA8PCBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX1NISUZUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgd2lsZGNhcmQoaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdzICYgfk9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19EU1RfTUFTSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgbWF0Y2hPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ3MgfCBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX0FMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGlzRnVsbHlPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KGZsYWdzKSA+PSAzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgTldfVE9TKE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19UT1MpOyAvKiBJUCBUb1MgKERTQ1AgZmllbGQsIDYgYml0cykuICovCisKKyAgICAgICAgZmluYWwgaW50IGJpdFBvc2l0aW9uOworCisgICAgICAgIEZsYWcoaW50IGJpdFBvc2l0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmJpdFBvc2l0aW9uID0gYml0UG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIG1vZGlmaWVkIE9GLTEuMCBmbGFncyBmaWVsZCB3aXRoIHRoaXMgZmxhZyBjbGVhcmVkIChtYXRjaAorICAgICAgICAgKiAgICAgICAgIG9uIHRoaXMgZmllbGQpCisgICAgICAgICAqLworICAgICAgICBpbnQgbWF0Y2hPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBmbGFncyAmIH50aGlzLmJpdFBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gYSBtb2RpZmllZCBPRi0xLjAgZmxhZ3MgZmllbGQgd2l0aCB0aGlzIGZsYWcgc2V0ICh3aWxkY2FyZAorICAgICAgICAgKiAgICAgICAgIHRoaXMgZmllbGQpCisgICAgICAgICAqLworICAgICAgICBpbnQgd2lsZGNhcmQoaW50IGZsYWdzKSB7CisgICAgICAgICAgICByZXR1cm4gZmxhZ3MgfCB0aGlzLmJpdFBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBpcyBhIHRydWUgYm9vbGVhbiBmbGFnIHRoYXQgY2FuIGVpdGhlciBiZSBvZmYKKyAgICAgICAgICogICAgICAgICBvciBvbi5UcnVlIGluIE9GLTEuMCBmb3IgYWxsIGZpZWxkcyBleGNlcHQgTldfU1JDIGFuZCBOV19EU1QKKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNCb2xlYW4oKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGlzIHdpbGRjYXJkIGZpZWxkIGlzIGN1cnJlbnRseSAncGFydGlhbGx5IG9uJy4KKyAgICAgICAgICogICAgICAgICBBbHdheXMgZmFsc2UgZm9yIHRydWUgQm9vbGVhbiBGbGFncy4gQ2FuIGJlIHRydWUgaW4gT0YtMS4wCisgICAgICAgICAqICAgICAgICAgZm9yIE5XX1NSQywgTldfRFNULgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc1BhcnRpYWxseU9uKGludCBmbGFncykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhpcyB3aWxkY2FyZCBmaWVsZCBjdXJyZW50bHkgZnVsbHkgb24gKGZ1bGx5CisgICAgICAgICAqICAgICAgICAgd2lsZGNhcmRlZCkuIEVxdWl2YWxlbnQgdG8gdGhlIGJvb2xlYW4gZmxhZyBiZWluZyBzZXQgaW4gdGhlCisgICAgICAgICAqICAgICAgICAgYml0bWFzayBmb3IgYml0IGZsYWdzLCBhbmQgdG8gdGhlIHdpbGRjYXJkZWQgYml0IGxlbmd0aCBzZXQKKyAgICAgICAgICogICAgICAgICB0byA+PTMyIGZvciBOV19TUkMgYW5kIE5XX0RTVAorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0Z1bGx5T24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsYWdzICYgdGhpcy5iaXRQb3NpdGlvbikgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBzZXQgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmbGFnLiBvbmx5IGZvciBOV19TUkMgYW5kCisgICAgICAgICAqIE5XX0RTVAorICAgICAgICAgKi8KKyAgICAgICAgaW50IHNldEludChpbnQgZmxhZ3MsIGludCBzcmNNYXNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBzZXQgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmbGFnLiBvbmx5IGZvciBOV19TUkMgYW5kCisgICAgICAgICAqIE5XX0RTVAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldEludChpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IGZsYWdzOworCisgICAgLyoqIHByaXZhdGUgY29uc3RydWN0b3IuIHVzZSBXaWxkY2FyZC5vZigpIGluc3RlYWQgKi8KKyAgICBwcml2YXRlIFdpbGRjYXJkcyhpbnQgZmxhZ3MpIHsKKyAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIHdpbGRjYXJkIG9iamVjdCBtYXRjaGluZyB0aGUgZ2l2ZW4gaW50IGZsYWdzLiBNYXkgcmV1c2UgLyBjYWNoZQorICAgICAqIGZyZXF1ZW50bHkgdXNlZCB3aWxkY2FyZCBpbnN0YW5jZXMuIERvbid0IHJlbHkgb24gaXQgdGhvdWdoICh1c2UgZXF1YWxzCisgICAgICogbm90ID09KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyBvZihpbnQgcGFyYW1GbGFncykgeworICAgICAgICBpbnQgZmxhZ3MgPSBzYW5pdGl6ZUludChwYXJhbUZsYWdzKTsKKyAgICAgICAgc3dpdGNoKGZsYWdzKSB7CisgICAgICAgICAgICBjYXNlIDB4MDAwMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhBQ1Q7CisgICAgICAgICAgICBjYXNlIE9GV2lsZGNhcmRGbGFncy5PRlBGV19BTExfU0FOSVRJWkVEOgorICAgICAgICAgICAgICAgIHJldHVybiBGVUxMOworICAgICAgICAgICAgY2FzZSBJTlRfSU5QT1JUX0wyX01BVENIOgorICAgICAgICAgICAgICAgIHJldHVybiBJTlBPUlRfTDJfTUFUQ0g7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBjb252aWVuY2UgbWV0aG9kIHJldHVybiBhIHdpbGRjYXJkIGZvciBleGFjdGx5IG9uZSBzZXQgZmxhZyAqLworICAgIHB1YmxpYyBzdGF0aWMgV2lsZGNhcmRzIG9mKFdpbGRjYXJkcy5GbGFnIHNldEZsYWcpIHsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihzZXRGbGFnLndpbGRjYXJkKDApKTsKKyAgICB9CisKKyAgICAvKiogY29udmllbmNlIG1ldGhvZCByZXR1cm4gYSB3aWxkY2FyZCBmb3IgZXhhY3RseSB0d28gc2V0IGZsYWdzICovCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2YoV2lsZGNhcmRzLkZsYWcgc2V0RmxhZywgV2lsZGNhcmRzLkZsYWcgc2V0RmxhZzIpIHsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihzZXRGbGFnLndpbGRjYXJkKHNldEZsYWcyLndpbGRjYXJkKDApKSk7CisgICAgfQorCisgICAgLyoqIGNvbnZpZW5jZSBtZXRob2QgcmV0dXJuIGEgd2lsZGNhcmQgZm9yIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygc2V0IGZsYWdzICovCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2YoV2lsZGNhcmRzLkZsYWcuLi4gc2V0RmxhZ3MpIHsKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogc2V0RmxhZ3MpCisgICAgICAgICAgICBmbGFncyA9IGZsYWcud2lsZGNhcmQoMCk7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2YoZmxhZ3MpOworICAgIH0KKworICAgIC8qKiBjb252aWVuY2UgbWV0aG9kIHJldHVybiBhIHdpbGRjYXJkcyBmb3Igb2ZtYXRjaGVzIHRoYXQgbWF0Y2ggb24gb25lIGZsYWcgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyBvZk1hdGNoZXMoV2lsZGNhcmRzLkZsYWcgc2V0RmxhZykgeworICAgICAgICByZXR1cm4gV2lsZGNhcmRzLm9mKHNldEZsYWcubWF0Y2hPbihGVUxMX0lOVCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnZpZW5jZSBtZXRob2QgcmV0dXJuIGEgd2lsZGNhcmQgZm9yIGZvciBhbiBvZm1hdGNoIHRoYXQgbWF0Y2ggb24gdHdvCisgICAgICogZmxhZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyBvZk1hdGNoZXMoV2lsZGNhcmRzLkZsYWcgc2V0RmxhZywgV2lsZGNhcmRzLkZsYWcgc2V0RmxhZzIpIHsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihzZXRGbGFnLm1hdGNoT24oc2V0RmxhZzIubWF0Y2hPbihGVUxMX0lOVCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252aWVuY2UgbWV0aG9kIHJldHVybiBhIHdpbGRjYXJkIGZvciBhbiBvZm1hdGNoIHRoYXQgYW10Y2ggb24gYW4KKyAgICAgKiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNldCBmbGFncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV2lsZGNhcmRzIG9mTWF0Y2hlcyhXaWxkY2FyZHMuRmxhZy4uLiBzZXRGbGFncykgeworICAgICAgICBpbnQgZmxhZ3MgPSBGVUxMX0lOVDsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogc2V0RmxhZ3MpCisgICAgICAgICAgIGZsYWdzID0gZmxhZy5tYXRjaE9uKGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2ZNYXRjaGVzKFNldDxXaWxkY2FyZHMuRmxhZz4gd1NldCkgeworICAgICAgICBpbnQgZmxhZ3MgPSBGVUxMX0lOVDsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogd1NldCkKKyAgICAgICAgICAgZmxhZ3MgPSBmbGFnLm1hdGNoT24oZmxhZ3MpOworICAgICAgICByZXR1cm4gV2lsZGNhcmRzLm9mKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSBXaWxkY2FyZHMgb2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBmbGFncyBzZXQKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5OT1RFOjwvYj4gTk9UIGEgbXV0YXRvciBmdW5jdGlvbi4gJ3RoaXMnIHdpbGRjYXJkIG9iamVjdCBzdGF5cworICAgICAqIHVubW9kaWZpZWQuIDwvYj4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIHdpbGRjYXJkKFdpbGRjYXJkcy5GbGFnIGZsYWcpIHsKKyAgICAgICAgaW50IGZsYWdzID0gZmxhZy53aWxkY2FyZCh0aGlzLmZsYWdzKTsKKyAgICAgICAgaWYgKGZsYWdzID09IHRoaXMuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZHMoZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkcyBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIGZsYWdzIHNldAorICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBOT1QgYSBtdXRhdG9yIGZ1bmN0aW9uLiAndGhpcycgd2lsZGNhcmQgb2JqZWN0IHN0YXlzCisgICAgICogdW5tb2RpZmllZC4gPC9iPgorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgd2lsZGNhcmQoV2lsZGNhcmRzLkZsYWcgZmxhZywgV2lsZGNhcmRzLkZsYWcgZmxhZzIpIHsKKyAgICAgICAgaW50IGZsYWdzID0gZmxhZy53aWxkY2FyZChmbGFnMi53aWxkY2FyZCh0aGlzLmZsYWdzKSk7CisgICAgICAgIGlmIChmbGFncyA9PSB0aGlzLmZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSBXaWxkY2FyZHMgb2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBmbGFncyB3aWxkY2FyZGVkCisgICAgICogPHA+CisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyB3aWxkY2FyZChXaWxkY2FyZHMuRmxhZy4uLiBzZXRGbGFncykgeworICAgICAgICBpbnQgZmxhZ3MgPSB0aGlzLmZsYWdzOworICAgICAgICBmb3IgKFdpbGRjYXJkcy5GbGFnIGZsYWcgOiBzZXRGbGFncykKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZy53aWxkY2FyZChmbGFncyk7CisgICAgICAgIGlmIChmbGFncyA9PSB0aGlzLmZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSBXaWxkY2FyZHMgb2JqZWN0IHRoYXQgbWF0Y2hlcyBvbiBleGFjdGx5IHRoZSBnaXZlbiBmbGFnCisgICAgICogPHA+CisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyBtYXRjaE9uKFdpbGRjYXJkcy5GbGFnIGZsYWcpIHsKKyAgICAgICAgaW50IGZsYWdzID0gZmxhZy5tYXRjaE9uKHRoaXMuZmxhZ3MpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmRzIG9iamVjdCB0aGF0IG1hdGNoZXMgb24gZXhhY3RseSB0aGUgZ2l2ZW4gZmxhZ3MKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5OT1RFOjwvYj4gTk9UIGEgbXV0YXRvciBmdW5jdGlvbi4gJ3RoaXMnIHdpbGRjYXJkIG9iamVjdCBzdGF5cworICAgICAqIHVubW9kaWZpZWQuIDwvYj4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIG1hdGNoT24oV2lsZGNhcmRzLkZsYWcgZmxhZywgV2lsZGNhcmRzLkZsYWcgZmxhZzIpIHsKKyAgICAgICAgaW50IGZsYWdzID0gZmxhZy5tYXRjaE9uKGZsYWcyLm1hdGNoT24odGhpcy5mbGFncykpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmRzIG9iamVjdCB0aGF0IG1hdGNoZXMgb24gZXhhY3RseSB0aGUgZ2l2ZW4gZmxhZ3MKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5OT1RFOjwvYj4gTk9UIGEgbXV0YXRvciBmdW5jdGlvbi4gJ3RoaXMnIHdpbGRjYXJkIG9iamVjdCBzdGF5cworICAgICAqIHVubW9kaWZpZWQuIDwvYj4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIG1hdGNoT24oV2lsZGNhcmRzLkZsYWcuLi4gc2V0RmxhZ3MpIHsKKyAgICAgICAgaW50IGZsYWdzID0gdGhpcy5mbGFnczsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogc2V0RmxhZ3MpCisgICAgICAgICAgICBmbGFncyA9IGZsYWcubWF0Y2hPbihmbGFncyk7CisgICAgICAgIGlmIChmbGFncyA9PSB0aGlzLmZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdGhlIG53IHNyYyBtYXNrIGluIG5vcm1hbCBDSURSIHN0eWxlLCBlLmcuLCA4IG1lYW5zIHgueC54LngvOAorICAgICAqIG1lYW5zIDggYml0cyB3aWxkY2FyZGVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXROd1NyY01hc2soKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAzMiAtIEZsYWcuTldfU1JDLmdldEludChmbGFncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgbncgZHN0IG1hc2sgaW4gbm9ybWFsIENJRFIgc3R5bGUsIGUuZy4sIDggbWVhbnMgeC54LngueC84CisgICAgICogbWVhbnMgOCBiaXRzIHdpbGRjYXJkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE53RHN0TWFzaygpIHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIDMyIC0gRmxhZy5OV19EU1QuZ2V0SW50KGZsYWdzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmQgb2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBud1NyY0NpZHJNYXNrIHNldC4KKyAgICAgKiA8Yj5OT1RFOjwvYj4gTk9UIGEgbXV0YXRvciBmdW5jdGlvbi4gJ3RoaXMnIHdpbGRjYXJkIG9iamVjdCBzdGF5cworICAgICAqIHVubW9kaWZpZWQuIDwvYj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNDaWRyTWFzaworICAgICAqICAgICAgICAgICAgc291cmNlIG1hc2sgdG8gc2V0IGluIDxiPm5vcm1hbCBDSURSIG5vdGF0aW9uPC9iPiwgaS5lLiwgOAorICAgICAqICAgICAgICAgICAgbWVhbnMgeC54LngueC84CisgICAgICogQHJldHVybiBhIG1vZGlmaWVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgd2l0aE53U3JjTWFzayhpbnQgc3JjQ2lkck1hc2spIHsKKyAgICAgICAgaW50IGZsYWdzID0gRmxhZy5OV19TUkMuc2V0SW50KHRoaXMuZmxhZ3MsIE1hdGgubWF4KDAsIDMyIC0gc3JjQ2lkck1hc2spKTsKKyAgICAgICAgaWYgKGZsYWdzID09IHRoaXMuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZHMoZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkIG9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4gbndEc3RDaWRyTWFzayBzZXQuCisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0Q2lkck1hc2sKKyAgICAgKiAgICAgICAgICAgIGRlc3QgbWFzayB0byBzZXQgaW4gPGI+bm9ybWFsIENJRFIgbm90YXRpb248L2I+LCBpLmUuLCA4IG1lYW5zCisgICAgICogICAgICAgICAgICB4LngueC54LzgKKyAgICAgKiBAcmV0dXJuIGEgbW9kaWZpZWQgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyB3aXRoTndEc3RNYXNrKGludCBkc3RDaWRyTWFzaykgeworICAgICAgICBpbnQgZmxhZ3MgPSBGbGFnLk5XX0RTVC5zZXRJbnQodGhpcy5mbGFncywgTWF0aC5tYXgoMCwgMzIgLSBkc3RDaWRyTWFzaykpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmQgb2JqZWN0IHRoYXQgaXMgaW52ZXJ0ZWQgdG8gdGhpcyB3aWxkY2FyZCBvYmplY3QuCisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICogQHJldHVybiBhIG1vZGlmaWVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgaW52ZXJ0ZWQoKSB7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2YoZmxhZ3MgXiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfQUxMX1NBTklUSVpFRCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNXaWxkY2FyZGVkKEZsYWcgZmxhZykgeworICAgICAgICByZXR1cm4gZmxhZy5pc0Z1bGx5T24oZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhbGwgd2lsZGNhcmQgZmxhZ3MgdGhhdCBhcmUgZnVsbHkgd2lsZGNhcmRlZCBhcyBhbiBFbnVtU2V0LiBEbyBub3QKKyAgICAgKiBtb2RpZnkuIE5vdGU6IHNvbWUgZmxhZ3MgKGxpa2UgTldfU1JDIGFuZCBOV19EU1QpIHRoYXQgYXJlIHBhcnRpYWxseQorICAgICAqIHdpbGRjYXJkZWQgYXJlIG5vdCByZXR1cm5lZCBpbiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIEVudW1TZXQgb2Ygd2lsZGNhcmRzCisgICAgICovCisgICAgcHVibGljIEVudW1TZXQ8V2lsZGNhcmRzLkZsYWc+IGdldFdpbGRjYXJkZWRGbGFncygpIHsKKyAgICAgICAgRW51bVNldDxXaWxkY2FyZHMuRmxhZz4gcmVzID0gRW51bVNldC5ub25lT2YoV2lsZGNhcmRzLkZsYWcuY2xhc3MpOworICAgICAgICBmb3IgKFdpbGRjYXJkcy5GbGFnIGZsYWcgOiBGbGFnLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAoZmxhZy5pc0Z1bGx5T24oZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmVzLmFkZChmbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKiByZXR1cm4gdGhlIE9wZW5GbG93ICd3aXJlJyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHdpbGRjYXJkcyAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkgeworICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIHRoZSBPcGVuRmxvdyAnd2lyZScgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSB3aWxkY2FyZHMuCisgICAgICogU2FuaXRpemUgbndfc3JjIGFuZCBud19kc3QgdG8gYmUgbWF4LiAzMiAodmFsdWVzID4gMzIgYXJlIHRlY2huaWNhbGx5CisgICAgICogcG9zc2libGUsIGJ1dCBkb24ndCBtYWtlIHNlbWFudGljIHNlbnNlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNhbml0aXplSW50KGludCBmbGFncykgeworICAgICAgICBpZiAoKChmbGFncyAmIE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfTUFTSykgPj4gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1NSQ19TSElGVCkgPiAzMikgeworICAgICAgICAgICAgZmxhZ3MgPSAoZmxhZ3MgJiB+T0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1NSQ19NQVNLKSB8IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfQUxMOworICAgICAgICB9CisgICAgICAgIGlmICgoKGZsYWdzICYgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9NQVNLKSA+PiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX1NISUZUKSA+IDMyKSB7CisgICAgICAgICAgICBmbGFncyA9IChmbGFncyAmIH5PRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX01BU0spIHwgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9BTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlzIHRoaXMgYSB3aWxkY2FyZCBzZXQgdGhhdCBoYXMgYWxsIGZsYWdzIHNldCArIGFuZCBmdWxsICgvMCkgbndfc3JjIGFuZAorICAgICAqIG53X2RzdCB3aWxkY2FyZGluZyA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgeworICAgICAgICByZXR1cm4gZmxhZ3MgPT0gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0FMTCB8fCBmbGFncyA9PSBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfQUxMX1NBTklUSVpFRDsKKyAgICB9CisKKyAgICAvKiogaXMgdGhpcyBhIHdpbGRjYXJkIG9mIGFuIGV4YWN0IG1hdGNoICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGZsYWdzOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBXaWxkY2FyZHMgb3RoZXIgPSAoV2lsZGNhcmRzKSBvYmo7CisgICAgICAgIGlmIChmbGFncyAhPSBvdGhlci5mbGFncykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSm9pbmVyIHBpcGVKb2luZXIgPSBKb2luZXIub24oInwiKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogRmxhZy52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKGZsYWcuaXNGdWxseU9uKGZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJlcy5hZGQoZmxhZy5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRmxhZy5OV19TUkMuaXNQYXJ0aWFsbHlPbihmbGFncykpIHsKKyAgICAgICAgICAgIHJlcy5hZGQoIm53X3NyYygvIiArIGdldE53U3JjTWFzaygpICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGbGFnLk5XX0RTVC5pc1BhcnRpYWxseU9uKGZsYWdzKSkgeworICAgICAgICAgICAgcmVzLmFkZCgibndfZHN0KC8iICsgZ2V0TndEc3RNYXNrKCkgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBpcGVKb2luZXIuam9pbihyZXMpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEpvaW5lciBjb21tYUpvaW5lciA9IEpvaW5lci5vbigiLCAiKTsKKworICAgIC8qKiBhIEphdmEgZXhwcmVzc2lvbiB0aGF0IGNvbnN0cnVjdHMgJ3RoaXMnIHdpbGRjYXJkcyBzZXQgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvSmF2YSgpIHsKKyAgICAgICAgaWYoaXNGdWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiV2lsZGNhcmRzLkZVTEwiOworICAgICAgICB9IGVsc2UgIGlmIChpc0V4YWN0KCkpeworICAgICAgICAgICAgcmV0dXJuICJXaWxkY2FyZHMuRVhBQ1QiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBFbnVtU2V0PEZsYWc+IG15RmxhZ3MgPSBnZXRXaWxkY2FyZGVkRmxhZ3MoKTsKKyAgICAgICAgaWYgKG15RmxhZ3Muc2l6ZSgpIDwgMykgeworICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBzdGFydCB3aXRoIGVtcHR5CisgICAgICAgICAgICBiLmFwcGVuZCgiV2lsZGNhcmRzLm9mKCIKKyAgICAgICAgICAgICAgICAgICAgICsgY29tbWFKb2luZXIuam9pbihwcmVmaXgoIkZsYWcuIiwgbXlGbGFncy5pdGVyYXRvcigpKSkgKyAiKSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdG9vIG1hbnkgLSBzdGFydCB3aXRoIGZ1bGwKKworICAgICAgICAgICAgRW51bVNldDxGbGFnPiBpbnZGbGFncyA9IGludmVydGVkKCkuZ2V0V2lsZGNhcmRlZEZsYWdzKCk7CisgICAgICAgICAgICBiLmFwcGVuZCgiV2lsZGNhcmRzLm9mTWF0Y2hlcygiCisgICAgICAgICAgICAgICAgICAgICArIGNvbW1hSm9pbmVyLmpvaW4ocHJlZml4KCJGbGFnLiIsIGludkZsYWdzLml0ZXJhdG9yKCkpKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZsYWcuTldfU1JDLmlzUGFydGlhbGx5T24oZmxhZ3MpKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiLnNldE53U3JjTWFzaygiICsgZ2V0TndTcmNNYXNrKCkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChGbGFnLk5XX0RTVC5pc1BhcnRpYWxseU9uKGZsYWdzKSkgeworICAgICAgICAgICAgYi5hcHBlbmQoIi5zZXROd0RzdE1hc2soIiArIGdldE53RHN0TWFzaygpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBwcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgSXRlcmF0b3I8Pz4gaSkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPFN0cmluZz4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaS5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQgPT0gbnVsbCA/IG51bGwgOiBwcmVmaXggKyBuZXh0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YQppbmRleCA5OWI3ZGU0Li5kMzVmNzA5IDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoLmphdmEKQEAgLTUsMjMgKzUsMjMgQEAKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZWYWx1ZVR5cGU7CiAKIHB1YmxpYyBpbnRlcmZhY2UgTWF0Y2ggZXh0ZW5kcyBPRk9iamVjdCB7Ci0gICAgCisKICAgICAvKgogICAgICAqIFByZWNvbmRpdGlvbnMKLSAgICAgKiBPbiBwcmVjb25kaXRpb25zIChmcm9tIHRoZSBPRjEuMSBzcGVjLCBwYWdlIDI4LCB0aGUgT0YxLjAgc3BlYyBmYWlsZWQgdG8gZXhwbGljaXRseSAKKyAgICAgKiBPbiBwcmVjb25kaXRpb25zIChmcm9tIHRoZSBPRjEuMSBzcGVjLCBwYWdlIDI4LCB0aGUgT0YxLjAgc3BlYyBmYWlsZWQgdG8gZXhwbGljaXRseQogICAgICAqIHNwZWNpZnkgdGhpcywgYnV0IGl0IGlzIHRoZSBiZWhhdmlvciBvZiBPZjEuMCBzd2l0Y2hlcyk6Ci0gICAgICogUHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIHdpdGhpbiBvZnBfbWF0Y2ggd2lsbCBiZSBpZ25vcmVkIHdpdGhpbiBhIHNpbmdsZSB0YWJsZSB3aGVuIAotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbCAKLSAgICAgKiBiZSBpZ25vcmVkIHVubGVzcyB0aGUgRXRoZXJ0eXBlIGlzIHNwZWNpZmllZCBhcyBNUExTLiBMaWtld2lzZSwgdGhlIElQIGhlYWRlciBhbmQgCi0gICAgICogdHJhbnNwb3J0IGhlYWRlciBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgRXRoZXJ0eXBlIGlzIHNwZWNpZmllZCBhcyBlaXRoZXIgCi0gICAgICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbCAKLSAgICAgKiBzcGVjaWZpZWQgaXMgYXMgVENQLCBVRFAgb3IgU0NUUC4gRmllbGRzIHRoYXQgYXJlIGlnbm9yZWQgZG9u1XQgbmVlZCB0byBiZSB3aWxkY2FyZGVkIAorICAgICAqIFByb3RvY29sLXNwZWNpZmljIGZpZWxkcyB3aXRoaW4gb2ZwX21hdGNoIHdpbGwgYmUgaWdub3JlZCB3aXRoaW4gYSBzaW5nbGUgdGFibGUgd2hlbgorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbAorICAgICAqIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIE1QTFMuIExpa2V3aXNlLCB0aGUgSVAgaGVhZGVyIGFuZAorICAgICAqIHRyYW5zcG9ydCBoZWFkZXIgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgZWl0aGVyCisgICAgICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbAorICAgICAqIHNwZWNpZmllZCBpcyBhcyBUQ1AsIFVEUCBvciBTQ1RQLiBGaWVsZHMgdGhhdCBhcmUgaWdub3JlZCBkb27vv710IG5lZWQgdG8gYmUgd2lsZGNhcmRlZAogICAgICAqIGFuZCBzaG91bGQgYmUgc2V0IHRvIDAuCiAgICAgICovCi0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGZyb20gdGhpcyBtYXRjaC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQogICAgICAqIEByZXR1cm4gVmFsdWUgb2YgbWF0Y2ggZmllbGQKICAgICAgKi8KQEAgLTMwLDcgKzMwLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYXNrZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2guCiAgICAgICogUHJlY29uZGl0aW9uOiBmaWVsZCBpcyBwYXJ0aWFsbHkgd2lsZGNhcmRlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQogICAgICAqIEByZXR1cm4gTWFza2VkIHZhbHVlIG9mIG1hdGNoIGZpZWxkIG9yIG51bGwgaWYgbm8gbWFzawogICAgICAqLwpAQCAtMzgsNDQgKzM4LDQ0IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXRjaCBvYmplY3Qgc3VwcG9ydHMgdGhlIGdpdmVuIG1hdGNoIGZpZWxkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCi0gICAgICogQHJldHVybiAKKyAgICAgKiBAcmV0dXJuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CiAKICAgICAvKioKLSAgICAgKiB0cnVlIGlmZiBmaWVsZCBzdXBwb3J0cyBhIGJpdG1hc2sgbWFzayB0aGF0IHdpbGRjYXJkcyBwYXJ0IG9mIHRoZSBmaWVsZCAKKyAgICAgKiB0cnVlIGlmZiBmaWVsZCBzdXBwb3J0cyBhIGJpdG1hc2sgbWFzayB0aGF0IHdpbGRjYXJkcyBwYXJ0IG9mIHRoZSBmaWVsZAogICAgICAqIChub3RlOiBub3QgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGlzIGJpdG1hc2sgaGF2ZSB0byBiZSBhY2NlcHRhYmxlKQotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCi0gICAgICogQHJldHVybiAKKyAgICAgKiBAcmV0dXJuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CiAKICAgICAvKioKLSAgICAgKiBUcnVlIGlmZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBmdWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUuLCB0aGUgCisgICAgICogVHJ1ZSBpZmYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLiwgdGhlCiAgICAgICogbWF0Y2ggd2lsbCBvbmx5IHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGV4YWN0IHZhbHVlIG9mIGdldEZpZWxkKGZpZWxkKS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAotICAgICAqIEByZXR1cm4gCisgICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CiAKICAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGxvZ2ljYWxseSB1bnNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZSwgdGhlIAotICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkIAorICAgICAqIFRydWUgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgbG9naWNhbGx5IHVuc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUKKyAgICAgKiB2YWx1ZSByZXR1cm5lZCBieSBnZXRWYWx1ZShmKSBoYXMgbm8gaW1wYWN0IG9uIHdoZXRoZXIgYSBwYWNrZXQgd2lsbCBiZSBzZWxlY3RlZAogICAgICAqIGJ5IHRoZSBtYXRjaCBvciBub3QuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQKICAgICAgKiBAcmV0dXJuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CiAKICAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHBhcnRpYWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZSAKKyAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHBhcnRpYWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQogICAgICAqIG1hdGNoIHdpbGwgc2VsZWN0IHBhY2tldHMgdGhhdCBtYXRjaCAocC52YWx1ZSAmIGdldE1hc2soZmllbGQpKSA9PSBnZXRWYWx1ZShmaWVsZCkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQKICAgICAgKiBAcmV0dXJuCiAgICAgICovCkBAIC04NSw1ICs4NSw4IEBACiAgICAgICogUmV0dXJucyBhIGJ1aWxkZXIgdG8gYnVpbGQgbmV3IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgb2YgbWF0Y2ggb2JqZWN0LgogICAgICAqIEByZXR1cm4gTWF0Y2ggYnVpbGRlcgogICAgICAqLwotICAgIHB1YmxpYyBNYXRjaEJ1aWxkZXIgZ2V0QnVpbGRlcigpOworICAgIHB1YmxpYyBNYXRjaEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpOworCisgICAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNYXRjaEJ1aWxkZXIgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyLmphdmEKaW5kZXggNDM3MmUzMC4uYmU3YjhiMCAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyLmphdmEKQEAgLTMsMTQgKzMsNzcgQEAKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuTWFza2VkOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKIAotcHVibGljIGludGVyZmFjZSBNYXRjaEJ1aWxkZXIgZXh0ZW5kcyBNYXRjaCB7Ci0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRFeGFjdChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKTsKLSAgICAKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlLCBGIG1hc2spOyAgICAKK3B1YmxpYyBpbnRlcmZhY2UgTWF0Y2hCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGZyb20gdGhpcyBtYXRjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgbWF0Y2ggZmllbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gRiBnZXQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgTWFza2VkPEY+IHZhbHVlV2l0aE1hc2spOyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXNrZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2guCisgICAgICogUHJlY29uZGl0aW9uOiBmaWVsZCBpcyBwYXJ0aWFsbHkgd2lsZGNhcmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gTWFza2VkIHZhbHVlIG9mIG1hdGNoIGZpZWxkIG9yIG51bGwgaWYgbm8gbWFzaworICAgICAqLworICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXNrZWQ8Rj4gZ2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hdGNoIG9iamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbWF0Y2ggZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiB0cnVlIGlmZiBmaWVsZCBzdXBwb3J0cyBhIGJpdG1hc2sgbWFzayB0aGF0IHdpbGRjYXJkcyBwYXJ0IG9mIHRoZSBmaWVsZAorICAgICAqIChub3RlOiBub3QgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGlzIGJpdG1hc2sgaGF2ZSB0byBiZSBhY2NlcHRhYmxlKQorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZmYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLiwgdGhlCisgICAgICogbWF0Y2ggd2lsbCBvbmx5IHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGV4YWN0IHZhbHVlIG9mIGdldEZpZWxkKGZpZWxkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQorICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkCisgICAgICogYnkgdGhlIG1hdGNoIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgcGFydGlhbGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZSwgdGhlCisgICAgICogbWF0Y2ggd2lsbCBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIChwLnZhbHVlICYgZ2V0TWFzayhmaWVsZCkpID09IGdldFZhbHVlKGZpZWxkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKKworCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRFeGFjdChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKTsKKworICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzayk7CisKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzayk7CiAKICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpOwotICAgIAorCiAgICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCk7CiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEJ1aWxkZXJWZXIxMC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyVmVyMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjNzdlNS4uMDAwMDAwMAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEJ1aWxkZXJWZXIxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLXBhY2thZ2Ugb3JnLm9wZW5mbG93LnByb3RvY29sLm1hdGNoOwotCi1pbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5FdGhUeXBlOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5JUHY0OwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5JcERzY3A7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLklwUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hY0FkZHJlc3M7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hc2tlZDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZQb3J0OwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuVTE2OwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5WbGFuUGNwOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5WbGFuVmlkOwotCi1wdWJsaWMgY2xhc3MgTWF0Y2hCdWlsZGVyVmVyMTAgaW1wbGVtZW50cyBNYXRjaEJ1aWxkZXIgewotCi0gICAgaW50ZXJmYWNlIEJ1aWxkZXJQYXJhbUhhbmRsZXI8VD4gewotICAgICAgICBwdWJsaWMgVCBnZXQoTWF0Y2hCdWlsZGVyVmVyMTAgYnVpbGRlcik7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0KE1hdGNoQnVpbGRlclZlcjEwIGJ1aWxkZXIsIFQgdmFsdWUpOwotICAgIH0KLQotICAgIC8vIHB1YmxpYyBzdGF0aWMgTWFwPE1hdGNoRmllbGQ8Pyw/PiwgQnVpbGRlclBhcmFtSGFuZGxlcjw/Pj4KLSAgICAvLyBoYW5kbGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBpbnQgd2lsZGNhcmRzOwotICAgIHByb3RlY3RlZCBPRlBvcnQgaW5wdXRQb3J0OwotICAgIHByb3RlY3RlZCBNYWNBZGRyZXNzIGRhdGFMYXllclNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgTWFjQWRkcmVzcyBkYXRhTGF5ZXJEZXN0aW5hdGlvbjsKLSAgICBwcm90ZWN0ZWQgVmxhblZpZCBkYXRhTGF5ZXJWaXJ0dWFsTGFuOwotICAgIHByb3RlY3RlZCBWbGFuUGNwIGRhdGFMYXllclZpcnR1YWxMYW5Qcmlvcml0eUNvZGVQb2ludDsKLSAgICBwcm90ZWN0ZWQgRXRoVHlwZSBkYXRhTGF5ZXJUeXBlOwotICAgIHByb3RlY3RlZCBJcERzY3AgaXBEc2NwOwotICAgIHByb3RlY3RlZCBJcFByb3RvY29sIG5ldHdvcmtQcm90b2NvbDsKLSAgICBwcm90ZWN0ZWQgSVB2NCBuZXR3b3JrU291cmNlOwotICAgIHByb3RlY3RlZCBJUHY0IG5ldHdvcmtEZXN0aW5hdGlvbjsKLSAgICBwcm90ZWN0ZWQgVTE2IHRyYW5zcG9ydFNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgVTE2IHRyYW5zcG9ydERlc3RpbmF0aW9uOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KGZpbmFsIE1hdGNoRmllbGQ8Rj4gbWF0Y2gpIHsKLSAgICAgICAgc3dpdGNoIChtYXRjaC5pZCkgewotICAgICAgICAgICAgY2FzZSBJTl9QT1JUOgotICAgICAgICAgICAgICAgIHJldHVybiAoRikgaW5wdXRQb3J0OwotICAgICAgICAgICAgY2FzZSBFVEhfU1JDOgotICAgICAgICAgICAgICAgIHJldHVybiAoRikgZGF0YUxheWVyU291cmNlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXNrZWQ8Rj4KLSAgICAgICAgICAgIGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRFeGFjdChmaW5hbCBNYXRjaEZpZWxkPEY+IG1hdGNoLCBmaW5hbCBGIHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAobWF0Y2guaWQpIHsKLSAgICAgICAgICAgIGNhc2UgSU5fUE9SVDoKLSAgICAgICAgICAgICAgICBpbnB1dFBvcnQgPSAoT0ZQb3J0KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVRIX1NSQzoKLSAgICAgICAgICAgICAgICBkYXRhTGF5ZXJTb3VyY2UgPSAoTWFjQWRkcmVzcykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyCi0gICAgICAgICAgICBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgTWFza2VkPEY+IHZhbHVlV2l0aE1hc2spIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyCi0gICAgICAgICAgICBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSwgRiBtYXNrKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciB3aWxkY2FyZChmaW5hbCBNYXRjaEZpZWxkPEY+IG1hdGNoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9GUG9ydCBnZXRJbnB1dFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dFBvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRQb3J0KGZpbmFsIE9GUG9ydCBpbnB1dFBvcnQpIHsKLSAgICAgICAgdGhpcy5pbnB1dFBvcnQgPSBpbnB1dFBvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1hY0FkZHJlc3MgZ2V0RGF0YUxheWVyU291cmNlKCkgewotICAgICAgICByZXR1cm4gZGF0YUxheWVyU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFMYXllclNvdXJjZShmaW5hbCBNYWNBZGRyZXNzIGRhdGFMYXllclNvdXJjZSkgewotICAgICAgICB0aGlzLmRhdGFMYXllclNvdXJjZSA9IGRhdGFMYXllclNvdXJjZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhmaW5hbCBNYXRjaEZpZWxkPD8+IGZpZWxkKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKGZpbmFsIE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChmaW5hbCBNYXRjaEZpZWxkPD8+IGZpZWxkKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbHlXaWxkY2FyZGVkKGZpbmFsIE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoZmluYWwgTWF0Y2hGaWVsZDw/PiBmaWVsZCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWF0Y2hCdWlsZGVyIGdldEJ1aWxkZXIoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLS8qCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxNPiB2b2lkIHNldE1hc2tlZChmaW5hbCBNYXRjaEZpZWxkPD8sIE0+IG1hdGNoLCBmaW5hbCBNIHZhbHVlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLSovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL3Rlc3QvamF2YS9UZXN0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzNzAwZC4uMDAwMDAwMAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2guTWF0Y2hCdWlsZGVyVmVyMTA7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hY0FkZHJlc3M7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GUG9ydDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBPRlBvcnQgcG9ydDsKLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYWNBZGRyZXNzIGV0aFNyYzsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBNYWNBZGRyZXNzIG1hYyA9IE1hY0FkZHJlc3Mub2YoIjAxOjAyOjAzOjA0OjA1OjA2Iik7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IoaW50IGk9MDsgaSA8IDEwMDAwMDAwOyBpKyspIHsKLSAgICAgICAgICAgIE1hdGNoQnVpbGRlclZlcjEwIG0gPSBuZXcgTWF0Y2hCdWlsZGVyVmVyMTAoKTsKLSAgICAgICAgICAgIC8vIG0uc2V0KE1hdGNoRmllbGQuSU5fUE9SVCwgT0ZQb3J0LkNPTlRST0xMRVIpOwotICAgICAgICAgICAgbS5zZXRJbnB1dFBvcnQoT0ZQb3J0LkNPTlRST0xMRVIpOwotICAgICAgICAgICAgcG9ydCA9IG0uZ2V0SW5wdXRQb3J0KCk7IC8vbS5nZXQoTWF0Y2hGaWVsZC5JTl9QT1JUKTsKLSAgICAgICAgICAgIG0uc2V0RGF0YUxheWVyU291cmNlKG1hYyk7Ci0gICAgICAgICAgICBldGhTcmMgPSBtLmdldERhdGFMYXllclNvdXJjZSgpOyAvLyhNYXRjaEZpZWxkLkVUSF9TUkMpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kLXN0YXJ0OiAiKyAoZW5kLXN0YXJ0KSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvX2ltcG9ydHMuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCmluZGV4IDUwYmExOTguLmJhYzcwNjUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCkBAIC0xMywzICsxMyw0IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LmV4Y2VwdGlvbnMuKjsKIGltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9jbGFzcy5qYXZhCmluZGV4IDE4ZGFlMmIuLmVhZTc1YmEgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9jbGFzcy5qYXZhCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9jbGFzcy5qYXZhCkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICBmaW5hbCBzdGF0aWMgV3JpdGVyIFdSSVRFUiA9IG5ldyBXcml0ZXIoKTsKICAgICBzdGF0aWMgY2xhc3MgV3JpdGVyIGltcGxlbWVudHMgT0ZNZXNzYWdlV3JpdGVyPCR7aW1wbF9jbGFzc30+IHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgd3JpdGUoQ2hhbm5lbEJ1ZmZlciBiYiwgJHtpbXBsX2NsYXNzfSBtZXNzYWdlKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKENoYW5uZWxCdWZmZXIgYmIsICR7aW1wbF9jbGFzc30gbWVzc2FnZSkgewogLy86OiBpZiBub3QgbXNnLmlzX2ZpeGVkX2xlbmd0aDoKICAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gYmIud3JpdGVySW5kZXgoKTsKIC8vOjogI2VuZApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ludGVyZmFjZS5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ludGVyZmFjZS5qYXZhCmluZGV4IGI5NjlkNTAuLjE4NmI3ODcgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9pbnRlcmZhY2UuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfaW50ZXJmYWNlLmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKIAogLy86OiBpbmNsdWRlKCJfaW1wb3J0cy5qYXZhIiwgbXNnPW1zZykKIAotcHVibGljIGludGVyZmFjZSAke21zZy5uYW1lfSAkeyJleHRlbmRzICVzIiAlIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGlmIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGVsc2UgIiJ9IHsKK3B1YmxpYyBpbnRlcmZhY2UgJHttc2cubmFtZX0gZXh0ZW5kcyBPRk9iamVjdCR7IiwgJXMiICUgbXNnLnBhcmVudF9pbnRlcmZhY2UgaWYgbXNnLnBhcmVudF9pbnRlcmZhY2UgZWxzZSAiIn17CiAvLzo6IGZvciBwcm9wIGluIG1zZy5tZW1iZXJzOgogICAgICR7cHJvcC5qYXZhX3R5cGUucHVibGljX3R5cGV9IGdldCR7cHJvcC50aXRsZV9uYW1lfSgpJHsgIiIgaWYgcHJvcC5pc191bml2ZXJzYWwgZWxzZSAiIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiJ9OwogLy86OiAjZW5kZm9yCg==