PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgoJPGhlYWQ+CgkJPHRpdGxlPmludHJ1c2l2ZV9wdHI8L3RpdGxlPgoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgoJPC9oZWFkPgoJPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdDb2xvcj0iI2ZmZmZmZiI+CgkJPGgxPjxBIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSI+PElNRyBoZWlnaHQ9Ijg2IiBhbHQ9ImJvb3N0LnBuZyAoNjg5NyBieXRlcykiIHNyYz0iLi4vLi4vYm9vc3QucG5nIiB3aWR0aD0iMjc3IiBhbGlnbj0ibWlkZGxlIgoJCQkJCWJvcmRlcj0iMCI+PC9BPmludHJ1c2l2ZV9wdHIgY2xhc3MgdGVtcGxhdGU8L2gxPgoJCTxwPgoJCQk8QSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L0E+PGJyPgoJCQk8QSBocmVmPSIjU3lub3BzaXMiPlN5bm9wc2lzPC9BPjxicj4KCQkJPEEgaHJlZj0iI01lbWJlcnMiPk1lbWJlcnM8L0E+PGJyPgoJCQk8QSBocmVmPSIjZnVuY3Rpb25zIj5GcmVlIEZ1bmN0aW9uczwvQT48YnI+CgkJPC9wPgoJCTxoMj48YSBuYW1lPSJJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgoJCTxwPlRoZSA8Yj5pbnRydXNpdmVfcHRyPC9iPiBjbGFzcyB0ZW1wbGF0ZSBzdG9yZXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB3aXRoIGFuIAoJCQllbWJlZGRlZCByZWZlcmVuY2UgY291bnQuIEV2ZXJ5IG5ldyA8Yj5pbnRydXNpdmVfcHRyPC9iPiBpbnN0YW5jZSBpbmNyZW1lbnRzIAoJCQl0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IHVzaW5nIGFuIHVucXVhbGlmaWVkIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxTVFJPTkc+aW50cnVzaXZlX3B0cl9hZGRfcmVmPC9TVFJPTkc+LCAKCQkJcGFzc2luZyBpdCB0aGUgcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gU2ltaWxhcmx5LCB3aGVuIGFuIDxTVFJPTkc+aW50cnVzaXZlX3B0cjwvU1RST05HPgoJCQlpcyBkZXN0cm95ZWQsIGl0IGNhbGxzIDxTVFJPTkc+aW50cnVzaXZlX3B0cl9yZWxlYXNlPC9TVFJPTkc+OyB0aGlzIGZ1bmN0aW9uIGlzIAoJCQlyZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZyB0aGUgb2JqZWN0IHdoZW4gaXRzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLiAKCQkJVGhlIHVzZXIgaXMgZXhwZWN0ZWQgdG8gcHJvdmlkZSBzdWl0YWJsZSBkZWZpbml0aW9ucyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLiBPbiAKCQkJY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwLCA8U1RST05HPmludHJ1c2l2ZV9wdHJfYWRkX3JlZjwvU1RST05HPgoJCQlhbmQgPFNUUk9ORz5pbnRydXNpdmVfcHRyX3JlbGVhc2U8L1NUUk9ORz4gc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSAKCQkJdGhhdCBjb3JyZXNwb25kcyB0byB0aGVpciBwYXJhbWV0ZXI7IG90aGVyd2lzZSwgdGhlIGRlZmluaXRpb25zIG5lZWQgdG8gZ28gaW4gCgkJCW5hbWVzcGFjZSA8U1RST05HPmJvb3N0PC9TVFJPTkc+LjwvcD4KCQk8cD5UaGUgY2xhc3MgdGVtcGxhdGUgaXMgcGFyYW1ldGVyaXplZCBvbiA8Yj5UPC9iPiwgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBwb2ludGVkIAoJCQl0by4gPFNUUk9ORz5pbnRydXNpdmVfcHRyJmx0O1QmZ3Q7PC9TVFJPTkc+IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byA8U1RST05HPmludHJ1c2l2ZV9wdHImbHQ7VSZndDs8L1NUUk9ORz4KCQkJd2hlbmV2ZXIgPFNUUk9ORz5UKjwvU1RST05HPiBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gPFNUUk9ORz5VKjwvU1RST05HPi48L3A+CgkJPFA+VGhlIG1haW4gcmVhc29ucyB0byB1c2UgPFNUUk9ORz5pbnRydXNpdmVfcHRyPC9TVFJPTkc+IGFyZTo8L1A+CgkJPFVMPgoJCQk8TEk+CgkJCVNvbWUgZXhpc3RpbmcgZnJhbWV3b3JrcyBvciBPU2VzIHByb3ZpZGUgb2JqZWN0cyB3aXRoIGVtYmVkZGVkIHJlZmVyZW5jZSAKCQkJY291bnRzOwoJCQk8TEk+CgkJCQlUaGUgbWVtb3J5IGZvb3RwcmludCBvZiA8U1RST05HPmludHJ1c2l2ZV9wdHI8L1NUUk9ORz4KCQkJaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgcmF3IHBvaW50ZXI7CgkJCTxMST4KCQkJCTxTVFJPTkc+aW50cnVzaXZlX3B0ciZsdDtUJmd0OzwvU1RST05HPiBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhbiBhcmJpdHJhcnkgCgkJCQlyYXcgcG9pbnRlciBvZiB0eXBlIDxTVFJPTkc+VCAqPC9TVFJPTkc+LjwvTEk+PC9VTD4KCQk8UD5BcyBhIGdlbmVyYWwgcnVsZSwgaWYgaXQgaXNuJ3Qgb2J2aW91cyB3aGV0aGVyIDxTVFJPTkc+aW50cnVzaXZlX3B0cjwvU1RST05HPiBiZXR0ZXIgCgkJCWZpdHMgeW91ciBuZWVkcyB0aGFuIDxTVFJPTkc+c2hhcmVkX3B0cjwvU1RST05HPiwgdHJ5IGEgPFNUUk9ORz5zaGFyZWRfcHRyPC9TVFJPTkc+LWJhc2VkIAoJCQlkZXNpZ24gZmlyc3QuPC9QPgoJCTxoMj48YSBuYW1lPSJTeW5vcHNpcyI+U3lub3BzaXM8L2E+PC9oMj4KCQk8cHJlPm5hbWVzcGFjZSBib29zdCB7CgogIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IGNsYXNzIGludHJ1c2l2ZV9wdHIgewoKICAgIHB1YmxpYzoKCiAgICAgIHR5cGVkZWYgVCA8QSBocmVmPSIjZWxlbWVudF90eXBlIiA+ZWxlbWVudF90eXBlPC9BPjsKCiAgICAgIDxBIGhyZWY9IiNjb25zdHJ1Y3RvcnMiID5pbnRydXNpdmVfcHRyPC9BPigpOyAvLyBuZXZlciB0aHJvd3MKICAgICAgPEEgaHJlZj0iI2NvbnN0cnVjdG9ycyIgPmludHJ1c2l2ZV9wdHI8L0E+KFQgKiBwLCBib29sIGFkZF9yZWYgPSB0cnVlKTsKCiAgICAgIDxBIGhyZWY9IiNjb25zdHJ1Y3RvcnMiID5pbnRydXNpdmVfcHRyPC9BPihpbnRydXNpdmVfcHRyIGNvbnN0ICZhbXA7IHIpOwogICAgICB0ZW1wbGF0ZSZsdDtjbGFzcyBZJmd0OyA8QSBocmVmPSIjY29uc3RydWN0b3JzIiA+aW50cnVzaXZlX3B0cjwvQT4oaW50cnVzaXZlX3B0ciZsdDtZJmd0OyBjb25zdCAmYW1wOyByKTsKCiAgICAgIDxBIGhyZWY9IiNkZXN0cnVjdG9yIiA+fmludHJ1c2l2ZV9wdHI8L0E+KCk7CgogICAgICBpbnRydXNpdmVfcHRyICZhbXA7IDxBIGhyZWY9IiNhc3NpZ25tZW50IiA+b3BlcmF0b3I9PC9BPihpbnRydXNpdmVfcHRyIGNvbnN0ICZhbXA7IHIpOwogICAgICB0ZW1wbGF0ZSZsdDtjbGFzcyBZJmd0OyBpbnRydXNpdmVfcHRyICZhbXA7IDxBIGhyZWY9IiNhc3NpZ25tZW50IiA+b3BlcmF0b3I9PC9BPihpbnRydXNpdmVfcHRyJmx0O1kmZ3Q7IGNvbnN0ICZhbXA7IHIpOwogICAgICBpbnRydXNpdmVfcHRyICZhbXA7IDxBIGhyZWY9IiNhc3NpZ25tZW50IiA+b3BlcmF0b3I9PC9BPihUICogcik7CgogICAgICB2b2lkIDxhIGhyZWY9IiNyZXNldCIgPnJlc2V0PC9hPigpOwogICAgICB2b2lkIDxhIGhyZWY9IiNyZXNldCIgPnJlc2V0PC9hPihUICogcik7CgogICAgICBUICZhbXA7IDxBIGhyZWY9IiNpbmRpcmVjdGlvbiIgPm9wZXJhdG9yKjwvQT4oKSBjb25zdDsgLy8gbmV2ZXIgdGhyb3dzCiAgICAgIFQgKiA8QSBocmVmPSIjaW5kaXJlY3Rpb24iID5vcGVyYXRvci0mZ3Q7PC9BPigpIGNvbnN0OyAvLyBuZXZlciB0aHJvd3MKICAgICAgVCAqIDxBIGhyZWY9IiNnZXQiID5nZXQ8L0E+KCkgY29uc3Q7IC8vIG5ldmVyIHRocm93cwoKICAgICAgb3BlcmF0b3IgPEEgaHJlZj0iI2NvbnZlcnNpb25zIiA+PGk+dW5zcGVjaWZpZWQtYm9vbC10eXBlPC9pPjwvQT4oKSBjb25zdDsgLy8gbmV2ZXIgdGhyb3dzCgogICAgICB2b2lkIDxBIGhyZWY9IiNzd2FwIiA+c3dhcDwvQT4oaW50cnVzaXZlX3B0ciAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzCiAgfTsKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICAgIGJvb2wgPEEgaHJlZj0iI2NvbXBhcmlzb24iID5vcGVyYXRvcj09PC9BPihpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IGNvbnN0ICZhbXA7IGEsIGludHJ1c2l2ZV9wdHImbHQ7VSZndDsgY29uc3QgJmFtcDsgYik7IC8vIG5ldmVyIHRocm93cwoKICB0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwogICAgYm9vbCA8QSBocmVmPSIjY29tcGFyaXNvbiIgPm9wZXJhdG9yIT08L0E+KGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgY29uc3QgJmFtcDsgYSwgaW50cnVzaXZlX3B0ciZsdDtVJmd0OyBjb25zdCAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzCgogIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7CiAgICBib29sIDxBIGhyZWY9IiNjb21wYXJpc29uIiA+b3BlcmF0b3I9PTwvQT4oaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdCAmYW1wOyBhLCBUICogYik7IC8vIG5ldmVyIHRocm93cwoKICB0ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OwogICAgYm9vbCA8QSBocmVmPSIjY29tcGFyaXNvbiIgPm9wZXJhdG9yIT08L0E+KGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgY29uc3QgJmFtcDsgYSwgVCAqIGIpOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsKICAgIGJvb2wgPEEgaHJlZj0iI2NvbXBhcmlzb24iID5vcGVyYXRvcj09PC9BPihUICogYSwgaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdCAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzCgogIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7CiAgICBib29sIDxBIGhyZWY9IiNjb21wYXJpc29uIiA+b3BlcmF0b3IhPTwvQT4oVCAqIGEsIGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgY29uc3QgJmFtcDsgYik7IC8vIG5ldmVyIHRocm93cwoKICB0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwogICAgYm9vbCA8QSBocmVmPSIjY29tcGFyaXNvbiIgPm9wZXJhdG9yJmx0OzwvQT4oaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdCAmYW1wOyBhLCBpbnRydXNpdmVfcHRyJmx0O1UmZ3Q7IGNvbnN0ICZhbXA7IGIpOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgdm9pZCA8QSBocmVmPSIjZnJlZS1zd2FwIiA+c3dhcDwvQT4oaW50cnVzaXZlX3B0ciZsdDtUJmd0OyAmYW1wOyBhLCBpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7ICZhbXA7IGIpOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgVCAqIDxBIGhyZWY9IiNnZXRfcG9pbnRlciIgPmdldF9wb2ludGVyPC9BPihpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IGNvbnN0ICZhbXA7IHApOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICAgIGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgPEEgaHJlZj0iI3N0YXRpY19wb2ludGVyX2Nhc3QiID5zdGF0aWNfcG9pbnRlcl9jYXN0PC9BPihpbnRydXNpdmVfcHRyJmx0O1UmZ3Q7IGNvbnN0ICZhbXA7IHIpOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICAgIGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgPEEgaHJlZj0iI2NvbnN0X3BvaW50ZXJfY2FzdCIgPmNvbnN0X3BvaW50ZXJfY2FzdDwvQT4oaW50cnVzaXZlX3B0ciZsdDtVJmd0OyBjb25zdCAmYW1wOyByKTsgLy8gbmV2ZXIgdGhyb3dzCgogIHRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CiAgICBpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IDxBIGhyZWY9IiNkeW5hbWljX3BvaW50ZXJfY2FzdCIgPmR5bmFtaWNfcG9pbnRlcl9jYXN0PC9BPihpbnRydXNpdmVfcHRyJmx0O1UmZ3Q7IGNvbnN0ICZhbXA7IHIpOyAvLyBuZXZlciB0aHJvd3MKCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgRSwgY2xhc3MgVCwgY2xhc3MgWSZndDsKICAgIHN0ZDo6YmFzaWNfb3N0cmVhbSZsdDtFLCBUJmd0OyAmYW1wOyA8QSBocmVmPSIjaW5zZXJ0aW9uLW9wZXJhdG9yIiA+b3BlcmF0b3ImbHQ7Jmx0OzwvQT4gKHN0ZDo6YmFzaWNfb3N0cmVhbSZsdDtFLCBUJmd0OyAmYW1wOyBvcywgaW50cnVzaXZlX3B0ciZsdDtZJmd0OyBjb25zdCAmYW1wOyBwKTsKCn08L3ByZT4KCQk8aDI+PGEgbmFtZT0iTWVtYmVycyI+TWVtYmVyczwvYT48L2gyPgoJCTxoMz48YSBuYW1lPSJlbGVtZW50X3R5cGUiPmVsZW1lbnRfdHlwZTwvYT48L2gzPgoJCTxwcmU+dHlwZWRlZiBUIGVsZW1lbnRfdHlwZTs8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+UHJvdmlkZXMgdGhlIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBULjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPGgzPjxhIG5hbWU9ImNvbnN0cnVjdG9ycyI+Y29uc3RydWN0b3JzPC9hPjwvaDM+CgkJPHByZT5pbnRydXNpdmVfcHRyKCk7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5Qb3N0Y29uZGl0aW9uczo8L2I+IDxjb2RlPmdldCgpID09IDA8L2NvZGU+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxwcmU+aW50cnVzaXZlX3B0cihUICogcCwgYm9vbCBhZGRfcmVmID0gdHJ1ZSk7PC9wcmU+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPkVmZmVjdHM6PC9iPiA8Y29kZT5pZihwICE9IDAgJmFtcDsmYW1wOyBhZGRfcmVmKSBpbnRydXNpdmVfcHRyX2FkZF9yZWYocCk7PC9jb2RlPi48L3A+CgkJCTxwPjxiPlBvc3Rjb25kaXRpb25zOjwvYj4gPGNvZGU+Z2V0KCkgPT0gcDwvY29kZT4uPC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8cHJlPmludHJ1c2l2ZV9wdHIoaW50cnVzaXZlX3B0ciBjb25zdCAmYW1wOyByKTsKdGVtcGxhdGUmbHQ7Y2xhc3MgWSZndDsgaW50cnVzaXZlX3B0cihpbnRydXNpdmVfcHRyJmx0O1kmZ3Q7IGNvbnN0ICZhbXA7IHIpOzwvcHJlPgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5FZmZlY3RzOjwvYj4gPGNvZGU+aWYoci5nZXQoKSAhPSAwKSBpbnRydXNpdmVfcHRyX2FkZF9yZWYoci5nZXQoKSk7PC9jb2RlPi48L3A+CgkJCTxwPjxiPlBvc3Rjb25kaXRpb25zOjwvYj4gPGNvZGU+Z2V0KCkgPT0gci5nZXQoKTwvY29kZT4uPC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8aDM+PGEgbmFtZT0iZGVzdHJ1Y3RvciI+ZGVzdHJ1Y3RvcjwvYT48L2gzPgoJCTxwcmU+fmludHJ1c2l2ZV9wdHIoKTs8L3ByZT4KCQk8QkxPQ0tRVU9URT4KCQkJPFA+PEI+RWZmZWN0czo8L0I+IDxjb2RlPmlmKGdldCgpICE9IDApIGludHJ1c2l2ZV9wdHJfcmVsZWFzZShnZXQoKSk7PC9jb2RlPi48L1A+CgkJPC9CTE9DS1FVT1RFPgoJCTxIMz48YSBuYW1lPSJhc3NpZ25tZW50Ij5hc3NpZ25tZW50PC9hPjwvSDM+CgkJPHByZT5pbnRydXNpdmVfcHRyICZhbXA7IG9wZXJhdG9yPShpbnRydXNpdmVfcHRyIGNvbnN0ICZhbXA7IHIpOwp0ZW1wbGF0ZSZsdDtjbGFzcyBZJmd0OyBpbnRydXNpdmVfcHRyICZhbXA7IG9wZXJhdG9yPShpbnRydXNpdmVfcHRyJmx0O1kmZ3Q7IGNvbnN0ICZhbXA7IHIpOwppbnRydXNpdmVfcHRyICZhbXA7IG9wZXJhdG9yPShUICogcik7PC9wcmU+CgkJPEJMT0NLUVVPVEU+CgkJCTxQPjxCPkVmZmVjdHM6PC9CPiBFcXVpdmFsZW50IHRvIDxjb2RlPmludHJ1c2l2ZV9wdHIocikuc3dhcCgqdGhpcyk8L2NvZGU+LjwvUD4KCQkJPFA+PEI+UmV0dXJuczo8L0I+IDxjb2RlPip0aGlzPC9jb2RlPi48L1A+CgkJPC9CTE9DS1FVT1RFPgoJCTxIMz48YSBuYW1lPSJyZXNldCI+cmVzZXQ8L2E+PC9IMz4KCQk8cHJlPnZvaWQgcmVzZXQoKTs8L3ByZT4KCQk8QkxPQ0tRVU9URT4KCQkJPFA+PEI+RWZmZWN0czo8L0I+IEVxdWl2YWxlbnQgdG8gPGNvZGU+aW50cnVzaXZlX3B0cigpLnN3YXAoKnRoaXMpPC9jb2RlPi48L1A+CgkJPC9CTE9DS1FVT1RFPgoJCTxwcmU+dm9pZCByZXNldChUICogcik7PC9wcmU+CgkJPEJMT0NLUVVPVEU+CgkJCTxQPjxCPkVmZmVjdHM6PC9CPiBFcXVpdmFsZW50IHRvIDxjb2RlPmludHJ1c2l2ZV9wdHIocikuc3dhcCgqdGhpcyk8L2NvZGU+LjwvUD4KCQk8L0JMT0NLUVVPVEU+CgkJPGgzPjxhIG5hbWU9ImluZGlyZWN0aW9uIj5pbmRpcmVjdGlvbjwvYT48L2gzPgoJCTxwcmU+VCAmYW1wOyBvcGVyYXRvciooKSBjb25zdDsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPlJlcXVpcmVtZW50czo8L2I+IDxjb2RlPmdldCgpICE9IDA8L2NvZGU+LjwvcD4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IDxjb2RlPipnZXQoKTwvY29kZT4uPC9wPgoJCQk8cD48Yj5UaHJvd3M6PC9iPiBub3RoaW5nLjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPHByZT5UICogb3BlcmF0b3ItJmd0OygpIGNvbnN0OyAvLyBuZXZlciB0aHJvd3M8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmVxdWlyZW1lbnRzOjwvYj4gPGNvZGU+Z2V0KCkgIT0gMDwvY29kZT4uPC9wPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gPGNvZGU+Z2V0KCk8L2NvZGU+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoMz48YSBuYW1lPSJnZXQiPmdldDwvYT48L2gzPgoJCTxwcmU+VCAqIGdldCgpIGNvbnN0OyAvLyBuZXZlciB0aHJvd3M8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IHRoZSBzdG9yZWQgcG9pbnRlci48L3A+CgkJCTxwPjxiPlRocm93czo8L2I+IG5vdGhpbmcuPC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8aDM+PGEgbmFtZT0iY29udmVyc2lvbnMiPmNvbnZlcnNpb25zPC9hPjwvaDM+CgkJPHByZT5vcGVyYXRvciA8aT51bnNwZWNpZmllZC1ib29sLXR5cGU8L2k+ICgpIGNvbnN0OyAvLyBuZXZlciB0aHJvd3M8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IGFuIHVuc3BlY2lmaWVkIHZhbHVlIHRoYXQsIHdoZW4gdXNlZCBpbiBib29sZWFuIGNvbnRleHRzLCBpcyAKCQkJCWVxdWl2YWxlbnQgdG8gPGNvZGU+Z2V0KCkgIT0gMDwvY29kZT4uPC9wPgoJCQk8cD48Yj5UaHJvd3M6PC9iPiBub3RoaW5nLjwvcD4KCQkJPFA+PEI+Tm90ZXM6PC9CPiBUaGlzIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIDxiPmludHJ1c2l2ZV9wdHI8L2I+IG9iamVjdHMgdG8gYmUgCgkJCQl1c2VkIGluIGJvb2xlYW4gY29udGV4dHMsIGxpa2UgPGNvZGU+aWYgKHAgJmFtcDsmYW1wOyBwLSZndDt2YWxpZCgpKSB7fTwvY29kZT4uIAoJCQkJVGhlIGFjdHVhbCB0YXJnZXQgdHlwZSBpcyB0eXBpY2FsbHkgYSBwb2ludGVyIHRvIGEgbWVtYmVyIGZ1bmN0aW9uLCBhdm9pZGluZyAKCQkJCW1hbnkgb2YgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gcGl0ZmFsbHMuPC9QPgoJCTwvYmxvY2txdW90ZT4KCQk8aDM+PGEgbmFtZT0ic3dhcCI+c3dhcDwvYT48L2gzPgoJCTxwcmU+dm9pZCBzd2FwKGludHJ1c2l2ZV9wdHIgJmFtcDsgYik7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5FZmZlY3RzOjwvYj4gRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgdHdvIHNtYXJ0IHBvaW50ZXJzLjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoMj48YSBuYW1lPSJmdW5jdGlvbnMiPkZyZWUgRnVuY3Rpb25zPC9hPjwvaDI+CgkJPGgzPjxhIG5hbWU9ImNvbXBhcmlzb24iPmNvbXBhcmlzb248L2E+PC9oMz4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CiAgYm9vbCBvcGVyYXRvcj09KGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgY29uc3QgJmFtcDsgYSwgaW50cnVzaXZlX3B0ciZsdDtVJmd0OyBjb25zdCAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPlJldHVybnM6PC9iPiA8Y29kZT5hLmdldCgpID09IGIuZ2V0KCk8L2NvZGU+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxwcmU+dGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICBib29sIG9wZXJhdG9yIT0oaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdCAmYW1wOyBhLCBpbnRydXNpdmVfcHRyJmx0O1UmZ3Q7IGNvbnN0ICZhbXA7IGIpOyAvLyBuZXZlciB0aHJvd3M8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IDxjb2RlPmEuZ2V0KCkgIT0gYi5nZXQoKTwvY29kZT4uPC9wPgoJCQk8cD48Yj5UaHJvd3M6PC9iPiBub3RoaW5nLjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwogIGJvb2wgb3BlcmF0b3I9PShpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IGNvbnN0ICZhbXA7IGEsIFUgKiBiKTsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPlJldHVybnM6PC9iPiA8Y29kZT5hLmdldCgpID09IGI8L2NvZGU+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxwcmU+dGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICBib29sIG9wZXJhdG9yIT0oaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdCAmYW1wOyBhLCBVICogYik7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gPGNvZGU+YS5nZXQoKSAhPSBiPC9jb2RlPi48L3A+CgkJCTxwPjxiPlRocm93czo8L2I+IG5vdGhpbmcuPC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CiAgYm9vbCBvcGVyYXRvcj09KFQgKiBhLCBpbnRydXNpdmVfcHRyJmx0O1UmZ3Q7IGNvbnN0ICZhbXA7IGIpOyAvLyBuZXZlciB0aHJvd3M8L3ByZT4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IDxjb2RlPmEgPT0gYi5nZXQoKTwvY29kZT4uPC9wPgoJCQk8cD48Yj5UaHJvd3M6PC9iPiBub3RoaW5nLjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwogIGJvb2wgb3BlcmF0b3IhPShUICogYSwgaW50cnVzaXZlX3B0ciZsdDtVJmd0OyBjb25zdCAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPlJldHVybnM6PC9iPiA8Y29kZT5hICE9IGIuZ2V0KCk8L2NvZGU+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gbm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxwcmU+dGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICBib29sIG9wZXJhdG9yJmx0OyhpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IGNvbnN0ICZhbXA7IGEsIGludHJ1c2l2ZV9wdHImbHQ7VSZndDsgY29uc3QgJmFtcDsgYik7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gPGNvZGU+c3RkOjpsZXNzJmx0O1QgKiZndDsoKShhLmdldCgpLCBiLmdldCgpKTwvY29kZT4uPC9wPgoJCQk8cD48Yj5UaHJvd3M6PC9iPiBub3RoaW5nLjwvcD4KCQkJPFA+PEI+Tm90ZXM6PC9CPiBBbGxvd3MgPFNUUk9ORz5pbnRydXNpdmVfcHRyPC9TVFJPTkc+IG9iamVjdHMgdG8gYmUgdXNlZCBhcyBrZXlzIAoJCQkJaW4gYXNzb2NpYXRpdmUgY29udGFpbmVycy48L1A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoMz48YSBuYW1lPSJmcmVlLXN3YXAiPnN3YXA8L2E+PC9oMz4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7CiAgdm9pZCBzd2FwKGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgJmFtcDsgYSwgaW50cnVzaXZlX3B0ciZsdDtUJmd0OyAmYW1wOyBiKTsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPEJMT0NLUVVPVEU+CgkJCTxQPjxCPkVmZmVjdHM6PC9CPiBFcXVpdmFsZW50IHRvIDxjb2RlPmEuc3dhcChiKTwvY29kZT4uPC9QPgoJCQk8UD48Qj5UaHJvd3M6PC9CPiBub3RoaW5nLjwvUD4KCQkJPFA+PEI+Tm90ZXM6PC9CPiBNYXRjaGVzIHRoZSBpbnRlcmZhY2Ugb2YgPEI+c3RkOjpzd2FwPC9CPi4gUHJvdmlkZWQgYXMgYW4gYWlkIHRvIAoJCQkJZ2VuZXJpYyBwcm9ncmFtbWluZy48L1A+CgkJPC9CTE9DS1FVT1RFPgoJCTxoMz48YSBuYW1lPSJnZXRfcG9pbnRlciI+Z2V0X3BvaW50ZXI8L2E+PC9oMz4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7CiAgVCAqIGdldF9wb2ludGVyKGludHJ1c2l2ZV9wdHImbHQ7VCZndDsgY29uc3QgJmFtcDsgcCk7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxCTE9DS1FVT1RFPgoJCQk8UD48Qj5SZXR1cm5zOjwvQj4gPGNvZGU+cC5nZXQoKTwvY29kZT4uPC9QPgoJCQk8UD48Qj5UaHJvd3M6PC9CPiBub3RoaW5nLjwvUD4KCQkJPFA+PEI+Tm90ZXM6PC9CPiBQcm92aWRlZCBhcyBhbiBhaWQgdG8gZ2VuZXJpYyBwcm9ncmFtbWluZy4gVXNlZCBieSA8QSBocmVmPSIuLi9iaW5kL21lbV9mbi5odG1sIj4KCQkJCQltZW1fZm48L0E+LjwvUD4KCQk8L0JMT0NLUVVPVEU+CgkJPGgzPjxhIG5hbWU9InN0YXRpY19wb2ludGVyX2Nhc3QiPnN0YXRpY19wb2ludGVyX2Nhc3Q8L2E+PC9oMz4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CiAgaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBzdGF0aWNfcG9pbnRlcl9jYXN0KGludHJ1c2l2ZV9wdHImbHQ7VSZndDsgY29uc3QgJmFtcDsgcik7IC8vIG5ldmVyIHRocm93czwvcHJlPgoJCTxCTE9DS1FVT1RFPgoJCQk8UD48Qj5SZXR1cm5zOjwvQj4gPGNvZGU+aW50cnVzaXZlX3B0ciZsdDtUJmd0OyhzdGF0aWNfY2FzdCZsdDtUKiZndDsoci5nZXQoKSkpPC9jb2RlPi48L1A+CgkJCTxQPjxCPlRocm93czo8L0I+IG5vdGhpbmcuPC9QPgoJCTwvQkxPQ0tRVU9URT4KCQk8aDM+PGEgbmFtZT0iY29uc3RfcG9pbnRlcl9jYXN0Ij5jb25zdF9wb2ludGVyX2Nhc3Q8L2E+PC9oMz4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CiAgaW50cnVzaXZlX3B0ciZsdDtUJmd0OyBjb25zdF9wb2ludGVyX2Nhc3QoaW50cnVzaXZlX3B0ciZsdDtVJmd0OyBjb25zdCAmYW1wOyByKTsgLy8gbmV2ZXIgdGhyb3dzPC9wcmU+CgkJPEJMT0NLUVVPVEU+CgkJCTxQPjxCPlJldHVybnM6PC9CPiA8Y29kZT5pbnRydXNpdmVfcHRyJmx0O1QmZ3Q7KGNvbnN0X2Nhc3QmbHQ7VComZ3Q7KHIuZ2V0KCkpKTwvY29kZT4uPC9QPgoJCQk8UD48Qj5UaHJvd3M6PC9CPiBub3RoaW5nLjwvUD4KCQk8L0JMT0NLUVVPVEU+CgkJPGgzPjxhIG5hbWU9ImR5bmFtaWNfcG9pbnRlcl9jYXN0Ij5keW5hbWljX3BvaW50ZXJfY2FzdDwvYT48L2gzPgoJCTxwcmU+dGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsKICBpbnRydXNpdmVfcHRyJmx0O1QmZ3Q7IGR5bmFtaWNfcG9pbnRlcl9jYXN0KGludHJ1c2l2ZV9wdHImbHQ7VSZndDsgY29uc3QgJmFtcDsgcik7PC9wcmU+CgkJPEJMT0NLUVVPVEU+CgkJCTxQPjxCPlJldHVybnM6PC9CPiA8Y29kZT5pbnRydXNpdmVfcHRyJmx0O1QmZ3Q7KGR5bmFtaWNfY2FzdCZsdDtUKiZndDsoci5nZXQoKSkpPC9jb2RlPi48L1A+CgkJCTxQPjxCPlRocm93czo8L0I+IG5vdGhpbmcuPC9QPgoJCTwvQkxPQ0tRVU9URT4KCQk8aDM+PGEgbmFtZT0iaW5zZXJ0aW9uLW9wZXJhdG9yIj5vcGVyYXRvciZsdDsmbHQ7PC9hPjwvaDM+CgkJPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBFLCBjbGFzcyBULCBjbGFzcyBZJmd0OwogICAgc3RkOjpiYXNpY19vc3RyZWFtJmx0O0UsIFQmZ3Q7ICZhbXA7IG9wZXJhdG9yJmx0OyZsdDsgKHN0ZDo6YmFzaWNfb3N0cmVhbSZsdDtFLCBUJmd0OyAmYW1wOyBvcywgaW50cnVzaXZlX3B0ciZsdDtZJmd0OyBjb25zdCAmYW1wOyBwKTs8L3ByZT4KCQk8QkxPQ0tRVU9URT4KCQkJPHA+PFNUUk9ORz5FZmZlY3RzOjwvU1RST05HPiA8Y29kZT5vcyAmbHQ7Jmx0OyBwLmdldCgpOzwvY29kZT4uPC9wPgoJCQk8UD48Qj5SZXR1cm5zOjwvQj4gPGNvZGU+b3M8L2NvZGU+LjwvUD4KCQk8L0JMT0NLUVVPVEU+CgkJPGhyPgoJCTxwPgoJCQkkRGF0ZTogMjAwOC0wNy0xMiAwNzozNzoxNiAtMDQwMCAoU2F0LCAxMiBKdWwgMjAwOCkgJDwvcD4KCQk8cD4KCQkJPHNtYWxsPkNvcHlyaWdodCCpIDIwMDMtMjAwNSBQZXRlciBEaW1vdi4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gCgkJCQkxLjAuIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSA8QSBocmVmPSIuLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvQT4gb3IgCgkJCQljb3B5IGF0IDxBIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9BPi48L3NtYWxsPjwvcD4KCTwvYm9keT4KPC9odG1sPgo=