ICA8Y2hhcHRlciBpZD0iaW1wbGVtZW50YXRpb24iPgogICAgPHRpdGxlPkxvdy1sZXZlbCBJbXBsZW1lbnRhdGlvbjwvdGl0bGU+CiAgICA8cGFyYT5EZXRhaWxzIG9mIFdpbmUncyBMb3ctbGV2ZWwgSW1wbGVtZW50YXRpb24uLi48L3BhcmE+Cgo8c2VjdDEgaWQ9ImNvbmZpZy1rZXlib2FyZCI+Cjx0aXRsZT5LZXlib2FyZDwvdGl0bGU+Cgo8cGFyYT4KV2luZSBub3cgbmVlZHMgdG8ga25vdyBhYm91dCB5b3VyIGtleWJvYXJkIGxheW91dC4gVGhpcwpyZXF1aXJlbWVudCBjb21lcyBmcm9tIGEgbmVlZCBmcm9tIG1hbnkgYXBwcyB0byBoYXZlIHRoZQpjb3JyZWN0IHNjYW5jb2RlcyBhdmFpbGFibGUsIHNpbmNlIHRoZXkgcmVhZCB0aGVzZSBkaXJlY3RseSwKaW5zdGVhZCBvZiBqdXN0IHRha2luZyB0aGUgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgWApzZXJ2ZXIuIFRoaXMgbWVhbnMgdGhhdCBXaW5lIG5vdyBuZWVkcyB0byBoYXZlIGEgbWFwcGluZyBmcm9tClgga2V5cyB0byB0aGUgc2NhbmNvZGVzIHRoZXNlIHByb2dyYW1zIGV4cGVjdC4KPC9wYXJhPgo8cGFyYT4KT24gc3RhcnR1cCwgV2luZSB3aWxsIHRyeSB0byByZWNvZ25pemUgdGhlIGFjdGl2ZSBYIGxheW91dCBieQpzZWVpbmcgaWYgaXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGRlZmluZWQgdGFibGVzLiBJZiBpdCBkb2VzLApldmVyeXRoaW5nIGlzIGFscmlnaHQuIElmIG5vdCwgeW91IG5lZWQgdG8gZGVmaW5lIGl0Lgo8L3BhcmE+CjxwYXJhPgpUbyBkbyB0aGlzLCBvcGVuIHRoZSBmaWxlCjxmaWxlbmFtZT5kbGxzL3gxMWRydi9rZXlib2FyZC5jPC9maWxlbmFtZT4gYW5kIHRha2UgYSBsb29rCmF0IHRoZSBleGlzdGluZyB0YWJsZXMuIE1ha2UgYSBiYWNrdXAgY29weSBvZiBpdCwgZXNwZWNpYWxseQppZiB5b3UgZG9uJ3QgdXNlIENWUy4KPC9wYXJhPgo8cGFyYT4KV2hhdCB5b3UgcmVhbGx5IHdvdWxkIG5lZWQgdG8gZG8sIGlzIGZpbmQgb3V0IHdoaWNoIHNjYW5jb2RlCmVhY2gga2V5IG5lZWRzIHRvIGdlbmVyYXRlLiAgRmluZCBpdCBpbiB0aGUKPGZ1bmN0aW9uPm1haW5fa2V5X3NjYW48L2Z1bmN0aW9uPiB0YWJsZSwgd2hpY2ggbG9va3MgbGlrZQp0aGlzOgo8L3BhcmE+Cjxwcm9ncmFtbGlzdGluZz4Kc3RhdGljIGNvbnN0IGludCBtYWluX2tleV9zY2FuW01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCjB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCjB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAoweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKPC9wcm9ncmFtbGlzdGluZz4KPHBhcmE+Ck5leHQsIGFzc2lnbiBlYWNoIHNjYW5jb2RlIHRoZSBjaGFyYWN0ZXJzIGltcHJpbnRlZCBvbiB0aGUKa2V5Y2Fwcy4gVGhpcyB3YXMgZG9uZSAoc29ydCBvZikgZm9yIHRoZSBVUyAxMDEta2V5IGtleWJvYXJkLAp3aGljaCB5b3UgY2FuIGZpbmQgbmVhciB0aGUgdG9wIGluCjxmaWxlbmFtZT5rZXlib2FyZC5jPC9maWxlbmFtZT4uIEl0IGFsc28gc2hvd3MgdGhhdCBpZiB0aGVyZQppcyBubyAxMDJuZCBrZXksIHlvdSBjYW4gc2tpcCB0aGF0Lgo8L3BhcmE+CjxwYXJhPgpIb3dldmVyLCBmb3IgbW9zdCBpbnRlcm5hdGlvbmFsIDEwMi1rZXkga2V5Ym9hcmRzLCB3ZSBoYXZlCmRvbmUgaXQgZWFzeSBmb3IgeW91LiBUaGUgc2NhbmNvZGUgbGF5b3V0IGZvciB0aGVzZSBhbHJlYWR5CnByZXR0eSBtdWNoIG1hdGNoZXMgdGhlIHBoeXNpY2FsIGxheW91dCBpbiB0aGUKPGZ1bmN0aW9uPm1haW5fa2V5X3NjYW48L2Z1bmN0aW9uPiwgc28gYWxsIHlvdSBuZWVkIHRvIGRvIGlzCnRvIGdvIHRocm91Z2ggYWxsIHRoZSBrZXlzIHRoYXQgZ2VuZXJhdGUgY2hhcmFjdGVycyBvbiB5b3VyCm1haW4ga2V5Ym9hcmQgKGV4Y2VwdCBzcGFjZWJhciksIGFuZCBzdHVmZiB0aG9zZSBpbnRvIGFuCmFwcHJvcHJpYXRlIHRhYmxlLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdCB0aGUgMTAybmQga2V5LAp3aGljaCBpcyB1c3VhbGx5IHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBrZXkgb2YgdGhlIGxhc3QgbGluZQoodXN1YWxseSA8a2V5Y2FwPlo8L2tleWNhcD4pLCBtdXN0IGJlIHBsYWNlZCBvbiBhIHNlcGFyYXRlCmxpbmUgYWZ0ZXIgdGhlIGxhc3QgbGluZS4KPC9wYXJhPgo8cGFyYT4KRm9yIGV4YW1wbGUsIG15IE5vcndlZ2lhbiBrZXlib2FyZCBsb29rcyBsaWtlIHRoaXMKPC9wYXJhPgo8c2NyZWVuPgqnICAhICAiICAjICCkICAlICAmICAvICAoICApICA9ICA/ICBgICBCYWNrLQp8ICAxICAyQCAzoyA0JCA1ICA2ICA3eyA4WyA5XSAwfSArICBctCBzcGFjZQoKVGFiIFEgIFcgIEUgIFIgIFQgIFkgIFUgIEkgIE8gIFAgIMUgIF4KCQkJICAgICCofgoJCQkJRW50ZXIKQ2FwcyBBICBTICBEICBGICBHICBIICBKICBLICBMICDYICDGICAqCkxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJwoKU2gtID4gWiAgWCAgQyAgViAgQiAgTiAgTSAgOyAgOiAgXyAgU2hpZnQKaWZ0ICZsdDsgICAgICAgICAgICAgICAgICAgICAgLCAgLiAgLQoKQ3RybCAgQWx0ICAgICAgIFNwYWNlYmFyICAgICAgIEFsdEdyICBDdHJsCjwvc2NyZWVuPgo8cGFyYT4KTm90ZSB0aGUgMTAybmQga2V5LCB3aGljaCBpcyB0aGUgPGtleWNhcD4mbHQ7Pjwva2V5Y2FwPiBrZXksIHRvCnRoZSBsZWZ0IG9mIDxrZXljYXA+Wjwva2V5Y2FwPi4gVGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YKdGhlIG1haW4gY2hhcmFjdGVyIGlzIHRoZSBjaGFyYWN0ZXIgZ2VuZXJhdGVkIGJ5CjxrZXljYXA+QWx0R3I8L2tleWNhcD4uCjwvcGFyYT4KPHBhcmE+ClRoaXMga2V5Ym9hcmQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgo8L3BhcmE+Cjxwcm9ncmFtbGlzdGluZz4Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewoifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXLQiLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAoiJmx0Oz4iCn07CjwvcHJvZ3JhbWxpc3Rpbmc+CjxwYXJhPgpFeGNlcHQgdGhhdCAiIGFuZCBcIG5lZWRzIHRvIGJlIHF1b3RlZCB3aXRoIGEgYmFja3NsYXNoLCBhbmQKdGhhdCB0aGUgMTAybmQga2V5IGlzIG9uIGEgc2VwYXJhdGUgbGluZSwgaXQncyBwcmV0dHkKc3RyYWlnaHRmb3J3YXJkLgo8L3BhcmE+CjxwYXJhPgpBZnRlciB5b3UgaGF2ZSB3cml0dGVuIHN1Y2ggYSB0YWJsZSwgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZQo8ZnVuY3Rpb24+bWFpbl9rZXlfdGFiW108L2Z1bmN0aW9uPiBsYXlvdXQgaW5kZXggdGFibGUuIFRoaXMKd2lsbCBsb29rIGxpa2UgdGhpczoKPC9wYXJhPgo8cHJvZ3JhbWxpc3Rpbmc+CnN0YXRpYyBzdHJ1Y3QgewpXT1JEIGxhbmcsIGFuc2lfY29kZXBhZ2UsIG9lbV9jb2RlcGFnZTsKY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwp9IG1haW5fa2V5X3RhYltdPXsKLi4uCi4uLgp7TUFLRUxBTkdJRChMQU5HX05PUldFR0lBTixTVUJMQU5HX0RFRkFVTFQpLCAgMTI1MiwgODY1LCAmYW1wO21haW5fa2V5X05PfSwKLi4uCjwvcHJvZ3JhbWxpc3Rpbmc+CjxwYXJhPgpBZnRlciB5b3UgaGF2ZSBhZGRlZCB5b3VyIHRhYmxlLCByZWNvbXBpbGUgV2luZSBhbmQgdGVzdCB0aGF0Cml0IHdvcmtzLiBJZiBpdCBmYWlscyB0byBkZXRlY3QgeW91ciB0YWJsZSwgdHJ5IHJ1bm5pbmcKPC9wYXJhPgo8c2NyZWVuPgpXSU5FREVCVUc9K2tleSwra2V5Ym9hcmQgd2luZSA+IGtleS5sb2cgMj4mMQogICAgICA8L3NjcmVlbj4KICAgICAgPHBhcmE+CiAgICAgICAgYW5kIGxvb2sgaW4gdGhlIHJlc3VsdGluZyA8ZmlsZW5hbWU+a2V5LmxvZzwvZmlsZW5hbWU+IGZpbGUgdG8KICAgICAgICBmaW5kIHRoZSBlcnJvciBtZXNzYWdlcyBpdCBnaXZlcyBmb3IgeW91ciBsYXlvdXQuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgTm90ZSB0aGF0IHRoZSA8Y29uc3RhbnQ+TEFOR18qPC9jb25zdGFudD4gYW5kCiAgICAgICAgPGNvbnN0YW50PlNVQkxBTkdfKjwvY29uc3RhbnQ+IGRlZmluaXRpb25zIGFyZSBpbgogICAgICAgIDxmaWxlbmFtZT5pbmNsdWRlL3dpbm5scy5oPC9maWxlbmFtZT4sIHdoaWNoIHlvdSBtaWdodCBuZWVkIHRvCiAgICAgICAga25vdyB0byBmaW5kIG91dCB3aGljaCBudW1iZXJzIHlvdXIgbGFuZ3VhZ2UgaXMgYXNzaWduZWQsIGFuZAogICAgICAgIGZpbmQgaXQgaW4gdGhlIFdJTkVERUJVRyBvdXRwdXQuIFRoZSBudW1iZXJzIHdpbGwgYmUKICAgICAgICA8bGl0ZXJhbD4oU1VCTEFORyAqIDB4NDAwICsgTEFORyk8L2xpdGVyYWw+LCBzbywgZm9yIGV4YW1wbGUKICAgICAgICB0aGUgY29tYmluYXRpb24gPGxpdGVyYWw+TEFOR19OT1JXRUdJQU4gKDB4MTQpPC9saXRlcmFsPiBhbmQKICAgICAgICA8bGl0ZXJhbD5TVUJMQU5HX0RFRkFVTFQgKDB4MSk8L2xpdGVyYWw+IHdpbGwgYmUgKGluIGhleCkKICAgICAgICA8bGl0ZXJhbD4xNCArIDEqNDAwID0gNDE0PC9saXRlcmFsPiwgc28gc2luY2UgSSdtIE5vcndlZ2lhbiwgSQogICAgICAgIGNvdWxkIGxvb2sgZm9yIDxsaXRlcmFsPjA0MTQ8L2xpdGVyYWw+IGluIHRoZSBXSU5FREVCVUcgb3V0cHV0CiAgICAgICAgdG8gZmluZCBvdXQgd2h5IG15IGtleWJvYXJkIHdvbid0IGRldGVjdC4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KICAgICAgICBPbmNlIGl0IHdvcmtzLCBzdWJtaXQgaXQgdG8gdGhlIFdpbmUgcHJvamVjdC4gSWYgeW91IHVzZSBDVlMsCiAgICAgICAgeW91IHdpbGwganVzdCBoYXZlIHRvIGRvCiAgICAgIDwvcGFyYT4KICAgICAgPHNjcmVlbj4KY3ZzIC16MyBkaWZmIC11IGRsbHMveDExZHJ2L2tleWJvYXJkLmMgPiBsYXlvdXQuZGlmZgogICAgICA8L3NjcmVlbj4KICAgICAgPHBhcmE+CiAgICAgICAgZnJvbSB5b3VyIG1haW4gV2luZSBkaXJlY3RvcnksIHRoZW4gc3VibWl0CiAgICAgICAgPGZpbGVuYW1lPmxheW91dC5kaWZmPC9maWxlbmFtZT4gdG8KICAgICAgICA8ZW1haWw+d2luZS1wYXRjaGVzQHdpbmVocS5vcmc8L2VtYWlsPiBhbG9uZyB3aXRoIGEgYnJpZWYgbm90ZQogICAgICAgIG9mIHdoYXQgaXQgaXMuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgSWYgeW91IGRvbid0IHVzZSBDVlMsIHlvdSBuZWVkIHRvIGRvCiAgICAgIDwvcGFyYT4KICAgICAgPHNjcmVlbj4KZGlmZiAtdSB0aGVfYmFja3VwX2ZpbGVfeW91X21hZGUgZGxscy94MTFkcnYva2V5Ym9hcmQuYyA+IGxheW91dC5kaWZmCiAgICAgIDwvc2NyZWVuPgogICAgICA8cGFyYT4KICAgICAgICBhbmQgc3VibWl0IGl0IGFzIGV4cGxhaW5lZCBhYm92ZS4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KICAgICAgICBJZiB5b3UgZGlkIGl0IHJpZ2h0LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBuZXh0IFdpbmUKICAgICAgICByZWxlYXNlLCBhbmQgYWxsIHRoZSB0cm91Ymxlc29tZSBwcm9ncmFtcyAoZXNwZWNpYWxseQogICAgICAgIHJlbW90ZS1jb250cm9sIHByb2dyYW1zKSBhbmQgZ2FtZXMgdGhhdCB1c2Ugc2NhbmNvZGVzIHdpbGwKICAgICAgICBiZSBoYXBwaWx5IHVzaW5nIHlvdXIga2V5Ym9hcmQgbGF5b3V0LCBhbmQgeW91IHdvbid0IGdldCB0aG9zZQogICAgICAgIGFubm95aW5nIGZpeG1lIG1lc3NhZ2VzIGVpdGhlci4KICAgICAgPC9wYXJhPgogICAgPC9zZWN0MT4KCgogICAgPHNlY3QxIGlkPSJ1bmRvYy1mdW5jIj4KICAgICAgPHRpdGxlPlVuZG9jdW1lbnRlZCBBUElzPC90aXRsZT4KCgk8cGFyYT4KCSAgU29tZSBiYWNrZ3JvdW5kOiAgT24gdGhlIGkzODYgY2xhc3Mgb2YgbWFjaGluZXMsIHN0YWNrIGVudHJpZXMgYXJlCgkgIHVzdWFsbHkgZHdvcmQgKDQgYnl0ZXMpIGluIHNpemUsIGxpdHRsZS1lbmRpYW4uICBUaGUgc3RhY2sgZ3Jvd3MKCSAgZG93bndhcmQgaW4gbWVtb3J5LiAgVGhlIHN0YWNrIHBvaW50ZXIsIG1haW50YWluZWQgaW4gdGhlIAoJICA8bGl0ZXJhbD5lc3A8L2xpdGVyYWw+IHJlZ2lzdGVyLCBwb2ludHMgdG8gdGhlIGxhc3QgdmFsaWQgZW50cnk7IAoJICB0aHVzLCB0aGUgb3BlcmF0aW9uIG9mIHB1c2hpbmcgYSB2YWx1ZSBvbnRvIHRoZSBzdGFjayBpbnZvbHZlcyAKCSAgZGVjcmVtZW50aW5nIDxsaXRlcmFsPmVzcDwvbGl0ZXJhbD4gYW5kIHRoZW4gbW92aW5nIHRoZSB2YWx1ZSBpbnRvIAoJICB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgPGxpdGVyYWw+ZXNwPC9saXRlcmFsPgoJICAoaS5lLiwgPGxpdGVyYWw+cHVzaCBwPC9saXRlcmFsPiBpbiBhc3NlbWJseSByZXNlbWJsZXMgCgkgIDxsaXRlcmFsPiooLS1lc3ApID0gcDs8L2xpdGVyYWw+IGluIEMpLiAgUmVtb3ZpbmcgKHBvcHBpbmcpCgkgIHZhbHVlcyBvZmYgdGhlIHN0YWNrIGlzIHRoZSByZXZlcnNlIChpLmUuLCA8bGl0ZXJhbD5wb3AgcDwvbGl0ZXJhbD4gCgkgIGNvcnJlc3BvbmRzIHRvIDxsaXRlcmFsPnAgPSAqKGVzcCsrKTs8L2xpdGVyYWw+IGluIEMpLgoJPC9wYXJhPgoKCTxwYXJhPgoJICBJbiB0aGUgPGxpdGVyYWw+c3RkY2FsbDwvbGl0ZXJhbD4gY2FsbGluZyBjb252ZW50aW9uLCBhcmd1bWVudHMgYXJlIAoJICBwdXNoZWQgb250byB0aGUgc3RhY2sgcmlnaHQtdG8tbGVmdC4gIEZvciBleGFtcGxlLCB0aGUgQyBjYWxsCgkgIDxmdW5jdGlvbj5teWZ1bmN0aW9uKDQwLCAyMCwgNzAsIDMwKTs8L2Z1bmN0aW9uPiBpcyBleHByZXNzZWQgaW4gCgkgIEludGVsIGFzc2VtYmx5IGFzOgoJICA8c2NyZWVuPgogICAgcHVzaCAzMAogICAgcHVzaCA3MAogICAgcHVzaCAyMAogICAgcHVzaCA0MAogICAgY2FsbCBteWZ1bmN0aW9uCgkgIDwvc2NyZWVuPgoJICBUaGUgY2FsbGVkIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGUgYXJndW1lbnRzIAoJICBvZmYgdGhlIHN0YWNrLiAgVGh1cywgYmVmb3JlIHRoZSBjYWxsIHRvIG15ZnVuY3Rpb24sIHRoZQoJICBzdGFjayB3b3VsZCBsb29rIGxpa2U6CgkgIDxzY3JlZW4+CiAgICAgICAgICAgICBbbG9jYWwgdmFyaWFibGUgb3IgdGVtcG9yYXJ5XQogICAgICAgICAgICAgW2xvY2FsIHZhcmlhYmxlIG9yIHRlbXBvcmFyeV0KICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgIDcwCiAgICAgICAgICAgICAgMjAKICAgIGVzcCAtPiAgICA0MAoJICA8L3NjcmVlbj4KCSAgQWZ0ZXIgdGhlIGNhbGwgcmV0dXJucywgaXQgc2hvdWxkIGxvb2sgbGlrZToKCSAgPHNjcmVlbj4KICAgICAgICAgICAgIFtsb2NhbCB2YXJpYWJsZSBvciB0ZW1wb3JhcnldCiAgICBlc3AgLT4gICBbbG9jYWwgdmFyaWFibGUgb3IgdGVtcG9yYXJ5XQoJICA8L3NjcmVlbj4KCTwvcGFyYT4KCgk8cGFyYT4KCSAgVG8gcmVzdG9yZSB0aGUgc3RhY2sgdG8gdGhpcyBzdGF0ZSwgdGhlIGNhbGxlZCBmdW5jdGlvbiBtdXN0IGtub3cgaG93CgkgIG1hbnkgYXJndW1lbnRzIHRvIHJlbW92ZSAod2hpY2ggaXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaXQgdGFrZXMpLgoJICBUaGlzIGlzIGEgcHJvYmxlbSBpZiB0aGUgZnVuY3Rpb24gaXMgdW5kb2N1bWVudGVkLgoJPC9wYXJhPgoKCTxwYXJhPgoJICBPbmUgd2F5IHRvIGF0dGVtcHQgdG8gZG9jdW1lbnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZWFjaCBmdW5jdGlvbgoJICB0YWtlcyBpcyB0byBjcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCB0aGF0IGZ1bmN0aW9uIHRoYXQgZGV0ZWN0cyB0aGUKCSAgc3RhY2sgb2Zmc2V0LiAgRXNzZW50aWFsbHksIGVhY2ggd3JhcHBlciBhc3N1bWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgCgkgIHRha2UgYSBsYXJnZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIHdyYXBwZXIgY29waWVzIGVhY2ggb2YgdGhlc2UgCgkgIGFyZ3VtZW50cyBpbnRvIGl0cyBzdGFjaywgY2FsbHMgdGhlIGFjdHVhbCBmdW5jdGlvbiwgYW5kIHRoZW4gY2FsY3VsYXRlcyAKCSAgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYnkgY2hlY2tpbmcgZXNwIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNhbGwuCgk8L3BhcmE+CgoJPHBhcmE+CgkgIFRoZSBtYWluIHByb2JsZW0gd2l0aCB0aGlzIHNjaGVtZSBpcyB0aGF0IHRoZSBmdW5jdGlvbiBtdXN0IGFjdHVhbGx5CgkgIGJlIGNhbGxlZCBmcm9tIGFub3RoZXIgcHJvZ3JhbS4gIE1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBzZWxkb20KCSAgdXNlZC4gIEFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYWdncmVzc2l2ZWx5IHF1ZXJ5IGVhY2ggZnVuY3Rpb24gaW4gYQoJICBnaXZlbiBsaWJyYXJ5ICg8ZmlsZW5hbWU+bnRkbGwuZGxsPC9maWxlbmFtZT4pIGJ5IHBhc3NpbmcgNjQgYXJndW1lbnRzLCAKCSAgYWxsIDAsIHRvIGVhY2ggZnVuY3Rpb24uICBVbmZvcnR1bmF0ZWx5LCBXaW5kb3dzIE5UIHF1aWNrbHkgZ29lcyB0byBhIAoJICBibHVlIHNjcmVlbiBvZiBkZWF0aCwgZXZlbiBpZiB0aGUgcHJvZ3JhbSBpcyBydW4gZnJvbSBhIAoJICBub24tYWRtaW5pc3RyYXRvciBhY2NvdW50LgoJPC9wYXJhPgoKCTxwYXJhPgoJICBBbm90aGVyIG1ldGhvZCB0aGF0IGhhcyBiZWVuIG11Y2ggbW9yZSBzdWNjZXNzZnVsIGlzIHRvIGF0dGVtcHQgdG8KCSAgZmlndXJlIG91dCBob3cgbWFueSBhcmd1bWVudHMgZWFjaCBmdW5jdGlvbiBpcyByZW1vdmluZyBmcm9tIHRoZQoJICBzdGFjay4gIFRoaXMgaW5zdHJ1Y3Rpb24sIDxsaXRlcmFsPnJldCBoaGxsPC9saXRlcmFsPiAod2hlcmUgCgkgIDxzeW1ib2w+aGhsbDwvc3ltYm9sPiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlbW92ZSwgaS5lLiB0aGUgCgkgIG51bWJlciBvZiBhcmd1bWVudHMgdGltZXMgNCksIGNvbnRhaW5zIHRoZSBieXRlcyAKCSAgPGxpdGVyYWw+MHhjMiBsbCBoaDwvbGl0ZXJhbD4gaW4gbWVtb3J5LiAgSXQgaXMgYSByZWFzb25hYmxlCgkgIGFzc3VtcHRpb24gdGhhdCBmZXcsIGlmIGFueSwgZnVuY3Rpb25zIHRha2UgbW9yZSB0aGFuIDE2IGFyZ3VtZW50czsgCgkgIHRoZXJlZm9yZSwgc2ltcGx5IHNlYXJjaGluZyBmb3IgCgkgIDxsaXRlcmFsPmhoID09IDAgJiYgbGwgJmx0OyAweDQwPC9saXRlcmFsPiAgc3RhcnRpbmcgZnJvbSB0aGUgCgkgIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB5aWVsZHMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBtb3N0IAoJICBvZiB0aGUgdGltZS4KCTwvcGFyYT4KCgk8cGFyYT4KCSAgT2YgY291cnNlLCB0aGlzIGlzIG5vdCB3aXRob3V0IGVycm9ycy4gPGxpdGVyYWw+cmV0IDAwbGw8L2xpdGVyYWw+IAoJICBpcyBub3QgdGhlIG9ubHkgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gaGF2ZSB0aGUgYnl0ZSBzZXF1ZW5jZSAKCSAgPGxpdGVyYWw+MHhjMiBsbCAweDA8L2xpdGVyYWw+OyBmb3IgZXhhbXBsZSwgCgkgIDxsaXRlcmFsPnB1c2ggMHgwMDAwNDBjMjwvbGl0ZXJhbD4gaGFzIHRoZSBieXRlIHNlcXVlbmNlCgkgIDxsaXRlcmFsPjB4NjggMHhjMiAweDQwIDB4MCAweDA8L2xpdGVyYWw+LCB3aGljaCBtYXRjaGVzIAoJICB0aGUgYWJvdmUuICBQcm9wZXJseSwgdGhlIHV0aWxpdHkgc2hvdWxkIGxvb2sgZm9yIHRoaXMgc2VxdWVuY2UgCgkgIG9ubHkgb24gYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnk7IHVuZm9ydHVuYXRlbHksIGZpbmRpbmcgCgkgIGluc3RydWN0aW9uIGJvdW5kYXJpZXMgb24gYW4gaTM4NiByZXF1aXJlcyBpbXBsZW1lbnRpbmcgYSBmdWxsIAoJICBkaXNhc3NlbWJsZXIgLS0gcXVpdGUgYSBkYXVudGluZyB0YXNrLiAgQmVzaWRlcywgdGhlIHByb2JhYmlsaXR5IAoJICBvZiBoYXZpbmcgc3VjaCBhIGJ5dGUgc2VxdWVuY2UgdGhhdCBpcyBub3QgdGhlIGFjdHVhbCByZXR1cm4gCgkgIGluc3RydWN0aW9uIGlzIGZhaXJseSBsb3cuCgk8L3BhcmE+CgoJPHBhcmE+CgkgIE11Y2ggbW9yZSB0cm91Ymxlc29tZSBpcyB0aGUgbm9uLWxpbmVhciBmbG93IG9mIGEgZnVuY3Rpb24uICBGb3IKCSAgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zOgoJICA8c2NyZWVuPgogICAgc29tZWZ1bmN0aW9uMToKICAgICAgICBqbXAgIHNvbWVmdW5jdGlvbjFfaW1wbAoKICAgIHNvbWVmdW5jdGlvbjI6CiAgICAgICAgcmV0ICAwMDA0CgogICAgc29tZWZ1bmN0aW9uMV9pbXBsOgogICAgICAgIHJldCAgMDAwOAoJICA8L3NjcmVlbj4KCSAgSW4gdGhpcyBjYXNlLCB3ZSB3b3VsZCBpbmNvcnJlY3RseSBkZXRlY3QgYm90aCAKCSAgPGZ1bmN0aW9uPnNvbWVmdW5jdGlvbjE8L2Z1bmN0aW9uPiBhbmQKCSAgPGZ1bmN0aW9uPnNvbWVmdW5jdGlvbjI8L2Z1bmN0aW9uPiBhcyB0YWtpbmcgb25seSBhIHNpbmdsZSAKCSAgYXJndW1lbnQsIHdoZXJlYXMgPGZ1bmN0aW9uPnNvbWVmdW5jdGlvbjE8L2Z1bmN0aW9uPiByZWFsbHkgCgkgIHRha2VzIHR3byBhcmd1bWVudHMuCgk8L3BhcmE+CgoJPHBhcmE+CgkgIFdpdGggdGhlc2UgbGltaXRhdGlvbnMgaW4gbWluZCwgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IG1vcmUgc3R1YnMKCSAgaW4gV2luZSBhbmQsIGV2ZW50dWFsbHksIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcy4KCTwvcGFyYT4KICAgIDwvc2VjdDE+CgogICAgPHNlY3QxIGlkPSJhY2NlbC1pbXBsIj4KICAgICAgPHRpdGxlPkFjY2VsZXJhdG9yczwvdGl0bGU+CgogICAgICA8cGFyYT4KICAgICAgICBUaGVyZSBhcmUgPGVtcGhhc2lzPnRocmVlPC9lbXBoYXNpcz4gZGlmZmVyZW50bHkgc2l6ZWQKICAgICAgICBhY2NlbGVyYXRvciBzdHJ1Y3R1cmVzIGV4cG9zZWQgdG8gdGhlIHVzZXI6IAogICAgICA8L3BhcmE+CiAgICAgIDxvcmRlcmVkbGlzdD4KICAgICAgICA8bGlzdGl0ZW0+CiAgICAgICAgICA8cGFyYT4KICAgICAgICAgICAgQWNjZWxlcmF0b3JzIGluIE5FIHJlc291cmNlcy4gIFRoaXMgaXMgYWxzbyB0aGUgaW50ZXJuYWwKICAgICAgICAgICAgbGF5b3V0IG9mIHRoZSBnbG9iYWwgaGFuZGxlIDx0eXBlPkhBQ0NFTDwvdHlwZT4gKDE2IGFuZAogICAgICAgICAgICAzMikgaW4gV2luZG93cyA5NSBhbmQgV2luZS4gRXhwb3NlZCB0byB0aGUgdXNlciBhcyBXaW4xNgogICAgICAgICAgICBnbG9iYWwgaGFuZGxlcyA8dHlwZT5IQUNDRUwxNjwvdHlwZT4gYW5kCiAgICAgICAgICAgIDx0eXBlPkhBQ0NFTDMyPC90eXBlPiBieSB0aGUgV2luMTYvV2luMzIgQVBJLgoJICAgIFRoZXNlIGFyZSA1IGJ5dGVzIGxvbmcsIHdpdGggbm8gcGFkZGluZzoKICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgpCWVRFICAgZlZpcnQ7CldPUkQgICBrZXk7CldPUkQgICBjbWQ7CiAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgICAgICA8L3BhcmE+CiAgICAgICAgPC9saXN0aXRlbT4KICAgICAgICA8bGlzdGl0ZW0+CiAgICAgICAgICA8cGFyYT4KICAgICAgICAgICAgQWNjZWxlcmF0b3JzIGluIFBFIHJlc291cmNlcy4gVGhleSBhcmUgZXhwb3NlZCB0byB0aGUgdXNlciAKCSAgICBvbmx5IGJ5IGRpcmVjdCBhY2Nlc3NpbmcgUEUgcmVzb3VyY2VzLiAKCSAgICBUaGVzZSBoYXZlIGEgc2l6ZSBvZiA4IGJ5dGVzOgogICAgICAgICAgPC9wYXJhPgogICAgICAgICAgPHByb2dyYW1saXN0aW5nPgpCWVRFICAgZlZpcnQ7CkJZVEUgICBwYWQwOwpXT1JEICAga2V5OwpXT1JEICAgY21kOwpXT1JEICAgcGFkMTsKICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgICAgPC9saXN0aXRlbT4KICAgICAgICA8bGlzdGl0ZW0+CiAgICAgICAgICA8cGFyYT4KICAgICAgICAgICAgQWNjZWxlcmF0b3JzIGluIHRoZSBXaW4zMiBBUEkuICBUaGVzZSBhcmUgZXhwb3NlZCB0byB0aGUgCiAgICAgICAgICAgIHVzZXIgYnkgdGhlICA8ZnVuY3Rpb24+Q29weUFjY2VsZXJhdG9yVGFibGU8L2Z1bmN0aW9uPgoJICAgIGFuZCAgPGZ1bmN0aW9uPkNyZWF0ZUFjY2VsZXJhdG9yVGFibGU8L2Z1bmN0aW9uPiBmdW5jdGlvbnMKCSAgICBpbiB0aGUgV2luMzIgQVBJLgoJICAgIFRoZXNlIGhhdmUgYSBzaXplIG9mIDYgYnl0ZXM6CiAgICAgICAgICA8L3BhcmE+CiAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CkJZVEUgICBmVmlydDsKQllURSAgIHBhZDA7CldPUkQgICBrZXk7CldPUkQgICBjbWQ7CiAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgIDwvb3JkZXJlZGxpc3Q+CgogICAgICA8cGFyYT4KICAgICAgICBXaHkgdHdvIHR5cGVzIG9mIGFjY2VsZXJhdG9ycyBpbiB0aGUgV2luMzIgQVBJPyBXZSBjYW4gb25seQogICAgICAgIGd1ZXNzLCBidXQgbXkgYmVzdCBiZXQgaXMgdGhhdCB0aGUgV2luMzIgcmVzb3VyY2UgY29tcGlsZXIKICAgICAgICBjYW4vZG9lcyBub3QgaGFuZGxlIHN0cnVjdCBwYWNraW5nLiBXaW4zMiA8dHlwZT5BQ0NFTDwvdHlwZT4KICAgICAgICBpcyBkZWZpbmVkIHVzaW5nIDxmdW5jdGlvbj4jcHJhZ21hKDIpPC9mdW5jdGlvbj4gZm9yIHRoZQogICAgICAgIGNvbXBpbGVyIGJ1dCB3aXRob3V0IGFueSBwYWNraW5nIGZvciBSQywgc28gaXQgd2lsbCBhc3N1bWUKICAgICAgICA8ZnVuY3Rpb24+I3ByYWdtYSg0KTwvZnVuY3Rpb24+LgogICAgICA8L3BhcmE+CgogICAgPC9zZWN0MT4KCiAgICA8c2VjdDEgaWQ9ImhhcmR3YXJlLXRyYWNlIj4KICAgICAgPHRpdGxlPkRvaW5nIEEgSGFyZHdhcmUgVHJhY2U8L3RpdGxlPgoKICAgICAgPHBhcmE+CiAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIHRvIGRvIHRoaXMgaXMgdG8gcmV2ZXJzZSBlbmdpbmVlciBhCiAgICAgICAgaGFyZHdhcmUgZGV2aWNlIGZvciB3aGljaCB5b3UgZG9uJ3QgaGF2ZSBkb2N1bWVudGF0aW9uLCBidXQKICAgICAgICBjYW4gZ2V0IHRvIHdvcmsgdW5kZXIgV2luZS4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KICAgICAgICBUaGlzIGxvdCBpcyBhaW1lZCBhdCBwYXJhbGxlbCBwb3J0IGRldmljZXMsIGFuZCBpbiBwYXJ0aWN1bGFyCiAgICAgICAgcGFyYWxsZWwgcG9ydCBzY2FubmVycyB3aGljaCBhcmUgbm93IHNvIGNoZWFwIHRoZXkgYXJlCiAgICAgICAgdmlydHVhbGx5IGJlaW5nIGdpdmVuIGF3YXkuIFRoZSBwcm9ibGVtIGlzIHRoYXQgZmV3CiAgICAgICAgbWFudWZhY3R1cmVzIHdpbGwgcmVsZWFzZSBhbnkgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24gd2hpY2gKICAgICAgICBwcmV2ZW50cyBkcml2ZXJzIGJlaW5nIHdyaXR0ZW4gZm9yIFNhbmUsIGFuZCB0aGUgdHJhZGl0aW9uYWwKICAgICAgICB0ZWNobmlxdWUgb2YgdXNpbmcgRE9TZW11IHRvIHByb2R1Y2UgdGhlIHRyYWNlcyBkb2VzIG5vdCB3b3JrCiAgICAgICAgYXMgdGhlIHNjYW5uZXJzIGludmFyaWFibHkgb25seSBoYXZlIGRyaXZlcnMgZm9yIFdpbmRvd3MuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgUHJlc3VtaW5nIHRoYXQgeW91IGhhdmUgY29tcGlsZWQgYW5kIGluc3RhbGxlZCB3aW5lIHRoZSBmaXJzdAogICAgICAgIHRoaW5nIHRvIGRvIGlzIGlzIHRvIGVuYWJsZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzIHRvIHlvdXIKICAgICAgICBwYXJhbGxlbCBwb3J0LiBUbyBkbyB0aGlzIGVkaXQgPGZpbGVuYW1lPmNvbmZpZzwvZmlsZW5hbWU+CiAgICAgICAgKHVzdWFsbHkgaW4gPGZpbGVuYW1lPn4vLndpbmUvPC9maWxlbmFtZT4pIGFuZCBpbiB0aGUKICAgICAgICBwb3J0cyBzZWN0aW9uIGFkZCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcwogICAgICA8L3BhcmE+CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KcmVhZD0weDM3OCwweDM3OSwweDM3YSwweDM3YywweDc3YQp3cml0ZT0weDM3OCx4Mzc5LDB4MzdhLDB4MzdjLDB4NzdhCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIFRoaXMgYWRkcyB0aGUgbmVjZXNzYXJ5IGFjY2VzcyByZXF1aXJlZCBmb3IgU1BQL1BTMi9FUFAvRUNQCiAgICAgICAgcGFyYWxsZWwgcG9ydCBvbiBMUFQxLiBZb3Ugd2lsbCBuZWVkIHRvIGFkanVzdCB0aGVzZSBudW1iZXIKICAgICAgICBhY2NvcmRpbmdseSBpZiB5b3VyIHBhcmFsbGVsIHBvcnQgaXMgb24gTFBUMiBvciBMUFQwLgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgogICAgICAgIFdoZW4gc3RhcnRpbmcgd2luZSB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUsIHdoZXJlCiAgICAgICAgPGxpdGVyYWw+WFhYWDwvbGl0ZXJhbD4gaXMgdGhlIHByb2dyYW0geW91IG5lZWQgdG8gcnVuIGluCiAgICAgICAgb3JkZXIgdG8gYWNjZXNzIHlvdXIgc2Nhbm5lciwgYW5kIDxsaXRlcmFsPllZWVk8L2xpdGVyYWw+IGlzCiAgICAgICAgdGhlIGZpbGUgeW91ciB0cmFjZSB3aWxsIGJlIHN0b3JlZCBpbjoKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CldJTkVERUJVRz0raW8gd2luZSBYWFhYIDImZ3Q7ICZndDsoc2VkICdzL15bXjpdKjppbzpbXiBdKiAvLycgJmd0OyBZWVlZKQogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8cGFyYT4KICAgICAgICBZb3Ugd2lsbCBuZWVkIGxhcmdlIGFtb3VudHMgb2YgaGFyZCBkaXNrIHNwYWNlIChyZWFkIGh1bmRyZWRzCiAgICAgICAgb2YgbWVnYWJ5dGVzIGlmIHlvdSBkbyBhIGZ1bGwgcGFnZSBzY2FuKSwgYW5kIGZvciByZWFzb25hYmxlCiAgICAgICAgcGVyZm9ybWFuY2UgYSByZWFsbHkgZmFzdCBwcm9jZXNzb3IgYW5kIGxvdHMgb2YgUkFNLgogICAgICA8L3BhcmE+CiAgICAgIDxwYXJhPgoJWW91IHdpbGwgbmVlZCB0byBwb3N0cHJvY2VzcyB0aGUgb3V0cHV0IGludG8gYSBtb3JlIG1hbmFnZWFibGUKCWZvcm1hdCwgdXNpbmcgdGhlIDxjb21tYW5kPnNocmluazwvY29tbWFuZD4gcHJvZ3JhbS4gRmlyc3QKICAgICAgICB5b3UgbmVlZCB0byBjb21waWxlIHRoZSBzb3VyY2UgKHdoaWNoIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZgoJdGhpcyBzZWN0aW9uKToKICAgICAgPHByb2dyYW1saXN0aW5nPgpjYyBzaHJpbmsuYyAtbyBzaHJpbmsKICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgPC9wYXJhPgogICAgICA8cGFyYT4KICAgICAgICBVc2UgdGhlIDxjb21tYW5kPnNocmluazwvY29tbWFuZD4gcHJvZ3JhbSB0byByZWR1Y2UgdGhlCiAgICAgICAgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgcmF3IGxvZyBhcyBmb2xsb3dzOgogICAgICA8L3BhcmE+CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KY2F0IGxvZyB8IHNocmluayAmZ3Q7IGxvZzIKICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgPHBhcmE+CiAgICAgICAgVGhlIHRyYWNlIGhhcyB0aGUgYmFzaWMgZm9ybSBvZgogICAgICA8L3BhcmE+CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KWFhYWCAmZ3Q7IFlZIEAgWlpaWjpaWlpaCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIHdoZXJlIDxsaXRlcmFsPlhYWFg8L2xpdGVyYWw+IGlzIHRoZSBwb3J0IGluIGhleGFkZWNpbWFsIGJlaW5nCiAgICAgICAgYWNjZXNzZWQsIDxsaXRlcmFsPllZPC9saXRlcmFsPiBpcyB0aGUgZGF0YSB3cml0dGVuIChvciByZWFkKQogICAgICAgIGZyb20gdGhlIHBvcnQsIGFuZCA8bGl0ZXJhbD5aWlpaOlpaWlo8L2xpdGVyYWw+IGlzIHRoZSBhZGRyZXNzCiAgICAgICAgaW4gbWVtb3J5IG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGFjY2Vzc2VkIHRoZSBwb3J0LiBUaGUKICAgICAgICBkaXJlY3Rpb24gb2YgdGhlIGFycm93IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHdhcyB3cml0dGVuCiAgICAgICAgb3IgcmVhZCBmcm9tIHRoZSBwb3J0LgogICAgICA8L3BhcmE+CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KJmd0OyBkYXRhIHdhcyB3cml0dGVuIHRvIHRoZSBwb3J0CiZsdDsgZGF0YSB3YXMgcmVhZCBmcm9tIHRoZSBwb3J0CiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIE15IGJhc2ljIHRpcCBmb3IgaW50ZXJwcmV0aW5nIHRoZXNlIGxvZ3MgaXMgdG8gcGF5IGNsb3NlCiAgICAgICAgYXR0ZW50aW9uIHRvIHRoZSBhZGRyZXNzZXMgb2YgdGhlIElPIGluc3RydWN0aW9ucy4gVGhlaXIKICAgICAgICBncm91cGluZyBhbmQgc29tZXRpbWVzIHByb3hpbWl0eSBzaG91bGQgcmV2ZWFsIHRoZSBwcmVzZW5jZSBvZgogICAgICAgIHN1YnJvdXRpbmVzIGluIHRoZSBkcml2ZXIuIEJ5IHN0dWR5aW5nIHRoZSBkaWZmZXJlbnQgdmVyc2lvbnMKICAgICAgICB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gd29yayB0aGVtIG91dC4gRm9yIGV4YW1wbGUgY29uc2lkZXIgdGhlCiAgICAgICAgZm9sbG93aW5nIHNlY3Rpb24gb2YgdHJhY2UgZnJvbSBteSBVTUFYIEFzdHJhIDYwMFAKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CjB4Mzc4ICZndDsgNTUgQCAwMjk3OjAxZWMKMHgzN2EgJmd0OyAwNSBAIDAyOTc6MDFmNQoweDM3OSAmbHQ7IDhmIEAgMDI5NzowMWZhCjB4MzdhICZndDsgMDQgQCAwMjk3OjAyMTEKMHgzNzggJmd0OyBhYSBAIDAyOTc6MDFlYwoweDM3YSAmZ3Q7IDA1IEAgMDI5NzowMWY1CjB4Mzc5ICZsdDsgOGYgQCAwMjk3OjAxZmEKMHgzN2EgJmd0OyAwNCBAIDAyOTc6MDIxMQoweDM3OCAmZ3Q7IDAwIEAgMDI5NzowMWVjCjB4MzdhICZndDsgMDUgQCAwMjk3OjAxZjUKMHgzNzkgJmx0OyA4ZiBAIDAyOTc6MDFmYQoweDM3YSAmZ3Q7IDA0IEAgMDI5NzowMjExCjB4Mzc4ICZndDsgMDAgQCAwMjk3OjAxZWMKMHgzN2EgJmd0OyAwNSBAIDAyOTc6MDFmNQoweDM3OSAmbHQ7IDhmIEAgMDI5NzowMWZhCjB4MzdhICZndDsgMDQgQCAwMjk3OjAyMTEKMHgzNzggJmd0OyAwMCBAIDAyOTc6MDFlYwoweDM3YSAmZ3Q7IDA1IEAgMDI5NzowMWY1CjB4Mzc5ICZsdDsgOGYgQCAwMjk3OjAxZmEKMHgzN2EgJmd0OyAwNCBAIDAyOTc6MDIxMQoweDM3OCAmZ3Q7IDAwIEAgMDI5NzowMWVjCjB4MzdhICZndDsgMDUgQCAwMjk3OjAxZjUKMHgzNzkgJmx0OyA4ZiBAIDAyOTc6MDFmYQoweDM3YSAmZ3Q7IDA0IEAgMDI5NzowMjExCiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIEFzIHlvdSBjYW4gc2VlIHRoZXJlIGlzIGEgcmVwZWF0aW5nIHN0cnVjdHVyZSBzdGFydGluZyBhdAogICAgICAgIGFkZHJlc3MgPGxpdGVyYWw+MDI5NzowMWVjPC9saXRlcmFsPiB0aGF0IGNvbnNpc3RzIG9mIGZvdXIgaW8KICAgICAgICBhY2Nlc3NlcyBvbiB0aGUgcGFyYWxsZWwgcG9ydC4gTG9va2luZyBhdCBpdCB0aGUgZmlyc3QgaW8KICAgICAgICBhY2Nlc3Mgd3JpdGVzIGEgY2hhbmdpbmcgYnl0ZSB0byB0aGUgZGF0YSBwb3J0IHRoZSBzZWNvbmQKICAgICAgICBhbHdheXMgd3JpdGVzIHRoZSBieXRlIDxsaXRlcmFsPjB4MDU8L2xpdGVyYWw+IHRvIHRoZSBjb250cm9sCiAgICAgICAgcG9ydCwgdGhlbiBhIHZhbHVlIHdoaWNoIGFsd2F5cyBzZWVtcyB0bwogICAgICAgIDxsaXRlcmFsPjB4OGY8L2xpdGVyYWw+IGlzIHJlYWQgZnJvbSB0aGUgc3RhdHVzIHBvcnQgYXQgd2hpY2gKICAgICAgICBwb2ludCBhIGJ5dGUgPGxpdGVyYWw+MHgwNDwvbGl0ZXJhbD4gaXMgd3JpdHRlbiB0byB0aGUgY29udHJvbAogICAgICAgIHBvcnQuIEJ5IHN0dWR5aW5nIHRoaXMgYW5kIG90aGVyIHNlY3Rpb25zIG9mIHRoZSB0cmFjZSB3ZSBjYW4KICAgICAgICB3cml0ZSBhIEMgcm91dGluZSB0aGF0IGVtdWxhdGVzIHRoaXMsIHNob3duIGJlbG93IHdpdGggc29tZQogICAgICAgIG1hY3JvcyB0byBtYWtlIHJlYWRpbmcvd3JpdGluZyBvbiB0aGUgcGFyYWxsZWwgcG9ydCBlYXNpZXIgdG8KICAgICAgICByZWFkLgogICAgICA8L3BhcmE+CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KI2RlZmluZSByX2R0cih4KSAgICAgICAgaW5iKHgpCiNkZWZpbmUgcl9zdHIoeCkgICAgICAgIGluYih4KzEpCiNkZWZpbmUgcl9jdHIoeCkgICAgICAgIGluYih4KzIpCiNkZWZpbmUgd19kdHIoeCx5KSAgICAgIG91dGIoeSwgeCkKI2RlZmluZSB3X3N0cih4LHkpICAgICAgb3V0Yih5LCB4KzEpCiNkZWZpbmUgd19jdHIoeCx5KSAgICAgIG91dGIoeSwgeCsyKQoKLyogU2VlbXMgdG8gYmUgc2VuZGluZyBhIGNvbW1hbmQgYnl0ZSB0byB0aGUgc2Nhbm5lciAqLwppbnQgdWRwcF9wdXQoaW50IHVkcHBfYmFzZSwgdW5zaWduZWQgY2hhciBjb21tYW5kKQp7CiAgICBpbnQgbG9vcCwgdmFsdWU7CgogICAgd19kdHIodWRwcF9iYXNlLCBjb21tYW5kKTsKICAgIHdfY3RyKHVkcHBfYmFzZSwgMHgwNSk7CgogICAgZm9yIChsb29wPTA7IGxvb3AgJmx0OyAxMDsgbG9vcCsrKQogICAgICAgIGlmICgodmFsdWUgPSByX3N0cih1ZHBwX2Jhc2UpKSAmIDB4ODApIAoJewogICAgICAgICAgICB3X2N0cih1ZHBwX2Jhc2UsIDB4MDQpOwogICAgICAgICAgICByZXR1cm4gdmFsdWUgJiAweGY4OwogICAgICAgIH0KCiAgICByZXR1cm4gKHZhbHVlICYgMHhmOCkgfCAweDAxOwp9CiAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgICAgIDxwYXJhPgogICAgICAgIEZvciB0aGUgVU1BWCBBc3RyYSA2MDBQIG9ubHkgc2V2ZW4gc3VjaCByb3V0aW5lcyBleGlzdCAod2VsbAogICAgICAgIDE0IHJlYWxseSwgc2V2ZW4gZm9yIFNQUCBhbmQgc2V2ZW4gZm9yIEVQUCkuIFdoZXRoZXIgeW91CiAgICAgICAgY2hvb3NlIHRvIGRpc2Fzc2VtYmxlIHRoZSBkcml2ZXIgYXQgdGhpcyBwb2ludCB0byB2ZXJpZnkgdGhlCiAgICAgICAgcm91dGluZXMgaXMgeW91ciBvd24gY2hvaWNlLiBJZiB5b3UgZG8sIHRoZSBhZGRyZXNzIGZyb20gdGhlCiAgICAgICAgdHJhY2Ugc2hvdWxkIGhlbHAgaW4gbG9jYXRpbmcgdGhlbSBpbiB0aGUgZGlzYXNzZW1ibHkuCiAgICAgIDwvcGFyYT4KICAgICAgPHBhcmE+CiAgICAgICAgWW91IHdpbGwgcHJvYmFibHkgdGhlbiBmaW5kIGl0IHVzZWZ1bCB0byB3cml0ZSBhIHNjcmlwdC9wZXJsL0MKICAgICAgICBwcm9ncmFtIHRvIGFuYWx5c2UgdGhlIGxvZ2ZpbGUgYW5kIGRlY29kZSB0aGVtIGZ1dGhlciBhcyB0aGlzCiAgICAgICAgY2FuIHJldmVhbCBoaWdoZXIgbGV2ZWwgZ3JvdXBpbmcgb2YgdGhlIGxvdyBsZXZlbCByb3V0aW5lcy4KICAgICAgICBGb3IgZXhhbXBsZSBmcm9tIHRoZSBsb2dzIGZyb20gbXkgVU1BWCBBc3RyYSA2MDBQIHdoZW4gZGVjb2RlZAogICAgICAgIGZ1cnRoZXIgcmV2ZWFsICh0aGlzIGlzIGEgc21hbGwgc25pcHBldCkKICAgICAgPC9wYXJhPgogICAgICA8cHJvZ3JhbWxpc3Rpbmc+CnN0YXJ0OgpwdXQ6IDU1IDhmCnB1dDogYWEgOGYKcHV0OiAwMCA4ZgpwdXQ6IDAwIDhmCnB1dDogMDAgOGYKcHV0OiBjMiA4Zgp3YWl0OiBmZgpnZXQ6IGFmLDg3CndhaXQ6IGZmCmdldDogYWYsODcKZW5kOiBjYwpzdGFydDoKcHV0OiA1NSA4ZgpwdXQ6IGFhIDhmCnB1dDogMDAgOGYKcHV0OiAwMyA4ZgpwdXQ6IDA1IDhmCnB1dDogODQgOGYKd2FpdDogZmYKICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgPHBhcmE+CiAgICAgICAgRnJvbSB0aGlzIGl0IGlzIGVhc3kgdG8gc2VlIHRoYXQgPHZhcm5hbWU+cHV0PC92YXJuYW1lPgogICAgICAgIHJvdXRpbmUgaXMgb2Z0ZW4gZ3JvdXBlZCB0b2dldGhlciBpbiBmaXZlIHN1Y2Nlc3NpdmUgY2FsbHMKICAgICAgICBzZW5kaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzY2FubmVyLiBPbmNlIHRoZXNlIGFyZSB1bmRlcnN0b29kCiAgICAgICAgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGxvZ3MgZnVydGhlciB0byBzaG93IHRoZQogICAgICAgIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpbiBhbiBlYXN5IHRvIHNlZSBmb3JtYXQuIE9uY2UgdGhlCiAgICAgICAgaGlnaGVzdCBsZXZlbCBmb3JtYXQgdGhhdCB5b3UgY2FuIGRlcml2ZSBmcm9tIHRoaXMgcHJvY2VzcyBpcwogICAgICAgIHVuZGVyc3Rvb2QsIHlvdSB0aGVuIG5lZWQgdG8gcHJvZHVjZSBhIHNlcmllcyBvZiBzY2FucyB2YXJ5aW5nCiAgICAgICAgb25seSBvbmUgcGFyYW1ldGVyIGJldHdlZW4gdGhlbSwgc28geW91IGNhbiBkaXNjb3ZlciBob3cgdG8KICAgICAgICBzZXQgdGhlIHZhcmlvdXMgcGFyYW1ldGVycyBmb3IgdGhlIHNjYW5uZXIuCiAgICAgIDwvcGFyYT4KCiAgICAgIDxwYXJhPgogICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdGhlIDxmaWxlbmFtZT5zaHJpbmsuYzwvZmlsZW5hbWU+IHByb2dyYW06CiAgICAgIDxwcm9ncmFtbGlzdGluZz4KLyogQ29weXJpZ2h0IERhdmlkIENhbXBiZWxsICZsdDtjYW1wYmVsbEB0b3JxdWUubmV0Jmd0OyAqLwojaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwoKaW50IG1haW4gKHZvaWQpCnsKICAgIGNoYXIgYnVmZlsyNTZdLCBsYXN0bGluZVsyNTZdID0gIiI7CiAgICBpbnQgY291bnQgPSAwOwoKICAgIHdoaWxlICghZmVvZiAoc3RkaW4pKQogICAgewogICAgICAgIGZnZXRzIChidWZmLCBzaXplb2YgKGJ1ZmYpLCBzdGRpbik7CiAgICAgICAgaWYgKHN0cmNtcCAoYnVmZiwgbGFzdGxpbmUpKQoJewoJICAgIGlmIChjb3VudCAmZ3Q7IDEpCgkgICAgICAgIHByaW50ZiAoIiMgTGFzdCBsaW5lIHJlcGVhdGVkICVpIHRpbWVzICNcbiIsIGNvdW50KTsKCSAgICBwcmludGYgKCIlcyIsIGJ1ZmYpOwoJICAgIHN0cmNweSAobGFzdGxpbmUsIGJ1ZmYpOwoJICAgIGNvdW50ID0gMTsKCX0KICAgICAgICBlbHNlIGNvdW50Kys7CiAgICB9CiAgICByZXR1cm4gMDsKfQogICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICA8L3BhcmE+CiAgICA8L3NlY3QxPgoKICA8L2NoYXB0ZXI+Cgo8IS0tIEtlZXAgdGhpcyBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKTG9jYWwgdmFyaWFibGVzOgptb2RlOiBzZ21sCnNnbWwtcGFyZW50LWRvY3VtZW50Oigid2luZS1kZXZlbC5zZ21sIiAic2V0IiAiYm9vayIgInBhcnQiICJjaGFwdGVyIiAiIikKRW5kOgotLT4K