PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KPGh0bWw+Cgk8aGVhZD4KCQk8dGl0bGU+Qm9vc3Q6IGJpbmQuaHBwIGRvY3VtZW50YXRpb248L3RpdGxlPgoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgoJPC9oZWFkPgoJPGJvZHkgc3R5bGU9Ik1BUkdJTi1MRUZUOiA1JTsgTUFSR0lOLVJJR0hUOiA1JSIgYmdDb2xvcj0id2hpdGUiPgoJCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIj4KCQkJPHRyPgoJCQkJPHRkIHdpZHRoPSIyNzciPjxBIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSI+PElNRyBoZWlnaHQ9Ijg2IiBhbHQ9ImJvb3N0LnBuZyAoNjg5NyBieXRlcykiIHNyYz0iLi4vLi4vYm9vc3QucG5nIiB3aWR0aD0iMjc3IiBib3JkZXI9IjAiPjwvQT4KCQkJCTwvdGQ+CgkJCQk8dGQgYWxpZ249ImNlbnRlciI+CgkJCQkJPGgxPmJpbmQuaHBwPC9oMT4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTx0ZCBjb2xTcGFuPSIyIiBoZWlnaHQ9IjY0Ij4mbmJzcDs8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+CgkJPGgyPkNvbnRlbnRzPC9oMj4KCQk8aDMgc3R5bGU9Ik1BUkdJTi1MRUZUOiAyMHB0Ij48QSBocmVmPSIjUHVycG9zZSI+UHVycG9zZTwvQT48L2gzPgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiN3aXRoX2Z1bmN0aW9ucyI+VXNpbmcgYmluZCB3aXRoIGZ1bmN0aW9ucyBhbmQgCgkJCQlmdW5jdGlvbiBwb2ludGVyczwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiN3aXRoX2Z1bmN0aW9uX29iamVjdHMiPlVzaW5nIGJpbmQgd2l0aCBmdW5jdGlvbiAKCQkJCW9iamVjdHM8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjd2l0aF9tZW1iZXJfcG9pbnRlcnMiPlVzaW5nIGJpbmQgd2l0aCBwb2ludGVycyAKCQkJCXRvIG1lbWJlcnM8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjbmVzdGVkX2JpbmRzIj5Vc2luZyBuZXN0ZWQgYmluZHMgZm9yIGZ1bmN0aW9uIAoJCQkJY29tcG9zaXRpb248L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjb3BlcmF0b3JzIj5PdmVybG9hZGVkIG9wZXJhdG9yczwvQT48L2g0PgoJCTxoMyBzdHlsZT0iTUFSR0lOLUxFRlQ6IDIwcHQiPjxBIGhyZWY9IiNFeGFtcGxlcyI+RXhhbXBsZXM8L0E+PC9oMz4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjd2l0aF9hbGdvcml0aG1zIj5Vc2luZyBiaW5kIHdpdGggc3RhbmRhcmQgCgkJCQlhbGdvcml0aG1zPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI3dpdGhfYm9vc3RfZnVuY3Rpb24iPlVzaW5nIGJpbmQgd2l0aCAKCQkJCUJvb3N0LkZ1bmN0aW9uPC9BPjwvaDQ+CgkJPGgzIHN0eWxlPSJNQVJHSU4tTEVGVDogMjBwdCI+PEEgaHJlZj0iI0xpbWl0YXRpb25zIj5MaW1pdGF0aW9uczwvQT48L2gzPgoJCTxoMyBzdHlsZT0iTUFSR0lOLUxFRlQ6IDIwcHQiPjxBIGhyZWY9IiNGQVEiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9BPjwvaDM+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI1FfZG9lc250X2NvbXBpbGUiPldoeSBkb2Vzbid0IHRoaXMgY29tcGlsZT88L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjUV9kb2VzX2NvbXBpbGUiPldoeSBkb2VzIHRoaXMgY29tcGlsZT8gSXQgCgkJCQlzaG91bGQgbm90LjwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNRX2Zvcm1zIj5XaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmluZChmLCAKCQkJCS4uLikgYW5kIGJpbmQmbHQ7UiZndDsoZiwgLi4uKT88L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjUV93aW4zMl9hcGkiPkRvZXMgPGI+YmluZDwvYj4gd29yayB3aXRoIFdpbmRvd3MgCgkJCQlBUEkgZnVuY3Rpb25zPzwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNRX2NvbSI+RG9lcyA8Yj5iaW5kPC9iPiB3b3JrIHdpdGggQ09NIG1ldGhvZHM/PC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI1FfbWFjIj5Eb2VzIDxiPmJpbmQ8L2I+IHdvcmsgd2l0aCBNYWMgdG9vbGJveCAKCQkJCWZ1bmN0aW9ucz88L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjUV9leHRlcm5fQyI+RG9lcyA8Yj5iaW5kPC9iPiB3b3JrIHdpdGggZXh0ZXJuIAoJCQkJIkMiIGZ1bmN0aW9ucz88L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjUV9hdXRvX3N0ZGNhbGwiPldoeSBkb2Vzbid0IDxiPmJpbmQ8L2I+IGF1dG9tYXRpY2FsbHkgCgkJCQlyZWNvZ25pemUgbm9uc3RhbmRhcmQgZnVuY3Rpb25zPzwvQT48L2g0PgoJCTxoMyBzdHlsZT0iTUFSR0lOLUxFRlQ6IDIwcHQiPjxBIGhyZWY9IiNUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZzwvQT48L2gzPgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNlcnJfbnVtX2FyZ3MiPkluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2Vycl9zaWduYXR1cmUiPlRoZSBmdW5jdGlvbiBvYmplY3QgY2Fubm90IGJlIAoJCQkJY2FsbGVkIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHM8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjZXJyX2FyZ19hY2Nlc3MiPkFjY2Vzc2luZyBhbiBhcmd1bWVudCB0aGF0IGRvZXMgCgkJCQlub3QgZXhpc3Q8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjZXJyX3Nob3J0X2Zvcm0iPkluYXBwcm9wcmlhdGUgdXNlIG9mIGJpbmQoZiwgCgkJCQkuLi4pPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2Vycl9sb25nX2Zvcm0iPkluYXBwcm9wcmlhdGUgdXNlIG9mIAoJCQkJYmluZCZsdDtSJmd0OyhmLCAuLi4pPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2Vycl9ub25zdGQiPkJpbmRpbmcgYSBub25zdGFuZGFyZCBmdW5jdGlvbjwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNlcnJfb3ZlcmxvYWRlZCI+QmluZGluZyBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2Vycl9jb25zdF9hcmciPjxiPmNvbnN0PC9iPiBpbiBzaWduYXR1cmVzPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2Vycl9tc3ZjX3VzaW5nIj5NU1ZDIHNwZWNpZmljOiB1c2luZyAKCQkJCWJvb3N0OjpiaW5kOzwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNlcnJfbXN2Y19jbGFzc190ZW1wbGF0ZSI+TVNWQyBzcGVjaWZpYzogY2xhc3MgCgkJCQl0ZW1wbGF0ZXMgc2hhZG93IGZ1bmN0aW9uIHRlbXBsYXRlczwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNlcnJfbXN2Y19lbGxpcHNpcyI+TVNWQyBzcGVjaWZpYzogLi4uIGluIAoJCQkJc2lnbmF0dXJlcyB0cmVhdGVkIGFzIHR5cGU8L0E+PC9oND4KCQk8aDMgc3R5bGU9Ik1BUkdJTi1MRUZUOiAyMHB0Ij48QSBocmVmPSIjSW50ZXJmYWNlIj5JbnRlcmZhY2U8L0E+PC9oMz4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjU3lub3BzaXMiPlN5bm9wc2lzPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI0NvbW1vblJlcXVpcmVtZW50cyI+Q29tbW9uIHJlcXVpcmVtZW50czwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNDb21tb25EZWZpbml0aW9ucyI+Q29tbW9uIGRlZmluaXRpb25zPC9BPjwvaDQ+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI2JpbmQiPmJpbmQ8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjQWRkaXRpb25hbE92ZXJsb2FkcyI+QWRkaXRpb25hbCBvdmVybG9hZHM8L0E+PC9oND4KCQk8aDMgc3R5bGU9Ik1BUkdJTi1MRUZUOiAyMHB0Ij48QSBocmVmPSIjSW1wbGVtZW50YXRpb24iPkltcGxlbWVudGF0aW9uPC9BPjwvaDM+CgkJPGg0IHN0eWxlPSJNQVJHSU4tTEVGVDogNDBwdCI+PEEgaHJlZj0iI0ZpbGVzIj5GaWxlczwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNEZXBlbmRlbmNpZXMiPkRlcGVuZGVuY2llczwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNOdW1iZXJPZkFyZ3VtZW50cyI+TnVtYmVyIG9mIEFyZ3VtZW50czwvQT48L2g0PgoJCTxoNCBzdHlsZT0iTUFSR0lOLUxFRlQ6IDQwcHQiPjxBIGhyZWY9IiNzdGRjYWxsIj4iX19zdGRjYWxsIiwgIl9fY2RlY2wiLCAiX19mYXN0Y2FsbCIsIAoJCQkJYW5kICJwYXNjYWwiIFN1cHBvcnQ8L0E+PC9oND4KCQk8aDQgc3R5bGU9Ik1BUkdJTi1MRUZUOiA0MHB0Ij48QSBocmVmPSIjdmlzaXRfZWFjaCI+PGI+dmlzaXRfZWFjaDwvYj4gc3VwcG9ydDwvQT48L2g0PgoJCTxoMyBzdHlsZT0iTUFSR0lOLUxFRlQ6IDIwcHQiPjxBIGhyZWY9IiNBY2tub3dsZWRnZW1lbnRzIj5BY2tub3dsZWRnZW1lbnRzPC9BPjwvaDM+CgkJPGgyPjxhIG5hbWU9IlB1cnBvc2UiPlB1cnBvc2U8L2E+PC9oMj4KCQk8cD48Yj5ib29zdDo6YmluZDwvYj4gaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIDxiPnN0ZDo6YmluZDFzdDwvYj4KCQkJYW5kIDxiPnN0ZDo6YmluZDJuZDwvYj4uIEl0IHN1cHBvcnRzIGFyYml0cmFyeSBmdW5jdGlvbiBvYmplY3RzLCBmdW5jdGlvbnMsIAoJCQlmdW5jdGlvbiBwb2ludGVycywgYW5kIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycywgYW5kIGlzIGFibGUgdG8gYmluZCBhbnkgCgkJCWFyZ3VtZW50IHRvIGEgc3BlY2lmaWMgdmFsdWUgb3Igcm91dGUgaW5wdXQgYXJndW1lbnRzIGludG8gYXJiaXRyYXJ5IHBvc2l0aW9ucy4gPGI+YmluZDwvYj4KCQkJZG9lcyBub3QgcGxhY2UgYW55IHJlcXVpcmVtZW50cyBvbiB0aGUgZnVuY3Rpb24gb2JqZWN0OyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIAoJCQlub3QgbmVlZCB0aGUgPGI+cmVzdWx0X3R5cGU8L2I+LCA8Yj5maXJzdF9hcmd1bWVudF90eXBlPC9iPiBhbmQgPGI+c2Vjb25kX2FyZ3VtZW50X3R5cGU8L2I+CgkJCXN0YW5kYXJkIHR5cGVkZWZzLgoJCTwvcD4KCQk8aDM+PGEgbmFtZT0id2l0aF9mdW5jdGlvbnMiPlVzaW5nIGJpbmQgd2l0aCBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzPC9hPjwvaDM+CgkJPHA+R2l2ZW4gdGhlc2UgZGVmaW5pdGlvbnM6CgkJPC9wPgoJCTxwcmU+aW50IGYoaW50IGEsIGludCBiKQp7CiAgICByZXR1cm4gYSArIGI7Cn0KCmludCBnKGludCBhLCBpbnQgYiwgaW50IGMpCnsKICAgIHJldHVybiBhICsgYiArIGM7Cn0KPC9wcmU+CgkJPHA+PHR0PmJpbmQoZiwgMSwgMik8L3R0PiB3aWxsIHByb2R1Y2UgYSAibnVsbGFyeSIgZnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgbm8gCgkJCWFyZ3VtZW50cyBhbmQgcmV0dXJucyA8dHQ+ZigxLCAyKTwvdHQ+LiBTaW1pbGFybHksIDx0dD5iaW5kKGcsIDEsIDIsIDMpKCk8L3R0PiBpcyAKCQkJZXF1aXZhbGVudCB0byA8dHQ+ZygxLCAyLCAzKTwvdHQ+LgoJCTwvcD4KCQk8cD5JdCBpcyBwb3NzaWJsZSB0byBzZWxlY3RpdmVseSBiaW5kIG9ubHkgc29tZSBvZiB0aGUgYXJndW1lbnRzLiA8dHQ+YmluZChmLCBfMSwgNSkoeCk8L3R0PgoJCQlpcyBlcXVpdmFsZW50IHRvIDx0dD5mKHgsIDUpPC90dD47IGhlcmUgPGI+XzE8L2I+CgkJaXMgYSBwbGFjZWhvbGRlciBhcmd1bWVudCB0aGF0IG1lYW5zICJzdWJzdGl0dXRlIHdpdGggdGhlIGZpcnN0IGlucHV0IAoJCWFyZ3VtZW50LiIKCQk8cD5Gb3IgY29tcGFyaXNvbiwgaGVyZSBpcyB0aGUgc2FtZSBvcGVyYXRpb24gZXhwcmVzc2VkIHdpdGggdGhlIHN0YW5kYXJkIGxpYnJhcnkgCgkJCXByaW1pdGl2ZXM6CgkJPC9wPgoJCTxwcmU+c3RkOjpiaW5kMm5kKHN0ZDo6cHRyX2Z1bihmKSwgNSkoeCk7CjwvcHJlPgoJCTxwPjxiPmJpbmQ8L2I+IGNvdmVycyB0aGUgZnVuY3Rpb25hbGl0eSBvZiA8Yj5zdGQ6OmJpbmQxc3Q8L2I+IGFzIHdlbGw6CgkJPC9wPgoJCTxwcmU+c3RkOjpiaW5kMXN0KHN0ZDo6cHRyX2Z1bihmKSwgNSkoeCk7ICAgLy8gZig1LCB4KQpiaW5kKGYsIDUsIF8xKSh4KTsgICAgICAgICAgICAgICAgICAgICAvLyBmKDUsIHgpCjwvcHJlPgoJCTxwPjxiPmJpbmQ8L2I+IGNhbiBoYW5kbGUgZnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHR3byBhcmd1bWVudHMsIGFuZCBpdHMgYXJndW1lbnQgCgkJCXN1YnN0aXR1dGlvbiBtZWNoYW5pc20gaXMgbW9yZSBnZW5lcmFsOgoJCTwvcD4KCQk8cHJlPmJpbmQoZiwgXzIsIF8xKSh4LCB5KTsgICAgICAgICAgICAgICAgIC8vIGYoeSwgeCkKCmJpbmQoZywgXzEsIDksIF8xKSh4KTsgICAgICAgICAgICAgICAgIC8vIGcoeCwgOSwgeCkKCmJpbmQoZywgXzMsIF8zLCBfMykoeCwgeSwgeik7ICAgICAgICAgIC8vIGcoeiwgeiwgeikKCmJpbmQoZywgXzEsIF8xLCBfMSkoeCwgeSwgeik7ICAgICAgICAgIC8vIGcoeCwgeCwgeCkKPC9wcmU+CgkJPHA+Tm90ZSB0aGF0LCBpbiB0aGUgbGFzdCBleGFtcGxlLCB0aGUgZnVuY3Rpb24gb2JqZWN0IHByb2R1Y2VkIGJ5IDx0dD5iaW5kKGcsIF8xLCBfMSwgCgkJCQlfMSk8L3R0PiBkb2VzIG5vdCBjb250YWluIHJlZmVyZW5jZXMgdG8gYW55IGFyZ3VtZW50cyBiZXlvbmQgdGhlIGZpcnN0LCBidXQgCgkJCWl0IGNhbiBzdGlsbCBiZSB1c2VkIHdpdGggbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gQW55IGV4dHJhIGFyZ3VtZW50cyBhcmUgCgkJCXNpbGVudGx5IGlnbm9yZWQsIGp1c3QgbGlrZSB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgYXJlIGlnbm9yZWQgaW4gCgkJCXRoZSB0aGlyZCBleGFtcGxlLgoJCTwvcD4KCQk8cD5UaGUgYXJndW1lbnRzIHRoYXQgPGI+YmluZDwvYj4gdGFrZXMgYXJlIGNvcGllZCBhbmQgaGVsZCBpbnRlcm5hbGx5IGJ5IHRoZSAKCQkJcmV0dXJuZWQgZnVuY3Rpb24gb2JqZWN0LiBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBjb2RlOgoJCTwvcD4KCQk8cHJlPmludCBpID0gNTsKCmJpbmQoZiwgaSwgXzEpOwo8L3ByZT4KCQk8cD5hIGNvcHkgb2YgdGhlIHZhbHVlIG9mIDxiPmk8L2I+IGlzIHN0b3JlZCBpbnRvIHRoZSBmdW5jdGlvbiBvYmplY3QuIDxBIGhyZWY9InJlZi5odG1sIj4KCQkJCWJvb3N0OjpyZWY8L0E+IGFuZCA8QSBocmVmPSJyZWYuaHRtbCI+Ym9vc3Q6OmNyZWY8L0E+IGNhbiBiZSB1c2VkIHRvIG1ha2UgCgkJCXRoZSBmdW5jdGlvbiBvYmplY3Qgc3RvcmUgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0LCByYXRoZXIgdGhhbiBhIGNvcHk6CgkJPC9wPgoJCTxwcmU+aW50IGkgPSA1OwoKYmluZChmLCByZWYoaSksIF8xKTsKCmJpbmQoZiwgY3JlZig0MiksIF8xKTsKPC9wcmU+CgkJPGgzPjxhIG5hbWU9IndpdGhfZnVuY3Rpb25fb2JqZWN0cyI+VXNpbmcgYmluZCB3aXRoIGZ1bmN0aW9uIG9iamVjdHM8L2E+PC9oMz4KCQk8cD48Yj5iaW5kPC9iPiBpcyBub3QgbGltaXRlZCB0byBmdW5jdGlvbnM7IGl0IGFjY2VwdHMgYXJiaXRyYXJ5IGZ1bmN0aW9uIG9iamVjdHMuIAoJCQlJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBmdW5jdGlvbiBvYmplY3QncyA8Yj5vcGVyYXRvcigpPC9iPgoJCQloYXMgdG8gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKHdpdGhvdXQgYSA8Yj50eXBlb2Y8L2I+IG9wZXJhdG9yIHRoZSByZXR1cm4gCgkJCXR5cGUgY2Fubm90IGJlIGluZmVycmVkKToKCQk8L3A+CgkJPHByZT5zdHJ1Y3QgRgp7CiAgICBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEgLSBiOyB9CiAgICBib29sIG9wZXJhdG9yKCkobG9uZyBhLCBsb25nIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQp9OwoKRiBmOwoKaW50IHggPSAxMDQ7CgpiaW5kJmx0O2ludCZndDsoZiwgXzEsIF8xKSh4KTsJCS8vIGYoeCwgeCksIGkuZS4gemVybwo8L3ByZT4KCQk8cD5Tb21lIGNvbXBpbGVycyBoYXZlIHRyb3VibGUgd2l0aCB0aGUgPHR0PmJpbmQmbHQ7UiZndDsoZiwgLi4uKTwvdHQ+IHN5bnRheC4gRm9yIAoJCQlwb3J0YWJpbGl0eSByZWFzb25zLCBhbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZXhwcmVzcyB0aGUgYWJvdmUgaXMgc3VwcG9ydGVkOjwvcD4KCQk8cHJlPmJvb3N0OjpiaW5kKGJvb3N0Ojp0eXBlJmx0O2ludCZndDsoKSwgZiwgXzEsIF8xKSh4KTsKPC9wcmU+CgkJPFA+Tm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgYWx0ZXJuYXRpdmUgc3ludGF4IGlzIHByb3ZpZGVkIG9ubHkgYXMgYSB3b3JrYXJvdW5kLiBJdCAKCQkJaXMgbm90IHBhcnQgb2YgdGhlIGludGVyZmFjZS48L1A+CgkJPFA+V2hlbiB0aGUgZnVuY3Rpb24gb2JqZWN0IGV4cG9zZXMgYSBuZXN0ZWQgdHlwZSBuYW1lZCA8Yj5yZXN1bHRfdHlwZTwvYj4sIHRoZSAKCQkJZXhwbGljaXQgcmV0dXJuIHR5cGUgY2FuIGJlIG9taXR0ZWQ6CgkJPC9QPgoJCTxwcmU+aW50IHggPSA4OwoKYmluZChzdGQ6Omxlc3MmbHQ7aW50Jmd0OygpLCBfMSwgOSkoeCk7CS8vIHggJmx0OyA5CjwvcHJlPgoJCTxwPltOb3RlOiB0aGUgYWJpbGl0eSB0byBvbWl0IHRoZSByZXR1cm4gdHlwZSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBjb21waWxlcnMuXQoJCTwvcD4KCQk8UD5CeSBkZWZhdWx0LCA8U1RST05HPmJpbmQ8L1NUUk9ORz4gbWFrZXMgYSBjb3B5IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QuIDxjb2RlPgoJCQkJYm9vc3Q6OnJlZjwvY29kZT4gYW5kIDxjb2RlPmJvb3N0OjpjcmVmPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBtYWtlIGl0IHN0b3JlIAoJCQlhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0LCByYXRoZXIgdGhhbiBhIGNvcHkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIAoJCQl0aGUgZnVuY3Rpb24gb2JqZWN0IGlzIG5vbmNvcHlhYmxlLCBleHBlbnNpdmUgdG8gY29weSwgb3IgY29udGFpbnMgc3RhdGU7IG9mIAoJCQljb3Vyc2UsIGluIHRoaXMgY2FzZSB0aGUgcHJvZ3JhbW1lciBpcyBleHBlY3RlZCB0byBlbnN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gCgkJCW9iamVjdCBpcyBub3QgZGVzdHJveWVkIHdoaWxlIGl0J3Mgc3RpbGwgYmVpbmcgdXNlZC48L1A+CgkJPHByZT5zdHJ1Y3QgRjIKewogICAgaW50IHM7CgogICAgdHlwZWRlZiB2b2lkIHJlc3VsdF90eXBlOwogICAgdm9pZCBvcGVyYXRvcigpKCBpbnQgeCApIHsgcyArPSB4OyB9Cn07CgpGMiBmMiA9IHsgMCB9OwppbnQgYVtdID0geyAxLCAyLCAzIH07CgpzdGQ6OmZvcl9lYWNoKCBhLCBhKzMsIGJpbmQoIHJlZihmMiksIF8xICkgKTsKCmFzc2VydCggZjIucyA9PSA2ICk7CjwvcHJlPgoJCTxoMz48YSBuYW1lPSJ3aXRoX21lbWJlcl9wb2ludGVycyI+VXNpbmcgYmluZCB3aXRoIHBvaW50ZXJzIHRvIG1lbWJlcnM8L2E+PC9oMz4KCQk8cD5Qb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGFuZCBwb2ludGVycyB0byBkYXRhIG1lbWJlcnMgYXJlIG5vdCBmdW5jdGlvbiAKCQkJb2JqZWN0cywgYmVjYXVzZSB0aGV5IGRvIG5vdCBzdXBwb3J0IDx0dD5vcGVyYXRvcigpPC90dD4uIEZvciBjb252ZW5pZW5jZSwgPGI+YmluZDwvYj4KCQkJYWNjZXB0cyBtZW1iZXIgcG9pbnRlcnMgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlIGJlaGF2aW9yIGlzIGFzIGlmIDxBIGhyZWY9Im1lbV9mbi5odG1sIj4KCQkJCWJvb3N0OjptZW1fZm48L0E+IGhhcyBiZWVuIHVzZWQgdG8gY29udmVydCB0aGUgbWVtYmVyIHBvaW50ZXIgaW50byBhIAoJCQlmdW5jdGlvbiBvYmplY3QuIEluIG90aGVyIHdvcmRzLCB0aGUgZXhwcmVzc2lvbgoJCTwvcD4KCQk8cHJlPmJpbmQoJmFtcDtYOjpmLCA8aT5hcmdzPC9pPikKPC9wcmU+CgkJPHA+aXMgZXF1aXZhbGVudCB0bwoJCTwvcD4KCQk8cHJlPmJpbmQmbHQ7UiZndDsoPEEgaHJlZj0ibWVtX2ZuLmh0bWwiID5tZW1fZm48L0E+KCZhbXA7WDo6ZiksIDxpPmFyZ3M8L2k+KQo8L3ByZT4KCQk8cD53aGVyZSA8Yj5SPC9iPiBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgPGI+WDo6ZjwvYj4gKGZvciBtZW1iZXIgZnVuY3Rpb25zKSBvciB0aGUgCgkJCXR5cGUgb2YgdGhlIG1lbWJlciAoZm9yIGRhdGEgbWVtYmVycy4pCgkJPC9wPgoJCTxwPltOb3RlOiA8Yj5tZW1fZm48L2I+IGNyZWF0ZXMgZnVuY3Rpb24gb2JqZWN0cyB0aGF0IGFyZSBhYmxlIHRvIGFjY2VwdCBhIHBvaW50ZXIsIAoJCQlhIHJlZmVyZW5jZSwgb3IgYSBzbWFydCBwb2ludGVyIHRvIGFuIG9iamVjdCBhcyBpdHMgZmlyc3QgYXJndW1lbnQ7IGZvciAKCQkJYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc2VlIHRoZSA8Yj5tZW1fZm48L2I+IDxBIGhyZWY9Im1lbV9mbi5odG1sIj5kb2N1bWVudGF0aW9uPC9BPi5dCgkJPC9wPgoJCTxwPkV4YW1wbGU6CgkJPC9wPgoJCTxwcmU+c3RydWN0IFgKewogICAgYm9vbCBmKGludCBhKTsKfTsKClggeDsKCnNoYXJlZF9wdHImbHQ7WCZndDsgcChuZXcgWCk7CgppbnQgaSA9IDU7CgpiaW5kKCZhbXA7WDo6ZiwgcmVmKHgpLCBfMSkoaSk7CQkvLyB4LmYoaSkKYmluZCgmYW1wO1g6OmYsICZhbXA7eCwgXzEpKGkpOwkJCS8vKCZhbXA7eCktJmd0O2YoaSkKYmluZCgmYW1wO1g6OmYsIHgsIF8xKShpKTsJCQkvLyAoPGk+aW50ZXJuYWwgY29weSBvZiB4PC9pPikuZihpKQpiaW5kKCZhbXA7WDo6ZiwgcCwgXzEpKGkpOwkJCS8vICg8aT5pbnRlcm5hbCBjb3B5IG9mIHA8L2k+KS0mZ3Q7ZihpKQo8L3ByZT4KCQk8cD5UaGUgbGFzdCB0d28gZXhhbXBsZXMgYXJlIGludGVyZXN0aW5nIGluIHRoYXQgdGhleSBwcm9kdWNlICJzZWxmLWNvbnRhaW5lZCIgCgkJCWZ1bmN0aW9uIG9iamVjdHMuIDx0dD5iaW5kKCZhbXA7WDo6ZiwgeCwgXzEpPC90dD4gc3RvcmVzIGEgY29weSBvZiA8Yj54PC9iPi4gPHR0PmJpbmQoJmFtcDtYOjpmLCAKCQkJCXAsIF8xKTwvdHQ+IHN0b3JlcyBhIGNvcHkgb2YgPGI+cDwvYj4sIGFuZCBzaW5jZSA8Yj5wPC9iPiBpcyBhIDxBIGhyZWY9Ii4uL3NtYXJ0X3B0ci9zaGFyZWRfcHRyLmh0bSI+CgkJCQlib29zdDo6c2hhcmVkX3B0cjwvQT4sIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byBpdHMgCgkJCWluc3RhbmNlIG9mIDxiPlg8L2I+IGFuZCB3aWxsIHJlbWFpbiB2YWxpZCBldmVuIHdoZW4gPGI+cDwvYj4gZ29lcyBvdXQgb2Ygc2NvcGUgCgkJCW9yIGlzIDxiPnJlc2V0KCk8L2I+LgoJCTwvcD4KCQk8aDM+PGEgbmFtZT0ibmVzdGVkX2JpbmRzIj5Vc2luZyBuZXN0ZWQgYmluZHMgZm9yIGZ1bmN0aW9uIGNvbXBvc2l0aW9uPC9hPjwvaDM+CgkJPHA+U29tZSBvZiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byA8Yj5iaW5kPC9iPiBtYXkgYmUgbmVzdGVkIDxiPmJpbmQ8L2I+IGV4cHJlc3Npb25zIAoJCQl0aGVtc2VsdmVzOgoJCTwvcD4KCQk8cHJlPmJpbmQoZiwgYmluZChnLCBfMSkpKHgpOyAgICAgICAgICAgICAgIC8vIGYoZyh4KSkKPC9wcmU+CgkJPHA+VGhlIGlubmVyIDxTVFJPTkc+YmluZDwvU1RST05HPiBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkLCBpbiB1bnNwZWNpZmllZCBvcmRlciwgCgkJCWJlZm9yZSB0aGUgb3V0ZXIgPFNUUk9ORz5iaW5kPC9TVFJPTkc+IHdoZW4gdGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBjYWxsZWQ7IHRoZSAKCQkJcmVzdWx0cyBvZiB0aGUgZXZhbHVhdGlvbiBhcmUgdGhlbiBzdWJzdGl0dXRlZCBpbiB0aGVpciBwbGFjZSB3aGVuIHRoZSBvdXRlciA8U1RST05HPgoJCQkJYmluZDwvU1RST05HPiBpcyBldmFsdWF0ZWQuIEluIHRoZSBleGFtcGxlIGFib3ZlLCB3aGVuIHRoZSBmdW5jdGlvbiBvYmplY3QgCgkJCWlzIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCBsaXN0IDx0dD4oeCk8L3R0PiwgPHR0PmJpbmQoZywgXzEpKHgpPC90dD4gaXMgCgkJCWV2YWx1YXRlZCBmaXJzdCwgeWllbGRpbmcgPHR0PmcoeCk8L3R0PiwgYW5kIHRoZW4gPHR0PmJpbmQoZiwgZyh4KSkoeCk8L3R0PiBpcyAKCQkJZXZhbHVhdGVkLCB5aWVsZGluZyB0aGUgZmluYWwgcmVzdWx0IDx0dD5mKGcoeCkpPC90dD4uCgkJPC9wPgoJCTxQPlRoaXMgZmVhdHVyZSBvZiA8Yj5iaW5kPC9iPiBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGZ1bmN0aW9uIGNvbXBvc2l0aW9uLiBTZWUgPEEgaHJlZj0iYmluZF9hc19jb21wb3NlLmNwcCI+CgkJCQliaW5kX2FzX2NvbXBvc2UuY3BwPC9BPiBmb3IgYW4gZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIDxiPmJpbmQ8L2I+CgkJCXRvIGFjaGlldmUgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHRvIDxBIGhyZWY9Ii4uL2NvbXBvc2UvaW5kZXguaHRtIj5Cb29zdC5Db21wb3NlPC9BPi4KCQk8L1A+CgkJPHA+Tm90ZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCAtIHRoZSBib3VuZCBmdW5jdGlvbiBvYmplY3QgLSBpcyBub3QgZXZhbHVhdGVkLCAKCQkJZXZlbiB3aGVuIGl0J3MgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBwcm9kdWNlZCBieSA8U1RST05HPmJpbmQ8L1NUUk9ORz4gb3IgYSAKCQkJcGxhY2Vob2xkZXIgYXJndW1lbnQsIHNvIHRoZSBleGFtcGxlIGJlbG93IGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQ6CgkJPC9wPgoJCTxwcmU+dHlwZWRlZiB2b2lkICgqcGYpKGludCk7CgpzdGQ6OnZlY3RvciZsdDtwZiZndDsgdjsKCnN0ZDo6Zm9yX2VhY2godi5iZWdpbigpLCB2LmVuZCgpLCBiaW5kKF8xLCA1KSk7CjwvcHJlPgoJCTxwPlRoZSBkZXNpcmVkIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgdmlhIGEgaGVscGVyIGZ1bmN0aW9uIG9iamVjdCA8U1RST05HPmFwcGx5PC9TVFJPTkc+CgkJCXRoYXQgYXBwbGllcyBpdHMgZmlyc3QgYXJndW1lbnQsIGFzIGEgZnVuY3Rpb24gb2JqZWN0LCB0byB0aGUgcmVzdCBvZiBpdHMgCgkJCWFyZ3VtZW50IGxpc3QuIEZvciBjb252ZW5pZW5jZSwgYW4gaW1wbGVtZW50YXRpb24gb2YgPFNUUk9ORz5hcHBseTwvU1RST05HPiBpcyAKCQkJcHJvdmlkZWQgaW4gdGhlIDxTVFJPTkc+Ym9vc3QvYmluZC9hcHBseS5ocHA8L1NUUk9ORz4gaGVhZGVyIGZpbGUuIEhlcmUgaXMgaG93IAoJCQl0aGUgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZSBsb29rcyBsaWtlOgoJCTwvcD4KCQk8cHJlPnR5cGVkZWYgdm9pZCAoKnBmKShpbnQpOwoKc3RkOjp2ZWN0b3ImbHQ7cGYmZ3Q7IHY7CgpzdGQ6OmZvcl9lYWNoKHYuYmVnaW4oKSwgdi5lbmQoKSwgYmluZChhcHBseSZsdDt2b2lkJmd0OygpLCBfMSwgNSkpOwo8L3ByZT4KCQk8UD5BbHRob3VnaCB0aGUgZmlyc3QgYXJndW1lbnQgaXMsIGJ5IGRlZmF1bHQsIG5vdCBldmFsdWF0ZWQsIGFsbCBvdGhlciBhcmd1bWVudHMgCgkJCWFyZS4gU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSBub3QgdG8gZXZhbHVhdGUgYXJndW1lbnRzIHN1YnNlcXVlbnQgdG8gdGhlIAoJCQlmaXJzdCwgZXZlbiB3aGVuIHRoZXkgYXJlIG5lc3RlZCA8U1RST05HPmJpbmQ8L1NUUk9ORz4gc3ViZXhwcmVzc2lvbnMuIFRoaXMgY2FuIAoJCQliZSBhY2hpZXZlZCB3aXRoIHRoZSBoZWxwIG9mIGFub3RoZXIgZnVuY3Rpb24gb2JqZWN0LCA8U1RST05HPnByb3RlY3Q8L1NUUk9ORz4sIAoJCQl0aGF0IG1hc2tzIHRoZSB0eXBlIHNvIHRoYXQgPFNUUk9ORz5iaW5kPC9TVFJPTkc+IGRvZXMgbm90IHJlY29nbml6ZSBhbmQgCgkJCWV2YWx1YXRlIGl0LiBXaGVuIGNhbGxlZCwgPFNUUk9ORz5wcm90ZWN0PC9TVFJPTkc+IHNpbXBseSBmb3J3YXJkcyB0aGUgYXJndW1lbnQgCgkJCWxpc3QgdG8gdGhlIG90aGVyIGZ1bmN0aW9uIG9iamVjdCB1bm1vZGlmaWVkLjwvUD4KCQk8UD5UaGUgaGVhZGVyIDxTVFJPTkc+Ym9vc3QvYmluZC9wcm90ZWN0LmhwcDwvU1RST05HPiBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiA8U1RST05HPgoJCQkJcHJvdGVjdDwvU1RST05HPi4gVG8gcHJvdGVjdCBhIDxTVFJPTkc+YmluZDwvU1RST05HPiBmdW5jdGlvbiBvYmplY3QgZnJvbSAKCQkJZXZhbHVhdGlvbiwgdXNlIDx0dD5wcm90ZWN0KGJpbmQoZiwgLi4uKSk8L3R0Pi48L1A+CgkJPGgzPjxhIG5hbWU9Im9wZXJhdG9ycyI+T3ZlcmxvYWRlZCBvcGVyYXRvcnM8L2E+IChuZXcgaW4gQm9vc3QgMS4zMyk8L2gzPgoJCTxwPkZvciBjb252ZW5pZW5jZSwgdGhlIGZ1bmN0aW9uIG9iamVjdHMgcHJvZHVjZWQgYnkgPHR0PmJpbmQ8L3R0PiBvdmVybG9hZCB0aGUgCgkJCWxvZ2ljYWwgbm90IG9wZXJhdG9yIDxjb2RlPiE8L2NvZGU+IGFuZCB0aGUgcmVsYXRpb25hbCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgPGNvZGU+PT08L2NvZGU+LAoJCQk8Y29kZT4hPTwvY29kZT4sIDxjb2RlPiZsdDs8L2NvZGU+LCA8Y29kZT4mbHQ7PTwvY29kZT4sIDxjb2RlPiZndDs8L2NvZGU+LCA8Y29kZT4mZ3Q7PTwvY29kZT4sCgkJCTxjb2RlPiZhbXA7JmFtcDs8L2NvZGU+LCA8Y29kZT58fDwvY29kZT4uPC9wPgoJCTxQPjx0dD4hYmluZChmLCAuLi4pPC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+YmluZCggPEVNPmxvZ2ljYWxfbm90PC9FTT4oKSwgYmluZChmLCAKCQkJCS4uLikgKTwvdHQ+LCB3aGVyZSA8dHQ+PEVNPmxvZ2ljYWxfbm90PC9FTT48L3R0PiBpcyBhIGZ1bmN0aW9uIG9iamVjdCB0aGF0IAoJCQl0YWtlcyBvbmUgYXJndW1lbnQgPHR0Png8L3R0PiBhbmQgcmV0dXJucyA8dHQ+IXg8L3R0Pi48L1A+CgkJPFA+PHR0PmJpbmQoZiwgLi4uKSA8RU0+b3A8L0VNPiB4PC90dD4sIHdoZXJlIDxFTT5vcDwvRU0+IGlzIGEgcmVsYXRpb25hbCBvciAKCQkJbG9naWNhbCBvcGVyYXRvciwgaXMgZXF1aXZhbGVudCB0byA8dHQ+YmluZCggPEVNPnJlbGF0aW9uPC9FTT4oKSwgYmluZChmLCAuLi4pLCB4ICk8L3R0PiwgCgkJCXdoZXJlIDxlbT5yZWxhdGlvbjwvZW0+IGlzIGEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cyA8dHQ+YTwvdHQ+CgkJCWFuZCA8dHQ+YjwvdHQ+IGFuZCByZXR1cm5zIDx0dD5hIDxFTT5vcDwvRU0+IGI8L3R0Pi48L1A+CgkJPFA+V2hhdCB0aGlzIG1lYW5zIGluIHByYWN0aWNlIGlzIHRoYXQgeW91IGNhbiBjb252ZW5pZW50bHkgbmVnYXRlIHRoZSByZXN1bHQgb2YgPHR0PmJpbmQ8L3R0Pjo8L1A+CgkJPFA+PHR0PnN0ZDo6cmVtb3ZlX2lmKCBmaXJzdCwgbGFzdCwgIWJpbmQoICZhbXA7WDo6dmlzaWJsZSwgXzEgKSApOyAvLyByZW1vdmUgaW52aXNpYmxlIAoJCQkJb2JqZWN0czwvdHQ+PC9QPgoJCTxQPmFuZCBjb21wYXJlIHRoZSByZXN1bHQgb2YgPHR0PmJpbmQ8L3R0PiBhZ2FpbnN0IGEgdmFsdWU6PC9QPgoJCTxQPjx0dD5zdGQ6OmZpbmRfaWYoIGZpcnN0LCBsYXN0LCBiaW5kKCAmYW1wO1g6Om5hbWUsIF8xICkgPT0gIlBldGVyIiApOzwvdHQ+PC9QPgoJCTxQPjx0dD5zdGQ6OmZpbmRfaWYoIGZpcnN0LCBsYXN0LCBiaW5kKCAmYW1wO1g6Om5hbWUsIF8xICkgPT0gIlBldGVyIiB8fCBiaW5kKCAKCQkJCSZhbXA7WDo6bmFtZSwgXzEgKSA9PSAiUGF1bCIgKTs8L3R0PjwvUD4KCQk8UD5hZ2FpbnN0IGEgcGxhY2Vob2xkZXI6PC9QPgoJCTxQPjx0dD5iaW5kKCAmYW1wO1g6Om5hbWUsIF8xICkgPT0gXzI8L3R0PjwvUD4KCQk8UD5vciBhZ2FpbnN0IGFub3RoZXIgPHR0PmJpbmQ8L3R0PiBleHByZXNzaW9uOjwvUD4KCQk8UD48dHQ+c3RkOjpzb3J0KCBmaXJzdCwgbGFzdCwgYmluZCggJmFtcDtYOjpuYW1lLCBfMSApICZsdDsgYmluZCggJmFtcDtYOjpuYW1lLCBfMiApIAoJCQkJKTsgLy8gc29ydCBieSBuYW1lPC90dD48L1A+CgkJPGgyPjxhIG5hbWU9IkV4YW1wbGVzIj5FeGFtcGxlczwvYT48L2gyPgoJCTxoMz48YSBuYW1lPSJ3aXRoX2FsZ29yaXRobXMiPlVzaW5nIGJpbmQgd2l0aCBzdGFuZGFyZCBhbGdvcml0aG1zPC9hPjwvaDM+CgkJPHByZT5jbGFzcyBpbWFnZTsKCmNsYXNzIGFuaW1hdGlvbgp7CnB1YmxpYzoKCiAgICB2b2lkIGFkdmFuY2UoaW50IG1zKTsKICAgIGJvb2wgaW5hY3RpdmUoKSBjb25zdDsKICAgIHZvaWQgcmVuZGVyKGltYWdlICZhbXA7IHRhcmdldCkgY29uc3Q7Cn07CgpzdGQ6OnZlY3RvciZsdDthbmltYXRpb24mZ3Q7IGFuaW1zOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgQywgY2xhc3MgUCZndDsgdm9pZCBlcmFzZV9pZihDICZhbXA7IGMsIFAgcHJlZCkKewogICAgYy5lcmFzZShzdGQ6OnJlbW92ZV9pZihjLmJlZ2luKCksIGMuZW5kKCksIHByZWQpLCBjLmVuZCgpKTsKfQoKdm9pZCB1cGRhdGUoaW50IG1zKQp7CiAgICBzdGQ6OmZvcl9lYWNoKGFuaW1zLmJlZ2luKCksIGFuaW1zLmVuZCgpLCBib29zdDo6YmluZCgmYW1wO2FuaW1hdGlvbjo6YWR2YW5jZSwgXzEsIG1zKSk7CiAgICBlcmFzZV9pZihhbmltcywgYm9vc3Q6Om1lbV9mbigmYW1wO2FuaW1hdGlvbjo6aW5hY3RpdmUpKTsKfQoKdm9pZCByZW5kZXIoaW1hZ2UgJmFtcDsgdGFyZ2V0KQp7CiAgICBzdGQ6OmZvcl9lYWNoKGFuaW1zLmJlZ2luKCksIGFuaW1zLmVuZCgpLCBib29zdDo6YmluZCgmYW1wO2FuaW1hdGlvbjo6cmVuZGVyLCBfMSwgYm9vc3Q6OnJlZih0YXJnZXQpKSk7Cn0KPC9wcmU+CgkJPGgzPjxhIG5hbWU9IndpdGhfYm9vc3RfZnVuY3Rpb24iPlVzaW5nIGJpbmQgd2l0aCBCb29zdC5GdW5jdGlvbjwvYT48L2gzPgoJCTxwcmU+Y2xhc3MgYnV0dG9uCnsKcHVibGljOgoKICAgIDxBIGhyZWY9Ii4uL2Z1bmN0aW9uL2luZGV4Lmh0bWwiID5ib29zdDo6ZnVuY3Rpb248L0E+Jmx0O3ZvaWQoKSZndDsgb25DbGljazsKfTsKCmNsYXNzIHBsYXllcgp7CnB1YmxpYzoKCiAgICB2b2lkIHBsYXkoKTsKICAgIHZvaWQgc3RvcCgpOwp9OwoKYnV0dG9uIHBsYXlCdXR0b24sIHN0b3BCdXR0b247CnBsYXllciB0aGVQbGF5ZXI7Cgp2b2lkIGNvbm5lY3QoKQp7CiAgICBwbGF5QnV0dG9uLm9uQ2xpY2sgPSBib29zdDo6YmluZCgmYW1wO3BsYXllcjo6cGxheSwgJmFtcDt0aGVQbGF5ZXIpOwogICAgc3RvcEJ1dHRvbi5vbkNsaWNrID0gYm9vc3Q6OmJpbmQoJmFtcDtwbGF5ZXI6OnN0b3AsICZhbXA7dGhlUGxheWVyKTsKfQo8L3ByZT4KCQk8aDI+PGEgbmFtZT0iTGltaXRhdGlvbnMiPkxpbWl0YXRpb25zPC9hPjwvaDI+CgkJPHA+QXMgYSBnZW5lcmFsIHJ1bGUsIHRoZSBmdW5jdGlvbiBvYmplY3RzIGdlbmVyYXRlZCBieSA8Yj5iaW5kPC9iPiB0YWtlIHRoZWlyIAoJCQlhcmd1bWVudHMgYnkgcmVmZXJlbmNlIGFuZCBjYW5ub3QsIHRoZXJlZm9yZSwgYWNjZXB0IG5vbi1jb25zdCB0ZW1wb3JhcmllcyBvciAKCQkJbGl0ZXJhbCBjb25zdGFudHMuIFRoaXMgaXMgYW4gaW5oZXJlbnQgbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlIGluIGl0cyAKCQkJY3VycmVudCAoMjAwMykgaW5jYXJuYXRpb24sIGtub3duIGFzIDxBIGhyZWY9Imh0dHA6Ly9zdGQuZGt1dWcuZGsvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwMi9uMTM4NS5odG0iPgoJCQkJdGhlIGZvcndhcmRpbmcgcHJvYmxlbTwvQT4uIChJdCB3aWxsIGJlIGZpeGVkIGluIHRoZSBuZXh0IHN0YW5kYXJkLCB1c3VhbGx5IAoJCQljYWxsZWQgQysrMHguKTwvcD4KCQk8cD5UaGUgbGlicmFyeSB1c2VzIHNpZ25hdHVyZXMgb2YgdGhlIGZvcm0KCQk8L3A+CgkJPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyB2b2lkIGYoVCAmYW1wOyB0KTsKPC9wcmU+CgkJPHA+dG8gYWNjZXB0IGFyZ3VtZW50cyBvZiBhcmJpdHJhcnkgdHlwZXMgYW5kIHBhc3MgdGhlbSBvbiB1bm1vZGlmaWVkLiBBcyBub3RlZCwgCgkJCXRoaXMgZG9lcyBub3Qgd29yayB3aXRoIG5vbi1jb25zdCByLXZhbHVlcy4KCQk8L3A+CgkJPHA+T24gY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBwYXJ0aWFsIG9yZGVyaW5nIG9mIGZ1bmN0aW9uIHRlbXBsYXRlcywgYSBwb3NzaWJsZSAKCQkJc29sdXRpb24gaXMgdG8gYWRkIGFuIG92ZXJsb2FkOgoJCTwvcD4KCQk8cHJlPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IHZvaWQgZihUICZhbXA7IHQpOwp0ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyB2b2lkIGYoVCBjb25zdCAmYW1wOyB0KTsKPC9wcmU+CgkJPHA+VW5mb3J0dW5hdGVseSwgdGhpcyByZXF1aXJlcyBwcm92aWRpbmcgNTEyIG92ZXJsb2FkcyBmb3IgbmluZSBhcmd1bWVudHMsIHdoaWNoIAoJCQlpcyBpbXByYWN0aWNhbC4gVGhlIGxpYnJhcnkgY2hvb3NlcyBhIHNtYWxsIHN1YnNldDogZm9yIHVwIHRvIHR3byBhcmd1bWVudHMsIGl0IAoJCQlwcm92aWRlcyB0aGUgY29uc3Qgb3ZlcmxvYWRzIGluIGZ1bGwsIGZvciBhcml0aWVzIG9mIHRocmVlIGFuZCBtb3JlIGl0IHByb3ZpZGVzIAoJCQlhIHNpbmdsZSBhZGRpdGlvbmFsIG92ZXJsb2FkIHdpdGggYWxsIG9mIHRoZSBhcmd1bWVudHMgdGFrZW4gYnkgY29uc3QgCgkJCXJlZmVyZW5jZS4gVGhpcyBjb3ZlcnMgYSByZWFzb25hYmxlIHBvcnRpb24gb2YgdGhlIHVzZSBjYXNlcy4KCQk8L3A+CgkJPGgyPjxhIG5hbWU9IkZBUSI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+PC9oMj4KCQk8aDM+PGEgbmFtZT0iUV9kb2VzbnRfY29tcGlsZSI+V2h5IGRvZXNuJ3QgdGhpcyBjb21waWxlPzwvYT48L2gzPgoJCTxwPlNlZSB0aGUgPEEgaHJlZj0iI1Ryb3VibGVzaG9vdGluZyI+ZGVkaWNhdGVkIFRyb3VibGVzaG9vdGluZyBzZWN0aW9uPC9BPi48L3A+CgkJPGgzPjxhIG5hbWU9IlFfZG9lc19jb21waWxlIj5XaHkgZG9lcyB0aGlzIGNvbXBpbGU/IEl0IHNob3VsZCBub3QuPC9hPjwvaDM+CgkJPHA+UHJvYmFibHkgYmVjYXVzZSB5b3UgdXNlZCB0aGUgZ2VuZXJhbCA8dHQ+YmluZCZsdDtSJmd0OyhmLCAuLi4pPC90dD4gc3ludGF4LCAKCQkJdGhlcmVieSBpbnN0cnVjdGluZyA8Yj5iaW5kPC9iPiB0byBub3QgImluc3BlY3QiIDxiPmY8L2I+IHRvIGRldGVjdCBhcml0eSBhbmQgCgkJCXJldHVybiB0eXBlIGVycm9ycy48L3A+CgkJPGgzPjxhIG5hbWU9IlFfZm9ybXMiPldoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiaW5kKGYsIC4uLikgYW5kIGJpbmQmbHQ7UiZndDsoZiwgCgkJCQkuLi4pPzwvYT48L2gzPgoJCTxwPlRoZSBmaXJzdCBmb3JtIGluc3RydWN0cyA8Yj5iaW5kPC9iPiB0byBpbnNwZWN0IHRoZSB0eXBlIG9mIDxiPmY8L2I+IGluIG9yZGVyIHRvIAoJCQlkZXRlcm1pbmUgaXRzIGFyaXR5IChudW1iZXIgb2YgYXJndW1lbnRzKSBhbmQgcmV0dXJuIHR5cGUuIEFyaXR5IGVycm9ycyB3aWxsIGJlIAoJCQlkZXRlY3RlZCBhdCAiYmluZCB0aW1lIi4gVGhpcyBzeW50YXgsIG9mIGNvdXJzZSwgcGxhY2VzIHNvbWUgcmVxdWlyZW1lbnRzIG9uIDxiPmY8L2I+LiAKCQkJSXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCBmdW5jdGlvbiBwb2ludGVyLCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciwgb3IgYSBmdW5jdGlvbiAKCQkJb2JqZWN0IHRoYXQgZGVmaW5lcyBhIG5lc3RlZCB0eXBlIG5hbWVkIDxiPnJlc3VsdF90eXBlPC9iPjsgaW4gc2hvcnQsIGl0IG11c3QgCgkJCWJlIHNvbWV0aGluZyB0aGF0IDxiPmJpbmQ8L2I+IGNhbiByZWNvZ25pemUuPC9wPgoJCTxwPlRoZSBzZWNvbmQgZm9ybSBpbnN0cnVjdHMgPGI+YmluZDwvYj4gdG8gPGI+bm90PC9iPiBhdHRlbXB0IHRvIHJlY29nbml6ZSB0aGUgCgkJCXR5cGUgb2YgPGI+ZjwvYj4uIEl0IGlzIGdlbmVyYWxseSB1c2VkIHdpdGggZnVuY3Rpb24gb2JqZWN0cyB0aGF0IGRvIG5vdCwgb3IgCgkJCWNhbm5vdCwgZXhwb3NlIDxiPnJlc3VsdF90eXBlPC9iPiwgYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBub25zdGFuZGFyZCAKCQkJZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSAKCQkJcmVjb2duaXplIHZhcmlhYmxlLWFyZ3VtZW50IGZ1bmN0aW9ucyBsaWtlIDxiPnByaW50ZjwvYj4sIHNvIHlvdSB3aWxsIGhhdmUgdG8gCgkJCXVzZSA8dHQ+YmluZCZsdDtpbnQmZ3Q7KHByaW50ZiwgLi4uKTwvdHQ+LiBOb3RlIHRoYXQgYW4gYWx0ZXJuYXRpdmUgPHR0PmJpbmQodHlwZSZsdDtSJmd0OygpLCAKCQkJCWYsIC4uLik8L3R0PiBzeW50YXggaXMgc3VwcG9ydGVkIGZvciBwb3J0YWJpbGl0eSByZWFzb25zLjwvcD4KCQk8cD5Bbm90aGVyIGltcG9ydGFudCBmYWN0b3IgdG8gY29uc2lkZXIgaXMgdGhhdCBjb21waWxlcnMgd2l0aG91dCBwYXJ0aWFsIHRlbXBsYXRlIAoJCQlzcGVjaWFsaXphdGlvbiBvciBmdW5jdGlvbiB0ZW1wbGF0ZSBwYXJ0aWFsIG9yZGVyaW5nIHN1cHBvcnQgY2Fubm90IGhhbmRsZSB0aGUgCgkJCWZpcnN0IGZvcm0gd2hlbiA8Yj5mPC9iPiBpcyBhIGZ1bmN0aW9uIG9iamVjdCwgYW5kIGluIG1vc3QgY2FzZXMgd2lsbCBub3QgCgkJCWhhbmRsZSB0aGUgc2Vjb25kIGZvcm0gd2hlbiA8Yj5mPC9iPiBpcyBhIGZ1bmN0aW9uIChwb2ludGVyKSBvciBhIG1lbWJlciAKCQkJZnVuY3Rpb24gcG9pbnRlci48L3A+CgkJPGgzPjxhIG5hbWU9IlFfd2luMzJfYXBpIj5Eb2VzIDxiPmJpbmQ8L2I+IHdvcmsgd2l0aCBXaW5kb3dzIEFQSSBmdW5jdGlvbnM/PC9hPjwvaDM+CgkJPHA+WWVzLCBpZiB5b3UgPEEgaHJlZj0iI3N0ZGNhbGwiPiNkZWZpbmUgQk9PU1RfQklORF9FTkFCTEVfU1REQ0FMTDwvQT4uIEFuIAoJCQlhbHRlcm5hdGl2ZSBpcyB0byB0cmVhdCB0aGUgZnVuY3Rpb24gYXMgYSA8QSBocmVmPSIjd2l0aF9mdW5jdGlvbl9vYmplY3RzIj5nZW5lcmljIAoJCQkJZnVuY3Rpb24gb2JqZWN0PC9BPiBhbmQgdXNlIHRoZSA8dHQ+YmluZCZsdDtSJmd0OyhmLCAuLi4pPC90dD4gc3ludGF4LjwvcD4KCQk8aDM+PGEgbmFtZT0iUV9jb20iPkRvZXMgPGI+YmluZDwvYj4gd29yayB3aXRoIENPTSBtZXRob2RzPzwvYT48L2gzPgoJCTxwPlllcywgaWYgeW91IDxBIGhyZWY9IiNzdGRjYWxsIj4jZGVmaW5lIEJPT1NUX01FTV9GTl9FTkFCTEVfU1REQ0FMTDwvQT4uPC9wPgoJCTxoMz48YSBuYW1lPSJRX21hYyI+RG9lcyA8Yj5iaW5kPC9iPiB3b3JrIHdpdGggTWFjIHRvb2xib3ggZnVuY3Rpb25zPzwvYT48L2gzPgoJCTxwPlllcywgaWYgeW91IDxBIGhyZWY9IiNzdGRjYWxsIj4jZGVmaW5lIEJPT1NUX0JJTkRfRU5BQkxFX1BBU0NBTDwvQT4uIEFuIAoJCQlhbHRlcm5hdGl2ZSBpcyB0byB0cmVhdCB0aGUgZnVuY3Rpb24gYXMgYSA8QSBocmVmPSIjd2l0aF9mdW5jdGlvbl9vYmplY3RzIj5nZW5lcmljIAoJCQkJZnVuY3Rpb24gb2JqZWN0PC9BPiBhbmQgdXNlIHRoZSA8dHQ+YmluZCZsdDtSJmd0OyhmLCAuLi4pPC90dD4gc3ludGF4LjwvcD4KCQk8aDM+PGEgbmFtZT0iUV9leHRlcm5fQyI+RG9lcyA8Yj5iaW5kPC9iPiB3b3JrIHdpdGggZXh0ZXJuICJDIiBmdW5jdGlvbnM/PC9hPjwvaDM+CgkJPHA+U29tZXRpbWVzLiBPbiBzb21lIHBsYXRmb3JtcywgcG9pbnRlcnMgdG8gZXh0ZXJuICJDIiBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gCgkJCSJvcmRpbmFyeSIgZnVuY3Rpb24gcG9pbnRlcnMsIHNvIHRoZXkgd29yayBmaW5lLiBPdGhlciBwbGF0Zm9ybXMgdHJlYXQgdGhlbSBhcyAKCQkJZGlmZmVyZW50IHR5cGVzLiBBIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIDxiPmJpbmQ8L2I+IGlzIGV4cGVjdGVkIAoJCQl0byBoYW5kbGUgdGhlIHByb2JsZW0gdHJhbnNwYXJlbnRseTsgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdC4gQXMgdXN1YWwsIAoJCQl0aGUgd29ya2Fyb3VuZCBpcyB0byB0cmVhdCB0aGUgZnVuY3Rpb24gYXMgYSA8QSBocmVmPSIjd2l0aF9mdW5jdGlvbl9vYmplY3RzIj5nZW5lcmljIAoJCQkJZnVuY3Rpb24gb2JqZWN0PC9BPiBhbmQgdXNlIHRoZSA8dHQ+YmluZCZsdDtSJmd0OyhmLCAuLi4pPC90dD4gc3ludGF4LjwvcD4KCQk8aDM+PGEgbmFtZT0iUV9hdXRvX3N0ZGNhbGwiPldoeSBkb2Vzbid0IDxiPmJpbmQ8L2I+IGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIAoJCQkJbm9uc3RhbmRhcmQgZnVuY3Rpb25zPzwvYT48L2gzPgoJCTxwPk5vbi1wb3J0YWJsZSBleHRlbnNpb25zLCBpbiBnZW5lcmFsLCBzaG91bGQgZGVmYXVsdCB0byBvZmYgdG8gcHJldmVudCB2ZW5kb3IgCgkJCWxvY2staW4uIEhhZCB0aGUgPEEgaHJlZj0iI3N0ZGNhbGwiPmFwcHJvcHJpYXRlIG1hY3JvczwvQT4gYmVlbiBkZWZpbmVkIAoJCQlhdXRvbWF0aWNhbGx5LCB5b3UgY291bGQgaGF2ZSBhY2NpZGVudGFsbHkgdGFrZW4gYWR2YW50YWdlIG9mIHRoZW0gd2l0aG91dCAKCQkJcmVhbGl6aW5nIHRoYXQgeW91ciBjb2RlIGlzLCBwZXJoYXBzLCBubyBsb25nZXIgcG9ydGFibGUuIEluIGFkZGl0aW9uLCBzb21lIAoJCQljb21waWxlcnMgaGF2ZSB0aGUgb3B0aW9uIHRvIG1ha2UgPGI+X19zdGRjYWxsPC9iPiAoPFNUUk9ORz5fX2Zhc3RjYWxsPC9TVFJPTkc+KSAKCQkJdGhlaXIgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24sIGluIHdoaWNoIGNhc2Ugbm8gc2VwYXJhdGUgc3VwcG9ydCB3b3VsZCBiZSAKCQkJbmVjZXNzYXJ5LjwvcD4KCQk8aDI+PGEgbmFtZT0iVHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3Rpbmc8L2E+PC9oMj4KCQk8aDM+PGEgbmFtZT0iZXJyX251bV9hcmdzIj5JbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50czwvYT48L2gzPgoJCTxwPkluIGEgPHR0PmJpbmQoZiwgYTEsIGEyLCAuLi4sIGFOKTwvdHQ+IGV4cHJlc3Npb24sIHRoZSBmdW5jdGlvbiBvYmplY3QgPGI+ZjwvYj4gbXVzdCAKCQkJYmUgYWJsZSB0byB0YWtlIGV4YWN0bHkgPGI+TjwvYj4gYXJndW1lbnRzLiBUaGlzIGVycm9yIGlzIG5vcm1hbGx5IGRldGVjdGVkIGF0IAoJCQkiYmluZCB0aW1lIjsgaW4gb3RoZXIgd29yZHMsIHRoZSBjb21waWxhdGlvbiBlcnJvciBpcyByZXBvcnRlZCBvbiB0aGUgbGluZSAKCQkJd2hlcmUgYmluZCgpIGlzIGludm9rZWQ6PC9wPgoJCTxwcmU+aW50IGYoaW50LCBpbnQpOwoKaW50IG1haW4oKQp7CiAgICBib29zdDo6YmluZChmLCAxKTsgICAgLy8gZXJyb3IsIGYgdGFrZXMgdHdvIGFyZ3VtZW50cwogICAgYm9vc3Q6OmJpbmQoZiwgMSwgMik7IC8vIE9LCn0KPC9wcmU+CgkJPHA+QSBjb21tb24gdmFyaWF0aW9uIG9mIHRoaXMgZXJyb3IgaXMgdG8gZm9yZ2V0IHRoYXQgbWVtYmVyIGZ1bmN0aW9ucyBoYXZlIGFuIAoJCQlpbXBsaWNpdCAidGhpcyIgYXJndW1lbnQ6PC9wPgoJCTxwcmU+c3RydWN0IFgKewogICAgaW50IGYoaW50KTsKfQoKaW50IG1haW4oKQp7CiAgICBib29zdDo6YmluZCgmYW1wO1g6OmYsIDEpOyAgICAgLy8gZXJyb3IsIFg6OmYgdGFrZXMgdHdvIGFyZ3VtZW50cwogICAgYm9vc3Q6OmJpbmQoJmFtcDtYOjpmLCA8Yj5fMTwvYj4sIDEpOyAvLyBPSwp9CjwvcHJlPgoJCTxoMz48YSBuYW1lPSJlcnJfc2lnbmF0dXJlIj5UaGUgZnVuY3Rpb24gb2JqZWN0IGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkIAoJCQkJYXJndW1lbnRzPC9hPjwvaDM+CgkJPHA+QXMgaW4gbm9ybWFsIGZ1bmN0aW9uIGNhbGxzLCB0aGUgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgYm91bmQgbXVzdCBiZSAKCQkJY29tcGF0aWJsZSB3aXRoIHRoZSBhcmd1bWVudCBsaXN0LiBUaGUgaW5jb21wYXRpYmlsaXR5IHdpbGwgdXN1YWxseSBiZSBkZXRlY3RlZCAKCQkJYnkgdGhlIGNvbXBpbGVyIGF0ICJjYWxsIHRpbWUiIGFuZCB0aGUgcmVzdWx0IGlzIHR5cGljYWxseSBhbiBlcnJvciBpbiA8Yj5iaW5kLmhwcDwvYj4KCQkJb24gYSBsaW5lIHRoYXQgbG9va3MgbGlrZTo8L3A+CgkJPHByZT4gICAgcmV0dXJuIGYoYVthMV9dLCBhW2EyX10pOwo8L3ByZT4KCQk8cD5BbiBleGFtcGxlIG9mIHRoaXMga2luZCBvZiBlcnJvcjo8L3A+CgkJPHByZT5pbnQgZihpbnQpOwoKaW50IG1haW4oKQp7CiAgICBib29zdDo6YmluZChmLCAiaW5jb21wYXRpYmxlIik7ICAgICAgLy8gT0sgc28gZmFyLCBubyBjYWxsCiAgICBib29zdDo6YmluZChmLCAiaW5jb21wYXRpYmxlIikoKTsgICAgLy8gZXJyb3IsICJpbmNvbXBhdGlibGUiIGlzIG5vdCBhbiBpbnQKICAgIGJvb3N0OjpiaW5kKGYsIF8xKTsgICAgICAgICAgICAgICAgICAvLyBPSwogICAgYm9vc3Q6OmJpbmQoZiwgXzEpKCJpbmNvbXBhdGlibGUiKTsgIC8vIGVycm9yLCAiaW5jb21wYXRpYmxlIiBpcyBub3QgYW4gaW50Cn0KPC9wcmU+CgkJPGgzPjxhIG5hbWU9ImVycl9hcmdfYWNjZXNzIj5BY2Nlc3NpbmcgYW4gYXJndW1lbnQgdGhhdCBkb2VzIG5vdCBleGlzdDwvYT48L2gzPgoJCTxwPlRoZSBwbGFjZWhvbGRlciA8Yj5fTjwvYj4gc2VsZWN0cyB0aGUgYXJndW1lbnQgYXQgcG9zaXRpb24gPGI+TjwvYj4gZnJvbSB0aGUgCgkJCWFyZ3VtZW50IGxpc3QgcGFzc2VkIGF0ICJjYWxsIHRpbWUuIiBOYXR1cmFsbHksIGl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG8gCgkJCWFjY2VzcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzIGxpc3Q6PC9wPgoJCTxwcmU+aW50IGYoaW50KTsKCmludCBtYWluKCkKewogICAgYm9vc3Q6OmJpbmQoZiwgXzEpOyAgICAgICAgICAgICAgICAgIC8vIE9LCiAgICBib29zdDo6YmluZChmLCBfMSkoKTsgICAgICAgICAgICAgICAgLy8gZXJyb3IsIHRoZXJlIGlzIG5vIGFyZ3VtZW50IG51bWJlciAxCn0KPC9wcmU+CgkJPHA+VGhlIGVycm9yIGlzIHVzdWFsbHkgcmVwb3J0ZWQgaW4gPGI+YmluZC5ocHA8L2I+LCBhdCBhIGxpbmUgc2ltaWxhciB0bzo8L3A+CgkJPHByZT4gICAgcmV0dXJuIGYoYVthMV9dKTsKPC9wcmU+CgkJPHA+V2hlbiBlbXVsYXRpbmcgPHR0PnN0ZDo6YmluZDFzdChmLCBhKTwvdHQ+LCBhIGNvbW1vbiBtaXN0YWtlIG9mIHRoaXMgY2F0ZWdvcnkgaXMgCgkJCXRvIHR5cGUgPHR0PmJpbmQoZiwgYSwgXzIpPC90dD4gaW5zdGVhZCBvZiB0aGUgY29ycmVjdCA8dHQ+YmluZChmLCBhLCBfMSk8L3R0Pi48L3A+CgkJPGgzPjxhIG5hbWU9ImVycl9zaG9ydF9mb3JtIj5JbmFwcHJvcHJpYXRlIHVzZSBvZiBiaW5kKGYsIC4uLik8L2E+PC9oMz4KCQk8cD5UaGUgPHR0PmJpbmQoZiwgYTEsIGEyLCAuLi4sIGFOKTwvdHQ+IDxBIGhyZWY9IiNRX2Zvcm1zIj5mb3JtPC9BPiBjYXVzZXMgCgkJCWF1dG9tYXRpYyByZWNvZ25pdGlvbiBvZiB0aGUgdHlwZSBvZiA8Yj5mPC9iPi4gSXQgd2lsbCBub3Qgd29yayB3aXRoIGFyYml0cmFyeSAKCQkJZnVuY3Rpb24gb2JqZWN0czsgPGI+ZjwvYj4gbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGEgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuPC9wPgoJCTxwPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGZvcm0gd2l0aCBmdW5jdGlvbiBvYmplY3RzIHRoYXQgZGVmaW5lIDxiPnJlc3VsdF90eXBlPC9iPiwgCgkJCWJ1dCA8Yj5vbmx5IG9uIGNvbXBpbGVyczwvYj4gdGhhdCBzdXBwb3J0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIHBhcnRpYWwgCgkJCW9yZGVyaW5nLiBJbiBwYXJ0aWN1bGFyLCBNU1ZDIHVwIHRvIHZlcnNpb24gNy4wIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzeW50YXggCgkJCWZvciBmdW5jdGlvbiBvYmplY3RzLjwvcD4KCQk8aDM+PGEgbmFtZT0iZXJyX2xvbmdfZm9ybSI+SW5hcHByb3ByaWF0ZSB1c2Ugb2YgYmluZCZsdDtSJmd0OyhmLCAuLi4pPC9hPjwvaDM+CgkJPHA+VGhlIDx0dD5iaW5kJmx0O1ImZ3Q7KGYsIGExLCBhMiwgLi4uLCBhTik8L3R0PiA8QSBocmVmPSIjUV9mb3JtcyI+Zm9ybTwvQT4gc3VwcG9ydHMgCgkJCWFyYml0cmFyeSBmdW5jdGlvbiBvYmplY3RzLjwvcD4KCQk8cD5JdCBpcyBwb3NzaWJsZSAoYnV0IG5vdCByZWNvbW1lbmRlZCkgdG8gdXNlIHRoaXMgZm9ybSB3aXRoIGZ1bmN0aW9ucyBvciBtZW1iZXIgCgkJCWZ1bmN0aW9uIHBvaW50ZXJzLCBidXQgPGI+b25seSBvbiBjb21waWxlcnM8L2I+IHRoYXQgc3VwcG9ydCBwYXJ0aWFsIG9yZGVyaW5nLiAKCQkJSW4gcGFydGljdWxhciwgTVNWQyB1cCB0byB2ZXJzaW9uIDcuMCBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IHRoaXMgc3ludGF4IGZvciAKCQkJZnVuY3Rpb25zIGFuZCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuPC9wPgoJCTxoMz48YSBuYW1lPSJlcnJfbm9uc3RkIj5CaW5kaW5nIGEgbm9uc3RhbmRhcmQgZnVuY3Rpb248L2E+PC9oMz4KCQk8cD5CeSBkZWZhdWx0LCB0aGUgPHR0PmJpbmQoZiwgYTEsIGEyLCAuLi4sIGFOKTwvdHQ+IDxBIGhyZWY9IiNRX2Zvcm1zIj5mb3JtPC9BPiByZWNvZ25pemVzIAoJCQkib3JkaW5hcnkiIEMrKyBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLiA8QSBocmVmPSIjc3RkY2FsbCI+RnVuY3Rpb25zIHRoYXQgCgkJCQl1c2UgYSBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9uPC9BPiwgb3IgdmFyaWFibGUtYXJndW1lbnQgZnVuY3Rpb25zIHN1Y2ggCgkJCWFzIDxTVFJPTkc+c3RkOjpwcmludGY8L1NUUk9ORz4sIGRvIG5vdCB3b3JrLiBUaGUgZ2VuZXJhbCA8dHQ+YmluZCZsdDtSJmd0OyhmLCBhMSwgCgkJCQlhMiwgLi4uLCBhTik8L3R0PiA8QSBocmVmPSIjUV9mb3JtcyI+Zm9ybTwvQT4gd29ya3Mgd2l0aCBub25zdGFuZGFyZCAKCQkJZnVuY3Rpb25zLgoJCTwvcD4KCQk8cD5PbiBzb21lIHBsYXRmb3JtcywgZXh0ZXJuICJDIiBmdW5jdGlvbnMsIGxpa2UgPGI+c3RkOjpzdHJjbXA8L2I+LCBhcmUgbm90IAoJCQlyZWNvZ25pemVkIGJ5IHRoZSBzaG9ydCBmb3JtIG9mIGJpbmQuCgkJPC9wPgoJCTxQPlNlZSBhbHNvIDxBIGhyZWY9IiNzdGRjYWxsIj4iX19zdGRjYWxsIiBhbmQgInBhc2NhbCIgU3VwcG9ydDwvQT4uPC9QPgoJCTxoMz48YSBuYW1lPSJlcnJfb3ZlcmxvYWRlZCI+QmluZGluZyBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uPC9hPjwvaDM+CgkJPHA+QW4gYXR0ZW1wdCB0byBiaW5kIGFuIG92ZXJsb2FkZWQgZnVuY3Rpb24gdXN1YWxseSByZXN1bHRzIGluIGFuIGVycm9yLCBhcyB0aGVyZSAKCQkJaXMgbm8gd2F5IHRvIHRlbGwgd2hpY2ggb3ZlcmxvYWQgd2FzIG1lYW50IHRvIGJlIGJvdW5kLiBUaGlzIGlzIGEgY29tbW9uIAoJCQlwcm9ibGVtIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyB3aXRoIHR3byBvdmVybG9hZHMsIGNvbnN0IGFuZCBub24tY29uc3QsIGFzIGluIAoJCQl0aGlzIHNpbXBsaWZpZWQgZXhhbXBsZTo8L3A+CgkJPHByZT5zdHJ1Y3QgWAp7CiAgICBpbnQmYW1wOyBnZXQoKTsKICAgIGludCBjb25zdCZhbXA7IGdldCgpIGNvbnN0Owp9OwoKaW50IG1haW4oKQp7CiAgICBib29zdDo6YmluZCggJmFtcDtYOjpnZXQsIF8xICk7Cn0KPC9wcmU+CgkJPFA+VGhlIGFtYmlndWl0eSBjYW4gYmUgcmVzb2x2ZWQgbWFudWFsbHkgYnkgY2FzdGluZyB0aGUgKG1lbWJlcikgZnVuY3Rpb24gcG9pbnRlciAKCQkJdG8gdGhlIGRlc2lyZWQgdHlwZTo8L1A+CjxwcmU+aW50IG1haW4oKQp7CiAgICBib29zdDo6YmluZCggc3RhdGljX2Nhc3QmbHQ7IGludCBjb25zdCZhbXA7IChYOjoqKSAoKSBjb25zdCAmZ3Q7KCAmYW1wO1g6OmdldCApLCBfMSApOwp9CjwvcHJlPgoJCTxQPkFub3RoZXIsIGFyZ3VhYmx5IG1vcmUgcmVhZGFibGUsIGFsdGVybmF0aXZlIGlzIHRvIGludHJvZHVjZSBhIHRlbXBvcmFyeSAKCQkJdmFyaWFibGU6PC9QPgo8cHJlPmludCBtYWluKCkKewogICAgaW50IGNvbnN0JmFtcDsgKFg6OipnZXQpICgpIGNvbnN0ID0gJmFtcDtYOjpnZXQ7CiAgICBib29zdDo6YmluZCggZ2V0LCBfMSApOwp9CjwvcHJlPgoJCTxoMz48YSBuYW1lPSJlcnJfY29uc3RfYXJnIj48Yj5jb25zdDwvYj4gaW4gc2lnbmF0dXJlczwvYT48L2gzPgoJCTxwPlNvbWUgY29tcGlsZXJzLCBpbmNsdWRpbmcgTVNWQyA2LjAgYW5kIEJvcmxhbmQgQysrIDUuNS4xLCBoYXZlIHByb2JsZW1zIHdpdGggdGhlIAoJCQl0b3AtbGV2ZWwgPGI+Y29uc3Q8L2I+IGluIGZ1bmN0aW9uIHNpZ25hdHVyZXM6CgkJPC9wPgoJCTxwcmU+aW50IGYoaW50IGNvbnN0KTsKCmludCBtYWluKCkKewogICAgYm9vc3Q6OmJpbmQoZiwgMSk7ICAgICAvLyBlcnJvcgp9CjwvcHJlPgoJCTxwPldvcmthcm91bmQ6IHJlbW92ZSB0aGUgPGI+Y29uc3Q8L2I+IHF1YWxpZmllciBmcm9tIHRoZSBhcmd1bWVudC4KCQk8L3A+CgkJPGgzPjxhIG5hbWU9ImVycl9tc3ZjX3VzaW5nIj5NU1ZDIHNwZWNpZmljOiB1c2luZyBib29zdDo6YmluZDs8L2E+PC9oMz4KCQk8cD5PbiBNU1ZDICh1cCB0byB2ZXJzaW9uIDcuMCksIHdoZW4gPGI+Ym9vc3Q6OmJpbmQ8L2I+IGlzIGJyb3VnaHQgaW50byBzY29wZSB3aXRoIAoJCQlhbiB1c2luZyBkZWNsYXJhdGlvbjoKCQk8L3A+CgkJPHByZT51c2luZyBib29zdDo6YmluZDsKPC9wcmU+CgkJPHA+dGhlIHN5bnRheCA8dHQ+YmluZCZsdDtSJmd0OyhmLCAuLi4pPC90dD4gZG9lcyBub3Qgd29yay4gV29ya2Fyb3VuZDogZWl0aGVyIHVzZSAKCQkJdGhlIHF1YWxpZmllZCBuYW1lLCA8Yj5ib29zdDo6YmluZDwvYj4sIG9yIHVzZSBhbiB1c2luZyBkaXJlY3RpdmUgaW5zdGVhZDoKCQk8L3A+CgkJPHByZT51c2luZyBuYW1lc3BhY2UgYm9vc3Q7CjwvcHJlPgoJCTxoMz48YSBuYW1lPSJlcnJfbXN2Y19jbGFzc190ZW1wbGF0ZSI+TVNWQyBzcGVjaWZpYzogY2xhc3MgdGVtcGxhdGVzIHNoYWRvdyBmdW5jdGlvbiAKCQkJCXRlbXBsYXRlczwvYT48L2gzPgoJCTxwPk9uIE1TVkMgKHVwIHRvIHZlcnNpb24gNy4wKSwgYSBuZXN0ZWQgY2xhc3MgdGVtcGxhdGUgbmFtZWQgPGI+YmluZDwvYj4gd2lsbCAKCQkJc2hhZG93IHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSA8Yj5ib29zdDo6YmluZDwvYj4sIGJyZWFraW5nIHRoZSA8dHQ+YmluZCZsdDtSJmd0OyhmLCAKCQkJCS4uLik8L3R0PiBzeW50YXguIFVuZm9ydHVuYXRlbHksIHNvbWUgbGlicmFyaWVzIGNvbnRhaW4gbmVzdGVkIGNsYXNzIAoJCQl0ZW1wbGF0ZXMgbmFtZWQgPGI+YmluZDwvYj4gKGlyb25pY2FsbHksIHN1Y2ggY29kZSBpcyBvZnRlbiBhbiBNU1ZDIHNwZWNpZmljIAoJCQl3b3JrYXJvdW5kLik8L3A+CgkJPFA+VGhlIHdvcmthcm91bmQgaXMgdG8gdXNlIHRoZSBhbHRlcm5hdGl2ZSA8dHQ+YmluZCh0eXBlJmx0O1ImZ3Q7KCksIGYsIC4uLik8L3R0PiBzeW50YXguPC9QPgoJCTxoMz48YSBuYW1lPSJlcnJfbXN2Y19lbGxpcHNpcyI+TVNWQyBzcGVjaWZpYzogLi4uIGluIHNpZ25hdHVyZXMgdHJlYXRlZCBhcyB0eXBlPC9hPjwvaDM+CgkJPHA+TVNWQyAodXAgdG8gdmVyc2lvbiA3LjApIHRyZWF0cyB0aGUgZWxsaXBzaXMgaW4gYSB2YXJpYWJsZSBhcmd1bWVudCBmdW5jdGlvbiAKCQkJKHN1Y2ggYXMgPGI+c3RkOjpwcmludGY8L2I+KSBhcyBhIHR5cGUuIFRoZXJlZm9yZSwgaXQgd2lsbCBhY2NlcHQgdGhlIAoJCQkoaW5jb3JyZWN0IGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKSBmb3JtOgoJCTwvcD4KCQk8cHJlPiAgICBiaW5kKHByaW50ZiwgIiVzXG4iLCBfMSk7CjwvcHJlPgoJCTxwPmFuZCB3aWxsIHJlamVjdCB0aGUgY29ycmVjdCB2ZXJzaW9uOgoJCTwvcD4KCQk8cHJlPiAgICBiaW5kJmx0O2ludCZndDsocHJpbnRmLCAiJXNcbiIsIF8xKTsKPC9wcmU+CgkJPGgyPjxhIG5hbWU9IkludGVyZmFjZSI+SW50ZXJmYWNlPC9hPjwvaDI+CgkJPGgzPjxhIG5hbWU9IlN5bm9wc2lzIj5TeW5vcHNpczwvYT48L2gzPgoJCTxwcmU+bmFtZXNwYWNlIGJvb3N0CnsKCi8vIG5vIGFyZ3VtZW50cwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgRiZndDsgPGk+dW5zcGVjaWZpZWQtMTwvaT4gPEEgaHJlZj0iI2JpbmRfMSIgPmJpbmQ8L0E+KEYgZik7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBGJmd0OyA8aT51bnNwZWNpZmllZC0xLTE8L2k+IDxBIGhyZWY9IiNiaW5kXzFfMSIgPmJpbmQ8L0E+KEYgZik7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBSJmd0OyA8aT51bnNwZWNpZmllZC0yPC9pPiA8QSBocmVmPSIjYmluZF8yIiA+YmluZDwvQT4oUiAoKmYpICgpKTsKCi8vIG9uZSBhcmd1bWVudAoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgRiwgY2xhc3MgQTEmZ3Q7IDxpPnVuc3BlY2lmaWVkLTM8L2k+IDxBIGhyZWY9IiNiaW5kXzMiID5iaW5kPC9BPihGIGYsIEExIGExKTsKCnRlbXBsYXRlJmx0O2NsYXNzIEYsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC0zLTE8L2k+IDxBIGhyZWY9IiNiaW5kXzNfMSIgPmJpbmQ8L0E+KEYgZiwgQTEgYTEpOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgQjEsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC00PC9pPiA8QSBocmVmPSIjYmluZF80IiA+YmluZDwvQT4oUiAoKmYpIChCMSksIEExIGExKTsKCnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIFQsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC01PC9pPiA8QSBocmVmPSIjYmluZF81IiA+YmluZDwvQT4oUiAoVDo6KmYpICgpLCBBMSBhMSk7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBSLCBjbGFzcyBULCBjbGFzcyBBMSZndDsgPGk+dW5zcGVjaWZpZWQtNjwvaT4gPEEgaHJlZj0iI2JpbmRfNiIgPmJpbmQ8L0E+KFIgKFQ6OipmKSAoKSBjb25zdCwgQTEgYTEpOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgVCwgY2xhc3MgQTEmZ3Q7IDxpPnVuc3BlY2lmaWVkLTYtMTwvaT4gPEEgaHJlZj0iI2JpbmRfNl8xIiA+YmluZDwvQT4oUiBUOjoqZiwgQTEgYTEpOwoKLy8gdHdvIGFyZ3VtZW50cwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgRiwgY2xhc3MgQTEsIGNsYXNzIEEyJmd0OyA8aT51bnNwZWNpZmllZC03PC9pPiA8QSBocmVmPSIjYmluZF83IiA+YmluZDwvQT4oRiBmLCBBMSBhMSwgQTIgYTIpOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgRiwgY2xhc3MgQTEsIGNsYXNzIEEyJmd0OyA8aT51bnNwZWNpZmllZC03LTE8L2k+IDxBIGhyZWY9IiNiaW5kXzdfMSIgPmJpbmQ8L0E+KEYgZiwgQTEgYTEsIEEyIGEyKTsKCnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIEIxLCBjbGFzcyBCMiwgY2xhc3MgQTEsIGNsYXNzIEEyJmd0OyA8aT51bnNwZWNpZmllZC04PC9pPiA8QSBocmVmPSIjYmluZF84IiA+YmluZDwvQT4oUiAoKmYpIChCMSwgQjIpLCBBMSBhMSwgQTIgYTIpOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgVCwgY2xhc3MgQjEsIGNsYXNzIEExLCBjbGFzcyBBMiZndDsgPGk+dW5zcGVjaWZpZWQtOTwvaT4gPEEgaHJlZj0iI2JpbmRfOSIgPmJpbmQ8L0E+KFIgKFQ6OipmKSAoQjEpLCBBMSBhMSwgQTIgYTIpOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgVCwgY2xhc3MgQjEsIGNsYXNzIEExLCBjbGFzcyBBMiZndDsgPGk+dW5zcGVjaWZpZWQtMTA8L2k+IDxBIGhyZWY9IiNiaW5kXzEwIiA+YmluZDwvQT4oUiAoVDo6KmYpIChCMSkgY29uc3QsIEExIGExLCBBMiBhMik7CgovLyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG51bWJlciBvZiBhZGRpdGlvbmFsIG92ZXJsb2FkcyBmb3IgbW9yZSBhcmd1bWVudHMKCn0KCm5hbWVzcGFjZQp7Cgo8aT51bnNwZWNpZmllZC1wbGFjZWhvbGRlci10eXBlLTE8L2k+IF8xOwoKPGk+dW5zcGVjaWZpZWQtcGxhY2Vob2xkZXItdHlwZS0yPC9pPiBfMjsKCjxpPnVuc3BlY2lmaWVkLXBsYWNlaG9sZGVyLXR5cGUtMzwvaT4gXzM7CgovLyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG51bWJlciBvZiBhZGRpdGlvbmFsIHBsYWNlaG9sZGVyIGRlZmluaXRpb25zCgp9CjwvcHJlPgoJCTxoMz48YSBuYW1lPSJDb21tb25SZXF1aXJlbWVudHMiPkNvbW1vbiByZXF1aXJlbWVudHM8L2E+PC9oMz4KCQk8cD5BbGwgPHR0PjxpPnVuc3BlY2lmaWVkLU48L2k+PC90dD4gdHlwZXMgcmV0dXJuZWQgYnkgPGI+YmluZDwvYj4gYXJlIDxiPkNvcHlDb25zdHJ1Y3RpYmxlPC9iPi4KCQkJPHR0PjxpPnVuc3BlY2lmaWVkLU48L2k+OjpyZXN1bHRfdHlwZTwvdHQ+IGlzIGRlZmluZWQgYXMgdGhlIHJldHVybiB0eXBlIG9mIDx0dD48aT51bnNwZWNpZmllZC1OPC9pPjo6b3BlcmF0b3IoKTwvdHQ+LjwvcD4KCQk8cD5BbGwgPHR0PjxpPnVuc3BlY2lmaWVkLXBsYWNlaG9sZGVyLU48L2k+PC90dD4gdHlwZXMgYXJlIDxiPkNvcHlDb25zdHJ1Y3RpYmxlPC9iPi4gCgkJCVRoZWlyIGNvcHkgY29uc3RydWN0b3JzIGRvIG5vdCB0aHJvdyBleGNlcHRpb25zLjwvcD4KCQk8aDM+PGEgbmFtZT0iQ29tbW9uRGVmaW5pdGlvbnMiPkNvbW1vbiBkZWZpbml0aW9uczwvYT48L2gzPgoJCTxwPlRoZSBmdW5jdGlvbiC1KHgsIHY8c3ViPjE8L3N1Yj4sIHY8c3ViPjI8L3N1Yj4sIC4uLiwgdjxzdWI+bTwvc3ViPiksIHdoZXJlIG0gaXMgCgkJCWEgbm9ubmVnYXRpdmUgaW50ZWdlciwgaXMgZGVmaW5lZCBhczo8L3A+CgkJPHVsPgoJCQk8bGk+CgkJCQk8dHQ+eC5nZXQoKTwvdHQ+LCB3aGVuIDx0dD54PC90dD4gaXMgb2YgdHlwZSA8dHQ+PEEgaHJlZj0icmVmLmh0bWwiPmJvb3N0OjpyZWZlcmVuY2Vfd3JhcHBlcjwvQT4mbHQ7VCZndDs8L3R0PgoJCQkJZm9yIHNvbWUgdHlwZSA8dHQ+VDwvdHQ+OwoJCQk8bGk+CgkJCQl2PHN1Yj5rPC9zdWI+LCB3aGVuIDx0dD54PC90dD4KCQkJaXMgKGEgY29weSBvZikgdGhlIHBsYWNlaG9sZGVyIF9rIGZvciBzb21lIHBvc2l0aXZlIGludGVnZXIgazsKCQkJPGxpPgoJCQkJPHR0PngodjxzdWI+MTwvc3ViPiwgdjxzdWI+Mjwvc3ViPiwgLi4uLCB2PHN1Yj5tPC9zdWI+KTwvdHQ+IHdoZW4gPHR0Png8L3R0PiBpcyAKCQkJCShhIGNvcHkgb2YpIGEgZnVuY3Rpb24gb2JqZWN0IHJldHVybmVkIGJ5IDxiPmJpbmQ8L2I+OwoJCQk8bGk+CgkJCQk8dHQ+eDwvdHQ+IG90aGVyd2lzZS48L2xpPjwvdWw+CgkJPGgzPjxhIG5hbWU9ImJpbmQiPmJpbmQ8L2E+PC9oMz4KCQk8aDQ+PGEgbmFtZT0iYmluZF8xIj50ZW1wbGF0ZSZsdDtjbGFzcyBSLCBjbGFzcyBGJmd0OyA8aT51bnNwZWNpZmllZC0xPC9pPiBiaW5kKEYgZik8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IEEgZnVuY3Rpb24gb2JqZWN0IDxpPiYjOTU1OzwvaT4gc3VjaCB0aGF0IHRoZSBleHByZXNzaW9uIDx0dD4mIzk1NTsodjxzdWI+MTwvc3ViPiwgCgkJCQkJdjxzdWI+Mjwvc3ViPiwgLi4uLCB2PHN1Yj5tPC9zdWI+KTwvdHQ+IGlzIGVxdWl2YWxlbnQgdG8gPHR0PjxiPmY8L2I+KCk8L3R0PiwgCgkJCQlpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byA8Yj5SPC9iPi48L3A+CgkJCTxwPjxiPlRocm93czo8L2I+IE5vdGhpbmcgdW5sZXNzIHRoZSBjb3B5IGNvbnN0cnVjdG9yIG9mIDxiPkY8L2I+IHRocm93cyBhbiAKCQkJCWV4Y2VwdGlvbi48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzFfMSI+dGVtcGxhdGUmbHQ7Y2xhc3MgRiZndDsgPGk+dW5zcGVjaWZpZWQtMS0xPC9pPiBiaW5kKEYgZik8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+RWZmZWN0czo8L2I+IEVxdWl2YWxlbnQgdG8gPHR0PmJpbmQmbHQ7dHlwZW5hbWUgRjo6cmVzdWx0X3R5cGUsIEYmZ3Q7KGYpOzwvdHQ+PC9wPgoJCQk8cD48Yj5Ob3Rlczo8L2I+IEltcGxlbWVudGF0aW9ucyBhcmUgYWxsb3dlZCB0byBpbmZlciB0aGUgcmV0dXJuIHR5cGUgb2YgPGI+ZjwvYj4gdmlhIAoJCQkJb3RoZXIgbWVhbnMgYXMgYW4gZXh0ZW5zaW9uLCB3aXRob3V0IHJlbHlpbmcgb24gdGhlIDx0dD5yZXN1bHRfdHlwZTwvdHQ+IG1lbWJlci48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzIiPnRlbXBsYXRlJmx0O2NsYXNzIFImZ3Q7IDxpPnVuc3BlY2lmaWVkLTI8L2k+IGJpbmQoUiAoKmYpICgpKTwvYT48L2g0PgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gQSBmdW5jdGlvbiBvYmplY3QgPGk+JiM5NTU7PC9pPiBzdWNoIHRoYXQgdGhlIGV4cHJlc3Npb24gPHR0PiYjOTU1Oyh2PHN1Yj4xPC9zdWI+LCAKCQkJCQl2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pPC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+PGI+ZjwvYj4oKTwvdHQ+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gTm90aGluZy48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzMiPnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIEYsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC0zPC9pPiBiaW5kKEYgCgkJCQlmLCBBMSBhMSk8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IEEgZnVuY3Rpb24gb2JqZWN0IDxpPiYjOTU1OzwvaT4gc3VjaCB0aGF0IHRoZSBleHByZXNzaW9uIDx0dD4mIzk1NTsodjxzdWI+MTwvc3ViPiwgCgkJCQkJdjxzdWI+Mjwvc3ViPiwgLi4uLCB2PHN1Yj5tPC9zdWI+KTwvdHQ+IGlzIGVxdWl2YWxlbnQgdG8gPHR0PjxiPmY8L2I+KLUoPGI+YTE8L2I+LCAKCQkJCQl2PHN1Yj4xPC9zdWI+LCB2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pKTwvdHQ+LCBpbXBsaWNpdGx5IAoJCQkJY29udmVydGVkIHRvIDxiPlI8L2I+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gTm90aGluZyB1bmxlc3MgdGhlIGNvcHkgY29uc3RydWN0b3JzIG9mIDxiPkY8L2I+IG9yIDxiPkExPC9iPiB0aHJvdyAKCQkJCWFuIGV4Y2VwdGlvbi48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzNfMSI+dGVtcGxhdGUmbHQ7Y2xhc3MgRiwgY2xhc3MgQTEmZ3Q7IDxpPnVuc3BlY2lmaWVkLTMtMTwvaT4gYmluZChGIAoJCQkJZiwgQTEgYTEpPC9hPjwvaDQ+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPkVmZmVjdHM6PC9iPiBFcXVpdmFsZW50IHRvIDx0dD5iaW5kJmx0O3R5cGVuYW1lIEY6OnJlc3VsdF90eXBlLCBGLCBBMSZndDsoZiwgYTEpOzwvdHQ+PC9wPgoJCQk8cD48Yj5Ob3Rlczo8L2I+IEltcGxlbWVudGF0aW9ucyBhcmUgYWxsb3dlZCB0byBpbmZlciB0aGUgcmV0dXJuIHR5cGUgb2YgPGI+ZjwvYj4gdmlhIAoJCQkJb3RoZXIgbWVhbnMgYXMgYW4gZXh0ZW5zaW9uLCB3aXRob3V0IHJlbHlpbmcgb24gdGhlIDx0dD5yZXN1bHRfdHlwZTwvdHQ+IG1lbWJlci48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzQiPnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIEIxLCBjbGFzcyBBMSZndDsgPGk+dW5zcGVjaWZpZWQtNDwvaT4gYmluZChSIAoJCQkJKCpmKSAoQjEpLCBBMSBhMSk8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+UmV0dXJuczo8L2I+IEEgZnVuY3Rpb24gb2JqZWN0IDxpPiYjOTU1OzwvaT4gc3VjaCB0aGF0IHRoZSBleHByZXNzaW9uIDx0dD4mIzk1NTsodjxzdWI+MTwvc3ViPiwgCgkJCQkJdjxzdWI+Mjwvc3ViPiwgLi4uLCB2PHN1Yj5tPC9zdWI+KTwvdHQ+IGlzIGVxdWl2YWxlbnQgdG8gPHR0PjxiPmY8L2I+KLUoPGI+YTE8L2I+LCAKCQkJCQl2PHN1Yj4xPC9zdWI+LCB2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pKTwvdHQ+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gTm90aGluZyB1bmxlc3MgdGhlIGNvcHkgY29uc3RydWN0b3Igb2YgPGI+QTE8L2I+IHRocm93cyBhbiAKCQkJCWV4Y2VwdGlvbi48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzUiPnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIFQsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC01PC9pPiBiaW5kKFIgCgkJCQkoVDo6KmYpICgpLCBBMSBhMSk8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+RWZmZWN0czo8L2I+IEVxdWl2YWxlbnQgdG8gPHR0PmJpbmQmbHQ7UiZndDsoPEEgaHJlZj0ibWVtX2ZuLmh0bWwiPmJvb3N0OjptZW1fZm48L0E+KGYpLCAKCQkJCQlhMSk7PC90dD48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzYiPnRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIFQsIGNsYXNzIEExJmd0OyA8aT51bnNwZWNpZmllZC02PC9pPiBiaW5kKFIgCgkJCQkoVDo6KmYpICgpIGNvbnN0LCBBMSBhMSk8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+RWZmZWN0czo8L2I+IEVxdWl2YWxlbnQgdG8gPHR0PmJpbmQmbHQ7UiZndDsoPEEgaHJlZj0ibWVtX2ZuLmh0bWwiPmJvb3N0OjptZW1fZm48L0E+KGYpLCAKCQkJCQlhMSk7PC90dD48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzZfMSI+dGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgVCwgY2xhc3MgQTEmZ3Q7IDxpPnVuc3BlY2lmaWVkLTYtMTwvaT4KCQkJCWJpbmQoUiBUOjoqZiwgQTEgYTEpPC9hPjwvaDQ+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPkVmZmVjdHM6PC9iPiBFcXVpdmFsZW50IHRvIDx0dD5iaW5kJmx0O1ImZ3Q7KDxBIGhyZWY9Im1lbV9mbi5odG1sIj5ib29zdDo6bWVtX2ZuPC9BPihmKSwgCgkJCQkJYTEpOzwvdHQ+PC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8aDQ+PGEgbmFtZT0iYmluZF83Ij50ZW1wbGF0ZSZsdDtjbGFzcyBSLCBjbGFzcyBGLCBjbGFzcyBBMSwgY2xhc3MgQTImZ3Q7IDxpPnVuc3BlY2lmaWVkLTc8L2k+CgkJCQliaW5kKEYgZiwgQTEgYTEsIEEyIGEyKTwvYT48L2g0PgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gQSBmdW5jdGlvbiBvYmplY3QgPGk+JiM5NTU7PC9pPiBzdWNoIHRoYXQgdGhlIGV4cHJlc3Npb24gPHR0PiYjOTU1Oyh2PHN1Yj4xPC9zdWI+LCAKCQkJCQl2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pPC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+PGI+ZjwvYj4otSg8Yj5hMTwvYj4sIAoJCQkJCXY8c3ViPjE8L3N1Yj4sIHY8c3ViPjI8L3N1Yj4sIC4uLiwgdjxzdWI+bTwvc3ViPiksILUoPGI+YTI8L2I+LCB2PHN1Yj4xPC9zdWI+LCAKCQkJCQl2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pKTwvdHQ+LCBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byA8Yj5SPC9iPi48L3A+CgkJCTxwPjxiPlRocm93czo8L2I+IE5vdGhpbmcgdW5sZXNzIHRoZSBjb3B5IGNvbnN0cnVjdG9ycyBvZiA8Yj5GPC9iPiwgPGI+QTE8L2I+IG9yIDxiPkEyPC9iPgoJCQkJdGhyb3cgYW4gZXhjZXB0aW9uLjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPGg0PjxhIG5hbWU9ImJpbmRfN18xIj50ZW1wbGF0ZSZsdDtjbGFzcyBGLCBjbGFzcyBBMSwgY2xhc3MgQTImZ3Q7IDxpPnVuc3BlY2lmaWVkLTctMTwvaT4KCQkJCWJpbmQoRiBmLCBBMSBhMSwgQTIgYTIpPC9hPjwvaDQ+CgkJPGJsb2NrcXVvdGU+CgkJCTxwPjxiPkVmZmVjdHM6PC9iPiBFcXVpdmFsZW50IHRvIDx0dD5iaW5kJmx0O3R5cGVuYW1lIEY6OnJlc3VsdF90eXBlLCBGLCBBMSwgQTImZ3Q7KGYsIAoJCQkJCWExLCBhMik7PC90dD48L3A+CgkJCTxwPjxiPk5vdGVzOjwvYj4gSW1wbGVtZW50YXRpb25zIGFyZSBhbGxvd2VkIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZSBvZiA8Yj5mPC9iPiB2aWEgCgkJCQlvdGhlciBtZWFucyBhcyBhbiBleHRlbnNpb24sIHdpdGhvdXQgcmVseWluZyBvbiB0aGUgPHR0PnJlc3VsdF90eXBlPC90dD4gbWVtYmVyLjwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPGg0PjxhIG5hbWU9ImJpbmRfOCI+dGVtcGxhdGUmbHQ7Y2xhc3MgUiwgY2xhc3MgQjEsIGNsYXNzIEIyLCBjbGFzcyBBMSwgY2xhc3MgQTImZ3Q7IDxpPnVuc3BlY2lmaWVkLTg8L2k+CgkJCQliaW5kKFIgKCpmKSAoQjEsIEIyKSwgQTEgYTEsIEEyIGEyKTwvYT48L2g0PgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5SZXR1cm5zOjwvYj4gQSBmdW5jdGlvbiBvYmplY3QgPGk+JiM5NTU7PC9pPiBzdWNoIHRoYXQgdGhlIGV4cHJlc3Npb24gPHR0PiYjOTU1Oyh2PHN1Yj4xPC9zdWI+LCAKCQkJCQl2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pPC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+PGI+ZjwvYj4otSg8Yj5hMTwvYj4sIAoJCQkJCXY8c3ViPjE8L3N1Yj4sIHY8c3ViPjI8L3N1Yj4sIC4uLiwgdjxzdWI+bTwvc3ViPiksILUoPGI+YTI8L2I+LCB2PHN1Yj4xPC9zdWI+LCAKCQkJCQl2PHN1Yj4yPC9zdWI+LCAuLi4sIHY8c3ViPm08L3N1Yj4pKTwvdHQ+LjwvcD4KCQkJPHA+PGI+VGhyb3dzOjwvYj4gTm90aGluZyB1bmxlc3MgdGhlIGNvcHkgY29uc3RydWN0b3JzIG9mIDxiPkExPC9iPiBvciA8Yj5BMjwvYj4gdGhyb3cgCgkJCQlhbiBleGNlcHRpb24uPC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8aDQ+PGEgbmFtZT0iYmluZF85Ij50ZW1wbGF0ZSZsdDtjbGFzcyBSLCBjbGFzcyBULCBjbGFzcyBCMSwgY2xhc3MgQTEsIGNsYXNzIEEyJmd0OyA8aT51bnNwZWNpZmllZC05PC9pPgoJCQkJYmluZChSIChUOjoqZikgKEIxKSwgQTEgYTEsIEEyIGEyKTwvYT48L2g0PgoJCTxibG9ja3F1b3RlPgoJCQk8cD48Yj5FZmZlY3RzOjwvYj4gRXF1aXZhbGVudCB0byA8dHQ+YmluZCZsdDtSJmd0Oyg8QSBocmVmPSJtZW1fZm4uaHRtbCI+Ym9vc3Q6Om1lbV9mbjwvQT4oZiksIAoJCQkJCWExLCBhMik7PC90dD48L3A+CgkJPC9ibG9ja3F1b3RlPgoJCTxoND48YSBuYW1lPSJiaW5kXzEwIj50ZW1wbGF0ZSZsdDtjbGFzcyBSLCBjbGFzcyBULCBjbGFzcyBCMSwgY2xhc3MgQTEsIGNsYXNzIEEyJmd0OyA8aT51bnNwZWNpZmllZC0xMDwvaT4KCQkJCWJpbmQoUiAoVDo6KmYpIChCMSkgY29uc3QsIEExIGExLCBBMiBhMik8L2E+PC9oND4KCQk8YmxvY2txdW90ZT4KCQkJPHA+PGI+RWZmZWN0czo8L2I+IEVxdWl2YWxlbnQgdG8gPHR0PmJpbmQmbHQ7UiZndDsoPEEgaHJlZj0ibWVtX2ZuLmh0bWwiPmJvb3N0OjptZW1fZm48L0E+KGYpLCAKCQkJCQlhMSwgYTIpOzwvdHQ+PC9wPgoJCTwvYmxvY2txdW90ZT4KCQk8aDM+PGEgbmFtZT0iQWRkaXRpb25hbE92ZXJsb2FkcyI+QWRkaXRpb25hbCBvdmVybG9hZHM8L2E+PC9oMz4KCQk8cD5JbXBsZW1lbnRhdGlvbnMgYXJlIGFsbG93ZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIDxiPmJpbmQ8L2I+IG92ZXJsb2FkcyBpbiBvcmRlciAKCQkJdG8gc3VwcG9ydCBtb3JlIGFyZ3VtZW50cyBvciBkaWZmZXJlbnQgZnVuY3Rpb24gcG9pbnRlciB2YXJpYXRpb25zLjwvcD4KCQk8aDI+PGEgbmFtZT0iSW1wbGVtZW50YXRpb24iPkltcGxlbWVudGF0aW9uPC9hPjwvaDI+CgkJPGgzPjxhIG5hbWU9IkZpbGVzIj5GaWxlczwvYT48L2gzPgoJCTx1bD4KCQkJPGxpPgoJCQkJPEEgaHJlZj0iLi4vLi4vYm9vc3QvYmluZC5ocHAiPmJvb3N0L2JpbmQuaHBwPC9BPgoJCQkobWFpbiBoZWFkZXIpCgkJCTxsaT4KCQkJCTxBIGhyZWY9Ii4uLy4uL2Jvb3N0L2JpbmQvYmluZF9jYy5ocHAiPmJvb3N0L2JpbmQvYmluZF9jYy5ocHA8L0E+CgkJCSh1c2VkIGJ5IGJpbmQuaHBwLCBkbyBub3QgaW5jbHVkZSBkaXJlY3RseSkKCQkJPGxpPgoJCQkJPEEgaHJlZj0iLi4vLi4vYm9vc3QvYmluZC9iaW5kX21mX2NjLmhwcCI+Ym9vc3QvYmluZC9iaW5kX21mX2NjLmhwcDwvQT4KCQkJKHVzZWQgYnkgYmluZC5ocHAsIGRvIG5vdCBpbmNsdWRlIGRpcmVjdGx5KQoJCQk8bGk+CgkJCQk8QSBocmVmPSIuLi8uLi9ib29zdC9iaW5kL2JpbmRfdGVtcGxhdGUuaHBwIj5ib29zdC9iaW5kL2JpbmRfdGVtcGxhdGUuaHBwPC9BPgoJCQkodXNlZCBieSBiaW5kLmhwcCwgZG8gbm90IGluY2x1ZGUgZGlyZWN0bHkpCgkJCTxMST4KCQkJCTxBIGhyZWY9Ii4uLy4uL2Jvb3N0L2JpbmQvYXJnLmhwcCI+Ym9vc3QvYmluZC9hcmcuaHBwPC9BPgoJCQkoZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcGxhY2Vob2xkZXIgYXJndW1lbnRzKQoJCQk8TEk+CgkJCQk8QSBocmVmPSIuLi8uLi9ib29zdC9iaW5kL3BsYWNlaG9sZGVycy5ocHAiPmJvb3N0L2JpbmQvcGxhY2Vob2xkZXJzLmhwcDwvQT4KCQkJKGRlZmluZXMgdGhlIF8xLCBfMiwgLi4uIF85IHBsYWNlaG9sZGVycykKCQkJPExJPgoJCQkJPEEgaHJlZj0iLi4vLi4vYm9vc3QvYmluZC9hcHBseS5ocHAiPmJvb3N0L2JpbmQvYXBwbHkuaHBwPC9BPiAoPFNUUk9ORz5hcHBseTwvU1RST05HPgoJCQloZWxwZXIgZnVuY3Rpb24gb2JqZWN0KQoJCQk8TEk+CgkJCQk8QSBocmVmPSIuLi8uLi9ib29zdC9iaW5kL3Byb3RlY3QuaHBwIj5ib29zdC9iaW5kL3Byb3RlY3QuaHBwPC9BPiAoPFNUUk9ORz5wcm90ZWN0PC9TVFJPTkc+CgkJCWhlbHBlciBmdW5jdGlvbikKCQkJPExJPgoJCQkJPEEgaHJlZj0iLi4vLi4vYm9vc3QvYmluZC9tYWtlX2FkYXB0YWJsZS5ocHAiPmJvb3N0L2JpbmQvbWFrZV9hZGFwdGFibGUuaHBwPC9BPiAKCQkJCSg8U1RST05HPm1ha2VfYWRhcHRhYmxlPC9TVFJPTkc+CgkJCWhlbHBlciBmdW5jdGlvbikKCQkJPGxpPgoJCQkJPEEgaHJlZj0idGVzdC9iaW5kX3Rlc3QuY3BwIj5saWJzL2JpbmQvdGVzdC9iaW5kX3Rlc3QuY3BwPC9BPgoJCQkodGVzdCkKCQkJPGxpPgoJCQkJPEEgaHJlZj0iYmluZF9hc19jb21wb3NlLmNwcCI+bGlicy9iaW5kL2JpbmRfYXNfY29tcG9zZS5jcHA8L0E+CgkJCShmdW5jdGlvbiBjb21wb3NpdGlvbiBleGFtcGxlKQoJCQk8bGk+CgkJCQk8QSBocmVmPSJiaW5kX3Zpc2l0b3IuY3BwIj5saWJzL2JpbmQvYmluZF92aXNpdG9yLmNwcDwvQT4KCQkJKHZpc2l0b3IgZXhhbXBsZSkKCQkJPGxpPgoJCQkJPEEgaHJlZj0idGVzdC9iaW5kX3N0ZGNhbGxfdGVzdC5jcHAiPmxpYnMvYmluZC90ZXN0L2JpbmRfc3RkY2FsbF90ZXN0LmNwcDwvQT4KCQkJKHRlc3Qgd2l0aCBfX3N0ZGNhbGwgZnVuY3Rpb25zKQoJCQk8bGk+CgkJCQk8QSBocmVmPSJ0ZXN0L2JpbmRfc3RkY2FsbF9tZl90ZXN0LmNwcCI+bGlicy9iaW5kL3Rlc3QvYmluZF9zdGRjYWxsX21mX3Rlc3QuY3BwPC9BPgoJCQkodGVzdCB3aXRoIF9fc3RkY2FsbCBtZW1iZXIgZnVuY3Rpb25zKQoJCQk8bGk+CgkJCQk8QSBocmVmPSJ0ZXN0L2JpbmRfZmFzdGNhbGxfdGVzdC5jcHAiPmxpYnMvYmluZC90ZXN0L2JpbmRfZmFzdGNhbGxfdGVzdC5jcHA8L0E+CgkJCSh0ZXN0IHdpdGggX19mYXN0Y2FsbCBmdW5jdGlvbnMpCgkJCTxsaT4KCQkJCTxBIGhyZWY9InRlc3QvYmluZF9mYXN0Y2FsbF9tZl90ZXN0LmNwcCI+bGlicy9iaW5kL3Rlc3QvYmluZF9mYXN0Y2FsbF9tZl90ZXN0LmNwcDwvQT4KCQkJCSh0ZXN0IHdpdGggX19mYXN0Y2FsbCBtZW1iZXIgZnVuY3Rpb25zKTwvbGk+PC91bD4KCQk8aDM+PGEgbmFtZT0iRGVwZW5kZW5jaWVzIj5EZXBlbmRlbmNpZXM8L2E+PC9oMz4KCQk8dWw+CgkJCTxsaT4KCQkJCTxBIGhyZWY9Ii4uL2NvbmZpZy9jb25maWcuaHRtIj5Cb29zdC5Db25maWc8L0E+CgkJCTxsaT4KCQkJCTxBIGhyZWY9InJlZi5odG1sIj5ib29zdC9yZWYuaHBwPC9BPgoJCQk8bGk+CgkJCQk8QSBocmVmPSJtZW1fZm4uaHRtbCI+Ym9vc3QvbWVtX2ZuLmhwcDwvQT4KCQkJPGxpPgoJCQkJPEEgaHJlZj0iLi4vLi4vYm9vc3QvdHlwZS5ocHAiPmJvb3N0L3R5cGUuaHBwPC9BPjwvbGk+CgkJPC91bD4KCQk8aDM+PGEgbmFtZT0iTnVtYmVyT2ZBcmd1bWVudHMiPk51bWJlciBvZiBBcmd1bWVudHM8L2E+PC9oMz4KCQk8cD5UaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZ1bmN0aW9uIG9iamVjdHMgd2l0aCB1cCB0byBuaW5lIGFyZ3VtZW50cy4gVGhpcyBpcyAKCQkJYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBub3QgYW4gaW5oZXJlbnQgbGltaXRhdGlvbiBvZiB0aGUgZGVzaWduLjwvcD4KCQk8aDM+PGEgbmFtZT0ic3RkY2FsbCI+Il9fc3RkY2FsbCIsICJfX2NkZWNsIiwgIl9fZmFzdGNhbGwiLCBhbmQgInBhc2NhbCIgU3VwcG9ydDwvYT48L2gzPgoJCTxwPlNvbWUgcGxhdGZvcm1zIGFsbG93IHNldmVyYWwgdHlwZXMgb2YgKG1lbWJlcikgZnVuY3Rpb25zIHRoYXQgZGlmZmVyIGJ5IHRoZWlyIDxiPmNhbGxpbmcgCgkJCQljb252ZW50aW9uPC9iPiAodGhlIHJ1bGVzIGJ5IHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkOiBob3cgYXJlIAoJCQlhcmd1bWVudHMgcGFzc2VkLCBob3cgaXMgdGhlIHJldHVybiB2YWx1ZSBoYW5kbGVkLCBhbmQgd2hvIGNsZWFucyB1cCB0aGUgc3RhY2sgCgkJCS0gaWYgYW55Lik8L3A+CgkJPHA+Rm9yIGV4YW1wbGUsIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucyBhbmQgQ09NIGludGVyZmFjZSBtZW1iZXIgZnVuY3Rpb25zIHVzZSBhIAoJCQljYWxsaW5nIGNvbnZlbnRpb24ga25vd24gYXMgPGI+X19zdGRjYWxsPC9iPi5Cb3JsYW5kIFZDTCBjb21wb25lbnRzIHVzZSA8U1RST05HPl9fZmFzdGNhbGw8L1NUUk9ORz4uIAoJCQlNYWMgdG9vbGJveCBmdW5jdGlvbnMgdXNlIGEgPGI+cGFzY2FsPC9iPiBjYWxsaW5nIGNvbnZlbnRpb24uPC9wPgoJCTxwPlRvIHVzZSA8Yj5iaW5kPC9iPiB3aXRoIDxiPl9fc3RkY2FsbDwvYj4gZnVuY3Rpb25zLCA8Yj4jZGVmaW5lPC9iPiB0aGUgbWFjcm8gPGI+Qk9PU1RfQklORF9FTkFCTEVfU1REQ0FMTDwvYj4KCQkJYmVmb3JlIGluY2x1ZGluZyA8Yj4mbHQ7Ym9vc3QvYmluZC5ocHAmZ3Q7PC9iPi48L3A+CgkJPHA+VG8gdXNlIDxiPmJpbmQ8L2I+IHdpdGggPGI+X19zdGRjYWxsPC9iPiA8Yj5tZW1iZXI8L2I+IGZ1bmN0aW9ucywgPGI+I2RlZmluZTwvYj4gCgkJCXRoZSBtYWNybyA8Yj5CT09TVF9NRU1fRk5fRU5BQkxFX1NURENBTEw8L2I+IGJlZm9yZSBpbmNsdWRpbmcgPGI+Jmx0O2Jvb3N0L2JpbmQuaHBwJmd0OzwvYj4uPC9wPgoJCTxQPlRvIHVzZSA8Qj5iaW5kPC9CPiB3aXRoIDxCPl9fZmFzdGNhbGw8L0I+IGZ1bmN0aW9ucywgPEI+I2RlZmluZTwvQj4gdGhlIG1hY3JvIDxCPkJPT1NUX0JJTkRfRU5BQkxFX0ZBU1RDQUxMPC9CPgoJCQliZWZvcmUgaW5jbHVkaW5nIDxCPiZsdDtib29zdC9iaW5kLmhwcCZndDs8L0I+LjwvUD4KCQk8UD5UbyB1c2UgPEI+YmluZDwvQj4gd2l0aCA8Qj5fX2Zhc3RjYWxsPC9CPiA8Qj5tZW1iZXI8L0I+IGZ1bmN0aW9ucywgPEI+I2RlZmluZTwvQj4KCQkJdGhlIG1hY3JvIDxCPkJPT1NUX01FTV9GTl9FTkFCTEVfRkFTVENBTEw8L0I+IGJlZm9yZSBpbmNsdWRpbmcgPEI+Jmx0O2Jvb3N0L2JpbmQuaHBwJmd0OzwvQj4uPC9QPgoJCTxQPlRvIHVzZSA8Yj5iaW5kPC9iPiB3aXRoIDxiPnBhc2NhbDwvYj4gZnVuY3Rpb25zLCA8Yj4jZGVmaW5lPC9iPiB0aGUgbWFjcm8gPGI+Qk9PU1RfQklORF9FTkFCTEVfUEFTQ0FMPC9iPgoJCQliZWZvcmUgaW5jbHVkaW5nIDxiPiZsdDtib29zdC9iaW5kLmhwcCZndDs8L2I+LjwvUD4KCQk8UD5UbyB1c2UgPEI+YmluZDwvQj4gd2l0aCA8Qj5fX2NkZWNsPC9CPiA8Qj5tZW1iZXI8L0I+IGZ1bmN0aW9ucywgPEI+I2RlZmluZTwvQj4gdGhlIAoJCQltYWNybyA8Qj5CT09TVF9NRU1fRk5fRU5BQkxFX0NERUNMPC9CPiBiZWZvcmUgaW5jbHVkaW5nIDxCPiZsdDtib29zdC9iaW5kLmhwcCZndDs8L0I+LjwvUD4KCQk8UD48U1RST05HPkl0IGlzIGJlc3QgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiB0aGUgcHJvamVjdCBvcHRpb25zLCB2aWEgLUQgb24gdGhlIAoJCQkJY29tbWFuZCBsaW5lLCBvciBhcyB0aGUgZmlyc3QgbGluZSBpbiB0aGUgdHJhbnNsYXRpb24gdW5pdCAoLmNwcCBmaWxlKSB3aGVyZSAKCQkJCWJpbmQgaXMgdXNlZC48L1NUUk9ORz4gTm90IGZvbGxvd2luZyB0aGlzIHJ1bGUgY2FuIGxlYWQgdG8gb2JzY3VyZSBlcnJvcnMgCgkJCXdoZW4gYSBoZWFkZXIgaW5jbHVkZXMgYmluZC5ocHAgYmVmb3JlIHRoZSBtYWNybyBoYXMgYmVlbiBkZWZpbmVkLjwvUD4KCQk8cD5bTm90ZTogdGhpcyBpcyBhIG5vbi1wb3J0YWJsZSBleHRlbnNpb24uIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UuXTwvcD4KCQk8cD5bTm90ZTogU29tZSBjb21waWxlcnMgcHJvdmlkZSBvbmx5IG1pbmltYWwgc3VwcG9ydCBmb3IgdGhlIDxiPl9fc3RkY2FsbDwvYj4ga2V5d29yZC5dPC9wPgoJCTxoMz48YSBuYW1lPSJ2aXNpdF9lYWNoIj48Yj52aXNpdF9lYWNoPC9iPiBzdXBwb3J0PC9hPjwvaDM+CgkJPHA+RnVuY3Rpb24gb2JqZWN0cyByZXR1cm5lZCBieSA8Yj5iaW5kPC9iPiBzdXBwb3J0IHRoZSBleHBlcmltZW50YWwgYW5kIAoJCQl1bmRvY3VtZW50ZWQsIGFzIG9mIHlldCwgPGI+dmlzaXRfZWFjaDwvYj4gZW51bWVyYXRpb24gaW50ZXJmYWNlLjwvcD4KCQk8cD5TZWUgPEEgaHJlZj0iYmluZF92aXNpdG9yLmNwcCI+YmluZF92aXNpdG9yLmNwcDwvQT4gZm9yIGFuIGV4YW1wbGUuPC9wPgoJCTxoMj48YSBuYW1lPSJBY2tub3dsZWRnZW1lbnRzIj5BY2tub3dsZWRnZW1lbnRzPC9hPjwvaDI+CgkJPHA+RWFybGllciBlZmZvcnRzIHRoYXQgaGF2ZSBpbmZsdWVuY2VkIHRoZSBsaWJyYXJ5IGRlc2lnbjo8L3A+CgkJPHVsPgoJCQk8bGk+CgkJCQlUaGUgPGEgaHJlZj0iaHR0cDovL3N0YWZmLmNzLnV0dS5maS9CTC8iPkJpbmRlciBMaWJyYXJ5PC9hPgoJCQlieSBKYWFra28gSuRydmk7CgkJCTxsaT4KCQkJCVRoZSA8YSBocmVmPSIuLi9sYW1iZGEvaW5kZXguaHRtbCI+TGFtYmRhIExpYnJhcnk8L2E+CgkJCShub3cgcGFydCBvZiBCb29zdCkgYnkgSmFha2tvIErkcnZpIGFuZCBHYXJ5IFBvd2VsbCAodGhlIHN1Y2Nlc3NvciB0byB0aGUgCgkJCUJpbmRlciBMaWJyYXJ5KTsKCQkJPGxpPgoJCQkJPGEgaHJlZj0iaHR0cDovL21vcmUuc291cmNlZm9yZ2UubmV0LyI+RXh0ZW5zaW9ucyB0byB0aGUgU1RMPC9hPiBieSBQZXR0ZXIgCgkJCQlVcmtlZGFsLjwvbGk+PC91bD4KCQk8cD5Eb3VnIEdyZWdvciBzdWdnZXN0ZWQgdGhhdCBhIHZpc2l0b3IgbWVjaGFuaXNtIHdvdWxkIGFsbG93IDxiPmJpbmQ8L2I+IHRvIAoJCQlpbnRlcm9wZXJhdGUgd2l0aCBhIHNpZ25hbC9zbG90IGxpYnJhcnkuPC9wPgoJCTxwPkpvaG4gTWFkZG9jayBmaXhlZCBhIE1TVkMtc3BlY2lmaWMgY29uZmxpY3QgYmV0d2VlbiA8Yj5iaW5kPC9iPiBhbmQgdGhlIDxBIGhyZWY9Ii4uL3R5cGVfdHJhaXRzL2luZGV4Lmh0bWwiPgoJCQkJdHlwZSB0cmFpdHMgbGlicmFyeTwvQT4uPC9wPgoJCTxwPk51bWVyb3VzIGltcHJvdmVtZW50cyB3ZXJlIHN1Z2dlc3RlZCBkdXJpbmcgdGhlIGZvcm1hbCByZXZpZXcgcGVyaW9kIGJ5IFJvc3MgCgkJCVNtaXRoLCBSaWNoYXJkIENyb3NzbGV5LCBKZW5zIE1hdXJlciwgRWQgQnJleSwgYW5kIG90aGVycy4gUmV2aWV3IG1hbmFnZXIgd2FzIAoJCQlEYXJpbiBBZGxlci4KCQk8L3A+CgkJPHA+VGhlIHByZWNpc2Ugc2VtYW50aWNzIG9mIDxiPmJpbmQ8L2I+IHdlcmUgcmVmaW5lZCBpbiBkaXNjdXNzaW9ucyB3aXRoIEphYWtrbyAKCQkJSuRydmkuCgkJPC9wPgoJCTxwPkRhdmUgQWJyYWhhbXMgZml4ZWQgYSBNU1ZDLXNwZWNpZmljIGNvbmZsaWN0IGJldHdlZW4gPGI+YmluZDwvYj4gYW5kIHRoZSA8QSBocmVmPSIuLi91dGlsaXR5L2l0ZXJhdG9yX2FkYXB0b3JzLmh0bSI+CgkJCQlpdGVyYXRvciBhZGFwdG9ycyBsaWJyYXJ5PC9BPi4KCQk8L3A+CgkJPHA+RGF2ZSBBYnJhaGFtcyBtb2RpZmllZCA8Yj5iaW5kPC9iPiBhbmQgPGI+bWVtX2ZuPC9iPiB0byBzdXBwb3J0IHZvaWQgcmV0dXJucyBvbiAKCQkJZGVmaWNpZW50IGNvbXBpbGVycy4KCQk8L3A+CgkJPHA+TWFjIE11cnJldHQgY29udHJpYnV0ZWQgdGhlICJwYXNjYWwiIHN1cHBvcnQgZW5hYmxlZCBieSAKCQkJQk9PU1RfQklORF9FTkFCTEVfUEFTQ0FMLgoJCTwvcD4KCQk8cD5UaGUgYWx0ZXJuYXRpdmUgPHR0PmJpbmQodHlwZSZsdDtSJmd0OygpLCBmLCAuLi4pPC90dD4gc3ludGF4IHdhcyBpbnNwaXJlZCBieSBhIAoJCQlkaXNjdXNzaW9uIHdpdGggRGF2ZSBBYnJhaGFtcyBhbmQgSm9lbCBkZSBHdXptYW4uPC9wPgoJCTxwPjxicj4KCQkJPGJyPgoJCQk8YnI+CgkJCTxzbWFsbD5Db3B5cmlnaHQgqSAyMDAxLCAyMDAyIGJ5IFBldGVyIERpbW92IGFuZCBNdWx0aSBNZWRpYSBMdGQuIENvcHlyaWdodCAKCQkJCTIwMDMtMjAwOCBQZXRlciBEaW1vdi4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gCgkJCQkxLjAuIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSA8QSBocmVmPSIuLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvQT4gb3IgCgkJCQljb3B5IGF0IDxBIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9BPi48L3NtYWxsPjwvcD4KCTwvYm9keT4KPC9odG1sPgo=