PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgo8bGluayBocmVmPSJzdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+Cjx0aXRsZT5MTERCIFByb2plY3RzPC90aXRsZT4KPC9oZWFkPgoKPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJ3d3dfdGl0bGUiPgogICAgICBQcm9qZWN0IGlkZWFzIGZvciB0aGUgPHN0cm9uZz5MTERCPC9zdHJvbmc+IERlYnVnZ2VyCiAgICA8L2Rpdj4KICAgIAo8ZGl2IGlkPSJjb250YWluZXIiPgoJPGRpdiBpZD0iY29udGVudCI+CiAgICAgICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJzaWRlYmFyLmluY2wiLS0+CgkJPGRpdiBpZD0ibWlkZGxlIj4KCQkJPGRpdiBjbGFzcz0icG9zdCI+CgkJCQk8aDEgY2xhc3MgPSJwb3N0aGVhZGVyIj5Qcm9qZWN0czwvaDE+CgkJCQk8ZGl2IGNsYXNzPSJwb3N0Y29udGVudCI+CgoJCQkJCSAgPHA+VGhlIGZvbGxvd2luZyBpcyBhIG1vc3RseSB1bm9yZGVyZWQgc2V0IG9mIHRoZSBpZGVhcyBmb3IgaW1wcm92ZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIExMREIgZGVidWdnZXIuICBTb21lIGFyZSBmYWlybHkgZGVlcCwgc29tZSB3b3VsZCByZXF1aXJlIGxlc3MgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmb3J0LgoJCQkJCSAgICAgPC9wPgoKCQkJCQkgIDxvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZCB1cCB0eXBlIHJlYWxpemF0aW9uIGluIGxsZGIuIKAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBwcm9ibGVtIEknbSBhZGRyZXNzaW5nIGhlcmUgaXMgdGhlIHNpdHVhdGlvbiB3aGVyZSB5b3UgYXJlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgYSBsYXJnZSBwcm9ncmFtIChsbGRiIGJ1aWx0IHdpdGggZGVidWcgY2xhbmcvc3dpZnQgd2lsbCBkbykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB5b3UgZ28gdG8gcHJpbnQgYSBzaW1wbGUgZXhwcmVzc2lvbiwgYW5kIGxsZGIgZ29lcyBhd2F5IGZvciAzMCBzZWNvbmRzLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4geW91IHNhbXBsZSBpdCwgaXQgaXMgYWx3YXlzIGJ1c2lseSBjaHVybmluZyB0aHJvdWdoIGFsbCB0aGUgQ1UncyBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQgbG9va2luZyBmb3Igc29tZXRoaW5nLiCgVGhlIHByb2JsZW0gaXNuJ3QgdGhhdCBsb29raW5nIGZvciBzb21ldGhpbmcgaW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgaXMgc2xvdywgYnV0IHJhdGhlciB0aGF0IHdlIHNvbWVob3cgdHVybmVkIGFuIGJvdW5kZWQgc2VhcmNoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5YmUgYSBzdWJ0eXBlIG9mICJzdGQ6OnN0cmluZyIgaW50byBhbiB1bmJvdW5kZWQgc2VhcmNoIChhbGwgdGhpbmdzIHdpdGggdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoYXQgc3VidHlwZS4pIKBPciBkaWRuJ3Qgc3RvcCB3aGVuIHdlIGdvdCBhIHJlYXNvbmFibGUgYW5zd2VyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94aW1hdGUgdG8gdGhlIGNvbnRleHQgb2YgdGhlIHNlYXJjaCwgYnV0IGxldCB0aGUgc2VhcmNoIGxlYWsgb3V0IGdsb2JhbGx5LiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kIHF1aXRlIGxpa2VseSB0aGVyZSBhcmUgb3RoZXIgaXNzdWVzIHRoYXQgSSBoYXZlbid0IGd1ZXNzZWQgeWV0LiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0IGlmIHlvdSBlbmQgdXAgY2h1cm5pbmcgdGhvdWdoIDMgb3IgNCBHaWcgb2YgZGVidWcgaW5mbywgdGhhdCdzIGdvaW5nIHRvIGJlIHNsb3cgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG1hdHRlciBob3cgd2VsbCB3cml0dGVuIHlvdXIgZGVidWcgcmVhZGVyIGlzLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXkgZ3Vlc3MgaXMgdGhlIHdvcmsgd2lsbCBiZSBtb3JlIGluIHRoZSBnZW5lcmFsIHN5bWJvbCBsb29rdXAgdGhhbiBpbiB0aGUgRFdBUkYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciBpbiBwYXJ0aWN1bGFyLCBidXQgaXQgbWF5IGJlIGEgY29tYmluYXRpb24gb2YgYm90aC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcyBhIHVzZXIgZGVidWdnaW5nIGEgbGFyZ2lzaCBwcm9ncmFtLCB0aGlzIGlzIHRoZSBtb3N0IG9idmlvdXMgbGFtZW5lc3Mgb2YgbGxkYi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgbmFtZSBjb21wbGV0aW9uIGluIHRoZSBleHByZXNzaW9uIHBhcnNlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgb3RoZXIgb2J2aW91cyBsYW1lbmVzcyBvZiBsbGRiLiCgWW91IGNhbiBkbzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KPGNvZGU+PHByZT48dHQ+CihsbGRiKSBmcmFtZSB2YXIgZm9vLmI8VEFCPgo8L3R0PjwvcHJlPjwvY29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2Ugd2lsbCB0ZWxsIHlvdSBpdCBpcyAiZm9vLmJhciIuICBCdXQgeW91IGNhbid0IGRvIHRoYXQgaW4gdGhlIGV4cHJlc3Npb24gcGFyc2VyLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIHJlcXVpcmUgY29sbGFib3JhdGlvbiB3aXRoIHRoZSBjbGFuZy9zd2lmdCBmb2xrcyB0byBnZXQgdGhlIHJpZ2h0IGV4dGVuc2lvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzIGluIHRoZSBjb21waWxlci4gQW5kIHdoYXRldmVyIHRoZXkgYXJlLCBsbGRiIHdpbGwgbmVlZCB1c2UgdGhlbSB0byB0ZWxsIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgYWJvdXQgd2hhdCBuYW1lcyBhcmUgYXZhaWxhYmxlLiAgSXQgd2lsbCBiZSBpbXBvcnRhbnQgdG8gYXZvaWQgdGhlIHBpdGZhbGxzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAjMSB3aGVyZSB3ZSB3YW5kZXIgaW50byB0aGUgZW50aXJlIERXQVJGIHdvcmxkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYSBoaWdoIHNwZWVkIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIGNoYW5uZWwgdG8gcmVwbGFjZSB0aGUgZ2RiLXJlbW90ZSBwcm90b2NvbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgbGxkYiBkZWJ1Z2dpbmcgbm93YWRheXMgaXMgZG9uZSBieSB0YWxraW5nIHRvIGEgZGVidWcgYWdlbnQuICBXZSB1c2VkIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiLXJlbW90ZSBwcm90b2NvbCBiZWNhdXNlIHRoYXQgaXMgdW5pdmVyc2FsLCBhbmQgZ29vZCBlbm91Z2gsIGFuZCB5b3UgaGF2ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcG9ydCBpdCBhbnl3YXkgc2luY2Ugc28gbWFueSBsaXR0bGUgZGV2aWNlcyAmIEpUQUcncyBhbmQgVk0ncyBldGMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgaXQuICBCdXQgaXQgaXMgcmVhbGx5IG9sZCwgbm90IHRlcnJpYmx5IGhpZ2ggcGVyZm9ybWFuY2UsIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuJ3QgcmVhbGx5IGhhbmRsZSBzZW5kaW5nIG9yIHJlY2VpdmluZyBtZXNzYWdlcyB3aGlsZSB0aGUgcHJvY2VzcyBpcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9zZWRseSBydW5uaW5nLiAgSXQgc2hvdWxkIGhhdmUgY29tcHJlc3Npb24gYnVpbHQgaW4sIHJlbW92ZSB0aGUgaGFuZC1idWlsdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1zIGFuZCByZWx5IG9uIHRoZSByb2J1c3QgY29tbXVuaWNhdGlvbiBwcm90b2NvbHMgd2UgYWx3YXlzIGhhdmUgbm93YWRheXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGZvciBvdXQtb2Ytb3JkZXIgcmVxdWVzdHMvcmVwbGllcywgYWxsb3cgZm9yIHJlY29ubmVjdGluZyB0byBhIHRlbXBvcmFyaWx5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgZGVidWcgc2Vzc2lvbiwgcmVndWxhcml6ZSBhbGwgb2YgdGhlIHBhY2tldCBmb3JtYXR0aW5nIGludG8gSlNPTiBvciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNPTiBvciB3aGF0ZXZlciB3aGlsZSBpbmNsdWRpbmcgYSB3YXkgdG8gZG8gbGFyZ2UgYmluYXJ5IHRyYW5zZmVycy4gIEl0IG11c3QgYmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIGNvbWUgdXAgd2l0aCBzb21ldGhpbmcgZmFzdGVyLCBhbmQgYmV0dGVyIHR1bmFibGUgZm9yIHRoZSBtYW55IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBwYXRod2F5cyB3ZSBlbmQgdXAgc3VwcG9ydGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggbG9jYWwgdmFyaWFibGUgbG9va3VwIGluIHRoZSBsbGRiIGV4cHJlc3Npb24gcGFyc2VyLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5qZWN0aW9uIG9mIGxvY2FsIHZhcmlhYmxlcyBpbnRvIHRoZSBjbGFuZyBleHByZXNzaW9uIHBhcnNlciBpcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGRvbmUgaW5jb3JyZWN0bHkgLSBpdCBoYXBwZW5zIHRvbyBsYXRlIGluIHRoZSBsb29rdXAuICBUaGlzIHJlc3VsdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbmFtZXNwYWNlIHZhcmlhYmxlcyAmIGZ1bmN0aW9ucywgc2FtZSBuYW1lZCB0eXBlcyBhbmQgaXZhcnMgc2hhZG93aW5nIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMgd2hlbiBpdCBzaG91bGQgYmUgdGhlIG90aGVyIHdheSBhcm91bmQuICBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJ5IG1hbnVhbGx5IGluc2VydGluZyBhbGwgdGhlIHZpc2libGUgbG9jYWwgdmFyaWFibGVzIGludG8gd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZXhwcmVzc2lvbiB0ZXh0LiAgVGhpcyBtb3N0bHkgZ2V0cyB0aGUgam9iIGRvbmUgYnV0IHRoYXQgbWV0aG9kIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB5b3UgaGF2ZSB0byByZWFsaXplIGFsbCB0aGUgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxvY2F0aW9ucyBvZiBhbGwgbG9jYWwgdmFyaWFibGVzIGZvciBldmVuIHRoZSBzaW1wbGVzdCBvZiBleHByZXNzaW9ucywgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gcnVuIG9uIGxhcmdlIHByb2dyYW1zIChlLmcuIGxsZGIpIGl0IHdvdWxkIGNhdXNlIHVuYWNjZXB0YWJsZSBkZWxheXMuICBBbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2FzIHZlcnkgZnJhZ2lsZSBzaW5jZSBhbiBlcnJvciBpbiByZWFsaXppbmcgYW55IG9mIHRoZSBsb2NhbHMgd291bGQgY2F1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGV4cHJlc3Npb25zIHJ1biBpbiB0aGF0IGNvbnRleHQgdG8gZmFpbC4gIFdlIG5lZWQgdG8gZml4IHRoaXMgYnkgYWRqdXN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwb2ludHMgd2hlcmUgbmFtZSBsb29rdXAgY2FsbHMgb3V0IHRvIGxsZGIgaW4gY2xhbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggdGhlIGV2ZW50IGhhbmRsaW5nL3Byb2Nlc3MgY29udHJvbCBtYWNoaW5lcnkgdG8gc3VwcG9ydCBjYWxsaW5nIFNCICYgQ29tbWFuZHMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeXdoZXJlLCBhbmQgdG8gc3VwcG9ydCBub24tc3RvcCBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBhIGZhaXJseSBhZC1ob2Mgc3lzdGVtIHRvIGhhbmRsZSB3aGVuIGl0IGlzIHNhZmUgdG8gcnVuIFNCIEFQSSdzIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lIGNvbW1hbmRzLiAgVGhpcyBpcyBhY3R1YWxseSBhIGJpdCBvZiBhIHRyaWNreSBwcm9ibGVtLCBzaW5jZSB3ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgYWNjZXNzIHRvIHRoZSBjb21tYW5kIGxpbmUgYW5kIFNCIEFQSSBmcm9tIHNvbWUgZnVua3kgcGxhY2VzIGluIGxsZGIuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT3BlcmF0aW5nIFN5c3RlbSBwbHVnaW5zIGFyZSB0aGUgbW9zdCBvYnZpb3VzIGluc3RhbmNlLCBzaW5jZSB0aGV5IGdldCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHJpZ2h0IGFmdGVyIGxsZGIgaXMgdG9sZCBieSBkZWJ1Z3NlcnZlciB0aGF0IHRoZSBwcm9jZXNzIGhhcyBzdG9wcGVkLCBidXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBpdCBoYXMgZmluaXNoZWQgY29sbGF0aW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdG9wIGZvciBwcmVzZW50YXRpb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBoaWdoZXIgbGV2ZWxzLiAgQnV0IGJyZWFrcG9pbnQgY2FsbGJhY2tzIGhhdmUgc29tZSBvZiB0aGUgc2FtZSBwcm9ibGVtcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvdGhlciB0aGluZ3MgbGlrZSB0aGUgc2NyaXB0ZWQgc3RlcHBpbmcgb3BlcmF0aW9ucyBhbmQgYW55IGZhbmNpZXIgZXh0ZW5zaW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgd2Ugd2FudCB0byBhZGQgdG8gdGhlIGRlYnVnZ2VyIGFyZSBnb2luZyB0byBiZSBoYXJkIHRvIGltcGxlbWVudCByb2J1c3RseSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsbCB3ZSB3b3JrIG9uIGEgZmluZXItZ3JhaW5lZCBhbmQgbW9yZSBleHBsaWNpdCBjb250cm9sIG92ZXIgd2hvIGdldHMgdG8gY29udHJvbCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2Nlc3Mgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgYWxzbyB3b24ndCBoYXZlIGFueSBjaGFuY2Ugb2Ygc3VwcG9ydGluZyBub24tc3RvcCBkZWJ1Z2dpbmcgLSB3aGljaCBpcyBhIHVzZWZ1bAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGZvciBwcm9ncmFtcyB0aGF0IGhhdmUgYSBsb3Qgb2YgaGlnaC1wcmlvcml0eSBvciByZWFsLXRpbWUgd29ya2VyIHRocmVhZHMgLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgd2UgZ2V0IHRoaXMgc29ydGVkIG91dC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2ggdGhlIGxhbmd1YWdlIGFic3RyYWN0aW9uIGFuZCByZW1vdmUgYWxsIHRoZSB1bm5lY2Vzc2FyeSBDKysvY2xhbmctYmFzZWQgQVBJJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBpbXBvcnRhbnQgcGFydCBvZiBtYWtpbmcgbGxkYiBhIG1vcmUgdXNlZnVsICJkZWJ1Z2dlciB0b29sa2l0IiBhcyBvcHBvc2VkIHRvIGEgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMvQysrL09iakMvU3dpZnQgZGVidWdnZXIgaXMgdG8gaGF2ZSBhIGNsZWFuIGFic3RyYWN0aW9uIGZvciBsYW5ndWFnZSBzdXBwb3J0LiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgZGlkIG1vc3QsIGJ1dCBub3QgYWxsLCBvZiB0aGUgcGh5c2ljYWwgc2VwYXJhdGlvbi4goFdlIG5lZWQgdG8gZmluaXNoIHRoYXQuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmQgdGhlbiBieSBmb3JjZSBvZiBuZWNlc3NpdHkgdGhlIEFQSSdzIHJlYWxseSBsb29rIGxpa2UgdGhlIGludGVyZmFjZSB0byBhIEMrKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBzeXN0ZW0gd2l0aCBhIGZldyBzd2lmdCBiaXRzIGFkZGVkIG9uLiCgSG93IHlvdSB3b3VsZCBnbyBhYm91dCBhZGRpbmcgYSBuZXcgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIGlzIHVuY2xlYXIgYW5kIG11Y2ggbW9yZSB0cm91YmxlIHRoYW4gaXQgaXMgd29ydGggYXQgcHJlc2VudC4gIEJ1dCBpZiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgbWFkZSB0aGlzIG5pY2UsIHdlIGNvdWxkIGFkZCBhIGxvdCBvZiB2YWx1ZSB0byBvdGhlciBsYW5ndWFnZSBwcm9qZWN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgc29tZSBzeW50YXggdG8gZ2VuZXJhdGUgZGF0YSBmb3JtYXR0ZXJzIGZyb20gdHlwZSBkZWZpbml0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXMgb2YgdGhlIGRhdGEgZm9ybWF0dGVycyBmYWxsIGludG8gdHdvIHR5cGVzLiAgVGhlcmUgYXJlIGRhdGEgZm9ybWF0dGVycyBmb3IgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIHdoZXJlIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgcHJldHR5IG11Y2ggdGVsbCB5b3UgaG93IHRvIHByZXNlbnQgdGhlIGRhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UganVzdCBuZWVkIGEgbGl0dGxlIGV4cHJlc3Npb24gbGFuZ3VhZ2UgdG8gZXhwcmVzcyBob3cgdG8gdHVybiB0aGVtIGludG8gd2hhdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgZXhwZWN0cyB0byBzZWUuICBUaGVuIHRoZXJlIGFyZSB0aGUgb25lcyAobGlrZSBwcmV0dHkgbXVjaCBhbGwgb3VyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uL0FwcEtpdC9VSUtpdCBmb3JtYXR0ZXJzKSB0aGF0IHVzZSBkZWVwIG1hZ2ljIHRvIGZpZ3VyZSBvdXQgaG93IHRoZSB0eXBlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhY3R1YWxseSBsYWlkIG91dC4gIFRoZSBsYXR0ZXIgYXJlIHByZXR0eSBtdWNoIGFsd2F5cyBnb2luZyB0byBoYXZlIHRvIGJlIGRvbmUgYnkgaGFuZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXQgZm9yIHRoZSBvbmVzIHdoZXJlIHRoZSBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGhlIGZpZWxkcywgaXQgd291bGQgYmUgZ3JlYXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhhdmUgYSB3YXkgdG8gZXhwcmVzcyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHByb2R1Y2Ugc3VtbWFyaWVzIGFuZCBjaGlsZHJlbiBpbiBzb21lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtIHlvdSBjb3VsZCBlbWJlZCBuZXh0IHRvIHRoZSB0eXBlcyBhbmQgaGF2ZSB0aGUgY29tcGlsZXIgcHJvZHVjZSBhIGJ5dGUgY29kZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCB0aGVuIG1ha2UgdGhhdCBhdmFpbGFibGUgdG8gbGxkYiBhbG9uZyB3aXRoIHRoZSBsaWJyYXJ5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzbid0IGFzIHNpbXBsZSBhcyBoYXZpbmcgY2xhbmcgcnVuIG92ZXIgdGhlIGhlYWRlcnMgYW5kIHByb2R1Y2Ugc29tZXRoaW5nIGZyb20gdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBkaXJlY3RseS4gIEFmdGVyIGFsbCwgY2xhbmcgaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoYXQgdGhlIGludGVyZXN0aW5nIHRoaW5nIGFib3V0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0ZDo6dmVjdG9yIGlzIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBnZXQgYnkgY2FsbGluZyBzaXplIChmb3IgdGhlIHN1bW1hcnkpIGFuZCBbXSBmb3IgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbGVtZW50cy4gIEJ1dCBpdCBzaG91bGRuJ3QgYmUgaGFyZCB0byBjb21lIHVwIHdpdGggYSBnZW5lcmljIG1hcmt1cCB0byBleHByZXNzIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgdGhlIGV4cHJlc3Npb24gcGFyc2VyIHRvIGFjY2VzcyBkeW5hbWljIHR5cGUvZGF0YSBmb3JtYXR0ZXIgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNlZW1zIGxpa2UgYSBzbWFsbGVyIG9uZS4gIFRoZSBzeW1wdG9tIGlzIHlvdXIgb2JqZWN0IGlzIEZvbyBjaGlsZCBvZiBCYXIsIGFuZCBpbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIExvY2FscyB2aWV3IHlvdSBzZWUgYWxsIHRoZSBmaWVsZHMgb2YgRm9vLCBidXQgYmVjYXVzZSB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG9iamVjdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgQmFyLCB5b3UgY2FuJ3Qgc2VlIGFueSBvZiB0aGUgZmllbGRzIG9mIEZvby4gIEJ1dCBpZiB5b3UgY291bGQgZ2V0IHRoaXMgd29ya2luZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBjb3VsZCBoaWphY2sgdGhlIG1lY2hhbmlzbSB0byBtYWtlIHRoZSByZXN1bHRzIG9mIHRoZSB2YWx1ZSBvYmplY3Qgc3VtbWFyaWVzL3N5bnRoZXRpYyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gYXZhaWxhYmxlIHRvIGV4cHJlc3Npb25zLiAgQW5kIGlmIHlvdSBjYW4gZG8gdGhhdCwgeW91IGNvdWxkIGFkZCBvdGhlciBwcm9wZXJ0aWVzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbiBvYmplY3QgZXh0ZXJuYWxseSAodGhyb3VnaCBQeXRob24gb3Igc29tZSBvdGhlciBleHRlbnNpb24gcG9pbnQpIGFuZCB0aGVuIGhhdmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXNlIGFsc28gYXZhaWxhYmxlIGluIHRoZSBleHByZXNzaW9uIHBhcnNlci4gIFlvdSBjb3VsZCB1c2UgdGhpcyB0byBleHByZXNzIGludmFyaWFudHMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkYXRhIHN0cnVjdHVyZXMsIG9yIG90aGVyIG1vcmUgYWR2YW5jZWQgdXNlcyBvZiB0eXBlcyBpbiB0aGUgZGVidWdnZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciB2ZXJzaW9uIG9mIHRoaXMgaXMgdG8gYWxsb3cgYWNjZXNzIHRvIHN5bnRoZXRpYyBjaGlsZHJlbiBpbiB0aGUgZXhwcmVzc2lvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLiAgT3RoZXJ3aXNlIHlvdSBlbmQgdXAgaW4gc2l0dWF0aW9ucyBsaWtlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgo8Y29kZT48cHJlPjx0dD4KKGxsZGIpIHByaW50IHJldHVybl9hX2ZvbygpCihTb21lVmVjdG9yTGlrZVR5cGUpICQxID0gewogIFswXSA9IDAKICBbMV0gPSAxCiAgWzJdID0gMgogIFszXSA9IDMKICBbNF0gPSA0Cn0KPC90dD48L3ByZT48L2NvZGU+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoYXQncyBnb29kIGJ1dDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KPGNvZGU+PHByZT48dHQ+CihsbGRiKSBwcmludCByZXR1cm5fYV9mb28oKVsyXQo8L3R0PjwvcHJlPjwvY29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHMgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiBwYXJzZXIgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBhcnJheS1saWtlIG5hdHVyZSBvZiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWVWZWN0b3JMaWtlVHlwZSB0aGF0IGl0IGdldHMgZnJvbSB0aGUgc3ludGhldGljIGNoaWxkcmVuLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY292ZXIgdGhyZWFkIGluZm9ybWF0aW9uIGxhemlseQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMREIgc3RvcmVzIGFsbCB0aGUgdXNlciBpbnRlbnRpb25zIGZvciBhIHRocmVhZCBpbiB0aGUgVGhyZWFkUGxhbnMgc3RvcmVkIGluIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgVGhyZWFkIGNsYXNzLiAgVGhhdCBhbGxvd3MgdXMgdG8gcmVsaWFibHkgaW1wbGVtZW50IGEgdmVyeSBuYXR1cmFsIG1vZGVsIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VycyBtb3ZpbmcgdGhyb3VnaCBhIGRlYnVnIHNlc3Npb24uICBGb3IgZXhhbXBsZSwgaWYgc3RlcC1vdmVyIHN0b3BzIGF0IGEgYnJlYWtwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbiBmdW5jdGlvbiBpbiBhIHlvdW5nZXIgcmVnaW9uIG9mIHRoZSBzdGFjaywgY29udGludWUgd2lsbCBjb21wbGV0ZSB0aGUgc3RlcC1vdmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGhhdmluZyB0byBtYW51YWxseSBzdGVwIG91dC4gIEJ1dCB0aGF0IG1lYW5zIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFRocmVhZCBvYmplY3RzIGxpdmUgYXMgbG9uZyBhcyB0aGUgVGhyZWFkcyB0aGV5IHJlcHJlc2VudC4gIEZvciBwcm9ncmFtcyB3aXRoIG1hbnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkcywgYnV0IG9ubHkgb25lIHRoYXQgeW91IGFyZSBkZWJ1Z2dpbmcsIHRoYXQgbWFrZXMgc3RlcHBpbmcgbGVzcyBlZmZpY2llbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIG5vdyB5b3UgaGF2ZSB0byBmZXRjaCB0aGUgdGhyZWFkIGxpc3Qgb24gZXZlcnkgc3RlcCBvciBzdGVwcGluZyBkb2Vzbid0IHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgVGhpcyBpcyBlc3BlY2lhbGx5IGFuIGlzc3VlIHdoZW4gdGhlIHRocmVhZHMgYXJlIHByb3ZpZGVkIGJ5IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGluZyBTeXN0ZW0gcGx1Z2luLCB3aGVyZSBpdCBtYXkgdGFrZSBub24tdHJpdmlhbCB3b3JrIHRvIHJlY29uc3RydWN0IHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIGxpc3QuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZmV0Y2ggdGhyZWFkcyBsYXppbHkgYnV0IGtlZXAgInVuc2VlbiIgdGhyZWFkcyBpbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBob2xkaW5nIGFyZWEsIGFuZCBvbmx5IHJldGlyZSB0aGVtIHdoZW4gd2Uga25vdyB3ZSd2ZSBmZXRjaGVkIHRoZSB3aG9sZSB0aHJlYWQgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZW5zdXJlZCB0aGV5IGFyZSBubyBsb25nZXIgYWxpdmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBicmVha3BvaW50IHNlYXJjaCBtYWNoaW5lcnkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCBhbGxvdyBoaWdobHkgY3VzdG9taXphYmxlLCBhbGdvcml0aG1pYyBicmVha3BvaW50IHR5cGVzLCBsaWtlICJicmVhayBvbiBldmVyeSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIG9mIHNvbWUgcGFydGljdWxhciBpbnN0cnVjdGlvbiwgb3IgaW5zdHJ1Y3Rpb24gcGF0dGVybiwgZXRjLiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSBQeXRob24tYmFja2VkIGNvbW1hbmRzIGZpcnN0IGNsYXNzIGNpdGl6ZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXMgaXQgc3RhbmRzLCBQeXRob24gY29tbWFuZHMgaGF2ZSBubyB3YXkgdG8gYWR2ZXJ0aXNlIHRoZWlyIG9wdGlvbnMuICBUaGV5IGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBwYXJzZSB0aGVpciBhcmd1bWVudHMgYnkgaGFuZC4gIFRoYXQgbGVhZHMgdG8gaW5jb25zaXN0ZW5jeSwgYW5kIG1vcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50bHkgbWVhbnMgdGhleSBjYW4ndCB0YWtlIGFkdmFudGFnZSBvZiBhdXRvLWdlbmVyYXRlZCBoZWxwIGFuZCBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uICBUaGlzIGxlYXZlcyBweXRob24tYmFja2VkIGNvbW1hbmRzIGZlZWxpbmcgd29yc2UgdGhhbiBidWlsdC1pbiBvbmVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzIHBhcnQgb2YgdGhpcyBqb2IsIGl0IHdvdWxkIGFsc28gYmUgZ3JlYXQgdG8gaG9vayBhdXRvbWF0aWNhbGx5IGhvb2sgdGhlICJ0eXBlIiBvZiBhbiBvcHRpb24gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXJndW1lbnQgKGUuZy4gZUFyZ1R5cGVTaGxpYk5hbWUpIHRvIHNlbnNpYmxlIGRlZmF1bHQgY29tcGxldGVycy4gIFlvdSBuZWVkIHRvIGJlIGFibGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Zlci1yaWRlIHRoaXMgaW4gbW9yZSBjb21wbGljYXRlZCBzY2VuYXJpb3MgKGxpa2UgaW4gImJyZWFrIHNldCIgd2hlcmUgdGhlIHByZXNlbmNlIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgIi1zIiBvcHRpb24gbGltaXRzIHRoZSBzZWFyY2ggZm9yIGNvbXBsZXRpb24gb2YgYSAiLW4iIG9wdGlvbi4pICBCdXQgaW4gY29tbW9uIGNhc2VzIGl0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubmVjZXNzYXJ5IGJ1c3ktd29yayB0byBoYXZlIHRvIHN1cHBseSB0aGUgY29tcGxldGVyIEFORCB0aGUgdHlwZS4gIElmIHRoaXMgd29ya2VkLCB0aGVuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3b3VsZCBiZSBlYXNpZXIgZm9yIFB5dGhvbiBjb21tYW5kcyB0byBhbHNvIGdldCBjb3JyZWN0IGNvbXBsZXRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVpbXBsZW1lbnQgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIgY29tbWFuZHMgdXNpbmcgdGhlIFNCIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSwgYWxsIHRoZSBDb21tYW5kT2JqZWN0OjpEb0V4ZWN1dGUgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBsbGRiX3ByaXZhdGUgQVBJJ3MuICBUaGF0IGdlbmVyYWxseSBtZWFucyB0aGF0IHRoZXJlJ3MgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGdldHMgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSBDb21tYW5kT2JqZWN0IGFuZCB0aGUgU0IgQVBJIHRoYXQgZG9lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VnaGx5IHRoZSBzYW1lIHRoaW5nLiAgV2Ugd291bGQgcmVkdWNlIHRoaXMgY29kZSBkdXBsaWNhdGlvbiwgcHJlc2VudCBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBjb2hlcmVudCBmYWNlIHRvIHRoZSB1c2VycyBvZiBsbGRiLCBhbmQga2VlcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJzZWx2ZXMgbW9yZSBob25lc3QgYWJvdXQgd2hhdCB3ZSBuZWVkIGluIHRoZSBTQiBBUEkncyBpZiB3ZSBpbXBsZW1lbnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZE9iamVjdHM6OkRvRXhlY3V0ZSBtZXRob2RzIHVzaW5nIHRoZSBTQiBBUEkncy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVFcsIGl0IGlzIG9ubHkgdGhlIHdheSBpdCB3YXMgbXVjaCBlYXNpZXIgdG8gZGV2ZWxvcCBsbGRiIGlmIGl0IGhhZCBhIGZ1bmN0aW9uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtbGluZSBlYXJseSBvbi4gIFNvIHdlIGRpZCB0aGF0IGZpcnN0LCBhbmQgZGV2ZWxvcGVkIHRoZSBTQiBBUEkncyB3aGVuIGxsZGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIG1vcmUgbWF0dXJlLiAgVGhlcmUncyBubyBnb29kIHRlY2huaWNhbCByZWFzb24gdG8gaGF2ZSB0aGUgY29tbWFuZHMgdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbGRiX3ByaXZhdGUgQVBJJ3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBhbmQgYmV0dGVyIGV4YW1wbGVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlIG5lZWQgdG8gcHV0IHRoZSBsbGRiIHN5bnRheCBkb2NzIGluIHRoZSB0dXRvcmlhbCBzb21ld2hlcmUgdGhhdCBpcyBtb3JlIGVhc2lseSBhY2Nlc3NpYmxlLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIHN1Z2dlc3Rpb24gaXMgdG8gYWRkIG5vbi1jb21tYW5kIGJhc2VkIGhlbHAgdG8gdGhlIGhlbHAgc3lzdGVtLCBhbmQgdGhlbiBoYXZlIGEgImhlbHAgbGxkYiIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICJoZWxwIHN5bnRheCIgdHlwZSBjb21tYW5kIHdpdGggdGhpcyBpbmZvLiAgQmUgbmljZSBpZiB0aGUgbm9uLWNvbW1hbmQgYmFzZWQgaGVscCBjb3VsZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaGllcmFyY2hpY2FsIHNvIHlvdSBjb3VsZCBtYWtlIHRvcGljcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUncyBhIGZhaXIgYml0IG9mIGRvY3MgYWJvdXQgdGhlIFNCIEFQSSdzLCBidXQgaXQgaXMgc3BvdHR5LiAgU29tZSBjbGFzc2VzIGFyZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsbCBkb2N1bWVudGVkIGluIHRoZSBQeXRob24gImhlbHAgKGxsZGIuU0JXaGF0ZXZlcikiIGFuZCBzb21lIGFyZSBub3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSBuZWVkIG1vcmUgY29uY2VwdHVhbCBkb2NzLiAgQW5kIHdlIG5lZWQgbW9yZSBleGFtcGxlcy4gIEFuZCB3ZSBjb3VsZCBwcm92aWRlIGEgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuIHBsdWdnYWJsZSBleGFtcGxlIGZvciB1c2luZyBMTERCIHN0YW5kYWxvbmUgZnJvbSBQeXRob24uICBUaGUgcHJvY2Vzc19ldmVudHMucHkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGEgc3RhcnQgb2YgdGhpcywgYnV0IGl0IGp1c3QgaGFuZGxlcyBwcm9jZXNzIGV2ZW50cywgYW5kIGl0IGlzIHJlYWxseSBhIHF1aWNrIHNrZXRjaCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgcG9saXNoZWQgZXhwYW5kYWJsZSBwcm90by10b29sLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYSBtb3JlIGFjY2Vzc2libGUgcGx1Z2luIGFyY2hpdGVjdHVyZSBmb3IgbGxkYi4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgbm93LCB5b3UgY2FuIG9ubHkgdXNlIHRoZSBQeXRob24gb3IgU0IgQVBJJ3MgdG8gZXh0ZW5kIGFuIGV4dGFudCBsbGRiLiAgWW91IGNhbid0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnQgYW55IG9mIHRoZSBhY3R1YWwgbGxkYiBQbHVnaW5zIGFzIHBsdWdpbnMuICBUaGF0IG1lYW5zIGFueWJvZHkgdGhhdCB3YW50cyB0byAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkIG5ldyBPYmplY3QgZmlsZS9Qcm9jZXNzL0xhbmd1YWdlIGV0YyBzdXBwb3J0IGhhcyB0byBidWlsZCBhbmQgZGlzdHJpYnV0ZSB0aGVpciBvd24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsZGIuICBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIHRoZSBBUEkncyB0aGUgcGx1Z2lucyB1c2UgYXJlIGN1cnJlbnRseSBub3Qgc3RhYmxlIChhbmQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VudGx5IGhhdmUgYmVlbiBjaGFuZ2luZyBxdWl0ZSBhIGxvdC4pICBXZSB3b3VsZCBoYXZlIHRvIGRlZmluZSBhIHN1YnNldCBvZiBsbGRiX3ByaXZhdGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgeW91IGNvdWxkIHVzZSwgYW5kIHNvbWUgd2F5IG9mIHRlbGxpbmcgd2hldGhlciB0aGUgcGx1Z2lucyB3ZXJlIGNvbXBhdGlibGUgd2l0aCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxsZGIuICBCdXQgbG9uZy10ZXJtLCBtYWtpbmcgdGhpcyBzb3J0IG9mIGV4dGVuc2lvbiBwb3NzaWJsZSB3aWxsIG1ha2UgbGxkYiBtb3JlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYWxpbmcgZm9yIHJlc2VhcmNoIGFuZCAzcmQgcGFydHkgdXNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgaW5zdHJ1Y3Rpb24gZW11bGF0aW9uIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBzd2FwcGluZyB0cmFwIGFuZCBpbnN0cnVjdGlvbiBmb3IgYnJlYWtwb2ludHMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXQgcHJlc2VudCwgYnJlYWtwb2ludHMgYXJlIGltcGxlbWVudGVkIGJ5IGluc2VydGluZyBhIHRyYXAgaW5zdHJ1Y3Rpb24sIHRoZW4gd2hlbiB0aGUgdHJhcCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaGl0LCByZXBsYWNlIHRoZSB0cmFwIHdpdGggdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBhbmQgc2luZ2xlIHN0ZXAuICBUaGVuIHN3YXAgYmFjayBhbmQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlLiAgVGhpcyBjYXVzZXMgcHJvYmxlbXMgZm9yIHJlYWQgb25seSB0ZXh0LCBhbmQgYWxzbyBtZWFucyB0aGF0IG5vLXN0b3AgZGVidWdnaW5nIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3QgZWl0aGVyIHN0b3AgYWxsIHRocmVhZHMgYnJpZWZseSB0byBoYW5kbGUgdGhpcyB0d28tc3RlcCBvciByaXNrIG1pc3Npbmcgc29tZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludCBoaXRzLiAgSWYgeW91IGVtdWxhdGVkIHRoZSBpbnN0cnVjdGlvbiBhbmQgd3JvdGUgYmFjayB0aGUgcmVzdWx0cywgeW91IHdvdWxkbid0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRoZXNlIHByb2JsZW1zLCBhbmQgaXQgd291bGQgYWxzbyBzYXZlIGEgc3RvcCBwZXIgYnJlYWtwb2ludCBoaXQuICBTaW5jZSB3ZSB1c2UgYnJlYWtwb2ludHMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGltcGxlbWVudCBzdGVwcGluZywgdGhpcyBzYXZpbmdzIGNvdWxkIGJlIHNpZ25pZmljYW50IG9uIHNsb3cgY29ubmVjdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIEpJVCB0byBzcGVlZCB1cCBjb25kaXRpb25hbCBicmVha3BvaW50IGV2YWx1YXRpb24KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgYWxyZWFkeSBKSVQgYW5kIGNhY2hlIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9ucyBmb3IgYnJlYWtwb2ludHMgZm9yIHRoZSBDIGZhbWlseSBvZiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VzLCBzbyB3ZSBhcmVuJ3QgcmUtY29tcGlsaW5nIGV2ZXJ5IHRpbWUgeW91IGhpdCB0aGUgYnJlYWtwb2ludC4gIEFuZCBpZiB3ZSBjb3VsZG4ndCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVIgaW50ZXJwcmV0IHRoZSBleHByZXNzaW9uLCB3ZSBsZWF2ZSB0aGUgSklUJ2VkIGNvZGUgaW4gcGxhY2UgZm9yIHJldXNlLiAgQnV0IGl0IHdvdWxkIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBldmVuIGJldHRlciBpZiB3ZSBjb3VsZCBhbHNvIGluc2VydCB0aGUgInN0b3Agb3Igbm90IiBkZWNpc2lvbiBpbnRvIHRoZSBjb2RlIGF0IHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludCwgc28geW91IHdvdWxkIG9ubHkgYWN0dWFsbHkgc3RvcCB0aGUgcHJvY2VzcyB3aGVuIHRoZSBjb25kaXRpb24gd2FzIHRydWUuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JlZydzIGlkZWEgd2FzIHRoYXQgaWYgeW91IGhhZCBhIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnQgc2V0IHdoZW4geW91IHN0YXJ0ZWQgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyBzZXNzaW9uLCBYY29kZSBjb3VsZCByZWJ1aWxkIGFuZCBpbnNlcnQgZW5vdWdoIG5vLW9wcyB0aGF0IHdlIGNvdWxkIGluc3RydW1lbnQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBicmVha3BvaW50IHNpdGUgYW5kIGNhbGwgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24sIGFuZCBvbmx5IHRyYXAgaWYgdGhlIGNvbmRpdGlvbmFsIHdhcyB0cnVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb2FkZW4gdGhlIGlkZWEgaW4gInRhcmdldCBzdG9wLWhvb2siIHRvIGNvdmVyIG1vcmUgZXZlbnRzIGluIHRoZSBkZWJ1Z2dlcgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeSBsb2FkcywgY29tbWFuZCBleGVjdXRpb24sIFVzZXIgZGlyZWN0ZWQgbWVtb3J5L3JlZ2lzdGVyIHJlYWRzIGFuZCB3cml0ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VzIHdoZXJlIHlvdSB3b3VsZCByZWFzb25hYmx5IHdhbnQgdG8gaG9vayBpbnRvIHRoZSBkZWJ1Z2dlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2NrIGNsYXNzZXMgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSBuZWVkICAiUHJvY2Vzc01vY2siIGFuZCAiT2JqZWN0RmlsZU1vY2siIGFuZCB0aGUgbGlrZS4gIFRoZXNlIHdvdWxkIGJlIHJlYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlaXIgdW5kZXJseWluZyBsbGRiIGNsYXNzZXMsIHdpdGggdGhlIGFkZGl0aW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHlvdSBjYW4gcHJpbWUgdGhlbSBmcm9tIHNvbWUgc29ydCBvZiB0ZXh0IGJhc2VkIGlucHV0IGZpbGVzLiAgRm9yIGNsYXNzZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWFuYWdlIGNoYW5nZXMgb3ZlciB0aW1lIChsaWtlIHByb2Nlc3MpIHlvdSB3b3VsZCBuZWVkIHRvIHByb2dyYW0gdGhlIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IFN0b3BQb2ludCAwLCBTdG9wUG9pbnQgMSwgZXRjLiAgVGhlc2UgY291bGQgdGhlbiBiZSB1c2VkIGZvciB0ZXN0aW5nIHJlYWN0aW9ucyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29tcGxleCB0aHJlYWRpbmcgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1zICYgdGhlIGxpa2UsIGFuZCBhbHNvIGZvciBzaW11bGF0aW5nIGhhcmQtdG8tdGVzdCBlbnZpcm9ubWVudHMgKGxpa2UgYmFyZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmQgZGVidWdnaW5nKS4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgQnVnLVRyYXBwZXIgaW5mcmFzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSB2ZXJ5IG9mdGVuIGhhdmUgYnVncyB0aGF0IGNhbid0IGJlIHJlcHJvZHVjZWQgbG9jYWxseS4gIFNvIGhhdmluZyBhIGJ1Zy1yZXBvcnQtdHJhcHBlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gZ2F0aGVyIGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRpbmdzIG9mIGEgYnVnIHNvIHRoYXQgd2UgY2FuIHJlcGxheSB0aGUgc2Vzc2lvbiBsb2NhbGx5IHdvdWxkIGJlIGEgYmlnIGhlbHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmcgZG93biBpc3N1ZXMgaW4gdGhpcyBzaXR1YXRpb24uICBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIHlvdSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuJ3QgbmVjZXNzYXJpbHkgcmVxdWlyZSBmb2xrcyB0byBsZWFrIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvZGUgaW4gb3JkZXIgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYnVnIHJlcG9ydHMuICBTbyBub3Qgb25seSB3aWxsIHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hhdCBzdGF0ZSB0byBnYXRoZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UncmUgYWxzbyBnb2luZyB0byBoYXZlIHRvIGFub255bWl6ZSBpdCBzb21laG93LiAgQnV0IHdlIHZlcnkgb2Z0ZW4gaGF2ZSBidWdzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBlb3BsZSB0aGF0IGNhbid0IHJlZHVjZSB0aGUgcHJvYmxlbSB0byBhIHNpbXBsZSB0ZXN0IGNhc2UgYW5kIGNhbid0IGdpdmUgdXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91ciBjb2RlLCBhbmQgd2Ugb2Z0ZW4ganVzdCBjYW4ndCBoZWxwIHRoZW0gYXMgdGhpbmdzIHN0YW5kIG5vdy4gIE5vdGUgdGhhdCBhZGRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFByb2Nlc3NNb2NrIHdvdWxkIGJlIGEgZ29vZCBmaXJzdCBzdGFnZSB0b3dhcmRzIHRoaXMsIHNpbmNlIHlvdSBjb3VsZCBtYWtlIGEgUHJvY2Vzc01vY2sgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3Ivc2VyaWFsaXplciBmcm9tIHRoZSBjdXJyZW50IGxsZGIgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBwYXJzZXIgbmVlZHMgc3ludGF4IGZvciAie3N5bWJvbCx0eXBlfSBBIGluIENVIEIuY3BwIiBldGMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBzcGVjaWZ5IG5vbi12aXNpYmxlIG9yIGFtYmlndW91cyB0eXBlcyB0byB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Ugd2VyZSBwbGFubmluZyB0byBkbyAkYl9kb3RfY3BwJEEgb3Igc29tZXRoaW5nIGxpa2UuICBZb3UgbWlnaHQgd2FudCB0byBzcGVjaWZ5IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGluIGEgZnVuY3Rpb24sIGluIGEgc291cmNlIGZpbGUsIG9yIGluIGEgc2hhcmVkIGxpYnJhcnkuICBTbyB0aGUgc3ludGF4IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGFsbCB0aGVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgYSAidGVzdEJ1dERvbnRBYm9ydCIgc3R5bGUgdGVzdCB0byB0aGUgVW5pdFRlc3QgZnJhbWV3b3JrLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgd2F5IHdlIHVzZSB1bml0dGVzdCBub3cgKG1heWJlIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGNhbiB3b3JrLCBJIGRvbid0IGtub3cpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuJ3QgcmVwb3J0IGEgcmVhbCBmYWlsdXJlIGFuZCBjb250aW51ZSB3aXRoIHRoZSB0ZXN0LiAgVGhhdCBpcyBhcHByb3ByaWF0ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc29tZSBjYXNlczogaWYgSSdtIHN1cHBvc2VkIHRvIGhpdCBicmVha3BvaW50IEEgYmVmb3JlIEkgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb24ndCBoaXQgYnJlYWtwb2ludCBBLCB0aGUgdGVzdCBzaG91bGQgZmFpbC4gIEJ1dCBpdCBtZWFucyB0aGF0IGlmIEkgd2FudCB0byAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCBmaXZlIGRpZmZlcmVudCBleHByZXNzaW9ucywgSSBjYW4gZWl0aGVyIGRvIGl0IGluIG9uZSB0ZXN0LCB3aGljaCBpcyBnb29kIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIGl0IG1lYW5zIEkgb25seSBoYXZlIHRvIGZpcmUgdXAgb25lIHByb2Nlc3MsIGF0dGFjaCB0byBpdCwgYW5kIGdldCBpdCB0byAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjZXJ0YWluIHBvaW50LiAgQnV0IGl0IGFsc28gbWVhbnMgaWYgdGhlIGZpcnN0IHRlc3QgZmFpbHMsIHRoZSBvdGhlciBmb3VyIGRvbid0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuIGdldCBydW4uICBTbyB0aG91Z2ggYXQgZmlyc3Qgd2Ugd3JvdGUgYSBidW5jaCBvZiB0ZXN0IGxpa2UgdGhpcywgYXMgdGltZSB3ZW50IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3ZSBzd2l0Y2hlZCBtb3JlIHRvIHdyaXRpbmcgIm9uZSBhdCBhIHRpbWUiIHRlc3RzIGJlY2F1c2UgdGhleSB3ZXJlIG1vcmUgcm9idXN0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IGEgc2luZ2xlIGZhaWx1cmUuICBUaGF0IG1ha2VzIHRoZSB0ZXN0IHN1aXRlIHJ1biBtdWNoIG1vcmUgc2xvd2x5LiAgSXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIGJlIGdyZWF0IHRvIGFkZCBhICJ0ZXN0X2J1dF9kb250X2Fib3J0IiB2YXJpYW50IG9mIHRoZSB0ZXN0cywgdGhlbiB3ZSBjb3VsZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FuZyB0ZXN0cyB0aGF0IGFsbCBkcml2ZSB0byB0aGUgc2FtZSBwbGFjZSBhbmQgZG8gc2ltaWxhciB0aGluZ3MuICBBcyBhbiBhZGRlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpdCwgaXQgd291bGQgYWxsb3cgdXMgdG8gYmUgbW9yZSB0aG9yb3VnaCBpbiB3cml0aW5nIHRlc3RzLCBzaW5jZSBlYWNoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0IHdvdWxkIGhhdmUgbG93ZXIgY29zdHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydCB0aGUgZG90ZXN0IHN0eWxlIHRlc3RzIHRvIHVzZSBsbGRidXRpbC5ydW5fdG9fc291cmNlX2JyZWFrcG9pbnQuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl90b19zb3VyY2VfYnJlYWtwb2ludCAmIHJ1bl90b19uYW1lX2JyZWFrcG9pbnQgcHJvdmlkZSBhIGNvbXBhY3QgQVBJIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBpbiBvbmUgbGluZSB3aGF0IHRoZSBmaXJzdCAxMCBvciAyMCBsaW5lcyBvZiBtb3N0IG9mIHRoZSBvbGQgdGVzdHMgbm93IGRvIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmQuICBVc2luZyB0aGVzZSBmdW5jdGlvbnMgbWFrZXMgdGVzdHMgbXVjaCBtb3JlIHJlYWRhYmxlLCBhbmQgYnkgY2VudHJhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHdpbGwgbWFrZSBtYWludGFpbmluZyB0aGUgdGVzdHN1aXRlcyBlYXNpZXIgaW4gdGhlIGZ1dHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBtb3JlIG9mIGEgZmluZ2VyIGV4ZXJjaXNlLCBhbmQgcGVyaGFwcyBiZXN0IGltcGxlbWVudGVkIGJ5IGEgcnVsZSBsaWtlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdElmIHlvdSB0b3VjaCBhIHRlc3QgY2FzZSwgYW5kIGl0IGlzbid0IHVzaW5nIHJ1bl90b19zb3VyY2VfYnJlYWtwb2ludCwgcGxlYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2UgaXQgZG8gc28mcXVvdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlmeSBXYXRjaHBvaW50J3MgJiBCcmVha3BvaW50cy4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbiBoYW5kbGluZyBpc24ndCBzaGFyZWQsIGFuZCBtb3JlIGltcG9ydGFudGx5IHRoZSBQZXJmb3JtQWN0aW9uJ3MgaGF2ZSBhIGxvdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZHVwbGljYXRlZCBjb21tb24gY29kZSwgbW9zdCBvZiB3aGljaCB3b3JrcyBsZXNzIHdlbGwgb24gdGhlIFdhdGNocG9pbnQgc2lkZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlIGRlYnVnZ2luZy4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMga2luZCBvZiBhIGhvbHkgZ3JhaWwsIGl0J3MgaGFyZCB0byBzdXBwb3J0IGZvciBjb21wbGV4IGFwcHMgKG1hbnkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZHMsIHNoYXJlZCBtZW1vcnksIGV0Yy4pICBCdXQgaXQgd291bGQgYmUgU08gbmljZSB0byBoYXZlLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24tc3RvcCBkZWJ1Z2dpbmcuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IHRoaXMgSSBtZWFuIGFsbG93aW5nIHNvbWUgdGhyZWFkcyBpbiB0aGUgdGFyZ2V0IHByb2dyYW0gdG8gcnVuIHdoaWxlIHN0b3BwaW5nIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciB0aHJlYWRzLiAgVGhpcyBpcyBzdXBwb3J0ZWQgaW4gbmFtZSBpbiBsbGRiIGF0IHByZXNlbnQsIGJ1dCBsbGRiIG1ha2VzIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1wdGlvbiAiSWYgSSBnZXQgYSBzdG9wLCBJIHdvbid0IGdldCBhbm90aGVyIHN0b3AgdW5sZXNzIEkgYWN0dWFsbHkgcnVuIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS4iIGluIGEgYnVuY2ggb2YgcGxhY2VzIHNvIGdldHRpbmcgaXQgdG8gd29yayByZWxpYWJseSB3aWxsIGJlIHNvbWUgYSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCBiaXQgb2Ygd29yay4gIEFuZCBmaWd1cmluZyBvdXQgaG93IHRvIHByZXNlbnQgdGhpcyBpbiB0aGUgVUkgd2lsbCBhbHNvIGJlIHRyaWNreS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggYW5kIGNvbnRpbnVlLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgZGlkIHRoaXMgaW4gZ2RiIHdpdGhvdXQgYSByZWFsIEpJVC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGRuJ3QgYmUgdGhhdCBoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3BlY2lhbGx5IGlmIHlvdSBjYW4gYnVpbGQgdGhlIGV4ZWN1dGFibGUgZm9yIGZpeCBhbmQgY29udGludWUuICBUaGUgdHJpY2t5IHBhcnQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93IHRvIHZlcmlmeSB0aGF0IHRoZSB1c2VyIGNhbiBvbmx5IGRvIHRoZSBraW5kcyBvZiBmaXhlcyB0aGF0IGFyZSBzYWZlIHRvIGRvLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGNoYW5naW5nIG9iamVjdCBzaXplcyBpcyBlYXN5IHRvIGRldGVjdCwgYnV0IHRoZXJlIHdlcmUgbWFueSBtb3JlIHN1YnRsZSBjaGFuZ2VzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24geW91IGFyZSBmaXhpbmcgaXMgb24gdGhlIHN0YWNrLi4uKSB0aGF0IHRha2UgbW9yZSB3b3JrIHRvIHByZXZlbnQuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kIHRoZW4geW91IGhhdmUgdG8gZXhwbGFpbiB0aGVzZSBjb25kaXRpb25zIHRoZSB1c2VyIGluIHNvbWUgaGVscGZ1bCB3YXkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlmaWVkIElSIGludGVycHJldGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSBJUkludGVycHJldGVyIGltcGxlbWVudHMgYSBwb3J0aW9uIG9mIHRoZSBMTFZNIElSLCBidXQgaXQgZG9lc24ndCBoYW5kbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yIGRhdGEgdHlwZXMgYW5kIHRoZXJlIGFyZSBwbGVudHkgb2YgaW5zdHJ1Y3Rpb25zIGl0IGFsc28gZG9lc24ndCBzdXBwb3J0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzZWx5LCBsbGkgc3VwcG9ydHMgbW9zdCBvZiBMTFZNJ3MgSVIgYnV0IGl0IGRvZXNuJ3QgaGFuZGxlIHJlbW90ZSBtZW1vcnkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBmdW5jdGlvbiBjYWxsaW5nIHN1cHBvcnQgaXMgdmVyeSBydWRpbWVudGFyeS4gIEl0IHdvdWxkIGJlIHVzZWZ1bCB0byB1bmlmeSB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWFrZSB0aGUgSVIgaW50ZXJwcmV0ZXIgLS0gYm90aCBmb3IgTExWTSBhbmQgTExEQiAtLSBiZXR0ZXIuICBBbiBhbHRlcm5hdGUgc3RyYXRlZ3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgYmUgc2ltcGx5IHRvIEpJVCBpbnRvIHRoZSBjdXJyZW50IHByb2Nlc3MgYnV0IGhhdmUgY2FsbGJhY2tzIGZvciBub24tc3RhY2sgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29sPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAJPGRpdiBjbGFzcz0icG9zdGZvb3RlciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgCTwvZGl2PgoJPC9kaXY+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K