--bw0k8cvyavZtV1thLImY5bPfW58AATUc Content-type: text/plain; charset="us-ascii" Dear all The attached htm-file contains some letters between Peter Welch and myself, about Java's scheduling of objects waiting on a monitor. Cheers, Oyvind Teig, Autronica, Trondheim, Norway Oyvind.Teig@autronica.no Tel.: +47 73 58 12 68 Fax.: +47 73 91 93 20 --bw0k8cvyavZtV1thLImY5bPfW58AATUc Content-type: application/octetstring Content-transfer-encoding: base64 PEhUTUw+DQo8SEVBRD4NCjxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0i dGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KPFRJVExFPm1vbml0b3I8L1RJVExFPg0K DQo8TUVUQSBOQU1FPSJHRU5FUkFUT1IiIENPTlRFTlQ9IkludGVybmV0IEFzc2lzdGFudCBmb3Ig TWljcm9zb2Z0IFdvcmQgMi4wNHoiPg0KPC9IRUFEPg0KPEJPRFk+DQo8SDI+PEEgTkFNRT0iSW5k ZXgiPkphdmEncyBzY2hlZHVsaW5nIG9mIG9iamVjdHMgd2FpdGluZyBvbiBhDQo8L0E+PFRUPm1v bml0b3I8L1RUPjwvSDI+DQo8UD4NCiZPc2xhc2g7LlRlaWcsIDQuRmViLjE5OTgNCjxQPg0KVGhp cyBwYXBlciBpbiBhbiBleHRyYWN0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBQLkguV2VsY2gg KHBod0B1a2MuYWMudWspDQphbmQgJk9zbGFzaDt5dmluZCBUZWlnIChveXZpbmQudGVpZ0BhdXRy b25pY2Eubm8pLiANCjxQPg0KSXQgaXMgYW4gaHRtbC1maWxlIHBhcnRseSBiZWNhdXNlIHRoZSBu b3J3ZWdpYW4gY2hhcmFjdGVyIHNldA0KY2xhc2hlcyB3aXRoIGVuZ2xpc2ggY3VybHkgYnJhY2tl dHMuIFRoaXMgd2lsbCBtYWtlIHRoZSBkb2N1bWVudA0Kd2hvbGUsIHNvIHRvIHNwZWFrLg0KPFA+ DQpXZSBoYXZlIHJ1biB0d28gSmF2YSBwcm9ncmFtcyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zOiA8 Qj5Db2xsZWdlLmphdmE8L0I+DQphbmQgPEI+VGFrZV9SZXMuamF2YTwvQj4uIA0KPFA+DQpUaGUg PEEgSFJFRj0iI05ld0NvbGxlZ2UiPm5ldyBDb2xsZWdlLmphdmE8L0E+IGlzIGJhc2VkIG9uIFBl dGVyJ3MNCjxBIEhSRUY9IiNPcmlnaW5hbENvbGxlZ2VUaGVDb2RlIj5vcmlnaW5hbCBDb2xsZWdl LmphdmE8L0E+LCBhbmQNCmhhcyBub3RoaW5nIG1vcmUgdGhhbiBtYWtlLXVwIHRvIGl0OiBpdCBz dW1tYXJpemVzIGluIGEgdGFibGUNCmhvdyBtYW55IGNoaWNrZW5zIGVhY2ggcGhpbG9zb3BoZXIg ZWF0cy4gVGhpcyB0YWJsZSBpcyBwcmludGVkDQp0byBzY3JlZW4gd2hlbiB5b3UgcnVuIHRoZSBw cm9ncmFtLg0KPFA+DQo8QSBIUkVGPSIjVGFrZV9SZXMiPlRha2VfUmVzLmphdmE8L0E+IGhhcyBi ZWVuIHdyaXR0ZW4gYWZ0ZXIgUGV0ZXIncw0Kc3BlY2lmaWNhdGlvbnMgaW4gYSBjb21tZW50IGlu IDxBIEhSRUY9IiNPcmlnaW5hbENvbGxlZ2UiPm9yaWdpbmFsIENvbGxlZ2U8L0E+Lg0KQWdhaW4g bWFrZS11cCBieSAmT3NsYXNoO3l2aW5kOiBhbiBpbXBsZW1lbnRhdGlvbiBvZiBUYWtlX1Jlcw0K YWZ0ZXIgUGV0ZXIncyBzcGVjLg0KPFA+DQpJIGhhdmUgZG9uZSBzb21lIDxBIEhSRUY9IiNPeXZp bmRzTWVhc3VyZW1lbnRzIj5tZWFzdXJlbWVudHM8L0E+DQpvbiBQQ3MuIFBldGVyIGhhcyBhbHNv IGRvbmUgc29tZSBtZWFzdXJlbWVudHMsIHRoZXkgYXJlIHNjYXR0ZXJlZA0KYXJvdW5kLg0KPFA+ DQpUaGUgaW50ZXJlc3RpbmcgdGhpbmcgaXMgPEEgSFJFRj0iI1BldGVyc0NvbmNsdXNpb24iPlBl dGVyJ3MgY29uY2x1c2lvbjwvQT4NCmJlbG93Lg0KPFA+DQpIb3dldmVyLCBJIGhhdmUgc29tZSBj b21tZW50cy4gUGVyIEJyaW5jaCBIYW5zZW4gd3JpdGVzOg0KPEJMT0NLUVVPVEU+DQo8Q0lURT5B bGwgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIG9uZSBjb25kaXRpb24gb3IgYW5vdGhlciBvbiB2YXJp YWJsZTxCPg0KdjwvQj4gZW50ZXIgdGhlIHNhbWUgZXZlbnQgcXVldWUuV2hlbiBhbm90aGVyIHBy b2Nlc3MgKGhlcmUgY2FsbGVkDQp0aGUgcHJvZHVjZXIpIGNoYW5nZXMgPEI+djwvQj4gYnkgYSBz dGF0ZW1lbnQgPEI+UzI8L0I+IGluc2lkZQ0KYSBjcml0aWNhbCByZWdpb24sIGl0IGlzIHBvc3Np YmxlIHRoYXQgb25lIG9yIG1vcmUgb2YgdGhlIGNvbmRpdGlvbnMNCmV4cGVjdGVkIGJ5IHByb2Nl c3NlcyBpbiB0aGUgZXZlbnQgcXVldWUgd2lsbCBiZSBzYXRpc2ZpZWQuIFNvLA0KYWZ0ZXIgY29t cGxldGlvbiBvZiBhIGNyaXRpY2FsIHJlZ2lvbiwgYWxsIHByb2Nlc3NlcyBpbiB0aGUgZXZlbnQN CnF1ZXVlIDxCPlFlPC9CPiBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIG1haW4gcXVldWUgPEI+UXY8 L0I+IHRvDQplbmFibGUgdGhlbSB0byByZWVudGVyIHRoZWlyIGNyaXRpY2FsIHJlZ2lvbnMgYW5k IGluc3BlY3QgdGhlDQpzaGFyZWQgdmFyaWFibGUgPEI+djwvQj4gYWdhaW4uIDwvQ0lURT5bU3Ry dWN0dXJlZCBNdWx0aXByb2dyYW1taW5nLA0KQ29tbS5vZiBBQ00sIEp1bHkgMTk3MiwgcC41NzZd DQo8L0JMT0NLUVVPVEU+DQo8UD4NCkRvZXMgdGhpcyBkZXNjcmliZSBKYXZhJ3Mgd2FpdGluZyBv biBhIG1vbml0b3I6IG9uZSBxdWV1ZSBmb3INCnRoZSBvYmplY3QncyBtb25pdG9yLCBhbmQgb25l IHJlYWR5LXF1ZXVlIG9mIHRocmVhZHMgdG8gcnVuPyBJDQppbWFnaW5lIHRoYXQgdGhlIHNpdHVh dGlvbiBCcmluY2ggSGFuc2VuIGRlc2NyaWJlcyBpcyA8VFQ+bm90aWZ5QWxsPC9UVD4sDQpzaW5j ZSA8ST5hbGw8L0k+IGFyZSBtb3ZlZCBvZmYgUWUgKHBsZWFzZSBjb3JyZWN0IG1lIGhlcmUpLiBX aGVyZQ0KbGllcyB0aGUgSmF2YSBwcm9ibGVtPyBJcyBpdCBpbiB0aGUgbW9uaXRvciBxdWV1ZSBh ZG1pbmlzdHJhdGlvbg0KKHF1ZXVlLCBzdGFjaywgY29tYmluYXRpb24/KSBvciBpcyBpdCB3aGVu IHRoZSBtb25pdG9yIHF1ZXVlIGlzDQp0cmFuc2ZlcnJlZCB0byB0aGUgcmVhZHktcXVldWUgKGxp bmVhciBvciBzd2FwIG9yIGNvbWJpbmF0aW9uKT8NCjxQPg0KSG9hcmUsIGluIGhpcyBzZW1pbmFs IHBhcGVyIHN0YXRlcyB0aGF0Og0KPEJMT0NLUVVPVEU+DQo8Q0lURT4mcXVvdDtJZiBtb3JlIHRo YW4gb25lIHByb2dyYW0gaXMgd2FpdGluZyBvbiBhIGNvbmRpdGlvbiwNCndlIHBvc3R1bGF0ZSB0 aGF0IHRoZSBzaWduYWwgb3BlcmF0aW9uIHdpbGwgcmVhY3RpdmF0ZSB0aGUgbG9uZ2VzdA0Kd2Fp dGluZyBwcm9ncmFtLiBUaGlzIGdpdmVzIGEgc2ltcGxlIG5ldXRyYWwgcXVldWluZyBkaXNjaXBs aW5lDQp3aGljaCBlbnN1cmVzIHRoYXQgZXZlcnkgcHJvZ3JhbSB3aWxsIGV2ZW50dWFsbHkgZ2V0 IGl0cyB0dXJuJnF1b3Q7Lg0KPC9DSVRFPltNb25pdG9yczogQW4gT3BlcmF0aW5nIFN5c3RlbSBT dHJ1Y3R1cmluZyBDb25jZXB0LCBDb21tLm9mIEFDTSwNCjU0OS01NTcsIDE5NzRdDQo8L0JMT0NL UVVPVEU+DQo8UD4NCklzbid0IHRoaXMgPEk+cG9zdHVsYXRlPC9JPiBhIDxJPnJlcXVpcmVtZW50 PC9JPj8NCjxIMz48QSBOQU1FPSJQZXRlcnNDb25jbHVzaW9uIj48L0E+PEEgSFJFRj0iI0luZGV4 Ij5QZXRlcnMncyBjb25jbHVzaW9uPC9BPg0KPC9IMz4NCjxQUkU+DQo8Q09ERT57e3sgIFBldGVy cydzIGNvbmNsdXNpb24NCk95dmluZCwNCg0KV293ISAgWW91J3ZlIGJlZW4gd29ya2luZyBoYXJk ISENCg0KWW91ciByZXN1bHRzIHNlZW0gdG8gYmUgYXMgcHJlZGljdGVkIC4uLiBhbmQgdGhlIGNv bmNsdXNpb25zIHJlbWFpbiB0aGF0Og0KDQogIDEuIFN0YXJ2YXRpb24gaXMgaGFyZCAoaW1wb3Nz aWJsZT8pIHRvIGVsaW1pbmF0ZSBpZiB5b3Ugc3luY2hyb25pc2UNCiAgICAgdmlhIGEgc3RhY2sg LS0gZXZlbiB3b3JzZSBpZiB5b3Ugd2FpdCB2aWEgYSBzdGFjayBhcyB3ZWxsLiAgU2hhcmVkDQog ICAgIEphdmFQUCBjaGFubmVscyBjYW5ub3QgYmUgZGVmZW5kZWQgYWdhaW5zdCBzdGFydmF0aW9u IGluIHRoaXMgY2FzZS4NCg0KICAgICBUaGUgS2FmZmUgVmlydHVhbCBNYWNoaW5lIChvbiBMaW51 eCBhbmQgU3VuT1MpIHVzZXMgc3VjaCBzdGFja3MuDQoNCiAgMi4gU3RhcnZhdGlvbiAqY2FuKiBi ZSBlbGltaW5hdGVkIGlmIHlvdSBzeW5jaHJvbmlzZSBhbmQgd2FpdCB2aWEgYSBxdWV1ZS4NCiAg ICAgVGhlIG5vcm1hbCBwcm9ncmFtbWluZyBwYXR0ZXJuIGZvciBtb25pdG9ycyAod2FpdGluZyBp biBhIGxvb3AgdGhhdA0KICAgICBhbHdheXMgcmV0ZXN0cyB0aGUgd2FpdCBjb25kaXRpb24pIGRv ZXMgPFU+bm90PC9VPiBndWFyYW50ZWUgYWdhaW5zdA0KICAgICBzdGFydmF0aW9uIGFuZCBicmlu Z3MgaW4gbGl2ZWxvY2sgZGFuZ2VyIGFzIHdlbGwuICBKYXZhUFAgY2hhbm5lbHMNCiAgICAgKGlu Y2x1ZGluZyBzaGFyZWQgb25lcykgZG8gPFU+bm90PC9VPiBpbnRyb2R1Y2Ugc3RhcnZhdGlvbiBv ciBsaXZlbG9jaw0KICAgICAoYWx0aG91Z2gsIG9mIGNvdXJzZSwgdGhleSBjb3VsZCBiZSBpbnRy b2R1Y2VkIGF0IHRoZSBhcHBsaWNhdGlvbg0KICAgICBsZXZlbCkuDQoNCiAgICAgU3VuJ3MgYW5k IHRoZSBTeW1hbnRpYyBKYXZhIFZpcnR1YWwgTWFjaGluZXMgKG9uICc5NSBhbmQgU3VuT1MvU29s YXJpcykNCiAgICAgdXNlIHF1ZXVlcy4NCg0KRG8geW91IGhhdmUgYW55IHRpbWUgdG8gZm9yd2Fy ZCBvdXIgZW1haWxzIG9uIHRoaXMgdG8gamF2YS10aHJlYWRzPEEgSFJFRj0iI0luZGV4Ij4/PC9B Pg0KDQpDaGVlcnMsDQoNClBldGVyLg0KfX19ICANCg0KDQo8L0NPREU+DQo8L1BSRT4NCjxIND48 QSBOQU1FPSJPeXZpbmRzTWVhc3VyZW1lbnRzIj48L0E+PEEgSFJFRj0iI0luZGV4Ij4mT3NsYXNo O3l2aW5kJ3MgbWVhc3VyZW1lbnRzPC9BPg0KPC9IND4NCjxQUkU+DQo8Q09ERT57e3sgICZPc2xh c2g7eXZpbmQncyBjb25jbHVzaW9uDQpQZXRlcg0KM0ZlYjk4DQoNCkhlcmUgYXJlIHRoZSByZXN1 bHRzIG9mIG15IHRlc3RzOg0KDQpSdW50aW1lIEE6IFN1biAxLjEuNQ0KICAgICAgICAgICBXaW5k b3dzIDk1DQogICAgICAgICAgIChMb2FkZWQgZnJvbSBTdW4sIHByb2R1Y2VkIGJ5IFN1bi4gQWN0 dWFsbHksIG9uDQogICAgICAgICAgIFN1bidzICZxdW90O0phdmEgRGV2ZWxvcGVyJ3MgQ29tcGFu aW9uJnF1b3Q7IENEIHRoYXQgSSBvcmRlcmVkDQogICAgICAgICAgIGFuZCBwYWlkIG92ZXIgaW50 ZXJuZXQpDQoNClJ1bnRpbWUgQjogU3ltYW50ZWMgSmF2YSEgSnVzdEluVGltZSBDb21waWxlcg0K ICAgICAgICAgICBXaW5kb3dzIDk1DQogICAgICAgICAgIFZlcnNpb24gMjEwLjA2MyBmb3IgSkRL IDEuMS4zDQogICAgICAgICAgIChCb3VnaHQgZnJvbSBTeW1hbnRlYywgcGFydCBvZiAmcXVvdDtW aXN1YWwgQ2FmZSZxdW90OykNCg0KUnVudGltZSBDOiBLYWZmZSBWaXJ0dWFsIE1hY2hpbmUsIFQu Si5XaWxraW5zb24gJmFtcDsgQXNzLiBMb25kb24NCiAgICAgICAgICAgSklUIDAuOTIsIGphdmEg MS4xLjINCiAgICAgICAgICAgTGludXggb24gUEMNCg0KQ29sbGVnZQ0KICBBbHNvIGNhbGxlZCAm cXVvdDtHcmVlZHlQaGlsc29waGVyJnF1b3Q7DQogIFRoZSBncmVlZHkgcGhpbG9zb3BoZXIgZ2V0 cyBub3RoaW5nIG9yIHZlcnkgbGl0dGxlIGNvbXBhcmVkIHdpdGggdGhlIHJlc3QuDQogIFNhbWUg YmVoYXZpb3VyIGluIHJ1bnRpbWUgQSBhbmQgQi4NCiAgUnVudGltZSBDOiBUaGUgR3JlZWR5IGdl dCB2ZXJ5IG11Y2gsIG5vYm9keSBzdGFydmVzDQpUYWtlX1Jlcw0KICBDb21wZXRpbmcgZm9yIHJl c291cmNlIHdpdGhvdXQgd2FpdHMuDQogIEJvdGggQSxCIGFuZCBDIGdldCB0aGUgcmVzb3VyY2Uu DQogIFNhbWUgYmVoYXZpb3VyIGluIHJ1bnRpbWUgQSBhbmQgQi4NCiAgUnVudGltZSBDOiBCIGdl dHMgbm90aGluZyENCg0KQ29uY2x1c2lvbjoNCiAgU3VuIGFuZCBTeW1hbnRlYyBvbiBXaW45NSBo YXZlIHF1ZXVlLg0KICBLYWZmZSBvbiBMaW51eCBoYXMgc3RhY2suDQp9fX0gIA0KDQoNCjwvQ09E RT4NCjwvUFJFPg0KPEgzPjxBIE5BTUU9Ik5ld0NvbGxlZ2UiPjwvQT48QSBIUkVGPSIjSW5kZXgi Pk5ldyBDb2xsZWdlLmphdmE8L0E+DQo8L0gzPg0KPFA+DQpJIGhhdmUga2VwdCB0aGUgZmlsZSBm b2xkaW5nIGluZm9ybWF0aW9uICh3aGljaCBsZWF2ZXMgdGhlIGNvZGUNCm5vdCB2ZXJ5IHJlYWRh YmxlIGhlcmUpLg0KPFBSRT4NCjxDT0RFPnt7eyAgQ29sbGVnZS5qYXZhDQp7e3sgIENvbnN0YW50 cw0KY2xhc3MgQ29uc3RhbnRzew0KICAgcHJpdmF0ZSBpbnQgbm9PZlBoaWxvc29waGVyczsNCiAg IHByaXZhdGUgaW50IGlkT2ZHcmVlZHlQaGlsb3NvcGhlcjsNCiAgIHByaXZhdGUgaW50IG5vT2ZD aGlja2VuczsNCiAgIHByaXZhdGUgaW50IGNhbnRlZW5QbGFjZUFuZEhvbGRRdWV1ZV9tczsNCiAg IHByaXZhdGUgaW50IGNvb2tCeUNoZWZfbXM7DQogICBwcml2YXRlIGludCB0aGlua0J5SHVtYmxl UGhpbG9zb3BoZXJzX21zOw0KDQogICBwdWJsaWMgQ29uc3RhbnRzIChDb25zdGFudHMgY29uc3Rh bnRzKXsNCiAgICAgIHRoaXMubm9PZlBoaWxvc29waGVycyAgICAgICAgICAgICA9IGNvbnN0YW50 cy5nZXROb09mUGhpbG9zb3BoZXJzKCk7DQogICAgICB0aGlzLmlkT2ZHcmVlZHlQaGlsb3NvcGhl ciAgICAgICAgID0gY29uc3RhbnRzLmdldElkT2ZHcmVlZHlQaGlsb3NvcGhlcigpOw0KICAgICAg dGhpcy5ub09mQ2hpY2tlbnMgICAgICAgICAgICAgICAgID0gY29uc3RhbnRzLmdldE5vT2ZDaGlj a2VucygpOw0KICAgICAgdGhpcy5jYW50ZWVuUGxhY2VBbmRIb2xkUXVldWVfbXMgID0gY29uc3Rh bnRzLmdldENhbnRlZW5QbGFjZUFuZEhvbGRRdWV1ZV9tcygpOw0KICAgICAgdGhpcy5jb29rQnlD aGVmX21zICAgICAgICAgICAgICAgID0gY29uc3RhbnRzLmdldENvb2tCeUNoZWZfbXMoKTsNCiAg ICAgIHRoaXMudGhpbmtCeUh1bWJsZVBoaWxvc29waGVyc19tcyA9IGNvbnN0YW50cy5nZXRUaGlu a0J5SHVtYmxlUGhpbG9zb3BoZXJzX21zKCk7DQogICB9DQogICBwdWJsaWMgQ29uc3RhbnRzIChp bnQgbm9PZlBoaWxvc29waGVycywNCiAgICAgIGludCBpZE9mR3JlZWR5UGhpbG9zcGhlLA0KICAg ICAgaW50IG5vT2ZDaGlja2VucywNCiAgICAgIGludCBjYW50ZWVuUGxhY2VBbmRIb2xkUXVldWVf bXMsDQogICAgICBpbnQgY29va0J5Q2hlZl9tcywNCiAgICAgIGludCB0aGlua0J5SHVtYmxlUGhp bG9zb3BoZXJzX21zKXsNCg0KICAgICAgdGhpcy5ub09mUGhpbG9zb3BoZXJzICAgICAgICAgICAg ID0gbm9PZlBoaWxvc29waGVyczsNCiAgICAgIHRoaXMuaWRPZkdyZWVkeVBoaWxvc29waGVyICAg ICAgICAgPSBpZE9mR3JlZWR5UGhpbG9zb3BoZXI7DQogICAgICB0aGlzLm5vT2ZDaGlja2VucyAg ICAgICAgICAgICAgICAgPSBub09mQ2hpY2tlbnM7DQogICAgICB0aGlzLmNhbnRlZW5QbGFjZUFu ZEhvbGRRdWV1ZV9tcyAgPSBjYW50ZWVuUGxhY2VBbmRIb2xkUXVldWVfbXM7DQogICAgICB0aGlz LmNvb2tCeUNoZWZfbXMgICAgICAgICAgICAgICAgPSBjb29rQnlDaGVmX21zOw0KICAgICAgdGhp cy50aGlua0J5SHVtYmxlUGhpbG9zb3BoZXJzX21zID0gdGhpbmtCeUh1bWJsZVBoaWxvc29waGVy c19tczsNCiAgIH0NCiAgIHB1YmxpYyBpbnQgZ2V0Tm9PZlBoaWxvc29waGVycygpew0KICAgICAg cmV0dXJuIChub09mUGhpbG9zb3BoZXJzKTsNCiAgIH0NCiAgIHB1YmxpYyBpbnQgZ2V0SWRPZkdy ZWVkeVBoaWxvc29waGVyKCl7DQogICAgICByZXR1cm4gKGlkT2ZHcmVlZHlQaGlsb3NvcGhlcik7 DQogICB9DQogICBwdWJsaWMgaW50IGdldE5vT2ZDaGlja2Vucygpew0KICAgICAgIHJldHVybiAo bm9PZkNoaWNrZW5zKTsNCiAgIH0NCiAgIHB1YmxpYyBpbnQgZ2V0Q2FudGVlblBsYWNlQW5kSG9s ZFF1ZXVlX21zKCl7DQogICAgICAgcmV0dXJuIChjYW50ZWVuUGxhY2VBbmRIb2xkUXVldWVfbXMp Ow0KICAgfQ0KICAgcHVibGljIGludCBnZXRDb29rQnlDaGVmX21zKCl7DQogICAgICAgcmV0dXJu IChjb29rQnlDaGVmX21zKTsNCiAgIH0NCiAgIHB1YmxpYyBpbnQgZ2V0VGhpbmtCeUh1bWJsZVBo aWxvc29waGVyc19tcygpew0KICAgICAgIHJldHVybiAodGhpbmtCeUh1bWJsZVBoaWxvc29waGVy c19tcyk7DQogICB9DQp9DQp9fX0gIA0KY2xhc3MgQ2FudGVlbnsgLy8gUGFzc2l2ZQ0KICAge3t7 ICBDb21tZW50DQogICAvLw0KICAgLy8gUGhpbG9zcGhlcnMgZWF0IGNoaWNrZW5zLiAgVGhleSBx dWV1ZSB1cCBhdCB0aGUgY2FudGVlbiB0byB1c2UgdGhlIGBnZXQnDQogICAvLyBtZXRob2QuICBJ bnNpZGUgdGhlIGBnZXQnIG1ldGhvZCwgdGhleSBnZXQgc2VydmVkIHN0cmFpZ2h0IGF3YXkgc28g bG9uZw0KICAgLy8gYXMgdGhlcmUgYXJlIHNvbWUgY2hpY2tlbnMgcmVhZHkuICBPdGhlcndpc2Ug dGhleSBgd2FpdCcgb24gc3RhbmQtYnkuDQogICAvLw0KICAgLy8gVGhlIGNoZWYgY29va3MgY2hp Y2tlbnMuICBXaGVuIGhlIGhhcyBhIGJhdGNoIHJlYWR5LCBoZSBhbHNvIHF1ZXVlcyB1cA0KICAg Ly8gYXQgdGhlIGNhbnRlZW4gaW4gb3JkZXIgdG8gdXNlIHRoZSBgcHV0JyBtZXRob2QuICBUaGlz IGludm9sdmVzIHNldHRpbmcNCiAgIC8vIGRvd24gdGhlIGJhdGNoIC0tIHdoaWNoIHRha2VzIGFy b3VuZCAzIHNlY29uZHMgLS0gYW5kIGNsZWFyaW5nIHRoZSBzdGFuZC1ieQ0KICAgLy8gcXVldWUg KG9mIHBoaWxvc29waGVycyB3YWl0aW5nIGZvciBjaGlja2VucykgYnkgY2FsbGluZyBgbm90aWZ5 QWxsJy4NCiAgIC8vDQogICB7e3sgIG5vdGUgMQ0KICAgLy8NCiAgIC8vIENsZWFybHksIHRoZSBD aGVmIHNob3VsZCBub3QgaGF2ZSB0byBxdWV1ZSB1cCB3aXRoIHRoZSBQaGlsb3NvcGhlcnMgdG8N CiAgIC8vIGdldCBpbnRvIHRoZSBDYW50ZWVuLiAgVGhlIFBoaWxvc29waGVycyBzaG91bGQgaGF2 ZSB0aGVpciBvd24gcXVldWUgYW5kDQogICAvLyB0aGUgQ2hlZiBzaG91bGQgb25seSBoYXZlIHRv IGNvbnRlbmQgd2l0aCBvbmUgUGhpbG9zcGhlciB3aGVuIGRlYWxpbmcgd2l0aA0KICAgLy8gdGhl IGNoaWNrZW5zIGluIHRoZSBjYW50ZWVuLiAgU3VjaCBhIHNlcGFyYXRlIHF1ZXVlIGZvciB0aGUg UGhpbG9zb3BoZXJzIGlzDQogICAvLyBqdXN0IGxpa2UgdGhlIHNlcGVyYXRlIHF1ZXVlcyBmb3Ig cmVhZGVycy93cml0ZXJzIHRoYXQgd2UgbmVlZGVkIGZvciB0aGUNCiAgIC8vIHNlY3VyZWx5IHNo YXJlZCBDaGFubmVsIG9yIEJ1ZmZlciBjbGFzcy4gIEhvd2V2ZXIsIHdlIGFyZSBtb2RlbGxpbmcg dGhpcw0KICAgLy8gQ2FudGVlbiBvbiB0aGUgQ3ViYnlIb2xlIGNsYXNzICh0byBzaG93IHRoZSBk YW5nZXIgb2Ygc3RhcnZhdGlvbiBpdCBjb250YWlucykNCiAgIC8vIGFuZCBDdWJieUhvbGUgaGFz IGl0cyBxdWV1ZSBzaGFyZWQgYnkgYm90aCByZWFkZXJzIGFuZCB3cml0ZXJzLg0KICAgLy8NCiAg IH19fSAgDQogICB7e3sgIG5vdGUgMg0KICAgLy8NCiAgIC8vIEFsbCBtZXRob2RzLCBhcGFydCBm cm9tIHRoZSBgcnVuJyBtZXRob2QsIGFyZSBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSB0aHJlYWQN CiAgIC8vIG9mIGNvbnRyb2wgb2YgdGhlaXIgY2FsbGluZyBvYmplY3RzLiAgVGhpcyBpcyBwYXJ0 aWN1bGFybHkgY2xlYXIgaGVyZSwgd2hlcmUNCiAgIC8vIHdlIHNlZSB0aGVtIHNwZWFraW5nICph cyogdGhvc2UgY2FsbGluZyBvYmplY3RzLiAgRm9yIGluc3RhbmNlLCB0aGUgYGdldCcNCiAgIC8v IG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSBsaWZlIG9mIHRoZSBjYWxsaW5nIFBoaWxvc29waGVyIGFu ZCBgcHV0JyBpcyBwYXJ0IG9mDQogICAvLyB0aGUgbGlmZSBvZiB0aGUgQ2hlZi4gIFNvLCB0aGlz IENhbnRlZW4gJnF1b3Q7b2JqZWN0JnF1b3Q7IGhhcyBiaXRzIG9mIFBoaWxvc29waGVyLQ0KICAg Ly8gYWxnb3JpdGhtIGFuZCBiaXRzIG9mIENoZWYtYWxnb3JpdGhtIGZvciBpdHMgbWV0aG9kcyAt LSBhIHNvbWV3aGF0IGNvbmZ1c2VkDQogICAvLyBzZXQgb2Ygcm9sZXMgZm9yIHNvbWV0aGluZyB0 aGF0J3Mgc3VwcG9zZWQgdG8gYmUgYSBDYW50ZWVuLiAgVGhlcmUncyBub3RoaW5nDQogICAvLyBp biB0aGVzZSBtZXRob2RzIHRoYXQgYXJlIG9yaWVudGVkIHRvd2FyZHMgdGhlIGxpZmUgb2YgdGhl IENhbnRlZW4uDQogICAvLw0KICAgLy8gU28sIGFsb25nc2lkZSB0aGUgc2VtYW50aWMgaW1wcmVj aXNpb24gb2YgYHdhaXQvbm90aWZ5JyBhbmQgYWxvbmdzaWRlIHRoZQ0KICAgLy8gbm9uLWNvbXBv c2l0aW9uYWwgKG9yLCBpZiB5b3UgcHJlZmVyLCBub24tcmVmZXJlbnRpYWxseS10cmFuc3BhcmVu dCkgc2VtYW50aWNzDQogICAvLyBvZiBtZXRob2RzIGluIGdlbmVyYWwsIHdlIGhhdmUgdG8gY29t ZSB0byB0ZXJtcyB3aXRoIHRoZSBpZGVhIHRoYXQgbm8gbWV0aG9kcw0KICAgLy8gKGFwYXJ0IGZy b20gYHJ1bicpIGFyZSBvcmllbnRlZCB0b3dhcmRzIHRoZSAmcXVvdDtvYmplY3RzJnF1b3Q7IG9m IHdoaWNoIHRoZXkgYXJlDQogICAvLyBzdXBwb3NlZCB0byBiZSBhIHBhcnQuICBTbyBtdWNoIGZv ciAmcXVvdDtvYmplY3Qtb3JpZW50YXRpb24mcXVvdDsgaW4gdGhlIGZvcm1hbCwgYW5kDQogICAv LyBxdWl0ZSBhcmJpdHJhcnksIGRlZmluaXRpb24gb2YgdGhlIHRlcm0hICBJIGJlbGlldmUgdGhh dCB0aGUgZmlyc3QgdHdvDQogICAvLyBwcm9ibGVtcyByZWZlcmVuY2VkIGluIHRoaXMgcGFyYWdy YXBoIGFyZSBhIGRpcmVjdCBjb25zZXF1ZW5jZSBvZiB0aGUgdGhpcmQuDQogICAvLyBUaGVzZSBw cm9ibGVtcyBhcmUgbm90IHNwZWNpYWwgdG8gdGhpcyBDYW50ZWVuLCBidXQgYXJlIHVuaXZlcnNh bCBhY3Jvc3MNCiAgIC8vIGFsbCBwYXNzaXZlIG9iamVjdHMuDQogICAvLw0KICAgLy8gVGhlIENh bnRlZW4gc2hvdWxkLCBvZiBjb3Vyc2UsIGJlIGltcGxlbWVudGVkIGFzIGFuIGFjdGl2ZSBvYmpl Y3QgY29ubmVjdGVkDQogICAvLyB0byB0aGUgcGhpbG9zb3BoZXJzIGFuZCB0aGUgY2hlZiB2aWEg c2ltcGxlIGNoYW5uZWxzIG9yIGJ1ZmZlcnMuICBUaGVuLCB3ZQ0KICAgLy8gd291bGRuJ3QgaGF2 ZSB0aGUgcHJvYmxlbXMgYXJpc2luZyBmcm9tIHRoaXMgZGVzaWduLiAgVGhpcyBpcyBsZWZ0IGFz IGFuDQogICAvLyBleGVyY2lzZSENCiAgIC8vDQogICB9fX0gIA0KICAgfX19ICANCiAgIHt7eyAg RGVjbGFyYXRpb25zDQogICBwcml2YXRlIGludCBub09mQ2hpY2tlbnMgPSAwOw0KICAgcHJpdmF0 ZSBDb25zdGFudHMgY29uc3RhbnRzOw0KICAgcHJpdmF0ZSBpbnQgbm9PZk1lYWxzW107DQogICBw cml2YXRlIGJvb2xlYW4gcmVwb3J0ID0gdHJ1ZTsNCiAgIH19fSAgDQogICB7e3sgIENhbnRlZW4N CiAgIHB1YmxpYyBDYW50ZWVuIChDb25zdGFudHMgY29uc3RhbnRzKXsNCiAgICAgIHRoaXMuY29u c3RhbnRzID0gbmV3IENvbnN0YW50cyhjb25zdGFudHMpOw0KICAgICAgbm9PZk1lYWxzID0gbmV3 IGludFtjb25zdGFudHMuZ2V0Tm9PZlBoaWxvc29waGVycygpXTsNCg0KICAgICAgZm9yIChpbnQg aSA9IDA7IGkgJmx0OyBjb25zdGFudHMuZ2V0Tm9PZlBoaWxvc29waGVycygpOyBpKyspew0KICAg ICAgICAgbm9PZk1lYWxzW2ldID0gMDsNCiAgICAgIH0NCiAgIH0NCiAgIH19fSAgDQogICB7e3sg IHJlcG9ydA0KICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlcG9ydCAoYm9vbGVhbiByZXBv cnQpew0KICAgICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7DQogICAgICBpZiAocmVwb3J0ID09IGZh bHNlKXsNCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbg0KICAgICAgICAgICAgKCZxdW90O1xu V0lMTCBOT1cgUkVQT1JUIE5VTUJFUiBPRiBFQVRFTiBDSElDS0VOUyBGT1IgRUFDSCBQSElMT1NP UEhFUiZxdW90OyArDQogICAgICAgICAgICAgJnF1b3Q7XG5TaW5jZSBwcmludGluZyBpcyBtb3Jl IHJhcmUsIHRoaXMgbWF5IGFmZmVjdCBzY2hlZHVsaW5nIC4uLiAmcXVvdDsgKw0KICAgICAgICAg ICAgICZxdW90O1xuJnF1b3Q7KTsNCiAgICAgIH0NCiAgIH0NCiAgIH19fSAgDQogICB7e3sgIENh bnRlZW4gZ2V0IChjb250YWlucyB0aGUgb25seSAmcXVvdDt3YWl0JnF1b3Q7KQ0KICAgcHVibGlj IHN5bmNocm9uaXplZCBpbnQgZ2V0IChpbnQgaWQpew0KICAgICAgd2hpbGUgKG5vT2ZDaGlja2Vu cyA9PSAwKXsNCiAgICAgICAgIGlmIChyZXBvcnQpew0KICAgICAgICAgICAgLy8gbW9hbg0KICAg ICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDsoJnF1b3Q7ICsgU3lzdGVtLmN1cnJl bnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspICZxdW90OyArDQogICAgICAgICAgICAgICAmcXVvdDtQ aGlsICZxdW90OyArIGlkICsgJnF1b3Q7OiB3b3QsIG5vIGNoaWNrZW5zPyBJJ2xsIHdhaXQgLi4u IFdBSVRJTkcgLi4uJnF1b3Q7KTsNCiAgICAgICAgIH0NCg0KICAgICAgICAgLy8gZ2V0IG9uIHN0 YW5kLWJ5IHF1ZXVlLCBsZXR0aW5nIGluIHRoZSBuZXh0IHBoaWxvc29waGVyIChvciBjaGVmKQ0K ICAgICAgICAgLy8gRmlyc3QgYW5kIG9ubHkgJnF1b3Q7d2FpdCZxdW90OyBpcyBoZXJlIGluIENh bnRlZW4uZ2V0DQogICAgICAgICB0cnkge3dhaXQoKTt9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2Vw dGlvbiBlKXt9DQoNCiAgICAgIH0NCiAgICAgIGlmIChyZXBvcnQpew0KICAgICAgICAgLy8gdGhh bmtzDQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBTeXN0ZW0u Y3VycmVudFRpbWVNaWxsaXMoKSArICZxdW90OykgJnF1b3Q7ICsNCiAgICAgICAgICAgICZxdW90 O1BoaWwgJnF1b3Q7ICsgaWQgKyAmcXVvdDs6IHRob3NlIGNoaWNrZW5zIGxvb2sgZ29vZCAuLi4g b25lIHBsZWFzZSAuLi4gJnF1b3Q7KTsNCiAgICAgIH0NCiAgICAgIG5vT2ZDaGlja2VucyA9IG5v T2ZDaGlja2VucyAtIDE7DQoNCiAgICAgIG5vT2ZNZWFsc1tpZF0rKzsNCiAgICAgIFN0cmluZ0J1 ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogICAgICBzdHJpbmdCdWZm ZXIuYXBwZW5kKCZxdW90OygmcXVvdDsgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICZx dW90OykgJnF1b3Q7KTsNCg0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBjb25zdGFudHMu Z2V0Tm9PZlBoaWxvc29waGVycygpOyBpKyspew0KICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVu ZCAobm9PZk1lYWxzW2ldICsgJnF1b3Q7ICZxdW90Oyk7DQogICAgICB9DQogICAgICBpZiAocmVw b3J0ID09IGZhbHNlKXsNCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nQnVmZmVy LnRvU3RyaW5nKCkpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIDE7DQogICB9DQogICB9fX0gIA0K ICAge3t7ICBDYW50ZWVuIHB1dCAoY29udGFpbnMgb25seSAmcXVvdDtub3RpZnkmcXVvdDsgb3Ig JnF1b3Q7bm90aWZ5QWxsJnF1b3Q7KQ0KICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dCAo aW50IG5vT2ZDaGlja2Vuc1RvQWRkKXsNCiAgICAgIC8vIGJyaW5nIGluIHRoZSB0cmF5DQogICAg ICBpZiAocmVwb3J0KXsNCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZxdW90 OyArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgJnF1b3Q7KSAmcXVvdDsgKw0KICAgICAg ICAgICAgJnF1b3Q7Q2hlZiAgOiBvdWNoIC4uLiBtYWtlIHJvb20gLi4uIHRoaXMgZGlzaCBpcyB2 ZXJ5IGhvdCAuLi4gJnF1b3Q7KTsNCiAgICAgIH0NCg0KICAgICAgLy8gdGFrZSAzIHNlY29uZHMg dG8gc2V0IGRvd24gdGhlIGRpc2ggKG1lYW53aGlsZSBhIHF1ZXVlIG1heSBiZSBkZXZlbG9waW5n KQ0KICAgICAgdHJ5IHtUaHJlYWQuc2xlZXAoY29uc3RhbnRzLmdldENhbnRlZW5QbGFjZUFuZEhv bGRRdWV1ZV9tcygpKTt9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXt9DQoNCiAgICAg IG5vT2ZDaGlja2VucyA9IG5vT2ZDaGlja2VucyArIG5vT2ZDaGlja2Vuc1RvQWRkOw0KICAgICAg aWYgKHJlcG9ydCl7DQogICAgICAgICAvLyBhbm5vdW5jZSBhcnJpdmFsIG9mIG1vcmUgY2hpY2tl bnMNCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZxdW90OyArIFN5c3RlbS5j dXJyZW50VGltZU1pbGxpcygpICsgJnF1b3Q7KSAmcXVvdDsgKw0KICAgICAgICAgICAgJnF1b3Q7 Q2hlZiAgOiBtb3JlIGNoaWNrZW5zIC4uLiAmcXVvdDsgKyBub09mQ2hpY2tlbnMgKyAmcXVvdDsg bm93IGF2YWlsYWJsZSAuLi4gTk9USUZZSU5HIC4uLiZxdW90Oyk7DQogICAgICB9DQoNCiAgICAg IC8vIFB1dCBhbnkgd2FpdGluZyBwaGlsb3NvcGhlcnMgYmFjayBvbiB0aGUgbWFpbiBxdWV1ZQ0K ICAgICAgLy8gRmlyc3QgYW5kIG9ubHkgbm90aWZ5IG9yIG5vdGlmeUFsbCBpcyBoZXJlIGluIENh bnRlZW4ucHV0DQogICAgICBub3RpZnlBbGwoKTsNCiAgIH0NCiAgIH19fSAgDQp9DQpjbGFzcyBD aGVmIGV4dGVuZHMgVGhyZWFkeyAvLyBBY3RpdmUNCiAgIHt7eyAgQ29tbWVudA0KICAgLy8NCiAg IC8vIEEgY2hlZiBpcyBhbiBhY3RpdmUgb2JqZWN0LiAgSGUgY29va3MgY2hpY2tlbnMgaW4gYmF0 Y2hlcyBvZiBmb3VyIC0tIHRha2luZw0KICAgLy8gYXJvdW5kIDIgc2Vjb25kcyBwZXIgYmF0Y2gg LS0gYW5kIHRoZW4gdGFrZXMgdGhlbiB0byB0aGUgY2FudGVlbi4NCiAgIC8vDQogICAvLyBUaGlz IGN5Y2xlIGNvbnRpbnVlcyBpbmRlZmluaXRlbHkuDQogICB9fX0gIA0KICAge3t7ICBEZWNsYXJh dGlvbnMNCiAgIHByaXZhdGUgQ2FudGVlbiBjYW50ZWVuOw0KICAgcHJpdmF0ZSBDb25zdGFudHMg Y29uc3RhbnRzOw0KICAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydCA9IHRydWU7DQogICB9fX0gIA0K ICAge3t7ICBDaGVmDQogICBwdWJsaWMgQ2hlZiAoQ2FudGVlbiBjYW50ZWVuLCBDb25zdGFudHMg Y29uc3RhbnRzKXsNCiAgICAgIHRoaXMuY2FudGVlbiA9IGNhbnRlZW47DQogICAgICB0aGlzLmNv bnN0YW50cyA9IG5ldyBDb25zdGFudHMoY29uc3RhbnRzKTsNCiAgICAgIHN0YXJ0KCk7DQogICB9 DQogICB9fX0gIA0KICAge3t7ICByZXBvcnQNCiAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBy ZXBvcnQgKGJvb2xlYW4gcmVwb3J0KXsNCiAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0Ow0KICAg fQ0KICAgfX19ICANCiAgIHt7eyAgcnVuDQogICBwdWJsaWMgdm9pZCBydW4oKXsNCiAgICAgIGlm IChyZXBvcnQpew0KICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDsoJnF1b3Q7ICsg U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspICZxdW90OyArDQogICAgICAgICAg ICAmcXVvdDtDaGVmICA6IHN0YXJ0aW5nIC4uLiAmcXVvdDspOw0KICAgICAgfQ0KICAgICAgd2hp bGUgKHRydWUpew0KICAgICAgICAgLy8gY29vayA0IGNoaWNrZW5zDQogICAgICAgICBpZiAocmVw b3J0KXsNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZxdW90OyArIFN5 c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgJnF1b3Q7KSAmcXVvdDsgKw0KICAgICAgICAgICAg ICAgJnF1b3Q7Q2hlZiAgOiBjb29raW5nIC4uLiAmcXVvdDspOw0KICAgICAgICAgfQ0KDQogICAg ICAgICAvLyBjb29rIGZvciBhcm91bmQgMiBzZWNvbmRzDQogICAgICAgICB0cnkge1RocmVhZC5z bGVlcChjb25zdGFudHMuZ2V0Q29va0J5Q2hlZl9tcygpKTt9IGNhdGNoIChJbnRlcnJ1cHRlZEV4 Y2VwdGlvbiBlKXt9DQoNCiAgICAgICAgIGlmIChyZXBvcnQpew0KICAgICAgICAgICAgU3lzdGVt Lm91dC5wcmludGxuICgmcXVvdDsoJnF1b3Q7ICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkg KyAmcXVvdDspICZxdW90OyArDQogICAgICAgICAgICAgICAmcXVvdDtDaGVmICA6ICZxdW90OyAr IGNvbnN0YW50cy5nZXROb09mQ2hpY2tlbnMoKSArICZxdW90OyBjaGlja2VucywgcmVhZHktdG8t Z28gLi4uICZxdW90Oyk7DQogICAgICAgICB9DQogICAgICAgICBjYW50ZWVuLnB1dChjb25zdGFu dHMuZ2V0Tm9PZkNoaWNrZW5zKCkpOw0KICAgICAgfQ0KICAgfQ0KICAgfX19ICANCn0NCmNsYXNz IFBoaWwgZXh0ZW5kcyBUaHJlYWR7IC8vIEFjdGl2ZQ0KICAge3t7ICBDb21tZW50DQogICAvLw0K ICAgLy8gQSBwaGlsb3NvcGhlciB0aGlua3MgZm9yIGEgd2hpbGUgLS0gYXJvdW5kIDMgc2Vjb25k cyAtLSBhbmQgdGhlbiBnb2VzIHRvIHRoZQ0KICAgLy8gY2FudGVlbiBmb3IgZm9vZCwgY29uc3Vt aW5nIHdoYXQgaGUgZ2V0cyBzdHJhaWdodCBhd2F5LiAgIFRoaXMgY3ljbGUgY29udGludWVzDQog ICAvLyBpbmRlZmluaXRlbHkuDQogICAvLw0KICAgLy8gRXhjZXB0LCB0aGF0IGlzLCBmb3IgcGhp bG9zb3BoZXIgMCAuLi4gIHdobyByZWZ1c2VzIHRvIHRoaW5rIGFuZCBqdXN0IGtlZXBzDQogICAv LyBnb2luZyB0byB0aGUgY2FudGVlbi4gIEhlIHdpbGwgZ2V0IGhpcyBjb21lLXVwcGFuY2Ugc2hv cnRseS4NCiAgIC8vDQogICB9fX0gIA0KICAge3t7ICBEZWNsYXJhdGlvbnMNCiAgIHByaXZhdGUg aW50IGlkOw0KICAgcHJpdmF0ZSBDYW50ZWVuIGNhbnRlZW47DQogICBwcml2YXRlIGJvb2xlYW4g cmVwb3J0ID0gdHJ1ZTsNCiAgIHByaXZhdGUgQ29uc3RhbnRzIGNvbnN0YW50czsNCiAgIH19fSAg DQogICB7e3sgIFBoaWwNCiAgIHB1YmxpYyBQaGlsIChpbnQgaWQsIENhbnRlZW4gY2FudGVlbiwg Q29uc3RhbnRzIGNvbnN0YW50cyl7DQogICAgICB0aGlzLmlkID0gaWQ7DQogICAgICB0aGlzLmNh bnRlZW4gPSBjYW50ZWVuOw0KICAgICAgdGhpcy5jb25zdGFudHMgPSBuZXcgQ29uc3RhbnRzKGNv bnN0YW50cyk7DQogICAgICBzdGFydCgpOw0KICAgfQ0KICAgfX19ICANCiAgIHt7eyAgcmVwb3J0 DQogICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVwb3J0IChib29sZWFuIHJlcG9ydCl7DQog ICAgICB0aGlzLnJlcG9ydCA9IHJlcG9ydDsNCiAgIH0NCiAgIH19fSAgDQogICB7e3sgIHJ1bg0K ICAgcHVibGljIHZvaWQgcnVuKCl7DQogICAgICBpbnQgY2hpY2tlbjsNCg0KICAgICAgaWYgKHJl cG9ydCl7DQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBTeXN0 ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICZxdW90OykgJnF1b3Q7ICsNCiAgICAgICAgICAgICZx dW90O1BoaWwgJnF1b3Q7ICsgaWQgKyAmcXVvdDs6IHN0YXJ0aW5nIC4uLiZxdW90Oyk7DQogICAg ICB9DQogICAgICB3aGlsZSAodHJ1ZSl7DQogICAgICAgICAvLyBldmVyeW9uZSwgYmFyIHRoZSBn cmVlZHkgcGhpbG9zb3BoZXIgKDApLCBoYXMgYSBsaXR0bGUgdGhpbmsNCiAgICAgICAgIGlmIChp ZCAhPSBjb25zdGFudHMuZ2V0SWRPZkdyZWVkeVBoaWxvc29waGVyKCkpew0KICAgICAgICAgICAg Ly8gdGhpbmsgZm9yIGFyb3VuZCAzIHNlY29uZHMNCiAgICAgICAgICAgIHRyeSB7VGhyZWFkLnNs ZWVwKGNvbnN0YW50cy5nZXRUaGlua0J5SHVtYmxlUGhpbG9zb3BoZXJzX21zKCkpO30gY2F0Y2gg KEludGVycnVwdGVkRXhjZXB0aW9uIGUpe30NCiAgICAgICAgIH0NCiAgICAgICAgIGlmIChyZXBv cnQpew0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDsoJnF1b3Q7ICsgU3lz dGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspICZxdW90OyArDQogICAgICAgICAgICAg ICAmcXVvdDtQaGlsICZxdW90OyArIGlkICsgJnF1b3Q7OiBnb3R0YSBlYXQgLi4uICZxdW90Oyk7 DQogICAgICAgICB9DQoNCiAgICAgICAgIC8vIHdhbnQgY2hpY2tlbg0KICAgICAgICAgY2hpY2tl biA9IGNhbnRlZW4uZ2V0KGlkKTsNCg0KICAgICAgICAgLy8gY29uc3VtZSBjaGlja2VuDQogICAg ICAgICBpZiAocmVwb3J0KXsNCiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDso JnF1b3Q7ICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspJnF1b3Q7ICsNCiAg ICAgICAgICAgICAgJnF1b3Q7IFBoaWwgJnF1b3Q7ICsgaWQgKyAmcXVvdDs6IG1tbSAuLi4gdGhh dCdzIGdvb2QgLi4uICZxdW90Oyk7DQogICAgICAgICB9DQoNCiAgICAgIH0NCiAgIH0NCiAgIH19 fSAgDQp9DQpwdWJsaWMgY2xhc3MgQ29sbGVnZXsNCiAgIHt7eyAgQ29tbWVudA0KICAgLy8NCiAg IC8vIFRoZSBDb2xsZWdlIGNvbnNpc3RzIG9mIDUgUGhpbG9zb3BoZXJzLCBhIENoZWYgYW5kIHRo ZSBDYW50ZWVuLiAgVGhlIENoZWYgYW5kDQogICAvLyB0aGUgUGhpbG9zb3BoZXJzIGFyZSAmcXVv dDthY3RpdmUmcXVvdDsgb2JqZWN0cy4gIFRoZSBDYW50ZWVuIGlzIGEgJnF1b3Q7cGFzc2l2ZSZx dW90OyBvYmplY3QNCiAgIC8vIHRocm91Z2ggd2hpY2ggdGhlIFBoaWxvc29waGVycyBhbmQgdGhl IENoZWYgaGF2ZSB0byBpbnRlcmFjdC4NCiAgIC8vDQogICAvLyBUaGUgQ2FudGVlbiBpcyBpbXBs ZW1lbnRlZCBpbiB0aGUgc3R5bGUgb2YgdGhlIEN1YmJ5SG9sZSBleGFtcGxlIGZyb20gU3VuJ3MN CiAgIC8vIEphdmEgVHV0b3JpYWwuICBBcyBzdWNoLCBpdCBleHBvc2VzIGVhY2ggUGhpbG9zb3Bo ZXIgdG8gdGhlIGRhbmdlciBvZg0KICAgLy8gc3RhcnZhdGlvbiAoYnkgaW5maW5pdGUgb3ZlcnRh a2luZyBieSBmZWxsb3cgUGhpbG9zb3BoZXJzKS4gIFNhZGx5LCB0aGlzDQogICAvLyBkb2VzIGhh cHBlbiB3aXRoIHRoZSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZXMgb2YgdGltaW5nIHNldCB1cCBp biB0aGlzDQogICAvLyBkZW1vbnN0cmF0aW9uLiAgSGFwcGlseSwgaXQncyB0aGUgZ3JlZWR5IFBo aWxvc29waGVyIHRoYXQgc3RhcnZlcyAtLSBoZQ0KICAgLy8gbmV2ZXIgZXZlbiBnZXRzIG9uZSBt ZWFsLCBkZXNwaXRlIGJlaW5nIGluIHRoZSBDYW50ZWVuIHRoZSB3aG9sZSB0aW1lIQ0KICAgLy8N CiAgIH19fSAgDQogICB7e3sgIG1haW4NCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJp bmcgYXJndltdKXsNCg0KICAgICAgaW50IG5vT2ZQaGlsb3NvcGhlcnMgICAgICAgICAgICAgID0g IDU7DQogICAgICBpbnQgaWRPZkdyZWVkeVBoaWxvc29waGVyICAgICAgICAgPSAgMDsNCiAgICAg IGludCBub09mQ2hpY2tlbnMgICAgICAgICAgICAgICAgICA9ICA0Ow0KICAgICAgaW50IGNhbnRl ZW5QbGFjZUFuZEhvbGRRdWV1ZV9zZWMgID0gIDM7DQogICAgICBpbnQgY29va0J5Q2hlZl9zZWMg ICAgICAgICAgICAgICAgPSAgMjsNCiAgICAgIGludCB0aGlua0J5SHVtYmxlUGhpbG9zb3BoZXJz X3NlYyA9ICAzOw0KICAgICAgaW50IHJlcG9ydE9mZl9zZWMgICAgICAgICAgICAgICAgID0gMzA7 DQogICAgICBpbnQgayA9IDEwMDA7DQoNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7 JnF1b3Q7KTsNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7QW5hbHlzZXIgb2Ygc2No ZWR1bGluZyBvZiBvYmplY3RzIHdhaXRpbmcgb24gbW9uaXRvciZxdW90Oyk7DQogICAgICBTeXN0 ZW0ub3V0LnByaW50bG4gKCZxdW90O0NvbGxlZ2UgdmVyc2lvbiAyLjAgLSAzMC5KYW4uMTk5OCZx dW90Oyk7DQogICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OyAgSWRlYSBhbmQgY29kZWQg YnkgUGV0ZXIgV2VsY2gsIFVuaXZlcnNpdHkgb2YgS2VudCBhdCBDYW50ZXJidXJ5LCBVSyZxdW90 Oyk7DQogICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OyAgTWFrZS11cCBieSBPeXZpbmQg VGVpZywgQXV0cm9uaWNhLCBOb3J3YXkmcXVvdDspOw0KICAgICAgU3lzdGVtLm91dC5wcmludGxu ICgmcXVvdDsmcXVvdDspOw0KICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDsgIG5vT2ZQ aGlsb3NvcGhlcnM6ICAgICAgICAgICAgICAmcXVvdDsgKyBub09mUGhpbG9zb3BoZXJzKTsNCiAg ICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7ICBpZE9mR3JlZWR5UGhpbG9zb3BoZXI6ICAg ICAgICAgJnF1b3Q7ICsgaWRPZkdyZWVkeVBoaWxvc29waGVyKTsNCiAgICAgIFN5c3RlbS5vdXQu cHJpbnRsbiAoJnF1b3Q7ICBub09mQ2hpY2tlbnM6ICAgICAgICAgICAgICAgICAgJnF1b3Q7ICsg bm9PZkNoaWNrZW5zKTsNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7ICBjYW50ZWVu UGxhY2VBbmRIb2xkUXVldWVfc2VjOiAgJnF1b3Q7ICsgY2FudGVlblBsYWNlQW5kSG9sZFF1ZXVl X3NlYyk7DQogICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OyAgY29va0J5Q2hlZl9zZWM6 ICAgICAgICAgICAgICAgICZxdW90OyArIGNvb2tCeUNoZWZfc2VjKTsNCiAgICAgIFN5c3RlbS5v dXQucHJpbnRsbiAoJnF1b3Q7ICB0aGlua0J5SHVtYmxlUGhpbG9zb3BoZXJzX3NlYzogJnF1b3Q7 ICsgdGhpbmtCeUh1bWJsZVBoaWxvc29waGVyc19zZWMpOw0KICAgICAgU3lzdGVtLm91dC5wcmlu dGxuICgmcXVvdDsgIHJlcG9ydE9mZl9zZWM6ICAgICAgICAgICAgICAgICAmcXVvdDsgKyByZXBv cnRPZmZfc2VjKTsNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7JnF1b3Q7KTsNCiAg ICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7ICBUZXJtaW5hdGUgd2l0aCBDdHJsLUMmcXVv dDspOw0KICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVvdDsmcXVvdDspOw0KDQogICAgICB0 cnkge1RocmVhZC5zbGVlcCgxMCAqIGspO30gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUp e30NCg0KICAgICAgQ29uc3RhbnRzIGNvbnN0YW50cyA9DQogICAgICAgICBuZXcgQ29uc3RhbnRz ICgNCiAgICAgICAgICAgIG5vT2ZQaGlsb3NvcGhlcnMsDQogICAgICAgICAgICBpZE9mR3JlZWR5 UGhpbG9zb3BoZXIsDQogICAgICAgICAgICBub09mQ2hpY2tlbnMsDQogICAgICAgICAgICBjYW50 ZWVuUGxhY2VBbmRIb2xkUXVldWVfc2VjICogaywNCiAgICAgICAgICAgIGNvb2tCeUNoZWZfc2Vj ICogaywNCiAgICAgICAgICAgIHRoaW5rQnlIdW1ibGVQaGlsb3NvcGhlcnNfc2VjICogayk7DQoN CiAgICAgIENhbnRlZW4gY2FudGVlbiA9IG5ldyBDYW50ZWVuKGNvbnN0YW50cyk7DQogICAgICBD aGVmIGNoZWYgPSBuZXcgQ2hlZihjYW50ZWVuLCBjb25zdGFudHMpOw0KICAgICAgUGhpbFtdIHBo aWwgPSBuZXcgUGhpbFtub09mUGhpbG9zb3BoZXJzXTsNCg0KICAgICAgZm9yIChpbnQgaSA9IDA7 IGkgJmx0OyBub09mUGhpbG9zb3BoZXJzOyBpKyspew0KICAgICAgICAgcGhpbFtpXSA9IG5ldyBQ aGlsIChpLCBjYW50ZWVuLCBjb25zdGFudHMpOw0KICAgICAgfQ0KICAgICAgdHJ5IHtUaHJlYWQu c2xlZXAocmVwb3J0T2ZmX3NlYyAqIGspO30gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUp e30NCg0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBub09mUGhpbG9zb3BoZXJzOyBpKysp ew0KICAgICAgICAgcGhpbFtpXS5yZXBvcnQoZmFsc2UpOw0KICAgICAgfQ0KICAgICAgY2FudGVl bi5yZXBvcnQoZmFsc2UpOw0KICAgICAgY2hlZi5yZXBvcnQoZmFsc2UpOw0KICAgfQ0KICAgfX19 ICANCn0NCn19fSAgDQoNCg0KPC9DT0RFPg0KPC9QUkU+DQo8SDM+PEEgTkFNRT0iVGFrZV9SZXMi PjwvQT48QSBIUkVGPSIjSW5kZXgiPlRha2VfUmVzLmphdmE8L0E+DQo8L0gzPg0KPFBSRT4NCjxD T0RFPnt7eyAgVGFrZV9SZXMuamF2YQ0KLy8gUHJvcG9zZWQgYnkgUGV0ZXIgV2VsY2ggaW4gZS1t YWlsIHRvIG1lIG9uIDI5SmFuOTgNCi8vIFByb2dyYW1tZWQgYnkgJk9zbGFzaDt5dmluZCBUZWln DQoNCi8vIEJvdGggQSxCIGFuZCBDIGdldCB0aGUgcmVzb3VyY2UNCg0KLy8gV2UgaGF2ZSB0aGUg c2FtZSBiZWhhdmlvdXIgd2l0aA0KLy8gMS4gU3ltYW50ZWMgSmF2YSEgSnVzdEluVGltZSBDb21w aWxlciBWZXJzaW9uIDIxMC4wNjMgZm9yIEpESyAxLjEuMw0KLy8gICAgQ29weXJpZ2h0IChDKSAx OTk2LTk3IFN5bWFudGVjIENvcnBvcmF0aW9uDQovLyAgICBSdW5uaW5nIG9uIFdpbmRvdy05NQ0K Ly8gMi4gSlZNIDEuMS41DQovLyAgICBSdW5uaW5nIG9uIFdpbmRvdy05NQ0KDQp7e3sgIFJlc291 cmNlDQpjbGFzcyBSZXNvdXJjZSB7DQogICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdGFrZSAo U3RyaW5nIGlkKSB7DQogICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90O1VzZXIgJnF1b3Q7 ICsgaWQgKyAmcXVvdDsgaGFzIHJlc291cmNlJnF1b3Q7KTsNCiAgICAgIHRyeSB7VGhyZWFkLnNs ZWVwKDMwMDApO30gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpe30NCiAgIH0NCn0NCn19 fSAgDQp7e3sgIFVzZXINCmNsYXNzIFVzZXIgZXh0ZW5kcyBUaHJlYWQgew0KICAgcHJpdmF0ZSBT dHJpbmcgaWQ7DQogICBwcml2YXRlIFJlc291cmNlIHJlc291cmNlOw0KDQogICBwdWJsaWMgVXNl ciAoU3RyaW5nIGlkLCBSZXNvdXJjZSByZXNvdXJjZSkgew0KICAgICAgdGhpcy5pZCA9IGlkOw0K ICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOw0KICAgICAgU3lzdGVtLm91dC5wcmludGxu ICgmcXVvdDtVc2VyICZxdW90OyArIGlkICsgJnF1b3Q7IHN0YXJ0ZWQmcXVvdDspOw0KICAgICAg c3RhcnQoKTsNCiAgIH0NCg0KICAgcHVibGljIHZvaWQgcnVuKCkgew0KICAgICAgd2hpbGUgKHRy dWUpIHsNCiAgICAgICAgIHJlc291cmNlLnRha2UoaWQpOw0KICAgICAgICAgdHJ5IHtUaHJlYWQu c2xlZXAoMTAwMCk7fSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7fQ0KICAgICAgfQ0K ICAgfQ0KfQ0KfX19ICANCg0KY2xhc3MgVGFrZV9SZXMgew0KICAge3t7ICBtYWluDQogICBwdWJs aWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgew0KICAgICAgUmVzb3VyY2UgcmVz b3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsNCg0KICAgICAgVXNlcltdIHVzZXIgPSBuZXcgVXNlclsz XTsNCg0KICAgICAgdXNlclswXSA9IG5ldyBVc2VyICgmcXVvdDtBICAmcXVvdDssIHJlc291cmNl KTsNCiAgICAgIHRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKEludGVycnVwdGVkRXhj ZXB0aW9uIGUpe30NCiAgICAgIHVzZXJbMV0gPSBuZXcgVXNlciAoJnF1b3Q7IEIgJnF1b3Q7LCBy ZXNvdXJjZSk7DQogICAgICB0cnkge1RocmVhZC5zbGVlcCgxMDAwKTt9IGNhdGNoIChJbnRlcnJ1 cHRlZEV4Y2VwdGlvbiBlKXt9DQogICAgICB1c2VyWzJdID0gbmV3IFVzZXIgKCZxdW90OyAgQyZx dW90OywgcmVzb3VyY2UpOw0KICAgfQ0KICAgfX19ICANCn0NCn19fSAgDQoNCg0KPC9DT0RFPg0K PC9QUkU+DQo8SDM+PEEgTkFNRT0iT3JpZ2luYWxDb2xsZWdlIj48L0E+PEEgSFJFRj0iI0luZGV4 Ij5PcmlnaW5hbCBDb2xsZWdlLmphdmE8L0E+DQo8L0gzPg0KPFBSRT4NCjxDT0RFPnt7eyAgQ29s bGVnZS5qYXZhDQoNCk95dmluZCwNCg0KJmd0OyBIYXZlIHlvdSB0cmllZCB0aGUgZWF0aW5nIHF1 ZXVlaW5nIHBoaWxvc29waGVycyBvbiBKYXZhIDEuMS41ID8/DQoNCk5vIC4uLiBpdCdzIGVuY2xv c2VkLiAgUnVubmluZyB0aGlzIG9uIFNlbWFudGljJ3MgSlZNIC0tIHdoaWNoICpzdGFja3MqDQp3 YWl0aW5nIHRocmVhZHMgaW5zdGVhZCBvZiAqcXVldWluZyogdGhlbSAtLSBjYXVzZXMgdGhlIGdy ZWVkeSBwaGlsb3NvcGhlcg0KdG8gc3VjY2VlZCEgIFRoZSBncmVlZHkgb25lIGp1c3QgZWF0cyBh IGxvdCwgYnV0IG5vYm9keSBzdGFydmVzLg0KDQpUaGF0IHNvdW5kcyBncmVhdCBleGNlcHQgdGhh dCBpdCdzIGRlYWQgZWFzeSB0byBtYWtlIGEgc2NlbmFyaW8gdGhhdCByZXN1bHRzDQppbiBpbmZp bml0ZSBzdGFydmF0aW9uIGZvciBzdGFja2luZyB3YWl0cyAuLi4gYW5kIHlvdSBkb24ndCBldmVu IGhhdmUgdG8NCmdldCBpbnZvbHZlZCB3aXRoIGB3YWl0J3MgLi4uDQoNCiAgbyB0YWtlIGEgcmVz b3VyY2UgUiAoYSBtb25pdG9yKSB3aXRoIG9uZSBzeW5jaHJvbml6ZWQgbWV0aG9kIHRoYXQgdGFr ZXMNCiAgICAzIHNlY29uZHMgdG8gZXhlY3V0ZTsNCg0KICBvIHRha2UgdGhyZWFkcyBBLCBCIGFu ZCBDIHRoYXQganVzdCBjeWNsZSB0cnlpbmcgdG8gZXhlY3V0ZSBSJ3MgbWV0aG9kDQogICAgLS0g dGhleSB3YWl0IG9uZSBzZWNvbmQgYWZ0ZXIgcmVsZWFzaW5nIFIgYmVmb3JlIHRyeWluZyBhZ2Fp bjsNCg0KICBvIHN0YXJ0IEEgb2ZmIGF0IHRpbWUgMCwgQiBhdCB0aW1lIDEgYW5kIEMgYXQgdGlt ZSAyOw0KDQogIG8gQiB3aWxsICpuZXZlciogZ2V0IHRoZSByZXNvdXJjZSENCg0KV2hhdCBoYXBw ZW5zIGlzIHRoYXQ6DQoNCiAgICBUaW1lIDogV2hhdCdzIGhhcHBlbmluZyAgICAgICAgICAgOiBT dGFjayB3YWl0aW5nIHRvIHN5bmMgb24gUg0KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAwICA6IEEgZ2V0cyBS ICAgICAgICAgICAgICAgICAgIDogW10NCiAgICAgIDEgIDogQiB3YW50cyBSIGFuZCBpcyBzdGFj a2VkICAgOiBbQl0NCiAgICAgIDIgIDogQyB3YW50cyBSIGFuZCBpcyBzdGFja2VkICAgOiBbQywg Ql0NCiAgICAgIDMgIDogQSByZWxlYXNlcyBSLCBDIGdldHMgUiAgICAgOiBbQl0NCiAgICAgIDQg IDogQSB3YW50cyBSIGFuZCBpcyBzdGFja2VkICAgOiBbQSwgQl0NCiAgICAgIDYgIDogQyByZWxl YXNlcyBSLCBBIGdldHMgUiAgICAgOiBbQl0NCiAgICAgIDcgIDogQyB3YW50cyBSIGFuZCBpcyBz dGFja2VkICAgOiBbQywgQl0NCiAgICAgIDkgIDogQSByZWxlYXNlcyBSLCBDIGdldHMgUiAgICAg OiBbQl0NCiAgICAgMTAgIDogQSB3YW50cyBSIGFuZCBpcyBzdGFja2VkICAgOiBbQSwgQl0NCiAg ICAgMTIgIDogQyByZWxlYXNlcyBSLCBBIGdldHMgUiAgICAgOiBbQl0NCiAgICAgMTMgIDogQyB3 YW50cyBSIGFuZCBpcyBzdGFja2VkICAgOiBbQywgQl0NCiAgICAgMTUgIDogQSByZWxlYXNlcyBS LCBDIGdldHMgUiAgICAgOiBbQl0NCiAgICAgMTYgIDogQSB3YW50cyBSIGFuZCBpcyBzdGFja2Vk ICAgOiBbQSwgQl0NCiAgICAgLg0KICAgICAuDQogICAgIC4NCg0KV2UgYXJlIHJlcGVhdGluZyAu Li4gQiBuZXZlciBnZXRzIGEgbG9vay1pbiEgIFRoZSBtb3JhbCBpcyB0aGF0IHN0YWNrcyBhcmUN Cmp1c3QgYXMgYmFkIGFzIHF1ZXVlcyAtLSBubyBsaXZlbG9jay9zdGFydmF0aW9uIGd1YXJhbnRl ZXMgZWl0aGVyIHdheSENCg0KV2hhdCdzIG5lZWRlZCBpcyB0aGUgSG9hcmUgc2VtYW50aWNzICh3 aGljaCByZWxlYXNlcyBjb250cm9sIG9mIHRoZSBtb25pdG9yDQpmcm9tIG5vdGlmaWVyIHRvIG5v dGlmaWVlIGF0b21pY2FsbHkgLS0gYnV0IHdoaWNoIG1lYW5zIHRoYXQgYG5vdGlmeUFsbCcNCmhh cyBubyBsb2dpY2FsIG1lYW5pbmcgYW5kIHdvdWxkIGhhdmUgdG8gYmUgZHJvcHBlZCkuICBPciwg cG9zc2libHksDQppbnNpc3QgdGhhdCB0aGUgSlZNICh3ZWFrbHktKXF1ZXVlcyB0aHJlYWRzIHRy eWluZyB0byBzeW5jaHJvbmlzZSBhbmQNCnRocmVhZHMgYHdhaXQnaW5nICphbmQqIHRoYXQgbm90 aWZpZWQgd2FpdGluZyB0aHJlYWRzIGJhcmdlIGluIHRvIHRoZSBmcm9udA0Kb2YgdGhlIGBxdWV1 ZScgb2YgdGhyZWFkcyB0cnlpbmcgdG8gc3luY2hyb25pemUgKHdoaWNoIGlzIGZhaXIgc2luY2Ug dGhleSd2ZQ0KYWxyZWFkeSBiZWVuIHRocm91Z2ggdGhhdCBvbmNlKS4gIFRoZSB0cnlpbmctdG8t c3luY2hyb25pemUgYHF1ZXVlJyBpcyBub3cNCmEgbWl4dHVyZSBvZiBhIHF1ZXVlIGFuZCBhIHN0 YWNrIC0tIHBlcmhhcHMgaXQgb3VnaHQgdG8gYmUgY2FsbCBhIGBzdGV3JyBvciwNCm1heWJlLCBh IGBxdWFjaycgLi4uIDotKQ0KDQpCdXQgSSdkIGJlIGludGVyZXN0ZWQgaW4gaG93IEphdmEgMS4x LjUgYmVoYXZlcyBvbiB0aGUgUEMuICBBcmUgdGhlc2UgdGhpbmdzDQpwcm9kdWN0cyBmcm9tIFN1 biAuLi4gSSdtIHZlcnkgaWdub3JhbnQgYWJvdXQgc3VjaCB0aGluZ3M/DQoNCkNoZWVycywNCg0K UGV0ZXIuDQoNClBTLiBFbmNsb3NlZCBhcmUgNCBjbGFzc2VzOiBDYW50ZWVuLCBDaGVmLCBQaGls b3NvcGhlciBhbmQgQ29sbGVnZSAod2hpY2gNCiAgICBoYXMgdGhlIGBtYWluJyBtZXRob2QuDQoN CihjdXQgaGVyZSkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPEEgTkFNRT0iT3JpZ2luYWxDb2xsZWdl VGhlQ29kZSI+Ly97e3t9fX0NCg0KLy97e3sgIGNsYXNzIENhbnRlZW4gew0KY2xhc3MgQ2FudGVl biB7DQogIC8ve3t7DQoNCiAgLy97e3sgIENPTU1FTlQgZG9jdW1lbnRhdGlvbg0KICAvLw0KICAv L1BoaWxvc3BoZXJzIGVhdCBjaGlja2Vucy4gIFRoZXkgcXVldWUgdXAgYXQgdGhlIGNhbnRlZW4g dG8gdXNlIHRoZSBgZ2V0Jw0KICAvL21ldGhvZC4gIEluc2lkZSB0aGUgYGdldCcgbWV0aG9kLCB0 aGV5IGdldCBzZXJ2ZWQgc3RyYWlnaHQgYXdheSBzbyBsb25nDQogIC8vYXMgdGhlcmUgYXJlIHNv bWUgY2hpY2tlbnMgcmVhZHkuICBPdGhlcndpc2UgdGhleSBgd2FpdCcgb24gc3RhbmQtYnkuDQog IC8vDQogIC8vVGhlIGNoZWYgY29va3MgY2hpY2tlbnMuICBXaGVuIGhlIGhhcyBhIGJhdGNoIHJl YWR5LCBoZSBhbHNvIHF1ZXVlcyB1cA0KICAvL2F0IHRoZSBjYW50ZWVuIGluIG9yZGVyIHRvIHVz ZSB0aGUgYHB1dCcgbWV0aG9kLiAgVGhpcyBpbnZvbHZlcyBzZXR0aW5nDQogIC8vZG93biB0aGUg YmF0Y2ggLS0gd2hpY2ggdGFrZXMgYXJvdW5kIDMgc2Vjb25kcyAtLSBhbmQgY2xlYXJpbmcgdGhl IHN0YW5kLWJ5DQogIC8vcXVldWUgKG9mIHBoaWxvc29waGVycyB3YWl0aW5nIGZvciBjaGlja2Vu cykgYnkgY2FsbGluZyBgbm90aWZ5QWxsJy4NCiAgLy8NCiAgLy97e3sgIG5vdGUgMQ0KICAvLw0K ICAvL0NsZWFybHksIHRoZSBDaGVmIHNob3VsZCBub3QgaGF2ZSB0byBxdWV1ZSB1cCB3aXRoIHRo ZSBQaGlsb3NvcGhlcnMgdG8NCiAgLy9nZXQgaW50byB0aGUgQ2FudGVlbi4gIFRoZSBQaGlsb3Nv cGhlcnMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHF1ZXVlIGFuZA0KICAvL3RoZSBDaGVmIHNob3Vs ZCBvbmx5IGhhdmUgdG8gY29udGVuZCB3aXRoIG9uZSBQaGlsb3NwaGVyIHdoZW4gZGVhbGluZyB3 aXRoDQogIC8vdGhlIGNoaWNrZW5zIGluIHRoZSBjYW50ZWVuLiAgU3VjaCBhIHNlcGFyYXRlIHF1 ZXVlIGZvciB0aGUgUGhpbG9zb3BoZXJzIGlzDQogIC8vanVzdCBsaWtlIHRoZSBzZXBlcmF0ZSBx dWV1ZXMgZm9yIHJlYWRlcnMvd3JpdGVycyB0aGF0IHdlIG5lZWRlZCBmb3IgdGhlDQogIC8vc2Vj dXJlbHkgc2hhcmVkIENoYW5uZWwgb3IgQnVmZmVyIGNsYXNzLiAgSG93ZXZlciwgd2UgYXJlIG1v ZGVsbGluZyB0aGlzDQogIC8vQ2FudGVlbiBvbiB0aGUgQ3ViYnlIb2xlIGNsYXNzICh0byBzaG93 IHRoZSBkYW5nZXIgb2Ygc3RhcnZhdGlvbiBpdCBjb250YWlucykNCiAgLy9hbmQgQ3ViYnlIb2xl IGhhcyBpdHMgcXVldWUgc2hhcmVkIGJ5IGJvdGggcmVhZGVycyBhbmQgd3JpdGVycy4NCiAgLy8N CiAgLy99fX0NCiAgLy8NCiAgLy97e3sgIG5vdGUgMg0KICAvLw0KICAvL0FsbCBtZXRob2RzLCBh cGFydCBmcm9tIHRoZSBgcnVuJyBtZXRob2QsIGFyZSBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSB0 aHJlYWQNCiAgLy9vZiBjb250cm9sIG9mIHRoZWlyIGNhbGxpbmcgb2JqZWN0cy4gIFRoaXMgaXMg cGFydGljdWxhcmx5IGNsZWFyIGhlcmUsIHdoZXJlDQogIC8vd2Ugc2VlIHRoZW0gc3BlYWtpbmcg KmFzKiB0aG9zZSBjYWxsaW5nIG9iamVjdHMuICBGb3IgaW5zdGFuY2UsIHRoZSBgZ2V0Jw0KICAv L21ldGhvZCBpcyBwYXJ0IG9mIHRoZSBsaWZlIG9mIHRoZSBjYWxsaW5nIFBoaWxvc29waGVyIGFu ZCBgcHV0JyBpcyBwYXJ0IG9mDQogIC8vdGhlIGxpZmUgb2YgdGhlIENoZWYuICBTbywgdGhpcyBD YW50ZWVuICZxdW90O29iamVjdCZxdW90OyBoYXMgYml0cyBvZiBQaGlsb3NvcGhlci0NCiAgLy9h bGdvcml0aG0gYW5kIGJpdHMgb2YgQ2hlZi1hbGdvcml0aG0gZm9yIGl0cyBtZXRob2RzIC0tIGEg c29tZXdoYXQgY29uZnVzZWQNCiAgLy9zZXQgb2Ygcm9sZXMgZm9yIHNvbWV0aGluZyB0aGF0J3Mg c3VwcG9zZWQgdG8gYmUgYSBDYW50ZWVuLiAgVGhlcmUncyBub3RoaW5nDQogIC8vaW4gdGhlc2Ug bWV0aG9kcyB0aGF0IGFyZSBvcmllbnRlZCB0b3dhcmRzIHRoZSBsaWZlIG9mIHRoZSBDYW50ZWVu Lg0KICAvLw0KICAvL1NvLCBhbG9uZ3NpZGUgdGhlIHNlbWFudGljIGltcHJlY2lzaW9uIG9mIGB3 YWl0L25vdGlmeScgYW5kIGFsb25nc2lkZSB0aGUNCiAgLy9ub24tY29tcG9zaXRpb25hbCAob3Is IGlmIHlvdSBwcmVmZXIsIG5vbi1yZWZlcmVudGlhbGx5LXRyYW5zcGFyZW50KSBzZW1hbnRpY3MN CiAgLy9vZiBtZXRob2RzIGluIGdlbmVyYWwsIHdlIGhhdmUgdG8gY29tZSB0byB0ZXJtcyB3aXRo IHRoZSBpZGVhIHRoYXQgbm8gbWV0aG9kcw0KICAvLyhhcGFydCBmcm9tIGBydW4nKSBhcmUgb3Jp ZW50ZWQgdG93YXJkcyB0aGUgJnF1b3Q7b2JqZWN0cyZxdW90OyBvZiB3aGljaCB0aGV5IGFyZQ0K ICAvL3N1cHBvc2VkIHRvIGJlIGEgcGFydC4gIFNvIG11Y2ggZm9yICZxdW90O29iamVjdC1vcmll bnRhdGlvbiZxdW90OyBpbiB0aGUgZm9ybWFsLCBhbmQNCiAgLy9xdWl0ZSBhcmJpdHJhcnksIGRl ZmluaXRpb24gb2YgdGhlIHRlcm0hICBJIGJlbGlldmUgdGhhdCB0aGUgZmlyc3QgdHdvDQogIC8v cHJvYmxlbXMgcmVmZXJlbmNlZCBpbiB0aGlzIHBhcmFncmFwaCBhcmUgYSBkaXJlY3QgY29uc2Vx dWVuY2Ugb2YgdGhlIHRoaXJkLg0KICAvL1RoZXNlIHByb2JsZW1zIGFyZSBub3Qgc3BlY2lhbCB0 byB0aGlzIENhbnRlZW4sIGJ1dCBhcmUgdW5pdmVyc2FsIGFjcm9zcw0KICAvL2FsbCBwYXNzaXZl IG9iamVjdHMuDQogIC8vDQogIC8vVGhlIENhbnRlZW4gc2hvdWxkLCBvZiBjb3Vyc2UsIGJlIGlt cGxlbWVudGVkIGFzIGFuIGFjdGl2ZSBvYmplY3QgY29ubmVjdGVkDQogIC8vdG8gdGhlIHBoaWxv c29waGVycyBhbmQgdGhlIGNoZWYgdmlhIHNpbXBsZSBjaGFubmVscyBvciBidWZmZXJzLiAgVGhl biwgd2UNCiAgLy93b3VsZG4ndCBoYXZlIHRoZSBwcm9ibGVtcyBhcmlzaW5nIGZyb20gdGhpcyBk ZXNpZ24uICBUaGlzIGlzIGxlZnQgYXMgYW4NCiAgLy9leGVyY2lzZSENCiAgLy8NCiAgLy99fX0N CiAgLy8NCiAgLy99fX0NCg0KICBwcml2YXRlIGludCBuX2NoaWNrZW5zID0gMDsNCg0KICAvL3t7 eyAgc3luY2hyb25pemVkIGdldCAobm8gY2hpY2tlbnMgPT0mZ3Q7IHdhaXQpDQogIHB1YmxpYyBz eW5jaHJvbml6ZWQgaW50IGdldCAoaW50IGlkKSB7DQogICAgLy97e3sNCiAgICB3aGlsZSAobl9j aGlja2VucyA9PSAwKSB7DQogICAgICAvL3t7eyAgbW9hbg0KICAgICAgU3lzdGVtLm91dC5wcmlu dGxuICgmcXVvdDsoJnF1b3Q7ICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDsp ICZxdW90OyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90O1BoaWwgJnF1b3Q7ICsg aWQgKyAmcXVvdDs6IHdvdCwgbm8gY2hpY2tlbnM/ICBJJ2xsIFdBSVQgLi4uICZxdW90Oyk7DQog ICAgICAvL319fQ0KICAgICAgLy97e3sgIGdldCBvbiBzdGFuZC1ieSBxdWV1ZSwgbGV0dGluZyBp biB0aGUgbmV4dCBwaGlsb3NvcGhlciAob3IgY2hlZikNCiAgICAgIHRyeSB7d2FpdCgpO30gY2F0 Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpe30NCiAgICAgIC8vfX19DQogICAgfQ0KICAgIC8v e3t7ICB0aGFua3MNCiAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBTeXN0 ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICZxdW90OykgJnF1b3Q7ICsNCiAgICAgICAgICAgICAg ICAgICAgICAgICZxdW90O1BoaWwgJnF1b3Q7ICsgaWQgKyAmcXVvdDs6IHRob3NlIGNoaWNrZW5z IGxvb2sgZ29vZCAuLi4gb25lIHBsZWFzZSAuLi4mcXVvdDspOw0KICAgIC8vfX19DQogICAgbl9j aGlja2Vucy0tOw0KICAgIHJldHVybiAxOw0KICAgIC8vfX19DQogIH0NCiAgLy99fX0NCg0KICAv L3t7eyAgc3luY2hyb25pemVkIHB1dCAodGFrZXMgYXQgbGVhc3QgMyBzZWNvbmRzKQ0KICBwdWJs aWMgc3luY2hyb25pemVkIHZvaWQgcHV0IChpbnQgdmFsdWUpIHsNCiAgICAvL3t7ew0KICAgIC8v e3t7ICBicmluZyBpbiB0aGUgdHJheQ0KICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZx dW90OyArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgJnF1b3Q7KSAmcXVvdDsgKw0KICAg ICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7Q2hlZiAgOiBvdWNoIC4uLiBtYWtlIHJvb20gLi4u IHRoaXMgZGlzaCBpcyB2ZXJ5IGhvdCAuLi4gJnF1b3Q7KTsNCiAgICAvL319fQ0KICAgIC8ve3t7 ICB0YWtlIDMgc2Vjb25kcyB0byBzZXQgZG93biB0aGUgZGlzaCAobWVhbndoaWxlIGEgcXVldWUg bWF5IGJlIGRldmVsb3BpbmcpDQogICAgdHJ5IHtUaHJlYWQuc2xlZXAgKDMwMDApO30gY2F0Y2gg KEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9DQogICAgLy99fX0NCiAgICBuX2NoaWNrZW5zICs9 IHZhbHVlOw0KICAgIC8ve3t7ICBhbm5vdW5jZSBhcnJpdmFsIG9mIG1vcmUgY2hpY2tlbnMNCiAg ICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBTeXN0ZW0uY3VycmVudFRpbWVN aWxsaXMoKSArICZxdW90OykgJnF1b3Q7ICsNCiAgICAgICAgICAgICAgICAgICAgICAgICZxdW90 O0NoZWYgIDogbW9yZSBjaGlja2VucyAuLi4gJnF1b3Q7ICsNCiAgICAgICAgICAgICAgICAgICAg ICAgIG5fY2hpY2tlbnMgKyAmcXVvdDsgbm93IGF2YWlsYWJsZSAuLi4gTk9USUZZSU5HIC4uLiZx dW90Oyk7DQogICAgLy99fX0NCiAgICAvL3t7eyAgcHV0IGFueSB3YWl0aW5nIHBoaWxvc29waGVy cyBiYWNrIG9uIHRoZSBtYWluIHF1ZXVlDQogICAgbm90aWZ5QWxsICgpOw0KICAgIC8vfX19DQog ICAgLy99fX0NCiAgfQ0KICAvL319fQ0KDQogIC8vfX19DQp9DQovL319fQ0KDQovL3t7eyAgY2xh c3MgQ2hlZiBleHRlbmRzIFRocmVhZCB7DQpjbGFzcyBDaGVmIGV4dGVuZHMgVGhyZWFkIHsNCiAg Ly97e3sNCg0KICAvL3t7eyAgQ09NTUVOVCBkb2N1bWVudGF0aW9uDQogIC8vDQogIC8vQSBjaGVm IGlzIGFuIGFjdGl2ZSBvYmplY3QuICBIZSBjb29rcyBjaGlja2VucyBpbiBiYXRjaGVzIG9mIGZv dXIgLS0gdGFraW5nDQogIC8vYXJvdW5kIDIgc2Vjb25kcyBwZXIgYmF0Y2ggLS0gYW5kIHRoZW4g dGFrZXMgdGhlbiB0byB0aGUgY2FudGVlbi4NCiAgLy8NCiAgLy9UaGlzIGN5Y2xlIGNvbnRpbnVl cyBpbmRlZmluaXRlbHkuDQogIC8vDQogIC8vfX19DQoNCiAgcHJpdmF0ZSBDYW50ZWVuIGNhbnRl ZW47DQoNCiAgLy97e3sgIGNvbnN0cnVjdG9yDQogIHB1YmxpYyBDaGVmIChDYW50ZWVuIGNhbnRl ZW4pIHsNCiAgICB0aGlzLmNhbnRlZW4gPSBjYW50ZWVuOw0KICAgIHN0YXJ0ICgpOw0KICB9DQog IC8vfX19DQoNCiAgLy97e3sgIHJ1bg0KICBwdWJsaWMgdm9pZCBydW4gKCkgew0KICAgIC8ve3t7 DQogICAgaW50IG5fY2hpY2tlbnM7DQoNCiAgICAvL3t7eyAgc3RhcnRpbmcNCiAgICBTeXN0ZW0u b3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAr ICZxdW90OykmcXVvdDsgKw0KICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7IENoZWYgIDog c3RhcnRpbmcgLi4uICZxdW90Oyk7DQogICAgLy99fX0NCiAgICB3aGlsZSAodHJ1ZSkgew0KICAg ICAgLy97e3sgIGNvb2sgNCBjaGlja2Vucw0KICAgICAgU3lzdGVtLm91dC5wcmludGxuICgmcXVv dDsoJnF1b3Q7ICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspJnF1b3Q7ICsN CiAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7IENoZWYgIDogY29va2luZyAuLi4gJnF1 b3Q7KTsNCiAgICAgIC8ve3t7ICBjb29rIGZvciBhcm91bmQgMiBzZWNvbmRzDQogICAgICB0cnkg e3NsZWVwICgyMDAwKTt9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQ0KICAgICAg Ly99fX0NCiAgICAgIG5fY2hpY2tlbnMgPSA0Ow0KICAgICAgU3lzdGVtLm91dC5wcmludGxuICgm cXVvdDsoJnF1b3Q7ICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAmcXVvdDspJnF1b3Q7 ICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7IENoZWYgIDogJnF1b3Q7ICsgbl9j aGlja2VucyArICZxdW90OyBjaGlja2VucywgcmVhZHktdG8tZ28gLi4uICZxdW90Oyk7DQogICAg ICAvL319fQ0KICAgICAgY2FudGVlbi5wdXQgKG5fY2hpY2tlbnMpOw0KICAgIH0NCiAgICAvL319 fQ0KICB9DQogIC8vfX19DQoNCiAgLy99fX0NCn0NCi8vfX19DQoNCi8ve3t7ICBjbGFzcyBQaGls IGV4dGVuZHMgVGhyZWFkIHsNCmNsYXNzIFBoaWwgZXh0ZW5kcyBUaHJlYWQgew0KICAvL3t7ew0K DQogIC8ve3t7ICBDT01NRU5UIGRvY3VtZW50YXRpb24NCiAgLy8NCiAgLy9BIHBoaWxvc29waGVy IHRoaW5rcyBmb3IgYSB3aGlsZSAtLSBhcm91bmQgMyBzZWNvbmRzIC0tIGFuZCB0aGVuIGdvZXMg dG8gdGhlDQogIC8vY2FudGVlbiBmb3IgZm9vZCwgY29uc3VtaW5nIHdoYXQgaGUgZ2V0cyBzdHJh aWdodCBhd2F5LiAgIFRoaXMgY3ljbGUgY29udGludWVzDQogIC8vaW5kZWZpbml0ZWx5Lg0KICAv Lw0KICAvL0V4Y2VwdCwgdGhhdCBpcywgZm9yIHBoaWxvc29waGVyIDAgLi4uICB3aG8gcmVmdXNl cyB0byB0aGluayBhbmQganVzdCBrZWVwcw0KICAvL2dvaW5nIHRvIHRoZSBjYW50ZWVuLiAgSGUg d2lsbCBnZXQgaGlzIGNvbWUtdXBwYW5jZSBzaG9ydGx5Lg0KICAvLw0KICAvL319fQ0KDQogIHBy aXZhdGUgaW50IGlkOw0KICBwcml2YXRlIENhbnRlZW4gY2FudGVlbjsNCg0KICAvL3t7eyAgY29u c3RydWN0b3INCiAgcHVibGljIFBoaWwgKGludCBpZCwgQ2FudGVlbiBjYW50ZWVuKSB7DQogICAg dGhpcy5pZCA9IGlkOw0KICAgIHRoaXMuY2FudGVlbiA9IGNhbnRlZW47DQogICAgc3RhcnQgKCk7 DQogIH0NCiAgLy99fX0NCg0KICAvL3t7eyAgcnVuDQogIHB1YmxpYyB2b2lkIHJ1biAoKSB7DQog ICAgLy97e3sNCiAgICBpbnQgY2hpY2tlbjsNCg0KICAgIC8ve3t7ICBzdGFydGluZw0KICAgIFN5 c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZxdW90OyArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxp cygpICsgJnF1b3Q7KSZxdW90OyArDQogICAgICAgICAgICAgICAgICAgICAgICAmcXVvdDsgUGhp bCAmcXVvdDsgKyBpZCArICZxdW90Ozogc3RhcnRpbmcgLi4uICZxdW90Oyk7DQogICAgLy99fX0N CiAgICB3aGlsZSAodHJ1ZSkgew0KICAgICAgLy97e3sgIGV2ZXJ5b25lLCBiYXIgcGhpbG9zb3Bo ZXIgMCwgaGFzIGEgbGl0dGxlIHRoaW5rDQogICAgICBpZiAoaWQgJmd0OyAwKSB7DQogICAgICAg IC8ve3t7ICB0aGluayBmb3IgYXJvdW5kIDMgc2Vjb25kcw0KICAgICAgICB0cnkge3NsZWVwICgz MDAwKTt9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQ0KICAgICAgICAvL319fQ0K ICAgICAgfQ0KICAgICAgLy99fX0NCiAgICAgIC8ve3t7ICB3YW50IGNoaWNrZW4NCiAgICAgIFN5 c3RlbS5vdXQucHJpbnRsbiAoJnF1b3Q7KCZxdW90OyArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxp cygpICsgJnF1b3Q7KSZxdW90OyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90OyBQ aGlsICZxdW90OyArIGlkICsgJnF1b3Q7OiBnb3R0YSBlYXQgLi4uICZxdW90Oyk7DQogICAgICAv L319fQ0KICAgICAgY2hpY2tlbiA9IGNhbnRlZW4uZ2V0IChpZCk7DQogICAgICAvL3t7eyAgY29u c3VtZSBjaGlja2VuDQogICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCZxdW90OygmcXVvdDsgKyBT eXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICZxdW90OykmcXVvdDsgKw0KICAgICAgICAgICAg ICAgICAgICAgICAgICAmcXVvdDsgUGhpbCAmcXVvdDsgKyBpZCArICZxdW90OzogbW1tIC4uLiB0 aGF0J3MgZ29vZCAuLi4gJnF1b3Q7KTsNCiAgICAgIC8vfX19DQogICAgfQ0KICAgIC8vfX19DQog IH0NCiAgLy99fX0NCg0KICAvL319fQ0KfQ0KLy99fX0NCg0KLy97e3sgIGNsYXNzIENvbGxlZ2Ug ew0KY2xhc3MgQ29sbGVnZSB7DQogIC8ve3t7DQoNCiAgLy97e3sgIENPTU1FTlQgZG9jdW1lbnRh dGlvbg0KICAvLw0KICAvL1RoZSBDb2xsZWdlIGNvbnNpc3RzIG9mIDUgUGhpbG9zb3BoZXJzLCBh IENoZWYgYW5kIHRoZSBDYW50ZWVuLiAgVGhlIENoZWYgYW5kDQogIC8vdGhlIFBoaWxvc29waGVy cyBhcmUgJnF1b3Q7YWN0aXZlJnF1b3Q7IG9iamVjdHMuICBUaGUgQ2FudGVlbiBpcyBhICZxdW90 O3Bhc3NpdmUmcXVvdDsgb2JqZWN0DQogIC8vdGhyb3VnaCB3aGljaCB0aGUgUGhpbG9zb3BoZXJz IGFuZCB0aGUgQ2hlZiBoYXZlIHRvIGludGVyYWN0Lg0KICAvLw0KICAvL1RoZSBDYW50ZWVuIGlz IGltcGxlbWVudGVkIGluIHRoZSBzdHlsZSBvZiB0aGUgQ3ViYnlIb2xlIGV4YW1wbGUgZnJvbSBT dW4ncw0KICAvL0phdmEgVHV0b3JpYWwuICBBcyBzdWNoLCBpdCBleHBvc2VzIGVhY2ggUGhpbG9z b3BoZXIgdG8gdGhlIGRhbmdlciBvZg0KICAvL3N0YXJ2YXRpb24gKGJ5IGluZmluaXRlIG92ZXJ0 YWtpbmcgYnkgZmVsbG93IFBoaWxvc29waGVycykuICBTYWRseSwgdGhpcw0KICAvL2RvZXMgaGFw cGVuIHdpdGggdGhlIHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlcyBvZiB0aW1pbmcgc2V0IHVwIGlu IHRoaXMNCiAgLy9kZW1vbnN0cmF0aW9uLiAgSGFwcGlseSwgaXQncyB0aGUgZ3JlZWR5IFBoaWxv c29waGVyIHRoYXQgc3RhcnZlcyAtLSBoZQ0KICAvL25ldmVyIGV2ZW4gZ2V0cyBvbmUgbWVhbCwg ZGVzcGl0ZSBiZWluZyBpbiB0aGUgQ2FudGVlbiB0aGUgd2hvbGUgdGltZSENCiAgLy8NCiAgLy99 fX0NCg0KICAvL3t7eyAgbWFpbg0KICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFy Z3ZbXSkgew0KICAgIC8ve3t7DQoNCiAgICBpbnQgbl9waGlsb3NvcGhlcnMgPSA1Ow0KDQogICAg Q2FudGVlbiBjYW50ZWVuID0gbmV3IENhbnRlZW4gKCk7DQoNCiAgICBDaGVmIGNoZWYgPSBuZXcg Q2hlZiAoY2FudGVlbik7DQoNCiAgICBQaGlsW10gcGhpbCA9IG5ldyBQaGlsW25fcGhpbG9zb3Bo ZXJzXTsNCg0KICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgbl9waGlsb3NvcGhlcnM7IGkrKykg ew0KICAgICAgcGhpbFtpXSA9IG5ldyBQaGlsIChpLCBjYW50ZWVuKTsNCiAgICB9DQoNCiAgICAv L319fQ0KICB9DQogIC8vfX19DQoNCiAgLy99fX0NCn0NCi8vfX19DQp9fX0gIA0KDQoNCjwvQT4N Cg0KPC9DT0RFPiANCjwvUFJFPg0KPC9CT0RZPg0KPC9IVE1MPg0KDQoNCg== --bw0k8cvyavZtV1thLImY5bPfW58AATUc--