{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "zZUwr57t+Qm4xmKVxLRIeLyEo6icz5JpwYLZ0aJ/cLY=",
    "height": "334000",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "79600383",
      "GasUsed": "53066922"
    },
    "tx": "Cp63AgoML3ZtLm1fYWRkcGtnEoy3AgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLPtgIKBmFzc2V0cxI6Z25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2Fzc2V0cxqktQIKCmFzc2V0cy5nbm8SlLUCLy8gUGFja2FnZSBhc3NldHMgaXMgYSBwZXItb3duZXIgZml4ZWQtYXNzZXQgcmVnaXN0ZXIgd2hvc2UgbGVkZ2VyIHBvc3RpbmdzCi8vIGFyZSBERVJJVkVEIGZyb20gc3RhdGUgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgYnkgYSBjYWxsZXIuCi8vCi8vICMgV2hhdCB0aGlzIHJlYWxtIGlzIGZvcgovLwovLyBBIGdlbmVyYWwgbGVkZ2VyIHRha2VzIGEgZGViaXQgY29kZSwgYSBjcmVkaXQgY29kZSBhbmQgYW4gYW1vdW50IGZyb20KLy8gd2hvZXZlciBpcyBwb3N0aW5nLiBUaGF0IGlzIHRoZSByaWdodCBkZXNpZ24gZm9yIGEgbGVkZ2VyIGFuZCBpdCBtZWFucwovLyBnbm8ubGFuZC9yLy4uLi9ib29rcyBzdHJ1Y3R1cmFsbHkgQ0FOTk9UIGtub3cgdGhhdCBhbiBlbnRyeSB3YXMgYQovLyBkZXByZWNpYXRpb24gY2hhcmdlLCBvciB0aGF0IHRoZSBjaGFyZ2UgZm9yIHRoYXQgcGVyaW9kIGhhZCBhbHJlYWR5IGJlZW4KLy8gbWFkZS4gTm90aGluZyBzdG9wcyBhbiBvd25lciBmcm9tIGJvb2tpbmcgdGhlIHNhbWUgbW9udGggdHdpY2UsIG9yIGZyb20KLy8gc2tpcHBpbmcgb25lLCBhbmQgbm90aGluZyBpbiB0aGUgYm9vayBjYW4gdGVsbCBhZnRlcndhcmRzLgovLwovLyBUaGlzIHJlYWxtIGNsb3NlcyB0aGF0IGdhcCBmb3Igb25lIGNsYXNzIG9mIGVudHJ5LiBJdCBob2xkcyBlYWNoIGFzc2V0J3MKLy8gZGVwcmVjaWF0aW9uIHNjaGVkdWxlIGFzIHN0YXRlLCBjb21wdXRlcyB0aGUgY2hhcmdlIGZyb20gdGhlIHNjaGVkdWxlIGFuZAovLyB0aGUgY2hhaW4gaGVpZ2h0LCBhbmQga2VlcHMgYSBwZXItYXNzZXQgSElHSC1XQVRFUiBNQVJLIG9mIHRoZSBwZXJpb2RzCi8vIGFscmVhZHkgYm9va2VkLiBUaGUgYW1vdW50IGlzIG5ldmVyIGEgcGFyYW1ldGVyLiBBIGNoYXJnZSB0aGVyZWZvcmUgY2Fubm90Ci8vIGJlIGRvdWJsZS1ib29rZWQgKHRoZSBtYXJrIGRvZXMgbm90IG1vdmUgYmFja3dhcmRzKSBhbmQgY2Fubm90IGJlIHNraXBwZWQKLy8gKHRoZSBuZXh0IGNhbGwgYm9va3MgdGhlIHdob2xlIHNwYW4sIGJlY2F1c2UgY2hhcmdlcyB0ZWxlc2NvcGUgZXhhY3RseSkuCi8vCi8vIFRoZSByZXN1bHRpbmcgY2xhaW0gaXMgbmFycm93IGFuZCBjaGVja2FibGUgYnkgYW55b25lLCB3aGljaCBpcyB0aGUgcG9pbnQ6Ci8vCi8vCWJvb2tlZEFtb3VudChhc3NldCkgPT0gYXNzZXQuc2NoZWR1bGUuQWNjdW11bGF0ZWRBdChib29rZWRUaHJvdWdoKGFzc2V0KSkKLy8KLy8gYW5kLCBhY3Jvc3MgYSB3aG9sZSByZWdpc3RlciwKLy8KLy8Jc3VtIG9mIGJvb2tlZEFtb3VudCBvdmVyIGFzc2V0cyA9PSB0aGUgY3JlZGl0IGJhbGFuY2Ugb2YgMTU5MAovLwovLyBCb3RoIGFyZSBleHBvcnRlZCBhcyBbSW52YXJpYW50XSBhbmQgW0Nyb3NzRm9vdF0gYW5kIGJvdGggYXJlIEZSRUUgcmVhZHMsCi8vIGRlbGliZXJhdGVseSDigJQgc2VlICJXaHkgUmVkZXJpdmUgaXMgbm90IG93bmVyLW9ubHkiIGJlbG93LgovLwovLyAjIFRoZSBjaGFydCBpcyB0d28gYWNjb3VudHMgYW5kIGlzIGZpeGVkCi8vCi8vCTU1MDAgIERlcHJlY2lhdGlvbiBleHBlbnNlICAgICAgIChleHBlbnNlLCBkZWJpdC1ub3JtYWwpCi8vCTE1OTAgIEFjY3VtdWxhdGVkIGRlcHJlY2lhdGlvbiAgIChhc3NldCwgICBDT05UUkEg4oCUIHNlZSBiZWxvdykKLy8KLy8gRXZlcnkgcG9zdGluZyBpcyBkZWJpdCA1NTAwIC8gY3JlZGl0IDE1OTAgZm9yIGFuIGVxdWFsIGFtb3VudCwgc28gdGhlCi8vIGFjY291bnRpbmcgZXF1YXRpb24gb2Zmc2V0cyBhdCAwID0gMCBvbiBhbiBlbXB0eSByZWdpc3RlciBhbmQgYWZ0ZXIgZXZlcnkKLy8gY2hhcmdlLiBUaGVyZSBpcyBubyBPcGVuQWNjb3VudCBlbnRyeXBvaW50IGFuZCB0aGUgdW5kZXJseWluZyBib29rIGlzCi8vIGNyZWF0ZWQgd2l0aCBhIGhhcmQgY2FwIG9mIHR3byBhY2NvdW50cywgc28gdGhlIGNoYXJ0IGNhbm5vdCBncm93LgovLwovLyBUaGUgQ09TVCBCQVNJUyBuZXZlciByZWFjaGVzIHRoZSBib29rLiBCb29raW5nIGFuIGFzc2V0J3MgY29zdCB3b3VsZCBmb3JjZQovLyBhIGNyZWRpdCBsZWcsIGFuZCB0aGUgb25seSBob25lc3QgY2FuZGlkYXRlcyBhcmUgYSBsaWFiaWxpdHkKLy8gKCIyMDAwIEFjcXVpc2l0aW9uIHBheWFibGUiKSBvciBhbiBlcXVpdHkgcGx1ZyAoIjMwMDAgQ29udHJpYnV0ZWQKLy8gY2FwaXRhbCIpLiBCb3RoIGFzc2VydCBob3cgdGhlIGFzc2V0IHdhcyBmdW5kZWQsIHdoaWNoIHRoaXMgcmVhbG0gZG9lcyBub3QKLy8ga25vdyBhbmQgbXVzdCBub3QgaW52ZW50LiBUaGUgY29zdCBzdGF5cyBpbiByZWdpc3RlciBzdGF0ZSwgd2hlcmUgaXQgaXMKLy8gdmlzaWJsZSBhcyBkYXRhIHJhdGhlciB0aGFuIGFzIGFuIGFjY291bnRpbmcgY2xhaW0uCi8vCi8vIDE1OTAgaXMga2luZCBBU1NFVCwgc28gam91cm5hbCB0cmVhdHMgaXQgYXMgZGViaXQtbm9ybWFsIGFuZCBCYWxhbmNlKCkKLy8gcmV0dXJucyBEZWJpdHMgLSBDcmVkaXRzIOKAlCB3aGljaCByZWFkcyBORUdBVElWRSBmb3IgYWNjdW11bGF0ZWQKLy8gZGVwcmVjaWF0aW9uLiBUaGF0IGlzIGFyaXRobWV0aWNhbGx5IGNvcnJlY3QgZm9yIGEgY29udHJhLWFzc2V0IGFuZCBpcwovLyBjb25mdXNpbmcgb24gZmlyc3QgcmVhZGluZywgc28gYm90aCBmaWd1cmVzIGFyZSBleHBvcnRlZCBhbmQgZWFjaCBpcyBuYW1lZAovLyBmb3Igd2hhdCBpdCBpczogW0FjY3VtdWxhdGVkQ3JlZGl0XSBpcyB0aGUgcG9zaXRpdmUgY29udHJhIGJhbGFuY2UuCi8vCi8vICMgUGVyaW9kcyBhcmUgbWVhc3VyZWQgaW4gQkxPQ0tTCi8vCi8vIEEgcGVyaW9kIGlzIHBlcmlvZEJsb2NrcyBjaGFpbiBoZWlnaHRzIGxvbmcsIGFuY2hvcmVkIHRvIHRoZSBoZWlnaHQgdGhlCi8vIGFzc2V0IHdhcyBwbGFjZWQgaW4gc2VydmljZS4gUGVyaW9kIGsgY2xvc2VzIGF0IHBsYWNlZEF0ICsgaypwZXJpb2RCbG9ja3MsCi8vIGFuZCBhIHBhcnRpYWwgcGVyaW9kIGluIHByb2dyZXNzIGlzIG5vdCBjb3VudGVkIGFuZCBpcyBub3QgbG9zdC4KLy8KLy8gQmxvY2sgaGVpZ2h0LCBub3Qgd2FsbC1jbG9jayB0aW1lLCBiZWNhdXNlIHRoYXQgaXMgdGhpcyBwb3J0Zm9saW8ncwovLyBjb252ZW50aW9uOiBwYXlyb2xsLCBidWRnZXRzLCByZWltYnVyc2VtZW50cyBhbmQgc3Vic2NyaXB0aW9ucyBhbGwgY2FycnkgYQovLyBwZXJpb2RCbG9ja3MgZmllbGQsIGFuZCBoZWlnaHQgaXMgbW9ub3RvbmUgYnkgY29uc3RydWN0aW9uIHdoZXJlIGJsb2NrIHRpbWUKLy8gaXMgdmFsaWRhdG9yLXJlcG9ydGVkLiBwL2RlcHJlY2lhdGlvbidzIERhaWx5L01vbnRobHkvWWVhcmx5IGNvbnN0YW50cyBhcmUKLy8gU0VDT05EUyBhbmQgYXJlIHRoZXJlZm9yZSBub3QgdXNlZCBoZXJlOyBpdHMgYXJpdGhtZXRpYyBpcyB1bml0LWFnbm9zdGljCi8vIChQZXJpb2RzIGlzIGFuIGludGVnZXIgZGl2aXNpb24pLCBzbyB0aGlzIGlzIGEgbWlzbWF0Y2ggaW4gdGhhdCBwYWNrYWdlJ3MKLy8gZG9jdW1lbnRhdGlvbiByYXRoZXIgdGhhbiBhIGRpdmVyZ2VuY2UgZnJvbSBpdHMgYmVoYXZpb3VyLiBJdCBpcyByZWNvcmRlZAovLyBpbiBESVNDT1ZFUlkubWQgwqcgNiByYXRoZXIgdGhhbiBzaWxlbnRseSB3b3JrZWQgYXJvdW5kLgovLwovLyAjIFJldGlyZW1lbnQgYm9va3MgZmlyc3QsIHRoZW4gZnJlZXplcwovLwovLyBbUmV0aXJlXSBwZXJmb3JtcyB0aGUgZmluYWwgYm9va2luZyBmb3IgdGhlIHBlcmlvZHMgY29tcGxldGVkIHVwIHRvIHRoZQovLyByZXRpcmVtZW50IGhlaWdodCBhbmQgb25seSB0aGVuIHN0b3BzIHRoZSBhc3NldC4gVGhlIHR3byBhcmUgb25lCi8vIHRyYW5zYWN0aW9uIG9uIHB1cnBvc2U6IHJldGlyaW5nIHdpdGhvdXQgYm9va2luZyB3b3VsZCBsZWF2ZSBkZXByZWNpYXRpb24KLy8gdGhhdCB3YXMgZ2VudWluZWx5IGluY3VycmVkIHBlcm1hbmVudGx5IHVuYm9va2VkLCBhbmQgYm9va2luZyBhZnRlcgovLyByZXRpcmVtZW50IHdvdWxkIG5lZWQgYW4gZXhjZXB0aW9uIHRvIHRoZSAicmV0aXJlZCBhc3NldHMgZG8gbm90IGFjY3J1ZSIKLy8gcnVsZS4gSGlzdG9yaWNhbCBjaGFyZ2VzIGFsd2F5cyBzdGFuZCDigJQgdGhlIGRlcHJlY2lhdGlvbiByZWFsbHkgaGFwcGVuZWQuCi8vCi8vIERpc3Bvc2FsIGdhaW4gb3IgbG9zcyBpcyBPVVQgT0YgU0NPUEUgZm9yIHYxLCBhbmQgdGhlIHJlYXNvbiBpcyBzdHJ1Y3R1cmFsOgovLyBpdCBuZWVkcyB0aGUgY29zdC1iYXNpcyBhY2NvdW50IHRoaXMgcmVhbG0gZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG9wZW4sIHBsdXMKLy8gYSBwcm9jZWVkcyBmaWd1cmUgdGhlIHJlYWxtIGNhbm5vdCBvYnNlcnZlIGJlY2F1c2UgaXQgaG9sZHMgbm8gZnVuZHMuCi8vCi8vICMgV2hhdCB0aGlzIHJlYWxtIGRvZXMgTk9UIGRvCi8vCi8vICAgLSBObyBjdXN0b2R5LiBJdCBob2xkcyBubyBjb2lucywgaGFzIG5vIHdpdGhkcmF3YWwgcGF0aCwgYW5kIHJlZnVzZXMgYQovLyAgICAgdXNlciBjYWxsIHRoYXQgYXJyaXZlcyBjYXJyeWluZyBhbnkuIEFuIGFzc2V0J3MgY29zdCBpcyBhIG51bWJlciBhbgovLyAgICAgb3duZXIgdHlwZWQuCi8vICAgLSBObyBwZXJpb2QgY2xvc2UuIHAvam91cm5hbCBjYW4gc2VhbCBhIGJvb2sgdXAgdG8gYSBIRUlHSFQsIHJlZnVzaW5nCi8vICAgICBlbnRyaWVzIGRhdGVkIGF0IG9yIGJlZm9yZSBpdC4gVGhpcyByZWFsbSdzIGJvb2tlZFRocm91Z2ggaXMgYSBQRVJJT0QKLy8gICAgIElOREVYIOKAlCBhIGRpZmZlcmVudCBheGlzIHdlYXJpbmcgdGhlIHNhbWUgRW5nbGlzaCB3b3JkIOKAlCBhbmQgc2VhbGluZyBhCi8vICAgICBkZXJpdmVkIGJvb2sgY291bGQgb25seSBtYWtlIHRoZSBkZXJpdmF0aW9uIHVucG9zdGFibGUuIFRoZSBjYXBhYmlsaXR5Ci8vICAgICBleGlzdHMgaW4gdGhlIGVuZ2luZSBhbmQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBleHBvc2VkLgovLyAgIC0gTm8gYnVsayBib29raW5nLiBwL2RlcHJlY2lhdGlvbidzIE1heExpZmUgZG9jIHN0YXRlcyB0aGUgbG9vcCBib3VuZAovLyAgICAgKDExOTkgaXRlcmF0aW9ucyBwZXIgQ2FycnlpbmdBdCwgMjM5OCBwZXIgQ2hhcmdlLCBhbmQgYSBkZWdlbmVyYXRlCi8vICAgICBkZWNsaW5pbmcgc2NoZWR1bGUgdGhhdCBydW5zIHRoZSBmdWxsIGJvdW5kIG9uIGV2ZXJ5IGNhbGwgZm9yZXZlcikgYW5kCi8vICAgICBleHBsaWNpdGx5IHJlZnVzZXMgdG8gcHJpY2UgaXQuIEEgbG9vcCBvdmVyIE4gYXNzZXRzIG11bHRpcGxpZXMgYW4KLy8gICAgIHVucHJpY2VkIGJvdW5kIGJ5IE4sIHNvIG9uZSBhc3NldCBpcyBib29rZWQgcGVyIGNhbGwuCi8vICAgLSBObyB0cnV0aC4gQSByZWdpc3RlciBpcyBhIHNldCBvZiBjbGFpbXMgYnkgaXRzIG93bmVyLiBXaXRoIG5vIGN1c3RvZHkKLy8gICAgIHRoZXJlIGlzIG5vdGhpbmcgdHlpbmcgImNvc3QgMTAwMDAwMCIgdG8gYSByZWFsIGhvbGRpbmcuIFRoZSBpbnZhcmlhbnRzCi8vICAgICBoZXJlIHByb3ZlIHRoYXQgdGhlIHBvc3RpbmdzIGZvbGxvdyBmcm9tIHRoZSBzdG9yZWQgc2NoZWR1bGVzOyB0aGV5Ci8vICAgICBwcm92ZSBub3RoaW5nIGFib3V0IHRoZSB3b3JsZC4KLy8KLy8gIyBXaHkgUmVkZXJpdmUgYW5kIHRoZSBpbnZhcmlhbnRzIGFyZSBmcmVlIHJlYWRzCi8vCi8vIHIvYm9va3MgZXhwb3NlcyBSZWRlcml2ZSBhcyBhbiBvd25lci1vbmx5IGNyb3NzaW5nIGZ1bmN0aW9uLCB0byBjb250YWluIHRoZQovLyBjb3N0IG9mIGEgZnVsbCByZS13YWxrLiBUaGlzIHJlYWxtIGRpdmVyZ2VzLCBkZWxpYmVyYXRlbHk6IHRoZSBkZXJpdmF0aW9uCi8vIElTIHRoZSBwcm9kdWN0LCBhbmQgYSBjbGFpbSBvbmx5IGl0cyBvd25lciBjYW4gY2hlY2sgaXMgbm90IGEgY2xhaW0gd29ydGgKLy8gbWFraW5nLiBbUmVkZXJpdmVdLCBbSW52YXJpYW50XSBhbmQgW0Nyb3NzRm9vdF0gYXJlIGFsbCBmcmVlIHJlYWRzLCBzbyBhbnkKLy8gdGhpcmQgcGFydHkgY2FuIHZlcmlmeSBhIHJlZ2lzdGVyIGZyb20gdm0vcWV2YWwgd2l0aG91dCB0aGUgb3duZXIncyBrZXkuCi8vCi8vIFRoZSBib3VuZCBhYm92ZSBpcyB3aGF0IG1ha2VzIHRoYXQgYWZmb3JkYWJsZSwgYW5kIGEgYm91bmQgaXMgbm90IGEgcHJpY2UuCi8vIE1lYXN1cmVkIHVuZGVyIHRoZSBwaW5uZWQgb255eCB0b29sY2hhaW4gYXQgdGhlIHJlZ2lzdGVyIGNhcCDigJQgNjQgYXNzZXRzIG9uCi8vIE1heExpZmUgZGVjbGluaW5nIHNjaGVkdWxlcywgdGhlIHdvcnN0IGNhc2UgdGhpcyByZWFsbSBjYW4gaG9sZDoKLy8KLy8JUmVuZGVyICAgcGVyIGNhbGw6ICAgIDEwNiw0MjEsMjcyIGdhcwovLwlSZWRlcml2ZSBwZXIgY2FsbDogIDksMzU3LDg2MCwwMDQgZ2FzCi8vCi8vIFNvIHRoZSBkZXNpZ24gY2hvaWNlIGlzIHN0YXRlZCB3aXRoIGl0cyBjb3N0IHJhdGhlciB0aGFuIG9ubHkgaXRzIHJlYXNvbi4KLy8gUmVuZGVyIGlzIGFuIG9yZGluYXJ5IHJpY2gtcGFnZSBmaWd1cmU7IFJlZGVyaXZlIGF0IGNhcCBpcyB0d28gb3JkZXJzIG9mCi8vIG1hZ25pdHVkZSBhYm92ZSBpdCwgZmFsbHMgb24gdGhlIHF1ZXJpZWQgbm9kZSByYXRoZXIgdGhhbiB0aGUgY2FsbGVyLCBhbmQKLy8gaXMgcmVhY2hhYmxlIHdpdGggbm8ga2V5IGFuZCBubyBmZWUuIFdoZXRoZXIgYSBnaXZlbiBSUEMncyBxdWVyeSBnYXMKLy8gY2VpbGluZyBhZG1pdHMgaXQgQVQgVEhFIENBUCBpcyBhIHByb3BlcnR5IG9mIHRoYXQgbm9kZSBhbmQgaXMgbm90IG1lYXN1cmVkCi8vIGhlcmUg4oCUIGlmIGl0IHJlZnVzZXMsIHRoZSB0aGlyZC1wYXJ0eS12ZXJpZmljYXRpb24gY2xhaW0gYWJvdmUgZmFpbHMKLy8gZXhhY3RseSBhdCB0aGUgYm91bmQgaXQgd2FzIGRlc2lnbmVkIGFyb3VuZC4gW0ludmFyaWFudF0gaXMgcGVyLWFzc2V0IGFuZAovLyBjaGVhcDsgW0Nyb3NzRm9vdF0gd2Fsa3MgdGhlIGFzc2V0cyBvbmx5LCBub3QgdGhlIHBvc3RpbmdzLgovLwovLyAjIERlcGxveSBvcmRlcgovLwovLyBUaGlzIHJlYWxtIGltcG9ydHMgcC9qb3VybmFsIGFuZCBwL2RlcHJlY2lhdGlvbi4gTmVpdGhlciBpcyBkZXBsb3llZCB5ZXQsCi8vIHNvIHRoZSBvcmRlciBpcyBwL2pvdXJuYWwsIHAvZGVwcmVjaWF0aW9uLCB0aGVuIHRoaXMgcmVhbG0uCnBhY2thZ2UgYXNzZXRzCgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZGVwcmVjaWF0aW9uIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9qb3VybmFsIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9hc3NldHMiCgovLyBUaGUgZml4ZWQgY2hhcnQuIFRoZSBjb2RlcyBmb2xsb3cgci9ib29rcycgY29udmVudGlvbiwgd2hlcmUgYW4gYWNjb3VudCdzCi8vIExFQURJTkcgRElHSVQgZml4ZXMgaXRzIGtpbmQ6IDEgYXNzZXQsIDIgbGlhYmlsaXR5LCAzIGVxdWl0eSwgNCByZXZlbnVlLAovLyA1IGV4cGVuc2UuIEEgc2l4LXNlcmllcyBjb2RlIHdvdWxkIGJlIGFuIGludmFsaWQgYWNjb3VudCB1bmRlciB0aGF0Ci8vIGNvbnZlbnRpb24sIHdoaWNoIGlzIHdoeSB0aGUgZXhwZW5zZSBsZWcgaXMgNTUwMCBhbmQgbm90IHRoZSA2NTAwIGEKLy8gdGV4dGJvb2sgY2hhcnQgd291bGQgdXNlLgpjb25zdCAoCglFeHBlbnNlQ29kZSA9ICI1NTAwIgoJRXhwZW5zZU5hbWUgPSAiRGVwcmVjaWF0aW9uIGV4cGVuc2UiCgoJQWNjdW1Db2RlID0gIjE1OTAiCglBY2N1bU5hbWUgPSAiQWNjdW11bGF0ZWQgZGVwcmVjaWF0aW9uIgopCgovLyBNYXhBc3NldHNQZXJSZWdpc3RlciBjYXBzIG9uZSBvd25lcidzIHJlZ2lzdGVyLiBDcm9zc0Zvb3QgYW5kIFJlbmRlciBib3RoCi8vIHdhbGsgZXZlcnkgYXNzZXQsIGFuZCB0aGlzIGJvdW5kIGlzIHdoYXQga2VlcHMgdGhvc2UgcmVhZHMgY2hlYXAgZm9yCi8vIGV2ZXJ5b25lLgpjb25zdCBNYXhBc3NldHNQZXJSZWdpc3RlciA9IDY0CgovLyBNYXhFbnRyaWVzUGVyUmVnaXN0ZXIgY2FwcyBvbmUgb3duZXIncyBqb3VybmFsLCBmYXIgYmVsb3cgam91cm5hbCdzCi8vIE1heEVudHJpZXNMaW1pdCBvZiAxMDAwMDAwIGJlY2F1c2UgUmVkZXJpdmVGcm9tSm91cm5hbCBpcyBsaW5lYXIgaW4gdGhlCi8vIHBvc3RpbmcgY291bnQgYW5kIGlzIGEgZnJlZSByZWFkIGhlcmUuCi8vCi8vIFRoZSBib3VuZCBpcyByZWFjaGFibGUgYW5kIHRoZSBhcml0aG1ldGljIGlzIHdvcnRoIHN0YXRpbmc6IGFuIGFzc2V0IHBvc3RzCi8vIGF0IG1vc3Qgb25lIGVudHJ5IHBlciBjb21wbGV0ZWQgcGVyaW9kLCBzbyBNYXhBc3NldHNQZXJSZWdpc3RlciBhc3NldHMgd2l0aAovLyBNYXhMaWZlLXBlcmlvZCBzY2hlZHVsZXMgY291bGQgd2FudCA2NCoxMjAwID0gNzY4MDAgZW50cmllcy4gQSByZWdpc3RlcgovLyB0aGF0IGZpbGxzIHJlZnVzZXMgZnVydGhlciBjaGFyZ2VzIHJhdGhlciB0aGFuIGRyb3BwaW5nIGhpc3RvcnkuIFRoZXJlIGlzCi8vIGRlbGliZXJhdGVseSBubyBBcmNoaXZlIOKAlCBpdCB3b3VsZCBkZXN0cm95IHRoZSByZWNvcmQgdGhlIGludmFyaWFudHMgYXJlCi8vIGNoZWNrZWQgYWdhaW5zdCDigJQgc28gdGhlIHJlbWVkeSBpcyBhIHNlY29uZCByZWdpc3RlciB1bmRlciBhIHNlY29uZAovLyBhZGRyZXNzLCB3aGljaCBpcyBhIHJlYWwgbGltaXRhdGlvbiBhbmQgbm90IGEgaGlkZGVuIG9uZS4KY29uc3QgTWF4RW50cmllc1BlclJlZ2lzdGVyID0gODE5MgoKLy8gTWF4TGFiZWxMZW4gYm91bmRzIGFuIGFzc2V0J3MgaHVtYW4gbGFiZWwuIEV2ZXJ5IGxhYmVsIGlzIGEgY2FuZGlkYXRlIGZvcgovLyBSZW5kZXIgb3V0cHV0Lgpjb25zdCBNYXhMYWJlbExlbiA9IDY0CgovLyBNaW5QZXJpb2RCbG9ja3MgaXMgdGhlIHNob3J0ZXN0IHBlcmlvZCBhbiBhc3NldCBtYXkgdXNlLiBNYXRjaGVzIHRoZSBmbG9vcgovLyBwYXlyb2xsLCBidWRnZXRzIGFuZCByZWltYnVyc2VtZW50cyBhbHJlYWR5IHVzZS4gQSBwZXJpb2Qgb2YgMCBpcyBub3QgYQovLyBzcGVjaWFsIGNhc2UgaGVyZSDigJQgaXQgaXMgc2ltcGx5IGludmFsaWQsIGJlY2F1c2UgYW4gYXNzZXQgd2l0aCBubyBwZXJpb2QKLy8gaGFzIG5vIHNjaGVkdWxlIHRvIGRlcml2ZSBhbnl0aGluZyBmcm9tLgpjb25zdCBNaW5QZXJpb2RCbG9ja3MgPSBpbnQ2NCgxMDApCgovLyBSZW5kZXJBc3NldExpbWl0IGNhcHMgaG93IG1hbnkgYXNzZXRzIG9uZSBSZW5kZXIgY2FsbCB0YWJ1bGF0ZXMuCmNvbnN0IFJlbmRlckFzc2V0TGltaXQgPSAyNQoKLy8gcmVnaXN0ZXIgaXMgb25lIG93bmVyJ3MgYXNzZXQgcmVnaXN0ZXIgYW5kIHRoZSBib29rIGl0cyBjaGFyZ2VzIHBvc3QgdG8uCi8vCi8vIFRoZSBib29rIGlzIGEgUE9JTlRFUiBhbmQgaXMgbmV2ZXIgcmV0dXJuZWQgYnkgYW55IGV4cG9ydGVkIGZ1bmN0aW9uIOKAlAovLyBwL2pvdXJuYWwgY29uc3VtZXIgb2JsaWdhdGlvbiA0OiBhICpCb29rIGlzIGEgbXV0YWJsZSBoYW5kbGUsIGFuZCBoYW5kaW5nCi8vIG9uZSBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSB3b3VsZCBoYW5kIG91dCB0aGUgcmlnaHQgdG8gcG9zdC4KdHlwZSByZWdpc3RlciBzdHJ1Y3QgewoJYm9vayAgICAgKmpvdXJuYWwuQm9vawoJYXNzZXRzICAgKmF2bC5UcmVlIC8vIGRlY2ltYWwgaWQgLT4gKmFzc2V0CgluZXh0SUQgICB1aW50NjQKCW9wZW5lZEF0IGludDY0Cn0KCi8vIGFzc2V0IGlzIG9uZSBkZXByZWNpYWJsZSBpdGVtLgp0eXBlIGFzc2V0IHN0cnVjdCB7CgkvLyBpZCBpcyBjYXJyaWVkIGluIHRoZSB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSB0cmVlIGtleSwgYmVjYXVzZSB0aGUga2V5CgkvLyBpcyB6ZXJvLXBhZGRlZCBmb3Igb3JkZXJpbmcgYW5kIHBhcnNpbmcgaXQgYmFjayB3b3VsZCBiZSBhIHNlY29uZAoJLy8gZW5jb2RpbmcgdG8ga2VlcCBpbiBzdGVwIHdpdGggdGhlIGZpcnN0LgoJaWQgICAgdWludDY0CglsYWJlbCBzdHJpbmcKCXNjaGVkIGRlcHJlY2lhdGlvbi5TY2hlZHVsZQoKCS8vIHBsYWNlZEF0IGlzIHRoZSBjaGFpbiBoZWlnaHQgcGVyaW9kIDAgYmVnaW5zIGF0LCBhbmQgcGVyaW9kIGlzIHRoZQoJLy8gcGVyaW9kIGxlbmd0aCBpbiBoZWlnaHRzLiBCb3RoIGFyZSBmaXhlZCBhdCBwbGFjZW1lbnQ6IGEgc2NoZWR1bGUKCS8vIHdob3NlIGNsb2NrIGNvdWxkIGJlIGVkaXRlZCBhZnRlcndhcmRzIHdvdWxkIG1ha2UgZXZlcnkgaGlzdG9yaWNhbAoJLy8gY2hhcmdlIHVuZXhwbGFpbmFibGUgZnJvbSBjdXJyZW50IHN0YXRlLgoJcGxhY2VkQXQgaW50NjQKCXBlcmlvZCAgIGludDY0CgoJLy8gYm9va2VkIGlzIHRoZSBoaWdoLXdhdGVyIG1hcmsg4oCUIHdob2xlIHBlcmlvZHMgYWxyZWFkeSBjaGFyZ2VkLiBJdAoJLy8gb25seSBldmVyIGluY3JlYXNlcywgYW5kIHRoYXQgaXMgdGhlIHdob2xlIG9mIHRoZSBpZGVtcG90ZW5jZQoJLy8gYXJndW1lbnQuCglib29rZWQgaW50MzIKCgkvLyBhbW91bnQgaXMgdGhlIGN1bXVsYXRpdmUgZXhwZW5zZSBwb3N0ZWQgZm9yIHRoaXMgYXNzZXQuIFRoZQoJLy8gcGVyLWFzc2V0IGludmFyaWFudCBpcyBhbW91bnQgPT0gc2NoZWQuQWNjdW11bGF0ZWRBdChib29rZWQpLgoJYW1vdW50IGludDY0CgoJcmV0aXJlZCAgIGJvb2wKCXJldGlyZWRBdCBpbnQ2NAp9CgovLyByZWdzIG1hcHMgYW4gb3duZXIncyBhZGRyZXNzIHN0cmluZyB0byB0aGF0IG93bmVyJ3MgKnJlZ2lzdGVyLgp2YXIgcmVncyA9IGF2bC5OZXdUcmVlKCkKCi8vIHJlZ0NvdW50IGlzIG1haW50YWluZWQgYWxvbmdzaWRlIHRoZSB0cmVlIHNvIHRoZSBpbmRleCBwYWdlIG5ldmVyIGhhcyB0bwovLyBpdGVyYXRlIGl0Lgp2YXIgcmVnQ291bnQgaW50CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR3VhcmRzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcmVmdXNlQ29pbnMgcGFuaWNzIGlmIGEgdXNlciBjYWxsIGFycml2ZXMgY2FycnlpbmcgY29pbnMuCi8vCi8vIFRoaXMgcmVhbG0gaGFzIG5vIHdpdGhkcmF3YWwgcGF0aCwgc28gYWNjZXB0ZWQgY29pbnMgd291bGQgYmUgc3RyYW5kZWQKLy8gcGVybWFuZW50bHkuIFRoZSBndWFyZCBpcyBvbiBJc1VzZXJDYWxsIHJhdGhlciB0aGFuIElzVXNlciBkZWxpYmVyYXRlbHk6Ci8vIE9yaWdpblNlbmQgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIGRpcmVjdCBNc2dDYWxsLCBhbmQgdGhlIE1zZ1J1bgovLyBlcGhlbWVyYWwgY2FuIGNvbnN1bWUgdGhlIGVudmVsb3BlIGJlZm9yZSBmb3J3YXJkaW5nIGNvbnRyb2wsIHNvIElzVXNlcgovLyB3b3VsZCBiZSB0aGUgd3JvbmcgcHJlZGljYXRlLgovLwovLyBUaGUgSXNDdXJyZW50KCkgY2hlY2sgaXMgYSBzZXBhcmF0ZSBjb25jZXJuIGFuZCBpcyBub3QgYWJvdXQgY29pbnM6IHRoaXMgaXMKLy8gYSBub24tY3Jvc3NpbmcgaGVscGVyIHJlYWRpbmcgaWRlbnRpdHkgb2ZmIGEgcmVhbG0gUEFSQU1FVEVSLCB3aGljaCBpcyB0aGUKLy8gZGVzaWduYXRpb24tZm9yZ2VyeSBzaGFwZSAoc2VjdXJpdHkubWQgQ2xhc3MgMikgd2hldGhlciBvciBub3QgYSBjYWxsZXIKLy8gZXhlcmNpc2luZyBpdCBleGlzdHMgdG9kYXkuIEl0IGlzIGEgbm8tb3AgYXQgZXZlcnkgY2FsbCBzaXRlIGhlcmUg4oCUIGVhY2ggaXMKLy8gYSBjcm9zc2luZyBlbnRyeXBvaW50IGZvcndhcmRpbmcgaXRzIE9XTiBmaXJzdCBjdXIsIHJ1bnRpbWUtY3VycmVudCBieQovLyBjb25zdHJ1Y3Rpb24g4oCUIGFuZCBpcyBrZXB0IGJlY2F1c2UgdGhpcyByZWFsbSBpcyBJTU1VVEFCTEUgYWZ0ZXIgYWRkcGtnLCBzbwovLyBhIGNhbGwgc2l0ZSBhZGRlZCBsYXRlciBjYW5ub3QgYmUgbWFkZSBzYWZlIGxhdGVyLiBwL2NvaW5pbyBndWFyZHMgdGhlIHNhbWUKLy8gc2hhcGUgaW4gUmVjZWl2ZSwgUGF5b3V0IGFuZCBTd2VlcDsgdGhpcyBpcyB0aGF0IGhvdXNlIHByZWNlZGVudCBhcHBsaWVkLgovLwovLyBObyBjb3VudCBvZiB0aGUgY2FsbCBzaXRlcyBpcyB3cml0dGVuIGRvd24sIHBlciBDTEFVREUubWQgwqcgNGEuCmZ1bmMgcmVmdXNlQ29pbnMoY3VyIHJlYWxtKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiYXNzZXRzOiByZWZ1c2VDb2lucyBjYWxsZWQgd2l0aCBhIHJlYWxtIHRoYXQgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJhc3NldHM6IHRoaXMgcmVhbG0gaG9sZHMgbm8gY29pbnMgYW5kIGhhcyBubyB3aXRoZHJhd2FsIHBhdGg7IHNlbmQgbm9uZSIpCgl9Cn0KCi8vIG11c3RPd25SZWdpc3RlciByZXR1cm5zIHRoZSBDQUxMRVInUyByZWdpc3RlciwgYW5kIHRoZXJlIGlzIG5vIHZhcmlhbnQgdGhhdAovLyByZXR1cm5zIGFueW9uZSBlbHNlJ3MuIEV2ZXJ5IG11dGF0aW5nIGVudHJ5cG9pbnQgZ29lcyB0aHJvdWdoIHRoaXMsIHNvCi8vIG93bmVyc2hpcCBpcyBpbXBsaWNpdCBpbiB0aGUgY2FsbC4KLy8KLy8gIk93bmVyc2hpcCBpcyBuZXZlciBhIHBhcmFtZXRlciIgaXMgd2hhdCB0aGlzIGNvbW1lbnQgdXNlZCB0byBjb25jbHVkZSwgYW5kCi8vIGl0IGlzIHRydWUgb2YgdGhlIFNJR05BVFVSRSBhbmQgd2FzIG5ldmVyIHRydWUgb2YgdGhlIHJlYWxtIFZBTFVFOiB0aGUgb3duZXIKLy8gaXMgZGVyaXZlZCBmcm9tIGN1ciwgc28gYW4gdW5jdXJyZW50IGN1ciBJUyBhbiBvd25lcnNoaXAgcGFyYW1ldGVyLiBUaGF0IGlzCi8vIHRoZSBzYW1lIENsYXNzIDIgc2hhcGUgcmVmdXNlQ29pbnMgY2FycmllcyBhYm92ZSBhbmQgdGhlIG1vcmUgY29uc2VxdWVudGlhbAovLyBoYWxmIG9mIGl0LCBiZWNhdXNlIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZGVjaWRlcyB3aG8gb3ducyB0aGUgcmVnaXN0ZXIKLy8gcmF0aGVyIHRoYW4gb25lIHRoYXQgb25seSByZWZ1c2VzIGNvaW5zLiBUaGUgZ3VhcmQgaXMgYSBuby1vcCB0b2RheSBmb3IgdGhlCi8vIHNhbWUgcmVhc29uLCBrZXB0IGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCBpdHMgY2FsbCBzaXRlcyBhcmUgbGlrZXdpc2Ugbm90Ci8vIGNvdW50ZWQgaGVyZS4gU2VlIEFVRElULm1kLgpmdW5jIG11c3RPd25SZWdpc3RlcihjdXIgcmVhbG0pICpyZWdpc3RlciB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiYXNzZXRzOiBtdXN0T3duUmVnaXN0ZXIgY2FsbGVkIHdpdGggYSByZWFsbSB0aGF0IGlzIG5vdCBjdXJyZW50IikKCX0KCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJciwgb2sgOj0gcmVnKG93bmVyKQoJaWYgIW9rIHsKCQlwYW5pYygiYXNzZXRzOiBubyByZWdpc3RlciBmb3IgIiArIG93bmVyLlN0cmluZygpICsgIjsgY2FsbCBPcGVuUmVnaXN0ZXIgZmlyc3QiKQoJfQoJcmV0dXJuIHIKfQoKLy8gcmVnIGxvb2tzIGFuIG93bmVyJ3MgcmVnaXN0ZXIgdXAuIGF2bCdzIEdldCByZXR1cm5zIGEgYmFyZSBgYW55YCBhbmQKLy8gc2lnbmFscyBhYnNlbmNlIHdpdGggbmlsLCBzbyB0aGUgbmlsIHRlc3QgSVMgdGhlIGxvb2t1cCByZXN1bHQgYW5kIG5vdCBhCi8vIGRlZmVuc2l2ZSBleHRyYSDigJQgZXZlcnkgdmFsdWUgdGhpcyByZWFsbSBzdG9yZXMgaXMgYSBub24tbmlsIHBvaW50ZXIuCmZ1bmMgcmVnKG93bmVyIGFkZHJlc3MpICgqcmVnaXN0ZXIsIGJvb2wpIHsKCXYgOj0gcmVncy5HZXQob3duZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiB2LigqcmVnaXN0ZXIpLCB0cnVlCn0KCmZ1bmMgbXVzdFJlZyhvd25lciBhZGRyZXNzKSAqcmVnaXN0ZXIgewoJciwgb2sgOj0gcmVnKG93bmVyKQoJaWYgIW9rIHsKCQlwYW5pYygiYXNzZXRzOiBubyByZWdpc3RlciBmb3IgIiArIG93bmVyLlN0cmluZygpKQoJfQoJcmV0dXJuIHIKfQoKZnVuYyBtdXN0QXNzZXQociAqcmVnaXN0ZXIsIGlkIHVpbnQ2NCkgKmFzc2V0IHsKCXYgOj0gci5hc3NldHMuR2V0KGlkS2V5KGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygiYXNzZXRzOiBubyBhc3NldCAiICsgc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkpCgl9CglyZXR1cm4gdi4oKmFzc2V0KQp9CgovLyBpZEtleSBlbmNvZGVzIGFuIGlkIHNvIHRoYXQgYXZsJ3MgbGV4aWNhbCBrZXkgb3JkZXIgbWF0Y2hlcyBudW1lcmljIGlkCi8vIG9yZGVyIOKAlCB0aGUgc2FtZSBlbmNvZGluZyBwL2pvdXJuYWwgdXNlcyBmb3IgZW50cnkgaWRzLCBhbmQgZm9yIHRoZSBzYW1lCi8vIHJlYXNvbjogd2l0aG91dCBpdCwgUmVuZGVyIHdvdWxkIGxpc3QgYXNzZXQgMTAgYmVmb3JlIGFzc2V0IDIuIDIwIGRpZ2l0cwovLyBjb3ZlcnMgbWF0aC5NYXhVaW50NjQuCmZ1bmMgaWRLZXkoaWQgdWludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKQoJY29uc3Qgd2lkdGggPSAyMAoJaWYgbGVuKHMpID49IHdpZHRoIHsKCQlyZXR1cm4gcwoJfQoJcmV0dXJuIHplcm9zWzp3aWR0aC1sZW4ocyldICsgcwp9Cgpjb25zdCB6ZXJvcyA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIKCmZ1bmMgY2hlY2tMYWJlbChsYWJlbCBzdHJpbmcpIHsKCWlmIHN0cmluZ3MuVHJpbVNwYWNlKGxhYmVsKSA9PSAiIiB7CgkJcGFuaWMoImFzc2V0czogbGFiZWwgbXVzdCBub3QgYmUgYmxhbmsiKQoJfQoJaWYgbGVuKGxhYmVsKSA+IE1heExhYmVsTGVuIHsKCQlwYW5pYygiYXNzZXRzOiBsYWJlbCB0b28gbG9uZywgbWF4ICIgKyBzdHJjb252Lkl0b2EoTWF4TGFiZWxMZW4pKQoJfQp9CgpmdW5jIGNoZWNrUGVyaW9kKHBlcmlvZEJsb2NrcyBpbnQ2NCkgewoJaWYgcGVyaW9kQmxvY2tzIDwgTWluUGVyaW9kQmxvY2tzIHsKCQlwYW5pYygiYXNzZXRzOiBwZXJpb2RCbG9ja3MgbXVzdCBiZSBhdCBsZWFzdCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoTWluUGVyaW9kQmxvY2tzLCAxMCkgKyAiIGJsb2NrcyIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXcml0ZXMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBPcGVuUmVnaXN0ZXIgY3JlYXRlcyB0aGUgY2FsbGVyJ3MgcmVnaXN0ZXIgYW5kIG9wZW5zIGl0cyB0d28gYWNjb3VudHMuIEl0Ci8vIHBhbmljcyBpZiB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIG9uZS4KLy8KLy8gVGhlIGNoYXJ0IGlzIG9wZW5lZCBIRVJFIHJhdGhlciB0aGFuIG9uIGRlbWFuZCwgYW5kIHRoZSBib29rIGlzIGNyZWF0ZWQKLy8gd2l0aCBhIGNhcCBvZiBleGFjdGx5IHR3byBhY2NvdW50cy4gQm90aCBmYWN0cyBhcmUgbG9hZC1iZWFyaW5nOiB0aGV5IGFyZQovLyB3aHkgdGhpcyByZWFsbSBpcyBpdHMgYm9vaydzIG9ubHkgd3JpdGVyIGFuZCB3aHkgdGhlIENyb3NzRm9vdCBpZGVudGl0eSBpcwovLyBleGFjdCByYXRoZXIgdGhhbiBhcHByb3hpbWF0ZS4KZnVuYyBPcGVuUmVnaXN0ZXIoY3VyIHJlYWxtKSB7CglyZWZ1c2VDb2lucyhjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWtleSA6PSBvd25lci5TdHJpbmcoKQoJaWYgcmVncy5IYXMoa2V5KSB7CgkJcGFuaWMoImFzc2V0czogdGhpcyBhZGRyZXNzIGFscmVhZHkgaGFzIGEgcmVnaXN0ZXIiKQoJfQoKCWIgOj0gam91cm5hbC5NdXN0TmV3KDIsIE1heEVudHJpZXNQZXJSZWdpc3RlcikKCWIuTXVzdE9wZW4oRXhwZW5zZUNvZGUsIEV4cGVuc2VOYW1lLCBqb3VybmFsLkV4cGVuc2UpCgliLk11c3RPcGVuKEFjY3VtQ29kZSwgQWNjdW1OYW1lLCBqb3VybmFsLkFzc2V0KQoKCXJlZ3MuU2V0KGtleSwgJnJlZ2lzdGVyewoJCWJvb2s6ICAgICBiLAoJCWFzc2V0czogICBhdmwuTmV3VHJlZSgpLAoJCW5leHRJRDogICAxLAoJCW9wZW5lZEF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9KQoJcmVnQ291bnQrKwp9CgovLyBQbGFjZSByZWNvcmRzIGEgc3RyYWlnaHQtbGluZSBhc3NldCBwbGFjZWQgaW4gc2VydmljZSBhdCB0aGUgY3VycmVudAovLyBoZWlnaHQsIGFuZCByZXR1cm5zIGl0cyBpZC4KLy8KLy8gTm90aGluZyBpcyBwb3N0ZWQ6IGF0IHBsYWNlbWVudCB6ZXJvIHBlcmlvZHMgaGF2ZSBjb21wbGV0ZWQsIHNvIHRoZSBjaGFyZ2UKLy8gaXMgemVybyBhbmQgYSB6ZXJvIHBvc3RpbmcgaXMgbm90IGEgdmFsaWQgam91cm5hbCBlbnRyeS4gVGhlIGZpcnN0IGNoYXJnZQovLyBiZWNvbWVzIGJvb2thYmxlIGF0IHBsYWNlZEF0ICsgcGVyaW9kQmxvY2tzLgpmdW5jIFBsYWNlKGN1ciByZWFsbSwgbGFiZWwgc3RyaW5nLCBjb3N0LCBzYWx2YWdlIGludDY0LCBsaWZlIGludDMyLCBwZXJpb2RCbG9ja3MgaW50NjQpIHVpbnQ2NCB7CglyZWZ1c2VDb2lucyhjdXIpCglyIDo9IG11c3RPd25SZWdpc3RlcihjdXIpCgljaGVja0xhYmVsKGxhYmVsKQoJY2hlY2tQZXJpb2QocGVyaW9kQmxvY2tzKQoKCXMsIGVyciA6PSBkZXByZWNpYXRpb24uTmV3KGNvc3QsIHNhbHZhZ2UsIGxpZmUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gcGxhY2UociwgbGFiZWwsIHMsIHBlcmlvZEJsb2NrcykKfQoKLy8gUGxhY2VEZWNsaW5pbmcgcmVjb3JkcyBhIGRlY2xpbmluZy1iYWxhbmNlIGFzc2V0IGNoYXJnaW5nIG51bS9kZW4gb2YgdGhlCi8vIHJlbWFpbmluZyBjYXJyeWluZyBhbW91bnQgZWFjaCBwZXJpb2QuIERvdWJsZS1kZWNsaW5pbmcgb3ZlciBhIDEwLXBlcmlvZAovLyBsaWZlIGlzIG51bT0yLCBkZW49MTAuCi8vCi8vIFR3byBwcm9wZXJ0aWVzIG9mIHRoYXQgbWV0aG9kIGFyZSBpbmhlcml0ZWQgZnJvbSBwL2RlcHJlY2lhdGlvbiBhbmQgYXJlCi8vIHZpc2libGUgaW4gdGhpcyByZWFsbSdzIG51bWJlcnMsIHNvIHRoZXkgYXJlIHJlcGVhdGVkIGhlcmUuIFRoZSBmaW5hbAovLyBwZXJpb2QgYWJzb3JicyB3aGF0ZXZlciByZW1haW5zIGFib3ZlIHNhbHZhZ2UsIHNvIHRoZSBsYXN0IGNoYXJnZSBjYW4gYmUKLy8gbXVjaCBsYXJnZXIgdGhhbiB0aGUgb25lIGJlZm9yZSBpdC4gQW5kIGEgc2NoZWR1bGUgd2hvc2UgcGVyLXBlcmlvZCBjaGFyZ2UKLy8gdHJ1bmNhdGVzIHRvIHplcm8gKGNvc3QqbnVtIDwgZGVuKSBuZXZlciBkZXByZWNpYXRlcyB1bnRpbCB0aGF0IGZpbmFsCi8vIHBlcmlvZCDigJQgW0R1ZV0gcmVhZHMgMCBmb3IgaXRzIHdob2xlIGxpZmUsIHdoaWNoIGlzIHRoZSBzY2hlZHVsZSBiZWhhdmluZwovLyBhcyBzcGVjaWZpZWQgYW5kIG5vdCBhIHN0dWNrIHJlZ2lzdGVyLgpmdW5jIFBsYWNlRGVjbGluaW5nKGN1ciByZWFsbSwgbGFiZWwgc3RyaW5nLCBjb3N0LCBzYWx2YWdlIGludDY0LCBsaWZlIGludDMyLCBudW0sIGRlbiwgcGVyaW9kQmxvY2tzIGludDY0KSB1aW50NjQgewoJcmVmdXNlQ29pbnMoY3VyKQoJciA6PSBtdXN0T3duUmVnaXN0ZXIoY3VyKQoJY2hlY2tMYWJlbChsYWJlbCkKCWNoZWNrUGVyaW9kKHBlcmlvZEJsb2NrcykKCglzLCBlcnIgOj0gZGVwcmVjaWF0aW9uLk5ld0RlY2xpbmluZyhjb3N0LCBzYWx2YWdlLCBsaWZlLCBudW0sIGRlbikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBwbGFjZShyLCBsYWJlbCwgcywgcGVyaW9kQmxvY2tzKQp9CgpmdW5jIHBsYWNlKHIgKnJlZ2lzdGVyLCBsYWJlbCBzdHJpbmcsIHMgZGVwcmVjaWF0aW9uLlNjaGVkdWxlLCBwZXJpb2RCbG9ja3MgaW50NjQpIHVpbnQ2NCB7CglpZiByLmFzc2V0cy5TaXplKCkgPj0gTWF4QXNzZXRzUGVyUmVnaXN0ZXIgewoJCXBhbmljKCJhc3NldHM6IHJlZ2lzdGVyIGlzIGZ1bGwsIG1heCAiICsgc3RyY29udi5JdG9hKE1heEFzc2V0c1BlclJlZ2lzdGVyKSkKCX0KCWF0IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoKCS8vIEVzdGFibGlzaCB0aGUgZW5kLW9mLWxpZmUgYXJpdGhtZXRpYyBOT1cgc28gRnVsbHlEZXByZWNpYXRlZEF0IGlzIGEKCS8vIHRvdGFsIHJlYWQgZm9yIHRoZSBhc3NldCdzIHdob2xlIGxpZmUuIEF0IGNoYWluIGhlaWdodHMgaXQgY2Fubm90CgkvLyBvdmVyZmxvdywgYW5kIHRoYXQgaXMgZXhhY3RseSB3aHkgY2hlY2tpbmcgaXMgY2hlYXAgYW5kIG9taXR0aW5nIGl0CgkvLyB3b3VsZCBiZSBhIGd1ZXNzLgoJaWYgXywgZXJyIDo9IHMuRnVsbHlEZXByZWNpYXRlZEF0KGF0LCBwZXJpb2RCbG9ja3MpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaWQgOj0gci5uZXh0SUQKCXIubmV4dElEKysKCXIuYXNzZXRzLlNldChpZEtleShpZCksICZhc3NldHsKCQlpZDogICAgICAgaWQsCgkJbGFiZWw6ICAgIGxhYmVsLAoJCXNjaGVkOiAgICBzLAoJCXBsYWNlZEF0OiBhdCwKCQlwZXJpb2Q6ICAgcGVyaW9kQmxvY2tzLAoJfSkKCXJldHVybiBpZAp9CgovLyBCb29rVGhyb3VnaCBwb3N0cyB0aGUgZGVwcmVjaWF0aW9uIGNoYXJnZSBmb3IgZXZlcnkgcGVyaW9kIHRoYXQgaGFzCi8vIGNvbXBsZXRlZCBzaW5jZSB0aGlzIGFzc2V0IHdhcyBsYXN0IGJvb2tlZCwgYW5kIHJldHVybnMgdGhlIHBlcmlvZCB0aGUKLy8gYXNzZXQgaXMgbm93IGJvb2tlZCB0aHJvdWdoLgovLwovLyBJdCBpcyBJREVNUE9URU5UOiBjYWxsaW5nIGl0IHR3aWNlIGluIG9uZSBibG9jaywgb3IgdHdpY2UgaW4gb25lIHBlcmlvZCwKLy8gcG9zdHMgb25jZS4gQ2FsbGluZyBpdCBhZnRlciBza2lwcGluZyB0ZW4gcGVyaW9kcyBwb3N0cyB0aGUgd2hvbGUgc3BhbiBhcwovLyBvbmUgZW50cnksIGZvciB0aGUgc2FtZSB0b3RhbCBhIGNhbGxlciB3aG8gcmFuIGl0IGV2ZXJ5IHBlcmlvZCB3b3VsZCBoYXZlCi8vIHJlYWNoZWQg4oCUIHAvZGVwcmVjaWF0aW9uJ3MgQ2hhcmdlIHRlbGVzY29wZXMgZXhhY3RseSwgc28gYm9va2luZyBjYWRlbmNlCi8vIGNhbm5vdCBjaGFuZ2UgdGhlIHRvdGFsIGJvb2tlZC4KLy8KLy8gQSBaRVJPIGNoYXJnZSBhZHZhbmNlcyB0aGUgbWFyayBhbmQgcG9zdHMgbm90aGluZy4gVGhhdCBpcyBub3QgYSBzaG9ydGN1dDoKLy8gam91cm5hbCByZWplY3RzIGEgcG9zdGluZyBvZiB6ZXJvIChFcnJJbnZhbGlkQW1vdW50KSwgd2hpbGUgYSBkZWdlbmVyYXRlCi8vIGRlY2xpbmluZyBzY2hlZHVsZSBsZWdpdGltYXRlbHkgY2hhcmdlcyB6ZXJvLCBhbmQgdGhlIGludmFyaWFudCBpcwovLyBwcmVzZXJ2ZWQgZXhhY3RseSBiZWNhdXNlIEFjY3VtdWxhdGVkQXQgaXMgZXF1YWwgYXQgYm90aCBtYXJrcyBpbiBwcmVjaXNlbHkKLy8gdGhhdCBjYXNlLgovLwovLyBQYW5pY3MgaWYgdGhlIGFzc2V0IGlzIHJldGlyZWQsIG9yIGlmIHRoZSBib29rIGlzIGZ1bGwuCmZ1bmMgQm9va1Rocm91Z2goY3VyIHJlYWxtLCBpZCB1aW50NjQpIGludDMyIHsKCXJlZnVzZUNvaW5zKGN1cikKCXIgOj0gbXVzdE93blJlZ2lzdGVyKGN1cikKCWEgOj0gbXVzdEFzc2V0KHIsIGlkKQoJaWYgYS5yZXRpcmVkIHsKCQlwYW5pYygiYXNzZXRzOiBhc3NldCAiICsgc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkgKwoJCQkiIGlzIHJldGlyZWQgYW5kIGFjY3J1ZXMgbm8gZnVydGhlciBjaGFyZ2VzIikKCX0KCW4gOj0gZWxhcHNlZChhKQoJaWYgbiA8PSBhLmJvb2tlZCB7CgkJcmV0dXJuIGEuYm9va2VkCgl9Cglib29rU3BhbihyLCBhLCBuKQoJcmV0dXJuIGEuYm9va2VkCn0KCi8vIFJldGlyZSBib29rcyB0aGUgYXNzZXQgdGhyb3VnaCB0aGUgY3VycmVudCBwZXJpb2QgYW5kIHRoZW4gc3RvcHMgaXQKLy8gcGVybWFuZW50bHkuIEl0IHJldHVybnMgdGhlIGZpbmFsIGFtb3VudCBwb3N0ZWQsIHdoaWNoIG1heSBiZSB6ZXJvLgovLwovLyBUaGUgYm9va2luZyBpcyBub3Qgb3B0aW9uYWwgYW5kIG5vdCBzZXBhcmFibGU6IHNlZSB0aGUgcGFja2FnZSBkb2MuIEFmdGVyCi8vIHRoaXMgY2FsbCB0aGUgYXNzZXQgYWNjcnVlcyBub3RoaW5nLCBCb29rVGhyb3VnaCBvbiBpdCBwYW5pY3MsIGFuZCBldmVyeQovLyBoaXN0b3JpY2FsIGNoYXJnZSBzdGFuZHMuCi8vCi8vIEFuIGFzc2V0IGFscmVhZHkgYXQgb3IgcGFzdCB0aGUgZW5kIG9mIGl0cyBsaWZlIHN0aWxsIHJldGlyZXMgY2xlYW5seSDigJQKLy8gQ2FycnlpbmdBdCBjbGFtcHMgYXQgU2FsdmFnZSBmcm9tIExpZmUgb253YXJkcywgc28gdGhlIGZpbmFsIGNoYXJnZSBpcwovLyB3aGF0ZXZlciBoYWQgbm90IHlldCBiZWVuIGJvb2tlZCBhbmQgaXMgemVybyBpZiBub3RoaW5nIGhhZC4KLy8KLy8gSVQgUEFOSUNTIElGIFRIRSBCT09LIElTIEZVTEwgQU5EIEEgQ0hBUkdFIElTIERVRSwgQU5EIFRIQVQgUkVGVVNBTCBJUwovLyBQRVJNQU5FTlQuIFRoZSBib29raW5nIGlzIG5vdCBzZXBhcmFibGUsIGpvdXJuYWwncyBQb3N0IGlzIGZhaWwtY2xvc2VkCi8vIGJlZm9yZSBpdCB3cml0ZXMsIGFuZCBhIHBhbmljIHJldmVydHMgdGhlIHdob2xlIHRyYW5zYWN0aW9uIOKAlCBzbyBhbiBhc3NldAovLyB3aXRoIGFuIHVuYm9va2VkIGNoYXJnZSBvbiBhIHJlZ2lzdGVyIHRoYXQgaGFzIHJlYWNoZWQKLy8gTWF4RW50cmllc1BlclJlZ2lzdGVyIGNhbiBuZXZlciBiZSByZXRpcmVkLiBCb29rVGhyb3VnaCdzIGlkZW50aWNhbCBwYW5pYwovLyBpcyBoYXJtbGVzcyAodGhlIGNoYXJnZSBzaW1wbHkgc3RheXMgdW5ib29rZWQgYW5kIGNhbiBiZSBib29rZWQgbGF0ZXIgaWYKLy8gdGhlIGJvb2sgZXZlciBoYXMgcm9vbSwgd2hpY2ggaXQgbmV2ZXIgd2lsbCwgdGhlcmUgYmVpbmcgbm8gYXJjaGl2ZSk7IHRoaXMKLy8gb25lIHN0cmFuZHMgdGhlIGFzc2V0IHBlcm1hbmVudGx5IGluIHRoZSBsaXZlIHN0YXRlLgovLwovLyBJdCBpcyByZWFjaGFibGUsIGFuZCB0aGUgYXJpdGhtZXRpYyBpcyB0aGUgc2FtZSBvbmUgTWF4RW50cmllc1BlclJlZ2lzdGVyCi8vIGNhcnJpZXM6IGFib3V0IHNldmVuIE1heExpZmUgYXNzZXRzIGJvb2tlZCBwZXJpb2QtYnktcGVyaW9kIGZpbGwgdGhlIGJvb2suCi8vIFRoZSByZW1lZHkgaXMgdGhlIHNhbWUgb25lIHRoZSBlbnRyeSBjYXAgYWxyZWFkeSBoYXMg4oCUIGEgc2Vjb25kIHJlZ2lzdGVyCi8vIHVuZGVyIGEgc2Vjb25kIGFkZHJlc3Mg4oCUIGFuZCBpdCBoYXMgdG8gYmUgYXJyYW5nZWQgQkVGT1JFIHRoZSBib29rIGZpbGxzLAovLyB3aGljaCBpcyB3aHkgQ2FwYWNpdHkgaXMgZXhwb3J0ZWQgYW5kIHdoeSB0aGUgcmVnaXN0ZXIgcGFnZSBwcmludHMgdGhlCi8vIGVudHJ5IGhlYWRyb29tLiBNYWtpbmcgUmV0aXJlIGZyZWV6ZSB3aXRob3V0IGJvb2tpbmcgd291bGQgYmUgdGhlIG9idmlvdXMKLy8gYWx0ZXJuYXRpdmUgYW5kIGlzIHJlZnVzZWQ6IGl0IHdvdWxkIGZvcmZlaXQgYSBjaGFyZ2UgdGhhdCB3YXMgZ2VudWluZWx5Ci8vIGluY3VycmVkLCB3aGljaCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcmVhbG0gZXhpc3RzIG5vdCB0byBkby4KZnVuYyBSZXRpcmUoY3VyIHJlYWxtLCBpZCB1aW50NjQpIGludDY0IHsKCXJlZnVzZUNvaW5zKGN1cikKCXIgOj0gbXVzdE93blJlZ2lzdGVyKGN1cikKCWEgOj0gbXVzdEFzc2V0KHIsIGlkKQoJaWYgYS5yZXRpcmVkIHsKCQlwYW5pYygiYXNzZXRzOiBhc3NldCAiICsgc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkgKyAiIGlzIGFscmVhZHkgcmV0aXJlZCIpCgl9CgoJYmVmb3JlIDo9IGEuYW1vdW50CglpZiBuIDo9IGVsYXBzZWQoYSk7IG4gPiBhLmJvb2tlZCB7CgkJYm9va1NwYW4ociwgYSwgbikKCX0KCWEucmV0aXJlZCA9IHRydWUKCWEucmV0aXJlZEF0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyZXR1cm4gYS5hbW91bnQgLSBiZWZvcmUKfQoKLy8gYm9va1NwYW4gcG9zdHMgdGhlIGNoYXJnZSBmb3IgKGEuYm9va2VkLCBuXSBhbmQgYWR2YW5jZXMgdGhlIG1hcmsuIEl0IGlzCi8vIHRoZSBvbmx5IHdyaXRlciBvZiBhLmFtb3VudCBhbmQgYS5ib29rZWQsIGFuZCB0aGUgb25seSBjYWxsZXIgb2YgUG9zdCDigJQKLy8gd2hpY2ggaXMgd2hhdCBtYWtlcyBDcm9zc0Zvb3QgYW4gZXhhY3QgaWRlbnRpdHkgcmF0aGVyIHRoYW4gYSBoZXVyaXN0aWMuCmZ1bmMgYm9va1NwYW4ociAqcmVnaXN0ZXIsIGEgKmFzc2V0LCBuIGludDMyKSB7CglhbXQsIGVyciA6PSBhLnNjaGVkLkNoYXJnZShhLmJvb2tlZCwgbikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWlmIGFtdCA+IDAgewoJCW1lbW8gOj0gImRlcHJlY2lhdGlvbjogYXNzZXQgIiArIHN0cmNvbnYuRm9ybWF0VWludChhLmlkLCAxMCkgKwoJCQkiLCBwZXJpb2RzICIgKyBzdHJjb252LkZvcm1hdEludChpbnQ2NChhLmJvb2tlZCksIDEwKSArCgkJCSItIiArIHN0cmNvbnYuRm9ybWF0SW50KGludDY0KG4pLCAxMCkKCQlwb3N0aW5ncyA6PSBbXWpvdXJuYWwuUG9zdGluZ3sKCQkJe0FjY291bnQ6IEV4cGVuc2VDb2RlLCBTaWRlOiBqb3VybmFsLkRlYml0LCBBbW91bnQ6IGFtdH0sCgkJCXtBY2NvdW50OiBBY2N1bUNvZGUsIFNpZGU6IGpvdXJuYWwuQ3JlZGl0LCBBbW91bnQ6IGFtdH0sCgkJfQoJCWlmIF8sIGVyciA6PSByLmJvb2suUG9zdChydW50aW1lLkNoYWluSGVpZ2h0KCksIG1lbW8sIHBvc3RpbmdzKTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9CgkJLy8gYS5hbW91bnQgKyBhbXQgY2Fubm90IG92ZXJmbG93OiB0aGUgc3VtIG9mIHRlbGVzY29waW5nIGNoYXJnZXMKCQkvLyBmcm9tIHBlcmlvZCAwIGlzIEFjY3VtdWxhdGVkQXQobiksIHdoaWNoIGlzIGF0IG1vc3QgQmFzaXMsCgkJLy8gd2hpY2ggaXMgYXQgbW9zdCBDb3N0LgoJCWEuYW1vdW50ICs9IGFtdAoJfQoJYS5ib29rZWQgPSBuCn0KCi8vIGVsYXBzZWQgaXMgdGhlIHdob2xlIHBlcmlvZHMgY29tcGxldGVkIGZvciBhbiBhc3NldCBhdCB0aGUgY3VycmVudCBoZWlnaHQuCi8vCi8vIFBlcmlvZHMgY2Fubm90IGZhaWwgaGVyZTogcGVyaW9kIGlzIGF0IGxlYXN0IE1pblBlcmlvZEJsb2NrcyAoPiAwKSwgdGhlCi8vIGN1cnJlbnQgaGVpZ2h0IGlzIG5ldmVyIGJlbG93IHBsYWNlZEF0IGJlY2F1c2UgcGxhY2VkQXQgd2FzIHRoZSBoZWlnaHQgYXQKLy8gcGxhY2VtZW50IGFuZCBoZWlnaHRzIGRvIG5vdCBkZWNyZWFzZSwgYW5kIHRoZSBxdW90aWVudCBvZiB0d28gY2hhaW4KLy8gaGVpZ2h0cyBjYW5ub3QgZXhjZWVkIG1heEludDMyLiBUaGUgZXJyb3IgaXMgc3RpbGwgcmVhZCBhbmQgcGFuaWNrZWQgb24KLy8gcmF0aGVyIHRoYW4gZGlzY2FyZGVkLCBiZWNhdXNlIGV2ZXJ5IG9uZSBvZiB0aG9zZSB0aHJlZSBmYWN0cyBpcyBhbgovLyBhcmd1bWVudCBhbmQgbm90IGEgY2hlY2suCmZ1bmMgZWxhcHNlZChhICphc3NldCkgaW50MzIgewoJbiwgZXJyIDo9IGRlcHJlY2lhdGlvbi5QZXJpb2RzKGEucGxhY2VkQXQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgYS5wZXJpb2QpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gbgp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVhZHMg4oCUIGFsbCBmcmVlLCBhbGwgdGFraW5nIGFuIG93bmVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gSGFzUmVnaXN0ZXIgcmVwb3J0cyB3aGV0aGVyIGFuIGFkZHJlc3MgaGFzIGEgcmVnaXN0ZXIuCmZ1bmMgSGFzUmVnaXN0ZXIob3duZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiByZWdzLkhhcyhvd25lci5TdHJpbmcoKSkgfQoKLy8gUmVnaXN0ZXJzIGlzIGhvdyBtYW55IHJlZ2lzdGVycyBleGlzdC4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHdheSB0bwovLyBlbnVtZXJhdGUgdGhlbSBvciB0byBhZ2dyZWdhdGUgYWNyb3NzIHRoZW06IHN1Y2ggYSB0b3RhbCB3b3VsZCBiZSB0aGUgc3VtCi8vIG9mIGV2ZXJ5IHN0cmFuZ2VyJ3Mgc2VsZi1yZXBvcnRlZCBjb3N0IGZpZ3VyZXMuCmZ1bmMgUmVnaXN0ZXJzKCkgaW50IHsgcmV0dXJuIHJlZ0NvdW50IH0KCi8vIE9wZW5lZEF0IGlzIHRoZSBoZWlnaHQgYSByZWdpc3RlciB3YXMgY3JlYXRlZC4KZnVuYyBPcGVuZWRBdChvd25lciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBtdXN0UmVnKG93bmVyKS5vcGVuZWRBdCB9CgovLyBBc3NldENvdW50IGlzIGhvdyBtYW55IGFzc2V0cyBhIHJlZ2lzdGVyIGhvbGRzLCByZXRpcmVkIG9uZXMgaW5jbHVkZWQuCmZ1bmMgQXNzZXRDb3VudChvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbXVzdFJlZyhvd25lcikuYXNzZXRzLlNpemUoKSB9CgovLyBIZWlnaHQgaXMgdGhlIGNoYWluIGhlaWdodCB0aGlzIHJlYWxtIGRhdGVzIGVudHJpZXMgYW5kIHBlcmlvZHMgd2l0aC4KLy8gRXhwb3NlZCBzbyBhIGNhbGxlciBjYW4gcHJlZGljdCB3aGF0IEJvb2tUaHJvdWdoIHdpbGwgYm9vay4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gQXNzZXRJbmZvIHJlcG9ydHMgYW4gYXNzZXQncyB3aG9sZSBzdG9yZWQgc3RhdGUgaW4gb25lIHJlYWQuCi8vCi8vIG1ldGhvZCBpcyAic3RyYWlnaHQtbGluZSIgb3IgImRlY2xpbmluZy1iYWxhbmNlIjsgcmF0ZU51bSBhbmQgcmF0ZURlbiBhcmUKLy8gMCBmb3IgYSBzdHJhaWdodC1saW5lIGFzc2V0LgpmdW5jIEFzc2V0SW5mbyhvd25lciBhZGRyZXNzLCBpZCB1aW50NjQpICgKCWxhYmVsIHN0cmluZywKCWNvc3QsIHNhbHZhZ2UgaW50NjQsCglsaWZlIGludDMyLAoJbWV0aG9kIHN0cmluZywKCXJhdGVOdW0sIHJhdGVEZW4gaW50NjQsCglwbGFjZWRBdCwgcGVyaW9kQmxvY2tzIGludDY0LAoJYm9va2VkVGhyb3VnaCBpbnQzMiwKCWJvb2tlZEFtb3VudCBpbnQ2NCwKCXJldGlyZWQgYm9vbCwKCXJldGlyZWRBdCBpbnQ2NCwKKSB7CglhIDo9IG11c3RBc3NldChtdXN0UmVnKG93bmVyKSwgaWQpCglyZXR1cm4gYS5sYWJlbCwgYS5zY2hlZC5Db3N0LCBhLnNjaGVkLlNhbHZhZ2UsIGEuc2NoZWQuTGlmZSwKCQlhLnNjaGVkLk1ldGhvZC5TdHJpbmcoKSwgYS5zY2hlZC5SYXRlTnVtLCBhLnNjaGVkLlJhdGVEZW4sCgkJYS5wbGFjZWRBdCwgYS5wZXJpb2QsIGEuYm9va2VkLCBhLmFtb3VudCwgYS5yZXRpcmVkLCBhLnJldGlyZWRBdAp9CgovLyBMYWJlbCBpcyBhbiBhc3NldCdzIGxhYmVsLgpmdW5jIExhYmVsKG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RBc3NldChtdXN0UmVnKG93bmVyKSwgaWQpLmxhYmVsIH0KCi8vIEJvb2tlZFRocm91Z2ggaXMgdGhlIGhpZ2gtd2F0ZXIgbWFyazogdGhlIHdob2xlIHBlcmlvZHMgYWxyZWFkeSBjaGFyZ2VkLgpmdW5jIEJvb2tlZFRocm91Z2gob3duZXIgYWRkcmVzcywgaWQgdWludDY0KSBpbnQzMiB7CglyZXR1cm4gbXVzdEFzc2V0KG11c3RSZWcob3duZXIpLCBpZCkuYm9va2VkCn0KCi8vIEJvb2tlZEFtb3VudCBpcyB0aGUgY3VtdWxhdGl2ZSBleHBlbnNlIHBvc3RlZCBmb3Igb25lIGFzc2V0LgpmdW5jIEJvb2tlZEFtb3VudChvd25lciBhZGRyZXNzLCBpZCB1aW50NjQpIGludDY0IHsKCXJldHVybiBtdXN0QXNzZXQobXVzdFJlZyhvd25lciksIGlkKS5hbW91bnQKfQoKLy8gUGVyaW9kc0VsYXBzZWQgaXMgdGhlIHdob2xlIHBlcmlvZHMgY29tcGxldGVkIGZvciBhbiBhc3NldCBhdCB0aGUgY3VycmVudAovLyBoZWlnaHQsIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBiZWVuIGJvb2tlZC4gRm9yIGEgcmV0aXJlZCBhc3NldCB0aGlzCi8vIGtlZXBzIGluY3JlYXNpbmcgd2hpbGUgQm9va2VkVGhyb3VnaCBkb2VzIG5vdCwgd2hpY2ggaXMgdGhlIGludGVuZGVkCi8vIGRpZmZlcmVuY2UgYW5kIGlzIHdoeSBib3RoIGFyZSBleHBvcnRlZC4KZnVuYyBQZXJpb2RzRWxhcHNlZChvd25lciBhZGRyZXNzLCBpZCB1aW50NjQpIGludDMyIHsKCXJldHVybiBlbGFwc2VkKG11c3RBc3NldChtdXN0UmVnKG93bmVyKSwgaWQpKQp9CgovLyBEdWUgaXMgdGhlIGNoYXJnZSBCb29rVGhyb3VnaCB3b3VsZCBwb3N0IGZvciBhbiBhc3NldCByaWdodCBub3cuIEl0IGlzIDAKLy8gZm9yIGEgcmV0aXJlZCBhc3NldCwgZm9yIGFuIGFzc2V0IHdpdGggbm8gbmV3bHktY29tcGxldGVkIHBlcmlvZCwgYW5kIGZvciBhCi8vIGRlZ2VuZXJhdGUgZGVjbGluaW5nIHNjaGVkdWxlIHRoYXQgaGFzIG5vdCByZWFjaGVkIGl0cyBmaW5hbCBwZXJpb2QuCmZ1bmMgRHVlKG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCkgaW50NjQgewoJYSA6PSBtdXN0QXNzZXQobXVzdFJlZyhvd25lciksIGlkKQoJaWYgYS5yZXRpcmVkIHsKCQlyZXR1cm4gMAoJfQoJbiA6PSBlbGFwc2VkKGEpCglpZiBuIDw9IGEuYm9va2VkIHsKCQlyZXR1cm4gMAoJfQoJYW10LCBlcnIgOj0gYS5zY2hlZC5DaGFyZ2UoYS5ib29rZWQsIG4pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYW10Cn0KCi8vIENhcnJ5aW5nQXQgaXMgYW4gYXNzZXQncyBjYXJyeWluZyBhbW91bnQgYWZ0ZXIgbiB3aG9sZSBwZXJpb2RzOiBDb3N0IGF0Ci8vIG4gPD0gMCwgU2FsdmFnZSBhdCBldmVyeSBuID49IExpZmUuIEl0IHJlYWRzIHRoZSBTQ0hFRFVMRSBhbmQgaXMKLy8gaW5kZXBlbmRlbnQgb2Ygd2hhdCBoYXMgYmVlbiBib29rZWQuCmZ1bmMgQ2FycnlpbmdBdChvd25lciBhZGRyZXNzLCBpZCB1aW50NjQsIG4gaW50MzIpIGludDY0IHsKCWMsIGVyciA6PSBtdXN0QXNzZXQobXVzdFJlZyhvd25lciksIGlkKS5zY2hlZC5DYXJyeWluZ0F0KG4pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYwp9CgovLyBBY2N1bXVsYXRlZEF0IGlzIENvc3QgLSBDYXJyeWluZ0F0KG4pOiB3aGF0IHRoZSBjb250cmEtYXNzZXQgYmFsYW5jZSBmb3IKLy8gb25lIGFzc2V0IFNIT1VMRCBiZSBvbmNlIHBlcmlvZCBuIGlzIGJvb2tlZC4KZnVuYyBBY2N1bXVsYXRlZEF0KG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCwgbiBpbnQzMikgaW50NjQgewoJYWNjLCBlcnIgOj0gbXVzdEFzc2V0KG11c3RSZWcob3duZXIpLCBpZCkuc2NoZWQuQWNjdW11bGF0ZWRBdChuKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGFjYwp9CgovLyBGdWxseURlcHJlY2lhdGVkQXQgaXMgdGhlIGhlaWdodCBhdCB3aGljaCBhbiBhc3NldCBmaXJzdCBjYXJyaWVzIG9ubHkgaXRzCi8vIHNhbHZhZ2UgdmFsdWU6IHBsYWNlZEF0ICsgTGlmZSpwZXJpb2RCbG9ja3MuIFZhbGlkYXRlZCBhdCBwbGFjZW1lbnQsIHNvIGl0Ci8vIGNhbm5vdCBmYWlsIGFmdGVyd2FyZHMuCmZ1bmMgRnVsbHlEZXByZWNpYXRlZEF0KG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCkgaW50NjQgewoJYSA6PSBtdXN0QXNzZXQobXVzdFJlZyhvd25lciksIGlkKQoJdCwgZXJyIDo9IGEuc2NoZWQuRnVsbHlEZXByZWNpYXRlZEF0KGEucGxhY2VkQXQsIGEucGVyaW9kKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHQKfQoKLy8gSXNSZXRpcmVkIHJlcG9ydHMgd2hldGhlciBhbiBhc3NldCBoYXMgYmVlbiByZXRpcmVkLgpmdW5jIElzUmV0aXJlZChvd25lciBhZGRyZXNzLCBpZCB1aW50NjQpIGJvb2wgewoJcmV0dXJuIG11c3RBc3NldChtdXN0UmVnKG93bmVyKSwgaWQpLnJldGlyZWQKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlYWRzIOKAlCB0aGUgYm9vawovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEJhbGFuY2UgaXMgYW4gYWNjb3VudCdzIGJhbGFuY2UgaW4gaXRzIE5PUk1BTCBkaXJlY3Rpb24uIEZvciAxNTkwIHRoYXQgaXMKLy8gZGViaXQtbm9ybWFsIGFuZCBzbyByZWFkcyBuZWdhdGl2ZTsgW0FjY3VtdWxhdGVkQ3JlZGl0XSBpcyB0aGUgZmlndXJlIGEKLy8gcmVhZGVyIG9mIGEgY29udHJhLWFzc2V0IHdhbnRzLgpmdW5jIEJhbGFuY2Uob3duZXIgYWRkcmVzcywgY29kZSBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJYSwgb2sgOj0gbXVzdFJlZyhvd25lcikuYm9vay5BY2NvdW50KGNvZGUpCglpZiAhb2sgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuQmFsYW5jZSgpLCB0cnVlCn0KCi8vIFJhd0JhbGFuY2UgaXMgYW4gYWNjb3VudCdzIERlYml0cyAtIENyZWRpdHMsIHdpdGggbm8gbm9ybWFsLWRpcmVjdGlvbgovLyBhZGp1c3RtZW50LgpmdW5jIFJhd0JhbGFuY2Uob3duZXIgYWRkcmVzcywgY29kZSBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJYSwgb2sgOj0gbXVzdFJlZyhvd25lcikuYm9vay5BY2NvdW50KGNvZGUpCglpZiAhb2sgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuUmF3RGVsdGEoKSwgdHJ1ZQp9CgovLyBBY2NvdW50S2luZCBpcyBhbiBhY2NvdW50J3Mga2luZCBhcyBhIHdvcmQ6ICJhc3NldCIgZm9yIDE1OTAsICJleHBlbnNlIgovLyBmb3IgNTUwMC4gVGhlIHNlY29uZCByZXN1bHQgaXMgZmFsc2UgZm9yIGEgY29kZSB0aGlzIGNoYXJ0IGRvZXMgbm90IGhvbGQuCi8vCi8vIEl0IGV4aXN0cyBiZWNhdXNlIHRoZSBjaGFydCdzIGtpbmRzIGFyZSBvdGhlcndpc2UgdW5vYnNlcnZhYmxlIGZyb20KLy8gb3V0c2lkZS4gQm90aCBhY2NvdW50cyBhcmUgZGViaXQtbm9ybWFsLCBzbyBuZWl0aGVyIFtCYWxhbmNlXSBub3IKLy8gW0VxdWF0aW9uXSBjYW4gZGlzdGluZ3Vpc2ggdGhlbSwgYW5kIHRoZSBwYWNrYWdlIGRvYydzIGNsYWltIHRoYXQgMTU5MCBpcwovLyBhIGNvbnRyYS1BU1NFVCByYXRoZXIgdGhhbiBhIHNlY29uZCBleHBlbnNlIGFjY291bnQgd291bGQgYmUgYW4gYXNzZXJ0aW9uCi8vIGluIGEgY29tbWVudCB3aXRoIG5vdGhpbmcgYmVoaW5kIGl0LiBPcGVuaW5nIDE1OTAgYXMgYW4gRXhwZW5zZSBpbnN0ZWFkCi8vIHdvdWxkIGxlYXZlIGV2ZXJ5IG90aGVyIHJlYWQgaW4gdGhpcyBmaWxlIGlkZW50aWNhbC4KZnVuYyBBY2NvdW50S2luZChvd25lciBhZGRyZXNzLCBjb2RlIHN0cmluZykgKHN0cmluZywgYm9vbCkgewoJYSwgb2sgOj0gbXVzdFJlZyhvd25lcikuYm9vay5BY2NvdW50KGNvZGUpCglpZiAhb2sgewoJCXJldHVybiAiIiwgZmFsc2UKCX0KCXJldHVybiBhLktpbmQuU3RyaW5nKCksIHRydWUKfQoKLy8gQWNjdW11bGF0ZWRDcmVkaXQgaXMgdGhlIFBPU0lUSVZFIGFjY3VtdWxhdGVkLWRlcHJlY2lhdGlvbiBmaWd1cmU6IHRoZQovLyBjcmVkaXQgYmFsYW5jZSBvZiAxNTkwLCBpLmUuIC1SYXdEZWx0YS4KZnVuYyBBY2N1bXVsYXRlZENyZWRpdChvd25lciBhZGRyZXNzKSBpbnQ2NCB7CglhLCBvayA6PSBtdXN0UmVnKG93bmVyKS5ib29rLkFjY291bnQoQWNjdW1Db2RlKQoJaWYgIW9rIHsKCQlwYW5pYygiYXNzZXRzOiByZWdpc3RlciBoYXMgbm8gIiArIEFjY3VtQ29kZSArICIgYWNjb3VudCIpCgl9CglyZXR1cm4gLWEuUmF3RGVsdGEoKQp9CgovLyBFeHBlbnNlRGViaXQgaXMgdGhlIHRvdGFsIGRlcHJlY2lhdGlvbiBleHBlbnNlIHJlY29nbmlzZWQ6IHRoZSBkZWJpdAovLyBiYWxhbmNlIG9mIDU1MDAuCmZ1bmMgRXhwZW5zZURlYml0KG93bmVyIGFkZHJlc3MpIGludDY0IHsKCWEsIG9rIDo9IG11c3RSZWcob3duZXIpLmJvb2suQWNjb3VudChFeHBlbnNlQ29kZSkKCWlmICFvayB7CgkJcGFuaWMoImFzc2V0czogcmVnaXN0ZXIgaGFzIG5vICIgKyBFeHBlbnNlQ29kZSArICIgYWNjb3VudCIpCgl9CglyZXR1cm4gYS5CYWxhbmNlKCkKfQoKLy8gRW50cnlDb3VudCBpcyBob3cgbWFueSBlbnRyaWVzIGEgcmVnaXN0ZXIncyBib29rIGhvbGRzLgpmdW5jIEVudHJ5Q291bnQob3duZXIgYWRkcmVzcykgaW50IHsgcmV0dXJuIG11c3RSZWcob3duZXIpLmJvb2suRW50cnlDb3VudCgpIH0KCi8vIENhcGFjaXR5IHJlcG9ydHMgaG93IG1hbnkgbW9yZSBhc3NldHMgYW5kIGVudHJpZXMgYSByZWdpc3RlciBjYW4gdGFrZS4KZnVuYyBDYXBhY2l0eShvd25lciBhZGRyZXNzKSAoYXNzZXRzTGVmdCwgZW50cmllc0xlZnQgaW50KSB7CglyIDo9IG11c3RSZWcob3duZXIpCglyZXR1cm4gTWF4QXNzZXRzUGVyUmVnaXN0ZXIgLSByLmFzc2V0cy5TaXplKCksCgkJTWF4RW50cmllc1BlclJlZ2lzdGVyIC0gci5ib29rLkVudHJ5Q291bnQoKQp9CgovLyBUb3RhbHMgaXMgdGhlIGJvb2sncyB0b3RhbCBkZWJpdHMgYW5kIGNyZWRpdHMuIFRoZXkgYXJlIGVxdWFsIGFmdGVyIGV2ZXJ5Ci8vIGNoYXJnZSwgYmVjYXVzZSBldmVyeSBlbnRyeSBpcyBhIG1hdGNoZWQgcGFpci4KZnVuYyBUb3RhbHMob3duZXIgYWRkcmVzcykgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCkgewoJYiA6PSBtdXN0UmVnKG93bmVyKS5ib29rCglyZXR1cm4gYi5Ub3RhbERlYml0cygpLCBiLlRvdGFsQ3JlZGl0cygpCn0KCi8vIElzQmFsYW5jZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBib29rJ3MgZGViaXRzIGVxdWFsIGl0cyBjcmVkaXRzLgpmdW5jIElzQmFsYW5jZWQob3duZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBtdXN0UmVnKG93bmVyKS5ib29rLklzQmFsYW5jZWQoKSB9CgovLyBFcXVhdGlvbiBpcyB0aGUgYWNjb3VudGluZyBlcXVhdGlvbjogZGViaXQtbm9ybWFsIGFnYWluc3QgY3JlZGl0LW5vcm1hbC4KLy8gQm90aCBzaWRlcyBvZmZzZXQgYXQgMCBmb3IgdGhpcyBjaGFydCwgYmVjYXVzZSB0aGUgb25seSBlbnRyeSBpcyBhbgovLyBleHBlbnNlIGRlYml0IGFnYWluc3QgYSBjb250cmEtQVNTRVQgY3JlZGl0IOKAlCBib3RoIGxlZ3MgYXJlIGRlYml0LW5vcm1hbAovLyBhY2NvdW50cywgc28gdGhlIGV4cGVuc2UgYWRkcyBhbmQgdGhlIGNvbnRyYSBzdWJ0cmFjdHMuCmZ1bmMgRXF1YXRpb24ob3duZXIgYWRkcmVzcykgKGRlYml0Tm9ybWFsLCBjcmVkaXROb3JtYWwgaW50NjQsIG9mZnNldHMgYm9vbCkgewoJcmV0dXJuIG11c3RSZWcob3duZXIpLmJvb2suQWNjb3VudGluZ0VxdWF0aW9uKCkKfQoKLy8gUmVkZXJpdmUgcmUtd2Fsa3MgZXZlcnkgcG9zdGluZyBpbiB0aGUgYm9vayBhbmQgcmVwb3J0cyB3aGV0aGVyIHRoZQovLyBhY2NvdW50IHRvdGFscyBhZ3JlZSB3aXRoIHRoZSBqb3VybmFsLgovLwovLyBJdCBpcyBhIEZSRUUgcmVhZCwgdW5saWtlIHIvYm9va3MnIG93bmVyLW9ubHkgZXF1aXZhbGVudC4gVGhlIGRpdmVyZ2VuY2UgaXMKLy8gZGVsaWJlcmF0ZTogdGhpcyByZWFsbSdzIGNsYWltIGlzIHRoYXQgaXRzIHBvc3RpbmdzIGZvbGxvdyBmcm9tIGl0cyBzdG9yZWQKLy8gc2NoZWR1bGVzLCBhbmQgYSBjbGFpbSBvbmx5IHRoZSBvd25lciBjYW4gY2hlY2sgaXMgbm90IHdvcnRoIG1ha2luZy4gVGhlCi8vIGNvc3QgaXMgbGluZWFyIGluIHRoZSBwb3N0aW5nIGNvdW50LCB3aGljaCBpcyB3aGF0IE1heEVudHJpZXNQZXJSZWdpc3RlcgovLyBib3VuZHMuCmZ1bmMgUmVkZXJpdmUob3duZXIgYWRkcmVzcykgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCwgYWdyZWVzIGJvb2wpIHsKCXJldHVybiBtdXN0UmVnKG93bmVyKS5ib29rLlJlZGVyaXZlRnJvbUpvdXJuYWwoKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIGludmFyaWFudHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBJbnZhcmlhbnQgaXMgdGhlIHBlci1hc3NldCBkZXJpdmF0aW9uIGNoZWNrOgovLwovLwlib29rZWRBbW91bnQgPT0gc2NoZWR1bGUuQWNjdW11bGF0ZWRBdChib29rZWRUaHJvdWdoKQovLwovLyBJdCByZXR1cm5zIHRoZSB0d28gZmlndXJlcyBhbmQgd2hldGhlciB0aGV5IGFncmVlLiBBIGZhbHNlIGhlcmUgbWVhbnMgdGhlCi8vIHJlYWxtIHBvc3RlZCBhbiBhbW91bnQgaXRzIG93biBzY2hlZHVsZSBkb2VzIG5vdCBpbXBseSwgd2hpY2ggbm8gY29kZSBwYXRoCi8vIGluIHRoaXMgcmVhbG0gY2FuIHByb2R1Y2Ug4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IGl0IGlzIHdvcnRoIGV4cG9ydGluZzoKLy8gdGhlIGNsYWltIGlzIGNoZWNrYWJsZSBieSBhIHRoaXJkIHBhcnR5IHJhdGhlciB0aGFuIGFzc2VydGVkIGluIGEgY29tbWVudC4KZnVuYyBJbnZhcmlhbnQob3duZXIgYWRkcmVzcywgaWQgdWludDY0KSAoYm9va2VkLCBkZXJpdmVkIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJYSA6PSBtdXN0QXNzZXQobXVzdFJlZyhvd25lciksIGlkKQoJZGVyaXZlZCwgZXJyIDo9IGEuc2NoZWQuQWNjdW11bGF0ZWRBdChhLmJvb2tlZCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBhLmFtb3VudCwgZGVyaXZlZCwgYS5hbW91bnQgPT0gZGVyaXZlZAp9CgovLyBDcm9zc0Zvb3QgaXMgdGhlIHJlZ2lzdGVyLXdpZGUgY2hlY2s6IHRoZSBzdW0gb2YgZXZlcnkgYXNzZXQncyBib29rZWQKLy8gYW1vdW50IGFnYWluc3QgdGhlIGNyZWRpdCBiYWxhbmNlIG9mIDE1OTAuCi8vCi8vIFRoZSBpZGVudGl0eSBpcyBFWEFDVCwgbm90IGFwcHJveGltYXRlLCBhbmQgdGhlIHJlYXNvbiBpcyBzdHJ1Y3R1cmFsOiB0aGlzCi8vIHJlYWxtIGV4cG9zZXMgbm8gZ2VuZXJhbCBwb3N0aW5nIGVudHJ5cG9pbnQsIHNvIGl0IGlzIGl0cyBib29rJ3Mgb25seQovLyB3cml0ZXIgYW5kIGJvb2tTcGFuIGlzIHRoZSBvbmx5IGNvZGUgdGhhdCBwb3N0cy4gQWRkaW5nIGEgZ2VuZXJhbCBQb3N0Ci8vIHdvdWxkIGRlc3Ryb3kgdGhpcyBjaGVjaywgd2hpY2ggaXMgdGhlIGNvc3Qgb2YgYWRkaW5nIG9uZS4KLy8KLy8gcmV0aXJlZCBhc3NldHMgYXJlIGluY2x1ZGVkOiB0aGVpciBjaGFyZ2VzIHdlcmUgcmVhbGx5IGluY3VycmVkIGFuZCB0aGUKLy8gMTU5MCBjcmVkaXQgdGhleSBwcm9kdWNlZCBkb2VzIG5vdCBkaXNhcHBlYXIgd2hlbiB0aGUgYXNzZXQgc3RvcHMuCmZ1bmMgQ3Jvc3NGb290KG93bmVyIGFkZHJlc3MpIChzdW1Bc3NldHMsIGFjY3VtdWxhdGVkIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJciA6PSBtdXN0UmVnKG93bmVyKQoJdmFyIHN1bSBpbnQ2NAoJci5hc3NldHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlzdW0gKz0gdi4oKmFzc2V0KS5hbW91bnQKCQlyZXR1cm4gZmFsc2UKCX0pCglhY2MsIG9rIDo9IHIuYm9vay5BY2NvdW50KEFjY3VtQ29kZSkKCWlmICFvayB7CgkJcGFuaWMoImFzc2V0czogcmVnaXN0ZXIgaGFzIG5vICIgKyBBY2N1bUNvZGUgKyAiIGFjY291bnQiKQoJfQoJY3JlZGl0IDo9IC1hY2MuUmF3RGVsdGEoKQoJcmV0dXJuIHN1bSwgY3JlZGl0LCBzdW0gPT0gY3JlZGl0Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZW5kZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZW5kZXIgc2hvd3MgdGhlIHJlYWxtIGluZGV4IGF0ICIvIiBhbmQgb25lIG93bmVyJ3MgcmVnaXN0ZXIgYXQKLy8gIi88YWRkcmVzcz4iLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXAgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltKHBhdGgsICIvIikpCglpZiBwID09ICIiIHsKCQlyZXR1cm4gcmVuZGVySW5kZXgoKQoJfQoJcmV0dXJuIHJlbmRlclJlZ2lzdGVyKGFkZHJlc3MocCkpCn0KCmZ1bmMgcmVuZGVySW5kZXgoKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgYXNzZXRzIOKAlCBhIGZpeGVkLWFzc2V0IHJlZ2lzdGVyIHdpdGggZGVyaXZlZCBwb3N0aW5nc1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkRlcHJlY2lhdGlvbiBzY2hlZHVsZXMgaGVsZCBhcyBzdGF0ZSwgY2hhcmdlcyAqKmRlcml2ZWQqKiAiKQoJc2IuV3JpdGVTdHJpbmcoImZyb20gdGhlIHNjaGVkdWxlIGFuZCB0aGUgY2hhaW4gaGVpZ2h0LCBhbmQgKipubyBjdXN0b2R5ICIpCglzYi5Xcml0ZVN0cmluZygib2YgYW55IGFzc2V0KiouXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIj4gQSBnZW5lcmFsIGxlZGdlciB0YWtlcyB0aGUgYW1vdW50IGZyb20gaXRzIGNhbGxlciwgc28gaXQgIikKCXNiLldyaXRlU3RyaW5nKCJjYW5ub3QgdGVsbCBhIGRvdWJsZS1ib29rZWQgbW9udGggZnJvbSBhIGNvcnJlY3Qgb25lLiBUaGlzICIpCglzYi5Xcml0ZVN0cmluZygicmVhbG0gbmV2ZXIgdGFrZXMgYW4gYW1vdW50OiBpdCBrZWVwcyBhIHBlci1hc3NldCAiKQoJc2IuV3JpdGVTdHJpbmcoImhpZ2gtd2F0ZXIgbWFyaywgc28gYSBjaGFyZ2UgY2FuIGJlIG5laXRoZXIgcmVwZWF0ZWQgbm9yICIpCglzYi5Xcml0ZVN0cmluZygic2tpcHBlZC4gVGhhdCBpcyB0aGUgd2hvbGUgcHJvZHVjdCwgYW5kIGl0IHByb3ZlcyAiKQoJc2IuV3JpdGVTdHJpbmcoImFyaXRobWV0aWMg4oCUIG5vdCB0cnV0aC4gTm90aGluZyBoZXJlIHRpZXMgYSBjb3N0IGZpZ3VyZSAiKQoJc2IuV3JpdGVTdHJpbmcoInRvIGEgcmVhbCBob2xkaW5nLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBTdGF0ZVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gcmVnaXN0ZXJzIG9wZW5lZDogKioiICsgc3RyY29udi5JdG9hKHJlZ0NvdW50KSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVGhlIGNoYXJ0IGlzIHR3byBhY2NvdW50cyBhbmQgaXMgZml4ZWRcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGNvZGUgfCBuYW1lIHwga2luZCB8IG5vcm1hbCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBFeHBlbnNlQ29kZSArICJgIHwgIiArIEV4cGVuc2VOYW1lICsgIiB8IGV4cGVuc2UgfCBkZWJpdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBBY2N1bUNvZGUgKyAiYCB8ICIgKyBBY2N1bU5hbWUgKyAiIHwgYXNzZXQgKCoqY29udHJhKiopIHwgZGViaXQgfFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkV2ZXJ5IGVudHJ5IGlzIGEgZGViaXQgdG8gYCIgKyBFeHBlbnNlQ29kZSArICJgIGFnYWluc3QgYW4gIikKCXNiLldyaXRlU3RyaW5nKCJlcXVhbCBjcmVkaXQgdG8gYCIgKyBBY2N1bUNvZGUgKyAiYC4gVGhlcmUgaXMgbm8gd2F5IHRvIG9wZW4gIikKCXNiLldyaXRlU3RyaW5nKCJhIHRoaXJkIGFjY291bnQsIGFuZCB0aGUgKipjb3N0IGJhc2lzIG5ldmVyIHJlYWNoZXMgdGhlICIpCglzYi5Xcml0ZVN0cmluZygiYm9vayoqIOKAlCBib29raW5nIGl0IHdvdWxkIG5lZWQgYSBsaWFiaWxpdHkgb3IgYW4gZXF1aXR5ICIpCglzYi5Xcml0ZVN0cmluZygicGx1ZyBhc3NlcnRpbmcgaG93IHRoZSBhc3NldCB3YXMgZnVuZGVkLCB3aGljaCB0aGlzIHJlYWxtICIpCglzYi5Xcml0ZVN0cmluZygiZG9lcyBub3Qga25vdy5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJgIiArIEFjY3VtQ29kZSArICJgIGlzIGFuIGFzc2V0IGFjY291bnQsIHNvIGl0cyAqbm9ybWFsKiAiKQoJc2IuV3JpdGVTdHJpbmcoImJhbGFuY2UgcmVhZHMgKipuZWdhdGl2ZSoqLiBUaGUgcG9zaXRpdmUgZmlndXJlIGlzICIpCglzYi5Xcml0ZVN0cmluZygiYEFjY3VtdWxhdGVkQ3JlZGl0YC5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgQm91bmRzXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBib3VuZCB8IHZhbHVlIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYXNzZXRzIHBlciByZWdpc3RlciB8ICIgKyBzdHJjb252Lkl0b2EoTWF4QXNzZXRzUGVyUmVnaXN0ZXIpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZW50cmllcyBwZXIgcmVnaXN0ZXIgfCAiICsgc3RyY29udi5JdG9hKE1heEVudHJpZXNQZXJSZWdpc3RlcikgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBsYWJlbCBsZW5ndGggfCAiICsgc3RyY29udi5JdG9hKE1heExhYmVsTGVuKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHNob3J0ZXN0IHBlcmlvZCB8ICIgKyBzdHJjb252LkZvcm1hdEludChNaW5QZXJpb2RCbG9ja3MsIDEwKSArICIgYmxvY2tzIHxcblxuIikKCXNiLldyaXRlU3RyaW5nKCJPbmUgYXNzZXQgaXMgYm9va2VkIHBlciBjYWxsOiB0aGUgc2NoZWR1bGUgbG9vcCdzIGJvdW5kIGlzICIpCglzYi5Xcml0ZVN0cmluZygidW5wcmljZWQgdXBzdHJlYW0sIHNvIGEgYnVsayBlbnRyeXBvaW50IHdvdWxkIG11bHRpcGx5IGFuICIpCglzYi5Xcml0ZVN0cmluZygidW5wcmljZWQgY29zdCBieSB0aGUgYXNzZXQgY291bnQuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIFJlYWRpbmcgYSByZWdpc3RlclxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoImAiICsgUmVhbG1QYXRoICsgIjo8YWRkcmVzcz5gXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyUmVnaXN0ZXIob3duZXIgYWRkcmVzcykgc3RyaW5nIHsKCXIsIG9rIDo9IHJlZyhvd25lcikKCWlmICFvayB7CgkJcmV0dXJuICIjIE5vIHJlZ2lzdGVyXG5cbk5vIHJlZ2lzdGVyIGV4aXN0cyBmb3IgYCIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KG93bmVyLlN0cmluZygpKSArICJgLlxuIgoJfQoKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIFJlZ2lzdGVyIG9mICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG93bmVyLlN0cmluZygpKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCItIG9wZW5lZCBhdCBoZWlnaHQ6ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHIub3BlbmVkQXQsIDEwKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBhc3NldHM6ICoqIiArIHN0cmNvbnYuSXRvYShyLmFzc2V0cy5TaXplKCkpICsgIioqIC8gIiArCgkJc3RyY29udi5JdG9hKE1heEFzc2V0c1BlclJlZ2lzdGVyKSArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBlbnRyaWVzOiAqKiIgKyBzdHJjb252Lkl0b2Eoci5ib29rLkVudHJ5Q291bnQoKSkgKyAiKiogLyAiICsKCQlzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlclJlZ2lzdGVyKSArICJcblxuIikKCglzdW0sIGNyZWRpdCwgYWdyZWVzIDo9IENyb3NzRm9vdChvd25lcikKCXNiLldyaXRlU3RyaW5nKCIjIyBDcm9zcy1mb290XG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBmaWd1cmUgfCB2YWx1ZSB8XG58LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBzdW0gb2YgYm9va2VkIGFtb3VudHMgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQoc3VtLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgIiArIEFjY3VtQ29kZSArICJgIGNyZWRpdCBiYWxhbmNlIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KGNyZWRpdCwgMTApICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYWdyZWVzIHwgKioiICsgeWVzbm8oYWdyZWVzKSArICIqKiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYm9vayBiYWxhbmNlZCB8ICoqIiArIHllc25vKHIuYm9vay5Jc0JhbGFuY2VkKCkpICsgIioqIHxcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgQXNzZXRzXG5cbiIpCglpZiByLmFzc2V0cy5TaXplKCkgPT0gMCB7CgkJc2IuV3JpdGVTdHJpbmcoIl9Ob25lIHBsYWNlZCB5ZXQuX1xuIikKCQlyZXR1cm4gc2IuU3RyaW5nKCkKCX0KCXNiLldyaXRlU3RyaW5nKCJ8IGlkIHwgbGFiZWwgfCBtZXRob2QgfCBjb3N0IHwgc2FsdmFnZSB8IGxpZmUgfCBwZXJpb2QgfCBib29rZWQgfCBhbW91bnQgfCBkZXJpdmVkIHwgb2sgfCBzdGF0ZSB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCgoJc2hvd24gOj0gMAoJdG90YWwgOj0gci5hc3NldHMuU2l6ZSgpCglyLmFzc2V0cy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWlmIHNob3duID49IFJlbmRlckFzc2V0TGltaXQgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlhIDo9IHYuKCphc3NldCkKCQlkZXJpdmVkLCBlcnIgOj0gYS5zY2hlZC5BY2N1bXVsYXRlZEF0KGEuYm9va2VkKQoJCW9rIDo9IGVyciA9PSBuaWwgJiYgZGVyaXZlZCA9PSBhLmFtb3VudAoJCXN0YXRlIDo9ICJsaXZlIgoJCWlmIGEucmV0aXJlZCB7CgkJCXN0YXRlID0gInJldGlyZWQgYXQgIiArIHN0cmNvbnYuRm9ybWF0SW50KGEucmV0aXJlZEF0LCAxMCkKCQl9CgkJLy8gVGhlIGF2bCBrZXkgaXMgemVyby1wYWRkZWQgdG8gd2lkdGggMjAgc28gbGV4aWNhbCBvcmRlciBtYXRjaGVzCgkJLy8gbnVtZXJpYyBvcmRlcjsgdGhlIGlkIGNvbHVtbiBtdXN0IHByaW50IHRoZSBpZCwgbm90IHRoZSBrZXkuCgkJc2IuV3JpdGVTdHJpbmcoInwgIiArIHN0cmNvbnYuRm9ybWF0VWludChhLmlkLCAxMCkgKyAiIHwgIiArIGNlbGwoYS5sYWJlbCkgKyAiIHwgIiArCgkJCWNlbGwoYS5zY2hlZC5NZXRob2QuU3RyaW5nKCkpICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChhLnNjaGVkLkNvc3QsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoYS5zY2hlZC5TYWx2YWdlLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGludDY0KGEuc2NoZWQuTGlmZSksIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoYS5wZXJpb2QsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoaW50NjQoYS5ib29rZWQpLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGEuYW1vdW50LCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGRlcml2ZWQsIDEwKSArICIgfCAiICsKCQkJeWVzbm8ob2spICsgIiB8ICIgKyBzdGF0ZSArICIgfFxuIikKCQlzaG93bisrCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgc2hvd24gPCB0b3RhbCB7CgkJc2IuV3JpdGVTdHJpbmcoIlxuX1Nob3dpbmcgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKyAiIG9mICIgKwoJCQlzdHJjb252Lkl0b2EodG90YWwpICsgIiBhc3NldHMuX1xuIikKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBjZWxsIHJlbmRlcnMgYSBjYWxsZXItc3VwcGxpZWQgc3RyaW5nIGludG8gYSB0YWJsZSBjZWxsLiBBIGJsYW5rIHZhbHVlCi8vIHdvdWxkIGNvbGxhcHNlIHRoZSBjb2x1bW4sIHNvIGl0IGlzIHNob3duIGFzIGEgZGFzaC4KZnVuYyBjZWxsKHMgc3RyaW5nKSBzdHJpbmcgewoJaWYgc3RyaW5ncy5UcmltU3BhY2UocykgPT0gIiIgewoJCXJldHVybiAi4oCUIgoJfQoJcmV0dXJuIHNhbml0aXplLlRhYmxlQ2VsbChzKQp9CgpmdW5jIHllc25vKGIgYm9vbCkgc3RyaW5nIHsKCWlmIGIgewoJCXJldHVybiAieWVzIgoJfQoJcmV0dXJuICJubyIKfQoaYQoLZ25vbW9kLnRvbWwSUm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYXNzZXRzIgpnbm8gPSAiMC45IgoiDTEwMDAwMDAwdWdub3QSEgj+6/RLEgsxNTkyMDJ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAQvHwIFHcYN5TG++kcMah95TrSnVVyqO7rSGAe7GNBEM2Y9XNH1RyJ4k1AWKUFKvRF9aTzUtN/O15xkVBBtjnNRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}