ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwNCkKLSBJIGludmVzdGlnYXRlZCBvdXIgUEtDUzEyIGJ1aWxkIHByb2JsZW0gb24gU29sYXJpcyAyLjcgd2l0aCBPcGVuU1NMIDAuOS43ZSwKICBhbmQgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgZmF1bHQgb2YgdGhlIHpsaWIgMS4xLjQgaGVhZGVycyBkb2luZyBhIHR5cGVkZWYKICBuYW1lZCAnZnJlZV9mdW5jJyBhbmQgdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIGEgcHJvdG90eXBlIHRoYXQgdXNlcwogICdmcmVlX2Z1bmMnIGluIG9uZSBvZiBpdHMgYXJndW1lbnRzLiBUaGlzIGlzIHdoeSB0aGUgY29tcGlsZSBlcnJvcnMgb3V0LgoKICBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBvcGVuc3NsL3BrY3MxMi5oIGhlYWRlciBiZWZvcmUgdGhlCiAgemxpYi5oIGhlYWRlciBhbmQgaXQgYnVpbGRzIGZpbmUuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHRoaXMKICBmaWxlIGFuZCBpdCB0aGVuIGdldHMgaW5jbHVkZWQgZWFybHkgaW4gbGliL3VybGRhdGEuaC4KCkRhbmllbCAoMTggRGVjZW1iZXIgMjAwNCkKLSBTYW11ZWwgTGlzdG9wYWQgYWRkZWQgc3VwcG9ydCBmb3IgUEtDUzEyIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMuCgotIFNhbXVlbCBMaXN0b3BhZCBmaXhlZCAtRSB0byBzdXBwb3J0ICJDOi9wYXRoIiAod2l0aCBmb3J3YXJkIHNsYXNoKSBhcyB3ZWxsLgogIApEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgZGlyZWN0b3J5IHJlLXVzZSBmb3IgRlRQLgoKICBJIGFkZGVkIHRlc3QgY2FzZSAyMTUgYW5kIDIxNiB0byBiZXR0ZXIgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBEaW5hciBpbiBidWcgcmVwb3J0ICMxMDg2MTIxLCBmb3VuZCBhIGZpbGUgaGFuZGxlIGxlYWsgd2hlbiBhIG11bHRpcGFydAogIGZvcm1wb3N0IChpbmNsdWRpbmcgYSBmaWxlIHVwbG9hZCBwYXJ0KSB3YXMgYWJvcnRlZCBiZWZvcmUgdGhlIHdob2xlIGZpbGUKICB3YXMgc2VudC4KCkRhbmllbCAoMTUgRGVjZW1iZXIgMjAwNCkKLSBUb20gTGVlIGZvdW5kIG91dCB0aGF0IGdsb2JiaW5nIG9mIHN0cmluZ3Mgd2l0aCBiYWNrc2xhc2hlcyBkaWRuJ3Qgd29yayBhcwogIHlvdSdkIGV4cGVjdC4gQmFja3NsYXNoZXMgYXJlIHN1Y2ggYSBjZW50cmFsIHBhcnQgb2Ygd2luZG93cyBmaWxlIG5hbWVzIHRoYXQKICBmb3JjaW5nIGJhY2tzbGFzaGVzIHRvIGhhdmUgdG8gYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzIGlzIGEgYml0IHRvbwogIGF3a3dhcmQgdG8gdXNlcnMuIFN0YXJ0aW5nIG5vdywgeW91IG9ubHkgbmVlZCB0byBlc2NhcGUgZ2xvYmJpbmcgY2hhcmFjdGVycwogIHN1Y2ggYXMgdGhlIGZpdmUgbGV0dGVyczogIltde30sIi4gQWRkZWQgdGVzdCBjYXNlIDIxNCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgRGVjZW1iZXIgMjAwNCkKLSBIYXJzaGFsIFByYWRoYW4gcGF0Y2hlZCBhIEhUVFAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGZsYXc6IGlmIHRoZSB1c2VyIG5hbWUKICBhbmQvb3IgcGFzc3dvcmQgd2VyZSBtb2RpZmllZCBiZXR3ZWVuIHR3byByZXF1ZXN0cyBvbiBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLCB0aGUgc2Vjb25kIHJlcXVlc3Qgd2VyZSBzdGlsbCBtYWRlIHdpdGggdGhlIGZpcnN0IHNldHVwIQoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDEzIERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgYWRkZWQgQ1VSTElORk9fU1NMX0VOR0lORVMgdG8gY3VybF9lYXN5X2dldGluZm8oKSB0byBhbGxvdyBhbiBhcHAKICB0byBsaXN0IGFsbCBhdmFpbGFibGUgY3J5cHRvIEVOR0lORVMuCgotIEdpc2xlIGZpeGVkIGJ1ZyByZXBvcnQgIzEwODM1NDIsIHdoaWNoIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHJlc3VtaW5nCiAgbGFyZ2UgZmlsZSAoPjRHQikgZmlsZTovLyB0cmFuc2ZlcnMgb24gd2luZG93cy4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwNCkKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlIEhUVFAgc2VydmVyIChzd3MpIGNhcGFibGUgb2YgdXNpbmcgSVB2NiwgYW5kIHRoZW4KICBleHRlbmRlZCB0aGUgdGVzdCBlbnZpcm9ubWVudCB0byBzdXBwb3J0IHRoYXQgYW5kIGFsc28gYWRkZWQgdGhyZWUgdGVzdAogIGNhc2VzICgyNDAsIDI0MSwgMjQyKSB0aGF0IHJ1biB0ZXN0cyB1c2luZyBJUHY2LiBUZXN0IDI0MiB1c2VzIGEgVVJMIHRoYXQKICBkaWRuJ3Qgd29yayBiZWZvcmUgdGhlIDEwIGRlYyBmaXggYnkgS2FpIFNvbW1lcmZlbGQuCgotIE1hZGUgYSBmYWlsZWQgZmlsZTovLyByZXN1bWUgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UKCi0gQ29ycmVjdGVkIHRoZSBDVVJMRV9CQURfRE9XTkxPQURfUkVTVU1FIGVycm9yIG1lc3NhZ2UgaW4gbGliL3N0cmVycm9yLmMKCi0gRGFuIEZhbmRyaWNoOgoKICBzaW1wbGlmaWVkIGFuZCBjb25zb2xpZGF0ZWQgdGhlIFNTTCBjaGVja3MgaW4gY29uZmlndXJlIGFuZCB0aGUgdXNhZ2Ugb2YgdGhlCiAgZGVmaW5lcyBpbiBsaWIvc2V0dXAuaAoKICBwcm92aWRlZCBhIGZpcnN0IGxpYmN1cmwucGMuaW4gZmlsZSBmb3IgcGtnLWNvbmZpZyAoYnV0IHRoZSByZXN1bHQgaXMgbm90CiAgaW5zdGFsbGVkIGFueXdoZXJlIGF0IHRoaXMgcG9pbnQpCgogIGV4dGVuZGVkIHRoZSBjcm9zcyBjb21waWxlIHNlY3Rpb24gaW4gdGhlIGRvY3MvSU5TVEFMTCBmaWxlCgpEYW5pZWwgKDEwIERlY2VtYmVyIDIwMDQpCi0gV2hlbiBwcm92aWRpbmcgdXNlciBuYW1lIGluIHRoZSBVUkwgYW5kIGEgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzIChsaWtlIGluCiAgImZ0cDovL3VzZXJAWzo6MV0vdG1wIiksIHRoZSBVUkwgcGFyc2VyIGRpZG4ndCBnZXQgdGhlIGhvc3QgZXh0cmFjdGVkCiAgcHJvcGVybHkuICBSZXBvcnRlZCBhbmQgZml4ZWQgYnkgS2FpIFNvbW1lcmZlbGQuCgpEYW5pZWwgKDkgRGVjZW1iZXIgMjAwNCkKLSBUb24gVm9vbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBmaXggdGhhdCBzaG91bGQgZml4IHRoZSBub3RvcmlvdXMgKG1vc3RseQogIHJlcG9ydGVkIG9uIFNvbGFyaXMpIHByb2JsZW0gd2hlcmUgdGhlIHNpemVfdCBjaGVjayBmYWlscyBkdWUgdG8gdGhlIFNTTAogIGxpYnMgYmVpbmcgZm91bmQgaW4gYSBkaXIgbm90IHNlYXJjaGVkIHRocm91Z2ggYnkgdGhlIHJ1bi10aW1lIGxpbmtlci4KICBwYXRjaC10cmFja2VyIGVudHJ5ICMxMDgxNzA3LgoKLSBCcnlhbiBIZW5kZXJzb24gcG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCAjMTA4MTc4OCB0aGF0IHRoZSBjdXJsLWNvbmZpZwogIC0tdmVybnVtIG91dHB1dCB3YXNuJ3QgemVybyBwcmVmaXhlZCBwcm9wZXJseSAoYXMgY2xhaW1lZCBpbiBkb2N1bWVudGF0aW9uKS4KICBUaGlzIGlzIGZpeGVkIGluIG1ha2V0Z3ogbm93LgogIApEYW5pZWwgKDggRGVjZW1iZXIgMjAwNCkKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIG1hY2gtTyBmcmFtZXdvcmsgZmlsZXMgZm9yIE1hYyBPUyBYLgoKLSBSZW5lIEJlcm5oYXJkdCBmb3VuZCBhbmQgZml4ZWQgYSBidWZmZXIgb3ZlcnJ1biBpbiB0aGUgTlRMTSBjb2RlLCB3aGVyZQogIGxpYmN1cmwgYWx3YXlzIGFuZCB1bmNvbmRpdGlvbmFsbHkgb3Zlcndyb3RlIGEgc3RhY2stYmFzZWQgYXJyYXkgd2l0aCAzIHplcm8KICBieXRlcy4gVGhpcyBpcyBub3QgYW4gZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93LiBObyBuZWVkIHRvIGdldCBhbGFybWVkLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgc28gdGhhdCB0aGUgZmluYWwgZXJyb3IgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSB2ZXJib3NlIGluZm8gInN0cmVhbSIKICBldmVuIGlmIG5vIGVycm9yYnVmZmVyIGlzIHNldC4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBhZGRlZCB0aGUgLS1kaXNhYmxlLWNvb2tpZXMgb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBidWlsZAogIGxpYmN1cmwgd2l0aG91dCBjb29raWUgc3VwcG9ydC4gVGhpcyBpcyBtYWlubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEKICBtaW5pbWFsaXN0aWMgbGliY3VybCB3aXRoIG5vIGNvb2tpZXMgc3VwcG9ydCBhdCBhbGwuIExpa2UgZm9yIGVtYmVkZGVkCiAgc3lzdGVtcyBvciBzaW1pbGFyLgoKLSBSaWNoYXJkIEF0dGVyZXIgZml4ZWQgbGliY3VybCdzIHdheSBvZiBkZWFsaW5nIHdpdGggdGhlIEVQU1YKICByZXNwb25zZS4gUHJldmlvdXNseSwgbGliY3VybCB3b3VsZCByZS1yZXNvbHZlIHRoZSBob3N0IG5hbWUgd2l0aCB0aGUgbmV3CiAgcG9ydCBudW1iZXIgYW5kIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGF0LCB3aGlsZSBpdCBzaG91bGQgdXNlIHRoZSBJUCBmcm9tCiAgdGhlIGNvbnRyb2wgY2hhbm5lbC4gVGhpcyBidWcgbWFkZSBpdCBoYXJkIHRvIEVQU1YgZnJvbSBhbiBGVFAgc2VydmVyIHdpdGgKICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMhCgpEYW5pZWwgKDMgRGVjZW1iZXIgMjAwNCkKLSBCdWcgcmVwb3J0ICMxMDc4MDY2OiB3aGVuIGEgY2h1bmtlZCB0cmFuc2ZlciB3YXMgcHJlLW1hdHVyZWx5IGNsb3NlZCBleGFjdGx5CiAgYXQgYSBjaHVuayBib3VuZGFyeSBpdCB3YXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IgYW5kIHRodXMgd2VudCB1bm5vdGljZWQuCiAgRml4ZWQgYnkgTWF1cmljZSBCYXJudW0uCgogIEFkZGVkIHRlc3QgY2FzZSAyMDcgdG8gdmVyaWZ5LgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgdGhlIENPTk5FQ1QgbG9vcCB0byBkZWZhdWx0IHRpbWVvdXQgdG8gMzYwMCBzZWNvbmRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjA2IHRoYXQgbWFrZXMgQ09OTkVDVCB3aXRoIERpZ2VzdC4KCiAgRml4ZWQgYSBmbGF3IHRoYXQgcHJlcGVuZGVkICIobmlsKSIgdG8gdGhlIGluaXRpYWwgQ09OTkVDVCBycWV1ZXN0J3MgdXNlci0KICBhZ2VudCBmaWVsZC4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2gncyBmaXggZm9yIGxpYnogMS4xIGFuZCAiZXh0cmEgZmllbGQiIHVzYWdlIGluIGEgZ3ppcCBzdHJlYW0KCi0gRGFuIGFsc28gaGVscGVkIG1lIHdpdGggaW5wdXQgZGF0YSB0byBjcmVhdGUgdGhyZWUgbW9yZSB0ZXN0IGNhc2VzIGZvciB0aGUKICAtLWNvbXByZXNzZWQgb3B0aW9uLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDA0KQotIEkgaW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gZW5hYmxlIGJpbmFyeSBjb250ZW50cyBpbiB0aGUgdGVzdHMgKGJ5IHByb3ZpbmcKICBpdCBiYXNlNjQgZW5jb2RlZCksIGxpa2UgZm9yIHRlc3RpbmcgZGVjb21wcmVzcyBldGMuIEFkZGVkIHRlc3QgMjIwIGFuZCAyMjEKICBmb3IgdGhpcyBwdXJwb3NlLiBUZXN0cyBjYW4gbm93IGFsc28gZGVwZW5kIG9uIGxpYnogdG8gcnVuLgoKLSBBcyByZXBvcnRlZCBieSBSZWlub3V0IHZhbiBTY2hvdXdlbiBpbiBNYW5kcmFrZSdzIGJ1ZyB0cmFja2VyIGJ1ZyAxMjI4NQogIChodHRwOi8vcWEubWFuZHJha2Vzb2Z0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTIyODUpLCB3aGVuIGNvbm5lY3RpbmcgdG8gYW4KICBJUHY2IGhvc3Qgd2l0aCBGVFAsIC0tZGlzYWJsZS1lcHN2IChvciAtLWRpc2FibGUtZXBydCkgZWZmZWN0aXZlbHkgZGlzYWJsZXMKICB0aGUgYWJpbGl0eSB0byB0cmFuc2ZlciBhIGZpbGUuIE5vdywgd2hlbiBjb25uZWN0ZWQgdG8gYW4gRlRQIHNlcnZlciB3aXRoCiAgSVB2NiwgdGhlc2UgRlRQIGNvbW1hbmRzIGNhbid0IGJlIGRpc2FibGVkIGV2ZW4gaWYgYXNrZWQgdG8gd2l0aCB0aGUKICBhdmFpbGFibGUgbGliY3VybCBvcHRpb25zLgoKRGFuaWVsICgyNiBOb3ZlbWJlciAyMDA0KQotIEFzIHJlcG9ydGVkIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg5CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4OSksIGN1cmwgd291bGQgcHJpbnQgYQogIG5ld2xpbmUgdG8gImZpbmlzaCIgdGhlIHByb2dyZXNzIG1ldGVyIGFmdGVyIGVhY2ggcmVkaXJlY3QgYW5kIG5vdCBvbmx5CiAgYWZ0ZXIgYSBjb21wbGV0ZWQgdHJhbnNmZXIuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDQpCi0gRlRQIGltcHJvdmVtZW50czoKCiAgSWYgRVBTViwgRVBSVCBvciBMUFJUIGlzIHRyaWVkIGFuZCBkb2Vzbid0IHdvcmssIGl0IHdpbGwgbm90IGJlIHJldHJpZWQgb24KICB0aGUgc2FtZSBzZXJ2ZXIgYWdhaW4gZXZlbiBpZiBhIGZvbGxvd2luZyByZXF1ZXN0IGlzIG1hZGUgdXNpbmcgYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbi4KCiAgSWYgYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIHRvIGEgc2VydmVyLCByZXF1ZXN0aW5nIGEgZmlsZSBmcm9tIHRoZSBzYW1lCiAgZGlyZWN0b3J5IGFzIHRoZSBwcmV2aW91cyByZXF1ZXN0IG9wZXJhdGVkIG9uLCBsaWJjdXJsIHdpbGwgbm8gbG9uZ2VyIG1ha2UKICB0aGF0IGxvbmcgc2VyaWVzIG9mIENXRCBjb21tYW5kcyBqdXN0IHRvIGVuZCB1cCBvbiB0aGUgc2FtZSBzcG90LiBOb3RlIHRoYXQKICB0aGlzIGlzIG9ubHkgZm9yICpleGFjdGx5KiB0aGUgc2FtZSBkaXIuIFRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGltcHJvdmVtZW50cwogIHRvIG9wdGltaXplIHRoZSBDV0Qtc2VuZGluZyB3aGVuIHRoZSBkaXJzIGFyZSBvbmx5IHNsaWdodGx5IGRpZmZlcmVudC4KCiAgQWRkZWQgdGVzdCAyMTAsIDIxMSBhbmQgMjEyIHRvIHZlcmlmeSB0aGVzZSBjaGFuZ2VzLiBIYWQgdG8gaW1wcm92ZSB0aGUKICB0ZXN0IHNjcmlwdCB0b28gYW5kIGFkZGVkIGEgbmV3IHByaW1pdGl2ZSB0byB0aGUgdGVzdCBmaWxlIGZvcm1hdC4KCkRhbmllbCAoMjQgTm92ZW1iZXIgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzZWxlY3QgcHJvcGVybHkgd2hlbiBydW4KICB3aXRoIE1zeXMvTWluZ3cgb24gV2luZG93cy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwNCkKLSBNYWRlIEhUVFAgUFVUIGFuZCBQT1NUIHJlcXVlc3RzIG5vIGxvbmdlciB1c2UgSEVBRCB3aGVuIGRvaW5nIG11bHRpLXBhc3MKICBhdXRoIG5lZ290aWF0aW9uIChOVExNLCBEaWdlc3QgYW5kIE5lZ290aWF0ZSksIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcmVxdWVzdAogIGtleXdvcmQgInByb3Blcmx5Ii4gRGV0YWlscyBpbiBsaWIvUkVBRE1FLmh0dHBhdXRoLiBUaGlzIGFsc28gaW50cm9kdWNlcwogIENVUkxPUFRfSU9DVExGVU5DVElPTiBhbmQgQ1VSTE9QVF9JT0NUTERBVEEsIHRvIGJlIHVzZWQgYnkgYXBwcyB0aGF0IHVzZSB0aGUKICAiYW55IiBhdXRoIGFsdGVybmF0aXZlIGFzIHRoZW4gbGliY3VybCBtYXkgbmVlZCB0byBzZW5kIHRoZSBQVVQvUE9TVCBkYXRhCiAgbW9yZSB0aGFuIG9uY2UgYW5kIHRodXMgbWF5IG5lZWQgdG8gYXNrIHRoZSBhcHAgdG8gInJld2luZCIgdGhlIHJlYWQgZGF0YQogIHN0cmVhbSB0byBzdGFydC4KCiAgU2VlIGFsc28gdGhlIG5ldyBleGFtcGxlIHVzaW5nIHRoaXM6IGRvY3MvZXhhbXBsZXMvYW55YXV0aHB1dC5jCgotIERhdmlkIFBoaWxsaXBzIGVuaGFuY2VkIHRlc3QgNTE4LiBJIG1hZGUgaXQgZGVwZW5kIG9uIGEgImZlYXR1cmUiIHNvIHRoYXQKICBzeXN0ZW1zIHdpdGhvdXQgZ2V0cmxpbWl0KCkgd29uJ3QgYXR0ZW1wdCB0byB0ZXN0IDUxOC4gY29uZmlndXJlIG5vdyBjaGVja3MKICBmb3IgZ2V0cmxpbWl0KCkgYW5kIHNldHJsaW1pdCgpIGZvciB0aGlzIHRlc3QgY2FzZS4KCkRhbmllbCAoMTggTm92ZW1iZXIgMjAwNCkKLSBEYXZpZCBQaGlsbGlwcyBmaXhlZCBsaWJjdXJsIHRvIG5vdCBjcmFzaCBhbnltb3JlIHdoZW4gbW9yZSB0aGFuIEZEX1NFVFNJWkUKICBmaWxlIGRlc2NyaXB0b3JzIGFyZSBpbiB1c2UuIFRlc3QgY2FzZSA1MTggYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDA0KQotIFRvIHRlc3QgbXkgZml4IGZvciB0aGUgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBidWcsIEkgYWRkZWQgdGltZV9yZWRpcmVjdCBhbmQKICBudW1fcmVkaXJlY3RzIHN1cHBvcnQgdG8gdGhlIC13IHdyaXRlb3V0IG9wdGlvbiBmb3IgdGhlIGNvbW1hbmQgbGluZSB0b29sLgoKLSBXb2pjaWVjaCBad2llZmthIGZvdW5kIG91dCB0aGF0IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgZGlkbid0IHdvcmsgYXMKICBkb2N1bWVudGVkLgogIApEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbW9kaWdpZWQgdGhlIE1TVkMgYW5kIE5ldHdhcmUgbWFrZWZpbGVzIHRvIGJ1aWxkIHdpdGhvdXQKICBsaWJjdXJsLmRlZgoKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jcnlwdG8tYXV0aCBvcHRpb24gdG8gY29uZmlndXJlIHRvIGFsbG93CiAgbGliY3VybCB0byBidWlsZCB3aXRob3V0IERpZ2VzdCBzdXBwb3J0LiAoSSBmaWd1cmUgaXQgc2hvdWxkIGFsc28gZXhwbGljaXRseQogIGRpc2FibGUgTmVnb3RpYXRlIGFuZCBOVExNLikKCi0gICAgICAgICAgICAgICAgICoqKiBNb2RpZmllZCBCZWhhdmlvdXIgQWxlcnQgKioqCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgd2lsbCBubyBsb25nZXIgZG8gYSBHRVQuCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvICIiIHdpbGwgc2VuZCBhIHplcm8gYnl0ZSBQT1NUIGFuZCBzZXR0aW5nCiAgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgYW5kIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byB6ZXJvIHdpbGwgYWxzbyBtYWtlCiAgYSB6ZXJvIGJ5dGUgUE9TVC4gQWRkZWQgdGVzdCBjYXNlIDUxNSB0byB2ZXJpZnkgdGhpcy4KCiAgU2V0dGluZyBDVVJMT1BUX0hUVFBQT1NUIHRvIE5VTEwgbWFrZXMgYSB6ZXJvIGJ5dGUgcG9zdC4gQWRkZWQgdGVzdCBjYXNlIDUxNgogIHRvIHZlcmlmeSB0aGlzLgoKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgbXVzdCBub3cgYmUgc2V0IHRvIC0xIHRvIHNpZ25hbCAid2UgZG9uJ3Qga25vdyIuCiAgU2V0dGluZyBpdCB0byB6ZXJvIHNpbXBseSBzYXlzIHRoaXMgaXMgYSB6ZXJvIGJ5dGUgUE9TVC4KCiAgV2hlbiBwcm92aWRpbmcgUE9TVCBkYXRhIHdpdGggYSByZWFkIGNhbGxiYWNrLCBzZXR0aW5nIHRoZSBzaXplIHVwIGZyb250CiAgaXMgbm93IG1hZGUgd2l0aCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgYW5kIG5vdCB3aXRoIENVUkxPUFRfSU5GSUxFU0laRS4KCkRhbmllbCAoMTEgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgLS1kaXNhYmxlLXZlcmJvc2UgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgYnVpbGRzCiAgd2l0aG91dCB2ZXJib3NlIHN0cmluZ3MgaW4gdGhlIGNvZGUsIHRvIHNhdmUgc29tZSAxMktCIHNwYWNlLiBNYWtlcyBzZW5zZQogIG9ubHkgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IGxpdHRsZSBtZW1vcnkgcmVzb3VyY2VzLgoKLSBKZWZmIFBoaWxsaXBzIGZvdW5kIG91dCB0aGF0IGEgZGF0ZSBzdHJpbmcgd2l0aCBhIHllYXIgYmV5b25kIDIwMzggY291bGQKICBjcmFzaCB0aGUgbmV3IGRhdGUgcGFyc2VyIG9uIHN5c3RlbXMgd2l0aCAzMmJpdCB0aW1lX3QuIFdlIG5vdyBjaGVjayBmb3IKICB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdC4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNCkKLSBJIGluc3RhbGxlZCBIZWltZGFsIG9uIG15IERlYmlhbiBib3ggKHVzaW5nIHRoZSBkZWJpYW4gcGFja2FnZSkgYW5kIG5vdGljZWQKICB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpIGZhaWxlZCB0byBjcmVhdGUgYSBuaWNlIGJ1aWxkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYXJrZWQgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGxzIHdpdGggQ1VSTF9FWFRFUk4gc28gdGhhdCBub3cKICB0aGUgV2luZG93cywgTmV0d2FyZSBhbmQgb3RoZXIgYnVpbGRzIG5vIGxvbmdlciBuZWVkIGxpYmN1cmwuZGVmIG9yIHNpbWlsYXIKICBmaWxlcy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA0KQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgZm9yIHRsZC5oIGlmIGxpYmlkbiB3YXMgZGV0ZWN0ZWQsIHNpbmNlCiAgbGliaWRuIDAuMy5YIGRpZG4ndCBoYXZlIHN1Y2ggYSBoZWFkZXIgYW5kIHdlIGRvbid0IHdvcmsgd2l0aCBhbnl0aGluZwogIGJlZm9yZSBsaWJpZG4gMC40LjEgYW55d2F5ISBTdXNlIDkuMSBhcHBhcmVudGx5IHNoaXBzIHdpdGggYSAwLjMuWCB2ZXJzaW9uCiAgb2YgbGliaWRuIHdoaWNoIG1ha2VzIHRoZSBjdXJsIDcuMTIuMiBidWlsZCBmYWlsLiBKZWFuLVBoaWxpcHBlCiAgQmFycmV0dGUtTGFQaWVycmUgaGVscGVkIHBvaW50aW5nIHRoaXMgb3V0LgoKLSBJYW4gR3VsbGl2ZXIgcmVwb3J0ZWQgaW4gZGViaWFuIGJ1ZyByZXBvcnQgIzI3ODY5MTogaWYgY3VybCBpcyBpbnZva2VkIGluIGFuCiAgZW52aXJvbm1lbnQgd2hlcmUgc3RkZXJyIGlzIGNsb3NlZCB0aGUgLXYgb3V0cHV0IHdpbGwgc3RpbGwgYmUgc2VudCB0byBmaWxlCiAgZGVzY3JpcHRvciAyIHdoaWNoIHRoZW4gbWlnaHQgYmUgdGhlIG5ldHdvcmsgc29ja2V0IGhhbmRsZSEgTm93IHdlIGhhdmUgYQogIHdlaXJkIGhhY2sgaW5zdGVhZCB0aGF0IGF0dGVtcHRzIHRvIG1ha2Ugc3VyZSB0aGF0IGZpbGUgZGVzY3JpcHRvciAyIGlzCiAgb3BlbmVkICh3aXRoIGEgY2FsbCB0byBwaXBlKCkpIGJlZm9yZSBsaWJjdXJsIGlzIGNhbGxlZCB0byBkbyB0aGUgdHJhbnNmZXIuCiAgY29uZmlndXJlIG5vdyBjaGVja3MgZm9yIHBpcGUoKSBhbmQgc3lzdGVtcyB3aXRob3V0IHBpcGUgZG9uJ3QgZ2V0IHRoZSB3ZWlyZAogIGhhY2sgZG9uZS4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDA0KQotIFRpbSBTbmVkZG9uIG1hZGUgbGliY3VybCBzZW5kIG5vIG1vcmUgdGhhbiA2NEsgaW4gYSBzaW5nbGUgZmlyc3QgY2h1bmsgd2hlbgogIGRvaW5nIGEgaHVnZSBQT1NUIG9uIFZNUywgYXMgdGhpcyBpcyBhIHN5c3RlbSBsaW1pdGF0aW9uLiBEZWZhdWx0IG9uIGdlbmVyYWwKICBzeXN0ZW1zIGlzIDEwMEsuCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwNCkKLSBBbmRyZXMgR2FyY2lhIG1hZGUgaXQgYnVpbGQgb24gbWluZ3cgYWdhaW5hLCBteSAtLXJldHJ5IGNvZGUgYnJva2UgdGhlIGJ1aWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDQpCi0gQWRkZWQgLS1yZXRyeS1tYXgtdGltZSB0aGF0IGFsbG93cyBhIG1heGltdW0gdGltZSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuCiAgcmVhY2hlZCBmb3IgYSByZXRyeSB0byBiZSBtYWRlLiBJZiBub3Qgc2V0IHRoZXJlIGlzIG5vIG1heGltdW0gdGltZSwgb25seQogIHRoZSBhbW91bnQgb2YgcmV0cmllcyBzZXQgd2l0aCAtLXJldHJ5LgoKLSBQYXVsIE5vbGFuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG5pY2VseSBvbiBXaW5kb3dzIENFLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDQpCi0gV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vIGxvbmdlciBhdHRlbXB0cyB0byB1c2UKICBwa2ctY29uZmlnIG9uIHRoZSBidWlsZCBob3N0IGluIG9yZGVyIHRvIGRldGVjdCBPcGVuU1NMIGNvbXBpbGVyIG9wdGlvbnMuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2g6CgogIEFuIGltcHJvdmVtZW50IHRvIHRoZSBnemlwIGhhbmRsaW5nIG9mIGxpYmN1cmwuIFRoZXJlIHdlcmUgdHdvIHByb2JsZW1zIHdpdGgKICB0aGUgb2xkIHZlcnNpb246IGl0IHdhcyBwb3NzaWJsZSBmb3IgYSBtYWxpY2lvdXMgZ3ppcCBmaWxlIHRvIGNhdXNlIGxpYmN1cmwKICB0byBsZWFrIG1lbW9yeSwgYXMgYSBidWZmZXIgd2FzIG1hbGxvY2VkIHRvIGhvbGQgdGhlIGhlYWRlciBhbmQgbmV2ZXIgZnJlZWQKICBpZiB0aGUgaGVhZGVyIGVuZGVkIHdpdGggbm8gZmlsZSBjb250ZW50cy4gIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IHRoZQogIDY0IEtpQiBkZWNvbXByZXNzaW9uIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgd2hpY2ggY2F1c2VkCiAgdW5leHBlY3RlZGx5IGhpZ2ggc3RhY2sgdXNhZ2UgYW5kIG92ZXJmbG93ZWQgdGhlIHN0YWNrIG9uIHNvbWUgc3lzdGVtcwogIChzb21lb25lIGNvbXBsYWluZWQgYWJvdXQgdGhhdCBpbiB0aGUgbWFpbGluZyBsaXN0IGFib3V0IGEgeWVhciBhZ28pLgoKICBCb3RoIHByb2JsZW1zIGFyZSBmaXhlZCBieSB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIGlzIGZpeGVkIHdoZW4gYSByZWNlbnQKICAoMS4yKSB2ZXJzaW9uIG9mIHpsaWIgaXMgdXNlZCwgYXMgaXQgdGFrZXMgY2FyZSBvZiBnemlwIGhlYWRlciBwYXJzaW5nCiAgaXRzZWxmLiAgQSBjaGVjayBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGRvbmUgYXQgcnVuLXRpbWUgYW5kIGxpYmN1cmwgdXNlcwogIHRoYXQgZmVhdHVyZSBpZiBpdCdzIHByZXNlbnQuIEkndmUgY3JlYXRlZCBhIGRlZmluZSBPTERfWkxJQl9TVVBQT1JUIHRoYXQKICBjYW4gYmUgY29tbWVudGVkIG91dCB0byBzYXZlIHNvbWUgY29kZSBzcGFjZSBpZiBsaWJjdXJsIGlzIGd1YXJhbnRlZWQgdG8gYmUKICB1c2luZyBhIDEuMiB2ZXJzaW9uIG9mIHpsaWIuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgZHluYW1pY2FsbHkgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGJ1ZmZlcgogIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBvbiB0aGUgc3RhY2suIFRoZSBhbGxvY2F0aW9uL2ZyZWUgaXMgZG9uZSBmb3IgZXZlcnkKICBpbmNvbWluZyBwYWNrZXQsIHdoaWNoIGlzIHN1Ym9wdGltYWwsIGJ1dCBzaG91bGQgYmUgZHdhcmZlZCBieSB0aGUgYWN0dWFsCiAgZGVjb21wcmVzc2lvbiBjb21wdXRhdGlvbi4KIAogIEkndmUgYWxzbyBmYWN0b3JlZCBvdXQgc29tZSBjb21tb24gY29kZSBiZXR3ZWVuIGRlZmxhdGUgYW5kIGd6aXAgdG8gcmVkdWNlCiAgdGhlIGNvZGUgZm9vdHByaW50IHNvbWV3aGF0LiAgSSd2ZSB0ZXN0ZWQgdGhlIGd6aXAgY29kZSBvbiBhIGZldyB0ZXN0IGZpbGVzCiAgYW5kIEkgdHJpZWQgZGVmbGF0ZSB1c2luZyB0aGUgZnJlc2htZWF0Lm5ldCBzZXJ2ZXIsIGFuZCBpdCBhbGwgbG9va3MgT0suIEkKICBkaWRuJ3QgdHJ5IHJ1bm5pbmcgaXQgd2l0aCB2YWxncmluZCwgaG93ZXZlci4KCi0gQWRkZWQgYSAtLXJldHJ5IG9wdGlvbiB0byBjdXJsIHRoYXQgdGFrZXMgYSBudW1lcmljYWwgb3B0aW9uIGZvciB0aGUgbnVtYmVyCiAgb2YgdGltZXMgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZC4gSXQgaXMgcmV0cmllZCBpZiBhIHRyYW5zaWVudCBlcnJvcgogIGlzIGRldGVjdGVkIG9yIGlmIGEgdGltZW91dCBvY2N1cnJlZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCBmaXJzdCB3YWl0IG9uZQogIHNlY29uZCBiZXR3ZWVuIHRoZSByZXRyaWVzIGFuZCB0aGVuIGRvdWJsZSB0aGUgZGVsYXkgdGltZSBiZXR3ZWVuIGVhY2ggcmV0cnkKICB1bnRpbCB0aGUgZGVsYXkgdGltZSBpcyB0ZW4gbWludXRlcyB3aGljaCB0aGVuIHdpbGwgYmUgdGhlIGRlbGF5IHRpbWUKICBiZXR3ZWVuIGFsbCBmb3J0aGNvbWluZyByZXRyaWVzLiBZb3UgY2FuIHNldCBhIHN0YXRpYyBkZWxheSB0aW1lIHdpdGgKICAiLS1yZXRyeS1kZWxheSBbbnVtXSIgd2hlcmUgW251bV0gaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbgogIGVhY2ggcmV0cnkuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNCkKLSBUb21hcyBQb3NwaXNlayBmaWxlZCBidWcgcmVwb3J0ICMxMDUzMjg3IHRoYXQgcHJvdmVkIC1DIC0gYW5kIC0tZmFpbCBvbiBhCiAgZmlsZSB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlbHkgZG93bmxvYWRlZCBjYXVzZWQgYW4gZXJyb3IsIHdoaWxlIGl0CiAgZG9lc24ndCBpZiB5b3UgZG9uJ3QgdXNlIC0tZmFpbCEgSSBhZGRlZCB0ZXN0IGNhc2UgMTk0IHRvIHZlcmlmeSB0aGUgZml4LgogIEdycnIuIENVUkxPUFRfRkFJTE9ORVJST1IgaXMgbm93IGFkZGVkIHRvIHRoZSBsaXN0IHN0dWZmIHRvIHJlbW92ZSBpbgogIGxpYmN1cmwgdjggZHVlIHRvIGFsbCB0aGUga2x1ZGdlcyBuZWVkZWQgdG8gc3VwcG9ydCBpdC4KCi0gTW9odW4gQmlzd2FzIGZvdW5kIG91dCB0aGF0IGZvcm1wb3N0aW5nIGEgemVyby1ieXRlIGZpbGUgZGlkbid0IHdvcmsgdmVyeQogIGdvb2QuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIGl0IHBvc3NpYmxlIHRvIG1ha2UgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlcnMKICB3aXRoIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBiZWluZyB0aGUgc2FtZSBob3N0LiBJdCBjYW4gYmUgdXNlZnVsIGlmCiAgeW91IHdhbnQgdG8gbW92ZSBhIGZpbGUgb24gYSBzZXJ2ZXIgb3Igc2ltaWxhci4KCi0gR3VpbGxhdW1lIEFybHVpc29uIGFkZGVkIENVUkxJTkZPX05VTV9DT05ORUNUUyB0byBhbGxvdyBhbiBhcHAgdG8gZmlndXJlCiAgb3V0IGhvdyBtYW55IG5ldyBjb25uZWN0cyBhIHByZXZpb3VzIHRyYW5zZmVyIHJlcXVpcmVkLgoKICBJIGFkZGVkICV7bnVtX2Nvbm5lY3RzfSB0byB0aGUgY3VybCB0b29sIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTkyIGFuZCAxOTMKICB0byB2ZXJpZnkgdGhlIG5ldyBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDQpCi0gUGV0ZXIgV3VsbGluZ2VyIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBzaG91bGQgY2FsbCBzZXRsb2NhbGUoKSBwcm9wZXJseSB0bwogIGluaXRpYXRlIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBvcGVyYXRpb25zLCB0byBtYWtlIHRoZSBJRE4gc3R1ZmYgd29yawogIGJldHRlci4KClZlcnNpb24gNy4xMi4yICgxOCBPY3RvYmVyIDIwMDQpCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiB3b3JrCiAgZmluZSBldmVuIGZvciB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMuCgotIHJ1bmVrbCBhdCBvcG9pbnQuY29tIGZvdW5kIG91dCAoYW5kIHByb3ZpZGVkIGEgZml4KSB0aGF0IGxpYmN1cmwgbGVha2VkCiAgbWVtb3J5IGZvciBjb29raWVzIHdpdGggdGhlICJtYXgtYWdlIiBmaWVsZCBzZXQuCgpHaXNsZSAoMTYgT2N0b2JlciAyMDA0KQotIElzc3VlIDUwIGluIFRPRE8tUkVMRUFTRTsgQWRkZWQgVHJhaWFuIE5pY29sZXNjdSdzIHBhdGNoZXMgZm9yIHRocmVhZGVkCiAgcmVzb2x2ZXIgb24gV2luZG93cy4gUGx1Z2dlZCBzb21lIHBvdGVudGlhbCBoYW5kbGUgYW5kIG1lbW9yeSBsZWFrcy4KCkRhbmllbCAoMTQgT2N0b2JlciAyMDA0KQotIEVyaWMgVmVyZ25hdWQgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCB0cmVhdCA/LWxldHRlcnMgaW4gdGhlIHVzZXIKICBuYW1lIGFuZCBwYXNzd29yZCBmaWVsZHMgcHJvcGVybHkgaW4gVVJMcywgbGlrZQogIGZ0cDovL3VzP2VyOnBhc3M/d29yZEBzaXRlLmNvbS8uIEFkZGVkIHRlc3QgMTkxIHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDQpCi0gbGliY3VybCBub3cgdXNlcyBTT19OT1NJR1BJUEUgZm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChNYWMgT1MgWCAxMC4yIG9yCiAgbGF0ZXIgaXMgb25lKSB0byBpbmhpYml0IHRoZSBTSUdQSVBFIHNpZ25hbCB3aGVuIHdyaXRpbmcgdG8gYSBzb2NrZXQgd2hpbGUKICB0aGUgcGVlciBkaWVzLiBUaGUgc2FtZSBlZmZlY3QgaXMgcHJvdmlkZSBieSB0aGUgTVNHX05PU0lHTkFMIHBhcmFtZXRlciB0bwogIHNlbmQoKSBvbiBvdGhlciBzeXN0ZW1zLiBBbGFuIFBpbnN0ZWluIHZlcmlmaWVkIHRoZSBmaXguCgpEYW5pZWwgKDEwIE9jdG9iZXIgMjAwNCkKLSBTeXN0ZW1zIHdpdGggNjRiaXQgbG9uZ3Mgbm8gbG9uZ2VyIHVzZSBzdHJ0b2xsKCkgb3Igb3VyIHN0cnRvbGwtIHJlcGxhY2VtZW50CiAgdG8gcGFyc2UgNjQgYml0IG51bWJlcnMuIHN0cnRvbCgpIHdvcmtzIGZpbmUuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIHRvCiAgZGV0ZWN0IGlmIFtjb25zdGFudF1MTCB3b3JrcyBhbmQgaWYgc28sIHVzZSB0aGF0IGluIHRoZSBzdHJ0b2xsIHJlcGxhY2VtZW50CiAgY29kZSB0byB3b3JrIGFyb3VuZCBjb21waWxlciB3YXJuaW5ncyByZXBvcnRlZCBieSBBbmR5IENlZGlsbmlrLgoKR2lzbGUgKDYgT2N0b2JlciAyMDA0KQotIEZvciBVU0VfTElCSUROIGJ1aWxkczogQWRkZWQgVG9wLUxldmVsLURvbWFpbiAoVExEKSBjaGVjayBvZiBob3N0LW5hbWUKICB1c2VkIGluIGZpeF9ob3N0bmFtZSgpLiBDaGVja3MgaWYgY2hhcmFjdGVycyBpbiAnaG9zdC0+bmFtZScgKGluZGlyZWN0bHkKICB2aWEgJ2FjZV9ob3N0bmFtZScpIGFyZSBsZWdhbCBhY2NvcmRpbmcgdG8gdGhlIFRMRCB0YWJsZXMgaW4gbGliaWRuLgoKRGFuaWVsICg2IE9jdG9iZXIgMjAwNCkKLSBDaGloLUNodW5nIENoYW5nIHJlcG9ydGVkIHRoYXQgaWYgeW91IHVzZSBDVVJMT1BUX1JFU1VNRV9GUk9NIGFuZCBlbmFibGVkCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgbGliY3VybCByZXBvcnRlZCBlcnJvciBpZiBhIHJlZGlyZWN0IGhhcHBlbmVkIGV2ZW4KICBpZiB0aGUgbmV3IFVSTCB3b3VsZCBwcm92aWRlIHRoZSByZXN1bWVkIGZpbGUuIFRlc3QgY2FzZSAxODggYWRkZWQgdG8gdmVyaWZ5CiAgdGhlIGZpeCAodG9nZXRoZXIgd2l0aCBleGlzdGluZyB0ZXN0IDk5KS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgY29uZmlndXJlIGZsYXcgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIGJvdGggbnNsIGFuZCBzb2NrZXQKICBsaWJzIHRvIHVzZSBnZXRob3N0YnluYW1lKCkuCgotIFJlbW92ZWQgdGFicyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGxvdHMgb2Ygc291cmNlIGZpbGVzLgoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNCkKLSBNYWRlIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuPVBBVEggdHJ5IHRoZSBnaXZlbiBQQVRIIGJlZm9yZSB0aGUgZGVmYXVsdAogIHBhdGhzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUuCgotIElmIGlkbmFfc3RyZXJyb3IoKSBpcyBwcmVzZW50IGluIGxpYmlkbiwgd2UgY2FuIHVzZSB0aGF0IGluc3RlYWQgb2Ygb3VyCiAgaW50ZXJuYWwgcmVwbGFjZW1lbnQuIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGJ5IFNpbW9uIGluIGxpYmlkbiAwLjUuNiBhbmQKICBpcyBkZXRlY3RlZCBieSBjb25maWd1cmUuCgotIEl0IHNlZW1zIGJhc2VuYW1lKCkgb24gSVJJWCBpcyBpbiB0aGUgbGliZ2VuIGxpYnJhcnkgYW5kIHNpbmNlIHdlIGRvbid0IHVzZQogIHRoYXQsIGNvbmZpZ3VyZSBmaW5kcyBsaWJnZW4uaCBidXQgbm90IGJhc2VuYW1lIGFuZCB0aGVuIHdlIGdldCBhIGNvbXBpbGVyCiAgZXJyb3IgYmVjYXVzZSBvdXIgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBkb2Vzbid0IG1hdGNoIHRoZSBwcm90byBpbgogIGxpYmdlbi5oLiBTdGFydGluZyBub3csIHdlIGRvbid0IGluY2x1ZGUgdGhlIGZpbGUgaWYgYmFzZW5hbWUgd2Fzbid0IGZvdW5kCiAgYXMgd2VsbC4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDQpCi0gQ2hyaXMgZm91bmQgYSByYWNlIGNvbmRpdGlvbiByZXN1bHRpbmcgaW4gQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgYW5kCiAgcG90ZW50aWFsIGNyYXNoLCBpbiB0aGUgd2luZG93cyB0aHJlYWRlZCBuYW1lIHJlc29sdmVyIGNvZGUuCgpEYW5pZWwgKDMgT2N0b2JlciAyMDA0KQotIFJlcGxhY2VkIHRoZSB1c2Ugb2YgaXNzcGFjZSgpIGluIGNvb2tpZS5jIHdpdGggb3VyIG93biB2ZXJzaW9uIGluc3RlYWQgc2luY2UKICB3ZSBoYXZlIG1vc3QgZGF0YSBhcyAnY2hhciAqJyBhbmQgdGhhdCBtYWtlcyB1cyBwYXNzIGluIG5lZ2F0aXZlIHZhbHVlcyBpZgogIHRoZXJlIGlzIDhiaXQgZGF0YSBpbiB0aGUgc3RyaW5nLiBDaGFuZ2luZyB0byB1bnNpZ25lZCBjYXVzZXMgdG9vIG11Y2gKICB3YXJuaW5ncyBvciB0b28gbWFueSByZXF1aXJlZCB0eXBlY2FzdHMgdG8gdGhlIG5vcm1hbCBzdHJpbmcgZnVuY3Rpb25zLgogIEhhcnNoYWwgUHJhZGhhbiBpZGVudGlmaWVkIHRoaXMgcHJvYmxlbS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgY291bGQgcmVhZCBhbHJlYWR5IGZyZWVkCiAgZGF0YSB3aGVuIENVUkxPUFRfVkVSQk9TRSBpcyB1c2VkIGFuZCBhICh2ZXJ5KSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIEl0CiAgaGFwcGVuZWQgd2hlbiB0aGUgZG5zIGNhY2hlIGVudHJ5IGZvciB0aGUgY29ubmVjdGlvbiB3YXMgcHJ1bmVkIHdoaWxlIHRoZQogIGNvbm5lY3Rpb24gd2FzIHN0aWxsIGFsaXZlIGFuZCB0aGVuIGFnYWluIHJlLXVzZWQuIFdlIHdvcmtlZCB0b2dldGhlciBvbgogIHRoaXMgZml4LgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSAobGliaWRuCiAgYmFzZWQpIElETiBjb252ZXJzaW9uIGZhaWxzLiBUaGlzIGlzIHJlYWxseSBkdWUgdG8gYSBtaXNzaW5nIHN1aXRhYmxlCiAgZnVuY3Rpb24gaW4gdGhlIGxpYmlkbiBBUEkgdGhhdCBJIGhvcGUgd2UgY2FuIHJlbW92ZSBvbmNlIGxpYmlkbiBnZXRzIGEKICBmdW5jdGlvbiBsaWtlIHRoaXMuCgpEYW5pZWwgKDEgT2N0b2JlciAyMDA0KQotIEFsZWtzYW5kYXIgTWlsaXZvamV2aWMgcmVwb3J0ZWQgYSBwcm9ibGVtIGluIHRoZSBSZWRoYXQgYnVnemlsbGEgKHNlZQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTM0MTMzKSBhbmQgbm90IHRvCiAgYW55b25lIGludm9sdmVkIGluIHRoZSBjdXJsIHByb2plY3QhIFRoaXMgaGFwcGVucyB3aGVuIHlvdSB0cnkgdG8gY3VybCBhCiAgZmlsZSBmcm9tIGEgcHJvZnRwZCBzaXRlIHVzaW5nIFNTTC4gSXQgc2VlbXMgcHJvZnRwZCBzZW5kcyBhIHNvbWV3aGF0CiAgdW5vcnRob2RveCByZXNwb25zZSBjb2RlICgyMzIgaW5zdGVhZCBvZiAyMzApLiBJIHJlbGF4ZWQgdGhlIHJlc3BvbnNlIGNvZGUKICBjaGVjayB0byBkZWFsIHdpdGggdGhpcyBhbmQgc2ltaWxhciBjYXNlcy4KCi0gQmFzZWQgb24gRmVkb3IgS2FycGVsZXZpdGNoJ3MgZm9ybXBvc3QgcGF0aCBiYXNlbmFtZSBwYXRjaCwgZmlsZSBwYXJ0cyBpbgogIGZvcm1wb3N0cyBubyBsb25nZXIgaW5jbHVkZSB0aGUgcGF0aCBwYXJ0LiBJZiB5b3UgX3JlYWxseV8gd2FudCB0aGVtLCB5b3UKICBtdXN0IHByb3ZpZGUgeW91ciBwcmVmZXJyZWQgZnVsbCBmaWxlIG5hbWUgd2l0aCBDVVJMRk9STV9GSUxFTkFNRS4KCiAgQWRkZWQgZGV0ZWN0aW9uIGZvciBsaWJnZW4uaCBhbmQgYmFzZW5hbWUoKSB0byBjb25maWd1cmUuIE15IGN1c3RvbQogIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBpdCwgbWlnaHQgYmUgYSBiaXQgdG9vCiAgbmFpdmUuLi4KCiAgVXBkYXRlZCA2IHRlc3QgY2FzZXMgdG8gbWFrZSB0aGVtIHdvcmsgd2l0aCB0aGUgc3RyaXBwZWQgcGF0aHMuCgpEYW5pZWwgKDMwIFNlcHRlbWJlciAyMDA0KQotIExhcnJ5IENhbXBiZWxsIGFkZGVkIENVUkxJTkZPX09TX0VSUk5PIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdGhhdCBhbGxvd3MgYW4KICBhcHAgdG8gcmV0cmlldmUgdGhlIGVycm5vIHZhcmlhYmxlIGFmdGVyIGEgKGNvbm5lY3QpIGZhaWx1cmUuIEl0IHdpbGwgbWFrZQogIHNlbnNlIHRvIHByb3ZpZGUgdGhpcyBmb3IgbW9yZSBmYWlsdXJlcyBpbiBhIG1vcmUgZ2VuZXJpYyB3YXksIGJ1dCBsZXQncwogIHN0YXJ0IGxpa2UgdGhpcy4KCi0gR/xudGVyIEtuYXVmIGFuZCBDYXNleSBPJ0Rvbm5lbGwgd29ya2VkIG91dCBhbiBleHRyYSAjaWYgY29uZGl0aW9uIGZvciB0aGUKICBjdXJsL211bHRpLmggaGVhZGVyIHRvIHdvcmsgYmV0dGVyIGluIHdpbnNvY2stdXNpbmcgYXBwcy4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGJ1aWxkY29uZiBydW4gYmV0dGVyIG9uIE1hYyBPUyBYIGJ5CiAgcHJvcGVybHkgdXNpbmcgZ2xpYnRvb2xpemUgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29saXplLiAoVGhpcyBpcyBtYWRlIGlmCiAgZ2xpYnRvb2wgd2FzIGZvdW5kIGFuZCB1c2VkIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbC4pCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHNvIHRoYXQgaXQgZG9lc24ndCBtaXN0YWtpbmdseQogIGVuYWJsZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDA0KQotICJNZWtvbmlrdW0iIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBidWlsdCBjdXJsIHdpdGhvdXQgU1NMIHN1cHBvcnQsIGFsdGhvdWdoCiAgeW91ciBjdXJyZW50IFNTTCBpbnN0YWxsYXRpb24gc3VwcG9ydHMgRW5naW5lLCB0aGUgY29tcGlsZSBmYWlscy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDQpCi0gV2hlbiAtLXdpdGgtc3NsPVBBVEggaXMgdXNlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCwgaXQgbm8gbG9uZ2VyIHVzZXMKICBwa2ctY29uZmlnIHRvIGZpZ3VyZSBvdXQgZXh0cmEgZGV0YWlscy4gVGhhdCBpcyBub3cgb25seSBkb25lIGlmIG5vIFBBVEggaXMKICBpbmNsdWRlZCBvciBpZiBTU0wgaXMgY2hlY2tlZCBmb3IgYnkgZGVmYXVsdCB3aXRob3V0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbi4KCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9TU0xFTkdJTkUgY291bGRuJ3QgZXZlbiBiZSBzZXQgdG8KICBOVUxMIHdoZW4gbm8gZW5naW5lIHdhcyBzdXBwb3J0ZWQuIEl0IGNhbiBub3cuCgpEYW5pZWwgKDIyIFNlcHRlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBmaXhlZCB0aHJlZSB0ZXN0IGNhc2VzIHRvIG5vIGxvbmdlciB1c2UgImxvY2FsaG9zdCIgYnV0IGluc3RlYWQKICB1c2UgIjEyNy4wLjAuMSIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoYXQgbG9jYWxob3N0IHJlc29sdmVzIG5pY2VseS4KCi0gSmVhbi1DbGF1ZGUgQ2hhdXZlIGZpeGVkIGFuIExEQVAgY3Jhc2ggd2hlbiBtb3JlIHRoYW4gb25lIHJlY29yZCB3YXMKICByZXRyaWV2ZWQuCgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDA0KQotIEFuZHJlYXMgUmlla2UgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgd2l0aG91dAogIGEgc2VydmljZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGN1cmxfZWFzeV9wZXJmb3JtKCkgZGlkbid0IHByb3Blcmx5IHByb3ZpZGUKICBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBDVVJMT1BUX0VSUk9SQlVGRkVSIGJ1ZmZlci4KCkRhbmllbCAoMTYgU2VwdGVtYmVyIDIwMDQpCi0gRGFuaWVsIGF0IHRvdWNodHVuZXMgdXNlcyB0aGUgRlRQK1NTTCBzZXJ2ZXIgIkJTREZUUEQtU1NMIGZyb20KICBodHRwOi8vYnNkZnRwZC1zc2wuc2MucnUvIiB3aGljaCBhY2NvcmRpbmdseSBkb2Vzbid0IHByb3Blcmx5IHdvcmsgd2l0aCBjdXJsCiAgd2hlbiAiQVVUSCBTU0wiIGlzIGlzc3VlZCAoYWx0aG91Z2ggdGhlIHNlcnZlciByZXNwb25kcyBmaW5lIGFuZCBldmVyeXRoaW5nKQogIGJ1dCByZXF1aXJlcyB0aGF0IGN1cmwgaXNzdWVzICJBVVRIIFRMUyIgaW5zdGVhZC4gU2VlCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMDk1MTk0NDkzNzYwMyZzdXBwb3J0PXllcwoKICBJbnRyb2R1Y2luZyBDVVJMT1BUX0ZUUFNTTEFVVEggdGhhdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCB3aGljaAogIG9mIHRoZSBBVVRIIHN0cmluZ3MgdG8gYXR0ZW1wdCBmaXJzdC4KCi0gQW5vbnltb3VzIGZpbGVkIGJ1ZyByZXBvcnQgIzEwMjk0Nzggd2hpY2ggaWRlbnRpZmllZCBhIGJ1ZyB3aGVuIHlvdSAxKSB1c2VkCiAgYSBVUkwgd2l0aG91dCBwcm9wZXJseSBzZXBlcmF0aW5nIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpdGggYQogIHNsYXNoLiAyKSB0aGUgVVJMIGhhZCBwYXJhbWV0ZXJzIHRvIHRoZSByaWdodCBvZiBhID8gdGhhdCBjb250YWlucyBhIHNsYXNoCiAgMykgY3VybCB3YXMgdG9sZCB0byBmb2xsb3cgTG9jYXRpb246cyA0KSB0aGUgcmVxdWVzdCBnb3QgYSByZXNwb25zZSB0aGF0CiAgY29udGFpbmVkIGEgTG9jYXRpb246IHRvIHJlZGlyZWN0IHRvICIvZGlyIi4gY3VybCB0aGVuIGFwcGVuZGVkIHRoZSBuZXcgcGF0aAogIG9uIHRoZSB3cm9uZyBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgVVJMLgoKICBUZXN0IGNhc2UgMTg3IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdhcyBmaXhlZCBwcm9wZXJseS4KCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDQpCi0gQWRkZWQgcGFyc2VkYXRlLmMgdGhhdCBjb250YWlucyBhIHJld3JpdGUgb2YgdGhlIGRhdGUgcGFyc2VyIGN1cnJlbnRseQogIHByb3ZpZGVkIGJ5IGdldGRhdGUueS4gVGhlIG5ldyBvbmUgaXMgTVVDSCBzbWFsbGVyIGFuZCB3aWxsIGFsbG93IHVzIHRvIHJ1bgogIGF3YXkgZnJvbSB0aGUgeWFjYy9iaXNvbiBqdW5nbGUuIEl0IGlzIGFsc28gc2xpZ2h0bHkgbGFja2luZyBpbiBmZWF0dXJlcwogIGNvbXBhcmVkIHRvIHRoZSBvbGQgb25lLCBidXQgaXQgc3VwcG9ydHMgcGFyc2luZyBvZiBhbGwgZGF0ZSBmb3JtYXRzIEhUVFAKICBpbnZvbHZlcyAoYW5kIGEgZmFpciBidW5jaCBvZiBvdGhlcnMpLgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwNCkKLSBBcyBmb3VuZCBvdXQgYnkgSm9uYXMgRm9yc21hbiwgY3VybCBkaWRuJ3QgYWxsb3cgLUYgdG8gc2V0IENvbnRlbnQtVHlwZSBvbgogIHRleHQtcGFydHMuIFN0YXJ0aW5nIG5vdywgd2UgY2FuIGRvIC1GICJuYW1lPWRhbmllbDt0eXBlPXRleHQvZXh0cmEiLiBBZGRlZAogIHRlc3QgY2FzZSAxODYgdG8gdmVyaWZ5LgoKLSBCdWcgcmVwb3J0ICMxMDI1OTg2LiBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB3aXRoIGEgY3VzdG9tIEhvc3Q6IGhlYWRlcgogIHJlcGxhY2VtZW50LCBjdXJsIG9ubHkgcmVwbGFjZWQgdGhlIEhvc3Q6IGhlYWRlciBvbiB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIGRpZG4ndCByZXBsYWNlIGl0IG9uIHRoZSBmb2xsb3dpbmcgb25lcy4gVGhpcyByZXN1bHRlZCBpbiByZXF1ZXN0cyB3aXRoCiAgdHdvIEhvc3Q6IGhlYWRlcnMuCgogIE5vdywgY3VybCBjaGVja3MgaWYgdGhlIGxvY2F0aW9uIGlzIG9uIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCB0aGVuIGNvbnRpbnVlcyB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIuIEFuZCB3aGVuIGl0IG1vdmVzIHRvIGFub3RoZXIKICBob3N0LCBpdCBkb2Vzbid0IHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBidXQgaXQgYWxzbyBkb2Vzbid0IG1ha2UgdGhlCiAgc2Vjb25kIEhvc3Q6IGhlYWRlciBnZXQgdXNlZCBpbiB0aGUgcmVxdWVzdC4KCiAgVGhpcyBjaGFuZ2UgaXMgdmVyaWZpZWQgYnkgdGhlIHR3byBuZXcgdGVzdCBjYXNlcyAxODQgYW5kIDE4NS4KCkRhbmllbCAoOCBTZXB0ZW1iZXIgMjAwNCkKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSB0byBiZSBhYmxlIHRvIHVzZSBhbmQgcnVuIHdpdGggY3VzdG9taXplZCBwb3J0CiAgbnVtYmVycy4gVGhpcyB3YXMgYWx3YXlzIGludGVuZGVkIGJ1dCBuZXZlciBiZWZvcmUgcG9zc2libGUuIE5vdyBhIHNpbXBsZQogIGNoYW5nZSBpbiB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNhbiBtYWtlIGFsbCB0ZXN0cyB1c2UgZGlmZmVyZW50IHBvcnRzLgogIFRoZSBkZWZhdWx0IHBvcnRzIGluIHVzZSBmcm9tIG5vdyBvbiBhcmUgODk5MCB0byA4OTkzLgoKRGFuaWVsICgyIFNlcHRlbWJlciAyMDA0KQotIE1pbm9yIG1vZGlmaWNhdGlvbiBvZiBhbiBTU0wtcmVsYXRlZCBlcnJvciBtZXNzYWdlLgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwNCkKLSBEYXZpZCBUYXJlbmRhc2ggZm91bmQgb3V0IHRoYXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgcmV0dXJuZWQKICBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaW5zdGVhZCBvZiBDVVJMTV9PSy4KCkRhbmllbCAoMzAgQXVndXN0IDIwMDQpCi0gTWFrZSAiUHJveHktQ29ubmVjdGlvbjogY2xvc2UiIGNsb3NlIHRoZSBjdXJyZW50IHByb3h5IGNvbm5lY3Rpb24sIGFzIFJvbWFuCiAgS29pZm1hbiBmb3VuZCBvdXQuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA0KQotIEZpeGVkIGEgZ2V0ZGF0ZSBwcm9ibGVtIGJ5IHBvc3QtcmVwbGFjaW5nIHRoZSBnZXRkYXRlLmMgZmlsZSBhZnRlciB0aGUKICBiaXNvbi95YWNjIHByb2Nlc3MgdG8gYWRkIHRoZSBmaXggSGFyc2hhbCBQcmFkaGFuIHN1Z2dlc3RlZC4gVGhlIHByb2JsZW0KICBjYXVzZWQgYSBjcmFzaCBvbiBXaW5kb3dzIHdoZW4gcGFyc2luZyBzb21lIGRhdGVzLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwNCkKLSBSb21hbiBLb2lmbWFuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBzZW5kIEV4cGVjdDogMTAwLWNvbnRpbnVlIG9uIFBPU1RzCiAgZXZlbiB3aGVuIHRvbGQgdG8gdXNlIEhUVFAgMS4wLCB3aGljaCBpcyBub3QgY29ycmVjdC4gVGVzdCBjYXNlIDE4MCBhbmQKICAxODEgdmVyaWZ5IHRoaXMuCgotIEFkZGVkIHRlc3QgY2FzZSAxODIgdG8gdmVyaWZ5IHRoYXQgemVybyBieXRlIHRyYW5zZmVycyBjYWxsIHRoZSBjYWxsYmFjawogIHByb3Blcmx5LgoKRGFuaWVsICgyMCBBdWd1c3QgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSB3cml0ZSBjYWxsYmFjayBnZXQgY2FsbGVkIGV2ZW4gd2hlbiBhIHplcm8KICBieXRlIGZpbGUgaXMgZG93bmxvYWRlZC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDQpCi0gTGluZyBUaGlvIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IGlwdjYtZW5hYmxlZCwgaXQgc3RpbGwgZGlkCiAgcmV2ZXJzZSBETlMgbG9va3VwcyB3aGVuIGZlZCB3aXRoIGEgbnVtZXJpY2FsIElQLWFkZHJlc3MgKGxpa2UKICBodHRwOi8vMTI3LjAuMC4xLyksIGFsdGhvdWdoIGl0IGRvZXNuJ3Qgd2hlbiBidWlsdCBpcHY2LWRpc2FibGVkLiBsaWJjdXJsCiAgc2hvdWxkIG5ldmVyIGRvIHJldmVyc2UgbG9va3Vwcy4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDQpCi0gS2pldGlsIEphY29ic2VuIG5vdGljZWQgdGhhdCB3aGVuIHRyYW5zZmVycmluZyBhIGZpbGU6Ly8gVVJMIHBvaW50aW5nIHRvIGFuCiAgZW1wdHkgZmlsZSwgbGliY3VybCB3b3VsZCByZXR1cm4gd2l0aCB0aGUgZmlsZSBzdGlsbCBvcGVuLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGRlZmluZQogIF9USFJFQURfU0FGRSBmb3IgQUlYIHN5c3RlbXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWx0IHJlYWxseSB0aHJlYWQtc2FmZS4KCiAgQWxzbyBhZGRlZCBhIGNoZWNrIGZvciB0aGUgeGxjIGNvbXBpbGVyIG9uIEFJWCwgYW5kIGlmIHRoYXQgaXMgZGV0ZWN0IHdlIHVzZQogIHRoZSAtcXRocmVhZGVkIGNvbXBpbGVyIG9wdGlvbgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwNCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgYSBjdXN0b20gIkFjY2VwdC1FbmNvZGluZzoiIGhlYWRlciBvdmVycmlkZSB0aGUKICBpbnRlcm5hbGx5IHNldCBvbmUgdGhhdCBnZXRzIHNldCB3aXRoIENVUkxPUFRfRU5DT0RJTkcuIFBvaW50ZWQgb3V0IGJ5IEFsZXguCgotIFJvbGFuZCBLcmlrYXZhIGZvdW5kIGFuZCBmaXhlZCBhIGNvb2tpZSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSAodGhlCiAgcGF0aCBtYXRjaGluZyB3YXMgd3JvbmcpLiBJIGFkZGVkIHRlc3QgY2FzZSAxNzkgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvCiAgcmlnaHQuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDA0KQotIENhc2V5IE8nRG9ubmVsbCBmaXhlZCBzb21lIE1TVkMgbWFrZWZpbGUgdGFyZ2V0cyB0byBsaW5rIHByb3Blcmx5LgoKRGFuaWVsICgxMSBBdWd1c3QgMjAwNCkKLSBjb25maWd1cmUgbm93IGRlZmluZXMgX1hPUEVOX1NPVVJDRSB0byA1MDAgb24gc3lzdGVtcyB0aGF0IG5lZWQgaXQgdG8gYnVpbGQKICB3YXJuaW5nLWZyZWUgKHRoZSBvbmx5IGtub3duIG9uZSBzbyBmYXIgaXMgbm9uLWdjYyBidWlsZHMgb24gNjRiaXQgU0dJCiAgSVJJWCkuIChSZXZlcnRlZCB0aGlzIGNoYW5nZSBsYXRlciBhcyBpdCBjYXVzZWQgY29tcGlsZXIgZXJyb3JzLikKCi0gdGhlIEZUUCBjb2RlIG5vdyBpbmNsdWRlcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlCiAgc2VydmVyIGdpdmVzIGJhY2sgYSA1MzAgYWZ0ZXIgdGhlIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBhcyBpdCBpc24ndAogIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGEgYmFkIHVzZXIgbmFtZSBvciBwYXNzd29yZC4KClZlcnNpb24gNy4xMi4xICgxMCBBdWd1c3QgMjAwNCkKCkRhbmllbCAoMTAgQXVndXN0IDIwMDQpCi0gSW4gT3BlblNTTCAwLjkuN2QgYW5kIGVhcmxpZXIsIEFTTjFfU1RSSU5HX3RvX1VURjggZmFpbHMgaWYgdGhlIGlucHV0IGlzCiAgYWxyZWFkeSBVVEYtOCBlbmNvZGVkLiBUaGlzIG1hZGUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsIGlmIHRoZQogIHJlbW90ZSBzZXJ2ZXIgdXNlZCBhIGNlcnRpZmljYXRlIHdpdGggdGhlIG5hbWUgVVRGLTggZW5jb2RlZC4KCiAgV29yay1hcm91bmQgYnJvdWdodCBieSBBbGV4aXMgUy4gTC4gQ2FydmFsaG8uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDQpCi0gSSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3Iga3JiNCB0byB1c2UgLWxjb21fZXJyIGFzIHdlbGwsIGFzIEkgc3RhcnRlZAogIHRvIGdldCBsaW5rIHByb2JsZW1zIHdpdGggaXQgdW5sZXNzIEkgZGlkIHRoYXQgb24gbXkgU29sYXJpcyAyLjcgYm94LiBJCiAgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgSSBzdGFydGVkIHRvIGdldCBwcm9ibGVtcyB3aXRoIHRoaXMgbm93IQoKRGFuaWVsICg1IEF1Z3VzdCAyMDA0KQotIEVucmljbyBTY2hvbHogZml4ZWQgdGhlIEhUVFAtTmVnb3RpYXRlIHNlcnZpY2UgbmFtZSB0byBiZSB1cHBlcmNhc2UgYXMKICByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMDA0MTA1CgpEYW5pZWwgKDQgQXVndXN0IDIwMDQpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0CiAgdXNpbmcgbXVsdGlwbGUgSVAgKGJhZCkgYWRkcmVzc2VzLgoKLSBEeWxhbiBTYWxpc2J1cnkgbWFkZSBsaWJjdXJsIG5vIGxvbmdlciBhY2NlcHQgY29va2llcyBzZXQgdG8gYSBUTEQgb25seSAoaXQKICBwcmV2aW91c2x5IGFsbG93ZWQgdGhhdCBvbiB0aGUgc2V2ZW4gdGhyZWUtbGV0dGVyIGRvbWFpbnMpLgoKRGFuaWVsICgzMSBKdWx5IDIwMDQpCi0gSm9lbCBDaGVuIHJlcG9ydGVkIHRoYXQgdGhlIGRpZ2VzdCBjb2RlIGFzc3VtZWQgcXVvdGVzIGFyb3VuZCB0aGUgY29udGVudHMgYQogIGJpdCB0b28gbXVjaC4KCkRhbmllbCAoMjggSnVseSAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRoZSBob3N0IG5hbWUgdG8gZ2V0IHNldHVwIHByb3Blcmx5IGV2ZW4gd2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkLCB3aGVuIGEgcHJveHkgaXMgaW4gdXNlLiBQcmV2aW91c2x5IHRoZSB3cm9uZyBIb3N0OgogIGhlYWRlciBjb3VsZCBnZXQgc2VudCB3aGVuIHJlLXVzaW5nIGEgcHJveHkgY29ubmVjdGlvbiB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKLSBGaXhlZCBCcmlhbiBBa2lucycgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCBkdXBsaWNhdGUgSG9zdDogaGVhZGVycyBvbiByZS11c2VkCiAgY29ubmVjdGlvbnMuIElmIHlvdSBhdHRlbXB0ZWQgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGluIHRoZSBzZWNvbmQKICByZXF1ZXN0LCB5b3UgZ290IHR3byBzdWNoIGhlYWRlcnMhCgotIHNyYy9NYWtlZmlsZS5hbSBub3cgaW5jbHVkZXMgdGhlIE1ha2VmaWxlLmluYyBmaWxlIHRvIGdldCBpbmZvIGFib3V0IGZpbGVzCgpEYW5pZWwgKDI2IEp1bHkgMjAwNCkKLSBNYWRlICJjdXJsIFtVUkxdIC1vIG5hbWUjMiIgd29yayBhcyBleHBlY3RlZC4gSWYgdGhlcmUncyBubyBnbG9iYmluZyBmb3IgdGhlCiAgIy1udW1iZXIsIGl0IHdpbGwgc2ltcGx5IGJlIHVzZWQgYXMgIzIgaW4gdGhlIGZpbGUgbmFtZS4KCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGVzdGluZyB3aXRoIHZhbGdyaW5kIDIuMS54IGFuZCBhZGRlZCB0d28gbWlzc2luZwogIG5ld2xpbmVzIGluIHRoZSBjb29raWUgaW5mb3JtYXRpb25hbHMuCgpEYW5pZWwgKDI0IEp1bHkgMjAwNCkKLSBJIGZpeGVkIHRoZSBhdXRvYnVpbGRzIHdpdGggYXJlcywgc2luY2UgdGhleSBub3cgbmVlZCB0byBoYXZlIGJ1aWxkY29uZiBydW4KICBpbiB0aGUgYXJlcyBkaXIgYmVmb3JlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bi4KCi0gQWRkZWQgQ2FzZXkgTydEb25uZWxsJ3MgY3VybF9lYXN5X3Jlc2V0KCkgZnVuY3Rpb24uIEl0IGhhcyBhIHByb3RvIGluCiAgY3VybC9jdXJsLmggYnV0IHdlIGhhdmUgbm8gbWFuIHBhZ2UgeWV0LgoKRGFuaWVsICgyMCBKdWx5IDIwMDQpCi0gQWRkZWQgYnVpbGRjb25mIGFuZCBidWlsZGNvbmYuYmF0IHRvIHRoZSByZWxlYXNlIGFyY2hpdmVzLCBzaW5jZSB0aGV5IGFyZQogIGhhbmR5IGZvciByZWJ1aWxkaW5nIGN1cmwgd2hlbiB1c2luZyBhIGRhaWx5IHNuYXBzaG90IChhbmQgbm90IGEgcHVyZSBDVlMKICBjaGVja291dCkuCgpEYW5pZWwgKDE2IEp1bHkgMjAwNCkKLSBBcyBzdWdnZXN0ZWQgYnkgVG9ieSBQZXRlcnNvbiwgbGliY3VybCBub3cgaWdub3JlcyBDb250ZW50LUxlbmd0aCBkYXRhIGlmIHRoZQogIGdpdmVuIHNpemUgaXMgYSBuZWdhdGl2ZSBudW1iZXIuIFRlc3QgY2FzZSAxNzggdmVyaWZpZXMgdGhpcy4KCkRhbmllbCAoMTQgSnVseSAyMDA0KQotIEf8bnRlciBLbmF1ZiBoYXMgbWFkZSB0aGUgTmV0d2FyZSBidWlsZHMgZG8gd2l0aG91dCB0aGUgY29uZmlnLW5ldHdhcmUuaAogIGZpbGVzLCBzbyB0aGV5IGFyZSBub3cgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0IHBhY2thZ2VzLgoKLSBH/G50ZXIgS25hdWYgbWFkZSBjdXJsIGFuZCBsaWJjdXJsIGJ1aWxkIHdpdGggQm9ybGFuZCBhZ2Fpbi4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCB0aGUgY29tbW9uIHRlc3QgNTA1IGZhaWx1cmVzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDYgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgd2luZG93cyB0ZXN0cyBmYWlsZWQgb24gZmlsZTovLyAidXBsb2FkcyIuCgpEYW5pZWwgKDIgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgcmVwb3J0ZWQgYSBjdXJsX3NoYXJlX2NsZWFudXAoKSBjcmFzaCB0aGF0IG9jY3VycyB3aGVuIG5vCiAgbG9jay91bmxvY2sgY2FsbGJhY2tzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBzaGFyZSBpcyBjbGVhbmVkIHVwLgoKRGFuaWVsICgxIEp1bHkgMjAwNCkKLSBXaGVuIHVzaW5nIGN1cmwgLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpLCBubyB0cmFjZSBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudAogIGJ5IGN1cmxfZWFzeV9jbGVhbnVwKCkgd2VyZSBpbmNsdWRlZCBpbiB0aGUgdHJhY2UgZmlsZS4gVGhpcyBtYWRlIHRoZQogIG1lc3NhZ2UgIkNsb3NpbmcgY29ubmVjdGlvbiAjMCIgbmV2ZXIgYXBwZWFyIGluIHRyYWNlIGR1bXBzLgoKRGFuaWVsICgzMCBKdW5lIDIwMDQpCi0gTmllbHMgdmFuIFRvbmdlcmVuIGZvdW5kIHRoYXQgc2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGRvZXNuJ3QgZGlzYWJsZQogIGEgcHJldmlvdXNseSBzZXQgUE9TVCByZXF1ZXN0LCBtYWtpbmcgYSB2ZXJ5IG9kZCByZXF1ZXN0IGdldCBzZW50ICh1bmxlc3MKICB5b3UgZGlzYWJsZWQgdGhlIFBPU1QpIGEgSEVBRCByZXF1ZXN0IHdpdGggYSBQT1NUIHJlcXVlc3QtYm9keS4gSSd2ZSBub3cKICBtYWRlIENVUkxPUFRfTk9CT0RZIGVuZm9yY2UgYSBwcm9wZXIgSEVBRC4gQWRkZWQgdGVzdCBjYXNlIDUxNCBmb3IgdGhpcy4KCkRhbmllbCAoMjkgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBtYWRlIHRoZSB0ZXN0Y3VybC5wbCBzY3JpcHQgY2FwYWJsZSBvZiB1c2luZyBhIGN1c3RvbSBzZXR1cAogIGZpbGUgdG8gZWFzaWVyIHJ1biBtdWx0aXBsZSBhdXRvYnVpbGRzIG9uIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgoKLSBHaXNsZSBmaXhlZCB0aGUgZGpncHAgYnVpbGQgYW5kIGZpeGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gc29tZSBvZiB0aGUKICByZW9yZ2VkIG5hbWUgcmVzb2x2ZWQgY29kZS4KCi0gRml4ZWQgY29kZSB0byBhbGxvdyBjb25uZWN0cyBkb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gYXR0ZW1wdCB0aGUKICBuZXh0IElQIHdoZW4gY29ubmVjdGluZyB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0byBtdWx0aXBsZSBJUHMgYW5kIGEKICBjb25uZWN0IGF0dGVtcHQgZmFpbHMuCgpEYW5pZWwgKDI3IEp1bmUgMjAwNCkKLSBCYXNlZCBvbiBSb2IgU3RhbnplbCdzIGJ1ZyByZXBvcnQgIzk3OTQ4MCwgSSB3cm90ZSBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHBvbGwoKSBjYW4gYmUgdXNlZCB0byB3YWl0IG9uIE5VTEwgYXMgb3RoZXJ3aXNlIHNlbGVjdCgpIHNob3VsZCBiZQogIHVzZWQgdG8gZG8gaXQuIFRoZSBzZWxlY3QoKSB1c2FnZSB3YXMgYWxzbyBmaXhlZCBhY2NvcmRpbmcgdG8gaGlzIHJlcG9ydC4KCiAgTWFjIE9TIFggMTAuMyBzYXlzICJwb2xsKCkgZnVuY3Rpb25hbGl0eSBmb3IgTWFjIE9TIFggaXMgaW1wbGVtZW50ZWQgdmlhIGFuCiAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBzZWxlY3QoKSwgbm90IGluIHRoZSBrZXJuZWwgZGlyZWN0bHkuIEl0IGlzCiAgcmVjb21tZW5kZWQgdGhhdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIE9TIFggMTAuMyBwcmVmZXIgc2VsZWN0KCkgb3ZlcgogIHBvbGwoKS4gQ29uZmlndXJlIHNjcmlwdHMgc2hvdWxkIGxvb2sgZm9yIHRoZSBfUE9MTF9FTVVMX0hfIGRlZmluZSAoaW5zdGVhZAogIG9mIF9QT0xMX0hfIG9yIF9TWVNfUE9MTF9IXykgYW5kIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBwb2xsIGlzIG5vdAogIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwuIgoKICBZZXMsIHdlIGNhbiBwcm9iYWJseSB1c2Ugc2VsZWN0KCkgb24gbW9zdCBwbGF0Zm9ybXMgYnV0IHRvZGF5IEkgcHJlZmVyZWQgdG8KICBsZWF2ZSB0aGUgY29kZSB1bmFsdGVyZWQuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNCkKLSBUaGUgc3RhbmRhcmQgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBvbmx5IGluY2x1ZGVzIHZlcnNpb24gaW5mbyBhYm91dAogIGludm9sdmVkIGxpYnJhcmllcyBhbmQgbm90IGFib3V0IHBhcnRpY3VsYXIgZmVhdHVyZXMuIFRodXMgaXQgd2lsbCBubyBsb25nZXIKICBpbmNsdWRlIGluZm8gYWJvdXQgaXB2NiBub3IgR1NTLiBUaGF0IGluZm8gaXMgb2YgY291cnNlIHN0aWxsIGF2YWlsYWJsZSBpbgogIHRoZSBmZWF0dXJlIGJpdG1hc2sgY3VybF92ZXJzaW9uX2luZm8oKSBvZmZlcnMuCgotIFJlcGxhY2VkIGFsbCBvY2N1cmFuY2VzIG9mIHNwcmludGYoKSB3aXRoIHNucHJpbnRmKCkuIFRoaXMgaXMgbW9zdGx5IGJlY2F1c2UKICBpdCBpcyAiQSBHb29kIFRoaW5nIiByYXRoZXIgdGhhbiBhY3R1YWxseSBmaXhpbmcgYW55IGtub3duIHByb2JsZW0uIFRoaXMKICB3aWxsIGhlbHAgcHJldmVudGluZyBmdXR1cmUgcG9zc2libGUgbWlzdGFrZXMgdG8gY2F1c2UgYnVmZmVyIG92ZXJmbG93cy4KCi0gTWFqb3IgcmVvcmdhbml6YXRpb24gaW4gdGhlIGhvc3QgcmVzb2x2ZSBjb2RlIChhZ2FpbikuIFRoaXMgdGltZSwgSSd2ZQogIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdyBhbHdheXMgdXNlIGEgbGlua2VkIGxpc3Qgb2YgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzCiAgdG8gcmV0dXJuIHJlc29sdmVkIGluZm8gaW4sIG5vIG1hdHRlciB3aGF0IHJlc29sdmVyIG1ldGhvZCBvciBzdXBwb3J0IHRoYXQKICBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLiBJdCBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gd3JpdGUgY29kZSB0aGF0CiAgdXNlcyBvciBkZXBlbmRzIG9uIHJlc29sdmVkIGRhdGEuCgogIEludGVybmFsbHksIHRoaXMgbWVhbnMgYW1vbmdzdCBvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4gc3RvcCBkb2luZyB0aGUgd2VpcmQKICAiaW5jcmVhc2UgYnVmZmVyIHNpemUgdW50aWwgaXQgd29ya3MiIHRyaWNrIHdoZW4gcmVzb2x2aW5nIGhvc3RzIG9uCiAgaXB2NC1vbmx5IHdpdGggZ2V0aG9zdGJ5bmFtZV9yKCksIHdlIHN1cHBvcnQgc29ja3MgZXZlbiBvbiBsaWJjdXJscyBidWlsdAogIHdpdGggaXB2NiBlbmFibGVkIChidXQgb25seSB0byBzb2NrcyBzZXJ2ZXJzIHRoYXQgcmVzb2x2ZSB0byBhbiBpcHY0CiAgYWRkcmVzcykgYW5kIHdlIG5vIGxvbmdlciBkZWVwLWNvcHkgb3IgcmVsb2NhdGUgaG9zdGVudCBzdHJ1Y3RzICh3ZSBjcmVhdGUKICBDdXJsX2FkZHJpbmZvIGNoYWlucyBpbnN0ZWFkKS4KCiAgVGhlIG5ldyAiaG9zdGVudCB0byBDdXJsX2FkZHJpbmZvIiBjb252ZXJ0ZXIgZnVuY3Rpb24gaXMgbmFtZWQgQ3VybF9oZTJhaSgpCiAgYW5kIGlzIHNsaWdodGx5IG5haXZlIGFuZCBzaW1wbGUsIHlldCBJIGJlbGlldmUgaXQgaXMgZnVuY3Rpb25hbCBlbm91Z2ggdG8KICB3b3JrIGZvciBsaWJjdXJsLgoKRGFuaWVsICgyMiBKdW5lIDIwMDQpCi0gRGF2aWQgQ29oZW4gcG9pbnRlZCBvdXQgdGhhdCBSRkMyMTA5IHNheXMgY2xpZW50cyBzaG91bGQgYWxsb3cgY29va2llcyB0bwogIGNvbnRhaW4gbGVhc3QgNDA5NiBieXRlcyB3aGlsZSBsaWJjdXJsIG9ubHkgYWxsb3dlZCAyMDQ3LiBJIHJhaXNlZCB0aGUgbGltaXQKICB0byA0OTk5IG5vdyBhbmQgbWFkZSB0aGUgdXNlZCBidWZmZXIgZ2V0IG1hbGxvYygpZWQgaW5zdGVhZCBvZiBzaW1wbHkKICBhbGxvY2F0ZWQgb24gc3RhY2sgYXMgYmVmb3JlLiBFeHRlbmRlZCB0ZXN0IGNhc2UgNDYgdG8gaW5jbHVkZSBhIGNvb2tpZSB3aXRoCiAgdmVyeSBodWdlIGNvbnRlbnQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBnZXRkYXRlLnkgdG8gcmVtb3ZlIGEgZmV3IHdhcm5pbmdzLiBJIHJlbW92ZWQgdGhlCiAgaWZkZWYnZWQgdGVzdCB3ZSBuZXZlciBldmVyIHVzZSBhbnl3YXkuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBjaGVja3MgdG8gc3VwcG9ydCBhICcqJy1sZXR0ZXIKICBhbnl3aGVyZSBpbiB0aGUgd2lsZGNhcmQgc3RyaW5nLCBzdXBwb3J0IG11bHRpcGxlICcqJy1sZXR0ZXJzIGluIHRoZQogIHdpbGRjYXJkIGFuZCB0byBhbGxvdyB0aGUgJyonLWxldHRlciB0byBtYXRjaCBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGEgZG90LgoKRGFuaWVsICgyMSBKdW5lIDIwMDQpCi0gdGVzdGN1cmwuc2ggaXMgbm93IHJlbW92ZWQgY29tcGxldGVseSwgdGVzdHMvdGVzdGN1cmwucGwgaXMgdGhlIHNjcmlwdCB0bwogIHVzZSB3aGVuIGF1dG9idWlsZGluZyBjdXJsIQoKLSBLamV0aWwgSmFjb2JzZW4gYnJvdWdodCBteSBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90IHByb3Blcmx5CiAgYWJvcnQgYW4gdXBsb2FkIHdpdGggdGhlIHJlYWRmdW5jdGlvbiBjYWxsYmFjaywgc2luY2UgcmV0dXJuaW5nIDAgb3IgLTEgb25seQogIHN0b3BzIHRoZSB1cGxvYWQgYW5kIGxpYmN1cmwgd2lsbCBjb250aW51ZSB3YWl0aW5nIGZvciBkb3dubG9hZGVkIGRhdGEgYW5kCiAgdGhlIHNlcnZlciBvZnRlbiB3YWl0cyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVwbG9hZCBkYXRhIHRvIGFycml2ZS4KCiAgVGh1cywgSSd2ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgZm9yIHJlYWQgY2FsbGJhY2tzIHRvIHJldHVybgogIENVUkxfUkVBREZVTkNfQUJPUlQgdG8gYWJvcnQgYW4gdXBsb2FkIGZyb20gYSByZWFkIGNhbGxiYWNrLiBUaGlzIHdpbGwgc3RvcAogIHRoZSB0cmFuc2ZlciBpbW1lZGlhdGVseSB3aXRoIGEgQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyByZXR1cm4gY29kZS4KCiAgVGVzdCBjYXNlIDUxMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgaXQgd29ya3MuIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3QKICBIVFRQIHNlcnZlciB0b28gdG8gZHVtcCB0aGUgcmVxdWVzdCB0byBhIGZpbGUgZXZlbiB3aGVuIHRoZSBjbGllbnQKICBkaXNjb25uZWN0cyBwcmVtYXR1cmVseS4KCkRhbmllbCAoMTkgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHByb3ZpZGVkIGEgdGVzdCBjYXNlIHdpdGggYSBmYWlsaW5nIGN1cmwgb3BlcmF0aW9uOiB3aGVuIHdlIFBPU1QKICB0byBhIHNpdGUgd2l0aCAtLWRpZ2VzdCAob3Igc2ltaWxhcikgc2V0LCBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIDMwMgogIExvY2F0aW9uOiB0byB0aGUgImF1dGhwcm9iZSIgcmVxdWVzdCwgaXQgd2FzIG5vdCB0cmVhdGVkIGNvcnJlY3RseS4gV2Ugc3RpbGwKICB3aWxsIGJlaGF2ZSBiYWRseSBpZiBGT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkIGZvciB0aGlzIGNhc2UsIGJ1dCBJJ20gbm90CiAgaW4gdGhlIG1vb2QgdG8gZGl2ZSBpbnRvIHRoaXMgcmlnaHQgbm93IGFuZCB3aWxsIGxlYXZlIGl0IGFzLWlzIGZvciBub3cuCiAgVmVyaWZpZWQgbXkgZml4IHdpdGggdGVzdCBjYXNlIDE3Ny4KCkRhbmllbCAoMTggSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBwcm92aWRlcyBtb3JlIGRldGFpbHMgZnJvbSB0aGUgU1NMIGxheWVycyAoaWYgeW91CiAgdXNlIGFuIE9wZW5TU0wgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0KS4gSXQgYWxzbyBpbnRyb2R1Y2VzIHR3byBuZXcgdHlwZXMKICBvZiBkYXRhIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIGRlYnVnIGNhbGxiYWNrOiBDVVJMSU5GT19TU0xfREFUQV9JTiBhbmQKICBDVVJMSU5GT19TU0xfREFUQV9PVVQuCgotIFdpdGggRGF2aWQgQnlyb24ncyB0ZXN0IHNlcnZlciBJIGNvdWxkIHJlcGVhdCBoaXMgcHJvYmxlbSBhbmQgbWFrZSBzdXJlIHRoYXQKICBQT1NUaW5nIG92ZXIgSFRUUFM6Ly8gd2l0aCBOVExNIHdvcmtzIGZpbmUgbm93LiBUaGVyZSB3YXMgYSBnZW5lcmFsIHByb2JsZW0KICB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gd2l0aCBub24tR0VUIG9wZXJhdGlvbnMgd2l0aCBDT05ORUNULgoKRGFuaWVsICgxNiBKdW5lIDIwMDQpCi0gTW9kaWZpZWQgdG8ga2VlcCB0aGUgdXBsb2FkIGJ5dGUgY291bnRlciBpbiBhbiBjdXJsX29mZl90LCBub3QgYW4gaW50IGFzCiAgYmVmb3JlLiAzMmJpdHMgaXMgbm90IGVub3VnaC4gVGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgYnVnIEplYW4tTG91aXMgTGVtYWlyZQogIHJlcG9ydGVkIHRoYXQgbWFrZXMgMkdCIEZUUCB1cGxvYWRzIHRvIHJlcG9ydCBlcnJvciAoInVuYWxpZ25lZCBmaWxlIHNpemVzIikKICB3aGVuIGNvbXBsZXRlZC4KCkRhbmllbCAoMTUgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGF0IEkgZml4ZWQ6IGlmIHlvdSBkaWQgYSBQT1NUIHdpdGgKICBDVVJMQVVUSF9ESUdFU1Qgc2V0IGJ1dCB0aGUgc2VydmVyIGRpZG4ndCByZXF1aXJlIGFueSBhdXRoZW50aWNhdGlvbiwKICBsaWJjdXJsIHdvdWxkIHJlcGVhdGVkbHkgc2VuZCBIRUFEIGxvdHMgb2YgdGltZXMgdW50aWwgaXQgZ2l2ZXMgdXAuIFRoaXMgd2FzCiAgYWN0dWFsbHkgdGhlIGNhc2UgZm9yIGFsbCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9ucy4gQWRkZWQgdGVzdCBjYXNlIDE3NCwKICAxNzUgYW5kIDE3NiB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgSnVuZSAyMDA0KQotIE11bHRpcGFydCBmb3JtcG9zdHMgdXBsb2FkaW5nIGZpbGVzIG5vIGxvbmdlciBpbnNlcnRzIHRoZSBmaWxlcyB0aGVtc2VsdmVzCiAgaW50byB0aGUgaHVnZSBwcmVidWlsdCBjaHVuay4gVGhpcyBlbmFibGVzIGxpYmN1cmwgdG8gZm9ybXBvc3QgZmlsZXMgdGhhdCBpcwogIGxhcmdlciB0aGFuIHRoZSBhbW91bnQgb2Ygc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGUgZmlsZSBnaXZlbiBpcyBwYXNzZWQgb24KICBzdGRpbiwgbGliY3VybCBzdGlsbCB1c2VzIHRoZSBvbGQgbWV0aG9kIG9mIHJlYWRpbmcgdGhlIGZ1bGwgZmlsbCBiZWZvcmUgdGhlCiAgdXBsb2FkIHRha2VzIHBsYWNlLiBUaGlzIGFwcHJvYWNoIHdhcyBzZWxlY3RlZCBpbiBvcmRlciB0byBub3QgYWx0ZXIgdGhlCiAgYmVoYXZpb3IgZm9yIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgYXMgd2hlbiB1c2luZyBzdGRpbiBsaWJjdXJsIGNhbid0IGtub3cKICB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgb24KICBIVFRQIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICgxMyBKdW5lIDIwMDQpCi0gR2lzbGUgZm91bmQgb3V0IHRoYXQgd2UgZGlkIHdpbGRjYXJkIGNlcnQgbmFtZSBjaGVja3Mgd3JvbmcsIHNvIHRoYXQgcGFydHMKICBvZiB0aGUgY2hlY2sgd3JvbmdseSB3YXMgY2FzZSBzZW5zaXRpdmUuCgpEYW5pZWwgKDExIEp1bmUgMjAwNCkKLSBUaW0gU25lZGRvbiBicm91Z2h0IGEgbWlub3IgVk1TIGZpeCB0byBtYWtlIGN1cmwgYnVpbGQgcHJvcGVybHkgb24gaGlzIFZNUwogIG1hY2hpbmUuIEhlIGFsc28gaGFkIHNvbWUgaW50ZXJlc3RpbmcgbGliY3VybCBwYXRjaGVzLi4uIHRoZXkgbWlnaHQgYmUgYWJsZQogIHRvIGRvIGluIGEgc2xpZ2h0bHkgbmljZXIgd2F5LiBEaXNjdXNzaW9ucyBhcmUgaW4gcHJvZ3Jlc3MuCgpEYW5pZWwgKDEwIEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNvZGUgY2xlYW51cHNtIGJldHRlciB2ZXJib3NlIG91dHB1dCBhbmQgYmV0dGVyIGNvbm5lY3QKICB0aW1lb3V0IGhhbmRsaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzLgoKLSBTdGV2ZW4gQmF6eWwgYW5kIFNlc2h1YmFidSBQYXNhbSBwb2ludGVkIG91dCBhIGJ1ZyBvbiB3aW4zMiB3aGVuIGZyZWVpbmcgdGhlCiAgcGF0aCBhZnRlciBhIGZpbGU6Ly8gdHJhbnNmZXIuCgpEYW5pZWwgKDkgSnVuZSAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgJ2NvbmZpZ3VyZSAtLWRpc2FibGUtaHR0cCcgd29yayB0byBidWlsZCBsaWJjdXJsCiAgd2l0aG91dCBIVFRQIHN1cHBvcnQuIEkgYWRkZWQgYSBuZXcgcmV0dXJuIGNvZGUgZm9yIGN1cmxfZm9ybWFkZCgpIGluIGNhc2UKICBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlOiBDVVJMX0ZPUk1BRERfRElTQUJMRUQuCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmaWxlIGluIHRoZSBnZW5lcmF0ZWQKICBjdXJsbGliLmRzcCBmaWxlLCBhbmQgbm93IHBlb3BsZSBidWlsZGluZyB3aXRoIHRoaXMgc2hvdWxkIGdldCBhIGxpYmN1cmwubGliCiAgZmlsZSBnZW5lcmF0ZWQgYXMgaXQgdXNlZCB0byBkbyBiZWZvcmUgd2UgZ2VuZXJhdGVkIHRoaXMgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDQpCi0gTWFydHkgS3VocnQgZml4ZWQgYSBtaW5vciBidWlsZCBwcm9ibGVtIGZvciBWTVMuCgpEYW5pZWwgKDcgSnVuZSAyMDA0KQotIFJldmVydGVkIHRoZSBjb25maWd1cmUgY2hlY2sgZnJvbSB0aGUgNHRoIHNpbmNlIGl0IG9idmlvdXNseSBkaWRuJ3Qgd29yay4KICBSZW1hZGUgaXQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYXQgaG9wZWZ1bGx5IHdvcmtzIGJldHRlci4KCkRhbmllbCAoNCBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBOZXRXYXJlIGFnYWluLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgY2hlY2tzIGZvciBzdHJlcnJvcl9yKCkgbm90IGV4aXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aGVuIGJ1aWx0IGZvciBjcm9zcy1jb21waWxpbmcuCgpEYW5pZWwgKDMgSnVuZSAyMDA0KQotIENocmlzIEdhdWtyb2dlciBwb2ludGVkIG91dCB0aGF0ICdtYWtlIHRlc3QnIGF0dGVtcHRzIHRvIHJ1biB0aGUgdGVzdHMgZXZlbgogIGlmIGN1cmwgaXMgYnVpbHQgY3Jvc3MtY29tcGlsZWQuIEkndmUgbm93IG1hZGUgaXQgb3V0cHV0IGEgc2hvcnQgbWVzc2FnZQogIGluc3RlYWQsIHNheWluZyBpdCBpc24ndCBwb3NzaWJsZSB0byBkby4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgYnJvdWdodCBGVFAgM3JkIHBhcnR5IHRyYW5zZmVyIHN1cHBvcnQgdG8gbGliY3VybC4KICBZb3UgY2FuIG5vdyB1c2UgbGliY3VybCB0byB0cmFuc2ZlciBmaWxlcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgdXNpbmcKICBGVFAuIFRoZXJlIGFyZSBhIGJ1bmNoIG9mIG5ldyBvcHRpb25zIHRvIGNvbnRyb2wgdGhpcyB3aXRoOgogICBDVVJMT1BUX1NPVVJDRV9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1VTRVJQV0QKICAgQ1VSTE9QVF9TT1VSQ0VfUEFUSAogICBDVVJMT1BUX1NPVVJDRV9QT1JUCiAgIENVUkxPUFRfUEFTVl9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1BSRVFVT1RFCiAgIENVUkxPUFRfU09VUkNFX1BPU1RRVU9URQoKICAoVGhleSBzdGlsbCByZW1haW4gdG8gYmUgZG9jdW1lbnRlZCBwcm9wZXJseSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4KICBwYWdlLikKCiAgV2hlbiB1c2luZyB0aGlzLCB0aGUgb3JkaW5hcnkgQ1VSTE9QVF9VUkwgc3BlY2lmaWVzIHRoZSB0YXJnZXQgVVJMLCBhbmQgeW91CiAgc3BlY2lmeSB0aGUgc291cmNlIGRhdGEgd2l0aCB0aGVzZSBhZGRpdGlvbmFsIG9wdGlvbnMuIGZ0cDNyZHBhcnR5LmMgaXMgYQogIG5ldyBleGFtcGxlIHNvdXJjZSBjb2RlIHNob3dpbmcgaG93IHRvIHVzZSB0aGlzLgoKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBwcm94eSB1c2VyIG5hbWUgYW5kCiAgcGFzc3dvcmQgd2hlbiBkb2luZyBwcm94eSBhdXRoZW50aWNhdGlvbiwgaXQgcHJldmlvdXNseSBhbHdheXMgdXNlZCB0aGUgaG9zdAogIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQhCgpEYW5pZWwgKDIgSnVuZSAyMDA0KQotIENVUkxPUFRfVVBMT0FEIGFuZCBDVVJMT1BUX1BVVCBub3cgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgaW50ZXJuYWxseSwgd2hpY2gKICBmaXhlcyBzb21lIG9sZCBjb25mdXNpb25zIG9uIHdoZW4gd2hpY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgYW5kIHdoYXQgdGhlCiAgZGlmZmVyZW5jZXMgYXJlLgoKLSBBcHBsaWVkIEdpc2xlJ3MgZml4ZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgd2l0aCBsY2Mtd2luMzIKClZlcnNpb24gNy4xMi4wICgyIEp1bmUgMjAwNCkKCkRhbmllbCAoMSBKdW5lIDIwMDQpCi0gSSBjbGFyaWZpZWQgdGhlIC0tY3JlYXRlLWRpcnMgb3B0aW9uIHNvbWV3aGF0IGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKLSBSZW5hdWQgRHVoYXV0IGNvcnJlY3RlZCB0aGUgY3VybF91bmVzY2FwZSBtYW4gcGFnZS4KCi0gRGF2aWQgQnlyb24gbW9kaWZpZWQgb25lIG9mIE1hc3NpbWlsaWFubyBaaWNjYXJkaSdzIHJlY2VudCBNU1ZDIG1ha2VmaWxlCiAgY2hhbmdlcyB0byBub3cgYWdhaW4gdXNlIHRoZSBtbSBsaWIgYnkgZGVmYXVsdC4KCkRhbmllbCAoMjYgTWF5IDIwMDQpCi0gTW9odW4gQmlzd2FzIGFkZGVkIHJlbGVhc2UtemxpYiBhbmQgZGVidWctemxpYiB0YXJnZXRzIHRvIHRoZSBNU1ZDIGxpYmN1cmwKICBNYWtlZmlsZQoKLSBEYXZpZCBCeXJvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIGRvaW5nIENPTk5FQ1QsCiAgbGlrZSB3aGVuIGFjY2Vzc2luZyBIVFRQUyBzaXRlcyB3aWh0IGEgcHJveHkuIFRoaXMgcHJvYmFibHkgYnJva2Ugd2hlbiBJCiAgcmV3cm90ZSB0aGUgYXV0aCBzdHVmZiByZWNlbnRseS4KCi0gSSBhZGRlZCBmaWxldXBsb2FkLmMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSwgc2hvd2luZyBob3cgYW4gdXBsb2FkIHRvIGEKICBmaWxlOi8vIFVSTCBpcyBtYWRlLgoKRGFuaWVsICgyNSBNYXkgMjAwNCkKLSBNYXNzaW1pbGlhbm8gWmljY2FyZGkgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMuCgpEYW5pZWwgKDI0IE1heSAyMDA0KQotIGxpYmN1cmwgbm93IHN1cHBvcnRzICJ1cGxvYWRpbmciIHRvIGZpbGU6Ly8gVVJMcy4gVGVzdCAyMDQgYW5kIDIwNSB3ZXJlCiAgYWRkZWQgdG8gdmVyaWZ5LgoKLSBTaW1vbiBKb3NlZnNzb24gYWRkZWQgYSBpZG5fZnJlZSgpIGZ1bmN0aW9uIGluIGxpYmlkbiAwLjQuNSBhcyBhIHJlYWN0aW9uIHRvCiAgR2lzbGUncyBwcmV2aW91cyBtYWlsLiBXZSBub3cgdXNlIHRoaXMgZnVuY3Rpb24sIGFuZCB0aHVzIHdlIHJlcXVpcmUgbGliaWRuCiAgMC40LjUgb3IgbGF0ZXIuIE5vIGVhcmxpZXIgdmVyc2lvbiB3aWxsIGRvLgoKLSBSb2JlcnQgRC4gWW91bmcgcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NPT0tJRUZJTEUgYW5kIENVUkxPUFRfQ09PS0lFIGNvdWxkCiAgbm90IGJlIHVzZWQgYm90aCBpbiBvbmUgcmVxdWVzdC4gRml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSAxNzIgdG8gdmVyaWZ5LgoKRGFuaWVsICgyMSBNYXkgMjAwNCkKLSBXaGlsZSB0YWxraW5nIHRvIGhvc3QgYS5iLmMsIGxpYmN1cmwgZGlkIHdyb25nbHkgbm90IGFjY2VwdCBjb29raWVzIHRoYXQKICB3ZXJlIHNldCB0byB0aGUgZG9tYWluIC5hLmIuYyAodGhhdCBpcyB3aXRoIGEgZG90IHByZWZpeCkuIFRoaXMgaXMgbm93IGZpeGVkCiAgYW5kIHRlc3QgY2FzZSAxNzEgdmVyaWZpZXMgaXQuCgpEYW5pZWwgKDIwIE1heSAyMDA0KQotIEplc3NlIE5vbGxlciByZXBvcnRlZCB0aGF0IHRoZSB1cGxvYWQgc3BlZWQgaW5mbyByZXBvcnRlZCBieSBsaWJjdXJsIHdhcwogIHdyb25nLiBUaGUgc2FtZSB3YXMgdHJ1ZSBmb3IgdGhlIGRvd25sb2FkIHNwZWVkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDE5IE1heSAyMDA0KQotIERhdmlkIEJ5cm9uIGFkZGVkIHRlc3QgY2FzZSAxNzAgLSB0aGlzIHVzZWQgdG8gY3Jhc2ggdGhlIHByZXZpb3VzIHZlcnNpb24gb2YKICBjdXJsLgoKRGFuaWVsICgxNyBNYXkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB0aGF0IGFkZHJlc3NlcyB0d28gZmxhd3MgaW4gdGhlIHBlZXIgY2VydGlmaWNhdGUKICBuYW1lIHZlcmlmaWNhdGlvbjoKICBvIHdoZW4gbXVsdGlwbGUgY29tbW9uIG5hbWVzIGFyZSB1c2VkIChhcyBpbiB0aGUgY3VybCB0ZXN0cyksIHRoZSBsYXN0IG5hbWUKICAgIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgogIG8gYWxsb3cgY29tcGFyaW5nIHdpdGggZW5jb2RlZCB2YWx1ZXMsIGF0IGxlYXN0IHdpdGggQk1QIGFuZCBJU08gbGF0aW4xCiAgICBlbmNvZGVkIFQ2MXN0cmluZ3MuCgotIEFsbCAxOTEgdGVzdCBjYXNlcyBydW4gdGhyb3VnaCB0aGUgdG9ydHVyZSB0ZXN0IE9LISAnbWFrZSB0ZXN0LXRvcnR1cmUnIGlzCiAgbm93IGF2YWlsYWJsZSBpbiB0aGUgcm9vdCBtYWtlZmlsZSAob24gY29uZmlndXJlLWJhc2VkIGVudmlyb25tZW50cykuCgpEYW5pZWwgKDE0IE1heSAyMDA0KQotIFdpdGggYSBzbGlnaHRseSBtb2RpZmllZCBmdHBzZXJ2ZXIucGwgSSd2ZSBub3cgcnVuIGFsbW9zdCBhbGwgdGVzdHMgdGhyb3VnaAogIHdpdGggcnVudGVzdHMucGwgLXQuIFRoaXMgaXMgZ29vZG5lc3MhCgotIFNpbmNlIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBjb250YWN0IHRoZSBDVlMgYWRtaW5zIGZvciBzZXZlcmFsIG1vbnRocywgSSd2ZQogIGRlY2lkZWQgdGhhdCB0aGUgY3VycmVudCBDVlMgaG9zdGluZyB3YXMgbm90IGdvb2QgZW5vdWdoLiBJJ3ZlIG5vdyBtb3ZlZCB0aGUKICBDVlMgcmVwbyBvbmNlIGFnYWluLCBzZWUgUkVBRE1FIGZvciB1cGRhdGVkIGN2cyBjaGVja291dCBpbnN0cnVjdGlvbnMuCgpEYW5pZWwgKDEzIE1heSAyMDA0KQotIHJ1bnRlc3RzLnBsIC10IG5vdyBydW5zIGZpbmUgYWxsIHRoZSB3YXkgdG8gdGVzdCAxMDAuIEkgYmVsaWV2ZSB0ZXN0IGNhc2UKICAxMDAgZmFpbHMgYmVjYXVzZSBvZiBhbiBGVFAgc2VydmVyIHByb2JsZW0uCgpEYW5pZWwgKDEyIE1heSAyMDA0KQotIEdlbmVyYWwgY2xlYW51cHMgYWxsIG92ZXIgdG8gbWFrZSBsaWJjdXJsIHN1cnZpdmUgYW5kIGRvIHdlbGwgd2hlbiBhIG1lbW9yeQogIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gcnVudGVzdHMucGwgLXQgbm93IHdvcmtzIGZpbmUgZm9yIHRoZSBmaXJzdCAyNiB0ZXN0CiAgY2FzZXMuCgpEYW5pZWwgKDExIE1heSAyMDA0KQotIFNlc2h1YmFidSBQYXNhbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBjdXJsX2dsb2JhbF9pbml0X21lbSgpIC0KICBsaWtlIG5vcm1hbCBjdXJsX2dsb2JhbF9pbml0KCkgYnV0IGFsbG93cyB0aGUgYXBwIHRvIHJlcGxhY2UgYWxsIG1lbW9yeQogIGZ1bmN0aW9ucyB3aXRoIGl0cyBvd24gc2V0LiBJIG1vZGlmaWVkIGl0IHNsaWdodGx5LgoKLSBCYXNlZCBvbiBMdWNhIEFsdGVhcycgY29tbWVudHMsIEkgbW9kaWZpZWQgdGhlIGN1cmxsaWIuZHNwIGdlbmVyYXRpb24gY29kZS4KCkRhbmllbCAoMTAgTWF5IDIwMDQpCi0gR2lzbGUgbWFpbGVkIFNpbW9uIEpvc2Vmc3NvbiAob2YgbGliaWRuIGZhbWUpIGFib3V0IHRoZSBiZW5lZml0cyBvZiBhCiAgc2VwYXJhdGUgZnJlZSgpLWZ1bmN0aW9uIGJ5IHRoYXQgbGliIHRvIG1ha2Ugc3VyZSB0aGUgbWVtb3J5IGlzIGZyZWVkIGJ5IHRoZQogIHNhbWUgbWVtb3J5IHN1YnN5c3RlbSB0aGF0IGFsbG9jYXRlZCBpdC4gSGUgcmVzcG9uZGVkIHBvc2l0aXZlbHkgYW5kIHRoaXMKICB3aWxsIGxpa2VseSBjYXVzZSB1cyB0byByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJpZG4gYXMgc29vbiBhcyBTaW1vbgogIHJlbGVhc2VzIG9uZSB3aXRoIHN1Y2ggYSBsaWJpZG5fZnJlZSgpIGZ1bmN0aW9uLgoKLSBKYW1lcyBCdXJzYSBtYWRlIHJ1bnRlc3RzLnBsJ3MgLXQgb3B0aW9uIHdvcmsgZm9yIGFueSBnaXZlbiB0ZXN0IGNhc2UsIGFuZCBJCiAgZWRpdGVkIHRvIGFsbG93IC1nIHRvby4gTm90IGV2ZW4gdGVzdCBjYXNlIDEgd29ya2VkLi4uCgotIEx1Y2EgQWx0ZWEgbWFkZSB0aGUgbmM9IGZpZWxkIG5vdCB1c2UgcXVvdGVzIGluIG91dGdvaW5nIEhUVFAgRGlnZXN0IGhlYWRlcnMuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0IHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbCB0bwogIHJlY29nbml6ZSBvdXIgb3duIHJ1bm5pbmcgSFRUUCBzZXJ2ZXIuCgpEYW5pZWwgKDcgTWF5IDIwMDQpCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IHRvIGNvbmRlciBtYWxsb2MoMCkgYXJlYXMgT0sgdG8KICBmcmVlKCkgYW5kIGhlIG1hZGUgdHdvIGZhaWxlZC1yZXNvbHZlIGVycm9yIG1lc3NhZ2VzIHVzZSB0aGUgbmV3IGRpc3BsYXktCiAgbmFtZSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5LXVzZWQgbmFtZS4KCi0gR2lzbGUgVmFuZW0gdHJpZWQgY3VybCB3aXRoCiAgd3d3LmV0ZG9tZW5lbmF2bmthbm1ha3NpbWFsdGlubmVob2xkZXNla3N0aXRyZWJva3N0YXZlcnNsaWtzb21kZXR0ZS5jb20KICB3aGljaCBjYXVzZWQgcHJvYmxlbXMsIGFuZCBJIGZpeGVkIHRoZSBzaW5nbGUgemVybyBieXRlIGJ1ZmZlciBvdmVyd3JpdGUKICB0aGF0IG9jY3VycmVkIChkdWUgdG8gYSBzdHVwaWQgcHJvdG9jb2wgYnVmZmVyIHNpemUgYW5kIHBhcnNlcikuCgotIE1hZGUgdGhlIGxpYi9jdXJsbGliLmRzcCBmaWxlIGdldCBnZW5lcmF0ZWQgYXV0b21hdGljbHkgd2hlbiBhIGRpc3RyaWJ1dGlvbgogIHBhY2thZ2UgaXMgbWFkZSwgd2l0aCB0aGUgbXN2Y3Byb2ouKiBmaWxlcyBhcyB0ZW1wbGF0ZXMgYW5kIGFsbAogIHdpbjMyLXNvdXJjZXMgYWRkZWQuIEkgdGhpbmsgdGhpcyBjYW4gYmUgbWFkZSB0byB3b3JrIGJldHRlciB0aGFuIHRoZSBhbHdheXMKICBsYWdnaW5nLWJlaGluZCBwcmV2aW91cyBhcHByb2FjaC4gSSdtIG5vdCBzdXJlIHRoaXMgYnVpbGRzIGEgd29ya2luZyBwcm9qZWN0CiAgZmlsZSByaWdodCBub3cgdGhvdWdoIQoKRGFuaWVsICg2IE1heSAyMDA0KQotIE1pY2hhZWwgQmVuZWRpY3QgYnJvdWdodCBhIGZpeCB0aGF0IGZpbGxzIGluIHRoZSBlcnJvcmJ1ZmZlciBwcm9wZXJseSB3aGVuCiAgYXJlcyBmYWlscyB0byByZXNvbHZlIGEgbmFtZSBmb3IgYSBjYXNlIG5vdCBwcmV2aW91c2x5IGRlYWx0IHdpdGggbGlrZSB0aGlzLgoKRGFuaWVsICg1IE1heSAyMDA0KQotIEpvZSBIYWxwaW4gZml4ZWQgdGhlIGFubm95aW5nIHR5cGVjYXN0IHdhcm5pbmcgaW4gbGliL2xkYXAuYwoKLSBHaXNsZSBWYW5lbSBmaXhlczoKICBvIG1lbWRlYnVnIHRvIG5vdCBhY2Nlc3MgTlVMTCBvbiBzZXZlcmFsIHBsYWNlcwogIG8gbGliY3VybC5kZWY7IGN1cmxfZm9ybXBhcnNlIGlzIGdvbmUuCiAgbyBwcm9ncmVzcy5jOyBmaXhlZCB0aGUgcGVyY2VudCB2YWx1ZXMgYmVpbmcgdHJ1bmNlZCB0byAwLgogIG8gaWYyaXAuKjsgY29uc3RpZmllZCB0aGUgJ2ludGVyZmFjZScgYXJndW1lbnQuCgotIFRvciBBcm50c2VuIHJlcG9ydGVkIHRoYXQgbWFueSBvZiBoaXMgYXV0b2J1aWxkcyBmcm96ZSBhbmQgSSBmb3VuZCBhbmQgZml4ZWQKICBhIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSBIVFRQIGF1dGggb3ZlcmhhdWwgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBuZXZlci1lbmRpbmcgaW50ZXJuYWwgcmVxdWVzdC1sb29wIGR1ZSB0byB1bi1pbml0aWFsaXplZCB2YXJpYWJsZXMhCgotIFJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBvbiB2YXJpb3VzIGNvbXBpbGVycy9wbGF0Zm9ybXMuCgpEYW5pZWwgKDQgTWF5IDIwMDQpCi0gY3VybF9mb3JtcGFyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkuIEl0IGhhcyBiZWVuIG1hcmtlZCBhbmQKICBtZW50aW9uZWQgYXMgZGVwcmVjYXRlZCBmb3Igc2V2ZXJhbCB5ZWFycy4KCkRhbmllbCAoMyBNYXkgMjAwNCkKLSBSZXdyaXR0ZW4gSFRUUCBhdXRoZW50aWNhdGlvbiBjb2RlLiBUaGUgcHJldmlvdXMgY29kZSBjb3VsZCBub3QgcHJvcGVybHkKICBkZWFsIHdpdGggdGhlIGFkZGVkIHRlc3QgY2FzZXMgMTY3LCAxNjggYW5kIDE2OS4gSSd2ZSBub3cgcmV3cml0dGVuIHRoZSBjb2RlCiAgdG8gYmV0dGVyIHNlcGFyYXRlIGhvc3QgYW5kIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCBub3QgcmUtdXNlIHRoZSBzYW1lCiAgdmFyaWFibGVzIGFzIG11Y2ggYXMgYmVmb3JlIGFzIGl0IHByb3ZlZCBub24gd29ya2luZyBpbiB0aGUgbW9yZSBpbnZvbHZlZAogIGNhc2VzLiBBbGwgdGhlIGN1cnJlbnQgdGVzdHMgcnVuIE9LIG5vdywgYW5kIHNvIGRvIHRoZSBuZXcgb25lcy4gVGhlIGN1cmwKICB0b29sIGdvdCBhIG5ldyBvcHRpb24gbmFtZWQgLS1wcm94eS1kaWdlc3QgdG8gZW5hYmxlIEhUVFAgRGlnZXN0CiAgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuIEkgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IHN1cHBvcnQgaXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIExEQVAgY29kZSB3b3JrIHdpdGggd2xkYXAzMi5kbGwgYXMgc3VwcGxpZWQgd2l0aAogIFdpbi05OC9NRS8yMDAwL1hQLCBzbyBubyBleHRyYSAuZGxscyBhcmUgcmVxdWlyZWQgd2hlbiBjdXJsL2xpYmN1cmwgaXMgdXNlZAogIG9uIHRoZXNlIFdpbmRvd3MgdmVyc2lvbnMuCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDQpCi0gcnVudGVzdHMucGwgbm93IHNjYW5zIHRoZSB2YWxncmluZCBsb2cgZm9yIHZhbGdyaW5kLWRldGVjdGVkIG1lbW9yeSBsZWFrcwogIGFmdGVyIGVhY2ggdGVzdCBjYXNlIGlmIHZhbGdyaW5kIHdhcyBmb3VuZCBhbmQgdXNlZC4KCi0gSSBtb2RpZmllZCB0aGUgYXBwLWNvZGUgaW4gY3VybCB0byBpbmNsdWRlIHRoZSBuZXcgbGliL2N1cmx4LmggYW5kIG9ubHkKICBhY2Nlc3MgdGhvc2UgZnVuY3Rpb25zIHVzaW5nIHRoZSBjdXJseF8tcHJlZml4IGluIHByZXBhcmF0aW9uIGZvciB0aGUgZnV0dXJlCiAgcmVtb3ZhbCBvZiBzZXZlcmFsIGN1cmxfLWZ1bmN0aW9ucyBmcm9tIHRoZSBwdWJsaWMgbGliY3VybCBBUEkuCgotIEludHJvZHVjZWQgbGliL2N1cmx4LmggYXMgYSBzaW5nbGUgaGVhZGVyIHRvIHByb3ZpZGUgdGhlIGN1cmx4Xy1mdW5jdGlvbnMKICB0byBhcHBzLgoKLSBBZGRlZCBub3RpY2VzIGluIHRoZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2V0ZW52LCBjdXJsX21wcmludGYsIGN1cmxfc3RyZXF1YWwKICBhbmQgY3VybF9zdHJuZXF1YWwgdGhhdCB0aGV5IGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgU1RPUCBVU0lORyBUSEVTRSBGVU5DVElPTlMuCgotIE1paGFpIElvbmVzY3Ugbm90aWNlZCBoZSBjb3VsZG4ndCBkbyBmb3JtcG9zdHMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBmaWxlCiAgbmFtZXMgYW5kIHllcywgSSBicm9rZSB0aGF0IG9uIEFwcmlsIDIzLiBTaWdoLiBJIGZpeGVkIGl0IG5vdyBhbmQgYWRkZWQKICB0ZXN0IGNhc2UgMTY2IHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwb2ludGVkIG91dCBhIG1pc3Rha2UgbGVmdCBmcm9tIHRoZSBEaWdlc3QgcGF0Y2ggb2YgeWVzdGVyZGF5LgoKRGFuaWVsICgyOSBBcHJpbCAyMDA0KQotIE1hZGUgSUROIGRvbWFpbnMgd29yayB3aGVuIHNlbmRpbmcgcmVxdXN0cyBvdmVyIEhUVFAgcHJveHkgYXMgd2VsbC4gQWRkZWQKICB0ZXN0IGNhc2UgMTY1IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIG5ldyBpbnRlcm5hbCBob3N0IG5hbWUgc2V0dXAgd2hlbiByZS11c2luZyBjb25uZWN0aW9ucy4KCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdpdGggYXJlcy1idWlsdCBsaWJjdXJsCiAgY3JlYXRlZCBhIGJhZCBoYW5kbGUgdGhhdCB3b3VsZCBjcmFzaCBpbiB0aGUgZmlyc3QgbmFtZSByZXNvbHZlIGF0dGVtcHQuIFRoaXMKICBpcyBub3cgZml4ZWQgYW5kIHRlc3QgY2FzZSA1MTIgd2FzIGFkZGVkIHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwcm92aWRlZCBhIG1ham9yIEhUVFAgRGlnZXN0IGNvZGUgZml4IGFuZCBjbGVhbnVwLiBXZSBub3cgZm9sbG93CiAgdGhlIERpZ2VzdCBSRkMgYSBsb3QgYmV0dGVyLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBTU0wgY29kZSB1c2UgRVJSX2Vycm9yX3N0cmluZ19uKCkgd2hlcmUgYXBwbGljYWJsZS4KCkRhbmllbCAoMjcgQXByaWwgMjAwNCkKLSBJIHJlbW9kZWxlZCBHaXNsZSdzIElETiBjb2RlIHNsaWdodGx5IGFuZCBub3cgd2UgY29udmVydCBib3RoIHRoZSBob3N0IG5hbWUKICBhbmQgcHJveHkgbmFtZSB0byB0aGUgQUNFIGVuY29kZWQgdmVyc2lvbiB0byB1c2UgaW50ZXJuYWxseSBmb3IgcmVzb2x2ZXMgYW5kCiAgY29va2llcyBldGMuIFRoZXkgYXJlIG5vdyB1c2luZyBvbmUgJ3N0cnVjdCBob3N0bmFtZScgZWFjaCB0aGF0IGtlZXAgYm90aAogIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aGUgcG9zc2libHkgZW5jb2RlZCBuYW1lLiBJRE4gcmVzb2x2ZXMgd29yayBmb3IgbWUKICBub3cgdXNpbmcgaXB2NiwgaXB2NCBhbmQgYXJlcyByZXNvbHZpbmcuIEV2ZW4gY29va2llcyBvbiBJRE4gc2l0ZXMgc2VlbSB0bwogIGRvIHJpZ2h0LiBJIGdvdCBzb21lIGZhaWx1cmVzIGF0IGZpcnN0IHdoZW4gQ0hBUlNFVCB3YXNuJ3Qgc2V0IGF0IGFsbCB3aGljaAogIGNvbmZ1c2VkIGxpYmlkbiBjb21wbGV0ZWx5IGFuZCBpdCBkZWNpZGVkIGJ5IGVuY29kaW5nIG9mIGNob2ljZSB3YXMKICAnQU5TSV9YMy40LTE5NjgnLi4uCgotIG1hZGUgJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtbGliaWRuJyB3b3JrCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRml4ZWQgdGhlIHNyYy9odWdlaGVscC5jIGZpbGUgdG8gaW5jbHVkZSAic2V0dXAuaCIgaW5zdGVhZCBvZiAiY29uZmlnLmgiIHRvCiAgbWFrZSB0aGUgcHJvYmxlbXMgd2l0aCBVU0VfTUFOVUFMIG9uIHdpbmRvd3MgZ28gYXdheS4KCi0gY29uZmlndXJlIC0td2l0aG91dC1zc2wgY291bGQgc3RpbGwgd3JvbmdseSBpbmNsdWRlIHNvbWUgT3BlblNTTCBpbmZvIGluIHRoZQogIE1ha2VmaWxlcyBpZiBwa2ctY29uZmlnIGhhZCBpbmZvIGFib3V0IE9wZW5TU0wuIEJ1ZyAjOTQxNzYyIHJlcG9ydGVkIGJ5CiAgTWFydGluLgoKLSBTaW5jZSB3ZSBjYW4gbm93IGJ1aWxkIGFuZCB1c2UgcXVpdGUgYSBsYXJnZSBzZXQgb2YgM3JkIHBhcnR5IGxpYnJhcmllcywgSQogIGRlY2lkZWQgSSB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBwcm9kdWNlIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHNob3dpbmcgd2hhdAogIGxpYnJhcmllcyBpdCB1c2VzIGFuZCBpZiBub3QsIHdoYXQgb3B0aW9uIHRvIHVzZSB0byBtYWtlIGl0IHVzZSB0aGF0LiBJIGFsc28KICBhZGRlZCBzb21lIG90aGVyIHJhbmRvbSBpbmZvIHRoYXQgaXMgbmljZSBpbiBhICJjb25maWd1cmUgc3VtbWFyeSIgb3V0cHV0LgoKLSBBcHBsaWVkIFRvbW15VGFtJ3MgcGF0Y2ggdGhhdCBub3cgbWFrZSBjdXJsIHdvcmsgd2l0aCB0ZWxuZXQgYW5kIHN0ZGluCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gVGhlIGNoYW5nZXMgZm9yIHRvZGF5IGJlbG93IHdlcmUgbWFkZSBieSBtZSBhbmQgR2lzbGUgVmFuZW0uCgogIFRoZSBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgaG9zdGlwLmMgaGFzIG5vdyB1bmRlcmdvbmUgYSBodWdlIGNsZWFudXAgYW5kCiAgc3BsaXQ6CgogIGhvc3RpcC5jIGV4cGxhaW5lZAogID09PT09PT09PT09PT09PT09PQoKICBUaGUgbWFpbiBDT01QSUxFLVRJTUUgREVGSU5FUyB0byBrZWVwIGluIG1pbmQgd2hlbiByZWFkaW5nIHRoZSBob3N0Ki5jCiAgc291cmNlIGZpbGUgYXJlIHRoZXNlOgoKICBDVVJMUkVTX0lQVjYgLSB0aGlzIGhvc3QgaGFzIGdldGFkZHJpbmZvKCkgYW5kIGZhbWlseSwgYW5kIHRodXMgd2UgdXNlCiAgdGhhdC4gVGhlIGhvc3QgbWF5IG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgSVB2NiwgYnV0IHdlIGRvbid0IHJlYWxseSBoYXZlIHRvCiAgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gSG9zdHMgdGhhdCBhcmVuJ3QgSVB2Ni1lbmFibGVkIGhhdmUgQ1VSTFJFU19JUFY0CiAgZGVmaW5lZC4KCiAgQ1VSTFJFU19BUkVTIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHVzZSBjLWFyZXMgZm9yIGFzeW5jaHJvbm91cwogIG5hbWUgcmVzb2x2ZXMuIEl0IGNhbm5vdCBoYXZlIEVOQUJMRV9JUFY2IGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSwgYXMKICBjLWFyZXMgaGFzIG5vIGlwdjYgc3VwcG9ydC4gVGhpcyBjYW4gYmUgV2luZG93cyBvciAqbml4LgoKICBDVVJMUkVTX1RIUkVBREVEIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHJ1biB1bmRlciAobmF0aXZlKQogIFdpbmRvd3MsIGFuZCB0aGVuIHRoZSBuYW1lIHJlc29sdmUgd2lsbCBiZSBkb25lIGluIGEgbmV3IHRocmVhZCwgYW5kIHRoZQogIHN1cHBvcnRlZCBhc3luY2ggQVBJIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGFyZXMtYnVpbGRzLgoKICBJZiBhbnkgb2YgdGhlIHR3byBwcmV2aW91cyBhcmUgZGVmaW5lZCwgQ1VSTFJFU19BU1lOQ0ggaXMgZGVmaW5lZCB0b28uIElmCiAgbGliY3VybCBpcyBub3QgYnVpbHQgdG8gdXNlIGFuIGFzeW5jaHJvbm91cyByZXNvbHZlciwgQ1VSTFJFU19TWU5DSCBpcwogIGRlZmluZWQuCgogIFRoZSBob3N0Ki5jIHNvdXJjZXMgZmlsZXMgYXJlIHNwbGl0IHVwIGxpa2UgdGhpczoKCiAgaG9zdGlwLmMgICAtIG1ldGhvZC1pbmRlcGVuZGVudCByZXNvbHZlciBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCiAgaG9zdGFzeW4uYyAtIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0c3luLmMgIC0gZnVuY3Rpb25zIGZvciBzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdGFyZXMuYyAtIGZ1bmN0aW9ucyBmb3IgYXJlcy11c2luZyBuYW1lIHJlc29sdmVzCiAgaG9zdHRocmUuYyAtIGZ1bmN0aW9ucyBmb3IgdGhyZWFkZWQgbmFtZSByZXNvbHZlcwogIGhvc3RpcDQuYyAgLSBpcHY0LXNwZWNpZmljIGZ1bmN0aW9ucwogIGhvc3RpcDYuYyAgLSBpcHY2LXNwZWNpZmljIGZ1bmN0aW9ucwoKICBUaGUgaG9zdGlwLmggaXMgdGhlIHNpbmdsZSB1bml0ZWQgaGVhZGVyIGZpbGUgZm9yIGFsbCB0aGlzLiBJdCBkZWZpbmVzIHRoZQogIENVUkxSRVNfKiBkZWZpbmVzIGJhc2VkIG9uIHRoZSBjb25maWcqLmggYW5kIHNldHVwLmggZGVmaW5lcy4KCi0gQWRkZWQgZnVuY3Rpb24gaGVhZGVyIGNvbW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gYmV0dGVyCiAgZXhwbGFpbiB0aGUgcHVycG9zZSBvZiB0aGVtIGFsbC4KCi0gY29uZmlndXJlIC0td2l0aC1saWJpZG4gaXMgbm93IHN1cHBvcnRlZC4gSXQgbWFrZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICBjaGVjayBmb3IgbGliaWRuIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHByZWZpeCBwYXRoIGdpdmVuLiBJZiB5b3UKICBzYXkgLS13aXRoLWxpYmlkbj0vdXNyL2xvY2FsLCBpdCB3aWxsIGNoZWNrIGZvciB0aGUgbGliIGluIC91c3IvbG9jYWwvbGliCiAgYW5kIHRoZSBpbmNsdWRlcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgZXRjLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgc3RydWN0IGFnZWQgQ1VSTFZFUlNJT05fVEhJUkQgaW5jbHVkaW5nCiAgbGliaWRuIHZlcnNpb24gaW5mby4gVGhlIHN0cmluZyBjdXJsX3ZlcnNpb24oKSByZXR1cm5zIGFsc28gaW5jbHVkZXMgbGliaWRuCiAgdmVyc2lvbiBpbmZvLCBpZiBhdmFpbGFibGUuCgpWZXJzaW9uIDcuMTEuMiAoMjYgQXByaWwgMjAwNCkKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBFcndpbiBBdXRocmllZCBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsIGRpZG4ndCBkbyByaWdodAogIGlmIHlvdSBhbHJlYWR5IGhhZCBhIHNyYy9odWdlaGVscC5jIHNvdXJjZSBmaWxlIHByZXNlbnQgKHdoaWNoIG1vc3QgcGVvcGxlCiAgZG8gSSBndWVzcykuIEl0IG5vdyB1c2VzIHRoZSBVU0VfTUFOVUFMIGRlZmluZSBwcm9wZXJseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGRvaW5nIChmYWlsaW5nKSBXaW5kb3dzCiAgdGhyZWFkZWQgbmFtZSByZXNvbHZlcy4KCi0gSSBhbHNvIGFkZGVkIHRlc3QgY2FzZSAxNjMganVzdCB0byBtYWtlIHN1cmUgLUYgInZhcj08ZmlsZSIgd29ya3MgZmluZSBhbmQKICBjYW4gcGFzcyBvbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgbmV3bGluZXMsIGNhcnJpYWdlLXJldHVybiBhbmQgdGFicy4KCi0gV2hlbiB3ZSBhZGRlZCB0ZXN0IGNhc2UgMTYyIHdpdGhvdXQgYWRkaW5nIHRoZSBuZWNlc3NhcnkgcmVxdWlyZW1lbnQgZmllbGQKICBpbiB0aGUgdGVzdCBtZXRhIGRhdGEgd2UgY291bGQgc2VlIHRoYXQgY3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgeW91IHVzZWQKICAtLXByb3h5LW50bG0gZXZlbiBpZiB0aGUgdW5kZXJseWluZyBsaWJjdXJsIGl0IHVzZXMgaGFzIG5vIE5UTE0gc3VwcG9ydCEgSQogIG5vdyBtYWRlIGl0IGNoZWNrIHRoaXMgZmlyc3QsIGFuZCBpdCBub3cgZXhpc3RzIHdpdGggYSAidGhlIGluc3RhbGxlZAogIGxpYmN1cmwgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyIgbWVzc2FnZSBpZiBpdCBoYXBwZW5zIGFnYWluLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA0KQotIERhdmlkIEJ5cm9uIGZvdW5kIGFuZCBmaXhlZCBhIHNtYWxsIGJ1ZyB3aXRoIHRoZSAtLWZhaWwgYW5kIGF1dGhlbnRpY2F0aW9uCiAgc3R1ZmYgYWRkZWQgYSBmZXcgd2Vla3MgYWdvLiAgVHVybnMgb3V0IHRoYXQgaWYgeW91IHNwZWNpZnkgLS1wcm94eS1udGxtIGFuZAogIGNvbW11bmljYXRlIHdpdGggYSBwcm94eSB0aGF0IHJlcXVpcmVzIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCB0aGUgcHJveHkKICBwcm9wZXJseSByZXR1cm5zIGEgNDA3LCBidXQgdGhlIGZhaWx1cmUgZGV0ZWN0aW9uIGNvZGUgZG9lc24ndCByZWFsaXplIGl0CiAgc2hvdWxkIGdpdmUgdXAsIHNvIGN1cmwgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwLiBUZXN0IGNhc2UgMTYyIGFkZGVkIHRvCiAgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBhbGxvdyBuZXdsaW5lcyBpbiB0aGUgY29udGVudHMgd2hlbiBkb2luZyAtRiAidmFyPVtjb250ZW50c10iCiAgUm9iZXJ0IE1hcmxvdyByZXBvcnRlZC4KCi0gSWYgYSB0cmFuc2ZlciBpcyBmb3VuZCBvdXQgdG8gYmUgb25seSBwYXJ0aWFsLCBsaWJjdXJsIHdpbGwgbm93IHRyZWF0IHRoYXQKICBhcyBhIHByb2JsZW0gc2VyaW91cyBlbm91Z2ggdG8gc2tpcCB0aGUgZmluYWwgUVVJVCBjb21tYW5kIGJlZm9yZSBjbG9zaW5nCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVG8gYXZvaWQgdGhlIHJpc2sgdGhhdCBpdCB3aWxsICJoYW5nIiB3YWl0aW5nIGZvcgogIHRoZSBRVUlUIHJlc3BvbnNlLiBBZGRlZCB0ZXN0IGNhc2UgMTYxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHRoZSBoZXVyaXN0aWNzIGZvciBkZWFsaW5nIHdpdGggdGhlIHRlc3QgMTYwIHNjZW5hcmlvLiBXaGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQgYW5kIG5vdGhpbmcgYXQgYWxsIGlzIHJlY2VpdmVkIGZyb20gaXQgKGJlY2F1c2UgdGhlCiAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiksIHdlIHdpbGwgbm93IHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEgZnJlc2ggbmV3CiAgY29ubmVjdGlvbi4gVGhlIHByZXZpb3VzIEVDT05OUkVTRVQgc3R1ZmYgZnJvbSBKYW51YXJ5IDMwIHdhcyByZW1vdmVkIGFnYWluCiAgYXMgaXQgZGlkbid0IGRldGVjdCB0aGUgc2l0dWF0aW9uIGdvb2QgZW5vdWdoLgoKRGFuaWVsICgyMCBBcHJpbCAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAxNjAgdG8gdmVyaWZ5IHRoYXQgY3VybCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBpdCBnZXRzIGEKICBjb25uZWN0aW9uIHJlc2V0IHdoZW4gdHJ5aW5nIHRvIHJlLXVzZSBhIGNvbm5lY3Rpb24uIEl0IHNob3VsZCB0aGVuIHNpbXBseQogIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDQpCi0gTm8gbW9yZSA1MTIgYnl0ZSBsaW1pdCBmb3IgaG9zdCBuYW1lIChpbmNsdXNpbmcgbmFtZSArIHBhc3N3b3JkKSBpbiBsaWJjdXJsLgogIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5IGZvciB0aGUgdHlwaWNhbCAoc2hvcnRlciBVUkwpCiAgY2FzZS4KCi0gQ2xlYW5lZCB1cCB0aGUgc291cmNlcyB0byBiZXR0ZXIgdXNlIHRoZSB0ZXJtcyAnaG9zdG5hbWUnIGFuZCAncGF0aCcKICBpbnRlcm5hbGx5IHdoZW4gcmVmZXJyaW5nIHRvIHRoYXQgZGF0YS4gVGhlIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcCB0aGF0IGluZm8KICBpcyBjYWxsZWQgJ25hbWVidWZmZXInIGFuZCAncGF0aGJ1ZmZlcicuIE11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKICB0aGFuIHRoZSBwcmV2aW91cyBtZXNzLgoKRGFuaWVsICgxNSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHJ1bnRlc3RzLnBsIGFnYWluIHRvIHJlbW92ZSBhbGwgbG9nIGZpbGVzIGluIHRoZSBsb2cvIGRpciBiZXR3ZWVuCiAgZWFjaCB0ZXN0LCBhbmQgdGhlbiBtYWRlIC1wIGRpc3BsYXkgYWxsIG5vbi16ZXJvIGJ5dGUgZmlsZXMgaW4gdGhlIGxvZyBkaXIuCiAgSXQgc2hvdWxkIG1ha2UgdGhhdCBkYXRhIG1vcmUgdXNhYmxlIGFuZCBjb250YWluIGxlc3MgcnViYmlzaC4KCi0gZnRwc2VydmVyLnBsIG5vdyBwcm9kdWNlcyBsb2cgZmlsZXMgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgc3dzIG9uZXMgbG9vawogIGFuZCB0aGV5IG5vdyBhbHNvIGNvbnRhaW5zIGEgYml0IG1vcmUgZGV0YWlscyB0byBoZWxwIGRlYnVnZ2luZyBmdHAKICBwcm9ibGVtcy4KCi0gUmVtb3ZlZCB0aGUgZml4ZWQgbWF4aW11bSBhbW91bnQgb2YgZGlyIGxldmVscyB0aGUgRlRQIGNvZGUgc3VwcG9ydGVkLgogIFByZXZpb3VzbHkgd2UgaGFkIGEgZml4ZWQgYXJyYXkgZm9yIDEwMCBsZXZlbHMsIG5vdyB3ZSBzYXZlIHNwYWNlIGluIGVhY2gKICBoYW5kbGUgYnkgYWxsb2NhdGluZyBvbmx5IGZvciBhIGZldyBsZXZlbCBieSBkZWZhdWx0IGFuZCB0aGVuIGVubGFyZ2luZyB0aGF0CiAgaW4gY2FzZSBvZiBuZWVkICh3aXRoIG5vIG1heGltdW0gZGVwdGgpLiBBZGp1c3RlZCB0ZXN0IGNhc2UgMTQyIHRvIHZlcmlmeQogIHRoYXQgMTUwIGRpciBsZXZlbHMgd29yayBmaW5lLiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkKICBmb3IgdGhlIHR5cGljYWwgKG5vdCB2ZXJ5IGRlZXApIGNhc2UuCgpEYW5pZWwgKDE0IEFwcmlsIDIwMDQpCi0gQXNraW5nIGZvciBDVVJMX0lQUkVTT0xWRV9WNiB3aGVuIGlwdjYgYWRkcmVzc2VzIGNhbid0IGJlIHJlc29sdmVkIHdpbGwKICBub3cgY2F1c2UgdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gcmV0dXJuIE5VTEwgaW1tZWRpYXRlbHkuIFRoaXMgZmxhdyB3YXMKICBwb2ludGVkIG91dCBieSBHaXNsZSBWYW5lbS4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIC00Ly02IGFjdHVhbGx5IHNldCB0aGUgZGVzaXJlZCBvcHRpb24gdG8gbGliY3VybC4KCi0gcnVudGVzdHMucGwgbm93IGhhcyBhIG5ldyBvcHRpb24gKC1wKSB0aGF0IHdpbGwgZGlzcGxheSAiaW50ZXJlc3RpbmciIGxvZwogIGZpbGVzIHRvIHN0ZG91dCBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZQogIHVzZWQgaW4gdGhlICdmdWxsLXRlc3QnIG1ha2UgdGFyZ2V0IHRoYXQgaXMgdXNlZCBieSB0aGUgYXV0b2J1aWxkIHRlc3RzLCBhcwogIHdlIHRoZW4gZ2V0IGEgbXVjaCBiZXR0ZXIgY2hhbmNlIHRvIHVuZGVyc3RhbmQgKHJlbW90ZSkgdGVzdCBmYWlsdXJlcyBiYXNlZAogIG9uIGF1dG9idWlsZCBsb2dzIGFsb25lLgoKRGFuaWVsICgxMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSB3b3JrIGFnYWluIG9uIFdpbmRvd3MgZXZlbiB3aGVuIGJ1aWx0CiAgd2l0aG91dCBhcmVzLiBCZWZvcmUgdGhpcywgc2VsZWN0KCkgd291bGQgcmV0dXJuIC0xIGR1cmluZyB0aGUgbmFtZSByZXNvbHZlCiAgcGhhc2Ugc2luY2UgY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXR1cm4gYW55IGZkX3NldCBhdCBhbGwgd2hpY2ggd2Fzbid0CiAgYXBwcmVjaWF0ZWQhCgotIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBub3cgZHVwbGljYXRlcyB0aGUgdGNwX25vZGVsYXkgaW5mbyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBwYXRjaCBmb3IgdGhlIE1TVkMgbGliY3VybCBtYWtlZmlsZSBmb3IgYnVpbGRzIHdpdGgKICB6bGliLgoKRGFuaWVsICg5IEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgaW1wcm92ZWQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIENVUkxJTkZPXypfVElNRSwgaXQgY2FuIG5vdwogIGJlIGRvd24gdG8gdXNlYyBpZiB0aGUgc3lzdGVtIHN5cHBvcnRzIGl0LgoKRGFuaWVsICg3IEFwcmlsIDIwMDQpCi0gQSByZXF1ZXN0IHRoYXQgc2VuZHMgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBhbmQgZ2V0cyBub3RoaW5nIGJ1dCBhIHNpbmdsZQogIDEwMCByZXNwb25zZSBiYWNrIHdpbGwgbm93IHJldHVybiBhIENVUkxFX0dPVF9OT1RISU5HLiBUZXN0IDE1OCB2ZXJpZmllcy4KCi0gVGhlIHN0cnRvb2ZmdCgpIG1hY3JvIGlzIG5vdyBuYW1lZCBjdXJseF9zdHJ0b29mZnQoKSB0byB1c2UgdGhlIGN1cmx4XyoKICBhcHByb2FjaCBmdWxseS4KCkRhbmllbCAoNiBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4ZWQgYnVnICM5Mjc5NzkgcmVwb3J0ZWQgYnkgTmF0aGFuIE8nU3VsbGl2YW4uIFRoZSBwcm9ibGVtCiAgbWFkZSBsaWJjdXJsIG9uIFdpbmRvd3MgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaW4gZWFjaCBuYW1lIHJlc29sdmUKICB3aGVuIG5vdCB1c2VkIGFzIGEgRExMLgoKLSBOZXcgYXV0aGVudGljYXRpb24gY29kZSBhZGRlZCwgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aGVuIGRvaW5nIFBPU1Qgb3IgUFVUCiAgd2l0aCBEaWdlc3Qgb3IgTlRMTS4gbGliY3VybCB3aWxsIG5vdyB1c2UgSEVBRCB0byBuZWdvdGlhdGUgdGhlCiAgYXV0aGVudGljYXRpb24gYW5kIHdoZW4gZG9uZSBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgUE9TVC4gUHJldmlvdXNseSBsaWJjdXJsCiAgc2VudCBQT1NUIGltbWVkaWF0ZWx5IGFuZCBleHBlY3RlZCB0aGUgc2VydmVyIHRvIHJlcGx5IGEgZmluYWwgc3RhdHVzIGNvZGUKICB3aXRoIGFuIGVycm9yIGFuZCB0aGVuIGxpYmN1cmwgd291bGQgbm90IHNlbmQgdGhlIHJlcXVlc3QtYm9keSBidXQgaW5zdGVhZAogIHNlbmQgdGhlbiBuZXh0IHJlcXVlc3QgaW4gdGhlIHNlcXVlbmNlLgoKICBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBkdWUgdG8gSUlTNiBiYXJmaW5nIG9uIGxpYmN1cmwgd2hlbiB3ZSBhdHRlbXB0CiAgdG8gUE9TVCB3aXRoIE5UTE0gYXV0aGVudGljYXRpb24uIFRoZSByZWFzb24gZm9yIHRoZSBwcm9ibGVtcyBpcyBmb3VuZCBpbgogIFJGQzI2MTYgc2VjdGlvbiA4LjIuMyByZWdhcmRpbmcgaG93IHNlcnZlcnMgc2hvdWxkIGRlYWwgd2l0aCB0aGUgMTAwCiAgY29udGludWUgcmVxdWVzdC1oZWFkZXI6CgogICAgICAgIElmIGl0IHJlc3BvbmRzIHdpdGggYSBmaW5hbCBzdGF0dXMgY29kZSwgaXQgTUFZIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICAgICBjb25uZWN0aW9uIG9yIGl0IE1BWSBjb250aW51ZSB0byByZWFkIGFuZCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZQogICAgICAgIHJlcXVlc3QuCgogIFByZXZpb3VzIHZlcnNpb25zIG9mIElJUyBjbGVhcmx5IGRpZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiB0aGlzIGNhc2UsCiAgd2hpbGUgdGhpcyBuZXdlciB2ZXJzaW9uIGRlY2lkZWQgaXQgc2hvdWxkICJyZWFkIGFuZCBkaXNjYXJkIi4gVGhhdCB3b3VsZCd2ZQogIGZvcmNlZCB1cyB0byBzZW5kIHRoZSB3aG9sZSBQT1NUIChvciBQVVQpIGRhdGEgb25seSB0byBoYXZlIGl0IGRpc2NhcmRlZCBhbmQKICB0aGVuIGJlIGZvcmNlZCB0byBzZW5kIGl0IGFnYWluLiBUbyBhdm9pZCB0aGF0IGh1Z2UgcGVuYWxpdHksIHdlIHN3aXRjaCB0bwogIHVzaW5nIEhFQUQgdW50aWwgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZW4gc2VuZCB0aGUgUE9TVC4KCiAgVGhlIG9ubHkgYWN0dWFsIGRyYXdiYWNrIEkgY2FuIHRoaW5rIG9mIChleGNlcHQgZm9yIHRoZSBvZGQgc2l0ZXMgdGhhdCBtaWdodAogIHRyZWF0IEhFQUQgZGlmZmVyZW50bHkgdGhhbiB0aGV5IHdvdWxkIHRyZWF0IFBPU1QvUFVUIHdoZW4gZ2l2ZW4gdGhlIHNhbWUKICBVUkwpIGlzIHRoYXQgaWYgeW91IGRvIFBPU1Qgd2l0aCBDVVJMQVVUSF9BTlkgc2V0IGFuZCB0aGUgc2l0ZSByZXF1aXJlcyBOTwogIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIHdpbGwgc3RpbGwgdXNlIGEgSEVBRCBpbiBhIGZpcnN0IHJvdW5kIGFuZCB0aGVuIGRvIGEKICBQT1NULgoKICBJZiB5b3UgZG8gYSBIRUFEIG9yIGEgR0VUIG9uIGEgc2l0ZSB1c2luZyBDVVJMQVVUSF9BTlksIGxpYmN1cmwgd2lsbCBzZW5kCiAgYW4gdW4tYXV0aGVudGljYXRlZCByZXF1ZXN0IGF0IG9uY2UsIHdoaWNoIHRoZW4gaXMgdGhlIG9ubHkgcmVxdWVzdCBpZiB0aGUKICBzaXRlIHJlcXVpcmVzIG5vIGF1dGguCgogIEFsYW4gUGluc3RlaW4gaGVscGVkIG1lIHdvcmsgb3V0IHRoZSBwcm90b2NvbCBkZXRhaWxzIGJ5IGZpZ3VyaW5nIG91dCB3aHkKICBsaWJjdXJsIGZhaWxlZCBhbmQgd2hhdCBJSVM2IGV4cGVjdHMuCgotIFRoZSAtLWxpbWl0LXJhdGUgbG9naWMgd2FzIGNvcnJlY3RlZCBhbmQgbm93IGl0IHdvcmtzIGEgbG90IGJldHRlciBmb3IKICBoaWdoZXIgc3BlZWRzLCBzdWNoIGFzICcxMG0nIG9yIHNpbWlsYXIuIFJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzkzMDI0OS4KCi0gSW50cm9kdWNpbmcgY3VybHhfdHZub3coKSBhbmQgY3VybHhfdHZkaWZmKCkgdXNpbmcgdGhlIG5ldyBjdXJseF8qIGZhc2hpb24uCiAgI2luY2x1ZGUgInRpbWV2YWwuaCIgZnJvbSB0aGUgbGliIGRpciB0byBnZXQgdGhlIHByb3RvcyBldGMuICBOb3RlIHRoYXQKICB0aGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGxpYmN1cmwgQVBJLiBUaGUgY3VybCBhcHAgc2ltcGx5IHVzZXMgdGhlIHNhbWUKICBzb3VyY2UgZmlsZXMgYXMgdGhlIGxpYnJhcnkgZG9lcyBhbmQgdGhlcmVmb3JlIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGVkCiAgYW5kIGxpbmtlZCB3aXRoIGN1cmwgdG9vLCBub3QganVzdCB3aGVuIGNyZWF0aW5nIGxpYmN1cmwuCgotIGxpYi9zdHJlcnJvci5jIG5vIGxvbmdlciB1c2VzIHN5c19uZXJyIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBzaW5jZSBpdAogIGlzbid0IHBvcnRhYmxlIGVub3VnaAoKRGFuaWVsICgyIEFwcmlsIDIwMDQpCi0gSW4gdGhlIGN1cmxfc3RybnF1YWwuMyBtYW4gcGFnZSwgd2Ugbm93IHByZXBlbmQgdGhlIG1hbjMgZGlyIHRvIHRoZSBmaWxlCiAgbmFtZSB0byB3b3JrIGJldHRlci4gQXMgcG9pbnRlZCBvdXQgYnkgUm9iaW4gS2F5LgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBwcm9ibGVtIEkgcmVjZW50bHkgYWRkZWQgaW4gdGhlIHByb2dyZXNzIG1ldGVyIGNvZGUgdGhhdAogIGJyb2tlIHN1YnNlY29uZCByZXNvbHV0aW9uIGZvciBDVVJMSU5GT19UT1RBTF9USU1FLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGEKICBtaXN0YWtlIGluIHRoZSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGZpbmFsIHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICB0aGF0IHdvdWxkIG9mdGVuIHByZXZlbnQgaXQgZnJvbSBhY3R1YWxseSBiZWluZyB1cGRhdGVkIHRoYXQgZmluYWwgdGltZS4KCkRhbmllbCAoMSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIHdlIHVzZSBhcmVzIGZvciBuYW1lCiAgcmVzb2x2ZXMgYW5kIGRlY2lkZXMgdG8gdGltZS1vdXQgYmVmb3JlIGFyZXMgZG9lcyBpdC4gVGhpcyBmaXggdXNlcyB0aGUKICBicmFuZCBuZXcgYXJlc19jYW5jZWwoKSBmdW5jdGlvbiB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBjLWFyZXMgMS4xLjAuCgogIFdoZW4gdG9sZCB0byBlbmFibGUgYXJlcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YKICB0aGUgYXJlc19jYW5jZWwgZnVuY3Rpb24gdG8gYWxlcnQgdXNlcnMgaWYgdGhleSBhdHRlbXB0IHRvIHVzZSBhIHRvbyBvbGQKICBjLWFyZXMgbGlicmFyeS4KCkRhbmllbCAoMzEgTWFyY2ggMjAwNCkKLSBSb3kgU2hhbiBmaXhlZCBhIGZsYXcgdGhhdCBwcmV2ZW50ZWQgYXJlcyBuYW1lIHJlc29sdmUgdGltZW91dHMgdG8gb2NjdXIhCgotIERpcmsgTWFuc2tlIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc29sdmVzIGZhciB0b28KICBlYXN5IHdoZW4gbGliY3VybCB3YXMgYnVpbHQgdG8gdXNlIChjLSlhcmVzIGZvciBuYW1lIHJlc29sdmluZy4KCi0gRnVydGhlciBEaWdlc3QgZml4aW5nIGFuZCBhIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlIDE1MyBub3cgbWFrZXMgbWUgYmVsaWV2ZQogIE1pdHogV2FyaydzIHByb2JsZW1zIGFyZSBmaXhlZC4KCi0gQW5kcmVzIEdhcmNpYSBmaWd1cmVkIG91dCB0aGF0IHRlc3QgY2FzZSA2Mywgd2hpbGUgd29ya2luZywgb25seSBwcm92ZWQgYQogIGZsYXcgaW4gbGliY3VybCdzICdodHRwX3Byb3h5JyBwYXJzZXIgd2hlbiBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaXMKICBwcm92aWRlZC4gVGhlIHVzZXIgbmFtZSB3YXMgbm90IGV4dHJhY3RlZCBwcm9wZXJseSAoYW5kICdodHRwJyB3YXMgYWx3YXlzCiAgdXNlZCBhcyB1c2VyIG5hbWUpLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIG91ciBpb2N0bHNvY2tldCgpIHVzYWdlLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA0KQotIEpvZSBIYWxwaW4gZmFjZWQgcHJvYmxlbXMgd2l0aCB0aGUgZ2V0bmFtZWluZm8oKSBhcmd1bWVudCBhaV9mbGFncyBhbmQgdGhlCiAgcGFydGljdWxhciBiaXQgbmFtZWQgJ05JX1dJVEhTQ09QRUlEJyBvbiBTb2xhcmlzIDkgZm9yIEludGVsLiAgSSd2ZSBub3cKICB3cml0dGVuIGEgY29uZmlndXJlIHRlc3QgdGhhdCBjaGVja3MgZm9yIGEgd29ya2luZyBOSV9XSVRIU0NPUEVJRAogIGltcGxlbWVuYXRpb24uIE5vIGNvZGUgdXNlcyB0aGUgcmVzdWx0IGZyb20gdGhpcyB0ZXN0IHlldCwgaXQgaXMgc3RpbGwKICBleHBlcmltZW50YWwuIEphbWVzIENhcmxzb24gd3JvdGUgaW4gY29tcC51bml4LnNvbGFyaXM6ICJJdCdzIGEgYnVnCiAgKDUwMDY2MjMpIC0tIGl0J3Mgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkbid0IGJlIGluIHRoZSBoZWFkZXIgZmlsZS4iCgotIEkgcHJvdmlkZWQgTWl0eiBXYXJrIHdpdGggYSBmaXJzdCBwYXRjaCBpbiBvcmRlciB0byBmaXggbGliY3VybCdzIHByb2JsZW1zCiAgdG8gcmUtbmVnb3RpYXRlIERpZ2VzdCBhdXRoZW50aWNhdGlvbiAod2hlbiAnc3RhbGU9dHJ1ZScgaXMgaW5jbHVkZWQgaW4gdGhlCiAgcmVzcG9uc2UgaGVhZGVyKS4KCi0gUm95IFNoYW4gZGlzY292ZXJlZCB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UgZGlkbid0IHByb3Blcmx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMgd2hpY2ggY291bGQgbWFrZSBoYW5kbGVzIGdldCBzdHVjayBpbiB0aGF0IHN0YXRlIGFuZCB0aHVzIG5ldmVyIGdldAogIGNvbXBsZXRlZC4gSSd2ZSBwcm9kdWNlZCBhIGZpcnN0IHRlc3QgcGF0Y2ggdGhhdCBhdHRlbXB0cyB0byBjb3JyZWN0IHRoaXMuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcHBsaWVkIHRvIG1ha2UgQ1VSTE9QVF9GQUlMT05FUlJPUiB3b3JrIG5pY2VseQogIGV2ZW4gd2l0aCBhdXRoZW50Y2F0aW9ucyBzdWNoIGFzIE5UTE0gb3IgRGlnZXN0IGVuYWJsZWQuIFRlc3QgY2FzZXMgMTUwLCAxNTEKICBhbmQgMTUyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgZmlsZXMgZm9yIHRoZSBkamdwcC9NUy1ET1MgYnVpbGQuCgotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIHdvcmsgb3V0IGEgZml4IGZvciB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIG1ha2UKICB0aGUgZmlsZTovLyB0ZXN0cyBydW4gZmluZSB3aGVuIHRlc3RlZCB3aXRoIHRoZSBtaW5ndy1idWlsdCB2ZXJzaW9uIG9mIGN1cmwuCgotIEZpeGVkIGFuIGluY2x1ZGUgaXNzdWUgd2l0aCBuZXRpbmV0L3RjcC5oIG9uIEFJWCwgYmFzZWQgb24gaW5wdXQgYnkgVG9yLgogIFRoaXMgYWxzbyByZXF1aXJlZCBhIG1pbm9yIGZpeCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gVGhlIHBvc3RpdDIuYyBzb3VyY2UgZXhhbXBsZSB1c2VkIHRoZSB3cm9uZyBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHBvc3QgZGF0YS4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBpcHY2IHN1cHBvcnQgb24gd2luZG93cyBieSBtYWtpbmcgdGhlIGN1cmwgYnVpbGQgdG8gdXNlCiAgdGhlIGNvcnJlY3QgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4KCkRhbmllbCAoMjUgTWFyY2ggMjAwNCkKLSBJdCB0dXJuZWQgb3V0IHRoYXQgQUlYLCBkZXNwaXRlIGhhdmluZyBhICJ0aHJlYWQtc2FmZSBsaWJjIiwgZG9lc24ndCBvZmZlcgogIGFsbCB0cmFkaXRpb25hbCBmdW5jdGlvbnMgdGhyZWFkLXNhZmUuIFRoaXMgVVJMIGlzIGluZm9ybWF0aXZlIG9uIHRoaXMKICBzdWJqZWN0OgoKICAgIGh0dHA6Ly9wdWJsaWJuLmJvdWxkZXIuaWJtLmNvbS9kb2NfbGluay9lbl9VUy9hX2RvY19saWIvYWl4cHJnZ2QvIFwKICAgIGdlbnByb2djL3RocmVhZF9xdWlja19yZWYuaHRtCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHdlIG5vdyBjaGVjayBmb3IgdGhyZWUgKl9yKCkgZnVuY3Rpb25zIG9uIHJlY2VudCBBSVgKICB2ZXJzaW9ucyBhcyB3ZWxsIHRoYXQgdGhlIFVSTCBtZW50aW9ucyBhcmVuJ3QgdGhyZWFkLXNhZmUgaW4gQUlYIDUuMS4KCi0gcmVuYW1lZCBjdXJsX3N0cmVycm9yLltjaF0gdG8gc3RyZXJyb3IuW2NoXQoKLSBKb2UgSGFscGluIGFkZGVkIENVUkxPUFRfVENQX05PREVMQVkgYW5kIC0tdGNwLW5vZGVsYXkgdG8gbWFrZSBpdCBwb3NzaWJsZQogIGZvciB1c2VycyB0byBkaXNhYmxlIHRoZSBOYWdsZSBhbGdvcnRoaW0tdXNhZ2UuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIHNvbWUgaW50ZXJlc3Rpbmcgc3RyZXJyb3JfcigpIGtub3dsZWRnZS4gZ2xpYmMgaGFzIGl0cwogIG93biBBUEkgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBQT1NJWCBvbmUuIERhbmllbCBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIGRldGVjdCB0aGUgdmVyc2lvbiBpbiB1c2UsIGFuZCB0aGUgY29kZSBub3cgdXNlcyB0aGUgbmV3IGRlZmluZXMKICBhY2NvcmRpbmdseS4KCi0gRml4ZWQgc29tZSBidWlsZCBmbGF3cyB3aXRoIHRoZSBuZXcgbGliL2N1cmxfc3RyZXJyb3IuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjQgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeCB0byByZXBsYWNlIHRoZSBiYWQgdXNlIG9mIHN0cmVycm9yKCkuIFRoaXMgaW50cm9kdWNlcwogIEN1cmxfc3RyZXJyb3IoKSB0aGF0IGF0dGVtcHRzIHRvIGJlIHRocmVhZC1zYWZlIF9hbmRfIHdvcmtzIG9uIFdpbmRvd3MgdG9vIQoKLSBUb3IgQXJudHNlbiBzcGVsbC1maXhlZCBsb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzLgoKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3RjdXJsLnBsIHdvcmsgd2l0aCBvbGRlciBwZXJsIDUgdmVyc2lvbnMsIGFuZCBEYW5pZWwKICBtYWRlIGl0IG5vdCB1c2UgY2hkaXIgLi4gdG8gZ28gYmFjaywgYXMgdGhhdCBpc24ndCB2ZXJ5IGdvb2Qgd2hlbiB5b3UndmUKICBzZXR1cCBhIHRlc3RkaXIgY29udGFpbmluZyBzeW1saW5rcy4KCi0gQWRkZWQgYSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyMyBNYXJjaCAyMDA0KQotIEFkZGVkIEdyZWcgSGV3Z2lsbCdzIHRlc3RjdXJsLnBsIHNjcmlwdCB0byBDVlMuIFdlIGhhdmUgbm90IG1vdmVkIG92ZXIgdG8KICB1c2UgdGhpcyBzY3JpcHQgZm9yIHRoZSByZWFsIGRpc3RyaWJ1dGVkIHRlc3RpbmcganVzdCB5ZXQsIGJ1dCBpdCBpcyBvbmx5CiAgYSBtYXR0ZXIgb2YgdGltZS4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IG1ha2VzIGN1cmwgcmVwb3J0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICBpZiAtLWludGVyZmFjZSBmYWlscyBvbiB3aW5kb3dzLgoKLSBUaGUgcmVndWxhciBwcm9ncmVzcyBtZXRlciBpcyBub3cgZml4ZWQgdG8gbmV2ZXIgd3JhcCBkdWUgdG8gbG9uZyBsaW5lcy4gQWxsCiAgZmllbGRzIGFyZSBub3cgc3RhdGljIHNpemVkLiBJZiB0aGUgdGltZSBpbiB0aGUgdGltZSBmaWVsZHMgZ2V0IGEgdGltZSB2YWx1ZQogIHRoYXQgd291bGQgcmVwcmVzZW50IGEgdGltZSB0aGF0IGlzIDEwMCBob3VycyBvciBtb3JlIChpZiBub3QsIGl0IHJlbWFpbnMKICB1c2luZyBhIEhIOk1NOlNTIGRpc3BsYXkpLCBpdCBzd2l0Y2hlcyBmaXJzdCB0byBhICJOTk5kIE5OaCIgZGlzcGxheSAoZm9yCiAgZGF5cyBhbmQgaG91cnMpIGFuZCBpZiB0aGF0IGlzbid0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhICJOTk5kIiBkaXNwbGF5IGlmCiAgaXQgaXMgbW9yZSB0aGFuIDk5OSBkYXlzLgoKICBTZXZlcmFsIG9mIHRoZSBjYWxjdWxhdGlvbnMgd2VyZSBhbHNvIG1vdmVkIHRvIGZpeGVkLXBvaW50IG1hdGggaW5zdGVhZCBvZgogIHVzaW5nIGRvdWJsZXMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDQpCi0gR2xlbiBOYWthbXVyYSBub3RpY2VkIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGRpZG4ndCB3b3JrIGFzIGl0CiAgdXNlZCB0byBkbyBpZiBDVVJMT1BUX05PQk9EWSBpcyBzZXQgVFJVRS4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gcGFja2FnZSBtYWtlZmlsZSBhbmQgUkVBRE1FIHRvIGFkanVzdCB0bwogIG5ldyBjeWd3aW4gcGFja2FnaW5nIGd1aWRlbGluZXMuCgotIEVuYWJsZWQgIk5UIHJlc3BvbnNlcyIgaW4gdGhlIE5UTE0gYXV0aGVudGljYXRpb24uIERvaW5nIHRoaXMgc2ltcGx5IG1lYW5zCiAgdGhhdCB3ZSBwcm92aWRlIGFuIGV4dHJhIGNodW5rIG9mIGRhdGEgaW4gZWFjaCAidHlwZS0zIG1lc3NhZ2UiLiBUaGUgb25seQogIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGl0IHNlZW1zIHRoYXQgdXNpbmcgb25seSB0aGUgIkxhbm1hbmFnZXIgaGFzaCIKICAoYXMgd2UndmUgYmVlbiBkb2luZyB1bnRpbCBub3cpIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTQKICBjaGFyYWN0ZXJzIGFuZCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIHVzZXJzIG91dCB0aGVyZSB3aG8gd2FudCB0byB1c2UKICBsaWJjdXJsIGFuZCBOVExNIHdpdGggc3VjaCBwYXNzd29yZHMhIDstKSBTZXZlbiBOVExNLXJlbGF0ZWQgdGVzdCBjYXNlcyB3ZXJlCiAgdXBkYXRlZCBhY2NvcmRpbmdseS4gTWVudGlvbmVkIGFzIGlzc3VlIDI5IGluIFRPRE8tUkVMRUFTRSwgYnVnIHJlcG9ydAogICM5MTU2MDkKCi0gTW92ZWQgdGhlIGdlbmVyYXRlZCBsaWJjdXJsIHZlcnNpb24gaW5mbyB0byBhIG5ldyBoZWFkZXIgZmlsZSwgbmFtZWQKICBjdXJsL2N1cmx2ZXIuaC4gTm93IGludGVyZXN0ZWQgcGFydGllcyBjYW4gaW5jbHVkZSBPTkxZIHZlcnNpb24gaW5mbywgc2hvdWxkCiAgYW55b25lIHdhbnQgdGhhdCAoYW5kIGl0IHNlZW1zIGF0IGxlYXN0IHNvbWUgd2luZG93cyByZXNvdXJjZSBmaWxlcyB3b3VsZCkuCiAgTWVudGlvbmVkIGFzIGlzc3VlIDI3IGluIFRPRE8tUkVMRUFTRS4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgcm9vdCBNYWtlZmlsZSB0byB1c2UgdGFicyBmb3IgdGhlIG5ldHdhcmUgdGFyZ2V0LiBH/G50ZXIgS25hdWYKICBwb2ludGVkIHRoaXMgb3V0LgoKLSBNYXJ0eSBLdWhydCdzIFZNUyBjbGVhbnVwCgotIFRob21hcyBTY2h3aW5nZSBtYWRlIGJ1aWxkY29uZiByZWNvZ25pemUgQUNMT0NBTF9GTEFHUyB0byBpbnZva2UgYWNsb2NhbAogIHdpdGggcGFydGljdWxhciBwcmUtZGV0ZXJtaW5lZCBvcHRpb25zLgoKVmVyc2lvbiA3LjExLjEgKDE5IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDQpCi0gVG9yIEFybnRzZW4gYnJvdWdodCBzb21lIGluZm8gYWJvdXQgU0dJIElSSVg6CgogIElSSVggc3VwcG9ydHMgMyBkaWZmZXJlbnQgZXhlY3V0YWJsZS9vYmplY3QgZm9ybWF0cywgLTMyLCAtbjMyIGFuZCAtNjQuCiAgLW4zMiBpcyBkZWZhdWx0IDMyLWJpdCBmb3JtYXQsIC0zMiBpcyB0aGUgIm9sZCIgMzItYml0IGZvcm1hdCwgYW5kIC02NCBpcwogIHRoZSA2NC1iaXQgZm9ybWF0LiAgTGlicmFyaWVzIGZvciB0aGUgZGlmZmVyZW50IGZvcm1hdHMgYXJlIGluIGxpYiwgbGliMzIKICBhbmQgbGliNjQgcmVzcGVjdGl2ZWx5LgoKICBXZSd2ZSBub3cgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRhcHQgdG8gdGhpcyB3aGVuIHNjYW5uaW5nIGZvcgogIDNyZCBwYXJ0eSBsaWJzLCBzdWNoIGFzIE9wZW5TU0wuCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDQpCi0gV2F0eiBwb2ludGVkIG91dCBhIGZldyBtaXNzaW5nIGZpbGVzIGluIHRoZSBNU1ZDIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS4KCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcywgY29kZSBhbmQgbWFrZWZpbGVzIHRvIGJ1aWxkIGN1cmwgb24gTm92ZWxsCiAgTmV0V2FyZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNCkKLSBMb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzIHdlcmUgdXBkYXRlZCB0byBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWFuCiAgcGFnZXMgdGhlIHJlY29nbml6ZWQgd2F5IHNvIHRoYXQgdGhleSBhcHBlYXIgYXMgbmljZSBoeXBlcmxpbmtzIGluIHRoZSBIVE1MCiAgdmVyc2lvbnMuCgotIGJ1aWxkY29uZiBub3cgY2hlY2tzIHRoZSBtNCB2ZXJzaW9uIHRvbywgc2luY2UgYXV0b2NvbmYgcmVxdWlyZXMgYSBHTlUgbTQKICB2ZXJzaW9uIHRvIGJ1aWxkIHByb3BlciBjb25maWd1cmUgc2NyaXB0cy4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkVfTEFSR0UsIHRoZSBsYXJnZSBmaWxlIHZlcnNpb24gb2YKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gYWxsb3cgUE9TVHMgbGFyZ2VyIHRoYW4gMkdCLgoKLSBEYXZpZCBCeXJvbiBmaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNhc2UvY3Jhc2guCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDQpCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGRlYWwgd2l0aCByZWNlaXZlZCBzaWduYWxzIGR1cmluZyB0aGUKICBjb25uZWN0LgoKLSBDaGFuZ2VkIHRoZSBPUyBzdHJpbmcgZm9yIHdpbjMyIHRvIGJlY29tZSAiaTM4Ni1wYy13aW4zMiIuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNCkKLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbHMgdG8gdXNlIGN1cmxfc29ja2V0X3QgZm9yIHNvY2tldCB2YXJpYWJsZSB0eXBlLiBUaGlzCiAgc2hvdWxkIGVuYWJsZSB1cyB0byBidWlsZCB3aXRoIGxlc3Mgd2FybmluZ3Mgb24gV2luZG93cywgd2hlcmUgU09DS0VUIGlzCiAgdXNlZCB3aGljaCBpcyBhbiB1bnNpZ25lZCBpbnQsIHdoaWxlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHVzZSBhIG1lcmUgaW50LgoKLSBNb2RpZmllZCBsaWIvY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSBvbiBNU1ZDIGFnYWluLgoKVmVyc2lvbiA3LjExLjEtcHJlMSAoOCBNYXJjaCAyMDA0KQoKRGFuaWVsICg4IE1hcmNoIDIwMDQpCi0gTWlub3IgZml4IHRvIG1ha2UgY3VybCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGlzIG9ubHkgc2V0IGlmIGN1cmxfb2ZmX3QgaXMKICBsYXJnZXIgdGhhbiA0IGJ5dGVzLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSW1wcm92ZWQgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIHNvIGNhbGxlZCBpc3N1ZSAxMi4KCi0gTW9kaWZpZWQgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgYSBsb3QgdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBjaGFuZ2VzIGZvcgogIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24gKGxpa2UgdGVzdCBjYXNlIDg4KS4gQWRkZWQgQW5kculzCiAgR2FyY+1hJ3Mgd2luMzItY2hhbmdlcy4gSW1wcm92ZWQgdGhlIGxvZ2dpbmcuCgotIEZpeGVkIHRoZSBmaWxlOi1yZWxhdGVkIHByb2dyZXNzL2dldGluZm8gc3R1ZmYgYSBiaXQgbW9yZS4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEkgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjoKICBoZWFkZXIgb3Igd2hlbiBkb2luZyBtdWx0aXBsZS1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9ucy4gQSBzdWJzZXF1ZW50IHJlcXVlc3QKICBjb3VsZCBlcnJvbmVvdXNseSByZS11c2UgYSBwcmV2aW91cyBjb25uZWN0aW9uIHRoYXQgd2FzIHNlbnQgd2l0aAogIENvbm5lY3Rpb246IGNsb3NlLiBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQuCgotIEFuZHLpcyBHYXJj7WEgcGF0Y2hlZCBjdXJsIHRvIHByZXZlbnQgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nIHdpdGggbWluZ3csCiAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgYm90aCBXSU4zMiBhbmQgSEFWRV9DT05GSUdfSAogIGRlZmluZWQuCgotIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGZyb20gYSBmaWxlOiBVUkwsIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgb3RoZXIKICB0cmFuc2ZlciBtZXRyaWNzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkuCgotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgInZlcnNpb24gcmVzb3VyY2UiIGZpbGUgdG8gdGhlIGN1cmwgZXhlY3V0YWJsZSBmb3IKICB0aGUgd2luZG93cyBidWlsZHMuCgpEYW5pZWwgKDMgTWFyY2ggMjAwNCkKLSBEYXZpZCBCeXJvbidzIHdvcmsgb24gbWFraW5nIGxpYmN1cmwgb25seSByZXF1aXJlIHdpbnNvY2sgMS4xIG9uIFdpbmRvd3MKICBtYWNoaW5lcy4KCi0gTW9yZSB2YXJpYWJsZSBjbGVhbnVwcyBiYXNlZCBvbiBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgVG9yIEFybnRzZW4ncwogIGF1dG9idWlsZHMgd2l0aCBNSVBTUHJvLgoKLSBKb2UgSGFscGluIGhlbHBlZCB1cyBmaXggc29tZSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBvbiBGcmVlQlNELgoKLSBBcHBsaWVkIFRvbSBCYXRlcycgcGF0Y2ggdG8gYnVpbGQgb24gbnNyLXRhbmRlbS1uc2suCgotIERhbiBGYW5kcmljaCBjb3JyZWN0ZWQgc29tZSBmbGF3cyBpbiB0aGUgY29uZmlndXJlIEdTUyBkZXRlY3Rpb24uCgpEYW5pZWwgKDIgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgbGliY3VybCBjb2RlIHRvIHVzZSBGT1JNQVRfT0ZGX1QgZm9yIHByaW50ZigpIGZvcm1hdHRpbmcKICBjdXJsX29mZl90IHR5cGVzIGludGVybmFsbHkuCgpEYW5pZWwgKDEgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGFzIGEgZmVhdHVyZS1iaXQgaW4gdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkKICByZXNwb25zZSwgdGhhdCBzaWduYWxzIGlmIHRoaXMgbGliY3VybCBzdXBwb3J0cyA+MkdCIGZpbGVzLiBjdXJsIC1WIG5vdwogIG91dHB1dHMgJ0xhcmdlZmlsZScgaW4gdGhlIEZlYXR1cmVzOiBmaWVsZCBpZiB0aGlzIGlzIHRoZSBjYXNlLiBNb3N0IHN5c3RlbXMKICBhcmUgbGlrZWx5IHRvIHN1cHBvcnQgdGhpcy4KCi0gV2Ugb2ZmZXIgYSBDVVJMX0ZPUk1BVF9PRkZfVCBkZWZpbmUgaW4gdGhlIHB1YmxpYyBoZWFkZXIsIHdoaWNoIGNhbiBiZSB1c2VkCiAgdG8gcHJpbnRmKCkgY3VybF9vZmZfdCB2YXJpYWJsZXMuIFdlIGFsc28gbW9kaWZpZWQgdGhlIGxpYmN1cmwgc291cmNlcyB0bwogIHVzZSB0aGlzIGRlZmluZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAlT2QgYXBwcm9hY2ggKGFsdGhvdWdoIEkndmUgbGVmdCB0aGUKICBPLWZsYWcgZnVuY3Rpb25hbCBpbiB0aGUgY29kZSkuIFRoaXMgc2hvdWxkIGFsc28gcHJldmVudCBjb21waWxlcnMgdG8gd2FybgogIG9uIHRoZSBob21lLWdyb3duIG9wdGlvbi4KCi0gRml4ZWQgdGhlIHJlc3VtZS1jaGVjayBjb2RlIHRvIHRlc3QgZm9yIGEgd29ya2luZyByZXN1bWUgYXQgdGhlIGVuZCBvZiB0aGUKICBoZWFkZXJzIGFuZCBub3QgYXQgdGhlIGZpcnN0IGJvZHktYnl0ZS4KCi0gQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gU3RvcCB1c2luZyBpdC4gSWYKICB5b3UgbmVlZCBhIGdsb2JhbCBETlMgY2FjaGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgdXNlIHRoZSBzaGFyZSBpbnRlcmZhY2UgYW5kCiAgeW91J2xsIGdldCBhIGdsb2JhbCBjYWNoZSB0aGF0IHdvcmtzIHRoZSB3YXkgaXQgc2hvdWxkIHdvcmsuIFlvdSBjYW4gZXZlbgogIGhhdmUgYW55IG51bWJlciBvZiBnbG9iYWwgY2FjaGVzLCBhbGwgYXQgeW91ciBjb21tYW5kLiBUaGlzIGlzIG5vdyBhbHNvCiAgbWVudGlvbmVkIGluIHRoZSBkb2NzLgoKLSBNYWRlIHRoZSAqcHJpbnRmIGNvZGUgc3VwcG9ydCB0aGUgei1mbGFnIHRvIGVuYWJsZSBzaXplX3QgcHJpbnRmKCkgaW4gYQogIG1hbm5lciBzaW1pbGFyIHRvIGhvdyBnbGliYyBhbGxvd3MgaXQuIFRvIG1ha2UgcHJpbnRmaW5nIG9mIHRoaXMgd29yayBvbgogIHBsYXRmb3JtcyB3aXRoIDY0Yml0IHNpemVfdCBhbmQgMzJiaXQgaW50cy4gSWYgdGhlcmUgZXZlbiBhcmUgYW55ISA7LSkKCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3UgQ1VSTE9QVF9GUkVTSF9DT05ORUNUIGFuZAogIENVUkxBVVRIX05UTE0gKG9yIENVUkxBVVRIX0FOWSBhbmQgbGliY3VybCB0aGVuIHBpY2tlZCBOVExNKSwgbGliY3VybCB3b3VsZAogIGxvb3Agd2l0aG91dCBzdWNjZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZSBkdWUgdG8gdGhlIG5ldyBjb25uZWN0aW9uIHRoYXQgd2FzCiAgbWFkZSBmb3IgYWxsIHJvdW5kLXRyaXBzIGluIHRoZSBhdXRoZW50aWNhdGlvbi4gTm93LCB0aGUgRlJFU0hfQ09OTkVDVCBpcwogIHJlbWFkZSB0byBvbmx5IG1hdHRlciBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24gbWFkZSB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgYWxsIHRoZSByZXN0IHRoYXQgbWlnaHQgZm9sbG93IGR1ZSB0byBGT0xMT1dMT0NBVElPTiBvciBIVFRQCiAgYXV0aGVudGljYXRpb24gYXJlIG5vdyBpZ25vcmluZyB0aGF0IG9wdGlvbi4KCi0gQWRqdXN0ZWQgdGhlIFFVSVQgY29kZSBzbGlnaHRseSBzaW5jZSBpdCBjb3VsZCBjb3JlLWR1bXAuCgotIENvcnJlY3RlZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gcHJvdmlkZSBhIGNvcnJlY3Qgc2l6ZSB0byB0aGUKICAndmVyaWZpZWRzZXJ2ZXInIHJlcXVlc3QuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDQpCi0gSm9lIEhhbHBpbiBtYWRlIHRoZSBGVFAgY29kZSBzZW5kIFFVSVQgb24gdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBiZWZvcmUKICBkaXNjb25uZWN0aW5nIHRoZSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyB3aGF0IGdvb2QtYmVoYXZpbmcgZnRwIGNsaWVudHMKICBzaG91bGQgZG8uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gdXBkYXRlZCBzZXZlcmFsIGZpbGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE1TVkMgNi4gSGUKICBhbHNvIGFkZGVkIHRoZSAnYnVpbGRjb25mLmJhdCcgdGhhdCB3b3JrcyBsaWtlIHRoZSAnYnVpbGRjb25mICsgY29uZmlndXJlJwogIGNvbWJvIGRvZXMgb24gdW5peGVzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtZW1kZWJ1ZyBzdHVmZiBzdXBwb3J0IGNhbGxvYygpIGFzIHdlbGwuCgotIFRvciBBcm50c2VuIHBvaW50ZWQgb3V0IHRoYXQgdGVzdGN1cmwuc2ggbmVlZGVkIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdGVkCiAgZmlsZXMgaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIHJlLWdlbmVyYXRlZCBpbiBlYWNoIGJ1aWxkLgoKLSBBbmR5IFNlcnBhIGZvdW5kIG91dCB0aGF0IHRoZSBzaGFyZSBpbnRlcmZhY2UgZGlkIG5vdCBlbmpveSBsaWZlIHdoZW4gbm90CiAgaGF2aW5nIHRoZSBsb2NrIGFuZCB1bmxvY2sgY2FsbGJhY2tzIHNldCwgZXZlbiB0aG91Z2ggZG9jdW1lbnRlZCB0byBiZQogIE9LLiBJdCBzdGlsbCBpcyBPSywgYW5kIG5vdyB0aGUgY29kZSB3b24ndCBzZWdmYXVsdCBhbnltb3JlIQoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR3JlZyBIZXdnaWxsIEkgbW9kaWZpZWQgaG93IGxvbmcgbG9uZyBpcyB1c2VkIGluIHRoZQogIG1wcmludGYgY29kZSwgYXMgd2UgY2FuIHVzZSBhIDY0Yml0IHR5cGUgd2l0aCBNU1ZDIHRoYXQgaXMgYSBsb25nIGxvbmcKICBlcXVpdmFsZW50LiBUaGlzIGNvcnJlY3RzIHNvbWUgd2VpcmQgbGFyZ2UgZmlsZSBiZWhhdmlvcnMgb24gd2luZG93cy4KCi0gVG9yIEFybnRzZW4gaGVscGVkIG1lIHdvcmsgb3V0IC0tZW5hYmxlLWRlYnVnIHRvIHdvcmsgYmV0dGVyIHdpdGggZGlmZmVyZW50CiAgdmVyc2lvbnMgb2YgdGhlIGdjYyBhbmQgaWNjIGNvbXBpbGVycy4KCi0gQWRkZWQgQ1VSTE9QVF9TSEFSRSB0byB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA0KQotIEFwcGxpZWQgdGhlIGZpbmFsIHBpZWNlcyBvZiBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgYnJpbmdzIGEgd29ya2luZyBuYW1lCiAgcmVzb2x2ZSB0aW1lb3V0IHRvIHRoZSB3aW5kb3dzIHZlcnNpb25zIG9mIGN1cmwhCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24ncyBmaXggdG8gYWxsb3cgdGhlIHNwZWVkLWxpbWl0IGxvZ2ljIHdvcmsgZXZlbiBpZiB5b3Ugc2V0CiAgbGltaXQtcmF0ZS4gSXQgZG9lcyB3b3JrIG9uIHRoZSBleHBlbnNlIG9mIHRoZSByYXRlIGxpbWl0ZXIuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDQpCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHdpdGggZ2NjIG5vdyBhbHNvIHRyaWVzIHRvIGRldGVjdCB0aGUgaWNjIGNvbXBpbGVyCiAgKHdoaWNoIHNvbWVob3cgZ2V0cyB0cmVhdGVkIGFzIGlmIGl0IGlzIGEgZ2NjKSB0byBzdG9wIHVzaW5nIGFsbCB0aGUgZ2NjCiAgb3B0aW9ucyB3aXRoIGl0LCBhbmQgd2UgYWxzbyBwcm92aWRlIC1pc3lzdGVtIG9wdGlvbnMgZm9yIGVhY2ggZXh0cmEgLUkKICBvcHRpb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIGZpZ3VyZWQgb3V0IChmb3IgT3BlblNTTCwga2VyYmVyb3MsIHpsaWIsCiAgSGVpbWRhbCBldGMpLiBUaGlzIG9mIGNvdXJzZSB0byBwcmV2ZW50IHdhcm5pbmdzIG9uIGhlYWRlcnMgd2UgZG9uJ3QgaGF2ZQogIGNvbnRyb2wgb2YuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDQpCi0gRG91ZyBQb3J0ZXIgbWFkZSBsaWJjdXJsIHVzZSB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhlCiAgZ2V0cHd1aWQgcmVzdWx0cyB3aGVuIGxvb2tpbmcgZm9yIC5uZXRyYyBmaWxlcy4KCi0gSWYgJ2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZycgaXMgdXNlZCB3aXRoIGdjYywgaXQgbm93IGNoZWNrcyB3aGljaCBnY2MKICB2ZXJzaW9uIGl0IGlzIGFuZCB1c2VzIGFzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgYXMgcG9zc2libGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgdmVyc2lvbi4KCi0gQ29kZSB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyBtYWRlIHRvIHVzZQogIHRoZSBjdXJseF8gcHJlZml4LiBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlIGxpa2UgdGhpcyBpcyB0aGUKICBjdXJseF9zdHJ0b2xsKCkgZnVuY3Rpb24uIFRoaXMgaXMgbWFkZSB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBleGlzdGluZyBjb2RlLAogIGJ1dCB3aXRob3V0IHBvbGx1dGluZyB0aGUgbGliY3VybCBBUEkuIEZ1cnRoZXIgZXhwbGFuYXRpb25zIHBvc3RlZCBoZXJlOgoKICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNC0wMi8wMjE1Lmh0bWwKCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBidWlsZGNvbmYgdG8gbm90IHVzZSAid2hpY2giIGFzIEFJWCBhbmQgVHJ1NjQgaGF2ZSB3aGF0IGhhdmUgYmVlbgogIHJlZmVycmVkIHRvIGFzICJob3JyaWJseSBicm9rZW4gJ3doaWNoJyBwcm9ncmFtcyIuCgotIE1hZGUgc3VyZSBkbnMgY2FjaGUgdGltZW91dCBzZXQgdG8gLTEgcmVhbGx5IG1lYW5zIGNhY2hpbmcgZm9yZXZlci4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNCkKLSBNYWRlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGMtYXJlcyB3aXRoIHRoZSBsaWJjdXJsIG1lbWRlYnVnIHN5c3RlbSB0byBiZXR0ZXIKICB0cmFjayBtZW1vcnkuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDQpCi0gV2hlbiB1c2luZyBhcmVzLCB3ZSBub3cgaW5pdGlhbGl6ZSB0aGUgYXJlcyAnY2hhbm5lbCcgaW4gY3VybF9lYXN5X2luaXQoKQogIGFuZCByZS11c2UgdGhhdCBzYW1lIGhhbmRsZSBkdXJpbmcgdGhlIGVudGlyZSBjdXJsIGhhbmRsZSdzIGxpZmUtdGltZS4gSXQKICBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KCi0gRml4ZWQgYSBwcm9ibGVtIHdoZW4gZGlzcGxheWluZyB2ZXJib3NlIGZvciBpcHY2LWVuYWJsZWQgbGliY3VybHMgYW5kCiAgcmUtdXNlZCBjb25uZWN0aW9ucy4gUHJvYmxlbSByZXBvcnRlZCBhbmQgZml4IHZlcmlmaWVkIGJ5IEdyaWdvcnkgRW50aW4uCgotIEplZmYgTGF3c29uIGZpeGVkIHRoZSB2ZXJzaW9uLWNoZWNrIGluIHRoZSBTT0NLUzUgY29kZS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBhIGNhc2Ugd2hlcmUgYSBob3N0IGNhY2hlIGVudHJ5IHdhcyBub3QgZmxhZ2dlZCBpbi11c2UgcHJvcGVybHkgd2hlbiBhCiAgY2FjaGVkIGVudHJ5IHdhcyB1c2VkLgoKLSBBbmRy6XMgR2FyY+1hJ3MgcGF0Y2ggdGhhdCBjaGVja3MgZm9yIHdpbm1tIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDQpCi0gQmVuIEdyZWVhcidzIFNPX0JJTkRUT0RFVklDRSBwYXRjaCBmb3IgdGhlIGJpbmRpbmcgb2YgdGhlIGxvY2FsIGVuZCB0byBhCiAgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UuCgotIEdyZWcgSGV3Z2lsbCBmb3VuZCBvdXQgdGhhdCB0aGUgdmFyaWFibGUgaG9sZGluZyAnY29udGVudGxlbmd0aCcgd2Fzbid0IGJpZwogIGVub3VnaCB0byBob2xkIGEgbGFyZ2UgZmlsZSEKCi0gVG9yIEFybnRzZW4gZml4ZWQgYSA2NGJpdC1yZWxhdGVkIHByb2JsZW0gaW4gZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhlIGZ0cAogIGRlcGFydG1lbnQsIGFuZCB0aGVyZSB3YXMgYW5vdGhlciBwb3RlbnRpYWwgcHJvYmxlbSBpbiB0aGUgbmFtZSByZXNvbHZlIGNvZGUKICB0b28uCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDQpCi0gUmVtb3ZlZCBhIGZldyB2YXJpYWJsZXMgdGhhdCB3ZXJlIG9ubHkgc2V0IGJ1dCBuZXZlciB1c2VkLCBhcyBzb21lIGNvbXBpbGVycwogIHdhcm4gYWJvdXQgdGhhdCBhbmQgd2UgZG8gbm90IGxpa2UgY29tcGlsZXIgd2FybmluZ3MhCgotIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHN5bWxpbmtzIGluIHRoZSB0ZXN0cy9kYXRhIGRpcmVjdG9yeSBpZiBjdXJsIGlzIGJ1aWx0CiAgb3V0c2lkZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlICdtYWtlIHRlc3QnIGlzIHVzZWQuIFRoaXMgd2FzIGRvbmUKICBieSBwcm92aWRpbmcgYSAic291cmNlIGRpciBwYXRoIiB0byB0aGUgc2NyaXB0cy9zZXJ2ZXJzLgoKLSBOb3csIGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGZpbmQgYW4gbnJvZmYgdG9vbCBvciBhbiBvcHRpb24gdG8gbnJvZmYKICB0byB1c2UgdG8gY29udmVydCBtYW4gcGFnZXMgd2l0aCwgaXQgd2lsbCBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGJ1aWx0LWluCiAgbWFudWFsLgoKLSAnY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwnIGNvbXBsZXRlbHkgZGlzYWJsZXMgdGhlIGJ1aWx0LWluIG1hbnVhbCBmcm9tCiAgdGhlIGN1cmwgY29tbWFuZCB0b29sLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBhIG1pbm9yIHNvdXJjZSBlZGl0LCBhbmQgbm93CiAgaGUgaGFzIG1hbmFnZWQgdG8gZ2V0IG1zeXMvbWluZ3cgdG8gcnVuIGNvbmZpZ3VyZSBhbmQgdGhlbiBidWlsZCEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDA0KQotIFRoZSBkZWZhdWx0IEhUVFAgQWNjZXB0OiBoZWFkZXIgd2FzIG1vZGlmaWVkIHRvIHRoZSBtdWNoIHNpbXBsZXIKICAiQWNjZXB0OiAqLyoiLgoKLSBQIFIgU2NoYWZmbmVyIHVwZGF0ZWQgdGhlIGN1cmwtc3NsIHNwZWMgZmlsZSBmb3IgUlBNcy4KCi0gRG9taW5pY2sgTWVnbGlvIGJyb3VnaHQgbG90cyBvZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2hhcmUgaW50ZXJmYWNlJ3MgbWFuCiAgcGFnZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbWlzc2luZy4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgd29yay1hcm91bmQgYSBidWcgaW4gdGhlCiAgQUlYNSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRhZGRyaW5mbygpLiBUaGlzIG1ha2VzIHRoZSBGVFAgUE9SVCBzdHVmZiB3b3JrIG9uCiAgaXB2Ni1lbmFibGVkIEFJWCBidWlsZHMuCgotIEtlbiBSYXN0YXR0ZXIgcHJvdmlkZWQgcG9ydGFiaWxpdHkgZml4ZXMgZm9yIHRoZSBjdXJsZ3RrLmMgZXhhbXBsZSwgYW5kIG5vdwogIGl0IHJ1bnMgb24gd2luZG93cyB3aXRoIEdUSyBhcyB3ZWxsIQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgZ2V0aG9zdGJ5bmFtZSgpIGZpbmUgd2hlbiBydW4KICB3aXRoIG1pbmd3IG9uIHdpbmRvd3MuCgotIE1vZGlmaWVkIHRoZSBsZGFwIGNvZGUgdG8gdXNlIHByb3BlciBmdW5jdGlvbiBwb2ludGVycyBhbGwgb3ZlciAoaW5zdGVhZCBvZgogIG1peGVkIGRhdGEgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzKSB0byB3b3JrLWFyb3VuZCB0aGUgcGlja3kgTUlQU1BybyBjb21waWxlcgogIHdhcm5pbmdzLgoKLSBBIGN1c3RvbSBIb3N0OiBoZWFkZXIgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBtYWRlIGJ5CiAgZm9sbG93aW5nIGEgbG9jYXRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggVGltIEJha2VyLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGxpYnogcGFydCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgb25seSBzZXQgdGhlIHR3byBsaWJ6LXJlbGF0ZWQKICBkZWZpbmUgSEFWRV9aTElCX0ggYW5kIEhBVkVfTElCWiBpZiBib3RoIHRoZSBsaWIgYW5kIHRoZSBoZWFkZXIgaXMgZm91bmQuCiAgSWYgb25lIGlzIG1pc3NpbmcsIG5vbmUgb2YgdGhlIGRlZmluZXMgaXMgc2V0LgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBNaW5ndyBtYWtlZmlsZXMuCgotIExlbiBLcmF1c2UgcmVwb3J0ZWQgdGhhdCBjdXJsIDcuOS5YIGNvdWxkIGRvIHVwbG9hZGluZyBmcm9tIHN0ZGluIHdpdGhvdXQKICBkb2luZyBjaHVua2VkIGVuY29kaW5nLCB3aGljaCBjdXJyZW50IGN1cmwgY2Fubm90IGRvIGV2ZW4gaWYgeW91IGRpc2FibGUKICB0aGUgdHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZCBoZWFkZXIuIE5vdyBpdCBjYW4gYWdhaW4sIGFuZCB0ZXN0IGNhc2UgOTgKICB2ZXJpZmllcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRvciBBcm50c2VuIGZpeGVkIGEgd2VpcmQgZ2V0YWRkcmluZm8oKSB1c2FnZSBpbiB0aGUgRlRQIGNvZGUsIHByZXZlbnRpbmcKICB0aGUgaXB2Ni1jb2RlIGZvciBQT1JUIHdvcmsgb24gQUlYIDUuMi4gV2Ugbm93IGFsc28gcHJvdmlkZSAoYmV0dGVyKSBlcnJvcgogIG1lc3NhZ2VzIHdoZW4gYmFpbGluZyBvdXQgaW4gdGhlIHRoYXQgZnVuY3Rpb24uCgotIFRvciBBcm50c2VuIG5vdyBwcm92aWRlcyBBSVggYW5kIElSSVggKHVzaW5nIGdjYywgeGxjIGFuZCB0aGUgTUlQU1BybwogIGNvbXBpbGVycykgYXV0b21hdGVkIGJ1aWxkIGxvZ3MgKGh0dHA6Ly9jdXJsLmhheHguc2UvYXV0by8pIGFuZCB3ZSd2ZSBmaXhlZAogIG51bWVyb3VzIG1pbm9yIHF1aXJrcyB0byBtYWtlIGxlc3Mgd2FybmluZ3MgYXBwZWFyLgoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaWxhZCwgd2Ugbm93IHVzZSB0aGUgY3VzdG9tIHRpbWVvdXRzIHdoZW4gd2FpdGluZyBmb3IgYQogIHNlcnZlciB0byBjb25uZWN0IHdoZW4gdXNpbmcgRlRQIFBPUlQuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHdhaXRlZCAxMAogIHNlY29uZHMsIG5vIG1vcmUgbm8gbGVzcy4gV2Ugbm93IGFsc28gY2hhbmdlZCB0aGUgZGVmYXVsdCAoaWYgbm8gdGltZW91dCBpcwogIHNldCkgdG8gd2FpdCA2MCBzZWNvbmRzIGZvciB0aGUgY29ubmVjdCBiZWZvcmUgd2UgZmFpbC4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA0KQotIE1vZGlmaWVkIHRvIGxpbmsgd2l0aCBjLWFyZXMgaW5zdGVhZCBvZiBhcmVzLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDQpCi0gQWRkZWQgYSBjb25maWd1cmUgdGVzdCB0byBjaGVjayBmb3Igd2hpY2ggb3B0aW9uIHRoZSAoZylucm9mZiB0b29sIHdhbnRzCiAgdG8gZXh0cmFjdCBwbGFpbiB0ZXh0IGZyb20gdGhlIG1hbiBwYWdlcy4gVG9yIEFybnRzZW4gdG9sZCB1cyB0aGUgQUlYCiAgdmVyc2lvbiBvZiBHTlUgZ25yb2ZmIGRvZXNuJ3Qgc3VwcG9ydCAtbWFuIQoKLSBBZGRlZCBhbiB1bmRlZiBvZiBhY2NlcHQgaW4gbWVtZGVidWcuaCB0byBtYWtlIGN1cmwgYnVpbGQgd2l0aCAtLWVuYWJsZS1kZWJ1ZwogIG9uIEFJWCA1LjIgd2hpY2ggc2VlbXMgdG8gaGF2ZSBhY2NlcHQgZGVmaW5lZC4gUmVwb3J0ZWQgYnkgVG9yIEFybnRzZW4uCgotIGN1cmxfdmVyc2lvbigpIG5vdyBpbmNsdWRlcyBjLWFyZXMgdmVyc2lvbiBpbmZvLCBhbmQgY3VybF92ZXJzaW9uX2luZm8oKSBub3cKICByZXR1cm5zIGEgc3RydWN0IHdpdGggdmVyc2lvbiBTRUNPTkQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoYXQgaW5mby4KCi0gV2UgYXJlIG5vdyBvZmZpY2lhbGx5IHVzaW5nIGMtYXJlcyBmb3IgYXN5bmNoIG5hbWUgcmVzb2x2ZXMuIGMtYXJlcyBpcyB0aGUKICBuZXcgbGlicmFyeSwgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGFyZXMgYnV0IHdpdGggYW4gZXh0ZW5kZWQgYW5kIHNsaWdodGx5CiAgbW9kaWZpZWQgQVBJLgoKLSBEaXJrIGltcHJvdmVkIHRoZSBhcmVzIHRpbWVvdXQgY29kZSwgYW5kIG5vdyB3ZSBhbHNvIGluY2x1ZGUgdGhlIGFyZXMgZXJyb3IKICBzdHJpbmcgd2hlbiB3ZSBmYWlsIHRvIHJlc29sdmUgYSBuYW1lLgoKLSBBbm90aGVyIHR3ZWFrIHRvIG1ha2UgdGVzdCBjYXNlIDkxIHJ1biBmaW5lLiBOb3cgd2UgaGF2ZSBhbm90aGVyIGJpdCBvbiBhCiAgY29ubmVjdGlvbiB0aGF0IGlzIHNldCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG1hcmtlZCBmb3IgJ3JldHJ5Jy4gVGhhdAogIG1ha2VzIHRoZSBjb25uZWN0aW9uIGdldCBjbG9zZWQgYW5kIHJlLW9wZW5lZCBhbmQgdGhlIEhUVFAtZG9uZSBjb2RlIG11c3QKICBub3QgY29tcGxhaW4gb24gdGhlIGZhY3QgdGhhdCBubyBkYXRhIHdhcyByZWNlaXZlZC4KCi0gQmFzZWQgb24gRGlyayBNYW5za2UncyBwYXRjaCwgSSBtb2RpZmllZCB0aGUgbmFtZSByZXNvbHZpbmcgd2l0aCBhcmVzIHRvCiAgZmVhdHVyZSBhIHRpbWVvdXQgZm9yIHJlYWxseSBzbG93IGxvb2t1cHMuIEl0IG5vdyBkZWZhdWx0cyB0byAzMDAgc2Vjb25kcywKICBidXQgaXMgbm93IGFkanVzdGVkIHRvIHRoZSBDT05ORUNUVElNRU9VVC9USU1PVUUgdGltZW91dHMgaWYgb25lIG9mIHRoZW0KICBpcyBzZXQuCgotIEZpeGVkIHRoZSBpbmNsdXNpb24gb2YgY2EtYnVuZGxlLmggdG8gcmVhbGx5IHVzZSB0aGUgb25lIGluIHRoZSBidWlsZCBkaXIKICBiZWZvcmUgdGhlIG9uZSBpbiB0aGUgc291cmNlIGRpci4gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IGFuZCByZXBvcnRlZC4KCi0gQWRkZWQgdGVzdCBjYXNlIDk3LCBhIHNpbXBsZSBQT1NUIHdpdGggYSBjdXN0b20gQ29udGVudC1UeXBlIGhlYWRlcgogIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uZS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA0KQotIEFkZGVkIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBmaXggdGhlIHRlc3QgOTEgZmFpbHVyZS4gQXMgaGFzIGJlZW4gZmlndXJlZCBvdXQKICBieSBQYXRyaWNrIFNtaXRoLCB0aGUgZXJyb3IgaGFwcGVucyBiZWNhdXNlIHdlIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB0aGUKICBzZXJ2ZXIgaXMganVzdCBhYm91dCB0byBjbG9zZSBhbmQgd2UgZXZlbiBtYW5hZ2UgdG8gc2VuZCBhd2F5IHRoZSByZXF1ZXN0CiAgd2l0aG91dCBzZWVpbmcgYW4gZXJyb3IuIE9uIHRoZSBmaXJzdCByZWFkIGF0dGVtcHQgd2UgZ2V0IGEgRUNPTk5SRVNFVC4KICBTdGFydGluZyBub3csIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHRoaXMgYW5kIGlmIHNvLCB3ZSByZXRyeSB0aGUgcmVxdWVzdCBvbiBhCiAgZnJlc2ggY29ubmVjdGlvbi4KCi0gSSBhZGRlZCB0ZXN0IGNhc2UgNTEwIHdoaWNoIGlzIGEgY3VzdG9tIHByb2dyYW0gdGhhdCBkb2VzIGEgUE9TVCB1c2luZyBhCiAgcmVhZCBjYWxsYmFjaywgd2l0aCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLgoKLSBBZGp1c3RlZCBvbmUgb2YgdGhlIE1QRS9pWCBjaGFuZ2VzIGFzIGl0IG1hZGUgdGVzdCBjYXNlIDUwNCBmYWlsIGFsbCBvdmVyLgoKLSBBZGRlZCAtLXNvY2tzIGFzIGEgcmVjb2duaXplZCBvcHRpb24uIEl0IHdvcmtzIGp1c3QgbGlrZSAtLXByb3h5IGJ1dCBzZXRzIGEKICBTT0NLUzUgcHJveHkgdG8gdXNlLiBTT0NLUzUgc3VwcG9ydCBoYXMgYmVlbiBhdmFpbGFibGUgaW4gbGliY3VybCBmb3IgYQogIHdoaWxlLCBqdXN0IG5vdCBwcm92aWRlZCBieSB0aGUgY3VybCB0b29sLiBUaGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGZvcgogIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA0KQotIFN0YWRsZXIgU3RlcGhhbiBwb2ludGVkIG91dCB0aGF0IHNyYy9odWdlaGVscC5jIGluY2x1ZGVkIGNvbmZpZy5oIHdpdGhvdXQKICBjaGVja2luZyB0aGUgZGVmaW5lIGlmIGl0cyBwcmVzZW50Li4uCgotIEtlbiBIaXJzY2ggcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiB0aGUgTVBFL2lYIG9wZXJhdGluZwogIHN5c3RlbS4KCi0gRGFuIEZhbmRyaWNoIGNvbXBpbGVkIGN1cmwgd2l0aCBsb3RzIG9mIGFnZ3Jlc3NpdmVseSBwZWRhbnRpYyBjb21waWxlcgogIG9wdGlvbnMgYW5kIHRodXMgZm91bmQgYSBmZXcgbWlub3IgZXJyb3JzIGFuZCBkaWQgc29tZSBnZW5lcmFsIGNsZWFudXBzIHRvCiAgYXZvaWQgdGhlbS4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBmbGF3IGluIGFyZXMgdGhhdCBwcmV2ZW50ZWQgaXQgdG8gdXNlIG5vbi1ibG9ja2luZwogIHNvY2tldHMgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNCkKLSBSaWNoYXJkIEJyYW1hbnRlIGZpeGVkIGNodW5rZWQgdHJhbnNmZXItZW5jb2RlZCAidXBsb2FkcyIgdG8gc2VuZCBhIGZpbmFsCiAgQ1JMRiBjb21ibyBwcm9wZXJseS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDA0KQotIE1hZGUgdGhlIHJlc3BvbnNlLWhlYWRlcnMgZHVyaW5nIGEgQ09OTkVDVCByZXF1ZXN0IHRvIGEgcHJveHkgZ2V0IHBhc3NlZCBvbgogIGFzIHJlZ3VsYXIgaGVhZGVycywgc28gdGhleSBhcHBlYXIgd2l0aCAtaS8tSSBvcHRpb25zIGFuZCBzaW1pbGFyLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpc2xlIFZhbmVtLCBJJ3ZlIG1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkKICBwcm9wZXJseSBzd2l0Y2ggdG8gYSBHQi1kaXNwbGF5IHdoZW4gbW9yZSB0aGFuIDk5OTlNQiBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIHBvaW50ZWQgb3V0IGEgY3VybHJjIHBhcnNlciBwcm9ibGVtL2NyYXNoIHdoZW4gYW4gb3B0aW9uIHdpdGggYQogIHJlcXVpcmVkIGRpZG4ndCBoYXZlIG9uZSBhbmQgd2FzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlLgoKLSBNb3JlIFdpbmRvd3MgZml4ZXMgZm9yIGxhcmdlIGZpbGVzLiBXZSBub3cgYnVpbGQgYW5kIGxpbmsgd2l0aAogIC4uL2xpYi9zdHJ0b29mZnQuYyBpbiB0aGUgYXBwIGNvZGUgc2luY2UgQ3VybF9zdHJ0b2xsKCkgaXMgbm90IGEgcHJvdmlkZWQKICBsaWJjdXJsIGZ1bmN0aW9uLi4uIFBlcmhhcHMgd2Ugc2hvdWxkIGNvbnNpZGVyIGEgJ2NvbW1vbicgZGlyIG9yIHNpbWlsYXIKICB3aGVyZSB3ZSBwdXQgc291cmNlIGNvZGUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIHRoZSBjbGllbnQuIE9yIHBlcmhhcHMKICB3ZSdsbCBqdXN0IG1ha2UgdGhpcyBmdW5jdGlvbiBhdmFpbGFibGUgaW4gdGhlIGxpYnJhcnkuLi4KCi0gVmluY2VudCBCcm9ubmVyIGZvdW5kIG91dCB0aGUgc29ja3M1IGNvZGUgY3Jhc2hlZCB3aGVuIG5vIHVzZXJuYW1lIHdhcwogIHNldC4KCi0gVmluY2VudCBCcm9ubmVyIHNwb3R0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgdXNlcm5hbWUvcGFzc3dvcmQgd2hlbiByZS11c2luZwogIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgoKLSBGaXhlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheSBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMl4zMSBieXRlcy4gR2lzbGUKICBWYW5lbSByZXBvcnRlZC4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgc3RydG9sbCgpIGdldCB1c2VkIHdoZW4gY3VybCBpcyBidWlsdCB3aXRoIHRoZSBtaW5ndwogIGNvbXBpbGVyLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY29tcHJlc3NlZCBoZWxwIHRleHQgY29kZSB0byBkaXNwbGF5IHByb3Blcmx5LgoKLSBSZW1vdmVkIHRoZSAnI2RlZmluZSBIdHRwUG9zdCcgZnJvbSB0aGUgcHVibGljIGhlYWRlciBmaWxlLCBhcyBjdXJsX2h0dHBwb3N0CiAgaXMgdGhlIHByb3BlciBuYW1lIGFuZCBpdCBoYXMgYmVlbiBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdy4gRml4ZXMgYW5vdGhlcgogIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKLSBBZGRlZCAnY3VybF9vZmZfdCcgdHlwZWRlZiBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlLCB0byBiZSB1c2VkIHRvIHByb3ZpZGUKICBsYXJnZSBmaWxlIHNpemVzIHRvIHRoZSAqX0xBUkdFIG9wdGlvbnMuIEFkanVzdGVkIHRoZSBjb2RlIGFsbCBvdmVyIHRvIHVzZQogIHRoaXMgdmFyaWFibGUgdHlwZSBpbnN0ZWFkIG9mICdvZmZfdCcuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBsYXJnZQogIGZpbGUgc3VwcG9ydCB3b3JrIG9uIG1vcmUgcGxhdGZvcm1zLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIHRoZQogIHNpemUgb2YgdGhlIGN1cmxfb2ZmX3QgaW5zdGVhZCBvZiB0aGUgcGxhaW4gb2ZmX3QuCgpWZXJzaW9uIDcuMTEuMCAoMjIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDQpCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlIHdpdGggVElNRUNPTkRfIHByZWZpeGVzLiBUaGV5CiAgaGF2ZSBiZWVuIG9ic29sZXRlIHNpbmNlIEFwcmlsIDIybmQgMjAwMiwgYW5kIGlmIHRoaXMgY2F1c2VzIGFueW9uZSBhbnkKICBwcm9ibGVtcyBub3cgaXQgaXMgdmVyeSBlYXN5IHRvIGp1c3QgYWRkIENVUkxfIHRvIHRoZSBuYW1lcy4gVGhpcyBjb3JyZWN0cwogIHRoaXMgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiBjbGVhbmVkIHVwIGhvdyAtLXRyYWNlIHdpdGggbm8gb3B0aW9uIHdhcyB0cmVhdGVkLCBhbmQgYWxzbwogIGFyZ3VtZW50cyBpbiBhIGNvbmZpZyBmaWxlIHdpdGhvdXQgYSByZXF1aXJlZCBwYXJhbWV0ZXIhCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGZldyBpc3N1ZXMgd2hlcmUgY29tcGlsZXJzIHdhcm5lZCBhYm91dCB2YXJpYWJsZXMKICBwb3NzaWJseSBiZWluZyB1c2VkIHVuYXNzaWduZWQuCgotIE1pbm9yIEludGVyaXggYnVpbGQgcHJvYmxlbSBmaXhlZC4KCkRhbmllbCAoMTUgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBzb21lIG5lY2Vzc2FyeSBlc2NhcGluZyBuZWVkZWQgaW4gdGhlCiAgYWNpbmNsdWRlLm00IGZpbGUgd2hlbiBhdXRvbWFrZSAxLjggb3IgbGF0ZXIgaXMgdXNlZC4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA0KQotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgQ3VybF9yZXNvbHYoKSByZXR1cm4gY29kZS4gVGhpcyBleHRlbmRzIHRoZSBmaXgKICBTdGV2ZSBHcmVlbiBwcm92aWRlZCBvbiBkZWNlbWJlciAzLi4uCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNCkKLSBMdWtlIENhbGwgbWFkZSB0aGUgd2luMzIgdmVyc2lvbiBvZiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nIGZ1bmN0aW9uIHN1cHBvcnQKICBiYWNrc3BhY2UuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgaHVnZWhlbHAgc291cmNlIGZpbGUgdG8gY29udGFpbiBib3RoIGEgY29tcHJlc3NlZCBhbmQKICBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IG1vcmUgcGVvcGxlIGVhc2llciBjYW4KICBidWlsZCBjdXJsIHdpdGggdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KCi0gRGllZ28gQ2Fzb3JyYW4gYnJvdWdodCBhbm90aGVyIEFtaWdhT1MgYnVpbGQgcGF0Y2ggZm9yIG5hdGl2ZSBBbWlnYSBidWlsZHMuCgotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgTWFjIE9TIFggZnJhbWV3b3JrIGZpbGVzLgoKLSBCcmlhbiBSIER1ZmZ5IGJyb3VnaHQgYSBzZWN0aW9uIHRvIHRoZSBJTlNUQUxMIGZpbGUgb24gaG93IHRvIGJ1aWxkIGEKICBTU0wtZW5hYmxlZCBjdXJsIHVzaW5nIHRoZSBmcmVlIEJvcmxhbmQgQysrIGNvbXBpbGVyLiBIZSBhbHNvIHVwZGF0ZWQgdGhlCiAgQm9ybGFuZCBsaWIvTWFrZWZpbGUuYjMyLgoKLSBJIGZpeGVkIHRoZSB0ZXN0IGNhc2UgNTA5IHdoaWNoIEkgYnJva2UgeWVzdGVyZGF5LiBOb3cgdGhlIGxpYnRlc3QgYXJlCiAgY29tcGlsZWQgd2l0aCBhbiBpbmNsdWRlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIGxpYnJhcnkncyBzb3VyY2UgZGlyLCBzbwogIHRoYXQgdGhlIGxpYnRlc3RzIGNhbiBpbmNsdWRlIGZpbGVzIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIHdhcyBtYWRlIHRvCiAgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFVTRV9TU0xFQVkgZGVmaW5lIGluIHRoZSBsaWJyYXJ5IHRlc3QgZmlsZXMuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgYnJvdWdodCBjb2RlIHRoYXQgbm93IGFsbG93cyBhIGNhbGxiYWNrIHRvIG1vZGlmaWVkIHRoZSBVUkwKICBldmVuIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgc2ltdWxhdGUgYQogICJmb2xsb3cgbG9jYXRpb24iIHRvIHRoYXQgbmV3IFVSTC4gVGVzdCA1MDkgd2FzIGFkZGVkIHRvIHRlc3QgdGhpcyBmZWF0dXJlLgoKLSBFeHRlbmRlZCB0aGUgdGltZSB3ZSByZXRyeSBzZXJ2ZXJzIGluIHRoZSB0ZXN0IHNjcmlwdCwgYW5kIEkgYWxzbyBtYWRlIGl0CiAgcmV0cnkgdGhlIGh0dHBzIGFuZCBmdHBzIHNlcnZlcnMgYmVmb3JlIHRoZXkgYXJlIGNvbnNpZGVyZWQgYmFkLiBJIGJlbGlldmUKICB0aGUgcHJldmlvdXMgYXBwcm9hY2ggY291bGQgdHVybiBwcm9ibGVtYXRpYyBvbiByZWFsbHkgc2xvdyBob3N0cy4KClZlcnNpb24gNy4xMS4wLXByZTEgKDEyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA0KQotIERvbWluaWNrIE1lZ2xpbyBwb2ludGVkIG91dCBGVFBTIHNob3VsZCB1c2UgZGVmYXVsdCBwb3J0IDk5MCBhY2NvcmRpbmcgdG8KICBJQU5BLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwNCkKLSBGaXhlZCB0aGUgU1BORUdPIGNvbmZpZ3VyZSBjaGVjayB0byBub3QgdXNlIC1SIG9yIG90aGVyIG5vbi1wb3J0YWJsZSBvcHRpb25zCiAgaW4gdGhlIExERkxBR1MuIFJlcG9ydGVkIGJ5IFBpZXJyZSBpbiBidWcgcmVwb3J0ICM4NzI5MzAuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA0KQotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIGZpeCBvbiBvdXIgemxpYiB1c2FnZS4KCi0gRGF2aWQgSiBNZXllcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlIGxhcmdlIGZpbGUgc3VwcG9ydCB0byBsaWJjdXJsIHdhcwogIGFwcGxpZWQuIE5ldyBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgdGhhdCBhY2NlcHQgJ29mZl90JyBhcmd1bWVudHMgYXJlOgoKICBJTkZJTEVTSVpFX0xBUkdFCiAgUkVTVU1FX0ZST01fTEFSR0UKICBNQVhGSUxFU0laRV9MQVJHRQoKRGFuaWVsICg0IEphbnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBEb21pbmljayBNZWdsaW8ncyBjb21tZW50cywgSSBtYWRlIG91ciBwcml2YXRlIHZlcnNpb24gb2YKICBnZXR0aW1lb2ZkYXkoKSBkZWNsYXJlZCBzdGF0aWMuIFRoaXMgd291bGQgb3RoZXJ3aXNlIGNvbGxpZGUgd2l0aCB0aGUgc2FtZQogIGZ1bmN0aW9uIGluIG90aGVyIGxpYnMgKGxpa2UgYXJlcyBmb3IgZXhhbXBsZSkuCgotIEFkZGVkIERvbWluaWNrIE1lZ2xpbydzIGRlc2NyaXB0aW9uIG9uIGhvdyB0byBidWlsZCBsaWJjdXJsIHdpdGggYXJlcwogIG9uIHdpbjMyLgo=