PCEtLQokUG9zdGdyZVNRTDogcGdzcWwvZG9jL3NyYy9zZ21sL3JlZi9jcmVhdGVfdHlwZS5zZ21sLHYgMS42NCAyMDA2LzA5LzE2IDAwOjMwOjE3IG1vbWppYW4gRXhwICQKUG9zdGdyZVNRTCBkb2N1bWVudGF0aW9uCi0tPgoKPHJlZmVudHJ5IGlkPSJTUUwtQ1JFQVRFVFlQRSI+CiA8cmVmbWV0YT4KICA8cmVmZW50cnl0aXRsZSBpZD0ic3FsLWNyZWF0ZXR5cGUtdGl0bGUiPkNSRUFURSBUWVBFPC9yZWZlbnRyeXRpdGxlPgogIDxyZWZtaXNjaW5mbz5TUUwgLSBMYW5ndWFnZSBTdGF0ZW1lbnRzPC9yZWZtaXNjaW5mbz4KIDwvcmVmbWV0YT4KCiA8cmVmbmFtZWRpdj4KICA8cmVmbmFtZT5DUkVBVEUgVFlQRTwvcmVmbmFtZT4KICA8cmVmcHVycG9zZT5kZWZpbmUgYSBuZXcgZGF0YSB0eXBlPC9yZWZwdXJwb3NlPgogPC9yZWZuYW1lZGl2PgoKIDxpbmRleHRlcm0gem9uZT0ic3FsLWNyZWF0ZXR5cGUiPgogIDxwcmltYXJ5PkNSRUFURSBUWVBFPC9wcmltYXJ5PgogPC9pbmRleHRlcm0+CgogPHJlZnN5bm9wc2lzZGl2Pgo8c3lub3BzaXM+CkNSRUFURSBUWVBFIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5uYW1lPC9yZXBsYWNlYWJsZT4gQVMKICAgICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9uYW1lPC9yZXBsYWNlYWJsZT4gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmRhdGFfdHlwZTwvcmVwbGFjZWFibGU+IFssIC4uLiBdICkKCkNSRUFURSBUWVBFIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5uYW1lPC9yZXBsYWNlYWJsZT4gKAogICAgSU5QVVQgPSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+aW5wdXRfZnVuY3Rpb248L3JlcGxhY2VhYmxlPiwKICAgIE9VVFBVVCA9IDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5vdXRwdXRfZnVuY3Rpb248L3JlcGxhY2VhYmxlPgogICAgWyAsIFJFQ0VJVkUgPSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+cmVjZWl2ZV9mdW5jdGlvbjwvcmVwbGFjZWFibGU+IF0KICAgIFsgLCBTRU5EID0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnNlbmRfZnVuY3Rpb248L3JlcGxhY2VhYmxlPiBdCiAgICBbICwgSU5URVJOQUxMRU5HVEggPSB7IDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5pbnRlcm5hbGxlbmd0aDwvcmVwbGFjZWFibGU+IHwgVkFSSUFCTEUgfSBdCiAgICBbICwgUEFTU0VEQllWQUxVRSBdCiAgICBbICwgQUxJR05NRU5UID0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmFsaWdubWVudDwvcmVwbGFjZWFibGU+IF0KICAgIFsgLCBTVE9SQUdFID0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnN0b3JhZ2U8L3JlcGxhY2VhYmxlPiBdCiAgICBbICwgREVGQVVMVCA9IDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kZWZhdWx0PC9yZXBsYWNlYWJsZT4gXQogICAgWyAsIEVMRU1FTlQgPSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZWxlbWVudDwvcmVwbGFjZWFibGU+IF0KICAgIFsgLCBERUxJTUlURVIgPSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZGVsaW1pdGVyPC9yZXBsYWNlYWJsZT4gXQogICAgWywgQ09NUFJFU1NUWVBFID0gY29tcHJlc3Npb25fdHlwZV0KICAgIFssIENPTVBSRVNTTEVWRUwgPSBjb21wcmVzc2lvbl9sZXZlbF0KICAgIFssIEJMT0NLU0laRT0gYmxvY2tzaXplXQopCgpDUkVBVEUgVFlQRSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+bmFtZTwvcmVwbGFjZWFibGU+Cjwvc3lub3BzaXM+CiA8L3JlZnN5bm9wc2lzZGl2PgoKIDxyZWZzZWN0MT4KICA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgoKICA8cGFyYT4KICAgPGNvbW1hbmQ+Q1JFQVRFIFRZUEU8L2NvbW1hbmQ+IHJlZ2lzdGVycyBhIG5ldyBkYXRhIHR5cGUgZm9yIHVzZSBpbgogICB0aGUgY3VycmVudCBkYXRhYmFzZS4gIFRoZSB1c2VyIHdobyBkZWZpbmVzIGEgdHlwZSBiZWNvbWVzIGl0cwogICBvd25lci4KICA8L3BhcmE+CgogIDxwYXJhPgogICBJZiBhIHNjaGVtYSBuYW1lIGlzIGdpdmVuIHRoZW4gdGhlIHR5cGUgaXMgY3JlYXRlZCBpbiB0aGUgc3BlY2lmaWVkCiAgIHNjaGVtYS4gIE90aGVyd2lzZSBpdCBpcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IHNjaGVtYS4gIFRoZSB0eXBlCiAgIG5hbWUgbXVzdCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBuYW1lIG9mIGFueSBleGlzdGluZyB0eXBlIG9yIGRvbWFpbgogICBpbiB0aGUgc2FtZSBzY2hlbWEuICAoQmVjYXVzZSB0YWJsZXMgaGF2ZSBhc3NvY2lhdGVkIGRhdGEgdHlwZXMsCiAgIHRoZSB0eXBlIG5hbWUgbXVzdCBhbHNvIGJlIGRpc3RpbmN0IGZyb20gdGhlIG5hbWUgb2YgYW55IGV4aXN0aW5nCiAgIHRhYmxlIGluIHRoZSBzYW1lIHNjaGVtYS4pCiAgPC9wYXJhPgoKICA8cmVmc2VjdDI+CiAgIDx0aXRsZT5Db21wb3NpdGUgVHlwZXM8L3RpdGxlPgoKICA8cGFyYT4KICAgVGhlIGZpcnN0IGZvcm0gb2YgPGNvbW1hbmQ+Q1JFQVRFIFRZUEU8L2NvbW1hbmQ+CiAgIGNyZWF0ZXMgYSBjb21wb3NpdGUgdHlwZS4KICAgVGhlIGNvbXBvc2l0ZSB0eXBlIGlzIHNwZWNpZmllZCBieSBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCBkYXRhIHR5cGVzLgogICBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSByb3cgdHlwZQogICBvZiBhIHRhYmxlLCBidXQgdXNpbmcgPGNvbW1hbmQ+Q1JFQVRFIFRZUEU8L2NvbW1hbmQ+IGF2b2lkcyB0aGUgbmVlZCB0bwogICBjcmVhdGUgYW4gYWN0dWFsIHRhYmxlIHdoZW4gYWxsIHRoYXQgaXMgd2FudGVkIGlzIHRvIGRlZmluZSBhIHR5cGUuCiAgIEEgc3RhbmQtYWxvbmUgY29tcG9zaXRlIHR5cGUgaXMgdXNlZnVsIGFzIHRoZSBhcmd1bWVudCBvciByZXR1cm4gdHlwZSBvZiBhCiAgIGZ1bmN0aW9uLgogIDwvcGFyYT4KICA8L3JlZnNlY3QyPgoKICA8cmVmc2VjdDI+CiAgIDx0aXRsZT5CYXNlIFR5cGVzPC90aXRsZT4KCiAgPHBhcmE+CiAgIFRoZSBzZWNvbmQgZm9ybSBvZiA8Y29tbWFuZD5DUkVBVEUgVFlQRTwvY29tbWFuZD4gY3JlYXRlcyBhIG5ldyBiYXNlIHR5cGUKICAgKHNjYWxhciB0eXBlKS4gIFRoZSBwYXJhbWV0ZXJzIG1heSBhcHBlYXIgaW4gYW55IG9yZGVyLCBub3Qgb25seSB0aGF0CiAgIGlsbHVzdHJhdGVkIGFib3ZlLCBhbmQgbW9zdCBhcmUgb3B0aW9uYWwuICBZb3UgbXVzdCByZWdpc3RlcgogICB0d28gb3IgbW9yZSBmdW5jdGlvbnMgKHVzaW5nIDxjb21tYW5kPkNSRUFURSBGVU5DVElPTjwvY29tbWFuZD4pIGJlZm9yZQogICBkZWZpbmluZyB0aGUgdHlwZS4gIFRoZSBzdXBwb3J0IGZ1bmN0aW9ucyAKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmlucHV0X2Z1bmN0aW9uPC9yZXBsYWNlYWJsZT4gYW5kCiAgIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5vdXRwdXRfZnVuY3Rpb248L3JlcGxhY2VhYmxlPgogICBhcmUgcmVxdWlyZWQsIHdoaWxlIHRoZSBmdW5jdGlvbnMKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnJlY2VpdmVfZnVuY3Rpb248L3JlcGxhY2VhYmxlPiwKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnNlbmRfZnVuY3Rpb248L3JlcGxhY2VhYmxlPiBhbmQKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmFuYWx5emVfZnVuY3Rpb248L3JlcGxhY2VhYmxlPgogICBhcmUgb3B0aW9uYWwuICBHZW5lcmFsbHkgdGhlc2UgZnVuY3Rpb25zIGhhdmUgdG8gYmUgY29kZWQgaW4gQwogICBvciBhbm90aGVyIGxvdy1sZXZlbCBsYW5ndWFnZS4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGUgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmlucHV0X2Z1bmN0aW9uPC9yZXBsYWNlYWJsZT4KICAgY29udmVydHMgdGhlIHR5cGUncyBleHRlcm5hbCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBpbnRlcm5hbAogICByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGZvciB0aGUgdHlwZS4KICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm91dHB1dF9mdW5jdGlvbjwvcmVwbGFjZWFibGU+CiAgIHBlcmZvcm1zIHRoZSByZXZlcnNlIHRyYW5zZm9ybWF0aW9uLiAgVGhlIGlucHV0IGZ1bmN0aW9uIG1heSBiZQogICBkZWNsYXJlZCBhcyB0YWtpbmcgb25lIGFyZ3VtZW50IG9mIHR5cGUgPHR5cGU+Y3N0cmluZzwvdHlwZT4sCiAgIG9yIGFzIHRha2luZyB0aHJlZSBhcmd1bWVudHMgb2YgdHlwZXMKICAgPHR5cGU+Y3N0cmluZzwvdHlwZT4sIDx0eXBlPm9pZDwvdHlwZT4sIDx0eXBlPmludGVnZXI8L3R5cGU+LgogICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGlucHV0IHRleHQgYXMgYSBDIHN0cmluZywgdGhlIHNlY29uZAogICBhcmd1bWVudCBpcyB0aGUgdHlwZSdzIG93biBPSUQgKGV4Y2VwdCBmb3IgYXJyYXkgdHlwZXMsIHdoaWNoIGluc3RlYWQKICAgcmVjZWl2ZSB0aGVpciBlbGVtZW50IHR5cGUncyBPSUQpLAogICBhbmQgdGhlIHRoaXJkIGlzIHRoZSA8bGl0ZXJhbD50eXBtb2Q8Lz4gb2YgdGhlIGRlc3RpbmF0aW9uIGNvbHVtbiwgaWYga25vd24KICAgKC0xIHdpbGwgYmUgcGFzc2VkIGlmIG5vdCkuCiAgIFRoZSBpbnB1dCBmdW5jdGlvbiBtdXN0IHJldHVybiBhIHZhbHVlIG9mIHRoZSBkYXRhIHR5cGUgaXRzZWxmLgogICBVc3VhbGx5LCBhbiBpbnB1dCBmdW5jdGlvbiBzaG91bGQgYmUgZGVjbGFyZWQgU1RSSUNUOyBpZiBpdCBpcyBub3QsCiAgIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYSBOVUxMIGZpcnN0IHBhcmFtZXRlciB3aGVuIHJlYWRpbmcgYSBOVUxMCiAgIGlucHV0IHZhbHVlLiAgVGhlIGZ1bmN0aW9uIG11c3Qgc3RpbGwgcmV0dXJuIE5VTEwgaW4gdGhpcyBjYXNlLCB1bmxlc3MKICAgaXQgcmFpc2VzIGFuIGVycm9yLgogICAoVGhpcyBjYXNlIGlzIG1haW5seSBtZWFudCB0byBzdXBwb3J0IGRvbWFpbiBpbnB1dCBmdW5jdGlvbnMsIHdoaWNoCiAgIG1heSBuZWVkIHRvIHJlamVjdCBOVUxMIGlucHV0cy4pCiAgIFRoZSBvdXRwdXQgZnVuY3Rpb24gbXVzdCBiZQogICBkZWNsYXJlZCBhcyB0YWtpbmcgb25lIGFyZ3VtZW50IG9mIHRoZSBuZXcgZGF0YSB0eXBlLgogICBUaGUgb3V0cHV0IGZ1bmN0aW9uIG11c3QgcmV0dXJuIHR5cGUgPHR5cGU+Y3N0cmluZzwvdHlwZT4uCiAgIE91dHB1dCBmdW5jdGlvbnMgYXJlIG5vdCBpbnZva2VkIGZvciBOVUxMIHZhbHVlcy4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGUgb3B0aW9uYWwgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnJlY2VpdmVfZnVuY3Rpb248L3JlcGxhY2VhYmxlPgogICBjb252ZXJ0cyB0aGUgdHlwZSdzIGV4dGVybmFsIGJpbmFyeSByZXByZXNlbnRhdGlvbiB0byB0aGUgaW50ZXJuYWwKICAgcmVwcmVzZW50YXRpb24uICBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwbGllZCwgdGhlIHR5cGUgY2Fubm90CiAgIHBhcnRpY2lwYXRlIGluIGJpbmFyeSBpbnB1dC4gIFRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlCiAgIGNob3NlbiB0byBiZSBjaGVhcCB0byBjb252ZXJ0IHRvIGludGVybmFsIGZvcm0sIHdoaWxlIGJlaW5nIHJlYXNvbmFibHkKICAgcG9ydGFibGUuICAoRm9yIGV4YW1wbGUsIHRoZSBzdGFuZGFyZCBpbnRlZ2VyIGRhdGEgdHlwZXMgdXNlIG5ldHdvcmsKICAgYnl0ZSBvcmRlciBhcyB0aGUgZXh0ZXJuYWwgYmluYXJ5IHJlcHJlc2VudGF0aW9uLCB3aGlsZSB0aGUgaW50ZXJuYWwKICAgcmVwcmVzZW50YXRpb24gaXMgaW4gdGhlIG1hY2hpbmUncyBuYXRpdmUgYnl0ZSBvcmRlci4pICBUaGUgcmVjZWl2ZQogICBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSBhZGVxdWF0ZSBjaGVja2luZyB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgaXMKICAgdmFsaWQuCiAgIFRoZSByZWNlaXZlIGZ1bmN0aW9uIG1heSBiZSBkZWNsYXJlZCBhcyB0YWtpbmcgb25lIGFyZ3VtZW50IG9mIHR5cGUKICAgPHR5cGU+aW50ZXJuYWw8L3R5cGU+LCBvciBhcyB0YWtpbmcgdGhyZWUgYXJndW1lbnRzIG9mIHR5cGVzCiAgIDx0eXBlPmludGVybmFsPC90eXBlPiwgPHR5cGU+b2lkPC90eXBlPiwgPHR5cGU+aW50ZWdlcjwvdHlwZT4uCiAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSA8dHlwZT5TdHJpbmdJbmZvPC90eXBlPiBidWZmZXIKICAgaG9sZGluZyB0aGUgcmVjZWl2ZWQgYnl0ZSBzdHJpbmc7IHRoZSBvcHRpb25hbCBhcmd1bWVudHMgYXJlIHRoZQogICBzYW1lIGFzIGZvciB0aGUgdGV4dCBpbnB1dCBmdW5jdGlvbi4KICAgVGhlIHJlY2VpdmUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgZGF0YSB0eXBlIGl0c2VsZi4KICAgVXN1YWxseSwgYSByZWNlaXZlIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWNsYXJlZCBTVFJJQ1Q7IGlmIGl0IGlzIG5vdCwKICAgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgZmlyc3QgcGFyYW1ldGVyIHdoZW4gcmVhZGluZyBhIE5VTEwKICAgaW5wdXQgdmFsdWUuICBUaGUgZnVuY3Rpb24gbXVzdCBzdGlsbCByZXR1cm4gTlVMTCBpbiB0aGlzIGNhc2UsIHVubGVzcwogICBpdCByYWlzZXMgYW4gZXJyb3IuCiAgIChUaGlzIGNhc2UgaXMgbWFpbmx5IG1lYW50IHRvIHN1cHBvcnQgZG9tYWluIHJlY2VpdmUgZnVuY3Rpb25zLCB3aGljaAogICBtYXkgbmVlZCB0byByZWplY3QgTlVMTCBpbnB1dHMuKQogICBTaW1pbGFybHksIHRoZSBvcHRpb25hbAogICA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+c2VuZF9mdW5jdGlvbjwvcmVwbGFjZWFibGU+IGNvbnZlcnRzCiAgIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBleHRlcm5hbCBiaW5hcnkgcmVwcmVzZW50YXRpb24uCiAgIElmIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBsaWVkLCB0aGUgdHlwZSBjYW5ub3QgcGFydGljaXBhdGUgaW4gYmluYXJ5CiAgIG91dHB1dC4gIFRoZSBzZW5kIGZ1bmN0aW9uIG11c3QgYmUKICAgZGVjbGFyZWQgYXMgdGFraW5nIG9uZSBhcmd1bWVudCBvZiB0aGUgbmV3IGRhdGEgdHlwZS4KICAgVGhlIHNlbmQgZnVuY3Rpb24gbXVzdCByZXR1cm4gdHlwZSA8dHlwZT5ieXRlYTwvdHlwZT4uCiAgIFNlbmQgZnVuY3Rpb25zIGFyZSBub3QgaW52b2tlZCBmb3IgTlVMTCB2YWx1ZXMuCiAgPC9wYXJhPgoKICA8cGFyYT4KICAgWW91IHNob3VsZCBhdCB0aGlzIHBvaW50IGJlIHdvbmRlcmluZyBob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zCiAgIGNhbiBiZSBkZWNsYXJlZCB0byBoYXZlIHJlc3VsdHMgb3IgYXJndW1lbnRzIG9mIHRoZSBuZXcgdHlwZSwgd2hlbiB0aGV5CiAgIGhhdmUgdG8gYmUgY3JlYXRlZCBiZWZvcmUgdGhlIG5ldyB0eXBlIGNhbiBiZSBjcmVhdGVkLiAgVGhlIGFuc3dlciBpcyB0aGF0CiAgIHRoZSB0eXBlIHNob3VsZCBmaXJzdCBiZSBkZWZpbmVkIGFzIGEgPGZpcnN0dGVybT5zaGVsbCB0eXBlPC8+LCB3aGljaCBpcyBhCiAgIHBsYWNlaG9sZGVyIHR5cGUgdGhhdCBoYXMgbm8gcHJvcGVydGllcyBleGNlcHQgYSBuYW1lIGFuZCBhbiBvd25lci4gIFRoaXMKICAgaXMgZG9uZSBieSBpc3N1aW5nIHRoZSBjb21tYW5kIDxsaXRlcmFsPkNSRUFURSBUWVBFCiAgIDxyZXBsYWNlYWJsZT5uYW1lPC8+PC9saXRlcmFsPiwgd2l0aCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICBUaGVuIHRoZQogICBJL08gZnVuY3Rpb25zIGNhbiBiZSBkZWZpbmVkIHJlZmVyZW5jaW5nIHRoZSBzaGVsbCB0eXBlLiAgRmluYWxseSwKICAgPGNvbW1hbmQ+Q1JFQVRFIFRZUEU8Lz4gd2l0aCBhIGZ1bGwgZGVmaW5pdGlvbiByZXBsYWNlcyB0aGUgc2hlbGwgZW50cnkKICAgd2l0aCBhIGNvbXBsZXRlLCB2YWxpZCB0eXBlIGRlZmluaXRpb24sIGFmdGVyIHdoaWNoIHRoZSBuZXcgdHlwZSBjYW4gYmUKICAgdXNlZCBub3JtYWxseS4KICA8L3BhcmE+CgogIDxwYXJhPgogICBXaGlsZSB0aGUgZGV0YWlscyBvZiB0aGUgbmV3IHR5cGUncyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhcmUgb25seQogICBrbm93biB0byB0aGUgSS9PIGZ1bmN0aW9ucyBhbmQgb3RoZXIgZnVuY3Rpb25zIHlvdSBjcmVhdGUgdG8gd29yayB3aXRoCiAgIHRoZSB0eXBlLCB0aGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIG9mIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgogICB0aGF0IG11c3QgYmUgZGVjbGFyZWQgdG8gPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1lPi4KICAgRm9yZW1vc3Qgb2YgdGhlc2UgaXMKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmludGVybmFsbGVuZ3RoPC9yZXBsYWNlYWJsZT4uCiAgIEJhc2UgZGF0YSB0eXBlcyBjYW4gYmUgZml4ZWQtbGVuZ3RoLCBpbiB3aGljaCBjYXNlCiAgIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5pbnRlcm5hbGxlbmd0aDwvcmVwbGFjZWFibGU+IGlzIGEKICAgcG9zaXRpdmUgaW50ZWdlciwgb3IgdmFyaWFibGUgIGxlbmd0aCwgaW5kaWNhdGVkIGJ5IHNldHRpbmcKICAgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmludGVybmFsbGVuZ3RoPC9yZXBsYWNlYWJsZT4KICAgdG8gPGxpdGVyYWw+VkFSSUFCTEU8L2xpdGVyYWw+LiAgKEludGVybmFsbHksIHRoaXMgaXMgcmVwcmVzZW50ZWQKICAgYnkgc2V0dGluZyA8bGl0ZXJhbD50eXBsZW48Lz4gdG8gLTEuKSAgVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGFsbAogICB2YXJpYWJsZS1sZW5ndGggdHlwZXMgbXVzdCBzdGFydCB3aXRoIGEgNC1ieXRlIGludGVnZXIgZ2l2aW5nIHRoZSB0b3RhbAogICBsZW5ndGggb2YgdGhpcyB2YWx1ZSBvZiB0aGUgdHlwZS4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGUgb3B0aW9uYWwgZmxhZyA8bGl0ZXJhbD5QQVNTRURCWVZBTFVFPC9saXRlcmFsPiBpbmRpY2F0ZXMgdGhhdAogICB2YWx1ZXMgb2YgdGhpcyBkYXRhIHR5cGUgYXJlIHBhc3NlZCBieSB2YWx1ZSwgcmF0aGVyIHRoYW4gYnkKICAgcmVmZXJlbmNlLiAgWW91IG1heSBub3QgcGFzcyBieSB2YWx1ZSB0eXBlcyB3aG9zZSBpbnRlcm5hbAogICByZXByZXNlbnRhdGlvbiBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgPHR5cGU+RGF0dW08Lz4gdHlwZQogICAoNCBieXRlcyBvbiBtb3N0IG1hY2hpbmVzLCA4IGJ5dGVzIG9uIGEgZmV3KS4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGUgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmFsaWdubWVudDwvcmVwbGFjZWFibGU+IHBhcmFtZXRlcgogICBzcGVjaWZpZXMgdGhlIHN0b3JhZ2UgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGUgZGF0YSB0eXBlLiAgVGhlCiAgIGFsbG93ZWQgdmFsdWVzIGVxdWF0ZSB0byBhbGlnbm1lbnQgb24gMSwgMiwgNCwgb3IgOCBieXRlIGJvdW5kYXJpZXMuCiAgIE5vdGUgdGhhdCB2YXJpYWJsZS1sZW5ndGggdHlwZXMgbXVzdCBoYXZlIGFuIGFsaWdubWVudCBvZiBhdCBsZWFzdAogICA0LCBzaW5jZSB0aGV5IG5lY2Vzc2FyaWx5IGNvbnRhaW4gYW4gPHR5cGU+aW50NDwvPiBhcyB0aGVpciBmaXJzdCBjb21wb25lbnQuCiAgPC9wYXJhPgoKICA8cGFyYT4KICAgVGhlIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5zdG9yYWdlPC9yZXBsYWNlYWJsZT4gcGFyYW1ldGVyCiAgIGFsbG93cyBzZWxlY3Rpb24gb2Ygc3RvcmFnZSBzdHJhdGVnaWVzIGZvciB2YXJpYWJsZS1sZW5ndGggZGF0YQogICB0eXBlcy4gIChPbmx5IDxsaXRlcmFsPnBsYWluPC9saXRlcmFsPiBpcyBhbGxvd2VkIGZvciBmaXhlZC1sZW5ndGgKICAgdHlwZXMuKSAgPGxpdGVyYWw+cGxhaW48L2xpdGVyYWw+IHNwZWNpZmllcyB0aGF0IGRhdGEgb2YgdGhlIHR5cGUKICAgd2lsbCBhbHdheXMgYmUgc3RvcmVkIGluLWxpbmUgYW5kIG5vdCBjb21wcmVzc2VkLgogICA8bGl0ZXJhbD5leHRlbmRlZDwvbGl0ZXJhbD4gc3BlY2lmaWVzIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGZpcnN0CiAgIHRyeSB0byBjb21wcmVzcyBhIGxvbmcgZGF0YSB2YWx1ZSwgYW5kIHdpbGwgbW92ZSB0aGUgdmFsdWUgb3V0IG9mCiAgIHRoZSBtYWluIHRhYmxlIHJvdyBpZiBpdCdzIHN0aWxsIHRvbyBsb25nLgogICA8bGl0ZXJhbD5leHRlcm5hbDwvbGl0ZXJhbD4gYWxsb3dzIHRoZSB2YWx1ZSB0byBiZSBtb3ZlZCBvdXQgb2YgdGhlCiAgIG1haW4gdGFibGUsIGJ1dCB0aGUgc3lzdGVtIHdpbGwgbm90IHRyeSB0byBjb21wcmVzcyBpdC4KICAgPGxpdGVyYWw+bWFpbjwvbGl0ZXJhbD4gYWxsb3dzIGNvbXByZXNzaW9uLCBidXQgZGlzY291cmFnZXMgbW92aW5nCiAgIHRoZSB2YWx1ZSBvdXQgb2YgdGhlIG1haW4gdGFibGUuICAoRGF0YSBpdGVtcyB3aXRoIHRoaXMgc3RvcmFnZQogICBzdHJhdGVneSBtYXkgc3RpbGwgYmUgbW92ZWQgb3V0IG9mIHRoZSBtYWluIHRhYmxlIGlmIHRoZXJlIGlzIG5vCiAgIG90aGVyIHdheSB0byBtYWtlIGEgcm93IGZpdCwgYnV0IHRoZXkgd2lsbCBiZSBrZXB0IGluIHRoZSBtYWluCiAgIHRhYmxlIHByZWZlcmVudGlhbGx5IG92ZXIgPGxpdGVyYWw+ZXh0ZW5kZWQ8L2xpdGVyYWw+IGFuZAogICA8bGl0ZXJhbD5leHRlcm5hbDwvbGl0ZXJhbD4gaXRlbXMuKQogIDwvcGFyYT4KCiAgPHBhcmE+CiAgIEEgZGVmYXVsdCB2YWx1ZSBtYXkgYmUgc3BlY2lmaWVkLCBpbiBjYXNlIGEgdXNlciB3YW50cyBjb2x1bW5zIG9mIHRoZQogICBkYXRhIHR5cGUgdG8gZGVmYXVsdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgbnVsbCB2YWx1ZS4KICAgU3BlY2lmeSB0aGUgZGVmYXVsdCB3aXRoIHRoZSA8bGl0ZXJhbD5ERUZBVUxUPC9saXRlcmFsPiBrZXkgd29yZC4KICAgKFN1Y2ggYSBkZWZhdWx0IG1heSBiZSBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0IDxsaXRlcmFsPkRFRkFVTFQ8L2xpdGVyYWw+CiAgIGNsYXVzZSBhdHRhY2hlZCB0byBhIHBhcnRpY3VsYXIgY29sdW1uLikKICA8L3BhcmE+CgogIDxwYXJhPgogICBUbyBpbmRpY2F0ZSB0aGF0IGEgdHlwZSBpcyBhbiBhcnJheSwgc3BlY2lmeSB0aGUgdHlwZSBvZiB0aGUgYXJyYXkKICAgZWxlbWVudHMgdXNpbmcgdGhlIDxsaXRlcmFsPkVMRU1FTlQ8Lz4ga2V5IHdvcmQuICBGb3IgZXhhbXBsZSwgdG8KICAgZGVmaW5lIGFuIGFycmF5IG9mIDQtYnl0ZSBpbnRlZ2VycyAoPHR5cGU+aW50NDwvdHlwZT4pLCBzcGVjaWZ5CiAgIDxsaXRlcmFsPkVMRU1FTlQgPSBpbnQ0PC9saXRlcmFsPi4gTW9yZSBkZXRhaWxzIGFib3V0IGFycmF5IHR5cGVzCiAgIGFwcGVhciBiZWxvdy4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUbyBpbmRpY2F0ZSB0aGUgZGVsaW1pdGVyIHRvIGJlIHVzZWQgYmV0d2VlbiB2YWx1ZXMgaW4gdGhlIGV4dGVybmFsCiAgIHJlcHJlc2VudGF0aW9uIG9mIGFycmF5cyBvZiB0aGlzIHR5cGUsIDxyZXBsYWNlYWJsZQogICBjbGFzcz0icGFyYW1ldGVyIj5kZWxpbWl0ZXI8L3JlcGxhY2VhYmxlPiBjYW4gYmUKICAgc2V0IHRvIGEgc3BlY2lmaWMgY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgZGVsaW1pdGVyIGlzIHRoZSBjb21tYQogICAoPGxpdGVyYWw+LDwvbGl0ZXJhbD4pLiAgTm90ZSB0aGF0IHRoZSBkZWxpbWl0ZXIgaXMgYXNzb2NpYXRlZAogICB3aXRoIHRoZSBhcnJheSBlbGVtZW50IHR5cGUsIG5vdCB0aGUgYXJyYXkgdHlwZSBpdHNlbGYuCiAgPC9wYXJhPgoKICA8L3JlZnNlY3QyPgoKICA8cmVmc2VjdDI+CiAgIDx0aXRsZT5BcnJheSBUeXBlczwvdGl0bGU+CgogICA8cGFyYT4KICAgIFdoZW5ldmVyIGEgdXNlci1kZWZpbmVkIGJhc2UgZGF0YSB0eXBlIGlzIGNyZWF0ZWQsIAogICAgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1lPiBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW4KICAgIGFzc29jaWF0ZWQgYXJyYXkgdHlwZSwgd2hvc2UgbmFtZSBjb25zaXN0cyBvZiB0aGUgYmFzZSB0eXBlJ3MKICAgIG5hbWUgcHJlcGVuZGVkIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoZSBwYXJzZXIgdW5kZXJzdGFuZHMgdGhpcwogICAgbmFtaW5nIGNvbnZlbnRpb24sIGFuZCB0cmFuc2xhdGVzIHJlcXVlc3RzIGZvciBjb2x1bW5zIG9mIHR5cGUKICAgIDxsaXRlcmFsPmZvb1tdPC8+IGludG8gcmVxdWVzdHMgZm9yIHR5cGUgPGxpdGVyYWw+X2ZvbzwvPi4KICAgIFRoZSBpbXBsaWNpdGx5LWNyZWF0ZWQgYXJyYXkgdHlwZSBpcyB2YXJpYWJsZSBsZW5ndGggYW5kIHVzZXMgdGhlCiAgICBidWlsdC1pbiBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucyA8bGl0ZXJhbD5hcnJheV9pbjwvPiBhbmQKICAgIDxsaXRlcmFsPmFycmF5X291dDwvPi4KICAgPC9wYXJhPgoKICAgPHBhcmE+CiAgICBZb3UgbWlnaHQgcmVhc29uYWJseSBhc2sgd2h5IHRoZXJlIGlzIGFuIDxvcHRpb24+RUxFTUVOVDwvPgogICAgb3B0aW9uLCBpZiB0aGUgc3lzdGVtIG1ha2VzIHRoZSBjb3JyZWN0IGFycmF5IHR5cGUgYXV0b21hdGljYWxseS4KICAgIFRoZSBvbmx5IGNhc2Ugd2hlcmUgaXQncyB1c2VmdWwgdG8gdXNlIDxvcHRpb24+RUxFTUVOVDwvPiBpcyB3aGVuIHlvdSBhcmUKICAgIG1ha2luZyBhIGZpeGVkLWxlbmd0aCB0eXBlIHRoYXQgaGFwcGVucyB0byBiZSBpbnRlcm5hbGx5IGFuIGFycmF5IG9mIGEgbnVtYmVyIG9mCiAgICBpZGVudGljYWwgdGhpbmdzLCBhbmQgeW91IHdhbnQgdG8gYWxsb3cgdGhlc2UgdGhpbmdzIHRvIGJlIGFjY2Vzc2VkCiAgICBkaXJlY3RseSBieSBzdWJzY3JpcHRpbmcsIGluIGFkZGl0aW9uIHRvIHdoYXRldmVyIG9wZXJhdGlvbnMgeW91IHBsYW4KICAgIHRvIHByb3ZpZGUgZm9yIHRoZSB0eXBlIGFzIGEgd2hvbGUuICBGb3IgZXhhbXBsZSwgdHlwZSA8dHlwZT5uYW1lPC8+CiAgICBhbGxvd3MgaXRzIGNvbnN0aXR1ZW50IDx0eXBlPmNoYXI8Lz4gZWxlbWVudHMgdG8gYmUgYWNjZXNzZWQgdGhpcyB3YXkuCiAgICBBIDItRCA8dHlwZT5wb2ludDwvPiB0eXBlIGNvdWxkIGFsbG93IGl0cyB0d28gY29tcG9uZW50IG51bWJlcnMgdG8gYmUKICAgIGFjY2Vzc2VkIGxpa2UgPGxpdGVyYWw+cG9pbnRbMF08Lz4gYW5kIDxsaXRlcmFsPnBvaW50WzFdPC8+LgogICAgTm90ZSB0aGF0CiAgICB0aGlzIGZhY2lsaXR5IG9ubHkgd29ya3MgZm9yIGZpeGVkLWxlbmd0aCB0eXBlcyB3aG9zZSBpbnRlcm5hbCBmb3JtCiAgICBpcyBleGFjdGx5IGEgc2VxdWVuY2Ugb2YgaWRlbnRpY2FsIGZpeGVkLWxlbmd0aCBmaWVsZHMuICBBIHN1YnNjcmlwdGFibGUKICAgIHZhcmlhYmxlLWxlbmd0aCB0eXBlIG11c3QgaGF2ZSB0aGUgZ2VuZXJhbGl6ZWQgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KICAgIHVzZWQgYnkgPGxpdGVyYWw+YXJyYXlfaW48Lz4gYW5kIDxsaXRlcmFsPmFycmF5X291dDwvPi4KICAgIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgKGkuZS4sIHRoaXMgaXMgY2xlYXJseSB3cm9uZyBidXQgaXQncyBmYXIgdG9vCiAgICBsYXRlIHRvIGNoYW5nZSBpdCksIHN1YnNjcmlwdGluZyBvZiBmaXhlZC1sZW5ndGggYXJyYXkgdHlwZXMgc3RhcnRzIGZyb20KICAgIHplcm8sIHJhdGhlciB0aGFuIGZyb20gb25lIGFzIGZvciB2YXJpYWJsZS1sZW5ndGggYXJyYXlzLgogICA8L3BhcmE+CiAgPC9yZWZzZWN0Mj4KIDwvcmVmc2VjdDE+CiAgCiA8cmVmc2VjdDE+CiAgPHRpdGxlPlBhcmFtZXRlcnM8L3RpdGxlPgoKICA8dmFyaWFibGVsaXN0PgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm5hbWU8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVGhlIG5hbWUgKG9wdGlvbmFsbHkgc2NoZW1hLXF1YWxpZmllZCkgb2YgYSB0eXBlIHRvIGJlIGNyZWF0ZWQuCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmF0dHJpYnV0ZV9uYW1lPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoY29sdW1uKSBmb3IgdGhlIGNvbXBvc2l0ZSB0eXBlLgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgoKICAgPHZhcmxpc3RlbnRyeT4KICAgIDx0ZXJtPjxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kYXRhX3R5cGU8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZGF0YSB0eXBlIHRvIGJlY29tZSBhIGNvbHVtbiBvZiB0aGUKICAgICAgY29tcG9zaXRlIHR5cGUuCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmlucHV0X2Z1bmN0aW9uPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIFRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRhIGZyb20gdGhlIHR5cGUncwogICAgICBleHRlcm5hbCB0ZXh0dWFsIGZvcm0gdG8gaXRzIGludGVybmFsIGZvcm0uCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm91dHB1dF9mdW5jdGlvbjwvcmVwbGFjZWFibGU+PC90ZXJtPgogICAgPGxpc3RpdGVtPgogICAgIDxwYXJhPgogICAgICBUaGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZGF0YSBmcm9tIHRoZSB0eXBlJ3MKICAgICAgaW50ZXJuYWwgZm9ybSB0byBpdHMgZXh0ZXJuYWwgdGV4dHVhbCBmb3JtLgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgoKICAgPHZhcmxpc3RlbnRyeT4KICAgIDx0ZXJtPjxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5yZWNlaXZlX2Z1bmN0aW9uPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIFRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRhIGZyb20gdGhlIHR5cGUncwogICAgICBleHRlcm5hbCBiaW5hcnkgZm9ybSB0byBpdHMgaW50ZXJuYWwgZm9ybS4KICAgICA8L3BhcmE+CiAgICA8L2xpc3RpdGVtPgogICA8L3Zhcmxpc3RlbnRyeT4KCiAgIDx2YXJsaXN0ZW50cnk+CiAgICA8dGVybT48cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+c2VuZF9mdW5jdGlvbjwvcmVwbGFjZWFibGU+PC90ZXJtPgogICAgPGxpc3RpdGVtPgogICAgIDxwYXJhPgogICAgICBUaGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZGF0YSBmcm9tIHRoZSB0eXBlJ3MKICAgICAgaW50ZXJuYWwgZm9ybSB0byBpdHMgZXh0ZXJuYWwgYmluYXJ5IGZvcm0uCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmludGVybmFsbGVuZ3RoPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIEEgbnVtZXJpYyBjb25zdGFudCB0aGF0IHNwZWNpZmllcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBuZXcKICAgICAgdHlwZSdzIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiAgVGhlIGRlZmF1bHQgYXNzdW1wdGlvbiBpcyB0aGF0CiAgICAgIGl0IGlzIHZhcmlhYmxlLWxlbmd0aC4KICAgICA8L3BhcmE+CiAgICA8L2xpc3RpdGVtPgogICA8L3Zhcmxpc3RlbnRyeT4KCiAgIDx2YXJsaXN0ZW50cnk+CiAgICA8dGVybT48cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+YWxpZ25tZW50PC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIFRoZSBzdG9yYWdlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUgZGF0YSB0eXBlLiAgSWYgc3BlY2lmaWVkLAogICAgICBpdCBtdXN0IGJlIDxsaXRlcmFsPmNoYXI8L2xpdGVyYWw+LCA8bGl0ZXJhbD5pbnQyPC9saXRlcmFsPiwKICAgICAgPGxpdGVyYWw+aW50NDwvbGl0ZXJhbD4sIG9yIDxsaXRlcmFsPmRvdWJsZTwvbGl0ZXJhbD47IHRoZQogICAgICBkZWZhdWx0IGlzIDxsaXRlcmFsPmludDQ8L2xpdGVyYWw+LgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgoKICAgPHZhcmxpc3RlbnRyeT4KICAgIDx0ZXJtPjxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5zdG9yYWdlPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIFRoZSBzdG9yYWdlIHN0cmF0ZWd5IGZvciB0aGUgZGF0YSB0eXBlLiAgSWYgc3BlY2lmaWVkLCBtdXN0IGJlCiAgICAgIDxsaXRlcmFsPnBsYWluPC9saXRlcmFsPiwgPGxpdGVyYWw+ZXh0ZXJuYWw8L2xpdGVyYWw+LAogICAgICA8bGl0ZXJhbD5leHRlbmRlZDwvbGl0ZXJhbD4sIG9yIDxsaXRlcmFsPm1haW48L2xpdGVyYWw+OyB0aGUKICAgICAgZGVmYXVsdCBpcyA8bGl0ZXJhbD5wbGFpbjwvbGl0ZXJhbD4uCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmRlZmF1bHQ8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkYXRhIHR5cGUuICBJZiB0aGlzIGlzIG9taXR0ZWQsIHRoZQogICAgICBkZWZhdWx0IGlzIG51bGwuCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmVsZW1lbnQ8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVGhlIHR5cGUgYmVpbmcgY3JlYXRlZCBpcyBhbiBhcnJheTsgdGhpcyBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKICAgICAgdGhlIGFycmF5IGVsZW1lbnRzLgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgoKICAgPHZhcmxpc3RlbnRyeT4KICAgIDx0ZXJtPjxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kZWxpbWl0ZXI8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVGhlIGRlbGltaXRlciBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBiZXR3ZWVuIHZhbHVlcyBpbiBhcnJheXMgbWFkZQogICAgICBvZiB0aGlzIHR5cGUuCiAgICAgPC9wYXJhPgogICAgPC9saXN0aXRlbT4KICAgPC92YXJsaXN0ZW50cnk+CgogICA8dmFybGlzdGVudHJ5PgogICAgPHRlcm0+PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbXByZXNzaW9uX3R5cGU8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmc6IFpMSUIsIFFVSUNLTFogLCBSTEVfVFlQRSwgb3IgTk9ORS4KICAgICA8L3BhcmE+CiAgICA8L2xpc3RpdGVtPgogICA8L3Zhcmxpc3RlbnRyeT4KCiAgIDx2YXJsaXN0ZW50cnk+CiAgICA8dGVybT48cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Y29tcHJlc3Npb25fbGV2ZWw8L3JlcGxhY2VhYmxlPjwvdGVybT4KICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgVmFsdWVzIGJldHdlZW4gMCBhbmQgOS4KICAgICA8L3BhcmE+CiAgICA8L2xpc3RpdGVtPgogICA8L3Zhcmxpc3RlbnRyeT4KCiAgIDx2YXJsaXN0ZW50cnk+CiAgICA8dGVybT48cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+YmxvY2tzaXplPC9yZXBsYWNlYWJsZT48L3Rlcm0+CiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+CiAgICAgIDgxOTIgliAyMDk3MTUyCiAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODE5Mi4gVGhlIGRlZmF1bHQgaXMgMzI3NjguCiAgICAgPC9wYXJhPgogICAgIDxwYXJhPgogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGNvbXByZXNzaW9uIGFuZCBibG9ja3NpemUgcGFyYW1ldGVycywgc2VlIHRoZQogICAgICAgIlN0b3JhZ2UgRGlyZWN0aXZlcyBmb3IgQ29sdW1uLWxldmVsIENvbXByZXNzaW9uIiBpbiB0aGUgR3JlZW5wbHVtCiAgICAgICBEYXRhYmFzZSBBZG1pbmlzdHJhdG9yIEd1aWRlLgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgogIAoKCgogIDwvdmFyaWFibGVsaXN0PgogPC9yZWZzZWN0MT4KCiA8cmVmc2VjdDEgaWQ9IlNRTC1DUkVBVEVUWVBFLW5vdGVzIj4KICA8dGl0bGU+Tm90ZXM8L3RpdGxlPgoKICA8cGFyYT4KICAgVXNlci1kZWZpbmVkIHR5cGUgbmFtZXMgY2Fubm90IGJlZ2luIHdpdGggdGhlIHVuZGVyc2NvcmUgY2hhcmFjdGVyCiAgICg8bGl0ZXJhbD5fPC9saXRlcmFsPikgYW5kIGNhbiBvbmx5IGJlIDYyIGNoYXJhY3RlcnMKICAgbG9uZyAob3IgaW4gZ2VuZXJhbCA8c3ltYm9sPk5BTUVEQVRBTEVOPC9zeW1ib2w+IC0gMiwgcmF0aGVyIHRoYW4KICAgdGhlIDxzeW1ib2w+TkFNRURBVEFMRU48L3N5bWJvbD4gLSAxIGNoYXJhY3RlcnMgYWxsb3dlZCBmb3Igb3RoZXIKICAgbmFtZXMpLiAgVHlwZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIGFyZSByZXNlcnZlZCBmb3IKICAgaW50ZXJuYWxseS1jcmVhdGVkIGFycmF5IHR5cGUgbmFtZXMuCiAgPC9wYXJhPgoKICA8cGFyYT4KICAgQmVjYXVzZSB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVzZSBvZiBhIGRhdGEgdHlwZSBvbmNlIGl0J3MgYmVlbgogICBjcmVhdGVkLCBjcmVhdGluZyBhIGJhc2UgdHlwZSBpcyB0YW50YW1vdW50IHRvIGdyYW50aW5nIHB1YmxpYyBleGVjdXRlCiAgIHBlcm1pc3Npb24gb24gdGhlIGZ1bmN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIHR5cGUgZGVmaW5pdGlvbi4gIChUaGUgY3JlYXRvcgogICBvZiB0aGUgdHlwZSBpcyB0aGVyZWZvcmUgcmVxdWlyZWQgdG8gb3duIHRoZXNlIGZ1bmN0aW9ucy4pICBUaGlzIGlzIHVzdWFsbHkKICAgbm90IGFuIGlzc3VlIGZvciB0aGUgc29ydHMgb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCBpbiBhIHR5cGUKICAgZGVmaW5pdGlvbi4gIEJ1dCB5b3UgbWlnaHQgd2FudCB0byB0aGluayB0d2ljZSBiZWZvcmUgZGVzaWduaW5nIGEgdHlwZQogICBpbiBhIHdheSB0aGF0IHdvdWxkIHJlcXVpcmUgPHF1b3RlPnNlY3JldDwvPiBpbmZvcm1hdGlvbiB0byBiZSB1c2VkCiAgIHdoaWxlIGNvbnZlcnRpbmcgaXQgdG8gb3IgZnJvbSBleHRlcm5hbCBmb3JtLgogIDwvcGFyYT4KCiAgPHBhcmE+CiAgIEJlZm9yZSA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwvcHJvZHVjdG5hbWU+IHZlcnNpb24gOC4yLCB0aGUgc3ludGF4CiAgIDxsaXRlcmFsPkNSRUFURSBUWVBFIDxyZXBsYWNlYWJsZT5uYW1lPC8+PC9saXRlcmFsPiBkaWQgbm90IGV4aXN0LgogICBUaGUgd2F5IHRvIGNyZWF0ZSBhIG5ldyBiYXNlIHR5cGUgd2FzIHRvIGNyZWF0ZSBpdHMgaW5wdXQgZnVuY3Rpb24gZmlyc3QuCiAgIEluIHRoaXMgYXBwcm9hY2gsIDxwcm9kdWN0bmFtZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gd2lsbCBmaXJzdCBzZWUKICAgdGhlIG5hbWUgb2YgdGhlIG5ldyBkYXRhIHR5cGUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBpbnB1dCBmdW5jdGlvbi4KICAgVGhlIHNoZWxsIHR5cGUgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoaXMgc2l0dWF0aW9uLCBhbmQgdGhlbiBpdAogICBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHJlbWFpbmluZyBJL08gZnVuY3Rpb25zLgogICBUaGlzIGFwcHJvYWNoIHN0aWxsIHdvcmtzLCBidXQgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIGRpc2FsbG93ZWQgaW4KICAgc29tZSBmdXR1cmUgcmVsZWFzZS4gIEFsc28sIHRvIGF2b2lkIGFjY2lkZW50YWxseSBjbHV0dGVyaW5nCiAgIHRoZSBjYXRhbG9ncyB3aXRoIHNoZWxsIHR5cGVzIGFzIGEgcmVzdWx0IG9mIHNpbXBsZSB0eXBvcyBpbiBmdW5jdGlvbgogICBkZWZpbml0aW9ucywgYSBzaGVsbCB0eXBlIHdpbGwgb25seSBiZSBtYWRlIHRoaXMgd2F5IHdoZW4gdGhlIGlucHV0CiAgIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gaW4gQy4KICA8L3BhcmE+CgogIDxwYXJhPgogICBJbiA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwvcHJvZHVjdG5hbWU+IHZlcnNpb25zIGJlZm9yZSA3LjMsIGl0CiAgIHdhcyBjdXN0b21hcnkgdG8gYXZvaWQgY3JlYXRpbmcgYSBzaGVsbCB0eXBlIGF0IGFsbCwgYnkgcmVwbGFjaW5nIHRoZQogICBmdW5jdGlvbnMnIGZvcndhcmQgcmVmZXJlbmNlcyB0byB0aGUgdHlwZSBuYW1lIHdpdGggdGhlIHBsYWNlaG9sZGVyCiAgIHBzZXVkb3R5cGUgPHR5cGU+b3BhcXVlPC8+LiAgVGhlIDx0eXBlPmNzdHJpbmc8Lz4gYXJndW1lbnRzIGFuZAogICByZXN1bHRzIGFsc28gaGFkIHRvIGJlIGRlY2xhcmVkIGFzIDx0eXBlPm9wYXF1ZTwvPiBiZWZvcmUgNy4zLiAgVG8KICAgc3VwcG9ydCBsb2FkaW5nIG9mIG9sZCBkdW1wIGZpbGVzLCA8Y29tbWFuZD5DUkVBVEUgVFlQRTwvPiB3aWxsCiAgIGFjY2VwdCBJL08gZnVuY3Rpb25zIGRlY2xhcmVkIHVzaW5nIDx0eXBlPm9wYXF1ZTwvPiwgYnV0IGl0IHdpbGwgaXNzdWUKICAgYSBub3RpY2UgYW5kIGNoYW5nZSB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRvIHVzZSB0aGUgY29ycmVjdAogICB0eXBlcy4KICA8L3BhcmE+CgogPC9yZWZzZWN0MT4KIAogPHJlZnNlY3QxPgogIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CgogIDxwYXJhPgogICBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvc2l0ZSB0eXBlIGFuZCB1c2VzIGl0IGluCiAgIGEgZnVuY3Rpb24gZGVmaW5pdGlvbjoKPHByb2dyYW1saXN0aW5nPgpDUkVBVEUgVFlQRSBjb21wZm9vIEFTIChmMSBpbnQsIGYyIHRleHQpOwoKQ1JFQVRFIEZVTkNUSU9OIGdldGZvbygpIFJFVFVSTlMgU0VUT0YgY29tcGZvbyBBUyAkJAogICAgU0VMRUNUIGZvb2lkLCBmb29uYW1lIEZST00gZm9vCiQkIExBTkdVQUdFIFNRTDsKPC9wcm9ncmFtbGlzdGluZz4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGlzIGV4YW1wbGUgY3JlYXRlcyB0aGUgYmFzZSBkYXRhIHR5cGUgPHR5cGU+Ym94PC90eXBlPiBhbmQgdGhlbiB1c2VzIHRoZQogICB0eXBlIGluIGEgdGFibGUgZGVmaW5pdGlvbjoKPHByb2dyYW1saXN0aW5nPgpDUkVBVEUgVFlQRSBib3g7CgpDUkVBVEUgRlVOQ1RJT04gbXlfYm94X2luX2Z1bmN0aW9uKGNzdHJpbmcpIFJFVFVSTlMgYm94IEFTIC4uLiA7CkNSRUFURSBGVU5DVElPTiBteV9ib3hfb3V0X2Z1bmN0aW9uKGJveCkgUkVUVVJOUyBjc3RyaW5nIEFTIC4uLiA7CgpDUkVBVEUgVFlQRSBib3ggKAogICAgSU5URVJOQUxMRU5HVEggPSAxNiwKICAgIElOUFVUID0gbXlfYm94X2luX2Z1bmN0aW9uLAogICAgT1VUUFVUID0gbXlfYm94X291dF9mdW5jdGlvbgopOwoKQ1JFQVRFIFRBQkxFIG15Ym94ZXMgKAogICAgaWQgaW50ZWdlciwKICAgIGRlc2NyaXB0aW9uIGJveAopOwo8L3Byb2dyYW1saXN0aW5nPgogIDwvcGFyYT4KCiAgPHBhcmE+CiAgIElmIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgPHR5cGU+Ym94PC90eXBlPiB3ZXJlIGFuIGFycmF5IG9mIGZvdXIKICAgPHR5cGU+ZmxvYXQ0PC8+IGVsZW1lbnRzLCB3ZSBtaWdodCBpbnN0ZWFkIHVzZQo8cHJvZ3JhbWxpc3Rpbmc+CkNSRUFURSBUWVBFIGJveCAoCiAgICBJTlRFUk5BTExFTkdUSCA9IDE2LAogICAgSU5QVVQgPSBteV9ib3hfaW5fZnVuY3Rpb24sCiAgICBPVVRQVVQgPSBteV9ib3hfb3V0X2Z1bmN0aW9uLAogICAgRUxFTUVOVCA9IGZsb2F0NAopOwo8L3Byb2dyYW1saXN0aW5nPgogICB3aGljaCB3b3VsZCBhbGxvdyBhIGJveCB2YWx1ZSdzIGNvbXBvbmVudCBudW1iZXJzIHRvIGJlIGFjY2Vzc2VkCiAgIGJ5IHN1YnNjcmlwdGluZy4gIE90aGVyd2lzZSB0aGUgdHlwZSBiZWhhdmVzIHRoZSBzYW1lIGFzIGJlZm9yZS4KICA8L3BhcmE+CgogIDxwYXJhPgogICBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIGxhcmdlIG9iamVjdCB0eXBlIGFuZCB1c2VzIGl0IGluCiAgIGEgdGFibGUgZGVmaW5pdGlvbjoKPHByb2dyYW1saXN0aW5nPgpDUkVBVEUgVFlQRSBiaWdvYmogKAogICAgSU5QVVQgPSBsb19maWxlaW4sIE9VVFBVVCA9IGxvX2ZpbGVvdXQsCiAgICBJTlRFUk5BTExFTkdUSCA9IFZBUklBQkxFCik7CkNSRUFURSBUQUJMRSBiaWdfb2JqcyAoCiAgICBpZCBpbnRlZ2VyLAogICAgb2JqIGJpZ29iagopOwo8L3Byb2dyYW1saXN0aW5nPgogIDwvcGFyYT4KCiAgPHBhcmE+CiAgIE1vcmUgZXhhbXBsZXMsIGluY2x1ZGluZyBzdWl0YWJsZSBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucywgYXJlCiAgIGluIDx4cmVmIGxpbmtlbmQ9Inh0eXBlcyI+LgogIDwvcGFyYT4KIDwvcmVmc2VjdDE+CgogPHJlZnNlY3QxIGlkPSJTUUwtQ1JFQVRFVFlQRS1jb21wYXRpYmlsaXR5Ij4KICA8dGl0bGU+Q29tcGF0aWJpbGl0eTwvdGl0bGU+CgogIDxwYXJhPgogICBUaGlzIDxjb21tYW5kPkNSRUFURSBUWVBFPC9jb21tYW5kPiBjb21tYW5kIGlzIGEKICAgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1lPiBleHRlbnNpb24uICBUaGVyZSBpcyBhCiAgIDxjb21tYW5kPkNSRUFURSBUWVBFPC9jb21tYW5kPiBzdGF0ZW1lbnQgaW4gdGhlIDxhY3JvbnltPlNRTDwvPiBzdGFuZGFyZAogICB0aGF0IGlzIHJhdGhlciBkaWZmZXJlbnQgaW4gZGV0YWlsLgogIDwvcGFyYT4KIDwvcmVmc2VjdDE+CgogPHJlZnNlY3QxIGlkPSJTUUwtQ1JFQVRFVFlQRS1zZWUtYWxzbyI+CiAgPHRpdGxlPlNlZSBBbHNvPC90aXRsZT4KCiAgPHNpbXBsZWxpc3QgdHlwZT0iaW5saW5lIj4KICAgPG1lbWJlcj48eHJlZiBsaW5rZW5kPSJzcWwtY3JlYXRlZnVuY3Rpb24iIGVuZHRlcm09InNxbC1jcmVhdGVmdW5jdGlvbi10aXRsZSI+PC9tZW1iZXI+CiAgIDxtZW1iZXI+PHhyZWYgbGlua2VuZD0ic3FsLWRyb3B0eXBlIiBlbmR0ZXJtPSJzcWwtZHJvcHR5cGUtdGl0bGUiPjwvbWVtYmVyPgogICA8bWVtYmVyPjx4cmVmIGxpbmtlbmQ9InNxbC1hbHRlcnR5cGUiIGVuZHRlcm09InNxbC1hbHRlcnR5cGUtdGl0bGUiPjwvbWVtYmVyPgogICA8bWVtYmVyPjx4cmVmIGxpbmtlbmQ9InNxbC1jcmVhdGVkb21haW4iIGVuZHRlcm09InNxbC1jcmVhdGVkb21haW4tdGl0bGUiPjwvbWVtYmVyPgogIDwvc2ltcGxlbGlzdD4KIDwvcmVmc2VjdDE+Cgo8L3JlZmVudHJ5Pgo=