tx · GLDpPKi4RNQ3oPnh2uBiTa69SC9qTs6Tcw6GQaU5ZRtd 3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu: -0.02400000 Waves 2022.07.29 21:12 [2161458] smart account 3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu > SELF 0.00000000 Waves
{ "type": 13, "id": "GLDpPKi4RNQ3oPnh2uBiTa69SC9qTs6Tcw6GQaU5ZRtd", "fee": 2400000, "feeAssetId": null, "timestamp": 1659118421641, "version": 2, "chainId": 84, "sender": "3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu", "senderPublicKey": "914UmzBhcoS4onGGVcBRgb4VPV88m9VCFjsj5WWck5vm", "proofs": [ "5MW3bnc7t8j6m2zxUZiVJ4zXodSfMSJgKSzxPoE4UchRxFedTGi8XLyXHjHVFY411y613bkwiJgfbiHZKsjKcLTZ" ], "script": "base64:BgJeCAISAwoBCBIDCgEIEgUKAwEICBIMCgoICAgICAgICAgIEg4KDAgBAQgIAQgICAEBARIECgIIARIECgIICBIFCgMICAgSAwoBCBIECgIICBIGCgQICAgIEgUKAwgICFMACHVuaXRUZXN0BwAJb3JhY2xlS2V5AglvcmFjbGVLZXkBBmdldFN0cgEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAAGb3JhY2xlCQEGZ2V0U3RyAQUJb3JhY2xlS2V5AAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQUGb3JhY2xlAAZvd25lcnMJAMwIAgkAnQgCBQlvcmFjbGVGZWUCBm93bmVyMQkAzAgCCQCdCAIFCW9yYWNsZUZlZQIGb3duZXIyBQNuaWwAD2NvbGxlY3Rpb25zRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIPY29sbGVjdGlvbnNEYXBwAhhjb2xsZWN0aW9uRGFwcCBub3QgZm91bmQAC2ZlZVJlY2VpdmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAgtmZWVSZWNlaXZlcgIVZmVlUmVjZWl2ZXIgbm90IGZvdW5kAAhjZXJ0RGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIIY2VydERhcHACEmNlcnREYXBwIG5vdCBmb3VuZAAHZmVlRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIHZmVlRGFwcAIRZmVlRGFwcCBub3QgZm91bmQACHVzZXJEYXBwCQEFdmFsdWUBCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlvcmFjbGVGZWUCCHVzZXJEYXBwAhJ1c2VyZGFwcCBub3QgZm91bmQACXN0YWtlRGFwcAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAglzdGFrZURhcHACFHNjb25leERhcHAgbm90IGZvdW5kAAtVU0ROQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQlvcmFjbGVGZWUCC1VTRE5Bc3NldElkAA1TY29uZXhBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFCW9yYWNsZUZlZQINU2NvbmV4QXNzZXRJZAAFdHlwZXMJAMwIAgIFSU1BR0UJAMwIAgIDUERGCQDMCAICBVZJREVPBQNuaWwADFByZXZpZXd0eXBlcwkAzAgCAgNQREYFA25pbAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAAMYXVjdGlvblR5cGUxAgdCSURUWVBFAAxhdWN0aW9uVHlwZTICC1RSQURJVElPTkFMAAxhdWN0aW9uVHlwZTMCBkRJUkVDVAEXZ2V0U3RyaW5nQnlLZXlGcm9tVXNlcnMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAUDa2V5AgABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABFWdldFN0cmluZ0J5S2V5T3JFcnJvcgIDa2V5BWVycm9yCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5BQVlcnJvcgEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleVByZXZpZXdDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X3ByZXZpZXdfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBEmtleUhpZ2hlc3RCaWRCaWRJZAEFYXJ0SWQJAKwCAgIUYXJ0X2hpZ2hlc3RCaWRCaWRJZF8FBWFydElkAQhrZXlCaWRJZAEFYmlkSWQJAKwCAgIEYmlkXwUFYmlkSWQBC2tleUR1cmF0aW9uAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDWFydF9kdXJhdGlvbl8FBWFydElkAgFfBQZjYWxsZXIBDGtleUVuZEhlaWdodAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfZW5kaGVpZ2h0XwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5QXVjdGlvblR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2F1Y3Rpb250eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxLZXlOZnRJc3N1ZXIBBW5mdElkCQCsAgICC25mdF9pc3N1ZWRfBQVuZnRJZAELS2V5TmZ0QXJ0SWQBBW5mdElkCQCsAgICCm5mdF9hcnRJZF8FBW5mdElkAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUVudGl0bGVtZW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9lbnRpdGxlbWVudF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAESa2V5VHhpZEJ5SGFzaE93bmVyAgpzaGEyNTZIYXNoBmNhbGxlcgkArAICAhdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkA2AQBCQDUFgEJAJsDAQkArAICBQpzaGEyNTZIYXNoBQZjYWxsZXIBDWtleUNvbGxlY3Rpb24CBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FBWFydElkAgFfBQZjYWxsZXIADG1pblVTRE5QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICBG1pbl8JANgEAQULVVNETkFzc2V0SWQAEGN1cnJlbnRGZWVTY29uZXgJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAgRmZWVfCQDYBAEFDVNjb25leEFzc2V0SWQBEGdldEFtb3VudEJ5QmlkSWQBBWJpZElkCQELdmFsdWVPckVsc2UCCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleUJpZElkAQUFYmlkSWQAAAEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBWFydElkBAViaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkCQEQZ2V0QW1vdW50QnlCaWRJZAEFBWJpZElkAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICdBY2NvdW50JyB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAARN2YWxpZGF0ZUFydHdvcmtEYXRhBQZjYWxsZXIKY2lkRGlzcGxheQRuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBAiE9AgkAsQIBBQpjaWREaXNwbGF5AC4JAAIBAh5UaGlzIGRvZXNuJ3Qgc2VlbSBhIHZhbGlkIENJRCEDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AgFpBWluZGV4AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAVwRGF0YQkBCWlzUGF5bWVudAIFAWkAAQQHcGF5bWVudAgFBXBEYXRhAl8xBAZhbW91bnQIBQVwRGF0YQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhdBc3NldCBJZCBpcyBub3QgZGVmaW5lZAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAhRQYXltZW50IGRvbid0IG1hdGNoIAkApAMBBQxhcnR3b3JrUHJpY2UCASAJAKQDAQUGYW1vdW50CQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBAhJPbmx5IFVTRE4gYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwCB2Fzc2V0SWQFcHJpY2UEDW1pblNlbGxTY29uZXgFDG1pblVTRE5QcmljZQMDAwkBAiE9AgUFcHJpY2UAAAkAZgIFDW1pblNlbGxTY29uZXgFBXByaWNlBwYJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBCQCsAgICGVdyb25nIG1pbmltdW0gc2VsbCBwcmljZSAJAKQDAQUNbWluU2VsbFNjb25leAYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQpnZXRBcnREYXRhBAFpBmlzc3VlcgVhcnRJZAVpc0JpZAQOY2FsbGVySXNJc3N1ZXIJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFBmlzc3VlcgQIdG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBAhB0b3RhbF9uZnRfaXNzdWVkBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAxhcnR3b3JrUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEIa2V5UHJpY2UCBQZpc3N1ZXIFBWFydElkBQxtaW5VU0ROUHJpY2UEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFC1VTRE5Bc3NldElkCQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMDAwkBASEBBQVpc0JpZAkBASEBBQ5jYWxsZXJJc0lzc3VlcgcDAwkAZwIAAAUMYXJ0d29ya1ByaWNlBgkBASEBBQhpc09uU2FsZQYJAGcCAAAFCm1heENhblNlbGwHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQVpc0JpZAUOY2FsbGVySXNJc3N1ZXIHCQBnAgAABQptYXhDYW5TZWxsBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0CQCZCgcFCHRvdGFsTkZUBQthcnR3b3JrTmFtZQUKYW1vdW50U29sZAUMYXJ0d29ya1ByaWNlBQxwcmljZUFzc2V0SWQFCm1heENhblNlbGwFCGlzT25TYWxlAQpnZXRCaWREYXRhCQFpBmNhbGxlcgZpc3N1ZXIFYXJ0SWQIYmlkT3duZXIFYmlkSWQMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQVpc0JpZAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAx0MDEzNTE5MTM2NDgDBQVpc0JpZAkBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBBQpiaWREYXRhS2V5CQEUdmFsaWRhdGVQcmljZUFzc2V0SWQDBQFpBQxwcmljZUFzc2V0SWQFDGFydHdvcmtQcmljZQQGYW1vdW50CAUMdDAxMzUxOTEzNjQ4Al8xBAdhc3NldElkCAUMdDAxMzUxOTEzNjQ4Al8yCQCVCgMFCmJpZERhdGFLZXkFBmFtb3VudAUHYXNzZXRJZAEMZ2V0SXNzdWVEYXRhCwZpc3N1ZXIFYXJ0SWQLYXJ0d29ya05hbWUNbmV3QW1vdW50U29sZAptYXhDYW5TZWxsCHRvdGFsTkZUBmNhbGxlcghiaWRPd25lcgViaWRJZAFpCGlzT25TYWxlBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAggsQXJ0SUQ6IAUFYXJ0SWQCDyxBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCCxJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMJAQIhPQIFCGJpZE93bmVyAgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIJAJUKAwUKc2VsbFN0YXR1cwUKcmVjZWl2ZU5GVAUJaXNzdWVNZXRhAQxnZXRCaWRLZXlWYWwDB2Fzc2V0SWQKYmlkRGF0YUtleQRkYXRlBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAkAAgECFU9ubHkgVVNETiBpcyBhY2NlcHRlZAkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQCVCgMFCmFzc2V0SWRCaWQFCWJpZERlbE9sZAUJYmlkVXBkYXRlAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgVpc0JpZAQKY2FsbGVyRGF0YQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUKY2FsbGVyRGF0YQJfMQQGY2FsbGVyCAUKY2FsbGVyRGF0YQJfMgQEZGF0ZQgFCmNhbGxlckRhdGECXzMEB2FydERhdGEJAQpnZXRBcnREYXRhBAUBaQUGaXNzdWVyBQVhcnRJZAUFaXNCaWQECHRvdGFsTkZUCAUHYXJ0RGF0YQJfMQQLYXJ0d29ya05hbWUIBQdhcnREYXRhAl8yBAphbW91bnRTb2xkCAUHYXJ0RGF0YQJfMwQMYXJ0d29ya1ByaWNlCAUHYXJ0RGF0YQJfNAQMcHJpY2VBc3NldElkCAUHYXJ0RGF0YQJfNQQKbWF4Q2FuU2VsbAgFB2FydERhdGECXzYECGlzT25TYWxlCAUHYXJ0RGF0YQJfNwQHYmlkRGF0YQkBCmdldEJpZERhdGEJBQFpBQZjYWxsZXIFBmlzc3VlcgUFYXJ0SWQFCGJpZE93bmVyBQViaWRJZAUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UFBWlzQmlkBApiaWREYXRhS2V5CAUHYmlkRGF0YQJfMQQGYW1vdW50CAUHYmlkRGF0YQJfMgQHYXNzZXRJZAgFB2JpZERhdGECXzMEDW5ld0Ftb3VudFNvbGQDCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDk1heCBpdGVtcyBzb2xkCQBkAgUKYW1vdW50U29sZAABBAppc3N1ZXJEYXRhCQEMZ2V0SXNzdWVEYXRhCwUGaXNzdWVyBQVhcnRJZAULYXJ0d29ya05hbWUFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwFCHRvdGFsTkZUBQZjYWxsZXIFCGJpZE93bmVyBQViaWRJZAUBaQUIaXNPblNhbGUECnNlbGxTdGF0dXMIBQppc3N1ZXJEYXRhAl8xBApyZWNlaXZlTkZUCAUKaXNzdWVyRGF0YQJfMgQJaXNzdWVNZXRhCAUKaXNzdWVyRGF0YQJfMwQLaWRORlRJbnZva2UJAPwHBAUEdGhpcwIHbWludE5mdAkAzAgCBQh0b3RhbE5GVAkAzAgCBQlpc3N1ZU1ldGEJAMwIAgkApQgBBQpyZWNlaXZlTkZUBQNuaWwFA25pbAMJAAACBQtpZE5GVEludm9rZQULaWRORlRJbnZva2UEBWlkTkZUBAckbWF0Y2gwBQtpZE5GVEludm9rZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXIFByRtYXRjaDAFAXIJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAQLYmlkS2V5VmFsdWUJAQxnZXRCaWRLZXlWYWwDBQdhc3NldElkBQpiaWREYXRhS2V5BQRkYXRlBAphc3NldElkQmlkCAULYmlkS2V5VmFsdWUCXzEECWJpZERlbE9sZAgFC2JpZEtleVZhbHVlAl8yBAliaWRVcGRhdGUIBQtiaWRLZXlWYWx1ZQJfMwQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwUFaWRORlQEEmludm9rZVRlYW1GZWVTcGxpdAkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHZmVlRGFwcAkArAICBQdmZWVEYXBwAgogbm90IGZvdW5kAgZwYXlGZWUJAMwIAgUFYXJ0SWQJAMwIAgUGaXNzdWVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsAwkAAAIFEmludm9rZVRlYW1GZWVTcGxpdAUSaW52b2tlVGVhbUZlZVNwbGl0BAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBAZidXlSZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQELU3RyaW5nRW50cnkCCQEMS2V5TmZ0SXNzdWVyAQUFaWRORlQFBmlzc3VlcgkAzAgCCQELU3RyaW5nRW50cnkCCQELS2V5TmZ0QXJ0SWQBBQVpZE5GVAUFYXJ0SWQFA25pbAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAAFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBANyZXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUIY2VydERhcHACCmNyZWF0ZUNlcnQJAMwIAgkApQgBBQpyZWNlaXZlTkZUCQDMCAIFBWlkTkZUCQDMCAIFBmlzc3VlcgUDbmlsBQNuaWwDCQAAAgUDcmVzBQNyZXMDBQVpc0JpZAkAzQgCCQDNCAIJAM0IAgUGYnV5UmVzBQhzb2xkRGF0YQUJYmlkVXBkYXRlBQliaWREZWxPbGQJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEUc2V0QmlkTm9uVHJhZGl0aW9uYWwDAWkFYXJ0SWQGaXNzdWVyBAx0MDI3NzA5Mjc3NDcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDHQwMjc3MDkyNzc0NwJfMQQGY2FsbGVyCAUMdDAyNzcwOTI3NzQ3Al8yBARkYXRlCAUMdDAyNzcwOTI3NzQ3Al8zBAx0MDI3NzUyMjc3ODgJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQx0MDI3NzUyMjc3ODgCXzEEBmFtb3VudAgFDHQwMjc3NTIyNzc4OAJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFzZXRCaWRUcmFkaXRpb25hbAMBaQVhcnRJZAZpc3N1ZXIECWVuZEhlaWdodAkBD2dldEludGVnZXJCeUtleQEJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBApoaWdoZXN0QmlkCQEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBQVhcnRJZAMJAGYCBQZoZWlnaHQFCWVuZEhlaWdodAkAAgECIVRoaXMgYXVjdGlvbiBpcyBmaW5pc2hlZCBhbHJlYWR5IQQLY2FsbGRlckRhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFC2NhbGxkZXJEYXRhAl8xBAZjYWxsZXIIBQtjYWxsZGVyRGF0YQJfMgQEZGF0ZQgFC2NhbGxkZXJEYXRhAl8zBAxpc1BheW1lbnRWYXIJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQxpc1BheW1lbnRWYXICXzEEBmFtb3VudAgFDGlzUGF5bWVudFZhcgJfMgMJAGcCBQpoaWdoZXN0QmlkBQZhbW91bnQJAAIBCQCsAgICIFBsZWFzZSBwbGFjZSBhIGJpZCBoaWdoZXIgdGhhbjogCQCkAwEFCmhpZ2hlc3RCaWQEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIWT25seSBVU0ROIGlzIGFjY2VwdGVkIQkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQED21pbkFydHdvcmtQcmljZQkBC3ZhbHVlT3JFbHNlAgkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQFDG1pblVTRE5QcmljZQMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkAZgIFD21pbkFydHdvcmtQcmljZQUGYW1vdW50CQACAQIXQmlkIGlzIGJlbG93IG1pbiBwcmljZSEECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlIaWdoZXN0QmlkQmlkSWQBBQVhcnRJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5QmlkSWQBCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdhY2NlcHRCaWROb25UcmFkaXRpb25hbAUBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYBDnJlc3RhcnRBdWN0aW9uAgVhcnRJZAZpc3N1ZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAQMb2xkRW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQECGR1cmF0aW9uCQEPZ2V0SW50ZWdlckJ5S2V5AQkBC2tleUR1cmF0aW9uAgUGaXNzdWVyBQVhcnRJZAQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAMJAGcCBQxvbGRFbmRIZWlnaHQFBmhlaWdodAkAAgECJFByZXZpb3VzIGF1Y3Rpb24gaXNuJ3QgY29tcGxldGVkIHlldAMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQImQ2FuJ3QgcmVzdGFydCBhdWN0aW9uLCBtYXggYW1vdW50IHNvbGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBQllbmRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkBQNuaWwBFGFjY2VwdEJpZFRyYWRpdGlvbmFsBQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQJZW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAZwIFCWVuZEhlaWdodAUGaGVpZ2h0CQACAQIhVGhpcyBhdWN0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQhAwkBAiE9AgUFYmlkSWQFDGhpZ2hlc3RCaWRJZAkAAgECHFRoaXMgaXMgbm90IHRoZSB3aW5uaW5nIGJpZCEEC2J1eU1pbnREYXRhCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYEEnJlc3RhcnRBdWN0aW9uRGF0YQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQFBmlzc3VlcgkAzggCBRJyZXN0YXJ0QXVjdGlvbkRhdGEFC2J1eU1pbnREYXRhAQ1jYW5jZWxCaWRJbXBsBAFpBWFydElkBmlzc3VlcgViaWRJZAQMdDAyODk0MjI5MDk0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQx0MDI4OTQyMjkwOTQCXzEEBmNhbGxlcggFDHQwMjg5NDIyOTA5NAJfMgQEZGF0ZQgFDHQwMjg5NDIyOTA5NAJfMwQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUFYmlkSWQEB2JpZERhdGEJARVnZXRTdHJpbmdCeUtleU9yRXJyb3ICCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBGGNhbmNlbEJpZEltcGxUcmFkaXRpb25hbAQBaQVhcnRJZAZpc3N1ZXIFYmlkSWQEDHQwMjg5NDIyOTA5NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUMdDAyODk0MjI5MDk0Al8xBAZjYWxsZXIIBQx0MDI4OTQyMjkwOTQCXzIEBGRhdGUIBQx0MDI4OTQyMjkwOTQCXzMEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FBWJpZElkBAdiaWREYXRhCQEVZ2V0U3RyaW5nQnlLZXlPckVycm9yAgkArAICBQpiaWREYXRhS2V5AgVfT1BFTgINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVEBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAAAIFBWJpZElkBQxoaWdoZXN0QmlkSWQJAAIBAiFZb3UgY2FuJ3QgY2FuY2VsIHRoZSBoaWdoZXN0IGJpZCEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyBQliaWRBbW91bnQFB2Fzc2V0SWQFA25pbAwBaQEIaW5pdERhcHABB2RhcHBLZXkDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uAwkBAiE9AgUGb3JhY2xlAgAJAAIBAidvcmFjbGUgYWxyZWFkeSBzZXQsIHlvdSBjYW4ndCBvdmVycmlkZSEJAMwIAgkBC1N0cmluZ0VudHJ5AgUJb3JhY2xlS2V5BQdkYXBwS2V5BQNuaWwBaQEUcmVzdGFydEF1Y3Rpb25NYW51YWwBBWFydElkAwkBAiE9AgkBGmdldEFtb3VudEhpZ2hlc3RCaWRCeUFydElkAQUFYXJ0SWQAAAkAAgECHlBsZWFzZSBhY2NlcHQgdGhlIGhpZ2hlc3QgYmlkIQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwFpAQdtaW50TmZ0Awh0b3RhbE5GVAlpc3N1ZU1ldGEKcmVjZWl2ZU5GVAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHE9ubHkgdGhlIGRBcHAgY2FuIG1pbnQgTkZUJ3MEDnJlY2VpdmVORlRBZGR5CQEHQWRkcmVzcwEJANkEAQUKcmVjZWl2ZU5GVAQIaXNzdWVORlQJAMIIBQkArAICAgdTQ09ORVhfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQJAJQKAgkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5yZWNlaXZlTkZUQWRkeQABBQVpZE5GVAUDbmlsCQDYBAEFBWlkTkZUAWkBCmFkZEFydHdvcmsKCnNoYTI1Nkhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQtlbnRpdGxlbWVudAdwcmV2aWV3CmNvbGxlY3Rpb24Nc3ViY29sbGVjdGlvbgQMdDAxNzc0MDE3NzgxCQEMaWRDYWxsZXJEYXRlAQUBaQQFYXJ0SWQIBQx0MDE3NzQwMTc3ODECXzEEBmNhbGxlcggFDHQwMTc3NDAxNzc4MQJfMgQEZGF0ZQgFDHQwMTc3NDAxNzc4MQJfMwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBXR5cGVzBQR0eXBlCQACAQIMVW5rbm93biB0eXBlBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhBQUGY2FsbGVyBQpjaWREaXNwbGF5BQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UEC3ByZXZpZXdEYXRhAwkBD2NvbnRhaW5zRWxlbWVudAIFDFByZXZpZXd0eXBlcwUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5UHJldmlld0NpZAIFBmNhbGxlcgUFYXJ0SWQFB3ByZXZpZXcFA25pbAUDbmlsBBZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQ9jb2xsZWN0aW9uc0RhcHAJAKwCAgUPY29sbGVjdGlvbnNEYXBwAgogbm90IGZvdW5kAhFjb2xsZWN0aW9uUHJvY2VzcwkAzAgCBQpjb2xsZWN0aW9uCQDMCAIFDXN1YmNvbGxlY3Rpb24JAMwIAgUGY2FsbGVyBQNuaWwFA25pbAMJAAACBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIfVGhpcyBoYXNoIGlzIGFscmVhZHkgcmVnaXN0ZXJlZAkAzggCBQtwcmV2aWV3RGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlFbnRpdGxlbWVudAIFBmNhbGxlcgUFYXJ0SWQFC2VudGl0bGVtZW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2VsbEFydHdvcmsMBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAthdWN0aW9uVHlwZQhkdXJhdGlvbgRhZGQxBGFkZDIEYWRkMwZhZGQxU2gGYWRkMlNoBmFkZDNTaAQIY2FsbERhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFCGNhbGxEYXRhAl8xBAZjYWxsZXIIBQhjYWxsRGF0YQJfMgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQEH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQlzdGFrZURhcHACDnRoaXMgbm90IGZvdW5kAhl2YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50BQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQMDCQBmAgUGYmlkTmJyAAAGCQBmAgUKYW1vdW50U29sZAAACQACAQI4VGhlcmUgYXJlIGJpZHMgb3IgaXRlbXMgc29sZCwgeW91IGNhbiBub3QgZWRpdCBhbnl0aGluZyEEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGF1Y3Rpb25UeXBlMQkAzAgCBQxhdWN0aW9uVHlwZTIJAMwIAgUMYXVjdGlvblR5cGUzBQNuaWwFC2F1Y3Rpb25UeXBlCQACAQIfV2UgZG9uJ3Qga25vdyB0aGlzIGF1Y3Rpb24gdHlwZQMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAGYCBQdtYXhNaW50AJBOCQACAQIeMTAwMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrBApzZWxsU3RhdHVzAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBAd0ZWFtRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCDHRlYW1TcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQtmZWVSZWNlaXZlcgkAzAgCAgAJAMwIAgIACQDMCAIAAwkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBQd0ZWFtRmVlBQd0ZWFtRmVlBApjcmVhdG9yRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCD2NyZWF0b3JTcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQRhZGQxCQDMCAIFBGFkZDIJAMwIAgUEYWRkMwkAzAgCBQZhZGQxU2gJAMwIAgUGYWRkMlNoCQDMCAIFBmFkZDNTaAUDbmlsBQNuaWwDCQAAAgUKY3JlYXRvckZlZQUKY3JlYXRvckZlZQQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlEdXJhdGlvbgIFBmNhbGxlcgUFYXJ0SWQFCGR1cmF0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5RW5kSGVpZ2h0AgUGY2FsbGVyBQVhcnRJZAUJZW5kSGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBdWN0aW9uVHlwZQIFBmNhbGxlcgUFYXJ0SWQFC2F1Y3Rpb25UeXBlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsU2FsZQIFYXJ0SWQJbWF4VG9TZWxsBApjYWxsZXJEYXRhCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQpjYWxsZXJEYXRhAl8xBAZjYWxsZXIIBQpjYWxsZXJEYXRhAl8yBAthdWN0aW9uVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOa2V5QXVjdGlvblR5cGUCBQZjYWxsZXIFBWFydElkAixEbyBub3QgdHJ5IHRvIGVkaXQgYSBhdWN0aW9uIHlvdSBkbyBub3Qgb3duIQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGF1Y3Rpb25UeXBlMQkAzAgCBQxhdWN0aW9uVHlwZTMFA25pbAULYXVjdGlvblR5cGUJAAIBAidZb3UgY2FuIG5vdCBjYW5jZWwgdGhpcyB0eXBlIG9mIGF1Y3Rpb24ECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQphbW91bnRTb2xkBQltYXhUb1NlbGwJAAIBCQCsAgICJ1lvdSBjYW4gbm90IGxvd2VyIHRoZSBtYXhDYW5TZWxsIGJlbG93IAkApAMBBQphbW91bnRTb2xkAwkAZgIFCW1heFRvU2VsbAUKbWF4Q2FuU2VsbAkAAgECLVlvdSBjYW4gbm90IGluY3JlYXNlIHRoZSBtYXhDYW5TZWxsIHBhcmFtZXRlcgQJYm9vbEVudHJ5AwkAAAIFCW1heFRvU2VsbAUKYW1vdW50U29sZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFCW1heFRvU2VsbAUDbmlsBQlib29sRW50cnkBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUzCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXICAAIABwkAAgECNERpcmVjdCBidXkgb25seSBhbGxvd2VkIHdoZW4gbm8gYXVjdGlvbiB0eXBlIGlzIHNldCEBaQEKdXBkYXRlVGFncwMGYXJ0aXN0BWFydElkBHRhZ3MEBmNhbGxlcgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBm93bmVycwUGY2FsbGVyCQACAQICbm8DCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguBAd0YWdzT2xkCQEVZ2V0U3RyaW5nQnlLZXlPckVycm9yAgkBB2tleVRhZ3MCBQZhcnRpc3QFBWFydElkAi9ObyB0YWdzIGNyZWF0ZWQgd2l0aCB0aGlzIGtleSwgc28gY2FuJ3QgdXBkYXRlIQMJAAACBQR0YWdzBQd0YWdzT2xkCQACAQIeVGFncyBhcmUgdGhlIHNhbWUgYXMgb2xkIHRhZ3MhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGYXJ0aXN0BQVhcnRJZAUEdGFncwUDbmlsAWkBC2RlbGV0ZUVudHJ5AQVlbnRyeQQGY2FsbGVyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUGb3duZXJzBQZjYWxsZXIJAAIBAgJubwkAzAgCCQELRGVsZXRlRW50cnkBBQVlbnRyeQUDbmlsAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUxCQEUc2V0QmlkTm9uVHJhZGl0aW9uYWwDBQFpBQVhcnRJZAUGaXNzdWVyAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTIJARFzZXRCaWRUcmFkaXRpb25hbAMFAWkFBWFydElkBQZpc3N1ZXIJAAIBCQCsAgIJAKwCAgIWVW5rbm93biBhdWN0aW9uIHR5cGUgOgULYXVjdGlvblR5cGUCGywgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucwFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQLYXVjdGlvblR5cGUJAQ5nZXRTdHJpbmdCeUtleQEJAQ5rZXlBdWN0aW9uVHlwZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXVjdGlvblR5cGUFDGF1Y3Rpb25UeXBlMQkBF2FjY2VwdEJpZE5vblRyYWRpdGlvbmFsBQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTIJARRhY2NlcHRCaWRUcmFkaXRpb25hbAUFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgkAAgEJAKwCAgkArAICAhZVbmtub3duIGF1Y3Rpb24gdHlwZSA6BQthdWN0aW9uVHlwZQIbLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zAWkBCWNhbmNlbEJpZAMFYXJ0SWQGaXNzdWVyBWJpZElkBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUxCQENY2FuY2VsQmlkSW1wbAQFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkCQEYY2FuY2VsQmlkSW1wbFRyYWRpdGlvbmFsBAUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQAXnec+Q==", "height": 2161458, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9itf31mXUGDvDQchj4VDHnbWhJ6r6ekgBCtWWPgWjyWD Next: CijdC4RfRnKEV9vZB3UNk2LxpiXx7wE8KFFMf2y3snyq Diff:
Old | New | Differences | |
---|---|---|---|
695 | 695 | let id = callerData._1 | |
696 | 696 | let caller = callerData._2 | |
697 | 697 | let auctionType = valueOrErrorMessage(keyAuctionType(caller, artId), "Do not try to edit a auction you do not own!") | |
698 | - | if | |
698 | + | if (containsElement([auctionType1, auctionType3], auctionType)) | |
699 | 699 | then throw("You can not cancel this type of auction") | |
700 | 700 | else { | |
701 | 701 | let amountSold = getIntegerByKey(keyIssued(caller, artId)) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let unitTest = false | |
5 | 5 | ||
6 | 6 | let oracleKey = "oracleKey" | |
7 | 7 | ||
8 | 8 | func getStr (key) = match getString(this, key) { | |
9 | 9 | case b: String => | |
10 | 10 | b | |
11 | 11 | case _ => | |
12 | 12 | "" | |
13 | 13 | } | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | let oracle = getStr(oracleKey) | |
17 | 17 | ||
18 | 18 | let oracleFee = value(addressFromString(oracle)) | |
19 | 19 | ||
20 | 20 | let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")] | |
21 | 21 | ||
22 | 22 | let collectionsDapp = valueOrErrorMessage(getString(oracleFee, "collectionsDapp"), "collectionDapp not found") | |
23 | 23 | ||
24 | 24 | let feeReceiver = valueOrErrorMessage(getString(oracleFee, "feeReceiver"), "feeReceiver not found") | |
25 | 25 | ||
26 | 26 | let certDapp = valueOrErrorMessage(getString(oracleFee, "certDapp"), "certDapp not found") | |
27 | 27 | ||
28 | 28 | let feeDapp = valueOrErrorMessage(getString(oracleFee, "feeDapp"), "feeDapp not found") | |
29 | 29 | ||
30 | 30 | let userDapp = value(addressFromString(valueOrErrorMessage(getString(oracleFee, "userDapp"), "userdapp not found"))) | |
31 | 31 | ||
32 | 32 | let stakeDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "stakeDapp"), "sconexDapp not found")) | |
33 | 33 | ||
34 | 34 | let USDNAssetId = fromBase58String(getStringValue(oracleFee, "USDNAssetId")) | |
35 | 35 | ||
36 | 36 | let SconexAssetId = fromBase58String(getStringValue(oracleFee, "SconexAssetId")) | |
37 | 37 | ||
38 | 38 | let types = ["IMAGE", "PDF", "VIDEO"] | |
39 | 39 | ||
40 | 40 | let Previewtypes = ["PDF"] | |
41 | 41 | ||
42 | 42 | let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true) | |
43 | 43 | ||
44 | 44 | let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "") | |
45 | 45 | ||
46 | 46 | let userSuspended = "SUSPENDED" | |
47 | 47 | ||
48 | 48 | let userRemoved = "REMOVED" | |
49 | 49 | ||
50 | 50 | let userUnregistered = "UNREGISTERED" | |
51 | 51 | ||
52 | 52 | let auctionType1 = "BIDTYPE" | |
53 | 53 | ||
54 | 54 | let auctionType2 = "TRADITIONAL" | |
55 | 55 | ||
56 | 56 | let auctionType3 = "DIRECT" | |
57 | 57 | ||
58 | 58 | func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "") | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | func getStringByKey (key) = valueOrElse(getString(this, key), "") | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error) | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle") | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0) | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false) | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func validateHash (hash) = (size(hash) == 64) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func keyUserStatus (caller) = ("user_status_" + caller) | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller) | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller) | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller) | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller) | |
92 | 92 | ||
93 | 93 | ||
94 | 94 | func keyPreviewCid (caller,artId) = ((("art_preview_cid_" + artId) + "_") + caller) | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller) | |
98 | 98 | ||
99 | 99 | ||
100 | 100 | func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId) | |
101 | 101 | ||
102 | 102 | ||
103 | 103 | func keyBidId (bidId) = ("bid_" + bidId) | |
104 | 104 | ||
105 | 105 | ||
106 | 106 | func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller) | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller) | |
110 | 110 | ||
111 | 111 | ||
112 | 112 | func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller) | |
113 | 113 | ||
114 | 114 | ||
115 | 115 | func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller) | |
116 | 116 | ||
117 | 117 | ||
118 | 118 | func KeyNftIssuer (nftId) = ("nft_issued_" + nftId) | |
119 | 119 | ||
120 | 120 | ||
121 | 121 | func KeyNftArtId (nftId) = ("nft_artId_" + nftId) | |
122 | 122 | ||
123 | 123 | ||
124 | 124 | func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller) | |
125 | 125 | ||
126 | 126 | ||
127 | 127 | func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller) | |
128 | 128 | ||
129 | 129 | ||
130 | 130 | func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller) | |
131 | 131 | ||
132 | 132 | ||
133 | 133 | func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller) | |
134 | 134 | ||
135 | 135 | ||
136 | 136 | func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller) | |
137 | 137 | ||
138 | 138 | ||
139 | 139 | func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller) | |
140 | 140 | ||
141 | 141 | ||
142 | 142 | func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller) | |
143 | 143 | ||
144 | 144 | ||
145 | 145 | func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash) | |
146 | 146 | ||
147 | 147 | ||
148 | 148 | func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller))))) | |
149 | 149 | ||
150 | 150 | ||
151 | 151 | func keyCollection (caller,artId) = ((("collection_" + artId) + "_") + caller) | |
152 | 152 | ||
153 | 153 | ||
154 | 154 | let minUSDNPrice = getIntegerByKeyFromOracle(("min_" + toBase58String(USDNAssetId))) | |
155 | 155 | ||
156 | 156 | let currentFeeSconex = getIntegerByKeyFromOracle(("fee_" + toBase58String(SconexAssetId))) | |
157 | 157 | ||
158 | 158 | func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0) | |
159 | 159 | ||
160 | 160 | ||
161 | 161 | func getAmountHighestBidByArtId (artId) = { | |
162 | 162 | let bidId = getStringByKey(keyHighestBidBidId(artId)) | |
163 | 163 | getAmountByBidId(bidId) | |
164 | 164 | } | |
165 | 165 | ||
166 | 166 | ||
167 | 167 | func validateString (str,max) = if ((size(str) == 0)) | |
168 | 168 | then throw("Field cannot be is empty") | |
169 | 169 | else if ((size(str) > max)) | |
170 | 170 | then throw((str + " is too long")) | |
171 | 171 | else true | |
172 | 172 | ||
173 | 173 | ||
174 | 174 | func validateUser (caller) = { | |
175 | 175 | let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered) | |
176 | 176 | if ((userStatus == userUnregistered)) | |
177 | 177 | then "Register this account first with 'Account' tab" | |
178 | 178 | else if ((userStatus == userSuspended)) | |
179 | 179 | then "Account suspended" | |
180 | 180 | else if ((userStatus == userRemoved)) | |
181 | 181 | then "Account removed" | |
182 | 182 | else "" | |
183 | 183 | } | |
184 | 184 | ||
185 | 185 | ||
186 | 186 | func validateArtworkData (caller,cidDisplay,name,description,tags) = { | |
187 | 187 | let checkUser = validateUser(caller) | |
188 | 188 | if ((checkUser != "")) | |
189 | 189 | then throw(checkUser) | |
190 | 190 | else if ((size(cidDisplay) == 0)) | |
191 | 191 | then throw("Display CID cannot be empty") | |
192 | 192 | else if ((size(cidDisplay) != 46)) | |
193 | 193 | then throw("This doesn't seem a valid CID!") | |
194 | 194 | else if (!(validateString(name, 100))) | |
195 | 195 | then throw("100 Char. max name") | |
196 | 196 | else if (!(validateString(description, 1000))) | |
197 | 197 | then throw("1000 Char. max description") | |
198 | 198 | else if ((size(split(tags, ",")) > 5)) | |
199 | 199 | then throw("5 tags max.") | |
200 | 200 | else "" | |
201 | 201 | } | |
202 | 202 | ||
203 | 203 | ||
204 | 204 | func isPayment (i,index) = if ((size(i.payments) == 0)) | |
205 | 205 | then throw("No payment attached") | |
206 | 206 | else { | |
207 | 207 | let payment = value(i.payments[index]) | |
208 | 208 | let amount = value(payment.amount) | |
209 | 209 | $Tuple2(payment, amount) | |
210 | 210 | } | |
211 | 211 | ||
212 | 212 | ||
213 | 213 | func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) { | |
214 | 214 | case b: Int => | |
215 | 215 | if ((b != 0)) | |
216 | 216 | then true | |
217 | 217 | else false | |
218 | 218 | case _ => | |
219 | 219 | false | |
220 | 220 | } | |
221 | 221 | ||
222 | 222 | ||
223 | 223 | func validatePriceAssetId (i,priceAssetId,artworkPrice) = { | |
224 | 224 | let pData = isPayment(i, 1) | |
225 | 225 | let payment = pData._1 | |
226 | 226 | let amount = pData._2 | |
227 | 227 | let assetId = if (!(isDefined(payment.assetId))) | |
228 | 228 | then throw("Asset Id is not defined") | |
229 | 229 | else if (if ((size(priceAssetId) > 0)) | |
230 | 230 | then (toBase58String(value(payment.assetId)) == priceAssetId) | |
231 | 231 | else false) | |
232 | 232 | then payment.assetId | |
233 | 233 | else throw("Wrong asset id") | |
234 | 234 | if ((artworkPrice != amount)) | |
235 | 235 | then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount))) | |
236 | 236 | else $Tuple2(amount, assetId) | |
237 | 237 | } | |
238 | 238 | ||
239 | 239 | ||
240 | 240 | func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId))) | |
241 | 241 | then throw("Only USDN accepted") | |
242 | 242 | else true | |
243 | 243 | ||
244 | 244 | ||
245 | 245 | func validateMinSell (assetId,price) = { | |
246 | 246 | let minSellSconex = minUSDNPrice | |
247 | 247 | if (if (if ((price != 0)) | |
248 | 248 | then (minSellSconex > price) | |
249 | 249 | else false) | |
250 | 250 | then true | |
251 | 251 | else (assetId != toBase58String(USDNAssetId))) | |
252 | 252 | then throw(("Wrong minimum sell price " + toString(minSellSconex))) | |
253 | 253 | else true | |
254 | 254 | } | |
255 | 255 | ||
256 | 256 | ||
257 | 257 | func getBidAssetId (assetId) = if ((assetId == "WAVES")) | |
258 | 258 | then throw("Only USDN is accepted!") | |
259 | 259 | else fromBase58String(assetId) | |
260 | 260 | ||
261 | 261 | ||
262 | 262 | func getPriceAssetIdFromBid (bidDataKey) = { | |
263 | 263 | let bidData = getStringByKey((bidDataKey + "_OPEN")) | |
264 | 264 | if ((bidData == "")) | |
265 | 265 | then throw("Bid not found") | |
266 | 266 | else { | |
267 | 267 | let bidDataArr = split(bidData, "_") | |
268 | 268 | let bidAmount = parseIntValue(bidDataArr[1]) | |
269 | 269 | let bidAssetId = getBidAssetId(bidDataArr[0]) | |
270 | 270 | if ((0 >= bidAmount)) | |
271 | 271 | then throw("Wrong amount") | |
272 | 272 | else $Tuple2(bidAmount, bidAssetId) | |
273 | 273 | } | |
274 | 274 | } | |
275 | 275 | ||
276 | 276 | ||
277 | 277 | func idCallerDate (i) = if (!(dappRunning)) | |
278 | 278 | then throw(maintenanceMSG) | |
279 | 279 | else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp) | |
280 | 280 | ||
281 | 281 | ||
282 | 282 | func getArtData (i,issuer,artId,isBid) = { | |
283 | 283 | let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer) | |
284 | 284 | let totalNFT = getIntegerByKey("total_nft_issued") | |
285 | 285 | let artworkName = getStringByKey(keyName(issuer, artId)) | |
286 | 286 | if ((artworkName == "")) | |
287 | 287 | then throw("Art doesn't exist") | |
288 | 288 | else { | |
289 | 289 | let isOnSale = getBooleanByKey(keyOnSale(issuer, artId)) | |
290 | 290 | let amountSold = getIntegerByKey(keyIssued(issuer, artId)) | |
291 | 291 | let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice) | |
292 | 292 | let priceAssetId = if (callerIsIssuer) | |
293 | 293 | then toBase58String(USDNAssetId) | |
294 | 294 | else getStringByKey(keyAssetIdAccepted(issuer, artId)) | |
295 | 295 | let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId)) | |
296 | 296 | if (if (if (!(isBid)) | |
297 | 297 | then !(callerIsIssuer) | |
298 | 298 | else false) | |
299 | 299 | then if (if ((0 >= artworkPrice)) | |
300 | 300 | then true | |
301 | 301 | else !(isOnSale)) | |
302 | 302 | then true | |
303 | 303 | else (0 >= maxCanSell) | |
304 | 304 | else false) | |
305 | 305 | then throw("Art not for sale") | |
306 | 306 | else if (if (if (!(isBid)) | |
307 | 307 | then callerIsIssuer | |
308 | 308 | else false) | |
309 | 309 | then (0 >= maxCanSell) | |
310 | 310 | else false) | |
311 | 311 | then throw("Max issuable not set") | |
312 | 312 | else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale) | |
313 | 313 | } | |
314 | 314 | } | |
315 | 315 | ||
316 | 316 | ||
317 | 317 | func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = { | |
318 | 318 | let checkUser = validateUser(issuer) | |
319 | 319 | if (if (isBid) | |
320 | 320 | then (checkUser != "") | |
321 | 321 | else false) | |
322 | 322 | then throw(checkUser) | |
323 | 323 | else { | |
324 | 324 | let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId) | |
325 | 325 | let t01351913648 = if (isBid) | |
326 | 326 | then getPriceAssetIdFromBid(bidDataKey) | |
327 | 327 | else validatePriceAssetId(i, priceAssetId, artworkPrice) | |
328 | 328 | let amount = t01351913648._1 | |
329 | 329 | let assetId = t01351913648._2 | |
330 | 330 | $Tuple3(bidDataKey, amount, assetId) | |
331 | 331 | } | |
332 | 332 | } | |
333 | 333 | ||
334 | 334 | ||
335 | 335 | func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = { | |
336 | 336 | let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) | |
337 | 337 | let sellStatus = if (if ((newAmountSold == maxCanSell)) | |
338 | 338 | then true | |
339 | 339 | else !(isOnSale)) | |
340 | 340 | then false | |
341 | 341 | else true | |
342 | 342 | let receiveNFT = if ((bidOwner != "")) | |
343 | 343 | then addressFromStringValue(bidOwner) | |
344 | 344 | else i.caller | |
345 | 345 | $Tuple3(sellStatus, receiveNFT, issueMeta) | |
346 | 346 | } | |
347 | 347 | ||
348 | 348 | ||
349 | 349 | func getBidKeyVal (assetId,bidDataKey,date) = { | |
350 | 350 | let assetIdBid = if (!(isDefined(assetId))) | |
351 | 351 | then throw("Only USDN is accepted") | |
352 | 352 | else toBase58String(value(assetId)) | |
353 | 353 | let bidData = getStringByKey((bidDataKey + "_OPEN")) | |
354 | 354 | let bidDelOld = DeleteEntry((bidDataKey + "_OPEN")) | |
355 | 355 | let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date))) | |
356 | 356 | $Tuple3(assetIdBid, bidDelOld, bidUpdate) | |
357 | 357 | } | |
358 | 358 | ||
359 | 359 | ||
360 | 360 | func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = { | |
361 | 361 | let callerData = idCallerDate(i) | |
362 | 362 | let id = callerData._1 | |
363 | 363 | let caller = callerData._2 | |
364 | 364 | let date = callerData._3 | |
365 | 365 | let artData = getArtData(i, issuer, artId, isBid) | |
366 | 366 | let totalNFT = artData._1 | |
367 | 367 | let artworkName = artData._2 | |
368 | 368 | let amountSold = artData._3 | |
369 | 369 | let artworkPrice = artData._4 | |
370 | 370 | let priceAssetId = artData._5 | |
371 | 371 | let maxCanSell = artData._6 | |
372 | 372 | let isOnSale = artData._7 | |
373 | 373 | let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid) | |
374 | 374 | let bidDataKey = bidData._1 | |
375 | 375 | let amount = bidData._2 | |
376 | 376 | let assetId = bidData._3 | |
377 | 377 | let newAmountSold = if ((amountSold == maxCanSell)) | |
378 | 378 | then throw("Max items sold") | |
379 | 379 | else (amountSold + 1) | |
380 | 380 | let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale) | |
381 | 381 | let sellStatus = issuerData._1 | |
382 | 382 | let receiveNFT = issuerData._2 | |
383 | 383 | let issueMeta = issuerData._3 | |
384 | 384 | let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil) | |
385 | 385 | if ((idNFTInvoke == idNFTInvoke)) | |
386 | 386 | then { | |
387 | 387 | let idNFT = match idNFTInvoke { | |
388 | 388 | case r: String => | |
389 | 389 | r | |
390 | 390 | case _ => | |
391 | 391 | throw("Incorrect invoke result") | |
392 | 392 | } | |
393 | 393 | let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date) | |
394 | 394 | let assetIdBid = bidKeyValue._1 | |
395 | 395 | let bidDelOld = bidKeyValue._2 | |
396 | 396 | let bidUpdate = bidKeyValue._3 | |
397 | 397 | let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer) | |
398 | 398 | let soldValue = if (!(isBid)) | |
399 | 399 | then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT) | |
400 | 400 | else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT) | |
401 | 401 | let invokeTeamFeeSplit = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "payFee", [artId, issuer], [AttachedPayment(assetId, amount)]) | |
402 | 402 | if ((invokeTeamFeeSplit == invokeTeamFeeSplit)) | |
403 | 403 | then { | |
404 | 404 | let soldData = StringEntry(soldKey, soldValue) | |
405 | 405 | let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), StringEntry(KeyNftIssuer(idNFT), issuer), StringEntry(KeyNftArtId(idNFT), artId)] | |
406 | 406 | let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]]) | |
407 | 407 | if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke)) | |
408 | 408 | then { | |
409 | 409 | let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil) | |
410 | 410 | if ((res == res)) | |
411 | 411 | then if (isBid) | |
412 | 412 | then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld) | |
413 | 413 | else soldData :: buyRes | |
414 | 414 | else throw("Strict value is not equal to itself.") | |
415 | 415 | } | |
416 | 416 | else throw("Strict value is not equal to itself.") | |
417 | 417 | } | |
418 | 418 | else throw("Strict value is not equal to itself.") | |
419 | 419 | } | |
420 | 420 | else throw("Strict value is not equal to itself.") | |
421 | 421 | } | |
422 | 422 | ||
423 | 423 | ||
424 | 424 | func setBidNonTraditional (i,artId,issuer) = { | |
425 | 425 | let t02770927747 = idCallerDate(i) | |
426 | 426 | let id = t02770927747._1 | |
427 | 427 | let caller = t02770927747._2 | |
428 | 428 | let date = t02770927747._3 | |
429 | 429 | let t02775227788 = isPayment(i, 0) | |
430 | 430 | let payment = t02775227788._1 | |
431 | 431 | let amount = t02775227788._2 | |
432 | 432 | let assetId = if (!(isDefined(payment.assetId))) | |
433 | 433 | then throw("Only USDN is accepted!") | |
434 | 434 | else toBase58String(value(payment.assetId)) | |
435 | 435 | let bidNbr = getIntegerByKey(("current_bidamount_" + artId)) | |
436 | 436 | if (!(acceptedAssetIds(assetId))) | |
437 | 437 | then throw("asset not accepted") | |
438 | 438 | else { | |
439 | 439 | let amountSold = getIntegerByKey(keyIssued(issuer, artId)) | |
440 | 440 | let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId)) | |
441 | 441 | if ((0 >= maxCanSell)) | |
442 | 442 | then throw("No max edition set for this artwork") | |
443 | 443 | else if ((amountSold >= maxCanSell)) | |
444 | 444 | then throw("Sold out, you cannot bid") | |
445 | 445 | else { | |
446 | 446 | let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]]) | |
447 | 447 | if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke)) | |
448 | 448 | then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))] | |
449 | 449 | else throw("Strict value is not equal to itself.") | |
450 | 450 | } | |
451 | 451 | } | |
452 | 452 | } | |
453 | 453 | ||
454 | 454 | ||
455 | 455 | func setBidTraditional (i,artId,issuer) = { | |
456 | 456 | let endHeight = getIntegerByKey(keyEndHeight(issuer, artId)) | |
457 | 457 | let highestBid = getAmountHighestBidByArtId(artId) | |
458 | 458 | if ((height > endHeight)) | |
459 | 459 | then throw("This auction is finished already!") | |
460 | 460 | else { | |
461 | 461 | let callderData = idCallerDate(i) | |
462 | 462 | let id = callderData._1 | |
463 | 463 | let caller = callderData._2 | |
464 | 464 | let date = callderData._3 | |
465 | 465 | let isPaymentVar = isPayment(i, 0) | |
466 | 466 | let payment = isPaymentVar._1 | |
467 | 467 | let amount = isPaymentVar._2 | |
468 | 468 | if ((highestBid >= amount)) | |
469 | 469 | then throw(("Please place a bid higher than: " + toString(highestBid))) | |
470 | 470 | else { | |
471 | 471 | let assetId = if (!(isDefined(payment.assetId))) | |
472 | 472 | then throw("Only USDN is accepted!") | |
473 | 473 | else toBase58String(value(payment.assetId)) | |
474 | 474 | let bidNbr = getIntegerByKey(("current_bidamount_" + artId)) | |
475 | 475 | let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice) | |
476 | 476 | if (!(acceptedAssetIds(assetId))) | |
477 | 477 | then throw("asset not accepted") | |
478 | 478 | else if ((minArtworkPrice > amount)) | |
479 | 479 | then throw("Bid is below min price!") | |
480 | 480 | else { | |
481 | 481 | let amountSold = getIntegerByKey(keyIssued(issuer, artId)) | |
482 | 482 | let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId)) | |
483 | 483 | if ((0 >= maxCanSell)) | |
484 | 484 | then throw("No max edition set for this artwork") | |
485 | 485 | else if ((amountSold >= maxCanSell)) | |
486 | 486 | then throw("Sold out, you cannot bid") | |
487 | 487 | else { | |
488 | 488 | let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]]) | |
489 | 489 | if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke)) | |
490 | 490 | then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)] | |
491 | 491 | else throw("Strict value is not equal to itself.") | |
492 | 492 | } | |
493 | 493 | } | |
494 | 494 | } | |
495 | 495 | } | |
496 | 496 | } | |
497 | 497 | ||
498 | 498 | ||
499 | 499 | func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = { | |
500 | 500 | let caller = toBase58String(i.caller.bytes) | |
501 | 501 | if ((caller != issuer)) | |
502 | 502 | then throw("You cannot do this action") | |
503 | 503 | else buyMint(i, artId, issuer, bidId, bidOwner, true) | |
504 | 504 | } | |
505 | 505 | ||
506 | 506 | ||
507 | 507 | func restartAuction (artId,issuer) = { | |
508 | 508 | let amountSold = getIntegerByKey(keyIssued(issuer, artId)) | |
509 | 509 | let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId)) | |
510 | 510 | let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId)) | |
511 | 511 | let duration = getIntegerByKey(keyDuration(issuer, artId)) | |
512 | 512 | let endHeight = (duration + height) | |
513 | 513 | if ((oldEndHeight >= height)) | |
514 | 514 | then throw("Previous auction isn't completed yet") | |
515 | 515 | else if ((amountSold == maxCanSell)) | |
516 | 516 | then throw("Can't restart auction, max amount sold") | |
517 | 517 | else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))] | |
518 | 518 | } | |
519 | 519 | ||
520 | 520 | ||
521 | 521 | func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = { | |
522 | 522 | let endHeight = getIntegerByKey(keyEndHeight(issuer, artId)) | |
523 | 523 | let highestBidId = getStringByKey(keyHighestBidBidId(artId)) | |
524 | 524 | if ((endHeight >= height)) | |
525 | 525 | then throw("This auction is not yet finished!") | |
526 | 526 | else if ((bidId != highestBidId)) | |
527 | 527 | then throw("This is not the winning bid!") | |
528 | 528 | else { | |
529 | 529 | let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true) | |
530 | 530 | let restartAuctionData = restartAuction(artId, issuer) | |
531 | 531 | (restartAuctionData ++ buyMintData) | |
532 | 532 | } | |
533 | 533 | } | |
534 | 534 | ||
535 | 535 | ||
536 | 536 | func cancelBidImpl (i,artId,issuer,bidId) = { | |
537 | 537 | let t02894229094 = idCallerDate(i) | |
538 | 538 | let id = t02894229094._1 | |
539 | 539 | let caller = t02894229094._2 | |
540 | 540 | let date = t02894229094._3 | |
541 | 541 | let bidNbr = getIntegerByKey(("current_bidamount_" + artId)) | |
542 | 542 | let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId) | |
543 | 543 | let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found") | |
544 | 544 | let bidDataArr = split(bidData, "_") | |
545 | 545 | let assetId = getBidAssetId(bidDataArr[0]) | |
546 | 546 | let bidStatus = "CANCELED" | |
547 | 547 | [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)] | |
548 | 548 | } | |
549 | 549 | ||
550 | 550 | ||
551 | 551 | func cancelBidImplTraditional (i,artId,issuer,bidId) = { | |
552 | 552 | let t02894229094 = idCallerDate(i) | |
553 | 553 | let id = t02894229094._1 | |
554 | 554 | let caller = t02894229094._2 | |
555 | 555 | let date = t02894229094._3 | |
556 | 556 | let bidNbr = getIntegerByKey(("current_bidamount_" + artId)) | |
557 | 557 | let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId) | |
558 | 558 | let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found") | |
559 | 559 | let bidDataArr = split(bidData, "_") | |
560 | 560 | let assetId = getBidAssetId(bidDataArr[0]) | |
561 | 561 | let bidStatus = "CANCELED" | |
562 | 562 | let bidAmount = parseIntValue(bidDataArr[1]) | |
563 | 563 | let highestBidId = getStringByKey(keyHighestBidBidId(artId)) | |
564 | 564 | if ((bidId == highestBidId)) | |
565 | 565 | then throw("You can't cancel the highest bid!") | |
566 | 566 | else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)] | |
567 | 567 | } | |
568 | 568 | ||
569 | 569 | ||
570 | 570 | @Callable(i) | |
571 | 571 | func initDapp (dappKey) = if ((i.caller != this)) | |
572 | 572 | then throw("You cannot do this action") | |
573 | 573 | else if ((oracle != "")) | |
574 | 574 | then throw("oracle already set, you can't override!") | |
575 | 575 | else [StringEntry(oracleKey, dappKey)] | |
576 | 576 | ||
577 | 577 | ||
578 | 578 | ||
579 | 579 | @Callable(i) | |
580 | 580 | func restartAuctionManual (artId) = if ((getAmountHighestBidByArtId(artId) != 0)) | |
581 | 581 | then throw("Please accept the highest bid!") | |
582 | 582 | else restartAuction(artId, toBase58String(i.caller.bytes)) | |
583 | 583 | ||
584 | 584 | ||
585 | 585 | ||
586 | 586 | @Callable(i) | |
587 | 587 | func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller != this)) | |
588 | 588 | then throw("Only the dApp can mint NFT's") | |
589 | 589 | else { | |
590 | 590 | let receiveNFTAddy = Address(fromBase58String(receiveNFT)) | |
591 | 591 | let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false) | |
592 | 592 | let idNFT = calculateAssetId(issueNFT) | |
593 | 593 | $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT)) | |
594 | 594 | } | |
595 | 595 | ||
596 | 596 | ||
597 | 597 | ||
598 | 598 | @Callable(i) | |
599 | 599 | func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement,preview,collection,subcollection) = { | |
600 | 600 | let t01774017781 = idCallerDate(i) | |
601 | 601 | let artId = t01774017781._1 | |
602 | 602 | let caller = t01774017781._2 | |
603 | 603 | let date = t01774017781._3 | |
604 | 604 | if (!(containsElement(types, type))) | |
605 | 605 | then throw("Unknown type") | |
606 | 606 | else { | |
607 | 607 | let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags) | |
608 | 608 | if ((validateArtwork != "")) | |
609 | 609 | then throw("Something went wrong!") | |
610 | 610 | else { | |
611 | 611 | let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]]) | |
612 | 612 | if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke)) | |
613 | 613 | then { | |
614 | 614 | let previewData = if (containsElement(Previewtypes, type)) | |
615 | 615 | then [StringEntry(keyPreviewCid(caller, artId), preview)] | |
616 | 616 | else nil | |
617 | 617 | let invokeCollectionCreate = invoke(valueOrErrorMessage(addressFromString(collectionsDapp), (collectionsDapp + " not found")), "collectionProcess", [collection, subcollection, caller], nil) | |
618 | 618 | if ((invokeCollectionCreate == invokeCollectionCreate)) | |
619 | 619 | then { | |
620 | 620 | let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller)) | |
621 | 621 | if ((entryExist != "")) | |
622 | 622 | then throw("You already added it") | |
623 | 623 | else { | |
624 | 624 | let hashExist = getStringByKey(keyOwnerByHash(sha256Hash)) | |
625 | 625 | if ((hashExist != "")) | |
626 | 626 | then throw("This hash is already registered") | |
627 | 627 | else (previewData ++ [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement)]) | |
628 | 628 | } | |
629 | 629 | } | |
630 | 630 | else throw("Strict value is not equal to itself.") | |
631 | 631 | } | |
632 | 632 | else throw("Strict value is not equal to itself.") | |
633 | 633 | } | |
634 | 634 | } | |
635 | 635 | } | |
636 | 636 | ||
637 | 637 | ||
638 | 638 | ||
639 | 639 | @Callable(i) | |
640 | 640 | func sellArtwork (artId,price,maxMint,assetId,auctionType,duration,add1,add2,add3,add1Sh,add2Sh,add3Sh) = { | |
641 | 641 | let callData = idCallerDate(i) | |
642 | 642 | let id = callData._1 | |
643 | 643 | let caller = callData._2 | |
644 | 644 | let amountSold = getIntegerByKey(keyIssued(caller, artId)) | |
645 | 645 | let bidNbr = getIntegerByKey(("current_bidamount_" + artId)) | |
646 | 646 | let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]]) | |
647 | 647 | if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke)) | |
648 | 648 | then if (if ((bidNbr > 0)) | |
649 | 649 | then true | |
650 | 650 | else (amountSold > 0)) | |
651 | 651 | then throw("There are bids or items sold, you can not edit anything!") | |
652 | 652 | else { | |
653 | 653 | let artworkName = getStringByKey(keyName(caller, artId)) | |
654 | 654 | if (!(containsElement([auctionType1, auctionType2, auctionType3], auctionType))) | |
655 | 655 | then throw("We don't know this auction type") | |
656 | 656 | else if ((artworkName == "")) | |
657 | 657 | then throw("This art doesn't match your account") | |
658 | 658 | else if (!(acceptedAssetIds(assetId))) | |
659 | 659 | then throw("Something went wrong!") | |
660 | 660 | else if (!(validateMinSell(assetId, price))) | |
661 | 661 | then throw("Something went wrong!") | |
662 | 662 | else { | |
663 | 663 | let checkUser = validateUser(caller) | |
664 | 664 | if ((checkUser != "")) | |
665 | 665 | then throw(checkUser) | |
666 | 666 | else if ((maxMint > 10000)) | |
667 | 667 | then throw("10000 editions max per artwork") | |
668 | 668 | else { | |
669 | 669 | let sellStatus = if ((price > 0)) | |
670 | 670 | then (maxMint > 0) | |
671 | 671 | else false | |
672 | 672 | let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 3, 0, 0], nil) | |
673 | 673 | if ((teamFee == teamFee)) | |
674 | 674 | then { | |
675 | 675 | let creatorFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "creatorSplitFee", [artId, add1, add2, add3, add1Sh, add2Sh, add3Sh], nil) | |
676 | 676 | if ((creatorFee == creatorFee)) | |
677 | 677 | then { | |
678 | 678 | let endHeight = (duration + height) | |
679 | 679 | [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)] | |
680 | 680 | } | |
681 | 681 | else throw("Strict value is not equal to itself.") | |
682 | 682 | } | |
683 | 683 | else throw("Strict value is not equal to itself.") | |
684 | 684 | } | |
685 | 685 | } | |
686 | 686 | } | |
687 | 687 | else throw("Strict value is not equal to itself.") | |
688 | 688 | } | |
689 | 689 | ||
690 | 690 | ||
691 | 691 | ||
692 | 692 | @Callable(i) | |
693 | 693 | func cancelSale (artId,maxToSell) = { | |
694 | 694 | let callerData = idCallerDate(i) | |
695 | 695 | let id = callerData._1 | |
696 | 696 | let caller = callerData._2 | |
697 | 697 | let auctionType = valueOrErrorMessage(keyAuctionType(caller, artId), "Do not try to edit a auction you do not own!") | |
698 | - | if | |
698 | + | if (containsElement([auctionType1, auctionType3], auctionType)) | |
699 | 699 | then throw("You can not cancel this type of auction") | |
700 | 700 | else { | |
701 | 701 | let amountSold = getIntegerByKey(keyIssued(caller, artId)) | |
702 | 702 | let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId)) | |
703 | 703 | if ((amountSold > maxToSell)) | |
704 | 704 | then throw(("You can not lower the maxCanSell below " + toString(amountSold))) | |
705 | 705 | else if ((maxToSell > maxCanSell)) | |
706 | 706 | then throw("You can not increase the maxCanSell parameter") | |
707 | 707 | else { | |
708 | 708 | let boolEntry = if ((maxToSell == amountSold)) | |
709 | 709 | then [BooleanEntry(keyOnSale(caller, artId), false)] | |
710 | 710 | else nil | |
711 | 711 | ([IntegerEntry(keyMaxMint(caller, artId), maxToSell)] ++ boolEntry) | |
712 | 712 | } | |
713 | 713 | } | |
714 | 714 | } | |
715 | 715 | ||
716 | 716 | ||
717 | 717 | ||
718 | 718 | @Callable(i) | |
719 | 719 | func buyArtwork (artId,issuer) = { | |
720 | 720 | let auctionType = getStringByKey(keyAuctionType(issuer, artId)) | |
721 | 721 | if ((auctionType == auctionType3)) | |
722 | 722 | then buyMint(i, artId, issuer, "", "", false) | |
723 | 723 | else throw("Direct buy only allowed when no auction type is set!") | |
724 | 724 | } | |
725 | 725 | ||
726 | 726 | ||
727 | 727 | ||
728 | 728 | @Callable(i) | |
729 | 729 | func updateTags (artist,artId,tags) = { | |
730 | 730 | let caller = toString(addressFromPublicKey(i.callerPublicKey)) | |
731 | 731 | if (!(containsElement(owners, caller))) | |
732 | 732 | then throw("no") | |
733 | 733 | else if ((size(split(tags, ",")) > 5)) | |
734 | 734 | then throw("5 tags max.") | |
735 | 735 | else { | |
736 | 736 | let tagsOld = getStringByKeyOrError(keyTags(artist, artId), "No tags created with this key, so can't update!") | |
737 | 737 | if ((tags == tagsOld)) | |
738 | 738 | then throw("Tags are the same as old tags!") | |
739 | 739 | else [StringEntry(keyTags(artist, artId), tags)] | |
740 | 740 | } | |
741 | 741 | } | |
742 | 742 | ||
743 | 743 | ||
744 | 744 | ||
745 | 745 | @Callable(i) | |
746 | 746 | func deleteEntry (entry) = { | |
747 | 747 | let caller = toString(addressFromPublicKey(i.callerPublicKey)) | |
748 | 748 | if (!(containsElement(owners, caller))) | |
749 | 749 | then throw("no") | |
750 | 750 | else [DeleteEntry(entry)] | |
751 | 751 | } | |
752 | 752 | ||
753 | 753 | ||
754 | 754 | ||
755 | 755 | @Callable(i) | |
756 | 756 | func setBid (artId,issuer) = { | |
757 | 757 | let auctionType = getStringByKey(keyAuctionType(issuer, artId)) | |
758 | 758 | if ((auctionType == auctionType1)) | |
759 | 759 | then setBidNonTraditional(i, artId, issuer) | |
760 | 760 | else if ((auctionType == auctionType2)) | |
761 | 761 | then setBidTraditional(i, artId, issuer) | |
762 | 762 | else throw((("Unknown auction type :" + auctionType) + ", please contact the admins")) | |
763 | 763 | } | |
764 | 764 | ||
765 | 765 | ||
766 | 766 | ||
767 | 767 | @Callable(i) | |
768 | 768 | func acceptBid (artId,issuer,bidId,bidOwner) = { | |
769 | 769 | let auctionType = getStringByKey(keyAuctionType(issuer, artId)) | |
770 | 770 | if ((auctionType == auctionType1)) | |
771 | 771 | then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner) | |
772 | 772 | else if ((auctionType == auctionType2)) | |
773 | 773 | then acceptBidTraditional(i, artId, issuer, bidId, bidOwner) | |
774 | 774 | else throw((("Unknown auction type :" + auctionType) + ", please contact the admins")) | |
775 | 775 | } | |
776 | 776 | ||
777 | 777 | ||
778 | 778 | ||
779 | 779 | @Callable(i) | |
780 | 780 | func cancelBid (artId,issuer,bidId) = { | |
781 | 781 | let auctionType = getStringByKey(keyAuctionType(issuer, artId)) | |
782 | 782 | if ((auctionType == auctionType1)) | |
783 | 783 | then cancelBidImpl(i, artId, issuer, bidId) | |
784 | 784 | else cancelBidImplTraditional(i, artId, issuer, bidId) | |
785 | 785 | } | |
786 | 786 | ||
787 | 787 |
github/deemru/w8io/026f985 77.76 ms ◑