PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiINCiAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KPGh0bWw+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQogIDx0aXRsZT5BeGlzMiBVc2VyJ3MgR3VpZGU8L3RpdGxlPg0KICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImFtYXlhIDkuMywgc2VlIGh0dHA6Ly93d3cudzMub3JnL0FtYXlhLyI+DQo8L2hlYWQ+DQoNCjxib2R5IGxhbmc9ImVuLVVTIiBkaXI9Imx0ciI+DQo8aDQ+PGEgbmFtZT0iQXhpczJfVXNlcidzX0d1aWRlIj5BeGlzMiBVc2VyJ3MgR3VpZGU8L2E+PC9oND4NCg0KPHA+PGk+VmVyc2lvbiAwLjk1PC9pPjwvcD4NCjxpPlVzZXIgRmVlZGJhY2s6IDxhDQpocmVmPSJtYWlsdG86YXhpcy11c2VyQHdzLmFwYWNoZS5vcmciPmF4aXMtdXNlckB3cy5hcGFjaGUub3JnPC9hPjwvaT4NCg0KPHAgYWxpZ249InJpZ2h0Ij5QYWdlczogPGEgaHJlZj0idXNlcmd1aWRlLmh0bWwiPkNvbnRlbnQ8L2E+LCA8YQ0KaHJlZj0idXNlcmd1aWRlMS5odG1sIj4xPC9hPiwgPGEgaHJlZj0idXNlcmd1aWRlMi5odG1sIj4yPC9hPiwgPGI+MzwvYj4sIDxhDQpocmVmPSJ1c2VyZ3VpZGU0Lmh0bWwiPjQ8L2E+LCA8YSBocmVmPSJ1c2VyZ3VpZGU1Lmh0bWwiPjU8L2E+PC9wPg0KDQo8cD48Yj48Zm9udCBzaXplPSI0Ij5Ob3RlIChvbiBzYW1wbGVzKTo8L2ZvbnQ+PC9iPiBJbiB0aGlzIHBhZ2Ugb2YgdGhlIHVzZXIncw0KZ3VpZGUgd2Ugd2lsbCBsb29rIGF0IGhvdyB0byB3cml0ZSBXZWIgU2VydmljZSBDbGllbnRzIHVzaW5nIEF4aXMyLiBBbGwgdGhlDQp1c2VyJ3MgZ3VpZGUgc2FtcGxlcyBhcmUgbG9jYXRlZCBhdCB0aGUgPGI+PGZvbnQNCmNvbG9yPSIjMDAwMDAwIj4ic2FtcGxlcy91c2VyZ3VpZGUvc3JjIjwvZm9udD48L2I+IGRpcmVjdG9yeSBvZiB0aGUgYmluYXJ5DQpkaXN0cmlidXRpb24uIFNvLi4uIGxldCdzIGV4cGxvcmUgdGhlIHNhbXBsZXMuPC9wPg0KDQo8aDI+PGEgbmFtZT0iV2ViX1NlcnZpY2VfQ2xpZW50c19Vc2luZ19BeGlzMiI+V2ViIFNlcnZpY2UgQ2xpZW50cyBVc2luZw0KQXhpczI8L2E+PC9oMj4NCg0KPHA+Tm93IGxldCdzIHNlZSBob3cgd2UgY2FuIHdyaXRlIGEgV2ViIFNlcnZpY2UgQ2xpZW50IHRvIHVzZSB0aGlzIFdlYg0KU2VydmljZS48L3A+DQoNCjxwPldlYiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHdpZGUgcmFuZ2Ugb2YgZnVuY3Rpb25hbGl0eSB0byB0aGUNCnVzZXJzIHJhbmdpbmcgZnJvbSBzaW1wbGUsIGxlc3MgdGltZSBjb25zdW1pbmegIG9wZXJhdGlvbnMgc3VjaCBhcw0KImdldFN0b2NrUXVvdGUioCB0byB0aW1lIGNvbnN1bWluZyBidXNpbmVzcyBzZXJ2aWNlcy4gV2hlbiB3ZSB1dGlsaXplIChpbnZva2UNCnVzaW5nIGNsaWVudCBhcHBsaWNhdGlvbnMpIHRoZXNlIFdlYiBTZXJ2aWNlIHdlIGNhbm5vdCB1c2Ugc29tZSBzaW1wbGUNCmdlbmVyaWMgaW52b2NhdGlvbiBwYXJhZGlnbSB0aGF0IHN1aXRlcyBhbGwgdGhlIHRpbWluZyBjb21wbGV4aXRpZXMgaW52b2x2ZWQNCmluIHRoZSBzZXJ2aWNlIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBpZiB3ZSB1c2UgYSBzaW5nbGUgdHJhbnNwb3J0IGNoYW5uZWwNCihzdWNoIGFzIEhUVFApIHRvIGludm9rZSBhIFdlYiBTZXJ2aWNlIHdpdGggYW5kIElOLU9VVCBvcGVyYXRpb24gdGhhdCB0YWtlDQpsb25nIHRpbWUgdG8gY29tcGxldGUsIHRoZW4gbW9zdCBvZiB0aGUgdGltZSB3ZSBtYXkgZW5kIHVwIHdpdGggImNvbm5lY3Rpb24NCnRpbWUgb3V0cyIuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBhcmUgc2ltdWx0YW5lb3VzIHNlcnZpY2UgaW52b2NhdGlvbnMNCnRoYXSgIHdlIG5lZWQgdG8gcGVyZm9ybSBmcm9tIGEgc2luZ2xlIGNsaWVudCBhcHBsaWNhdGlvbiwgdGhlbiB0aGUgdXNlIG9mIGENCiJibG9ja2luZyIgY2xpZW50IEFQSSB3aWxsIGRlZ3JhZGUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24uDQpTaW1pbGFybHkgdGhlcmUgYXJlIHZhcmlvdXMgb3RoZXIgY29uc2VxdWVuY2VzIHN1Y2ggYXMgT25lLVdheSB0cmFuc3BvcnRzDQp0aGF0IGNvbWUgaW4gdG8gcGxheSB3aGVuIHdlIG5lZWQgdGhlbS4gTGV0J3MgdHJ5IHRvIGFuYWx5emUgc29tZSBjb21tb24NCnNlcnZpY2UgaW52b2NhdGlvbiBwYXJhZGlnbXMuPC9wPg0KDQo8cD5NYW55IHdlYiBzZXJ2aWNlIGVuZ2luZXMgcHJvdmlkZSB0aGUgdXNlcnMgd2l0aCBhIEJsb2NraW5nIGFuZA0KTm9uLUJsb2NraW5nIGNsaWVudCBBUElzLjwvcD4NCjx1bD4NCiAgPGxpPjxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxiPkJsb2NraW5nIEFQSTwvYj4gLU9uY2UgdGhlIHNlcnZpY2UNCiAgICBpbnZvY2F0aW9uIGlzIGNhbGxlZCwgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBoYW5ncyBhbmQgb25seSBnZXRzIGNvbnRyb2wNCiAgICBiYWNrIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIGFmdGVyIHdoaWNoIGNsaWVudCByZWNlaXZlcyBhIHJlc3BvbnNlDQogICAgb3IgYSBmYXVsdC4gVGhpcyBpcyB0aGUgc2ltcGxlc3Qgd2F5IG9mIGludm9raW5nIFdlYiBTZXJ2aWNlcyBhbmQgaXQgYWxzbw0KICAgIHN1aXRlcyBtYW55IGJ1c2luZXNzIHNpdHVhdGlvbnMuPC9wPg0KICA8L2xpPg0KICA8bGk+PHA+PGI+Tm9uLUJsb2NraW5nIEFQSSA8L2I+LSBUaGlzIGlzIGEgY2FsbGJhY2sgb3IgcG9sbGluZyBiYXNlZCBBUEksDQogICAgaGVuY2Ugb25jZSBhIHNlcnZpY2UgaW52b2NhdGlvbiBpcyBjYWxsZWQsIHRoZSBjbGllbnQgYXBwbGljYXRpb24NCiAgICBpbW1lZGlhdGVseSBnZXRzIHRoZSBjb250cm9sIGJhY2sgYW5kIHRoZSByZXNwb25zZSBpcyByZXRyaWV2ZWQgdXNpbmcgdGhlDQogICAgY2FsbGJhY2sgb2JqZWN0IHByb3ZpZGVkLiBUaGlzIGFwcHJvYWNoIHByb3ZpZGVzIHRoZSBmbGV4aWJpbGl0eSB0byB0aGUNCiAgICBjbGllbnQgYXBwbGljYXRpb24gdG8gaW52b2tlIHNldmVyYWwgV2ViIFNlcnZpY2VzIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQNCiAgICBibG9ja2luZyB0aGUgb3BlcmF0aW9uIGFscmVhZHkgaW52b2tlZC48L3A+DQogIDwvbGk+DQo8L3VsPg0KDQo8cD5Cb3RoIHRoZXNlIG1lY2hhbmlzbXMgd29yayBpbiB0aGUgQVBJIGxldmVsLiBMZXQncyBuYW1lIHRoZaAgYXN5bmNocm9ub3VzDQpiZWhhdmlvciB0aGF0IHdlIGNhbiBnZXQgdXNpbmcgdGhlIDxzdHJvbmc+Tm9uLUJsb2NraW5nIEFQSTwvc3Ryb25nPiBhcw0KPGI+QVBJIExldmVsIEFzeW5jaHJvbnkuPC9iPjwvcD4NCg0KPHA+Qm90aCB0aGVzZSBtZWNoYW5pc21zIHVzZSBzaW5nbGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24gdG8gc2VuZCB0aGUgcmVxdWVzdA0KYW5kIHRvIHJlY2VpdmUgdGhlIHJlc3BvbnNlLiBUaGV5IHNldmVyZWx5IGxhZ3MgdGhlIGNhcGFiaWxpdHkgb2YgdXNpbmcgdHdvDQp0cmFuc3BvcnQgY29ubmVjdGlvbnMgZm9yIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UgKGVpdGhlciBPbmUtV2F5IG9mDQpUd28tV2F5KS4gU28gYm90aCB0aGVzZSBtZWNoYW5pc21zIGZhaWwgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbSBvZiBsb25nDQpydW5uaW5nIHRyYW5zYWN0aW9ucyAodGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uIG1heSB0aW1lLW91dCBiZWZvcmUgdGhlDQpvcGVyYXRpb24gY29tcGxldGVzKS4gQSBwb3NzaWJsZSBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgPHN0cm9uZz50d28NCnNlcGFyYXRlIHRyYW5zcG9ydCBjb25uZWN0aW9ucyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2U8L3N0cm9uZz4uIFRoZQ0KYXN5bmNocm9ub3VzIGJlaGF2aW9yIHRoYXQgd2UgZ2FpbiB1c2luZyB0aGlzIHNvbHV0aW9uIGNhbiBiZSBjYWxsZWQNCjxiPlRyYW5zcG9ydCBMZXZlbCBBc3luY2hyb255PC9iPi48L3A+DQoNCjxwPkJ5IGNvbWJpbmluZyBBUEkgTGV2ZWwgQXN5bmNocm9ueSAmYW1wOyBUcmFuc3BvcnQgTGV2ZWwgQXN5bmNocm9ueSB3ZSBjYW4NCm9idGFpbiBmb3VyIGRpZmZlcmVudCBpbnZvY2F0aW9uIHBhdHRlcm5zIGZvciB3ZWIgc2VydmljZXMgYXMgc2hvd24gaW4gdGhlDQpmb2xsb3dpbmcgdGFibGUuPC9wPg0KPGEgbmFtZT0idGFibGUxIj48L2E+DQoNCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPg0KICA8dGJvZHk+DQogICAgPHRyPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiIGhlaWdodD0iMTkiPjxwPjxzdHJvbmc+QVBJDQogICAgICAgIChCbG9ja2luZy9Ob24tQmxvY2tpbmcpPC9zdHJvbmc+PC9wPg0KICAgICAgPC90ZD4NCiAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD48c3Ryb25nPqBEdWFsIFRyYW5zcG9ydHMgKFllcy9Obyk8L3N0cm9uZz48L3A+DQogICAgICA8L3RkPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3A+DQogICAgICA8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiIGhlaWdodD0iMTkiPjxwPkJsb2NraW5nPC9wPg0KICAgICAgPC90ZD4NCiAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD5ObzwvcD4NCiAgICAgIDwvdGQ+DQogICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+U2ltcGxlc3QgYW5kIHRoZSBmYW1pbGlhciBpbnZvY2F0aW9uIHBhdHRlcm48L3A+DQogICAgICA8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiIGhlaWdodD0iMTkiPjxwPk5vbi1CbG9ja2luZzwvcD4NCiAgICAgIDwvdGQ+DQogICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+Tm88L3A+DQogICAgICA8L3RkPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPlVzaW5nIGNhbGxiYWNrcyBvciBwb2xsaW5nPC9wPg0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0ZCB3aWR0aD0iMzMlIiBoZWlnaHQ9IjE5Ij48cD5CbG9ja2luZzwvcD4NCiAgICAgIDwvdGQ+DQogICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+WWVzPC9wPg0KICAgICAgPC90ZD4NCiAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD5UaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2aWNlIG9wZXJhdGlvbiBpcyBJTi1PVVQNCiAgICAgICAgaW4gbmF0dXJlIGJ1dCB0aGUgdHJhbnNwb3J0IHVzZWQgaXMgT25lLVdheSAoZS5nLiBTTVRQKTwvcD4NCiAgICAgIDwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+DQogICAgICA8dGQgd2lkdGg9IjMzJSIgaGVpZ2h0PSIxOSI+PHA+Tm9uLUJsb2NraW5nPC9wPg0KICAgICAgPC90ZD4NCiAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD5ZZXM8L3A+DQogICAgICA8L3RkPg0KICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPlRoaXMgaXMgY2FuIGJlIHVzZWQgdG8gZ2FpbiB0aGUgbWF4aW11bSBhc3luY2hyb25vdXMNCiAgICAgICAgYmVoYXZpb3IuIE5vIGJsb2NraW5nIGluIHRoZSBBUEkgbGV2ZWwgYW5kIGFsc28gaW4gdGhlIHRyYW5zcG9ydA0KICAgICAgICBsZXZlbDwvcD4NCiAgICAgIDwvdGQ+DQogICAgPC90cj4NCiAgPC90Ym9keT4NCjwvdGFibGU+DQoNCjxwPkF4aXMyIHByb3ZpZGVzIHRoZSB1c2VyIHdpdGggYWxsIHRoZXNlIHBvc3NpYmlsaXRpZXMgdG8gaW52b2tlIFdlYg0KU2VydmljZXMuPC9wPg0KDQo8cD5CZWxvdyB3ZSBkZXNjcmliZSBob3cgdG8gd3JpdGUgV2ViIFNlcnZpY2VzIENsaWVudHMgdXNpbmcgQXhpczIuIFRoaXMgY2FuDQpiZSBkb25lIGluIHR3byBtZXRob2RzOjwvcD4NCjxvbD4NCiAgPGxpPjxhIGhyZWY9IiNXcml0aW5nX1dlYl9TZXJ2aWNlX0NsaWVudHNfdXNpbmdfQXhpczInc19QcmltYXJ5X0FQSXMiPlVzaW5nDQogICAgdGhlIEF4aXMyJ3MgcHJpbWFyeSBBUElzPC9hPjwvbGk+DQogIDxsaT48cD48YQ0KICAgIGhyZWY9IiNXcml0aW5nX1dlYl9TZXJ2aWNlX0NsaWVudHNfdXNpbmdfQ29kZV9HZW5lcmF0aW9uX3dpdGhfRGF0YV9CaW5kaW5nX1N1cHBvcnQiPlVzaW5nDQogICAgc3R1YnMgZ2VuZXJhdGVkIHdpdGggZGF0YSBiaW5kaW5nIHN1cHBvcnQ8L2E+LCBtYWtpbmcgdGhlIGxpZmUgZWFzeSBmb3INCiAgICBkZXZlbG9wZXJzIHdyaXRpbmcgV2ViIFNlcnZpY2UgY2xpZW50IGFwcGxpY2F0aW9uczwvcD4NCiAgPC9saT4NCjwvb2w+DQoNCjxoMz48YSBuYW1lPSJXcml0aW5nX1dlYl9TZXJ2aWNlX0NsaWVudHNfdXNpbmdfQXhpczInc19QcmltYXJ5X0FQSXMiPldyaXRpbmcNCldlYiBTZXJ2aWNlIENsaWVudHMgVXNpbmcgQXhpczIncyBQcmltYXJ5IEFQSXM8L2E+PC9oMz4NCg0KPGg0PjxhIG5hbWU9IkVjaG9CbG9ja2luZ0NsaWVudCI+RWNob0Jsb2NraW5nQ2xpZW50PC9hPjwvaDQ+DQoNCjxwPkF4aXMyIHByb3ZpZGVzIHRoZSB1c2VyIHdpdGggc2V2ZXJhbCBpbnZvY2F0aW9uIHBhdHRlcm5zIGZvciBXZWIgU2VydmljZXMsDQpyYW5naW5nIGZyb20gcHVyZSBibG9ja2luZyBzaW5nbGUgY2hhbm5lbCBpbnZvY2F0aW9ucyB0byBhIG5vbi1ibG9ja2luZyBkdWFsDQpjaGFubmVsIGludm9jYXRpb25zLiBMZXQncyBmaXJzdCBzZWUgaG93IHdlIGNhbiB3cml0ZSBhIGNsaWVudCB0byBpbnZva2UNCiJlY2hvIiBvcGVyYXRpb24gb2YgIk15U2VydmljZSIgdXNpbmcgdGhlIHNpbXBsZXN0IGJsb2NraW5nIGludm9jYXRpb24uIFRoZQ0KY2xpZW50IGNvZGUgeW91IG5lZWQgdG8gd3JpdGUgaXMgYXMgZm9sbG93cy48L3A+DQo8c291cmNlPjxwcmU+ICB0cnkgew0KICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsNCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0QzExMyI+ICAgICAgICAgICAgDQogICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOw0KICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KICAgICAgICAgICAgb3B0aW9ucy5zZXRMaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7DQogICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIoZmFsc2UpOw0KDQogICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCgpOw0KICAgICAgICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOw0KDQogICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCiAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemVXaXRoQ2FjaGUobmV3IE9NT3V0cHV0KFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSkpOw0KICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQoNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7DQoNCiAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgew0KICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOw0KICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgICAgfQ0KfTwvcHJlPg0KPC9zb3VyY2U+DQo8cD5UaGUgZ3JlZW4gbGluZXMgc2hvd3MgdGhlIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgeW91IG5lZWQgdG8gcGVyZm9ybQ0KaW5vcmRlciB0byBpbnZva2UgYSB3ZWIgc2VydmljZS4gVGhlIHJlc3QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIE9NRWxlbWVudA0KdGhhdCBuZWVkcyB0byBiZSBzZW50IGFuZCBkaXNwbGF5IHRoZSByZXNwb25zZSBPTUVsZW1lbnQuIFRvIHRlc3QgdGhpcw0KY2xpZW50LCB1c2UgdGhlIHByb3ZpZGVkIGFudCBidWlsZCBmaWxlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZQ0KIkF4aXMySG9tZS9zYW1wbGVzIiBkaXJlY3RvcnkuIFJ1biB0aGUgInRlc3RFY2hvQmxvY2tpbmdDbGllbnQiIHRhcmdldCAuIElmDQp5b3UgY2FuIHNlZSB0aGUgcmVzcG9uc2UgT01FbGVtZW50IHByaW50ZWQgaW4geW91ciBjb21tYW5kIGxpbmUsoCB0aGVuIHlvdQ0KaGF2ZSBzdWNjZXNzZnVsbHkgdGVzdGVkIHRoZSBjbGllbnQuIDwvcD4NCg0KPGg0PjxhIG5hbWU9IlBpbmdDbGllbnQiPlBpbmdDbGllbnQ8L2E+PC9oND4NCg0KPHA+SW4gdGhlIFdlYiBTZXJ2aWNlICJNeVNlcnZpY2UiIHdlIGhhZCBhIElOLU9OTFkgb3BlcmF0aW9uIHdpdGggdGhlIG5hbWUNCiJwaW5nIiAoc2VlIDxhIGhyZWY9InVzZXJndWlkZTIuaHRtbCNXZWJfU2VydmljZXNfVXNpbmdfQXhpczIiPldlYiBTZXJ2aWNlcw0KVXNpbmcgQXhpczI8L2E+KS4gTGV0J3Mgd3JpdGUgYSBjbGllbnQgdG8gaW52b2tlIHRoaXMgb3BlcmF0aW9uLiBUaGUgY2xpZW50DQpjb2RlIGlzIGFzIGZvbGxvd3M6PC9wPg0KPHByZT4gdHJ5IHsNCiAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IENsaWVudFV0aWwuZ2V0UGluZ09NRWxlbWVudCgpOw0KICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7DQogICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KICAgICAgIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7DQogICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOw0KICAgICAgIHNlcnZpY2VDbGllbnQuZmlyZUFuZEZvcmdldChwYXlsb2FkKTsNCiAgICAgICAgLyoqDQogICAgICAgICAqIFdlIGhhdmUgdG8gYm9jayB0aGlzIHRocmVhZCB1bnRpbGwgd2Ugc2VuZCB0aGUgcmVxdWVzdCAsIHRoZSBwcm9ibGVtDQogICAgICAgICAqIGlzIGlmIHdlIGdvIG91dCBvZiB0aGUgbWFpbiB0aHJlYWQgLCB0aGVuIHJlcXVlc3Qgd29udCBzZW5kICxzbw0KICAgICAgICAgKiB5b3UgaGF2ZSB0byB3YWl0IHNvbWUgdGltZSA6KQ0KICAgICAgICAgKi8NCiAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsNCiAgICAgfSANCmNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7DQogICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7DQogICAgIH08L3ByZT4NCg0KPHA+U2luY2Ugd2UgYXJlIGFjY2Vzc2luZyBhIElOLU9OTFkgb3BlcmF0aW9uIHdlIGNhbiBkaXJlY3RseSB1c2UgdGhlDQoiZmlyZUFuZEZvcmdldCgpIiBpbiBTZXJ2aWNlQ2xpZW50IHRvIGludm9rZSB0aGlzIG9wZXJhdGlvbiAsIGFuZCB0aGF0IHdpbGwNCm5vdCBibG9jayB0aGUgaW52b2NhdGlvbiwgaGVuY2UgaXQgd2lsbCByZXR1cm4gdGhlIGNvbnRyb2wgaW1tZWRpYXRlbHkgYmFjaw0KdG8gdGhlIGNsaWVudC4gWW91IGNhbiB0ZXN0IHRoaXMgY2xpZW50IGJ5IHJ1bm5pbmcgdGhlIHRhcmdldA0KInRlc3RQaW5nQ2xpZW50IiBvZiB0aGUgYW50IGJ1aWxkIGZpbGUgYXQgIkF4aXMySG9tZS9zYW1wbGVzIi48L3A+DQoNCjxwPldlIGhhdmUgaW52b2tlZCB0aGUgdHdvIG9wZXJhdGlvbnMgaW4gb3VyIHNlcnZpY2UuIEFyZSB3ZSBkb25lPyBObyEgVGhlcmUNCmFyZSBsb3QgbW9yZSB0byBleHBsb3JlLiBMZXQncyBzZWUgc29tZSBvdGhlciB3YXlzIHRvIGludm9rZSB0aGUgc2FtZQ0Kb3BlcmF0aW9ucy4uLjwvcD4NCg0KPGg0PjxhIG5hbWU9IkVjaG9Ob25CbG9ja2luZ0NsaWVudCI+RWNob05vbkJsb2NraW5nQ2xpZW50PC9hPjwvaDQ+DQoNCjxwPkluIHRoZSBFY2hvQmxvY2tpbmdDbGllbnQgb25jZSB0aGUgInNlcnZpY2VDbGVpbnQuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ig0KaXMgY2FsbGVkLCB0aGUgY2xpZW50IGlzIGJsb2NrZWQgdGlsbCB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhpcw0KYmVoYXZpb3IgaXMgbm90IGRlc2lyYWJsZSB3aGVuIHRoZXJlIGFyZSBtYW55IFdlYiBTZXJ2aWNlIGludm9jYXRpb25zIHRvIGJlDQpkb25lIGluIGEgc2luZ2xlIGNsaWVudCBhcHBsaWNhdGlvbi4gQSBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgYQ0KTm9uLUJsb2NraW5nIEFQSSB0byBpbnZva2Ugd2ViIHNlcnZpY2VzLiBBeGlzMiBwcm92aWRlcyBhIGNhbGxiYWNrIGJhc2VkDQpub24tYmxvY2tpbmcgQVBJIGZvciB1c2Vycy48L3A+DQoNCjxwPkEgc2FtcGxlIGNsaWVudCBmb3IgdGhpcyBjYW4gYmUgZm91bmQgdW5kZXINCiJBeGlzMkhvbWUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzIiB3aXRoIHRoZSBuYW1lDQpFY2hvTm9uQmxvY2tpbmdDbGllbnQuIElmIHdlIGNvbnNpZGVyIHRoZSBjaGFuZ2VzIHRoYXQgdXNlciBtYXkgaGF2ZSB0byBkbw0Kd2l0aCByZXNwZWN0IHRvIHRoZSAiRWNob0Jsb2NraW5nQ2xpZW50IiB0aGF0IHdlIGhhdmUgYWxyZWFkeSBzZWVuLCBpdCB3aWxsDQpiZSBhcyBmb2xsb3dzOjwvcD4NCjxwcmUgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuMmluIj5zZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlTm9uYmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOzwvcHJlPg0KDQo8cD5UaGUgaW52b2NhdGlvbiBhY2NlcHRzIGEgY2FsbGJhY2sgb2JqZWN0IGFzIGEgcGFyYW1ldGVyLiBBeGlzMiBjbGllbnQgQVBJDQpwcm92aWRlcyBhbiBhYnN0cmFjdCBDYWxsYmFjayB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8L3A+DQo8cHJlPnB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KTsNCnB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpOw0KcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHt9PC9wcmU+DQoNCjxwPlRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGUgIm9uQ29tcGxldGUgIiBhbmQgIm9uRXJyb3IgIiBtZXRob2RzDQpvZiB0aGVpciBleHRlbmRlZCBjYWxsIGJhY2sgY2xhc3MuIEF4aXMyIGVuZ2luZSBjYWxscyB0aGUgb25Db21wbGV0ZSBtZXRob2QNCm9uY2UgdGhlIFdlYiBTZXJ2aWNlIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGJ5IHRoZSBBeGlzMiBDbGllbnQgQVBJDQooU2VydmljZUNsaWVudCkuIFRoaXMgd2lsbCBlbGltaW5hdGUgdGhlIGJsb2NraW5nIG5hdHVyZSBvZiB0aGUgV2ViIFNlcnZpY2UNCmludm9jYXRpb25zIGFuZCBwcm92aWRlcyB0aGUgdXNlciB3aXRoIHRoZSBmbGV4aWJpbGl0eSB0byB1c2UgTm9uIEJsb2NraW5nDQpBUEkgZm9yIFdlYiBTZXJ2aWNlIENsaWVudHMuPC9wPg0KDQo8cD5UbyBydW4gdGhlIHNhbXBsZSBjbGllbnQgKCBFY2hvTm9uQmxvY2tpbmdDbGllbnQpIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUNCiJ0ZXN0RWNob05vbkJsb2NraW5nQ2xpZW50IiB0YXJnZXQgb2YgdGhlIGFudCBmaWxlIGZvdW5kIGF0IHRoZQ0KIkF4aXMySG9tZS9zYW1wbGVzIiBkaXJlY3RvcnkuPC9wPg0KDQo8aDQ+PGEgbmFtZT0iRWNob05vbkJsb2NraW5nRHVhbENsaWVudCI+RWNob05vbkJsb2NraW5nRHVhbENsaWVudDwvYT48L2g0Pg0KDQo8cD5UaGUgc29sdXRpb24gcHJvdmlkZWQgYnkgdGhlIE5vbi1CbG9ja2luZyBBUEkgaGFzIG9uZSBsaW1pdGF0aW9uIHdoZW4gaXQNCmNvbWVzIHRvoCBXZWIgU2VydmljZSBpbnZvY2F0aW9ucyB3aGljaCB0YWtlcyBsb25nIHRpbWUgdG8gY29tcGxldGUuIFRoZQ0KbGltaXRhdGlvbiBpcyBkdWUgdG8gdGhlIHVzZSBvZiBzaW5nbGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24gdG8gaW52b2tlIHRoZSBXZWINClNlcnZpY2UgYW5kIHRvIHJldHJpZXZlIHRoZSByZXNwb25zZS4gSW4gb3RoZXIgd29yZHMsIGNsaWVudCBBUEkgcHJvdmlkZXMgYQ0Kbm9uIGJsb2NraW5nIGludm9jYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgdXNlcnMsIGJ1dCB0aGUgcmVxdWVzdCBhbmQgdGhlDQpyZXNwb25zZSBjb21lcyBpbiBhIHNpbmdsZSB0cmFuc3BvcnQgKFR3by1XYXkgdHJhbnNwb3J0KSBjb25uZWN0aW9uIChsaWtlDQpIVFRQKS4gTG9uZyBydW5uaW5nIFdlYiBTZXJ2aWNlIGludm9jYXRpb25zIG9yIFdlYiBTZXJ2aWNlIGludm9jYXRpb25zIHVzaW5nDQpPbmUtV2F5IHRyYW5zcG9ydHMgKGxpa2UgU01UUCkgY2Fubm90IGJlIHV0aWxpemVkIGJ5IHNpbXBseSB1c2luZyBhIG5vbg0KYmxvY2tpbmcgaW52b2NhdGlvbi4gPC9wPg0KDQo8cD5UaGUgdHJpdmlhbCBzb2x1dGlvbiBpcyB0byB1c2Ugc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25zIChlaXRoZXINCk9uZS1XYXkgb3IgVHdvLVdheSkgZm9yIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZS4gVGhlIG5leHQgcHJvYmxlbSB0aGF0IG5lZWRzDQp0byBiZSBzb2x2ZWQgaXMgdGhlIGNvcnJlbGF0aW9uIChjb3JyZWxhdGluZyB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlKS4NCjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N1Ym1pc3Npb24vd3MtYWRkcmVzc2luZy8iDQp0YXJnZXQ9Il9ibGFuayI+V1MtQWRkcmVzc2luZzwvYT4gcHJvdmlkZXMgYSBuZWF0IHNvbHV0aW9uIHRvIHRoaXMgdXNpbmcNCiZsdDt3c2E6TWVzc2FnZUlEJmd0OyBhbmQgJmx0O3dzYTpSZWxhdGVzVG8mZ3Q7IGhlYWRlcnMuIEF4aXMyIHByb3ZpZGVzDQpzdXBwb3J0IGZvciBhZGRyZXNzaW5noCBiYXNlZCBjb3JyZWxhdGlvbiBtZWNoYW5pc20gYW5kIGEgY29tcGx5aW5nIENsaWVudA0KQVBJIHRvIGludm9rZSBXZWIgU2VydmljZXMgd2l0aCB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiAoQ29yZSBvZiBBeGlzMg0KZG9lcyBub3QgZGVwZW5kIG9uIFdTLUFkZHJlc3NpbmcsIGJ1dCBjb250YWlucyBhIHNldCBvZiBwYXJhbWV0ZXJzIGxpa2UgaW4NCmFkZHJlc3NpbmcgdGhhdCBjYW4gYmUgcG9wdWxhdGVkIGluIGFueSBtZWFucy4gV1MtQWRkcmVzc2luZyBpcyBvbmUgb2YgdGhlDQp1c2VycyB0aGF0IG1heSBwb3B1bGF0ZSB0aGVtLiBFdmVuIHRoZSB0cmFuc3BvcnRzIGNhbiBwb3B1bGF0ZSB0aGVzZS4gSGVuY2UNCkF4aXMyIGhhcyB0aGUgZmxleGliaWxpdHkgdG8gdXNlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhZGRyZXNzaW5nKTwvcD4NCg0KPHA+VXNlcnMgY2FuIHNlbGVjdCBiZXR3ZWVuIEJsb2NraW5nIG9yIE5vbi1CbG9ja2luZyBBUElzIGZvciB0aGUgV2ViIFNlcnZpY2UNCmNsaWVudHMgd2l0aCB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiBCeSBzaW1wbHkgdXNpbmcgYSBib29sZWFuIGZsYWcsIHRoZQ0Kc2FtZSBBUEkgY2FuIGJlIHVzZWQgdG8gaW52b2tlIHdlYiBzZXJ2aWNlcyAoSU4tT1VUIG9wZXJhdGlvbnMpIHVzaW5nIHR3bw0Kc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiBMZXQncyBzZWUgaG93IGl0J3MgZG9uZSB1c2luZyBhbiBleGFtcGxlLg0KRm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgc2hvd3MgaG93IHRvIGludm9rZSB0aGUgc2FtZSAiZWNobyIgb3BlcmF0aW9uIHVzaW5nDQpOb24tQmxvY2tpbmcgQVBJIHdpdGggdHdvIHRyYW5zcG9ydCBjb25uZWN0aW9uczxzdHJvbmc+LiBUaGUgdWx0aW1hdGUNCmFzeW5jaHJvbnkhITwvc3Ryb25nPjwvcD4NCjxwcmU+ICB0cnkgew0KICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsNCiAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7PGJyPiAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsgIA0KDQogICAgICAgICAgICAvL1RoZSBib29sZWFuIGZsYWcgaW5mb3JtcyB0aGUgYXhpczIgZW5naW5lIHRvIHVzZSB0d28gc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24NCiAgICAgICAgICAgIC8vdG8gcmV0cmlldmUgdGhlIHJlc3BvbnNlLg0KPGJyPiAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsNCiAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNobyIpOyANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpbmV0ID0gbmV3IFNlcnZpY2VDbGluZXQoKTsNCjxicj4gICAgICAgICAgICBzZXJ2aWNlQ2xpbmV0LnNldE9wdGlvbnMob3B0aW9ucyk7PC9wcmU+DQo8cHJlPiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgLy9DYWxsYmFjayB0byBoYW5kbGUgdGhlIHJlc3BvbnNlDQogICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsNCiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemVXaXRoQ2FjaGUobmV3IE9NT3V0cHV0KFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7DQogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgLy9Ob24tQmxvY2tpbmcgSW52b2NhdGlvbg0KICAgICAgICAgICAgc2VydmljZUNsaW5ldC5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsNCg0KICAgICAgICAgICAgLy9XYWl0IHRpbGwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSByZXNwb25zZS4NCiAgICAgICAgICAgIHdoaWxlICghY2FsbGJhY2suaXNDb21wbGV0ZSgpKSB7DQogICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2VydmljZUNsaW5ldC5maW5hbGl6ZUludm9rZSgpOw0KDQogICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCiAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQogICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgICAgfTwvcHJlPg0KDQo8cD48Zm9udCBjb2xvcj0iIzAwMDBmZiI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRoZSBib29sZWFuIGZsYWcgKHZhbHVlIHRydWUpDQppbiB0aGUgIjxiPm9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lciguLi4pPC9iPiIgbWV0aG9kIGluZm9ybXMgdGhlIEF4aXMyDQplbmdpbmUgdG8gdXNlIHNlcGFyYXRlIHRyYW5zcG9ydCBjb25uZWN0aW9ucyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UuDQpGaW5hbGx5ICI8Yj5zZXJ2aWNlQ2xpbmV0LmZpbmFsaXplSW52b2tlKCk8L2I+IiBpbmZvcm1zIHRoZSBBeGlzMiBlbmdpbmUgdG8NCnN0b3AgdGhlIGNsaWVudCBzaWRlIGxpc3RlbmVyIHN0YXJ0ZWQgdG8gcmV0cmlldmUgdGhlDQpyZXNwb25zZS48L2ZvbnQ+PC9mb250PjwvcD4NCg0KPHA+QmVmb3JlIHdlIHJ1biB0aGUgc2FtcGxlIGNsaWVudCB3ZSBoYXZlIG9uZSBtb3JlIHN0ZXAgdG8gcGVyZm9ybS4gQXMNCm1lbnRpb25lZCBlYXJsaWVyIEF4aXMyIHVzZXMgYWRkcmVzc2luZyBiYXNlZCBjb3JyZWxhdGlvbiBtZWNoYW5pc20sIGhlbmNlIHdlDQpuZWVkIHRvICJlbmdhZ2UiIGFkZHJlc3NpbmcgbW9kdWxlIGluIHRoZSBzZXJ2ZXIgc2lkZSBhcyB3ZWxsLiBBY2NvcmRpbmcgdG8NCnRoZSBBeGlzMiBhcmNoaXRlY3R1cmUsIGFkZHJlc3NpbmcgbW9kdWxlIHB1dCBpdHMgaGFuZGxlcnMgaW4gdGhlDQoiPHN0cm9uZz5wcmUtZGlzcGF0Y2g8L3N0cm9uZz4iIHBoYXNlIChTZWUgPGENCmhyZWY9IkF4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkFyY2hpdGVjdHVyZSBHdWlkZTwvYT4gZm9yDQptb3JlIGRldGFpbHMgYWJvdXQgcGhhc2VzKaAgYW5kIGhlbmNlICJlbmdhZ2luZyIgbWVhbnMgc2ltcGx5IGFkZGluZyBtb2R1bGUNCnJlZmVyZW5jZSBpbiB0aGUgImF4aXMyLnhtbCIgKE5PVCB0aGUgInNlcnZpY2VzLnhtbCIpLiBOb3cgYWRkIHRoZSBmb2xsb3dpbmcNCmxpbmUgdG8gdGhlICJheGlzMi54bWwiIHRoYXQgeW91IGNhbiBmaW5kIGluIHRoZSAiL3dlYmFwcHMvYXhpczIvV0VCLUlORiINCmRpcmVjdG9yeSBpbiB0aGUgc2VydmxldCBjb250YWluZXIuIDwvcD4NCjxwcmUgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuMmluIj4gJmx0O21vZHVsZSByZWY9ImFkZHJlc3NpbmciLyZndDs8L3ByZT4NCg0KPHA+Tm90ZTogPGZvbnQgY29sb3I9IiMwMDAwMDAiPk9uY2UgeW91IGNoYW5nZSB0aGUgImF4aXMyLnhtbCIgeW91IG5lZWQgdG8NCnJlc3RhcnQgdGhlIHNlcnZsZXQgY29udGFpbmVyLjwvZm9udD48L3A+DQoNCjxwPlRoaXMgd2lsbCBlbmFibGUgdGhlIGFkZHJlc3NpbmcgaW4gdGhlIHNlcnZlciBzaWRlLiBOb3cgeW91IGNhbiB0ZXN0IHRoZQ0KIlRlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50IiB1c2luZyB0aGUgInRlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50Ig0KdGFyZ2V0IG9mIHRoZSBhbnQgZmlsZSBmb3VuZCBhdCAiQXhpczJIb21lL3NhbXBsZXMiIGRpcmVjdG9yeS4gSWYgeW91IHNlZSB0aGUNCnJlc3BvbnNlIE9NRWxlbWVudCBwcmludGVkIGluIHRoZSBjbGllbnQgc2lkZSwgdGhlbiB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkNCnRlc3RlZCB0aGUgTm9uIEJsb2NraW5nIEFQSSB3aXRoIHR3byB0cmFuc3BvcnQgY2hhbm5lbHMgYXQgdGhlIGNsaWVudA0Kc2lkZS48L3A+DQoNCjxoND48YSBuYW1lPSJFY2hvQmxvY2tpbmdEdWFsQ2xpZW50Ij5FY2hvQmxvY2tpbmdEdWFsQ2xpZW50PC9hPjwvaDQ+DQoNCjxwPlRoaXMgaXMgYWdhaW4gYSBUd28tV2F5IHRyYW5zcG9ydCByZXF1ZXN0L3Jlc3BvbnNlIGNsaWVudCwgYnV0IHRoaXMgdGltZSwNCndlIHVzZSBhIEJsb2NraW5nIEFQSSBpbiB0aGUgY2xpZW50IGNvZGUuIFNhbXBsZSBjb2RlIGZvciB0aGlzIGNhbiBiZSBmb3VuZA0KaW4gdGhlICJBeGlzMkhvbWUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzLyIgZGlyZWN0b3J5IGFuZCB0aGUNCmV4cGxhbmF0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIDxhDQpocmVmPSIjRWNob05vbkJsb2NraW5nRHVhbENsaWVudCI+RWNob05vbkJsb2NraW5nRHVhbENsaWVudDwvYT4sIGV4Y2VwdCB0aGF0DQpoZXJlIHdlIGRvIG5vdCB1c2UgYSBjYWxsYmFjayBvYmplY3QgdG8gaGFuZGxlIHJlc3BvbnNlLiBUaGlzIGlzIGEgdmVyeQ0KdXNlZnVsIG1lY2hhbmlzbSB3aGVuIHRoZSBzZXJ2aWNlIGludm9jYXRpb24gaXMgSU4tT1VUIGluIG5hdHVyZSBhbmQgdGhlDQp0cmFuc3BvcnRzIGFyZSBPbmUtV2F5IChlLmcuIFNNVFApLiBGb3IgdGhlIHNhbXBsZSBjbGllbnQgd2UgdXNlIHR3byBIVFRQDQpjb25uZWN0aW9ucyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UuIFVzZXIgY2FuIHRlc3QgdGhpcyBjbGllbnQgdXNpbmcgdGhlDQoiZWNob0Jsb2NraW5nRHVhbENsaWVudCIgdGFyZ2V0IG9mIHRoZSBhbnQgYnVpbGQgZmlsZSBmb3VuZCBpbiB0aGUNCiJBeGlzMkhvbWUvc2FtcGxlcyIgZGlyZWN0b3J5LjwvcD4NCg0KPHA+U2VlIDxhIGhyZWY9Imh0dHAtdHJhbnNwb3J0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Db25maWd1cmluZw0KVHJhbnNwb3J0czwvYT4gZm9yIHVzZSBkaWZmZXJlbnQgdHJhbnNwb3J0cy48L3A+DQoNCjxoMz48YQ0KbmFtZT0iV3JpdGluZ19XZWJfU2VydmljZV9DbGllbnRzX3VzaW5nX0NvZGVfR2VuZXJhdGlvbl93aXRoX0RhdGFfQmluZGluZ19TdXBwb3J0Ij5Xcml0aW5nDQpXZWIgU2VydmljZSBDbGllbnRzIHVzaW5nIENvZGUgR2VuZXJhdGlvbiB3aXRoIERhdGEgQmluZGluZyBTdXBwb3J0PC9hPjwvaDM+DQoNCjxwPkF4aXMyIHByb3ZpZGVzIHRoZSBkYXRhIGJpbmRpbmcgc3VwcG9ydCBmb3IgV2ViIFNlcnZpY2UgY2xpZW50IGFzIHdlbGwuDQpUaGUgdXNlciBjYW4gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHN0dWJzIGZyb20gYSBnaXZlbiBXU0RMIHdpdGggdGhlIG90aGVyDQpzdXBwb3J0aW5nIGNsYXNzZXMuIExldCdzIGdlbmVyYXRlIHN0dWJzIGZvciB0aGUgV1NETCB1c2VkIGVhcmxpZXIgdG8NCmdlbmVyYXRlIHRoZSBza2VsZXRvbiBmb3IgdGhlICJBeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlIi4gU2ltcGx5IHJ1biB0aGUNCldTREwySmF2YSB0b29sIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBBeGlzMg0KZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+DQo8cHJlIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwLjJpbiI+V1NETDJKYXZhIC11cmkgLi5cc2FtcGxlc1x3c2RsXEF4aXMyU2FtcGxlRG9jTGl0LndzZGwgLW8gLi5cc2FtcGxlc1xzcmMgLXAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGU8L3ByZT4NCg0KPHA+VGhpcyB3aWxsIGdlbmVyYXRlIHRoZSByZXF1aXJlZCBzdHViICJBeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlU3R1Yi5qYXZhIg0KdGhhdCBjYW4gYmUgdXNlZCB0byBpbnZva2UgdGhlIFdlYiBTZXJ2aWNlIEF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGUuIExldCdzDQpzZWUgaG93IHdlIGNhbiB1c2UgdGhpcyBzdHViIHRvIHdyaXRlIFdlYiBTZXJ2aWNlIGNsaWVudHMgdG8gdXRpbGl6ZSB0aGUgV2ViDQpTZXJ2aWNlIEF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGUgKHRoZSBzZXJ2aWNlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5DQpkZXBsb3llZCkuPC9wPg0KDQo8aDQ+PGEgbmFtZT0iQ2xpZW50X2Zvcl9lY2hvVm9pZF9PcGVyYXRpb24iPkNsaWVudCBmb3IgZWNob1ZvaWQNCk9wZXJhdGlvbjwvYT48L2g0Pg0KDQo8cD5Gb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyB0aGUgbmVjZXNzYXJ5IGNvZGUgZm9yIHV0aWxpemluZyB0aGUNCmVjaG9Wb2lkIG9wZXJhdGlvbiBvZiB0aGUgQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZSB0aGF0IHdlIGhhdmUgYWxyZWFkeQ0KZGVwbG95ZWQuIEluIHRoaXMgb3BlcmF0aW9uLCBhIGJsYW5rIFNPQVAgYm9keSBlbGVtZW50IGlzIHNlbnQgdG8gdGhlIFdlYg0KU2VydmljZSBhbmQgdGhlIHNhbWUgU09BUCBlbnZlbG9wZSBpcyBlY2hvZWQgYmFjay48L3A+DQo8cHJlPiB0cnkgew0KICAgLy9DcmVhdGUgdGhlIHN0dWIgYnkgcGFzc2luZyB0aGUgQVhJU19IT01FIGFuZCB0YXJnZXQgRVBSLg0KICAgLy9XZSBwYXNzIG51bGwgdG8gdGhlIEFYSVNfSE9NRSBhbmQgaGVuY2UgdGhlIHN0dWIgd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIHRoZSBBWElTX0hPTUUNCiAgIEF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGVTdHViIHN0dWIgPSBuZXcgQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZVN0dWIobnVsbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZSIpOw0KICAgc3R1Yi5lY2hvVm9pZCgpOw0KDQp9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQp9PC9wcmU+DQoNCjxoND48YSBuYW1lPSJDbGllbnRfZm9yX2VjaG9TdHJpbmdfT3BlcmF0aW9uIj5DbGllbnQgZm9yIGVjaG9TdHJpbmcNCk9wZXJhdGlvbjwvYT48L2g0Pg0KDQo8cD5Gb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyB0aGUgbmVjZXNzYXJ5IGNvZGUgZm9yIHV0aWxpemluZyB0aGUNCmVjaG9TdHJpbmcgb3BlcmF0aW9uIG9mIHRoZSBBeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5DQpkZXBsb3llZC4gVGhlIGNvZGUgaXMgdmVyeSBzaW1wbGUgdG8gdW5kZXJzdGFuZCBhbmQgdGhlIGV4cGxhbmF0aW9ucyBhcmUgaW4NCnRoZSBmb3JtIG9mIGNvbW1lbnRzLjwvcD4NCjxwcmU+dHJ5IHsNCiAgICAgLy9DcmVhdGUgdGhlIHN0dWIgYnkgcGFzc2luZyB0aGUgQVhJU19IT01FIGFuZCB0YXJnZXQgRVBSLg0KICAgICAvL1dlIHBhc3MgbnVsbCB0byB0aGUgQVhJU19IT01FIGFuZCBoZW5jZSB0aGUgc3R1YiB3aWxsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgdGhlIEFYSVNfSE9NRSANCiAgICAgQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZVN0dWIgc3R1Yj0gbmV3IEF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGVTdHViKG51bGwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZSIpOw0KICAgICAvL0NyZWF0ZSB0aGUgcmVxdWVzdCBkb2N1bWVudCB0byBiZSBzZW50Lg0KICAgICBFY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCAgcmVxRG9jPSBFY2hvU3RyaW5nUGFyYW1Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQogICAgIHJlcURvYy5zZXRFY2hvU3RyaW5nUGFyYW0oIkF4aXMyIEVjaG8iKTsNCiAgICAgLy9pbnZva2VzIHRoZSB3ZWIgc2VydmljZS4NCiAgICAgRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJlc0RvYz1zdHViLmVjaG9TdHJpbmcocmVxRG9jKTsNCiAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc0RvYy5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KDQogICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCiAgICB9PC9wcmU+DQoNCjxwPlNpbWlsYXJseSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudHMgc2hvdyBjbGllbnQgc2lkZSBjb2RlIGZvcg0KZWNob1N0cmluZ0FycmF5IG9wZXJhdGlvbiBhbmQgZWNob1N0cnVjdCBvcGVyYXRpb24gcmVzcGVjdGl2ZWx5LjwvcD4NCg0KPGg0PjxhIG5hbWU9IkNsaWVudF9mb3JfZWNob1N0cmluZ0FycmF5X09wZXJhdGlvbiI+Q2xpZW50IGZvciBlY2hvU3RyaW5nQXJyYXkNCk9wZXJhdGlvbjwvYT48L2g0Pg0KPHByZT50cnkgew0KICAgICAvL0NyZWF0ZSB0aGUgc3R1YiBieSBwYXNzaW5nIHRoZSBBWElTX0hPTUUgYW5kIHRhcmdldCBFUFIuDQogICAgIC8vV2UgcGFzcyBudWxsIHRvIHRoZSBBWElTX0hPTUUgYW5kIGhlbmNlIHRoZSBzdHViIHdpbGwgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyB0aGUgQVhJU19IT01FDQogICAgIEF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGVTdHViIHN0dWIgPSBuZXcgQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZVN0dWIobnVsbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlIik7DQoNCiAgICAgLy9DcmVhdGUgdGhlIHJlcXVlc3QgZG9jdW1lbnQgdG8gYmUgc2VudC4NCiAgICAgRWNob1N0cmluZ0FycmF5UGFyYW1Eb2N1bWVudCByZXFEb2MgPSBFY2hvU3RyaW5nQXJyYXlQYXJhbURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCiAgICAgQXJyYXlPZnN0cmluZ0xpdGVyYWwgcGFyYW1BcnJheSA9IEFycmF5T2ZzdHJpbmdMaXRlcmFsLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCg0KICAgICBwYXJhbUFycmF5LmFkZFN0cmluZygiQXhpczIiKTsNCiAgICAgcGFyYW1BcnJheS5hZGRTdHJpbmcoIkVjaG8iKTsNCg0KICAgICAgcmVxRG9jLnNldEVjaG9TdHJpbmdBcnJheVBhcmFtKHBhcmFtQXJyYXkpOw0KICAgICAgRWNob1N0cmluZ0FycmF5UmV0dXJuRG9jdW1lbnQgcmVzRG9jID0gc3R1Yi5lY2hvU3RyaW5nQXJyYXkocmVxRG9jKTsNCg0KICAgICAgLy9HZXQgdGhlIHJlc3BvbnNlIHBhcmFtcw0KICAgICAgU3RyaW5nW10gcmVzUGFyYW1zID0gcmVzRG9jLmdldEVjaG9TdHJpbmdBcnJheVJldHVybigpLmdldFN0cmluZ0FycmF5KCk7DQoNCiAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcmVzUGFyYW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNQYXJhbXNbaV0pOw0KICAgICAgfQ0KICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgIH08L3ByZT4NCg0KPGg0PjxhIG5hbWU9IkNsaWVudF9mb3JfZWNob1N0cnVjdF9PcGVyYXRpb24iPkNsaWVudCBmb3IgZWNob1N0cnVjdA0KT3BlcmF0aW9uPC9hPjwvaDQ+DQo8cHJlPnRyeSB7DQogICAgLy9DcmVhdGUgdGhlIHN0dWIgYnkgcGFzc2luZyB0aGUgQVhJU19IT01FIGFuZCB0YXJnZXQgRVBSLg0KICAgIC8vV2UgcGFzcyBudWxsIHRvIHRoZSBBWElTX0hPTUUgYW5kIGhlbmNlIHRoZSBzdHViIHdpbGwgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyB0aGUgQVhJU19IT01FDQogICAgQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZVN0dWIgc3R1YiA9IG5ldyBBeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlU3R1YihudWxsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlNhbXBsZURvY0xpdFBvcnRUeXBlIik7DQogICAgLy9DcmVhdGUgdGhlIHJlcXVlc3QgRG9jdW1lbnQNCiAgICBFY2hvU3RydWN0UGFyYW1Eb2N1bWVudCByZXFEb2MgPSBFY2hvU3RydWN0UGFyYW1Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQoNCiAgICAvL0NyZWF0ZSB0aGUgY29tcGxleCB0eXBlDQogICAgU09BUFN0cnVjdCByZXFTdHJ1Y3QgPSBTT0FQU3RydWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCg0KICAgIHJlcVN0cnVjdC5zZXRWYXJGbG9hdCgxMDAuNTBGKTsNCiAgICByZXFTdHJ1Y3Quc2V0VmFySW50KDEwKTsNCiAgICByZXFTdHJ1Y3Quc2V0VmFyU3RyaW5nKCJIaWdoIik7DQoNCiAgICByZXFEb2Muc2V0RWNob1N0cnVjdFBhcmFtKHJlcVN0cnVjdCk7DQoNCiAgICAvL1NlcnZpY2UgaW52b2NhdGlvbg0KICAgIEVjaG9TdHJ1Y3RSZXR1cm5Eb2N1bWVudCByZXNEb2MgPSBzdHViLmVjaG9TdHJ1Y3QocmVxRG9jKTsNCiAgICBTT0FQU3RydWN0IHJlc1N0cnVjdCA9IHJlc0RvYy5nZXRFY2hvU3RydWN0UmV0dXJuKCk7DQoNCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZsb290IFZhbHVlIDoiICsgcmVzU3RydWN0LmdldFZhckZsb2F0KCkpOw0KICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW50IFZhbHVlIDoiICsgcmVzU3RydWN0LmdldFZhckludCgpKTsNCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyBWYWx1ZSA6IiArIHJlc1N0cnVjdC5nZXRWYXJTdHJpbmcoKSk7DQoNCn0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQogICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCn08L3ByZT4NCg0KPHAgYWxpZ249InJpZ2h0Ij48YSBocmVmPSJ1c2VyZ3VpZGUyLmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvYXJyb3dfbGVmdC5naWYiPg0KUHJldmlvdXM8L2E+IHwgPGEgaHJlZj0idXNlcmd1aWRlNC5odG1sIj5OZXh0IDxpbWcNCnNyYz0iaW1hZ2VzL2Fycm93X3JpZ2h0LmdpZiI+PC9hPjwvcD4NCg0KPHA+UGFnZXM6IDxhIGhyZWY9InVzZXJndWlkZS5odG1sIj5Db250ZW50PC9hPiwgPGENCmhyZWY9InVzZXJndWlkZTEuaHRtbCI+MTwvYT4sIDxhIGhyZWY9InVzZXJndWlkZTIuaHRtbCI+MjwvYT4sIDxiPjM8L2I+LCA8YQ0KaHJlZj0idXNlcmd1aWRlNC5odG1sIj40PC9hPiwgPGEgaHJlZj0idXNlcmd1aWRlNS5odG1sIj41PC9hPjwvcD4NCjwvYm9keT4NCjwvaHRtbD4NCg==