ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVByb3h5IGhvdy10bwogICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAxLjUtZGV2MjYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxseSB0YXJyZWF1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE0LzA1LzI4CgoKMSkgSG93IHRvIGJ1aWxkIGl0Ci0tLS0tLS0tLS0tLS0tLS0tLQoKVG8gYnVpbGQgaGFwcm94eSwgeW91IHdpbGwgbmVlZCA6CiAgLSBHTlUgbWFrZS4gTmVpdGhlciBTb2xhcmlzIG5vciBPcGVuQlNEJ3MgbWFrZSB3b3JrIHdpdGggdGhlIEdOVSBNYWtlZmlsZS4KICAgIElmIHlvdSBnZXQgbWFueSBzeW50YXggZXJyb3JzIHdoZW4gcnVubmluZyAibWFrZSIsIHlvdSBtYXkgd2FudCB0byByZXRyeQogICAgd2l0aCAiZ21ha2UiIHdoaWNoIGlzIHRoZSBuYW1lIGNvbW1vbmx5IHVzZWQgZm9yIEdOVSBtYWtlIG9uIEJTRCBzeXN0ZW1zLgogIC0gR0NDIGJldHdlZW4gMi45MSBhbmQgNC43LiBPdGhlcnMgbWF5IHdvcmssIGJ1dCBub3QgdGVzdGVkLgogIC0gR05VIGxkCgpBbHNvLCB5b3UgbWlnaHQgd2FudCB0byBidWlsZCB3aXRoIGxpYnBjcmUgc3VwcG9ydCwgd2hpY2ggd2lsbCBwcm92aWRlIGEgdmVyeQplZmZpY2llbnQgcmVnZXggaW1wbGVtZW50YXRpb24gYW5kIHdpbGwgYWxzbyBmaXggc29tZSBiYWRuZXNzIG9uIFNvbGFyaXMnIG9uZS4KClRvIGJ1aWxkIGhhcHJveHksIHlvdSBoYXZlIHRvIGNob29zZSB5b3VyIHRhcmdldCBPUyBhbW9uZ3N0IHRoZSBmb2xsb3dpbmcgb25lcwphbmQgYXNzaWduIGl0IHRvIHRoZSBUQVJHRVQgdmFyaWFibGUgOgoKICAtIGxpbnV4MjIgICAgIGZvciBMaW51eCAyLjIKICAtIGxpbnV4MjQgICAgIGZvciBMaW51eCAyLjQgYW5kIGFib3ZlIChkZWZhdWx0KQogIC0gbGludXgyNGUgICAgZm9yIExpbnV4IDIuNCB3aXRoIHN1cHBvcnQgZm9yIGEgd29ya2luZyBlcG9sbCAoPiAwLjIxKQogIC0gbGludXgyNiAgICAgZm9yIExpbnV4IDIuNiBhbmQgYWJvdmUKICAtIGxpbnV4MjYyOCAgIGZvciBMaW51eCAyLjYuMjggYW5kIGFib3ZlIChlbmFibGVzIHNwbGljZSBhbmQgdHByb3h5KQogIC0gc29sYXJpcyAgICAgZm9yIFNvbGFyaXMgOCBvciAxMCAob3RoZXJzIHVudGVzdGVkKQogIC0gZnJlZWJzZCAgICAgZm9yIEZyZWVCU0QgNSB0byA4LjAgKG90aGVycyB1bnRlc3RlZCkKICAtIG9zeCAgICAgICAgIGZvciBNYWMgT1MvWAogIC0gb3BlbmJzZCAgICAgZm9yIE9wZW5CU0QgMy4xIHRvIDUuMiAob3RoZXJzIHVudGVzdGVkKQogIC0gYWl4NTEgICAgICAgZm9yIEFJWCA1LjEKICAtIGFpeDUyICAgICAgIGZvciBBSVggNS4yCiAgLSBjeWd3aW4gICAgICBmb3IgQ3lnd2luCiAgLSBnZW5lcmljICAgICBmb3IgYW55IG90aGVyIE9TLgogIC0gY3VzdG9tICAgICAgdG8gbWFudWFsbHkgYWRqdXN0IGV2ZXJ5IHNldHRpbmcKCllvdSBtYXkgYWxzbyBjaG9vc2UgeW91ciBDUFUgdG8gYmVuZWZpdCBmcm9tIHNvbWUgb3B0aW1pemF0aW9ucy4gVGhpcyBpcwpwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIFVsdHJhU3BhcmMgbWFjaGluZXMuIEZvciB0aGlzLCB5b3UgY2FuIGFzc2lnbgpvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzIHRvIHRoZSBDUFUgdmFyaWFibGUgOgoKICAtIGk2ODYgZm9yIGludGVsIFBlbnRpdW1Qcm8sIFBlbnRpdW0gMiBhbmQgYWJvdmUsIEFNRCBBdGhsb24KICAtIGk1ODYgZm9yIGludGVsIFBlbnRpdW0sIEFNRCBLNiwgVklBIEMzLgogIC0gdWx0cmFzcGFyYyA6IFN1biBVbHRyYVNwYXJjIEkvSUkvSUlJL0lWIHByb2Nlc3NvcgogIC0gbmF0aXZlIDogdXNlIHRoZSBidWlsZCBtYWNoaW5lJ3Mgc3BlY2lmaWMgcHJvY2Vzc29yIG9wdGltaXphdGlvbnMKICAtIGdlbmVyaWMgOiBhbnkgb3RoZXIgcHJvY2Vzc29yIG9yIG5vIHNwZWNpZmljIG9wdGltaXphdGlvbi4gKGRlZmF1bHQpCgpBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGp1c3Qgc2V0IHRoZSBDUFVfQ0ZMQUdTIHZhbHVlIHRvIHRoZSBvcHRpbWFsIEdDQyBvcHRpb25zCmZvciB5b3VyIHBsYXRmb3JtLgoKWW91IG1heSB3YW50IHRvIGJ1aWxkIHNwZWNpZmljIHRhcmdldCBiaW5hcmllcyB3aGljaCBkbyBub3QgbWF0Y2ggeW91ciBuYXRpdmUKY29tcGlsZXIncyB0YXJnZXQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHRydWUgb24gNjQtYml0IHN5c3RlbXMgd2hlbiB5b3Ugd2FudAp0byBidWlsZCBhIDMyLWJpdCBiaW5hcnkuIFVzZSB0aGUgQVJDSCB2YXJpYWJsZSBmb3IgdGhpcyBwdXJwb3NlLiBSaWdodCBub3cKaXQgb25seSBrbm93cyBhYm91dCBhIGZldyB4ODYgdmFyaWFudHMgKGkzODYsaTQ4NixpNTg2LGk2ODYseDg2XzY0KSwgdHdvCmdlbmVyaWMgb25lcyAoMzIsNjQpIGFuZCBzZXRzIC1tMzIvLW02NCBhcyB3ZWxsIGFzIC1tYXJjaD08YXJjaD4gYWNjb3JkaW5nbHkuCgpJZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBQQ1JFIChQZXJsIENvbXBhdGlibGUgUmVndWxhciBFeHByZXNzaW9ucyksIHRoZW4geW91CnJlYWxseSBzaG91bGQgYnVpbGQgd2l0aCBsaWJwY3JlIHdoaWNoIGlzIGJldHdlZW4gMiBhbmQgMTAgdGltZXMgZmFzdGVyIHRoYW4Kb3RoZXIgbGliYyBpbXBsZW1lbnRhdGlvbnMuIFJlZ2V4IGFyZSB1c2VkIGZvciBoZWFkZXIgcHJvY2Vzc2luZyAoZGVsZXRpb24sCnJld3JpdGluZywgYWxsb3csIGRlbnkpLiBUaGUgb25seSBpbmNvbnZlbmllbnQgb2YgbGlicGNyZSBpcyB0aGF0IGl0IGlzIG5vdAp5ZXQgd2lkZWx5IHNwcmVhZCwgc28gaWYgeW91IGJ1aWxkIGZvciBvdGhlciBzeXN0ZW1zLCB5b3UgbWlnaHQgZ2V0IGludG8KdHJvdWJsZSBpZiB0aGV5IGRvbid0IGhhdmUgdGhlIGR5bmFtaWMgbGlicmFyeS4gSW4gdGhpcyBzaXR1YXRpb24sIHlvdSBzaG91bGQKc3RhdGljYWxseSBsaW5rIGxpYnBjcmUgaW50byBoYXByb3h5IHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgbmVjZXNzYXJ5IHRvCmluc3RhbGwgaXQgb24gdGFyZ2V0IHN5c3RlbXMuIEF2YWlsYWJsZSBidWlsZCBvcHRpb25zIGZvciBQQ1JFIGFyZSA6CgogIC0gVVNFX1BDUkU9MSB0byB1c2UgbGlicGNyZSwgaW4gd2hhdGV2ZXIgZm9ybSBpcyBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0KICAgIChzaGFyZWQgb3Igc3RhdGljKQoKICAtIFVTRV9TVEFUSUNfUENSRT0xIHRvIHVzZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGxpYnBjcmUgZXZlbiBpZiB0aGUgZHluYW1pYwogICAgb25lIGlzIGF2YWlsYWJsZS4gVGhpcyB3aWxsIGVuaGFuY2UgcG9ydGFiaWxpdHkuCgogIC0gd2l0aCBubyBvcHRpb24sIHVzZSB5b3VyIE9TIGxpYmMncyBzdGFuZGFyZCByZWdleCBpbXBsZW1lbnRhdGlvbiAoZGVmYXVsdCkuCiAgICBXYXJuaW5nISBncm91cCByZWZlcmVuY2VzIG9uIFNvbGFyaXMgc2VlbSBicm9rZW4uIFVzZSBzdGF0aWMtcGNyZSB3aGVuZXZlcgogICAgcG9zc2libGUuCgpSZWNlbnQgc3lzdGVtcyBjYW4gcmVzb2x2ZSBJUHY2IGhvc3QgbmFtZXMgdXNpbmcgZ2V0YWRkcmluZm8oKS4gVGhpcyBwcmltaXRpdmUKaXMgbm90IHByZXNlbnQgaW4gYWxsIGxpYmNzIGFuZCBkb2VzIG5vdCB3b3JrIGluIGFsbCBvZiB0aGVtIGVpdGhlci4gU3VwcG9ydCBpbgpnbGliYyB3YXMgYnJva2VuIGJlZm9yZSAyLjMuIFNvbWUgZW1iZWRkZWQgbGlicyBtYXkgbm90IHByb3Blcmx5IHdvcmsgZWl0aGVyLAp0aHVzLCBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhhdCBzb21lIGhvc3QgbmFtZXMgd2hpY2ggb25seQpyZXNvbHZlIGFzIElQdjYgYWRkcmVzc2VzIHdpbGwgbm90IHJlc29sdmUgYW5kIGNvbmZpZ3MgbWlnaHQgZW1pdCBhbiBlcnJvcgpkdXJpbmcgcGFyc2luZy4gSWYgeW91IGtub3cgdGhhdCB5b3VyIE9TIGxpYmMgaGFzIHJlbGlhYmxlIHN1cHBvcnQgZm9yCmdldGFkZHJpbmZvKCksIHlvdSBjYW4gYWRkIFVTRV9HRVRBRERSSU5GTz0xIG9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZSB0byBlbmFibGUKaXQuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG9wdGlvbiBmb3IgbW9zdCBMaW51eCBkaXN0cm8gcGFja2FnZXJzIHNpbmNlIGl0J3MKd29ya2luZyBmaW5lIG9uIGFsbCByZWNlbnQgbWFpbnN0cmVhbSBkaXN0cm9zLiBJdCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgb24KU29sYXJpcyA4IGFuZCBhYm92ZSwgYXMgaXQncyBrbm93biB0byB3b3JrLgoKSXQgaXMgcG9zc2libGUgdG8gYWRkIG5hdGl2ZSBzdXBwb3J0IGZvciBTU0wgdXNpbmcgdGhlIEdOVSBtYWtlZmlsZSwgYnkgcGFzc2luZwoiVVNFX09QRU5TU0w9MSIgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lLiBUaGUgbGlic3NsIGFuZCBsaWJjcnlwdG8gd2lsbAphdXRvbWF0aWNhbGx5IGJlIGxpbmtlZCB3aXRoIGhhcHJveHkuIFNvbWUgc3lzdGVtcyBhbHNvIHJlcXVpcmUgbGlieiwgc28gaWYgdGhlCmJ1aWxkIGZhaWxzIGR1ZSB0byBtaXNzaW5nIHN5bWJvbHMgc3VjaCBhcyBkZWZsYXRlSW5pdCgpLCB0aGVuIHRyeSBhZ2FpbiB3aXRoCiJBRERMSUI9LWx6Ii4KClRvIGxpbmsgT3BlblNTTCBzdGF0aWNhbGx5IGFnYWluc3QgaGFwcm94eSwgYnVpbGQgT3BlblNTTCB3aXRoIHRoZSBuby1zaGFyZWQKa2V5d29yZCBhbmQgaW5zdGFsbCBpdCB0byBhIGxvY2FsIGRpcmVjdG9yeSwgc28geW91ciBzeXN0ZW0gaXMgbm90IGFmZmVjdGVkIDoKCiAgICAkIGV4cG9ydCBTVEFUSUNMSUJTU0w9L3RtcC9zdGF0aWNsaWJzc2wKICAgICQgLi9jb25maWcgLS1wcmVmaXg9JFNUQVRJQ0xJQlNTTCBuby1zaGFyZWQKICAgICQgbWFrZSAmJiBtYWtlIGluc3RhbGxfc3cKCldoZW4gYnVpbGRpbmcgaGFwcm94eSwgcGFzcyB0aGF0IHBhdGggdmlhIFNTTF9JTkMgYW5kIFNTTF9MSUIgdG8gbWFrZSBhbmQKaW5jbHVkZSBhZGRpdGlvbmFsIGxpYnMgd2l0aCBBRERMSUIgaWYgbmVlZGVkIChpbiB0aGlzIGNhc2UgZm9yIGV4YW1wbGUgbGliZGwpOgoKICAgICQgbWFrZSBUQVJHRVQ9bGludXgyNiBVU0VfT1BFTlNTTD0xIFNTTF9JTkM9JFNUQVRJQ0xJQlNTTC9pbmNsdWRlIFNTTF9MSUI9JFNUQVRJQ0xJQlNTTC9saWIgQURETElCPS1sZGwKCkl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5jbHVkZSBuYXRpdmUgc3VwcG9ydCBmb3IgWkxJQiB0byBiZW5lZml0IGZyb20gSFRUUApjb21wcmVzc2lvbi4gRm9yIHRoaXMsIHBhc3MgIlVTRV9aTElCPTEiIG9uIHRoZSAibWFrZSIgY29tbWFuZCBsaW5lIGFuZCBlbnN1cmUKdGhhdCB6bGliIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbS4KCkJ5IGRlZmF1bHQsIHRoZSBERUJVRyB2YXJpYWJsZSBpcyBzZXQgdG8gJy1nJyB0byBlbmFibGUgZGVidWcgc3ltYm9scy4gSXQgaXMKbm90IHdpc2UgdG8gZGlzYWJsZSBpdCBvbiB1bmNvbW1vbiBzeXN0ZW1zLCBiZWNhdXNlIGl0J3Mgb2Z0ZW4gdGhlIG9ubHkgd2F5IHRvCmdldCBhIGNvbXBsZXRlIGNvcmUgd2hlbiB5b3UgbmVlZCBvbmUuIE90aGVyd2lzZSwgeW91IGNhbiBzZXQgREVCVUcgdG8gJy1zJyB0bwpzdHJpcCB0aGUgYmluYXJ5LgoKRm9yIGV4YW1wbGUsIEkgdXNlIHRoaXMgdG8gYnVpbGQgZm9yIFNvbGFyaXMgOCA6CgogICAgJCBtYWtlIFRBUkdFVD1zb2xhcmlzIENQVT11bHRyYXNwYXJjIFVTRV9TVEFUSUNfUENSRT0xCgpBbmQgSSBidWlsZCBpdCB0aGlzIHdheSBvbiBPcGVuQlNEIG9yIEZyZWVCU0QgOgoKICAgICQgZ21ha2UgVEFSR0VUPWZyZWVic2QgVVNFX1BDUkU9MSBVU0VfT1BFTlNTTD0xIFVTRV9aTElCPTEKCkFuZCBvbiBhIGNsYXNzaWMgTGludXggd2l0aCBTU0wgYW5kIFpMSUIgc3VwcG9ydCAoZWc6IFJlZCBIYXQgNS54KSA6CgogICAgJCBtYWtlIFRBUkdFVD1saW51eDI2IENQVT1uYXRpdmUgVVNFX1BDUkU9MSBVU0VfT1BFTlNTTD0xIFVTRV9aTElCPTEKCkFuZCBvbiBhIHJlY2VudCBMaW51eCA+PSAyLjYuMjggd2l0aCBTU0wgYW5kIFpMSUIgc3VwcG9ydCA6CgogICAgJCBtYWtlIFRBUkdFVD1saW51eDI2MjggQ1BVPW5hdGl2ZSBVU0VfUENSRT0xIFVTRV9PUEVOU1NMPTEgVVNFX1pMSUI9MQoKSW4gb3JkZXIgdG8gYnVpbGQgYSAzMi1iaXQgYmluYXJ5IG9uIGFuIHg4Nl82NCBMaW51eCBzeXN0ZW0gd2l0aCBTU0wgc3VwcG9ydAp3aXRob3V0IHN1cHBvcnQgZm9yIGNvbXByZXNzaW9uIGJ1dCB3aGVuIE9wZW5TU0wgcmVxdWlyZXMgWkxJQiBhbnl3YXkgOgoKICAgICQgbWFrZSBUQVJHRVQ9bGludXgyNiBBUkNIPWkzODYgVVNFX09QRU5TU0w9MSBBRERMSUI9LWx6CgpUaGUgU1NMIHN0YWNrIHN1cHBvcnRzIHNlc3Npb24gY2FjaGUgc3luY2hyb25pemF0aW9uIGJldHdlZW4gYWxsIHJ1bm5pbmcKcHJvY2Vzc2VzLiBUaGlzIGludm9sdmVzIHNvbWUgYXRvbWljIG9wZXJhdGlvbnMgYW5kIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zCndoaWNoIGNvbWUgaW4gbXVsdGlwbGUgZmxhdm9ycyBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlIDoKCiAgQXRvbWljIG9wZXJhdGlvbnMgOgogICAgLSBpbnRlcm5hbCBhc3NlbWJsZXIgdmVyc2lvbnMgZm9yIHg4Ni94ODZfNjQgYXJjaGl0ZWN0dXJlcwoKICAgIC0gZ2NjIGJ1aWx0aW5zIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzLiBTb21lIGFyY2hpdGVjdHVyZXMgbWlnaHQgbm90CiAgICAgIGJlIGZ1bGx5IHN1cHBvcnRlZCBvciBtaWdodCByZXF1aXJlIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBnY2MuCiAgICAgIElmIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQsIHlvdSB3aWxseSBoYXZlIHRvIGVpdGhlciB1c2UKICAgICAgcHRocmVhZCBpZiBzdXBwb3J0ZWQsIG9yIHRvIGRpc2FibGUgdGhlIHNoYXJlZCBjYWNoZS4KCiAgICAtIHB0aHJlYWQgKHBvc2l4IHRocmVhZHMpLiBQdGhyZWFkcyBhcmUgdmVyeSBjb21tb24gYnV0IGludGVyLXByb2Nlc3MKICAgICAgc3VwcG9ydCBpcyBub3QgdGhhdCBjb21tb24sIGFuZCBzb21lIG9sZGVyIG9wZXJhdGluZyBzeXN0ZW1zIGRpZCBub3QKICAgICAgcmVwb3J0IGFuIGVycm9yIHdoZW4gZW5hYmxpbmcgbXVsdGktcHJvY2VzcyBtb2RlLCBzbyB0aGV5IHVzZWQgdG8KICAgICAgc2lsZW50bHkgZmFpbCwgcG9zc2libHkgY2F1c2luZyBjcmFzaGVzLiBMaW51eCdzIGltcGxlbWVudGF0aW9uIGlzCiAgICAgIGZpbmUuIE9wZW5CU0QgZG9lc24ndCBzdXBwb3J0IHRoZW0gYW5kIGRvZXNuJ3QgYnVpbGQuIEZyZWVCU0QgOSBidWlsZHMKICAgICAgYW5kIHJlcG9ydHMgYW4gZXJyb3IgYXQgcnVudGltZSwgd2hpbGUgY2VydGFpbiBvbGRlciB2ZXJzaW9ucyBtaWdodAogICAgICBzaWxlbnRseSBmYWlsLiBQdGhyZWFkcyBhcmUgZW5hYmxlZCB1c2luZyBVU0VfUFRIUkVBRF9QU0hBUkVEPTEuCgogIFN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIDoKICAgIC0gaW50ZXJuYWwgc3BpbmxvY2sgOiB0aGlzIG1vZGUgaXMgT1MtaW5kZXBlbmRhbnQsIGxpZ2h0IGJ1dCB3aWxsIG5vdAogICAgICBzY2FsZSB3ZWxsIHRvIG1hbnkgcHJvY2Vzc2VzLiBIb3dldmVyLCBhY2Nlc3NlcyB0byB0aGUgc2Vzc2lvbiBjYWNoZQogICAgICBhcmUgcmFyZSBlbm91Z2ggdGhhdCB0aGlzIG1vZGUgY291bGQgY2VydGFpbmx5IGFsd2F5cyBiZSB1c2VkLiBUaGlzCiAgICAgIGlzIHRoZSBkZWZhdWx0IG1vZGUuCgogICAgLSBGdXRleGVzLCB3aGljaCBhcmUgTGludXgtc3BlY2lmaWMgaGlnaGx5IHNjYWxhYmxlIGxpZ2h0IHdlaWdodCBtdXRleGVzCiAgICAgIGltcGxlbWVudGVkIGluIHVzZXItc3BhY2Ugd2l0aCBzb21lIGxpbWl0ZWQgYXNzaXN0YW5jZSBmcm9tIHRoZSBrZXJuZWwuCiAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgb24gTGludXggMi42IGFuZCBhYm92ZSBhbmQgaXMgZW5hYmxlZCBieSBwYXNzaW5nCiAgICAgIFVTRV9GVVRFWD0xCgogICAgLSBwdGhyZWFkIChwb3NpeCB0aHJlYWRzKS4gU2VlIGFib3ZlLgoKSWYgbm9uZSBvZiB0aGVzZSBtZWNoYW5pc21zIGlzIHN1cHBvcnRlZCBieSB5b3VyIHBsYXRmb3JtLCB5b3UgbWF5IG5lZWQgdG8KYnVpbGQgd2l0aCBVU0VfUFJJVkFURV9DQUNIRT0xIHRvIHRvdGFsbHkgZGlzYWJsZSBTU0wgY2FjaGUgc2hhcmluZy4gVGhlbgppdCBpcyBiZXR0ZXIgbm90IHRvIHJ1biBTU0wgb24gbXVsdGlwbGUgcHJvY2Vzc2VzLgoKSWYgeW91IG5lZWQgdG8gcGFzcyBvdGhlciBkZWZpbmVzLCBpbmNsdWRlcywgbGlicmFyaWVzLCBldGMuLi4gdGhlbiBwbGVhc2UKY2hlY2sgdGhlIE1ha2VmaWxlIHRvIHNlZSB3aGljaCBvbmVzIHdpbGwgYmUgYXZhaWxhYmxlIGluIHlvdXIgY2FzZSwgYW5kCnVzZSB0aGUgVVNFXyogdmFyaWFibGVzIGluIHRoZSBNYWtlZmlsZS4KCkFJWCA1LjMgaXMga25vd24gdG8gd29yayB3aXRoIHRoZSBnZW5lcmljIHRhcmdldC4gSG93ZXZlciwgZm9yIHRoZSBiaW5hcnkgdG8KYWxzbyBydW4gb24gNS4yIG9yIGVhcmxpZXIsIHlvdSBuZWVkIHRvIGJ1aWxkIHdpdGggREVGSU5FPSItRF9NU0dRU1VQUE9SVCIsCm90aGVyd2lzZSBfX2ZkX3NlbGVjdCgpIHdpbGwgYmUgdXNlZCB3aGlsZSBub3QgYmVpbmcgcHJlc2VudCBpbiB0aGUgbGliYy4KSWYgeW91IGdldCBidWlsZCBlcnJvcnMgYmVjYXVzZSBvZiBzdHJhbmdlIHN5bWJvbHMgb3Igc2VjdGlvbiBtaXNtYXRjaGVzLApzaW1wbHkgcmVtb3ZlIC1nIGZyb20gREVCVUdfQ0ZMQUdTLgoKWW91IGNhbiBlYXNpbHkgZGVmaW5lIHlvdXIgb3duIHRhcmdldCB3aXRoIHRoZSBHTlUgTWFrZWZpbGUuIFVua25vd24gdGFyZ2V0cwphcmUgcHJvY2Vzc2VkIHdpdGggbm8gZGVmYXVsdCBvcHRpb24gZXhjZXB0IFVTRV9QT0xMPWRlZmF1bHQuIFNvIHlvdSBjYW4gdmVyeQp3ZWxsIHVzZSB0aGF0IHByb3BlcnR5IHRvIGRlZmluZSB5b3VyIG93biBzZXQgb2Ygb3B0aW9ucy4gVVNFX1BPTEwgY2FuIGV2ZW4gYmUKZGlzYWJsZWQgYnkgc2V0dGluZyBVU0VfUE9MTD0iIi4gRm9yIGV4YW1wbGUgOgoKICAgICQgZ21ha2UgVEFSR0VUPXRpbnkgVVNFX1BPTEw9IiIgVEFSR0VUX0NGTEFHUz0tZm9taXQtZnJhbWUtcG9pbnRlcgoKCjIpIEhvdyB0byBpbnN0YWxsIGl0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUbyBpbnN0YWxsIGhhcHJveHksIHlvdSBjYW4gZWl0aGVyIGNvcHkgdGhlIHNpbmdsZSByZXN1bHRpbmcgYmluYXJ5IHRvIHRoZQpwbGFjZSB5b3Ugd2FudCwgb3IgcnVuIDoKCiAgICAkIHN1ZG8gbWFrZSBpbnN0YWxsCgpJZiB5b3UncmUgcGFja2FnaW5nIGl0IGZvciBhbm90aGVyIHN5c3RlbSwgeW91IGNhbiBzcGVjaWZ5IGl0cyByb290IGRpcmVjdG9yeQppbiB0aGUgdXN1YWwgREVTVERJUiB2YXJpYWJsZS4KCgozKSBIb3cgdG8gc2V0IGl0IHVwCi0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXJlIGlzIHNvbWUgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jLyBkaXJlY3RvcnkgOgoKICAgIC0gYXJjaGl0ZWN0dXJlLnR4dCA6IHRoaXMgaXMgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwuIEl0IGlzIHF1aXRlIG9sZCBhbmQKICAgICAgZG9lcyBub3QgdGVsbCBhYm91dCB0aGUgbmljZSBuZXcgZmVhdHVyZXMsIGJ1dCBpdCdzIHN0aWxsIGEgZ29vZCBzdGFydGluZwogICAgICBwb2ludCB3aGVuIHlvdSBrbm93IHdoYXQgeW91IHdhbnQgYnV0IGRvbid0IGtub3cgaG93IHRvIGRvIGl0LgoKICAgIC0gY29uZmlndXJhdGlvbi50eHQgOiB0aGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIG1hbnVhbC4gSXQgcmVjYWxscyBhIGZldwogICAgICBlc3NlbnRpYWwgSFRUUCBiYXNpYyBjb25jZXB0cywgYW5kIGRldGFpbHMgYWxsIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKICAgICAgc3ludGF4IChrZXl3b3JkcywgdW5pdHMpLiBJdCBhbHNvIGRlc2NyaWJlcyB0aGUgbG9nIGFuZCBzdGF0cyBmb3JtYXQuIEl0CiAgICAgIGlzIG5vcm1hbGx5IGFsd2F5cyB1cCB0byBkYXRlLiBJZiB5b3Ugc2VlIHRoYXQgc29tZXRoaW5nIGlzIG1pc3NpbmcgZnJvbQogICAgICBpdCwgcGxlYXNlIHJlcG9ydCBpdCBhcyB0aGlzIGlzIGEgYnVnLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBpcwogICAgICBodWdlIGFuZCB0aGF0IGl0J3MgZ2VuZXJhbGx5IG1vcmUgY29udmVuaWVudCB0byByZXZpZXcgQ3lyaWwgQm9udOkncwogICAgICBIVE1MIHRyYW5zbGF0aW9uIG9ubGluZSBoZXJlIDoKCiAgICAgICAgICAgaHR0cDovL2Nib250ZS5naXRodWIuaW8vaGFwcm94eS1kY29udi9jb25maWd1cmF0aW9uLTEuNS5odG1sCgogICAgLSBoYXByb3h5LWVuLnR4dCAvIGhhcHJveHktZnIudHh0IDogdGhlc2UgYXJlIHRoZSBvbGQgb3V0ZGF0ZWQgZG9jcy4gWW91CiAgICAgIHNob3VsZCBuZXZlciBuZWVkIHRoZW0uIElmIHlvdSBkbywgdGhlbiBwbGVhc2UgcmVwb3J0IHdoYXQgeW91IGRpZG4ndAogICAgICBmaW5kIGluIHRoZSBvdGhlciBvbmVzLgoKICAgIC0gZ3BsLnR4dCAvIGxncGwudHh0IDogdGhlIGNvcHkgb2YgdGhlIGxpY2Vuc2VzIGNvdmVyaW5nIHRoZSBzb2Z0d2FyZS4gU2VlCiAgICAgIHRoZSAnTElDRU5TRScgZmlsZSBhdCB0aGUgdG9wIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgIC0gdGhlIHJlc3QgaXMgbWFpbmx5IGZvciBkZXZlbG9wZXJzLgoKVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgbmljZSBjb25maWd1cmF0aW9uIGV4YW1wbGVzIGluIHRoZSAiZXhhbXBsZXMiCmRpcmVjdG9yeSBhcyB3ZWxsIGFzIG9uIHNldmVyYWwgc2l0ZXMgYW5kIGFydGljbGVzIG9uIHRoZSBuZXQgd2hpY2ggYXJlIGxpbmtlZAp0byBmcm9tIHRoZSBoYXByb3h5IHdlYiBzaXRlLgoKCjQpIEhvdyB0byByZXBvcnQgYSBidWcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSXQgaXMgcG9zc2libGUgdGhhdCBmcm9tIHRpbWUgdG8gdGltZSB5b3UnbGwgZmluZCBhIGJ1Zy4gQSBidWcgaXMgYSBjYXNlIHdoZXJlCndoYXQgeW91IHNlZSBpcyBub3Qgd2hhdCBpcyBkb2N1bWVudGVkLiBPdGhlcndpc2UgaXQgY2FuIGJlIGEgbWlzZGVzaWduLiBJZiB5b3UKZmluZCB0aGF0IHNvbWV0aGluZyBpcyBzdHVwaWRseSBkZXNpZ24sIHBsZWFzZSBkaXNjdXNzIGl0IG9uIHRoZSBsaXN0IChzZWUgdGhlCiJob3cgdG8gY29udHJpYnV0ZSIgc2VjdGlvbiBiZWxvdykuIElmIHlvdSBmZWVsIGxpa2UgeW91J3JlIHByb2NlZWRpbmcgcmlnaHQKYW5kIGhhcHJveHkgZG9lc24ndCBvYmV5LCB0aGVuIGZpcnN0IGFzayB5b3Vyc2VsZiBpZiBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vYm9keQpiZWZvcmUgeW91IGhhcyBldmVuIGVuY291bnRlcmVkIHRoaXMgaXNzdWUuIElmIGl0J3MgdW5saWtlbHksIHRoZSB5b3UgcHJvYmFibHkKaGF2ZSBhbiBpc3N1ZSBpbiB5b3VyIHNldHVwLiBKdXN0IGluIGNhc2Ugb2YgZG91YnQsIHBsZWFzZSBjb25zdWx0IHRoZSBtYWlsaW5nCmxpc3QgYXJjaGl2ZXMgOgoKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL21hcmMuaW5mby8/bD1oYXByb3h5CgpPdGhlcndpc2UsIHBsZWFzZSB0cnkgdG8gZ2F0aGVyIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBpbmZvcm1hdGlvbiB0byBoZWxwCnJlcHJvZHVjZSB0aGUgaXNzdWUgYW5kIHNlbmQgdGhhdCB0byB0aGUgbWFpbGluZyBsaXN0IDoKCiAgICAgICAgICAgICAgICAgICAgICAgIGhhcHJveHlAZm9ybWlsdXgub3JnCgpQbGVhc2UgaW5jbHVkZSB5b3VyIGNvbmZpZ3VyYXRpb24gYW5kIGxvZ3MuIFlvdSBjYW4gbWFzayB5b3VyIElQIGFkZHJlc3NlcyBhbmQKcGFzc3dvcmRzLCB3ZSBkb24ndCBuZWVkIHRoZW0uIEJ1dCBpdCdzIGVzc2VudGlhbCB0aGF0IHlvdSBwb3N0IHlvdXIgY29uZmlnIGlmCnlvdSB3YW50IHBlb3BsZSB0byBndWVzcyB3aGF0IGlzIGhhcHBlbmluZy4KCkFsc28sIGtlZXAgaW4gbWluZCB0aGF0IGhhcHJveHkgaXMgZGVzaWduZWQgdG8gTkVWRVIgQ1JBU0guIElmIHlvdSBzZWUgaXQgZGllCndpdGhvdXQgYW55IHJlYXNvbiwgdGhlbiBpdCBkZWZpbml0ZWx5IGlzIGEgY3JpdGljYWwgYnVnIHRoYXQgbXVzdCBiZSByZXBvcnRlZAphbmQgdXJnZW50bHkgZml4ZWQuIEl0IGhhcyBoYXBwZW5lZCBhIGNvdXBsZSBvZiB0aW1lcyBpbiB0aGUgcGFzdCwgZXNzZW50aWFsbHkKb24gZGV2ZWxvcG1lbnQgdmVyc2lvbnMgcnVubmluZyBvbiBuZXcgYXJjaGl0ZWN0dXJlcy4gSWYgeW91IHRoaW5rIHlvdXIgc2V0dXAKaXMgZmFpcmx5IGNvbW1vbiwgdGhlbiBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBpc3N1ZSBpcyB0b3RhbGx5IHVucmVsYXRlZC4KQW55d2F5LCBpZiB0aGF0IGhhcHBlbnMsIGZlZWwgZnJlZSB0byBjb250YWN0IG1lIGRpcmVjdGx5LCBhcyBJIHdpbGwgZ2l2ZSB5b3UKaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBjb2xsZWN0IGEgdXNhYmxlIGNvcmUgZmlsZSwgYW5kIHdpbGwgcHJvYmFibHkgYXNrIGZvcgpvdGhlciBjYXB0dXJlcyB0aGF0IHlvdSdsbCBub3Qgd2FudCB0byBzaGFyZSB3aXRoIHRoZSBsaXN0LgoKCjUpIEhvdyB0byBjb250cmlidXRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJdCBpcyBwb3NzaWJsZSB0aGF0IHlvdSdsbCB3YW50IHRvIGFkZCBhIHNwZWNpZmljIGZlYXR1cmUgdG8gc2F0aXNmeSB5b3VyIG5lZWRzCm9yIG9uZSBvZiB5b3VyIGN1c3RvbWVycycuIENvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUsIGhvd2V2ZXIgSSdtIG9mdGVuIHZlcnkKcGlja3kgYWJvdXQgY2hhbmdlcy4gSSB3aWxsIGdlbmVyYWxseSByZWplY3QgcGF0Y2hlcyB0aGF0IGNoYW5nZSBtYXNzaXZlIHBhcnRzCm9mIHRoZSBjb2RlLCBvciB0aGF0IHRvdWNoIHRoZSBjb3JlIHBhcnRzIHdpdGhvdXQgYW55IGdvb2QgcmVhc29uIGlmIHRob3NlCmNoYW5nZXMgaGF2ZSBub3QgYmVlbiBkaXNjdXNzZWQgZmlyc3QuCgpUaGUgcHJvcGVyIHBsYWNlIHRvIGRpc2N1c3MgeW91ciBjaGFuZ2VzIGlzIHRoZSBIQVByb3h5IE1haWxpbmcgTGlzdC4gVGhlcmUgYXJlCmVub3VnaCBza2lsbGVkIHJlYWRlcnMgdG8gY2F0Y2ggaGF6YXJkb3VzIG1pc3Rha2VzIGFuZCB0byBzdWdnZXN0IGltcHJvdmVtZW50cy4KSSB0cnVzdCBhIG51bWJlciBvZiB0aGVtIGVub3VnaCB0byBtZXJnZSBhIHBhdGNoIGlmIHRoZXkgc2F5IGl0J3MgT0ssIHNvIHVzaW5nCnRoZSBsaXN0IGlzIHRoZSBmYXN0ZXN0IHdheSB0byBnZXQgeW91ciBjb2RlIHJldmlld2VkIGFuZCBtZXJnZWQuIFlvdSBjYW4Kc3Vic2NyaWJlIHRvIGl0IGJ5IHNlbmRpbmcgYW4gZW1wdHkgZS1tYWlsIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzcyA6CgogICAgICAgICAgICAgICAgICAgICAgICBoYXByb3h5K3N1YnNjcmliZUBmb3JtaWx1eC5vcmcKCklmIHlvdSBoYXZlIGFuIGlkZWEgYWJvdXQgc29tZXRoaW5nIHRvIGltcGxlbWVudCwgKnBsZWFzZSogZGlzY3VzcyBpdCBvbiB0aGUKbGlzdCBmaXJzdC4gSXQgaGFzIGFscmVhZHkgaGFwcGVuZWQgc2V2ZXJhbCB0aW1lcyB0aGF0IHR3byBwZXJzb25zIGRpZCB0aGUgc2FtZQp0aGluZyBzaW11bHRhbmVvdXNseS4gVGhpcyBpcyBhIHdhc3RlIG9mIHRpbWUgZm9yIGJvdGggb2YgdGhlbS4gSXQncyBhbHNvIHZlcnkKY29tbW9uIHRvIHNlZSBzb21lIGNoYW5nZXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGV5J3JlIGRvbmUgaW4gYSB3YXkgdGhhdCB3aWxsCmNvbmZsaWN0IHdpdGggZnV0dXJlIGV2b2x1dGlvbnMsIG9yIHRoYXQgZG9lcyBub3QgbGVhdmUgYSBnb29kIGZlZWxpbmcuIEl0J3MKYWx3YXlzIHVucGxlYXNhbnQgZm9yIHRoZSBwZXJzb24gd2hvIGRpZCB0aGUgd29yaywgYW5kIGl0IGlzIHVucGxlYXNhbnQgZm9yIG1lCnRvbyBiZWNhdXNlIEkgdmFsdWUgcGVvcGxlJ3MgdGltZSBhbmQgZWZmb3J0cy4gVGhhdCB3b3VsZCBub3QgaGFwcGVuIGlmIHRoZXNlCndlcmUgZGlzY3Vzc2VkIGZpcnN0LiBUaGVyZSBpcyBubyBwcm9ibGVtIHBvc3Rpbmcgd29yayBpbiBwcm9ncmVzcyB0byB0aGUgbGlzdCwKaXQgaGFwcGVucyBxdWl0ZSBvZnRlbiBpbiBmYWN0LiBBbHNvLCBkb24ndCB3YXN0ZSB5b3VyIHRpbWUgd2l0aCB0aGUgZG9jIHdoZW4Kc3VibWl0dGluZyBwYXRjaGVzIGZvciByZXZpZXcsIG9ubHkgYWRkIHRoZSBkb2Mgd2l0aCB0aGUgcGF0Y2ggeW91IGNvbnNpZGVyCnJlYWR5IHRvIG1lcmdlLgoKQW5vdGhlciBpbXBvcnRhbnQgcG9pbnQgY29uY2VybnMgY29kZSBwb3J0YWJpbGl0eS4gSGFwcm94eSByZXF1aXJlcyBnY2MgYXMgdGhlCkMgY29tcGlsZXIsIGFuZCBtYXkgb3IgbWF5IG5vdCB3b3JrIHdpdGggb3RoZXIgY29tcGlsZXJzLiBIb3dldmVyIGl0J3Mga25vd24KdG8gYnVpbGQgdXNpbmcgZ2NjIDIuOTUgb3IgYW55IGxhdGVyIHZlcnNpb24uIEFzIHN1Y2gsIGl0IGlzIGltcG9ydGFudCB0byBrZWVwCmluIG1pbmQgdGhhdCBjZXJ0YWluIGZhY2lsaXRpZXMgb2ZmZXJlZCBieSByZWNlbnQgdmVyc2lvbnMgbXVzdCBub3QgYmUgdXNlZCBpbgp0aGUgY29kZSA6CgogIC0gZGVjbGFyYXRpb25zIG1peGVkIGluIHRoZSBjb2RlIChyZXF1aXJlcyBnY2MgPj0gMy54KQogIC0gR0NDIGJ1aWx0aW5zIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZWlyIGF2YWlsYWJpbGl0eSBiYXNlZCBvbiB2ZXJzaW9uIGFuZAogICAgYXJjaGl0ZWN0dXJlIDsKICAtIGFzc2VtYmx5IGNvZGUgd2l0aG91dCBhbnkgYWx0ZXJuYXRlIHBvcnRhYmxlIGZvcm0gZm9yIG90aGVyIHBsYXRmb3JtcwogIC0gdXNlIG9mIHN0ZGJvb2wuaCwgImJvb2wiLCAiZmFsc2UiLCAidHJ1ZSIgOiBzaW1wbHkgdXNlICJpbnQiLCAiMCIsICIxIgogIC0gaW4gZ2VuZXJhbCwgYW55dGhpbmcgd2hpY2ggcmVxdWlyZXMgQzk5IChzdWNoIGFzIGRlY2xhcmluZyB2YXJpYWJsZXMgaW4KICAgICJmb3IiIHN0YXRlbWVudHMpCgpTaW5jZSBtb3N0IG9mIHRoZXNlIHJlc3RyaWN0aW9ucyBhcmUganVzdCBhIG1hdHRlciBvZiBjb2Rpbmcgc3R5bGUsIGl0IGlzCm5vcm1hbGx5IG5vdCBhIHByb2JsZW0gdG8gY29tcGx5LgoKSWYgeW91ciB3b3JrIGlzIHZlcnkgY29uZmlkZW50aWFsIGFuZCB5b3UgY2FuJ3QgcHVibGljbHkgZGlzY3VzcyBpdCwgeW91IGNhbgphbHNvIG1haWwgbWUgZGlyZWN0bHkgYWJvdXQgaXQsIGJ1dCB5b3VyIG1haWwgbWF5IGJlIHdhaXRpbmcgc2V2ZXJhbCBkYXlzIGluCnRoZSBxdWV1ZSBiZWZvcmUgeW91IGdldCBhIHJlc3BvbnNlLgoKSWYgeW91J2QgbGlrZSBhIGZlYXR1cmUgdG8gYmUgYWRkZWQgYnV0IHlvdSB0aGluayB5b3UgZG9uJ3QgaGF2ZSB0aGUgc2tpbGxzIHRvCmltcGxlbWVudCBpdCB5b3Vyc2VsZiwgeW91IHNob3VsZCBmb2xsb3cgdGhlc2Ugc3RlcHMgOgoKICAgIDEuIGRpc2N1c3MgdGhlIGZlYXR1cmUgb24gdGhlIG1haWxpbmcgbGlzdC4gSXQgaXMgcG9zc2libGUgdGhhdCBzb21lb25lCiAgICAgICBlbHNlIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkIGl0LCBvciB0aGF0IHNvbWVvbmUgd2lsbCB0ZWxsIHlvdSBob3cgdG8KICAgICAgIHByb2NlZWQgd2l0aG91dCBpdCwgb3IgZXZlbiB3aHkgbm90IHRvIGRvIGl0LiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQKICAgICAgIGluIGZhY3QgaXQncyBxdWl0ZSBlYXN5IHRvIGltcGxlbWVudCBhbmQgcGVvcGxlIHdpbGwgZ3VpZGUgeW91IHRocm91Z2gKICAgICAgIHRoZSBwcm9jZXNzLiBUaGF0IHdheSB5b3UnbGwgZmluYWxseSBoYXZlIFlPVVIgcGF0Y2ggbWVyZ2VkLCBwcm92aWRpbmcKICAgICAgIHRoZSBmZWF0dXJlIFlPVSBuZWVkLgoKICAgIDIuIGlmIHlvdSByZWFsbHkgY2FuJ3QgY29kZSBpdCB5b3Vyc2VsZiBhZnRlciBkaXNjdXNzaW5nIGl0LCB0aGVuIHlvdSBtYXkKICAgICAgIGNvbnNpZGVyIGNvbnRhY3Rpbmcgc29tZW9uZSB0byBkbyB0aGUgam9iIGZvciB5b3UuIFNvbWUgcGVvcGxlIG9uIHRoZQogICAgICAgbGlzdCBtaWdodCBiZSBPSyB3aXRoIHRyeWluZyB0byBkbyBpdC4gT3RoZXJ3aXNlLCB5b3UgY2FuIGNoZWNrIHRoZSBsaXN0CiAgICAgICBvZiBjb250cmlidXRvcnMgYXQgdGhlIFVSTCBiZWxvdywgc29tZSBvZiB0aGUgcmVndWxhciBjb250cmlidXRvcnMgbWF5CiAgICAgICBiZSBhYmxlIHRvIGRvIHRoZSB3b3JrLCBwcm9iYWJseSBub3QgZm9yIGZyZWUgYnV0IHRoZWlyIHRpbWUgaXMgYXMgbXVjaAogICAgICAgdmFsdWFibGUgYXMgeW91cnMgYWZ0ZXIgYWxsLCB5b3UgY2FuJ3QgZWF0IHRoZSBjYWtlIGFuZCBoYXZlIGl0IHRvby4KClRoZSBsaXN0IG9mIHBhc3QgYW5kIHJlZ3VsYXIgY29udHJpYnV0b3JzIGlzIGF2YWlsYWJsZSBiZWxvdy4gSXQgbGlzdHMgbm90IG9ubHkKc2lnbmlmaWNhbnQgY29kZSBjb250cmlidXRpb25zIChmZWF0dXJlcywgZml4ZXMpLCBidXQgYWxzbyB0aW1lIG9yIG1vbmV5CmRvbmF0aW9ucyA6CgogICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmhhcHJveHkub3JnL2NvbnRyaWIuaHRtbAoKTm90ZSB0byBjb250cmlidXRvcnM6IGl0J3MgdmVyeSBoYW5keSB3aGVuIHBhdGNoZXMgY29tZXMgd2l0aCBhIHByb3Blcmx5CmZvcm1hdGVkIHN1YmplY3QuIFRoZXJlIGFyZSAzIGNyaXRlcmlhIG9mIHBhcnRpY3VsYXIgaW1wb3J0YW5jZSBpbiBhbnkgcGF0Y2ggOgoKICAtIGl0cyBuYXR1cmUgKGlzIGl0IGEgZml4IGZvciBhIGJ1ZywgYSBuZXcgZmVhdHVyZSwgYW4gb3B0aW1pemF0aW9uLCAuLi4pCiAgLSBpdHMgaW1wb3J0YW5jZSwgd2hpY2ggZ2VuZXJhbGx5IHJlZmxlY3RzIHRoZSByaXNrIG9mIG1lcmdpbmcvbm90IG1lcmdpbmcgaXQKICAtIHdoYXQgYXJlYSBpdCBhcHBsaWVzIHRvIChlZzogaHR0cCwgc3RhdHMsIHN0YXJ0dXAsIGNvbmZpZywgZG9jLCAuLi4pCgpJdCdzIGltcG9ydGFudCB0byBtYWtlIHRoZXNlIDMgY3JpdGVyaWEgZWFzeSB0byBzcG90IGluIHRoZSBwYXRjaCdzIHN1YmplY3QsCmJlY2F1c2UgaXQncyB0aGUgZmlyc3QgKGFuZCBzb21ldGltZXMgdGhlIG9ubHkpIHRoaW5nIHdoaWNoIGlzIHJlYWQgd2hlbgpyZXZpZXdpbmcgcGF0Y2hlcyB0byBmaW5kIHdoaWNoIG9uZXMgbmVlZCB0byBiZSBiYWNrcG9ydGVkIHRvIG9sZGVyIHZlcnNpb25zLgoKU3BlY2lmaWNhbGx5LCBidWdzIG11c3QgYmUgY2xlYXJseSBlYXN5IHRvIHNwb3Qgc28gdGhhdCB0aGV5J3JlIG5ldmVyIG1pc3NlZC4KQW55IHBhdGNoIGZpeGluZyBhIGJ1ZyBtdXN0IGhhdmUgdGhlICJCVUciIHRhZyBpbiBpdHMgc3ViamVjdC4gTW9zdCBjb21tb24KcGF0Y2ggdHlwZXMgaW5jbHVkZSA6CgogIC0gQlVHICAgICAgZml4IGZvciBhIGJ1Zy4gVGhlIHNldmVyaXR5IG9mIHRoZSBidWcgc2hvdWxkIGFsc28gYmUgaW5kaWNhdGVkCiAgICAgICAgICAgICB3aGVuIGtub3duLiBTaW1pbGFybHksIGlmIGEgYmFja3BvcnQgaXMgbmVlZGVkIHRvIG9sZGVyIHZlcnNpb25zLAogICAgICAgICAgICAgaXQgc2hvdWxkIGJlIGluZGljYXRlZCBvbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZS4gSWYKICAgICAgICAgICAgIHRoZSBidWcgaGFzIGJlZW4gaWRlbnRpZmllZCBhcyBhIHJlZ3Jlc3Npb24gYnJvdWdodCBieSBhIHNwZWNpZmljCiAgICAgICAgICAgICBwYXRjaCBvciB2ZXJzaW9uLCB0aGlzIGluZGljYXRpb24gd2lsbCBiZSBhcHByZWNpYXRlZCB0b28uIE5ldwogICAgICAgICAgICAgbWFpbnRlbmFuY2UgcmVsZWFzZXMgYXJlIGdlbmVyYWxseSBlbWl0dGVkIHdoZW4gYSBmZXcgb2YgdGhlc2UKICAgICAgICAgICAgIHBhdGNoZXMgYXJlIG1lcmdlZC4KCiAgLSBDTEVBTlVQICBjb2RlIGNsZWFudXAsIHNpbGVuY2Ugb2Ygd2FybmluZ3MsIGV0Yy4uLiB0aGVvcmljYWxseSBubyBpbXBhY3QuCiAgICAgICAgICAgICBUaGVzZSBwYXRjaGVzIHdpbGwgcmFyZWx5IGJlIHNlZW4gaW4gc3RhYmxlIGJyYW5jaGVzLCB0aG91Z2ggdGhleQogICAgICAgICAgICAgbWF5IGFwcGVhciB3aGVuIHRoZXkgcmVtb3ZlIHNvbWUgYW5ub3lhbmNlIG9yIHdoZW4gdGhleSBtYWtlCiAgICAgICAgICAgICBiYWNrcG9ydGluZyBlYXNpZXIuIEJ5IG5hdHVyZSwgYSBjbGVhbnVwIGlzIGFsd2F5cyBtaW5vci4KCiAgLSBSRU9SRyAgICBjb2RlIHJlb3JnYW5pemF0aW9uLiBTb21lIGJsb2NrcyBtYXkgYmUgbW92ZWQgdG8gb3RoZXIgcGxhY2VzLAogICAgICAgICAgICAgc29tZSBpbXBvcnRhbnQgY2hlY2tzIG1pZ2h0IGJlIHN3YXBwZWQsIGV0Yy4uLiBUaGVzZSBjaGFuZ2VzCiAgICAgICAgICAgICBhbHdheXMgcHJlc2VudCBhIHJpc2sgb2YgcmVncmVzc2lvbi4gRm9yIHRoaXMgcmVhc29uLCB0aGV5IHNob3VsZAogICAgICAgICAgICAgbmV2ZXIgYmUgbWl4ZWQgd2l0aCBhbnkgYnVnIGZpeCBub3IgZnVuY3Rpb25hbCBjaGFuZ2UuIENvZGUgaXMKICAgICAgICAgICAgIG9ubHkgbW92ZWQgYXMtaXMuIEluZGljYXRpbmcgdGhlIHJpc2sgb2YgYnJlYWthZ2UgaXMgaGlnaGx5CiAgICAgICAgICAgICByZWNvbW1lbmRlZC4KCiAgLSBCVUlMRCAgICB1cGRhdGVzIG9yIGZpeGVzIGZvciBidWlsZCBpc3N1ZXMuIENoYW5nZXMgdG8gbWFrZWZpbGVzIGFsc28gZmFsbAogICAgICAgICAgICAgaW50byB0aGlzIGNhdGVnb3J5LiBUaGUgcmlzayBvZiBicmVha2FnZSBzaG91bGQgYmUgaW5kaWNhdGVkIGlmCiAgICAgICAgICAgICBrbm93bi4gSXQgaXMgYWxzbyBhcHByZWNpYXRlZCB0byBpbmRpY2F0ZSB3aGF0IHBsYXRmb3JtcyBhbmQvb3IKICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIHdlcmUgdGVzdGVkIGFmdGVyIHRoZSBjaGFuZ2UuCgogIC0gT1BUSU0gICAgc29tZSBjb2RlIHdhcyBvcHRpbWlzZWQuIFNvbWV0aW1lcyBpZiB0aGUgcmVncmVzc2lvbiByaXNrIGlzIHZlcnkKICAgICAgICAgICAgIGxvdyBhbmQgdGhlIGdhaW5zIHNpZ25pZmljYW50LCBzdWNoIHBhdGNoZXMgbWF5IGJlIG1lcmdlZCBpbiB0aGUKICAgICAgICAgICAgIHN0YWJsZSBicmFuY2guIERlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIGNvZGUgY2hhbmdlZCBvciByZXBsYWNlZAogICAgICAgICAgICAgYW5kIHRoZSBsZXZlbCBvZiB0cnVzdCB0aGUgYXV0aG9yIGhhcyBpbiB0aGUgY2hhbmdlLCB0aGUgcmlzayBvZgogICAgICAgICAgICAgcmVncmVzc2lvbiBzaG91bGQgYmUgaW5kaWNhdGVkLgoKICAtIFJFTEVBU0UgIHJlbGVhc2Ugb2YgYSBuZXcgdmVyc2lvbiAoZGV2ZWxvcG1lbnQgb3Igc3RhYmxlKS4KCiAgLSBMSUNFTlNFICBsaWNlbnNpbmcgdXBkYXRlcyAobWF5IGltcGFjdCBkaXN0cm8gcGFja2FnZXJzKS4KCgpXaGVuIHRoZSBwYXRjaCBjYW5ub3QgYmUgY2F0ZWdvcml6ZWQsIGl0J3MgYmVzdCBub3QgdG8gcHV0IGFueSB0YWcuIFRoaXMgaXMKY29tbW9ubHkgdGhlIGNhc2UgZm9yIG5ldyBmZWF0dXJlcywgd2hpY2ggZGV2ZWxvcG1lbnQgdmVyc2lvbnMgYXJlIG1vc3RseSBtYWRlCm9mLgoKQWRkaXRpb25hbGx5LCB0aGUgaW1wb3J0YW5jZSBvZiB0aGUgcGF0Y2ggc2hvdWxkIGJlIGluZGljYXRlZCB3aGVuIGtub3duLiBBCnNpbmdsZSB1cHBlci1jYXNlIHdvcmQgaXMgcHJlZmVycmVkLCBhbW9uZyA6CgogIC0gTUlOT1IgICAgbWlub3IgY2hhbmdlLCB2ZXJ5IGxvdyByaXNrIG9mIGltcGFjdC4gSXQgaXMgb2Z0ZW4gdGhlIGNhc2UgZm9yCiAgICAgICAgICAgICBjb2RlIGFkZGl0aW9ucyB0aGF0IGRvbid0IHRvdWNoIGxpdmUgY29kZS4gRm9yIGEgYnVnLCBpdCBnZW5lcmFsbHkKICAgICAgICAgICAgIGluZGljYXRlcyBhbiBhbm5veWFuY2UsIG5vdGhpbmcgbW9yZS4KCiAgLSBNRURJVU0gICBtZWRpdW0gcmlzaywgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVncmVzc2lvbnMgb2YgbG93IGltcG9ydGFuY2Ugb3IKICAgICAgICAgICAgIHdoaWNoIG1heSBxdWlja2x5IGJlIGRpc2NvdmVyZWQuIEZvciBhIGJ1ZywgaXQgZ2VuZXJhbGx5IGluZGljYXRlcwogICAgICAgICAgICAgc29tZXRoaW5nIG9kZCB3aGljaCByZXF1aXJlcyBjaGFuZ2luZyB0aGUgY29uZmlndXJhdGlvbiBpbiBhbgogICAgICAgICAgICAgdW5kZXNpcmVkIHdheSB0byB3b3JrIGFyb3VuZCB0aGUgaXNzdWUuCgogIC0gTUFKT1IgICAgbWFqb3IgcmlzayBvZiBoaWRkZW4gcmVncmVzc2lvbi4gVGhpcyBoYXBwZW5zIHdoZW4gSSByZWFycmFuZ2UKICAgICAgICAgICAgIGxhcmdlIHBhcnRzIG9mIGNvZGUsIHdoZW4gSSBwbGF5IHdpdGggdGltZW91dHMsIHdpdGggdmFyaWFibGUKICAgICAgICAgICAgIGluaXRpYWxpemF0aW9ucywgZXRjLi4uIFdlIHNob3VsZCBvbmx5IGV4Y2VwdGlvbmFsbHkgZmluZCBzdWNoCiAgICAgICAgICAgICBwYXRjaGVzIGluIHN0YWJsZSBicmFuY2hlcy4gRm9yIGEgYnVnLCBpdCBpbmRpY2F0ZXMgc2V2ZXJlCiAgICAgICAgICAgICByZWxpYWJpbGl0eSBpc3N1ZXMgZm9yIHdoaWNoIHdvcmthcm91bmRzIGFyZSBpZGVudGlmaWVkIHdpdGggb3IKICAgICAgICAgICAgIHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0cy4KCiAgLSBDUklUSUNBTCBtZWRpdW0tdGVybSByZWxpYWJpbGl0eSBvciBzZWN1cml0eSBpcyBhdCByaXNrIGFuZCB3b3JrYXJvdW5kcywKICAgICAgICAgICAgIGlmIHRoZXkgZXhpc3QsIG1pZ2h0IG5vdCBhbHdheXMgYmUgYWNjZXB0YWJsZS4gQW4gdXBncmFkZSBpcwogICAgICAgICAgICAgYWJzb2x1dGVseSByZXF1aXJlZC4gQSBtYWludGVuYW5jZSByZWxlYXNlIG1heSBiZSBlbWl0dGVkIGV2ZW4gaWYKICAgICAgICAgICAgIG9ubHkgb25lIG9mIHRoZXNlIGJ1Z3MgYXJlIGZpeGVkLiBOb3RlIHRoYXQgdGhpcyB0YWcgaXMgb25seSB1c2VkCiAgICAgICAgICAgICB3aXRoIGJ1Z3MuIFN1Y2ggcGF0Y2hlcyBtdXN0IGluZGljYXRlIHdoYXQgaXMgdGhlIGZpcnN0IHZlcnNpb24KICAgICAgICAgICAgIGFmZmVjdGVkLCBhbmQgaWYga25vd24sIHRoZSBjb21taXQgSUQgd2hpY2ggaW50cm9kdWNlZCB0aGUgaXNzdWUuCgpJZiB0aGlzIGNyaXRlcmlvbiBkb2Vzbid0IGFwcGx5LCBpdCdzIGJlc3Qgbm90IHRvIHB1dCBpdC4gRm9yIGluc3RhbmNlLCBtb3N0CmRvYyB1cGRhdGVzIGFuZCBtb3N0IGV4YW1wbGVzIG9yIHRlc3QgZmlsZXMgYXJlIGp1c3QgYWRkZWQgb3IgdXBkYXRlZCB3aXRob3V0CmFueSBuZWVkIHRvIHF1YWxpZnkgYSBsZXZlbCBvZiBpbXBvcnRhbmNlLgoKVGhlIGFyZWEgdGhlIHBhdGNoIGFwcGxpZXMgdG8gaXMgcXVpdGUgaW1wb3J0YW50LCBiZWNhdXNlIHNvbWUgYXJlYXMgYXJlIGtub3duCnRvIGJlIHNpbWlsYXIgaW4gb2xkZXIgdmVyc2lvbnMsIHN1Z2dlc3RpbmcgYSBiYWNrcG9ydCBtaWdodCBiZSBkZXNpcmFibGUsIGFuZApjb252ZXJzZWx5LCBzb21lIGFyZWFzIGFyZSBrbm93biB0byBiZSBzcGVjaWZpYyB0byBvbmUgdmVyc2lvbi4gV2hlbiB0aGUgdGFnIGlzCnVzZWQgYWxvbmUsIHVwcGVyY2FzZSBpcyBwcmVmZXJyZWQgZm9yIHJlYWRhYmlsaXR5LCBvdGhlcndpc2UgbG93ZXJjYXNlIGlzIGZpbmUKdG9vLiBUaGUgZm9sbG93aW5nIHRhZ3MgYXJlIHN1Z2dlc3RlZCBidXQgbm90IGxpbWl0YXRpdmUgOgoKIC0gZG9jICAgICAgIGRvY3VtZW50YXRpb24gdXBkYXRlcyBvciBmaXhlcy4gTm8gY29kZSBpcyBhZmZlY3RlZCwgbm8gbmVlZCB0bwogICAgICAgICAgICAgdXBncmFkZS4gVGhlc2UgcGF0Y2hlcyBjYW4gYWxzbyBiZSBzZW50IHJpZ2h0IGFmdGVyIGEgbmV3IGZlYXR1cmUsCiAgICAgICAgICAgICB0byBkb2N1bWVudCBpdC4KCiAtIGV4YW1wbGVzICBleGFtcGxlIGZpbGVzLiBCZSBjYXJlZnVsLCBzb21ldGltZXMgdGhlc2UgZmlsZXMgYXJlIHBhY2thZ2VkLgoKIC0gdGVzdHMgICAgIHJlZ3Jlc3Npb24gdGVzdCBmaWxlcy4gTm8gY29kZSBpcyBhZmZlY3RlZCwgbm8gbmVlZCB0byB1cGdyYWRlLgoKIC0gaW5pdCAgICAgIGluaXRpYWxpemF0aW9uIGNvZGUsIGFyZ3VtZW50cyBwYXJzaW5nLCBldGMuLi4KCiAtIGNvbmZpZyAgICBjb25maWd1cmF0aW9uIHBhcnNlciwgbW9zdGx5IHVzZWQgd2hlbiBhZGRpbmcgbmV3IGNvbmZpZyBrZXl3b3JkcwoKIC0gaHR0cCAgICAgIHRoZSBIVFRQIGVuZ2luZQoKIC0gc3RhdHMgICAgIHRoZSBzdGF0cyByZXBvcnRpbmcgZW5naW5lIGFzIHdlbGwgYXMgdGhlIHN0YXRzIHNvY2tldCBDTEkKCiAtIGNoZWNrcyAgICB0aGUgaGVhbHRoIGNoZWNrcyBlbmdpbmUgKGVnOiB3aGVuIGFkZGluZyBuZXcgY2hlY2tzKQoKIC0gYWNsICAgICAgIHRoZSBBQ0wgcHJvY2Vzc2luZyBjb3JlIG9yIHNvbWUgQUNMcyBmcm9tIG90aGVyIGFyZWFzCgogLSBwZWVycyAgICAgdGhlIHBlZXIgc3luY2hyb25pemF0aW9uIGVuZ2luZQoKIC0gbGlzdGVuZXJzIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBpbmNvbWluZyBjb25uZWN0aW9uIHNldHRpbmdzCgogLSBmcm9udGVuZCAgZXZlcnl0aGluZyByZWxhdGVkIHRvIGluY29taW5nIGNvbm5lY3Rpb24gcHJvY2Vzc2luZwoKIC0gYmFja2VuZCAgIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBMQiBhbGdvcml0aG1zIGFuZCBzZXJ2ZXIgZmFybQoKIC0gc2Vzc2lvbiAgIHNlc3Npb24gcHJvY2Vzc2luZyBhbmQgZmxhZ3MgKHZlcnkgc2Vuc2libGUsIGJlIGNhcmVmdWwpCgogLSBzZXJ2ZXIgICAgc2VydmVyIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgcXVldWVpbmcKCiAtIHByb3h5ICAgICBwcm94eSBtYWludGVuYW5jZSAoc3RhcnQvc3RvcCkKCiAtIGxvZyAgICAgICBsb2cgbWFuYWdlbWVudAoKIC0gcG9sbCAgICAgIGFueSBvZiB0aGUgcG9sbGVycwoKIC0gaGFsb2cgICAgIHRoZSBoYWxvZyBzdWItY29tcG9uZW50IGluIHRoZSBjb250cmliIGRpcmVjdG9yeQoKIC0gY29udHJpYiAgIGFueSBhZGRpdGlvbiB0byB0aGUgY29udHJpYiBkaXJlY3RvcnkKCk90aGVyIG5hbWVzIG1heSBiZSBpbnZlbnRlZCB3aGVuIG1vcmUgcHJlY2lzZSBpbmRpY2F0aW9ucyBhcmUgbWVhbmluZ2Z1bCwgZm9yCmluc3RhbmNlIDogImNvb2tpZSIgd2hpY2ggaW5kaWNhdGVzIGNvb2tpZSBwcm9jZXNzaW5nIGluIHRoZSBIVFRQIGNvcmUuIExhc3QsCmluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGFmZmVjdGVkIGZpbGUgaXMgYWxzbyBhIGdvb2Qgd2F5IHRvIHF1aWNrbHkgc3BvdApjaGFuZ2VzLiBNYW55IGNvbW1pdHMgd2VyZSBhbHJlYWR5IHRhZ2dlZCB3aXRoICJzdHJlYW1fc29jayIgb3IgImNmZ3BhcnNlIiBmb3IKaW5zdGFuY2UuCgpJdCBpcyBkZXNpcmVkIHRoYXQgQVQgTEVBU1Qgb25lIG9mIHRoZSAzIGNyaXRlcmlhIHRhZ3MgaXMgcmVwb3J0ZWQgaW4gdGhlIHBhdGNoCnN1YmplY3QuIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgdGhlIDMgbW9zdCBvZnRlbi4gVGhlIHR3byBmaXJzdCBjcml0ZXJpYSBzaG91bGQKYmUgcHJlc2VudCBiZWZvcmUgYSBmaXJzdCBjb2xvbiAoJzonKS4gSWYgYm90aCBhcmUgcHJlc2VudCwgdGhlbiB0aGV5IHNob3VsZCBiZQpkZWxpbWl0ZWQgd2l0aCBhIHNsYXNoICgnLycpLiBUaGUgM3JkIGNyaXRlcmlvbiAoYXJlYSkgc2hvdWxkIGFwcGVhciBuZXh0LCBhbHNvCmZvbGxvd2VkIGJ5IGEgY29sb24uIFRodXMsIGFsbCBvZiB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzIGFyZSB2YWxpZCA6CgpFeGFtcGxlcyBvZiBtZXNzYWdlcyA6CiAgLSBET0M6IGRvY3VtZW50IG9wdGlvbnMgZm9yd2FyZGZvciB0byBsb2dhc2FwCiAgLSBET0MvTUFKT1I6IHJlb3JnYW5pemUgdGhlIHdob2xlIGRvY3VtZW50IGFuZCBjaGFuZ2UgaW5kZW50aW5nCiAgLSBCVUc6IHN0YXRzOiBjb25uZWN0aW9uIHJlc2V0IGNvdW50ZXJzIG11c3QgYmUgcGxhaW4gYXNjaWksIG5vdCBIVE1MCiAgLSBCVUcvTUlOT1I6IHN0YXRzOiBjb25uZWN0aW9uIHJlc2V0IGNvdW50ZXJzIG11c3QgYmUgcGxhaW4gYXNjaWksIG5vdCBIVE1MCiAgLSBNRURJVU06IGNoZWNrczogc3VwcG9ydCBtdWx0aS1wYWNrZXQgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcwogIC0gUkVMRUFTRTogUmVsZWFzZWQgdmVyc2lvbiAxLjQuMgogIC0gQlVJTEQ6IHN0YXRzOiBzdGRpbnQgaXMgbm90IHByZXNlbnQgb24gc29sYXJpcwogIC0gT1BUSU0vTUlOT1I6IGhhbG9nOiBtYWtlIGZnZXRzIHBhcnNlIG1vcmUgYnl0ZXMgYnkgYmxvY2tzCiAgLSBSRU9SRy9NRURJVU06IG1vdmUgc3lzY2FsbCByZWRlZmluaXRpb24gdG8gc3BlY2lmaWMgcGxhY2VzCgpQbGVhc2UgZG8gbm90IHVzZSBzcXVhcmUgYnJhY2tldHMgYW55bW9yZSBhcm91bmQgdGhlIHRhZ3MsIGJlY2F1c2UgdGhleSBnaXZlIG1lCm1vcmUgd29yayB3aGVuIG1lcmdpbmcgcGF0Y2hlcy4gQnkgZGVmYXVsdCBJJ20gYXNraW5nIEdpdCB0byBrZWVwIHRoZW0gYnV0IHRoaXMKY2F1c2VzIHRyb3VibGUgd2hlbiBwYXRjaGVzIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBbUEFUQ0hdIHRhZyBiZWNhdXNlIGluIG9yZGVyCm5vdCB0byBzdG9yZSBpdCwgSSBoYXZlIHRvIGhhbmQtZWRpdCB0aGUgcGF0Y2hlcy4gU28gYXMgb2Ygbm93LCBJIHdpbGwgYXNrIEdpdAp0byByZW1vdmUgd2hhdGV2ZXIgaXMgbG9jYXRlZCBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cywgd2hpY2ggaW1wbGllcyB0aGF0IGFueQpzdWJqZWN0IGZvcm1hdHRlZCB0aGUgb2xkIHdheSB3aWxsIGhhdmUgaXRzIHRhZyBzdHJpcHBlZCBvdXQuCgpJbiBmYWN0LCBvbmUgb2YgdGhlIG9ubHkgc3F1YXJlIGJyYWNrZXQgdGFncyB0aGF0IHN0aWxsIG1ha2VzIHNlbnNlIGlzICdbUkZDXScKYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViamVjdCwgd2hlbiB5b3UncmUgYXNraW5nIGZvciBzb21lb25lIHRvIHJldmlldyB5b3VyCmNoYW5nZSBiZWZvcmUgZ2V0dGluZyBpdCBtZXJnZWQuIElmIHRoZSBwYXRjaCBpcyBPSyB0byBiZSBtZXJnZWQsIHRoZW4gSSBjYW4KbWVyZ2UgaXQgYXMtaXMgYW5kIHRoZSAnW1JGQ10nIHRhZyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZC4gSWYgeW91IGRvbid0CndhbnQgaXQgdG8gYmUgbWVyZ2VkIGF0IGFsbCwgeW91IGNhbiBzaW1wbHkgc3RhdGUgaXQgaW4gdGhlIG1lc3NhZ2UsIG9yIHVzZSBhbgphbHRlcm5hdGUgJ1tXSVBdJyB0YWcgKCJ3b3JrIGluIHByb2dyZXNzIikuCgpUaGUgdGFncyBhcmUgbm90IHJpZ2lkLCBmb2xsb3cgeW91ciBpbnR1aXRpb24gZmlyc3QsIGFueXdheSBJIHJlc2VydmUgdGhlIHJpZ2h0CnRvIGNoYW5nZSB0aGVtIHdoZW4gbWVyZ2luZyB0aGUgcGF0Y2guIEl0IG1heSBoYXBwZW4gdGhhdCBhIHNhbWUgcGF0Y2ggaGFzIGEKZGlmZmVyZW50IHRhZyBpbiB0d28gZGlzdGluY3QgYnJhbmNoZXMuIFRoZSByZWFzb24gaXMgdGhhdCBhIGJ1ZyBpbiBvbmUgYnJhbmNoCm1heSBqdXN0IGJlIGEgY2xlYW51cCBpbiB0aGUgb3RoZXIgb25lIGJlY2F1c2UgdGhlIGNvZGUgY2Fubm90IGJlIHRyaWdnZXJlZC4KCgpGb3IgYSBtb3JlIGVmZmljaWVudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBtYWlubGluZSBjb2RlIGFuZCB5b3VyIGNvZGUsIEkgY2FuCm9ubHkgc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB0byB0cnkgdGhlIEdpdCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIDoKCiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9naXQtc2NtLmNvbS8KCkl0J3MgdmVyeSBmYXN0LCBsaWdodHdlaWdodCBhbmQgbGV0cyB5b3UgdW5kby9yZWRvIHlvdXIgd29yayBhcyBvZnRlbiBhcyB5b3UKd2FudCwgd2l0aG91dCBtYWtpbmcgeW91ciBtaXN0YWtlcyB2aXNpYmxlIHRvIHRoZSByZXN0IG9mIHRoZSB3b3JsZC4gSXQgd2lsbApkZWZpbml0ZWx5IGhlbHAgeW91IGNvbnRyaWJ1dGUgcXVhbGl0eSBjb2RlIGFuZCB0YWtlIG90aGVyIHBlb3BsZSdzIGZlZWRiYWNrCmluIGNvbnNpZGVyYXRpb24uIEluIG9yZGVyIHRvIGNsb25lIHRoZSBIQVByb3h5IEdpdCByZXBvc2l0b3J5IDoKCiAgICAkIGdpdCBjbG9uZSBodHRwOi8vZ2l0LmhhcHJveHkub3JnL2dpdC9oYXByb3h5LTEuNC5naXQgICAgKHN0YWJsZSAxLjQpCiAgICAkIGdpdCBjbG9uZSBodHRwOi8vZ2l0LmhhcHJveHkub3JnL2dpdC9oYXByb3h5LmdpdC8gICAgICAgKGRldmVsb3BtZW50KQoKSWYgeW91IGRlY2lkZSB0byB1c2UgR2l0IGZvciB5b3VyIGRldmVsb3BtZW50cywgdGhlbiB5b3VyIGNvbW1pdCBtZXNzYWdlcyB3aWxsCmhhdmUgdGhlIHN1YmplY3QgbGluZSBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSwgdGhlbiB0aGUgd2hvbGUgZGVzY3JpcHRpb24Kb2YgeW91ciB3b3JrIChtYWlubHkgd2h5IHlvdSBkaWQgaXQpIHdpbGwgYmUgaW4gdGhlIGJvZHkuIFlvdSBjYW4gZGlyZWN0bHkgc2VuZAp5b3VyIGNvbW1pdHMgdG8gdGhlIG1haWxpbmcgbGlzdCwgdGhlIGZvcm1hdCBpcyBjb252ZW5pZW50IHRvIHJlYWQgYW5kIHByb2Nlc3MuCgotLSBlbmQK