tx · EZ4kBb9K3CutSR6FmBJFZp21GaMA279xL5CNfgBgHKYe

3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx:  -0.01700000 Waves

2023.09.16 02:28 [2757172] smart account 3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx > SELF 0.00000000 Waves

{ "type": 13, "id": "EZ4kBb9K3CutSR6FmBJFZp21GaMA279xL5CNfgBgHKYe", "fee": 1700000, "feeAssetId": null, "timestamp": 1694820559944, "version": 2, "chainId": 84, "sender": "3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx", "senderPublicKey": "UGqkWsCpv7xRVXkQRXyLd6pWPDtYGXmPip7FxSd1pAu", "proofs": [ "31ZywjsrybcNnEMvfcq3y26T65CdgNbuGsVSeKcjkVkLyzTiCfGvqua1xbfxDkSFh2rXTCekqJqNtXfZn2iPKBqh" ], "script": "base64:BgIpCAISBwoFAQEBAQESABIAEgQKAggBEgMKAQESAwoBARIDCgEBEgMKAQg6AA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAANbGFzdFRvdXJJZEtleQIOJXNfX2xhc3RUb3VySWQBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEDdElkCQCsAgICFiVzJWRfX3RvdXJTdGF0aWNEYXRhX18JAKQDAQUDdElkARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQN0SWQJAKwCAgIXJXMlZF9fdG91ckR5bmFtaWNEYXRhX18JAKQDAQUDdElkARNrZXlTY29yZUJvYXJkQnlUb3VyAQN0SWQJAKwCAgISJXMlZF9fc2NvcmVCb2FyZF9fCQCkAwEFA3RJZAESa2V5U3VtU2NvcmVzQnlUb3VyAQN0SWQJAKwCAgIRJXMlZF9fc3VtU2NvcmVzX18JAKQDAQUDdElkARZrZXlVbnBhaWRSZXdhcmRzQnlUb3VyAQN0SWQJAKwCAgIVJXMlZF9fdW5wYWlkUmV3YXJkc19fCQCkAwEFA3RJZAEba2V5TGFzdFJlZ2lzdGVyZWRUb3VyQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAiAlcyVzX19sYXN0UmVnaXN0ZXJlZFRvdXJCeUR1Y2tfXwULZHVja0Fzc2V0SWQBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICISVzJWQlc19faXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEZa2V5SXNBd2FyZGVkQnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIeJXMlZCVzX19pc0F3YXJkZWRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fARtrZXlMYXN0QXR0ZW1wdEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICICVzJWQlc19fbGFzdEF0dGVtcHRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fARprZXlCZXN0UmVzdWx0QnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIfJXMlZCVzX19iZXN0UmVzdWx0QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEWa2V5QmVzdFR4QnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIbJXMlZCVzX19iZXN0VHhCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fAAlpZHhTdGF0aWMAAAAKaWR4RHluYW1pYwABABN0U3RhdGljUmVnaXN0ZXJDb3N0AAIAEnRTdGF0aWNBdHRlbXB0Q29zdAADAAx0U3RhdGljU3RhcnQABQAKdFN0YXRpY0VuZAAGABB0U3RhdGljTnVtR3JhbmRzAAcADnREeW5hbWljU3RhdHVzAAEAD3REeW5hbWljTGVhZGVycwACABF0RHluYW1pY1dpblJlc3VsdAADABV0RHluYW1pY1RvdGFsUmVnQ291bnQABAAVdER5bmFtaWNUb3RhbEF0dGVtcHRzAAUBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwBDmlzSW5Ub3VybmFtZW50Agx0b3VyQ29udHJhY3QIbG9jYXRpb24EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQx0b3VyQ29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUMdG91ckNvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAVQJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQFBmxhc3RJZAcJAAACCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAgpJTlBST0dSRVNTBwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEADUlkeENmZ1dsZ0RhcHAABAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhNOb3QgaW5pdGlhbGl6ZWQgeWV0AQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBBHBhZEwCA3ZhbANsZW4EBHZhbFMJAKQDAQUDdmFsBAZ6ZXJvZXMJALACAgkApAMBCQBsBgAKAAAJAGUCBQNsZW4JALECAQUEdmFsUwAAAAAFBERPV04AAQkArAICBQZ6ZXJvZXMFBHZhbFMAE01BWFRPVVJOQU1FTlRMRU5HVEgAgJj/zQEABEhPVVIAgN3bAQAKYWRtaW5zTGlzdAkAzAgCCQClCAEFBHRoaXMJAMwIAgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BFZTJSRUxVSENGQ0JzbVNDTmNCSjhOM1VSTFZRZW5kZTcDCQAAAgEBVAUHJG1hdGNoMAIjM010QmdKVGFMeFBCM0M3VUpEMVVFOHFqa0h0aGZLdkZRWVkJAAIBAg1Vbmtub3duIGNoYWluBQNuaWwBCnN0YXRpY0RhdGEHBHR4SWQMcmVnaXN0ZXJDb3N0C2F0dGVtcHRDb3N0DGNyZWF0aW9uVGltZQlzdGFydFRpbWUHZW5kVGltZQludW1HcmFuZHMJALkJAgkAzAgCAg4lcyVkJWQlZCVkJWQlZAkAzAgCBQR0eElkCQDMCAIJAKQDAQUMcmVnaXN0ZXJDb3N0CQDMCAIJAKQDAQULYXR0ZW1wdENvc3QJAMwIAgkApAMBBQxjcmVhdGlvblRpbWUJAMwIAgkApAMBBQlzdGFydFRpbWUJAMwIAgkApAMBBQdlbmRUaW1lCQDMCAIJAKQDAQUJbnVtR3JhbmRzBQNuaWwFA1NFUAELZHluYW1pY0RhdGEFBnN0YXR1cwdsZWFkZXJzCXdpblJlc3VsdAl0b3RhbFJlZ3MNdG90YWxBdHRlbXB0cwkAugkCCQDMCAICCiVzJXMlZCVkJWQJAMwIAgUGc3RhdHVzCQDMCAIFB2xlYWRlcnMJAMwIAgkApAMBBQl3aW5SZXN1bHQJAMwIAgkApAMBBQl0b3RhbFJlZ3MJAMwIAgkApAMBBQ10b3RhbEF0dGVtcHRzBQNuaWwFA1NFUAEGcHJvbG9nAAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQxkdWNrQnlDYWxsZXIBBmNhbGxlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBBQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQIAWkBEGNyZWF0ZVRvdXJuYW1lbnQFCXN0YXJ0VGltZQdlbmRUaW1lDHJlZ2lzdGVyQ29zdAthdHRlbXB0Q29zdAludW1HcmFuZHMEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQphZG1pbnNMaXN0BQZjYWxsZXIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQGbGFzdElkCQCfCAEFDWxhc3RUb3VySWRLZXkEA3RJZAMJAQlpc0RlZmluZWQBBQZsYXN0SWQECmxhc3RUb3VySWQJAQV2YWx1ZQEFBmxhc3RJZAQHZHluYW1pYwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUKbGFzdFRvdXJJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUKbGFzdFRvdXJJZAIFIGRhdGEEBnN0YXR1cwkAkQMCCQC1CQIFB2R5bmFtaWMFA1NFUAUOdER5bmFtaWNTdGF0dXMDCQECIT0CBQZzdGF0dXMCCEFSQ0hJVkVECQACAQkArAICAixDdXJyZW50IHRvdXJuZW1lbnQgaXMgbm90IGNvbXBsZXRlZCwgc3RhdHVzPQUGc3RhdHVzCQBkAgUKbGFzdFRvdXJJZAABAAEEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUDbm93BQlzdGFydFRpbWUJAAIBCQCsAgIJAKwCAgkArAICAgpzdGFydFRpbWU9CQCkAwEFCXN0YXJ0VGltZQIQIDwgY3JlYXRpb25UaW1lPQkApAMBBQNub3cDCQBmAgUJc3RhcnRUaW1lBQdlbmRUaW1lCQACAQkArAICCQCsAgIJAKwCAgIIZW5kVGltZT0JAKQDAQUHZW5kVGltZQINIDwgc3RhcnRUaW1lPQkApAMBBQlzdGFydFRpbWUDCQBmAgkAZQIFB2VuZFRpbWUFCXN0YXJ0VGltZQUTTUFYVE9VUk5BTUVOVExFTkdUSAkAAgEJAKwCAgkArAICCQCsAgICH1RvdXJuYW1lbnQgcGVyaW9kIGV4Y2VlZHMgbWF4OiAJAKQDAQkAZQIFB2VuZFRpbWUFCXN0YXJ0VGltZQIDID4gCQCkAwEFE01BWFRPVVJOQU1FTlRMRU5HVEgDAwkAZwIAAAUMcmVnaXN0ZXJDb3N0BgkAZwIAAAULYXR0ZW1wdENvc3QJAAIBCQCsAgIJAKwCAgkArAICAiRDb3N0IHNob3VsZCBiZSBwb3NpdGl2ZSwgYnV0IHBhc3NlZCAJAKQDAQUMcmVnaXN0ZXJDb3N0AgUgYW5kIAkApAMBBQthdHRlbXB0Q29zdAMJAGYCAAAFCW51bUdyYW5kcwkAAgECLU51bWJlciBvZiBHcmFuZCBQcml6ZXMgc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1sYXN0VG91cklkS2V5BQN0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkBCnN0YXRpY0RhdGEHCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFDHJlZ2lzdGVyQ29zdAULYXR0ZW1wdENvc3QFA25vdwUJc3RhcnRUaW1lBQdlbmRUaW1lBQludW1HcmFuZHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAQtkeW5hbWljRGF0YQUCB0NSRUFURUQCASAAAAAAAAAFA25pbAUDdElkAWkBCHJlZ2lzdGVyAAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIVV0xHT0xEIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUKcG10QXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQGbGFzdElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUNbGFzdFRvdXJJZEtleQIVTm8gYWN0aXZlIHRvdXJuYW1lbnRzBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAwkBASEBAwMDCQAAAgUGc3RhdHVzAgdDUkVBVEVECQBmAgUDbm93CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQx0U3RhdGljU3RhcnQHCQBmAgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFBEhPVVIFA25vdwcGAwkAAAIFBnN0YXR1cwIKSU5QUk9HUkVTUwkAZgIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQRIT1VSBQNub3cHCQACAQITQ2Fubm90IHJlZ2lzdGVyIG5vdwQHcmVnQ29zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUTdFN0YXRpY1JlZ2lzdGVyQ29zdAMJAQIhPQIFBndsZ0FtdAUHcmVnQ29zdAkAAgEJAKwCAgkArAICAhBOZWVkIHBheW1lbnQgb2YgCQEKZml4ZWRQb2ludAIFB3JlZ0Nvc3QACAIHIFdMR09MRAQLZHVja0Fzc2V0SWQJAQxkdWNrQnlDYWxsZXIBCAUBaQxvcmlnaW5DYWxsZXIECHNjb3JlS2V5CQETa2V5U2NvcmVCb2FyZEJ5VG91cgEFBmxhc3RJZAQNb2xkU2NvcmVCb2FyZAkBC3ZhbHVlT3JFbHNlAgkAoggBBQhzY29yZUtleQIAAwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBwYJAQhjb250YWlucwIFDW9sZFNjb3JlQm9hcmQFC2R1Y2tBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIKWW91ciBkdWNrIAULZHVja0Fzc2V0SWQCJSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgYXQgdG91cm5hbWVudCAJAKQDAQUGbGFzdElkBBJ1cGRhdGVkRHluYW1pY0RhdGEJAQtkeW5hbWljRGF0YQUCCklOUFJPR1JFU1MJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleUxhc3RSZWdpc3RlcmVkVG91ckJ5RHVjawEFC2R1Y2tBc3NldElkBQZsYXN0SWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgUIc2NvcmVLZXkDCQAAAgUNb2xkU2NvcmVCb2FyZAIACQCsAgIFC2R1Y2tBc3NldElkAgQ6MDAwCQCsAgIJAKwCAgkArAICBQ1vbGRTY29yZUJvYXJkAgFfBQtkdWNrQXNzZXRJZAIEOjAwMAkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFBmxhc3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwFDHByb2xvZ1Jlc3VsdAFpAQpuZXdBdHRlbXB0AAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJAQxkdWNrQnlDYWxsZXIBCAUBaQxvcmlnaW5DYWxsZXIEBmxhc3RJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFDWxhc3RUb3VySWRLZXkCFU5vIGFjdGl2ZSB0b3VybmFtZW50cwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFBHRoaXMFBmxhc3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMEBnN0YXR1cwkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwMJAQEhAQMJAAACBQZzdGF0dXMCCklOUFJPR1JFU1MJAGYCCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUESE9VUgUDbm93BwkAAgECF0F0dGVtcHQgaXMgbm90IHBvc3NpYmxlAwkBASEBCQELdmFsdWVPckVsc2UCCQCgCAEJARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAcJAAIBCQCsAgIJAKwCAgkArAICAgpZb3VyIGR1Y2sgBQtkdWNrQXNzZXRJZAIhIGlzIG5vdCByZWdpc3RlcmVkIGF0IHRvdXJuYW1lbnQgCQCkAwEFBmxhc3RJZAQTYXR0ZW1wdHNJdGVyYXRvcktleQkBG2tleUxhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQEC2xhc3RBdHRlbXB0CQCfCAEFE2F0dGVtcHRzSXRlcmF0b3JLZXkECyR0MDYxMTE2NzQzAwkBASEBCQEJaXNEZWZpbmVkAQULbGFzdEF0dGVtcHQJAJQKAgAAAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCFVdMR09MRCBwYXltZW50cyBvbmx5IQMJAQIhPQIFCnBtdEFzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEEB2F0dENvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFEnRTdGF0aWNBdHRlbXB0Q29zdAMJAQIhPQIFBndsZ0FtdAUHYXR0Q29zdAkAAgEJAKwCAgkArAICAhBOZWVkIHBheW1lbnQgb2YgCQEKZml4ZWRQb2ludAIFB2F0dENvc3QACAIHIFdMR09MRAkAlAoCCQBkAgkBBXZhbHVlAQULbGFzdEF0dGVtcHQAAQABBA1wYXllZEF0dGVtcHRzCAULJHQwNjExMTY3NDMCXzEECWluY3JlbWVudAgFCyR0MDYxMTE2NzQzAl8yBBJ1cGRhdGVkRHluYW1pY0RhdGEJAQtkeW5hbWljRGF0YQUCCklOUFJPR1JFU1MJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzBQlpbmNyZW1lbnQEB3RvdXJMb2MJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhNpbml0RHVja1RvdXJBdHRlbXB0CQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNhdHRlbXB0c0l0ZXJhdG9yS2V5BQ1wYXllZEF0dGVtcHRzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUGbGFzdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEFA25pbAkAzAgCBQxwcm9sb2dSZXN1bHQJAMwIAgUNcGF5ZWRBdHRlbXB0cwkAzAgCBQd0b3VyTG9jBQNuaWwBaQEOc2F2ZUR1Y2tSZXN1bHQCC2R1Y2tBc3NldElkC2R1Y2tOZXdCZXN0AwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAZsYXN0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ1sYXN0VG91cklkS2V5AhVObyBhY3RpdmUgdG91cm5hbWVudHMEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBA1iZXN0UmVzdWx0S2V5CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBAxzdW1TY29yZXNLZXkJARJrZXlTdW1TY29yZXNCeVRvdXIBBQZsYXN0SWQEDG9sZFN1bVNjb3JlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQxzdW1TY29yZXNLZXkAAAMJAQ5pc0luVG91cm5hbWVudAIFBHRoaXMFC2N1ckxvY2F0aW9uBAtkdWNrT2xkQmVzdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ1iZXN0UmVzdWx0S2V5AAAECHNjb3JlS2V5CQETa2V5U2NvcmVCb2FyZEJ5VG91cgEFBmxhc3RJZAQNb2xkU2NvcmVCb2FyZAkBC3ZhbHVlT3JFbHNlAgkAoggBBQhzY29yZUtleQIABAskdDA4MjM2OTM5NwMJAGYCBQtkdWNrTmV3QmVzdAULZHVja09sZEJlc3QDCQEBIQEJAQhjb250YWlucwIFDW9sZFNjb3JlQm9hcmQFC2R1Y2tBc3NldElkCQACAQkArAICAhxzY29yZUJvYXJkIGRvZXMgbm90IGNvbnRhaW4gBQtkdWNrQXNzZXRJZAQHb2xkQmVzdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0BAdsZWFkZXJzCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwQOb2xkTGVhZGVyc0xpc3QDAwkAAAIFB2xlYWRlcnMCAAYJAAACBQdsZWFkZXJzAgEgBQNuaWwJALwJAgUHbGVhZGVycwIBLAQObmV3TGVhZGVyc0xpc3QDCQBmAgULZHVja05ld0Jlc3QFB29sZEJlc3QJAMwIAgULZHVja0Fzc2V0SWQFA25pbAMDCQBmAgUHb2xkQmVzdAULZHVja05ld0Jlc3QGCQEPY29udGFpbnNFbGVtZW50AgUOb2xkTGVhZGVyc0xpc3QFC2R1Y2tBc3NldElkBQ5vbGRMZWFkZXJzTGlzdAkAzQgCBQ5vbGRMZWFkZXJzTGlzdAULZHVja0Fzc2V0SWQEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIKSU5QUk9HUkVTUwkAugkCBQ5uZXdMZWFkZXJzTGlzdAIBLAkAlgMBCQDMCAIFC2R1Y2tOZXdCZXN0CQDMCAIFB29sZEJlc3QFA25pbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwQFcGFydHMJAL0JAgUNb2xkU2NvcmVCb2FyZAULZHVja0Fzc2V0SWQJAJUKAwkArAICCQCsAgIJAKwCAgkArAICCQCRAwIFBXBhcnRzAAAFC2R1Y2tBc3NldElkAgE6CQEEcGFkTAIFC2R1Y2tOZXdCZXN0AAMJALACAgkAkQMCBQVwYXJ0cwABAAQJAGUCCQBkAgUMb2xkU3VtU2NvcmVzBQtkdWNrTmV3QmVzdAULZHVja09sZEJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQZsYXN0SWQFEnVwZGF0ZWREeW5hbWljRGF0YQUDbmlsCQCVCgMFDW9sZFNjb3JlQm9hcmQFDG9sZFN1bVNjb3JlcwUDbmlsBA1uZXdTY29yZUJvYXJkCAULJHQwODIzNjkzOTcCXzEEDG5ld1N1bVNjb3JlcwgFCyR0MDgyMzY5Mzk3Al8yBA1nbG9iYWxBY3Rpb25zCAULJHQwODIzNjkzOTcCXzMJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1iZXN0UmVzdWx0S2V5CQCWAwEJAMwIAgULZHVja09sZEJlc3QJAMwIAgULZHVja05ld0Jlc3QFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMc3VtU2NvcmVzS2V5BQxuZXdTdW1TY29yZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleUJlc3RUeEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUIc2NvcmVLZXkFDW5ld1Njb3JlQm9hcmQFA25pbAUNZ2xvYmFsQWN0aW9ucwAACQCUCgIFA25pbAAAAWkBEXByb2Nlc3NUb3VybmFtZW50AQN0SWQEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQphZG1pbnNMaXN0BQZjYWxsZXIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFBHRoaXMFA3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMEBnN0YXR1cwkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwQNcmVnaXN0cmF0aW9ucwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAQMcGFpZEF0dGVtcHRzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzBAdyZWdDb3N0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBRN0U3RhdGljUmVnaXN0ZXJDb3N0BAdhdHRDb3N0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBRJ0U3RhdGljQXR0ZW1wdENvc3QDCQAAAgUGc3RhdHVzAghBUkNISVZFRAkAAgEJAKwCAgkArAICAgtUb3VybmFtZW50IAkApAMBBQN0SWQCFCBpcyBhbHJlYWR5IEFSQ0hJVkVEAwMJAAACBQZzdGF0dXMCCklOUFJPR1JFU1MJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQNub3cHCQACAQkArAICCQCsAgICC1RvdXJuYW1lbnQgCQCkAwEFA3RJZAIQIGlzIG5vdCBvdmVyIHlldAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAgpQUk9DRVNTSU5HCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0BQ1yZWdpc3RyYXRpb25zBQxwYWlkQXR0ZW1wdHMJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFA3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5VW5wYWlkUmV3YXJkc0J5VG91cgEFA3RJZAkAaQIJAGQCCQBoAgUNcmVnaXN0cmF0aW9ucwUHcmVnQ29zdAkAaAIFDHBhaWRBdHRlbXB0cwUHYXR0Q29zdAACBQNuaWwAAAFpARBmaW5pc2hUb3VybmFtZW50AQN0SWQEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQphZG1pbnNMaXN0BQZjYWxsZXIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFBHRoaXMFA3RJZAQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAwkAAAIFBnN0YXR1cwIIQVJDSElWRUQJAAIBCQCsAgIJAKwCAgILVG91cm5hbWVudCAJAKQDAQUDdElkAhQgaXMgYWxyZWFkeSBBUkNISVZFRAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAghBUkNISVZFRAkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRF0RHluYW1pY1dpblJlc3VsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUDdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEFA25pbAAAAWkBCmNsYWltUHJpemUBA3RJZAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUDdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAwkBAiE9AgUGc3RhdHVzAgpQUk9DRVNTSU5HCQACAQkArAICCQCsAgICC1RvdXJuYW1lbnQgCQCkAwEFA3RJZAISIGlzIG5vdCBQUk9DRVNTSU5HBA1yZWdpc3RyYXRpb25zCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50BAxwYWlkQXR0ZW1wdHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMEB3JlZ0Nvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFE3RTdGF0aWNSZWdpc3RlckNvc3QEB2F0dENvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFEnRTdGF0aWNBdHRlbXB0Q29zdAQKYXdhcmRGdW5kcwkAaQIJAGQCCQBoAgUNcmVnaXN0cmF0aW9ucwUHcmVnQ29zdAkAaAIFDHBhaWRBdHRlbXB0cwUHYXR0Q29zdAACBAl1bnBhaWRLZXkJARZrZXlVbnBhaWRSZXdhcmRzQnlUb3VyAQUDdElkBAt1bnBhaWRGdW5kcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1bnBhaWRLZXkAAAQLZHVja0Fzc2V0SWQJAQxkdWNrQnlDYWxsZXIBCAUBaQxvcmlnaW5DYWxsZXIDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBwkAAgEJAKwCAgkArAICCQCsAgICCllvdXIgZHVjayAFC2R1Y2tBc3NldElkAiEgaXMgbm90IHJlZ2lzdGVyZWQgYXQgdG91cm5hbWVudCAJAKQDAQUDdElkBA1iZXN0UmVzdWx0S2V5CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkBAhkdWNrQmVzdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ1iZXN0UmVzdWx0S2V5AAADCQAAAgUIZHVja0Jlc3QAAAkAAgECGFlvdXIgZHVjayBnb3QgemVybyBzY29yZQQKYXdhcmRlZEtleQkBGWtleUlzQXdhcmRlZEJ5VG91ckFuZER1Y2sCBQN0SWQFC2R1Y2tBc3NldElkAwkBC3ZhbHVlT3JFbHNlAgkAoAgBBQphd2FyZGVkS2V5BwkAAgEJAKwCAgkArAICCQCsAgICCllvdXIgZHVjayAFC2R1Y2tBc3NldElkAiIgaXMgYWxyZWFkeSBhd2FyZGVkIGF0IHRvdXJuYW1lbnQgCQCkAwEFA3RJZAQMc3VtU2NvcmVzS2V5CQESa2V5U3VtU2NvcmVzQnlUb3VyAQUDdElkBAlzdW1TY29yZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUMc3VtU2NvcmVzS2V5AAAEB2xlYWRlcnMJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzBAtsZWFkZXJzTGlzdAMDCQAAAgUHbGVhZGVycwIABgkAAAIFB2xlYWRlcnMCASAFA25pbAkAvAkCBQdsZWFkZXJzAgEsBApudW1MZWFkZXJzCQCQAwEFC2xlYWRlcnNMaXN0AwkAAAIFCm51bUxlYWRlcnMAAAkAAgEJAKwCAgIZTm8gbGVhZGVycyBhdCB0b3VybmFtZW50IAkApAMBBQN0SWQECW51bUdyYW5kcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUQdFN0YXRpY051bUdyYW5kcwQJd2luUmVzdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQED3N1bUxlYWRlclNjb3JlcwMJAGYCBQpudW1MZWFkZXJzBQludW1HcmFuZHMAAAMJAQ9jb250YWluc0VsZW1lbnQCBQtsZWFkZXJzTGlzdAULZHVja0Fzc2V0SWQJAAIBAjBBcyBvbmUgb2Ygd2lubmVycywgeW91IHdpbGwgYmUgYXdhcmRlZCBieSBhZG1pbnMJAGgCBQpudW1MZWFkZXJzBQl3aW5SZXN1bHQECnlvdXJBbW91bnQJAJcDAQkAzAgCCQBrAwUIZHVja0Jlc3QFCmF3YXJkRnVuZHMJAGUCBQlzdW1TY29yZXMFD3N1bUxlYWRlclNjb3JlcwkAzAgCBQt1bnBhaWRGdW5kcwUDbmlsBA9uZXdVbnBhaWRBbW91bnQJAGUCBQt1bnBhaWRGdW5kcwUKeW91ckFtb3VudAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAghBUkNISVZFRAkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMFCXdpblJlc3VsdAUNcmVnaXN0cmF0aW9ucwUMcGFpZEF0dGVtcHRzBA1hcmNoaXZlQWN0aW9uAwkAZwIAAAUPbmV3VW5wYWlkQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUDdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnlvdXJBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCmF3YXJkZWRLZXkGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQl1bnBhaWRLZXkFD25ld1VucGFpZEFtb3VudAUDbmlsBQ1hcmNoaXZlQWN0aW9uAAABaQEJYXdhcmRMYW5kAQ13aW5uZXJBZGRyZXNzBAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUKYWRtaW5zTGlzdAUGY2FsbGVyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEC2xhbmRBc3NldElkCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIKYXdhcmRTTGFuZAkAzAgCBQ13aW5uZXJBZGRyZXNzBQNuaWwFA25pbAkAlAoCBQNuaWwFC2xhbmRBc3NldElkADQes5o=", "height": 2757172, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2Lt9XTqmK62tLhMwRwXrXxvMvCPGqqyLGMBZX1v1aSnj Next: CjGYuxNegqHx5kD4AtQw6ozJvu96Caft6gKbmKSRhgPu Diff:
OldNewDifferences
500500 }
501501
502502
503+
504+@Callable(i)
505+func awardLand (winnerAddress) = {
506+ let caller = toString(i.caller)
507+ if (!(containsElement(adminsList, caller)))
508+ then throw("Permission denied")
509+ else {
510+ let landAssetId = asString(invoke(stakingContract, "awardSLand", [winnerAddress], nil))
511+ $Tuple2(nil, landAssetId)
512+ }
513+ }
514+
515+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DEFAULTLOCATION = "Africa_F_Africa"
55
66 let locIdxContinent = 0
77
88 let locIdxType = 1
99
1010 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
1111
1212
1313 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
1414
1515
1616 let lastTourIdKey = "%s__lastTourId"
1717
1818 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
1919
2020
2121 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
2222
2323
2424 func keyScoreBoardByTour (tId) = ("%s%d__scoreBoard__" + toString(tId))
2525
2626
2727 func keySumScoresByTour (tId) = ("%s%d__sumScores__" + toString(tId))
2828
2929
3030 func keyUnpaidRewardsByTour (tId) = ("%s%d__unpaidRewards__" + toString(tId))
3131
3232
3333 func keyLastRegisteredTourByDuck (duckAssetId) = ("%s%s__lastRegisteredTourByDuck__" + duckAssetId)
3434
3535
3636 func keyIsRegisteredByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(tId), duckAssetId], "__")
3737
3838
3939 func keyIsAwardedByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isAwardedByTourAndDuck", toString(tId), duckAssetId], "__")
4040
4141
4242 func keyLastAttemptByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__lastAttemptByTourAndDuck", toString(tId), duckAssetId], "__")
4343
4444
4545 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
4646
4747
4848 func keyBestTxByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestTxByTourAndDuck", toString(tId), duckAssetId], "__")
4949
5050
5151 let idxStatic = 0
5252
5353 let idxDynamic = 1
5454
5555 let tStaticRegisterCost = 2
5656
5757 let tStaticAttemptCost = 3
5858
5959 let tStaticStart = 5
6060
6161 let tStaticEnd = 6
6262
6363 let tStaticNumGrands = 7
6464
6565 let tDynamicStatus = 1
6666
6767 let tDynamicLeaders = 2
6868
6969 let tDynamicWinResult = 3
7070
7171 let tDynamicTotalRegCount = 4
7272
7373 let tDynamicTotalAttempts = 5
7474
7575 func getTourData (tourContract,tId) = {
7676 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
7777 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
7878 [static, dynamic]
7979 }
8080
8181
8282 func isInTournament (tourContract,location) = {
8383 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
8484 let loc = split(location, "_")
8585 let now = lastBlock.timestamp
8686 let tData = getTourData(tourContract, lastId)
8787 let static = tData[idxStatic]
8888 let dynamic = tData[idxDynamic]
8989 if (if (if ((loc[locIdxType] == "T"))
9090 then (parseIntValue(loc[locIdxContinent]) == lastId)
9191 else false)
9292 then (dynamic[tDynamicStatus] == "INPROGRESS")
9393 else false)
9494 then (parseIntValue(static[tStaticEnd]) > now)
9595 else false
9696 }
9797
9898
9999 let chain = take(drop(this.bytes, 1), 1)
100100
101101 let defaultRestAddressStr = match chain {
102102 case _ =>
103103 if ((base58'2W' == $match0))
104104 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
105105 else if ((base58'2T' == $match0))
106106 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
107107 else throw("Unknown chain")
108108 }
109109
110110 let SEP = "__"
111111
112112 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
113113
114114
115115 let IdxCfgStakingDapp = 1
116116
117117 let IdxCfgWlgDapp = 4
118118
119119 func keyRestCfg () = "%s__restConfig"
120120
121121
122122 func keyRestAddress () = "%s__restAddr"
123123
124124
125125 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
126126
127127
128128 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
129129
130130
131131 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
132132
133133 let restCfg = readRestCfgOrFail(restContract)
134134
135135 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
136136
137137 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
138138
139139 let wlgAssetIdKey = "wlg_assetId"
140140
141141 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
142142
143143 func asString (v) = match v {
144144 case s: String =>
145145 s
146146 case _ =>
147147 throw("fail to cast into String")
148148 }
149149
150150
151151 func asInt (v) = match v {
152152 case n: Int =>
153153 n
154154 case _ =>
155155 throw("fail to cast into Int")
156156 }
157157
158158
159159 func fixedPoint (val,decimals) = {
160160 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
161161 let lowPart = toString((val % tenPow))
162162 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
163163 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
164164 }
165165
166166
167167 func padL (val,len) = {
168168 let valS = toString(val)
169169 let zeroes = drop(toString(pow(10, 0, (len - size(valS)), 0, 0, DOWN)), 1)
170170 (zeroes + valS)
171171 }
172172
173173
174174 let MAXTOURNAMENTLENGTH = 432000000
175175
176176 let HOUR = 3600000
177177
178178 let adminsList = [toString(this), match chain {
179179 case _ =>
180180 if ((base58'2W' == $match0))
181181 then "3PEe2RELUHCFCBsmSCNcBJ8N3URLVQende7"
182182 else if ((base58'2T' == $match0))
183183 then "3MtBgJTaLxPB3C7UJD1UE8qjkHthfKvFQYY"
184184 else throw("Unknown chain")
185185 }]
186186
187187 func staticData (txId,registerCost,attemptCost,creationTime,startTime,endTime,numGrands) = makeString(["%s%d%d%d%d%d%d", txId, toString(registerCost), toString(attemptCost), toString(creationTime), toString(startTime), toString(endTime), toString(numGrands)], SEP)
188188
189189
190190 func dynamicData (status,leaders,winResult,totalRegs,totalAttempts) = makeString_2C(["%s%s%d%d%d", status, leaders, toString(winResult), toString(totalRegs), toString(totalAttempts)], SEP)
191191
192192
193193 func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
194194
195195
196196 func duckByCaller (caller) = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(caller))), "You don't have a duck staked")
197197
198198
199199 @Callable(i)
200200 func createTournament (startTime,endTime,registerCost,attemptCost,numGrands) = {
201201 let caller = toString(i.caller)
202202 if (!(containsElement(adminsList, caller)))
203203 then throw("Permission denied")
204204 else {
205205 let lastId = getInteger(lastTourIdKey)
206206 let tId = if (isDefined(lastId))
207207 then {
208208 let lastTourId = value(lastId)
209209 let dynamic = valueOrErrorMessage(getString(keyTourDynamicDataById(lastTourId)), (("Error reading tournament " + toString(lastTourId)) + " data"))
210210 let status = split(dynamic, SEP)[tDynamicStatus]
211211 if ((status != "ARCHIVED"))
212212 then throw(("Current tournement is not completed, status=" + status))
213213 else (lastTourId + 1)
214214 }
215215 else 1
216216 let now = lastBlock.timestamp
217217 if ((now > startTime))
218218 then throw(((("startTime=" + toString(startTime)) + " < creationTime=") + toString(now)))
219219 else if ((startTime > endTime))
220220 then throw(((("endTime=" + toString(endTime)) + " < startTime=") + toString(startTime)))
221221 else if (((endTime - startTime) > MAXTOURNAMENTLENGTH))
222222 then throw(((("Tournament period exceeds max: " + toString((endTime - startTime))) + " > ") + toString(MAXTOURNAMENTLENGTH)))
223223 else if (if ((0 >= registerCost))
224224 then true
225225 else (0 >= attemptCost))
226226 then throw(((("Cost should be positive, but passed " + toString(registerCost)) + " and ") + toString(attemptCost)))
227227 else if ((0 > numGrands))
228228 then throw("Number of Grand Prizes should be non-negative")
229229 else $Tuple2([IntegerEntry(lastTourIdKey, tId), StringEntry(keyTourStaticDataById(tId), staticData(toBase58String(i.transactionId), registerCost, attemptCost, now, startTime, endTime, numGrands)), StringEntry(keyTourDynamicDataById(tId), dynamicData("CREATED", " ", 0, 0, 0))], tId)
230230 }
231231 }
232232
233233
234234
235235 @Callable(i)
236236 func register () = {
237237 let prologResult = prolog()
238238 if ((size(i.payments) != 1))
239239 then throw("exactly 1 payment must be attached")
240240 else {
241241 let pmt = i.payments[0]
242242 let wlgAmt = pmt.amount
243243 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WLGOLD payments only!")
244244 if ((pmtAssetId != wlgAssetId))
245245 then throw("WLGOLD payments only!")
246246 else {
247247 let lastId = valueOrErrorMessage(getInteger(lastTourIdKey), "No active tournaments")
248248 let now = lastBlock.timestamp
249249 let tData = getTourData(this, lastId)
250250 let static = tData[idxStatic]
251251 let dynamic = tData[idxDynamic]
252252 let status = dynamic[tDynamicStatus]
253253 if (!(if (if (if ((status == "CREATED"))
254254 then (now > parseIntValue(static[tStaticStart]))
255255 else false)
256256 then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
257257 else false)
258258 then true
259259 else if ((status == "INPROGRESS"))
260260 then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
261261 else false))
262262 then throw("Cannot register now")
263263 else {
264264 let regCost = parseIntValue(static[tStaticRegisterCost])
265265 if ((wlgAmt != regCost))
266266 then throw((("Need payment of " + fixedPoint(regCost, 8)) + " WLGOLD"))
267267 else {
268268 let duckAssetId = duckByCaller(i.originCaller)
269269 let scoreKey = keyScoreBoardByTour(lastId)
270270 let oldScoreBoard = valueOrElse(getString(scoreKey), "")
271271 if (if (valueOrElse(getBoolean(keyIsRegisteredByTourAndDuck(lastId, duckAssetId)), false))
272272 then true
273273 else contains(oldScoreBoard, duckAssetId))
274274 then throw(((("Your duck " + duckAssetId) + " is already registered at tournament ") + toString(lastId)))
275275 else {
276276 let updatedDynamicData = dynamicData("INPROGRESS", dynamic[tDynamicLeaders], parseIntValue(dynamic[tDynamicWinResult]), (parseIntValue(dynamic[tDynamicTotalRegCount]) + 1), parseIntValue(dynamic[tDynamicTotalAttempts]))
277277 $Tuple2([IntegerEntry(keyLastRegisteredTourByDuck(duckAssetId), lastId), BooleanEntry(keyIsRegisteredByTourAndDuck(lastId, duckAssetId), true), StringEntry(scoreKey, if ((oldScoreBoard == ""))
278278 then (duckAssetId + ":000")
279279 else (((oldScoreBoard + "_") + duckAssetId) + ":000")), StringEntry(keyTourDynamicDataById(lastId), updatedDynamicData)], prologResult)
280280 }
281281 }
282282 }
283283 }
284284 }
285285 }
286286
287287
288288
289289 @Callable(i)
290290 func newAttempt () = {
291291 let prologResult = prolog()
292292 let duckAssetId = duckByCaller(i.originCaller)
293293 let lastId = valueOrErrorMessage(getInteger(lastTourIdKey), "No active tournaments")
294294 let now = lastBlock.timestamp
295295 let tData = getTourData(this, lastId)
296296 let static = tData[idxStatic]
297297 let dynamic = tData[idxDynamic]
298298 let status = dynamic[tDynamicStatus]
299299 if (!(if ((status == "INPROGRESS"))
300300 then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
301301 else false))
302302 then throw("Attempt is not possible")
303303 else if (!(valueOrElse(getBoolean(keyIsRegisteredByTourAndDuck(lastId, duckAssetId)), false)))
304304 then throw(((("Your duck " + duckAssetId) + " is not registered at tournament ") + toString(lastId)))
305305 else {
306306 let attemptsIteratorKey = keyLastAttemptByTourAndDuck(lastId, duckAssetId)
307307 let lastAttempt = getInteger(attemptsIteratorKey)
308308 let $t061116743 = if (!(isDefined(lastAttempt)))
309309 then $Tuple2(0, 0)
310310 else if ((size(i.payments) != 1))
311311 then throw("exactly 1 payment must be attached")
312312 else {
313313 let pmt = i.payments[0]
314314 let wlgAmt = pmt.amount
315315 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WLGOLD payments only!")
316316 if ((pmtAssetId != wlgAssetId))
317317 then throw("WLGOLD payments only!")
318318 else {
319319 let attCost = parseIntValue(static[tStaticAttemptCost])
320320 if ((wlgAmt != attCost))
321321 then throw((("Need payment of " + fixedPoint(attCost, 8)) + " WLGOLD"))
322322 else $Tuple2((value(lastAttempt) + 1), 1)
323323 }
324324 }
325325 let payedAttempts = $t061116743._1
326326 let increment = $t061116743._2
327327 let updatedDynamicData = dynamicData("INPROGRESS", dynamic[tDynamicLeaders], parseIntValue(dynamic[tDynamicWinResult]), parseIntValue(dynamic[tDynamicTotalRegCount]), (parseIntValue(dynamic[tDynamicTotalAttempts]) + increment))
328328 let tourLoc = asString(invoke(stakingContract, "initDuckTourAttempt", [duckAssetId], nil))
329329 $Tuple2([IntegerEntry(attemptsIteratorKey, payedAttempts), StringEntry(keyTourDynamicDataById(lastId), updatedDynamicData)], [prologResult, payedAttempts, tourLoc])
330330 }
331331 }
332332
333333
334334
335335 @Callable(i)
336336 func saveDuckResult (duckAssetId,duckNewBest) = if ((i.caller != stakingContract))
337337 then throw("Access denied")
338338 else {
339339 let lastId = valueOrErrorMessage(getInteger(lastTourIdKey), "No active tournaments")
340340 let tData = getTourData(this, lastId)
341341 let static = tData[idxStatic]
342342 let dynamic = tData[idxDynamic]
343343 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
344344 let bestResultKey = keyBestResultByTourAndDuck(lastId, duckAssetId)
345345 let sumScoresKey = keySumScoresByTour(lastId)
346346 let oldSumScores = valueOrElse(getInteger(sumScoresKey), 0)
347347 if (isInTournament(this, curLocation))
348348 then {
349349 let duckOldBest = valueOrElse(getInteger(bestResultKey), 0)
350350 let scoreKey = keyScoreBoardByTour(lastId)
351351 let oldScoreBoard = valueOrElse(getString(scoreKey), "")
352352 let $t082369397 = if ((duckNewBest > duckOldBest))
353353 then if (!(contains(oldScoreBoard, duckAssetId)))
354354 then throw(("scoreBoard does not contain " + duckAssetId))
355355 else {
356356 let oldBest = parseIntValue(dynamic[tDynamicWinResult])
357357 let leaders = dynamic[tDynamicLeaders]
358358 let oldLeadersList = if (if ((leaders == ""))
359359 then true
360360 else (leaders == " "))
361361 then nil
362362 else split_4C(leaders, ",")
363363 let newLeadersList = if ((duckNewBest > oldBest))
364364 then [duckAssetId]
365365 else if (if ((oldBest > duckNewBest))
366366 then true
367367 else containsElement(oldLeadersList, duckAssetId))
368368 then oldLeadersList
369369 else (oldLeadersList :+ duckAssetId)
370370 let updatedDynamicData = dynamicData("INPROGRESS", makeString_2C(newLeadersList, ","), max([duckNewBest, oldBest]), parseIntValue(dynamic[tDynamicTotalRegCount]), parseIntValue(dynamic[tDynamicTotalAttempts]))
371371 let parts = split_51C(oldScoreBoard, duckAssetId)
372372 $Tuple3(((((parts[0] + duckAssetId) + ":") + padL(duckNewBest, 3)) + drop(parts[1], 4)), ((oldSumScores + duckNewBest) - duckOldBest), [StringEntry(keyTourDynamicDataById(lastId), updatedDynamicData)])
373373 }
374374 else $Tuple3(oldScoreBoard, oldSumScores, nil)
375375 let newScoreBoard = $t082369397._1
376376 let newSumScores = $t082369397._2
377377 let globalActions = $t082369397._3
378378 $Tuple2(([IntegerEntry(bestResultKey, max([duckOldBest, duckNewBest])), IntegerEntry(sumScoresKey, newSumScores), StringEntry(keyBestTxByTourAndDuck(lastId, duckAssetId), toBase58String(i.transactionId)), StringEntry(scoreKey, newScoreBoard)] ++ globalActions), 0)
379379 }
380380 else $Tuple2(nil, 0)
381381 }
382382
383383
384384
385385 @Callable(i)
386386 func processTournament (tId) = {
387387 let caller = toString(i.caller)
388388 if (!(containsElement(adminsList, caller)))
389389 then throw("Permission denied")
390390 else {
391391 let now = lastBlock.timestamp
392392 let tData = getTourData(this, tId)
393393 let static = tData[idxStatic]
394394 let dynamic = tData[idxDynamic]
395395 let status = dynamic[tDynamicStatus]
396396 let registrations = parseIntValue(dynamic[tDynamicTotalRegCount])
397397 let paidAttempts = parseIntValue(dynamic[tDynamicTotalAttempts])
398398 let regCost = parseIntValue(static[tStaticRegisterCost])
399399 let attCost = parseIntValue(static[tStaticAttemptCost])
400400 if ((status == "ARCHIVED"))
401401 then throw((("Tournament " + toString(tId)) + " is already ARCHIVED"))
402402 else if (if ((status == "INPROGRESS"))
403403 then (parseIntValue(static[tStaticEnd]) > now)
404404 else false)
405405 then throw((("Tournament " + toString(tId)) + " is not over yet"))
406406 else {
407407 let updatedDynamicData = dynamicData("PROCESSING", dynamic[tDynamicLeaders], parseIntValue(dynamic[tDynamicWinResult]), registrations, paidAttempts)
408408 $Tuple2([StringEntry(keyTourDynamicDataById(tId), updatedDynamicData), IntegerEntry(keyUnpaidRewardsByTour(tId), (((registrations * regCost) + (paidAttempts * attCost)) / 2))], 0)
409409 }
410410 }
411411 }
412412
413413
414414
415415 @Callable(i)
416416 func finishTournament (tId) = {
417417 let caller = toString(i.caller)
418418 if (!(containsElement(adminsList, caller)))
419419 then throw("Permission denied")
420420 else {
421421 let tData = getTourData(this, tId)
422422 let dynamic = tData[idxDynamic]
423423 let status = dynamic[tDynamicStatus]
424424 if ((status == "ARCHIVED"))
425425 then throw((("Tournament " + toString(tId)) + " is already ARCHIVED"))
426426 else {
427427 let updatedDynamicData = dynamicData("ARCHIVED", dynamic[tDynamicLeaders], parseIntValue(dynamic[tDynamicWinResult]), parseIntValue(dynamic[tDynamicTotalRegCount]), parseIntValue(dynamic[tDynamicTotalAttempts]))
428428 $Tuple2([StringEntry(keyTourDynamicDataById(tId), updatedDynamicData)], 0)
429429 }
430430 }
431431 }
432432
433433
434434
435435 @Callable(i)
436436 func claimPrize (tId) = {
437437 let prologResult = prolog()
438438 if ((size(i.payments) != 0))
439439 then throw("No payments required")
440440 else {
441441 let tData = getTourData(this, tId)
442442 let static = tData[idxStatic]
443443 let dynamic = tData[idxDynamic]
444444 let status = dynamic[tDynamicStatus]
445445 if ((status != "PROCESSING"))
446446 then throw((("Tournament " + toString(tId)) + " is not PROCESSING"))
447447 else {
448448 let registrations = parseIntValue(dynamic[tDynamicTotalRegCount])
449449 let paidAttempts = parseIntValue(dynamic[tDynamicTotalAttempts])
450450 let regCost = parseIntValue(static[tStaticRegisterCost])
451451 let attCost = parseIntValue(static[tStaticAttemptCost])
452452 let awardFunds = (((registrations * regCost) + (paidAttempts * attCost)) / 2)
453453 let unpaidKey = keyUnpaidRewardsByTour(tId)
454454 let unpaidFunds = valueOrElse(getInteger(unpaidKey), 0)
455455 let duckAssetId = duckByCaller(i.originCaller)
456456 if (!(valueOrElse(getBoolean(keyIsRegisteredByTourAndDuck(tId, duckAssetId)), false)))
457457 then throw(((("Your duck " + duckAssetId) + " is not registered at tournament ") + toString(tId)))
458458 else {
459459 let bestResultKey = keyBestResultByTourAndDuck(tId, duckAssetId)
460460 let duckBest = valueOrElse(getInteger(bestResultKey), 0)
461461 if ((duckBest == 0))
462462 then throw("Your duck got zero score")
463463 else {
464464 let awardedKey = keyIsAwardedByTourAndDuck(tId, duckAssetId)
465465 if (valueOrElse(getBoolean(awardedKey), false))
466466 then throw(((("Your duck " + duckAssetId) + " is already awarded at tournament ") + toString(tId)))
467467 else {
468468 let sumScoresKey = keySumScoresByTour(tId)
469469 let sumScores = valueOrElse(getInteger(sumScoresKey), 0)
470470 let leaders = dynamic[tDynamicLeaders]
471471 let leadersList = if (if ((leaders == ""))
472472 then true
473473 else (leaders == " "))
474474 then nil
475475 else split_4C(leaders, ",")
476476 let numLeaders = size(leadersList)
477477 if ((numLeaders == 0))
478478 then throw(("No leaders at tournament " + toString(tId)))
479479 else {
480480 let numGrands = parseIntValue(static[tStaticNumGrands])
481481 let winResult = parseIntValue(dynamic[tDynamicWinResult])
482482 let sumLeaderScores = if ((numLeaders > numGrands))
483483 then 0
484484 else if (containsElement(leadersList, duckAssetId))
485485 then throw("As one of winners, you will be awarded by admins")
486486 else (numLeaders * winResult)
487487 let yourAmount = min([fraction(duckBest, awardFunds, (sumScores - sumLeaderScores)), unpaidFunds])
488488 let newUnpaidAmount = (unpaidFunds - yourAmount)
489489 let updatedDynamicData = dynamicData("ARCHIVED", dynamic[tDynamicLeaders], winResult, registrations, paidAttempts)
490490 let archiveAction = if ((0 >= newUnpaidAmount))
491491 then [StringEntry(keyTourDynamicDataById(tId), updatedDynamicData)]
492492 else nil
493493 $Tuple2(([ScriptTransfer(i.caller, yourAmount, wlgAssetId), BooleanEntry(awardedKey, true), IntegerEntry(unpaidKey, newUnpaidAmount)] ++ archiveAction), 0)
494494 }
495495 }
496496 }
497497 }
498498 }
499499 }
500500 }
501501
502502
503+
504+@Callable(i)
505+func awardLand (winnerAddress) = {
506+ let caller = toString(i.caller)
507+ if (!(containsElement(adminsList, caller)))
508+ then throw("Permission denied")
509+ else {
510+ let landAssetId = asString(invoke(stakingContract, "awardSLand", [winnerAddress], nil))
511+ $Tuple2(nil, landAssetId)
512+ }
513+ }
514+
515+

github/deemru/w8io/169f3d6 
76.22 ms