tx · 87L8dGvEc9mUNihKiTqheLZdDgkcKVsyFEGunbGspmXq

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02400000 Waves

2023.01.19 10:08 [2411486] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "87L8dGvEc9mUNihKiTqheLZdDgkcKVsyFEGunbGspmXq", "fee": 2400000, "feeAssetId": null, "timestamp": 1674112082252, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "4ZfmThMZv5xrccqArNG7tw3dh7JkU9f585QcfQaUi1vTtU68sx7NcZ5gLAJYKNjVGGe6J2Z4qNasmouQi6pduMy4" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhOAAdWRVJTSU9OAgUxLjEuOQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBD2tleVByaW1hcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBEmtleVR4aWRCeUhhc2hPd25lcgIKc2hhMjU2SGFzaAZjYWxsZXIJAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUKc2hhMjU2SGFzaAUGY2FsbGVyAQ52YWxpZGF0ZUFsbENJRAMKY2lkRGlzcGxheQljaWRFeHBvcnQKY2lkTGljZW5jZQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEVdyb25nIERpc3BsYXkgQ0lEAwkBASEBCQELdmFsaWRhdGVDSUQBBQljaWRFeHBvcnQJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFCmNpZExpY2VuY2UCAAkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWRMaWNlbmNlBwkAAgECEVdyb25nIExpY2VuY2UgQ0lEBgEPdmFsaWRhdGVBbGxIYXNoAgxzaGEyNTZFeHBvcnQNc2hhMjU2TGljZW5jZQMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDHNoYTI1NkV4cG9ydAkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDXNoYTI1NkxpY2VuY2UJAAIBAhlMaWNlbmNlIEhhc2ggNjQgY2hhci4gbWF4BgEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBDHZhbGlkYXRlVXNlcgEGY2FsbGVyAwYJAAIBBQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBAskdDA4OTEwODk0NgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA4OTEwODk0NgJfMQQGYW1vdW50CAULJHQwODkxMDg5NDYCXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQtzaWduQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUGYW1vdW50BRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQACAQkArAICAhlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQCkAwEFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAJQKAgUGYW1vdW50BQdhc3NldElkAQtpc0FydE1pbnRlZAIJYWRkclRvVXNlBWFydElkBAckbWF0Y2gwCQCaCAIFBHRoaXMJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAMJAQIhPQIFAWIAAAYHBwEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwOTUzNDk1NzAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwOTUzNDk1NzACXzEEBmFtb3VudAgFCyR0MDk1MzQ5NTcwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwMJAAACBQdhc3NldElkBQR1bml0CQECIT0CBQxwcmljZUFzc2V0SWQCAAcJAAIBAg5Xcm9uZyBhc3NldCBpZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBEGFjY2VwdGVkQXNzZXRJZHMBB2Fzc2V0SWQDAwMDAwkBAiE9AgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkBAiE9AgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQHCQECIT0CBQdhc3NldElkAgVXQVZFUwcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkBwkAAgECJk9ubHkgU0lHTiwgVVNETixVU0RUIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAgdhc3NldElkBXByaWNlBAxtaW5TZWxsV2F2ZXMDBQh1bml0VGVzdAAKCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQECDndhdmVzX21pbl9zZWxsBAttaW5TZWxsVXNkbgDAhD0EC21pblNlbGxTaWduAwUIdW5pdFRlc3QAAQkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgMDAwMDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkbkFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQJAGYCBQttaW5TZWxsVXNkbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwkAAAIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAGYCBQttaW5TZWxsU2lnbgUFcHJpY2UHCQECIT0CBQVwcmljZQAABwYDAwMJAAACBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAYJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFDG1pblNlbGxXYXZlcwUFcHJpY2UHCQECIT0CBQVwcmljZQAABwkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEKYmlkRGF0YUtleQQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8ECWJpZEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQQKYmlkQXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAMJAGcCAAAFCWJpZEFtb3VudAkAAgECDFdyb25nIGFtb3VudAkAlAoCBQliaWRBbW91bnQFCmJpZEFzc2V0SWQBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIBaQZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cDBgkAAgEJAKwCAgkArAICCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMCASAJAKUIAQUEdGhpcwQGY2FsbGVyAwMJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAKUIAQUEdGhpcwkBASEBCQEJaXNEZWZpbmVkAQgFAWkIcGF5bWVudHMHCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTZ2V0X3Nwb25zb3JlZF93YXZlcwMJAQIhPQIFBnB1YktleQIACQD8BwQFDXdoaXRlbGlzdERhcHACCXVzZUZyZWVUeAkAzAgCCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkFA25pbAUDbmlsBQR1bml0AwkAAAIFE2dldF9zcG9uc29yZWRfd2F2ZXMFE2dldF9zcG9uc29yZWRfd2F2ZXMJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQZjYWxsZXIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTI3NzUxMjgzNAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTI3NzUxMjgzNAJfMQQGY2FsbGVyCAUNJHQwMTI3NzUxMjgzNAJfMgQEZGF0ZQgFDSR0MDEyNzc1MTI4MzQCXzMEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTQ1MzcxNDcwNAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNDUzNzE0NzA0Al8xBAdhc3NldElkCAUNJHQwMTQ1MzcxNDcwNAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEPa2V5UHJpbWFyeVNoYXJlAQUGaXNzdWVyAAAEDWlzV2hpdGVsaXN0ZWQJAQ5jaGVja1doaXRlbGlzdAEFBmlzc3VlcgQDY3V0AwkAZgIFDWlzV2hpdGVsaXN0ZWQFBmhlaWdodAAAAwkAAAIFB2Fzc2V0SWQFC3NpZ25Bc3NldElkBQdzaWduQ3V0BQt1c2RuV2F2ZUN1dAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUDY3V0AGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQBkAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJQ3JlYXRvcjogBQZpc3N1ZXICCiwKIEFydElEOiAFBWFydElkAgssCiBTaWduSUQ6IAUGc2lnbklEAhEsCiBBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwMJAAACBQ1uZXdBbW91bnRTb2xkBQptYXhDYW5TZWxsBgkBASEBBQhpc09uU2FsZQcGBApyZWNlaXZlTkZUAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYmlkT3duZXIIBQFpBmNhbGxlcgQKYXNzZXRJZEJpZAMJAQEhAQkBCWlzRGVmaW5lZAEFB2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFB2Fzc2V0SWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZERlbE9sZAkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkVXBkYXRlCQELU3RyaW5nRW50cnkCCQCsAgIFCmJpZERhdGFLZXkCB19DTE9TRUQJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUEB3NvbGRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXJ0X3NvbGRfCQCkAwEFDW5ld0Ftb3VudFNvbGQCBF9vZl8JAKQDAQUKbWF4Q2FuU2VsbAIBXwUFYXJ0SWQCAV8FBmlzc3VlcgQJc29sZFZhbHVlAwkBASEBBQVpc0JpZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZjYWxsZXICAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUMYXJ0d29ya1ByaWNlAgFfBQxwcmljZUFzc2V0SWQCAV8JANgEAQUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwkA2AQBBQVpZE5GVAQIc29sZERhdGEJAQtTdHJpbmdFbnRyeQIFB3NvbGRLZXkFCXNvbGRWYWx1ZQQLY29tbWlzc2lvbnMDCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAQGYnV5UmVzCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAULY29tbWlzc2lvbnMDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yaw4Kc2hhMjU2SGFzaAZzaWduSUQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDE4NzM3MTg3OTcJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMTg3MzcxODc5NwJfMQQGY2FsbGVyCAUNJHQwMTg3MzcxODc5NwJfMgQEZGF0ZQgFDSR0MDE4NzM3MTg3OTcCXzMDBgkAAgEFBmNhbGxlcgMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFCnNoYTI1Nkhhc2gJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EDSR0MDE4OTI5MTg5OTgJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDE4OTI5MTg5OTgCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMTg5MjkxODk5OAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMTkyOTcxOTM4MQMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQZzaWduSUQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAxOTI5NzE5MzgxAl8xBAdhc3NldElkCAUNJHQwMTkyOTcxOTM4MQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQED2lzU2lnbkNlcnRpZmllZAkBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwUGc2lnbklEBQZjYWxsZXIFCnNoYTI1Nkhhc2gDCQEBIQEFD2lzU2lnbkNlcnRpZmllZAkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIFBWFydElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQlrZXlTaWduSUQCBQZjYWxsZXIFBWFydElkBQZzaWduSUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5aWRCeVNpZ25pZAIFBmNhbGxlcgUGc2lnbklEBQVhcnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQVhcnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUFYXJ0SWQFCXJveWFsdGllcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFBmFtb3VudAULc2lnbkFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMjMyMzIyMzgwCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIyMzIzMjIzODACXzEEBmNhbGxlcggFDSR0MDIyMzIzMjIzODACXzIEBGRhdGUIBQ0kdDAyMjMyMzIyMzgwAl8zBA0kdDAyMjM5MDIyNDU5CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMjM5MDIyNDU5Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDIyMzkwMjI0NTkCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjM5NjAyMzk5NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjM5NjAyMzk5NAJfMQQGY2FsbGVyCAUNJHQwMjM5NjAyMzk5NAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNDQzMDI0NDY0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNDQzMDI0NDY0Al8xBAZjYWxsZXIIBQ0kdDAyNDQzMDI0NDY0Al8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQpzaGEyNTZIYXNoAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFBnNpZ25JRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQMZGF0YVRvRGVsZXRlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklECQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQlhZGRyVG9Vc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjczMDAyNzM1MQkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNzMwMDI3MzUxAl8xBAZjYWxsZXIIBQ0kdDAyNzMwMDI3MzUxAl8yBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMjk2MDgyOTY0OAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjk2MDgyOTY0OAJfMQQGY2FsbGVyCAUNJHQwMjk2MDgyOTY0OAJfMgQEZGF0ZQgFDSR0MDI5NjA4Mjk2NDgCXzMEDSR0MDI5NjUzMjk2ODkJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMjk2NTMyOTY4OQJfMQQGYW1vdW50CAUNJHQwMjk2NTMyOTY4OQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzA4NDczMDg4NwkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA4NDczMDg4NwJfMQQGY2FsbGVyCAUNJHQwMzA4NDczMDg4NwJfMgQEZGF0ZQgFDSR0MDMwODQ3MzA4ODcCXzMDCQECIT0CBQZjYWxsZXIFBmlzc3VlcgkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMTExMzMxMTc0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTExMzMxMTc0Al8xBAZjYWxsZXIIBQ0kdDAzMTExMzMxMTc0Al8yBARkYXRlCAUNJHQwMzExMTMzMTE3NAJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAA0DAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V52ThywA==", "height": 2411486, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3TZVYwPB8Yj3wX3r6t1xB9e5eUReLbDyCyqSbCusmjoW Next: 7Uq4o6TrBXEsGXdeSQZ5gpFh5196qPEokpLM3beUmZbg Diff:
OldNewDifferences
377377
378378 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
379379 then throw(maintenanceMSG)
380- else {
381- let caller = if (if ((toBase58String(i.caller.bytes) == toBase58String(this.bytes)))
382- then !(isDefined(i.payments))
383- else false)
384- then toString(addressFromPublicKey(fromBase58String(pubKey)))
385- else toBase58String(i.caller.bytes)
386- let get_sponsored_waves = if ((pubKey != ""))
387- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
388- else unit
389- if ((get_sponsored_waves == get_sponsored_waves))
390- then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
391- else throw("Strict value is not equal to itself.")
392- }
380+ else if (true)
381+ then throw(((toBase58String(i.caller.bytes) + " ") + toString(this)))
382+ else {
383+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384+ then !(isDefined(i.payments))
385+ else false)
386+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
387+ else toBase58String(i.caller.bytes)
388+ let get_sponsored_waves = if ((pubKey != ""))
389+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
390+ else unit
391+ if ((get_sponsored_waves == get_sponsored_waves))
392+ then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
393+ else throw("Strict value is not equal to itself.")
394+ }
393395
394396
395397 func idCallerDate (i) = if (!(dappRunning))
398400
399401
400402 func buyMint (i,artId,issuer,bidId,bidOwner) = {
401- let $t01270212761 = idCallerDate(i)
402- let id = $t01270212761._1
403- let caller = $t01270212761._2
404- let date = $t01270212761._3
403+ let $t01277512834 = idCallerDate(i)
404+ let id = $t01277512834._1
405+ let caller = $t01277512834._2
406+ let date = $t01277512834._3
405407 let isBid = if (if (if ((caller == issuer))
406408 then (bidOwner != "")
407409 else false)
457459 then throw(checkUser)
458460 else {
459461 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
460- let $t01446414631 = if (isBid)
462+ let $t01453714704 = if (isBid)
461463 then getPriceAssetIdFromBid(bidDataKey)
462464 else validatePriceAssetId(i, priceAssetId, artworkPrice)
463- let amount = $t01446414631._1
464- let assetId = $t01446414631._2
465+ let amount = $t01453714704._1
466+ let assetId = $t01453714704._2
465467 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
466468 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
467469 let isWhitelisted = checkWhitelist(issuer)
550552
551553 @Callable(i)
552554 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t01866418724 = idCallerDateSponsored(i, pubKey)
554- let artId = $t01866418724._1
555- let caller = $t01866418724._2
556- let date = $t01866418724._3
555+ let $t01873718797 = idCallerDateSponsored(i, pubKey)
556+ let artId = $t01873718797._1
557+ let caller = $t01873718797._2
558+ let date = $t01873718797._3
557559 if (true)
558560 then throw(caller)
559561 else if (!(validateHash(sha256Hash)))
560562 then throw("Hash should be 64 characters maximum")
561563 else {
562- let $t01885618925 = setLIcence(cidLicence, sha256Licence)
563- let licenceCID = $t01885618925._1
564- let licenceHash = $t01885618925._2
564+ let $t01892918998 = setLIcence(cidLicence, sha256Licence)
565+ let licenceCID = $t01892918998._1
566+ let licenceHash = $t01892918998._2
565567 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
566568 if ((validateArtwork != ""))
567569 then throw("Something went wrong!")
568570 else {
569571 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
570- let $t01922419308 = if (whitelisted_drop)
572+ let $t01929719381 = if (whitelisted_drop)
571573 then $Tuple2(0, signID)
572574 else validatePayment(i)
573- let amount = $t01922419308._1
574- let assetId = $t01922419308._2
575+ let amount = $t01929719381._1
576+ let assetId = $t01929719381._2
575577 if (!(isDefined(amount)))
576578 then throw("Something went wrong")
577579 else {
607609 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608610 then throw(maintenanceMSG)
609611 else {
610- let $t02225022307 = idCallerDateSponsored(i, pubKey)
611- let id = $t02225022307._1
612- let caller = $t02225022307._2
613- let date = $t02225022307._3
614- let $t02231722386 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02231722386._1
616- let licenceHash = $t02231722386._2
612+ let $t02232322380 = idCallerDateSponsored(i, pubKey)
613+ let id = $t02232322380._1
614+ let caller = $t02232322380._2
615+ let date = $t02232322380._3
616+ let $t02239022459 = setLIcence(cidLicence, sha256Licence)
617+ let licenceCID = $t02239022459._1
618+ let licenceHash = $t02239022459._2
617619 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618620 if ((validateArtwork != ""))
619621 then throw("Something went wrong!")
636638
637639 @Callable(i)
638640 func flagArtwork (artId,addr,flag,note) = {
639- let $t02388723921 = idCallerDate(i)
640- let id = $t02388723921._1
641- let caller = $t02388723921._2
641+ let $t02396023994 = idCallerDate(i)
642+ let id = $t02396023994._1
643+ let caller = $t02396023994._2
642644 if (containsElement([chris, toString(this)], caller))
643645 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644646 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
650652
651653 @Callable(i)
652654 func deleteArtwork (artId,addr) = {
653- let $t02435724391 = idCallerDate(i)
654- let id = $t02435724391._1
655- let caller = $t02435724391._2
655+ let $t02443024464 = idCallerDate(i)
656+ let id = $t02443024464._1
657+ let caller = $t02443024464._2
656658 let addrToUse = if (containsElement([chris, toString(this)], caller))
657659 then addr
658660 else caller
685687
686688 @Callable(i)
687689 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02722727278 = idCallerDateSponsored(i, pubKey)
689- let id = $t02722727278._1
690- let caller = $t02722727278._2
690+ let $t02730027351 = idCallerDateSponsored(i, pubKey)
691+ let id = $t02730027351._1
692+ let caller = $t02730027351._2
691693 let artworkName = getStringByKey(keyName(caller, artId))
692694 if ((artworkName == ""))
693695 then throw("This art doesn't match your account")
758760
759761 @Callable(i)
760762 func setBid (artId,issuer) = {
761- let $t02953529575 = idCallerDate(i)
762- let id = $t02953529575._1
763- let caller = $t02953529575._2
764- let date = $t02953529575._3
765- let $t02958029616 = isPayment(i)
766- let payment = $t02958029616._1
767- let amount = $t02958029616._2
763+ let $t02960829648 = idCallerDate(i)
764+ let id = $t02960829648._1
765+ let caller = $t02960829648._2
766+ let date = $t02960829648._3
767+ let $t02965329689 = isPayment(i)
768+ let payment = $t02965329689._1
769+ let amount = $t02965329689._2
768770 let assetId = if (!(isDefined(payment.assetId)))
769771 then "WAVES"
770772 else toBase58String(value(payment.assetId))
795797
796798 @Callable(i)
797799 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03077430814 = idCallerDate(i)
799- let id = $t03077430814._1
800- let caller = $t03077430814._2
801- let date = $t03077430814._3
800+ let $t03084730887 = idCallerDate(i)
801+ let id = $t03084730887._1
802+ let caller = $t03084730887._2
803+ let date = $t03084730887._3
802804 if ((caller != issuer))
803805 then throw("You cannot do this action")
804806 else buyMint(i, artId, issuer, bidId, bidOwner)
808810
809811 @Callable(i)
810812 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03104031101 = idCallerDate(i)
812- let id = $t03104031101._1
813- let caller = $t03104031101._2
814- let date = $t03104031101._3
813+ let $t03111331174 = idCallerDate(i)
814+ let id = $t03111331174._1
815+ let caller = $t03111331174._2
816+ let date = $t03111331174._3
815817 if (if ((caller != bidOwner))
816818 then (caller != issuer)
817819 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.1.9"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2424
2525 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2626
2727 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2828
2929 let wavesAssetId = base58''
3030
3131 let chris = getStringByKey("conf_admin_1")
3232
3333 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3434
3535
3636 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3737
3838
3939 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4040
4141
4242 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4343
4444
4545 let signCut = 7
4646
4747 let usdnWaveCut = 10
4848
4949 let defaultLicence = getStringByKey("conf_default_licence")
5050
5151 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5252
5353 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5454
5555 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5656
5757 let userSuspended = "SUSPENDED"
5858
5959 let userRemoved = "REMOVED"
6060
6161 let userUnregistered = "UNREGISTERED"
6262
6363 let userAllowed = "ALLOWED"
6464
6565 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6666
6767 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
6868
6969
7070 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7171 case a: String =>
7272 if (contains(a, sha256Hash))
7373 then true
7474 else false
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func validateCID (cid) = if (contains(cid, "/"))
8181 then if (if ((76 > size(cid)))
8282 then (size(split(cid, "/")[0]) == 59)
8383 else false)
8484 then (16 > size(split(cid, "/")[1]))
8585 else false
8686 else false
8787
8888
8989 func validateHash (hash) = (size(hash) == 64)
9090
9191
9292 func keyUserStatus (caller) = ("user_status_" + caller)
9393
9494
9595 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9696
9797
9898 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9999
100100
101101 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
102102
103103
104104 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
105105
106106
107107 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
108108
109109
110110 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
111111
112112
113113 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
114114
115115
116116 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
117117
118118
119119 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
120120
121121
122122 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
123123
124124
125125 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
126126
127127
128128 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
129129
130130
131131 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
132132
133133
134134 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
135135
136136
137137 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
138138
139139
140140 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
141141
142142
143143 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
144144
145145
146146 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
147147
148148
149149 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
150150
151151
152152 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
153153
154154
155155 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
156156
157157
158158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159159
160160
161161 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
162162
163163
164164 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
165165
166166
167167 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
168168
169169
170170 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
171171
172172
173173 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
174174
175175
176176 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
177177 then throw("Wrong Display CID")
178178 else if (!(validateCID(cidExport)))
179179 then throw("Wrong Export CID")
180180 else if (if ((cidLicence != ""))
181181 then !(validateCID(cidLicence))
182182 else false)
183183 then throw("Wrong Licence CID")
184184 else true
185185
186186
187187 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
188188 then throw("Export Hash 64 char. max")
189189 else if (!(validateHash(sha256Licence)))
190190 then throw("Licence Hash 64 char. max")
191191 else true
192192
193193
194194 func validateString (str,max) = if ((size(str) == 0))
195195 then throw("Field cannot be is empty")
196196 else if ((size(str) > max))
197197 then throw((str + " is too long"))
198198 else true
199199
200200
201201 func validateUser (caller) = if (true)
202202 then throw(caller)
203203 else {
204204 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205205 if (if ((userStatus == userUnregistered))
206206 then true
207207 else (userStatus == userAllowed))
208208 then "Register this account first with \"Account\" tab"
209209 else if ((userStatus == userSuspended))
210210 then "Account suspended"
211211 else if ((userStatus == userRemoved))
212212 then "Account removed"
213213 else ""
214214 }
215215
216216
217217 func setLIcence (cidLicence,sha256Licence) = {
218218 let cid = if ((size(cidLicence) == 0))
219219 then defaultLicence
220220 else cidLicence
221221 let hash = if ((size(sha256Licence) == 0))
222222 then defaultHashLicence
223223 else sha256Licence
224224 $Tuple2(cid, hash)
225225 }
226226
227227
228228 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
229229 let checkUser = validateUser(caller)
230230 if ((checkUser != ""))
231231 then throw(checkUser)
232232 else if ((size(cidDisplay) == 0))
233233 then throw("Display CID cannot be empty")
234234 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
235235 then throw("Problem with CID")
236236 else if (!(validateAllHash(sha256Export, licenceHash)))
237237 then throw("Problem with Hashes")
238238 else if (!(validateString(name, 100)))
239239 then throw("100 Char. max name")
240240 else if (!(validateString(description, 1000)))
241241 then throw("1000 Char. max description")
242242 else if (if ((0 > royalties))
243243 then true
244244 else (royalties > 1000))
245245 then throw("Royalties cannot be less than 0% or higher than 10%")
246246 else if ((size(split(tags, ",")) > 5))
247247 then throw("5 tags max.")
248248 else ""
249249 }
250250
251251
252252 func isPayment (i) = if ((size(i.payments) == 0))
253253 then throw("No payment attached")
254254 else {
255255 let payment = value(i.payments[0])
256256 let amount = value(payment.amount)
257257 $Tuple2(payment, amount)
258258 }
259259
260260
261261 func validatePayment (i) = {
262262 let $t089108946 = isPayment(i)
263263 let payment = $t089108946._1
264264 let amount = $t089108946._2
265265 let assetId = if (if (isDefined(payment.assetId))
266266 then (payment.assetId == signAssetId)
267267 else false)
268268 then payment.assetId
269269 else throw("Only SIGN token accepted as transaction fee")
270270 if ((amount != currentCertificationPrice))
271271 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
272272 else $Tuple2(amount, assetId)
273273 }
274274
275275
276276 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
277277 case b: Int =>
278278 if ((b != 0))
279279 then true
280280 else false
281281 case _ =>
282282 false
283283 }
284284
285285
286286 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
287287 let $t095349570 = isPayment(i)
288288 let payment = $t095349570._1
289289 let amount = $t095349570._2
290290 let assetId = if (!(isDefined(payment.assetId)))
291291 then unit
292292 else if (if ((size(priceAssetId) > 0))
293293 then (toBase58String(value(payment.assetId)) == priceAssetId)
294294 else false)
295295 then payment.assetId
296296 else throw("Wrong asset id")
297297 if (if ((assetId == unit))
298298 then (priceAssetId != "")
299299 else false)
300300 then throw("Wrong asset id")
301301 else if ((artworkPrice != amount))
302302 then throw("Payment don't match")
303303 else $Tuple2(amount, assetId)
304304 }
305305
306306
307307 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
308308 then (assetId != toBase58String(wavesAssetId))
309309 else false)
310310 then (assetId != "WAVES")
311311 else false)
312312 then (assetId != toBase58String(usdnAssetId))
313313 else false)
314314 then (assetId != toBase58String(usdtAssetId))
315315 else false)
316316 then throw("Only SIGN, USDN,USDT or WAVES accepted")
317317 else true
318318
319319
320320 func validateMinSell (assetId,price) = {
321321 let minSellWaves = if (unitTest)
322322 then 10
323323 else getIntegerByKeyFromOracle("waves_min_sell")
324324 let minSellUsdn = 1000000
325325 let minSellSign = if (unitTest)
326326 then 1
327327 else (currentCertificationPrice * 2)
328328 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
329329 then (minSellUsdn > price)
330330 else false)
331331 then (price != 0)
332332 else false)
333333 then true
334334 else if (if ((assetId == toBase58String(usdtAssetId)))
335335 then (minSellUsdn > price)
336336 else false)
337337 then (price != 0)
338338 else false)
339339 then true
340340 else if (if ((assetId == toBase58String(signAssetId)))
341341 then (minSellSign > price)
342342 else false)
343343 then (price != 0)
344344 else false)
345345 then true
346346 else if (if (if ((assetId == toBase58String(wavesAssetId)))
347347 then true
348348 else (assetId == "WAVES"))
349349 then (minSellWaves > price)
350350 else false)
351351 then (price != 0)
352352 else false)
353353 then throw("Wrong minimum sell price")
354354 else true
355355 }
356356
357357
358358 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
359359 then unit
360360 else fromBase58String(assetId)
361361
362362
363363 func getPriceAssetIdFromBid (bidDataKey) = {
364364 let bidData = getStringByKey((bidDataKey + "_OPEN"))
365365 if ((bidData == ""))
366366 then throw("Bid not found")
367367 else {
368368 let bidDataArr = split(bidData, "_")
369369 let bidAmount = parseIntValue(bidDataArr[1])
370370 let bidAssetId = getBidAssetId(bidDataArr[0])
371371 if ((0 >= bidAmount))
372372 then throw("Wrong amount")
373373 else $Tuple2(bidAmount, bidAssetId)
374374 }
375375 }
376376
377377
378378 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
379379 then throw(maintenanceMSG)
380- else {
381- let caller = if (if ((toBase58String(i.caller.bytes) == toBase58String(this.bytes)))
382- then !(isDefined(i.payments))
383- else false)
384- then toString(addressFromPublicKey(fromBase58String(pubKey)))
385- else toBase58String(i.caller.bytes)
386- let get_sponsored_waves = if ((pubKey != ""))
387- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
388- else unit
389- if ((get_sponsored_waves == get_sponsored_waves))
390- then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
391- else throw("Strict value is not equal to itself.")
392- }
380+ else if (true)
381+ then throw(((toBase58String(i.caller.bytes) + " ") + toString(this)))
382+ else {
383+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384+ then !(isDefined(i.payments))
385+ else false)
386+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
387+ else toBase58String(i.caller.bytes)
388+ let get_sponsored_waves = if ((pubKey != ""))
389+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
390+ else unit
391+ if ((get_sponsored_waves == get_sponsored_waves))
392+ then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
393+ else throw("Strict value is not equal to itself.")
394+ }
393395
394396
395397 func idCallerDate (i) = if (!(dappRunning))
396398 then throw(maintenanceMSG)
397399 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
398400
399401
400402 func buyMint (i,artId,issuer,bidId,bidOwner) = {
401- let $t01270212761 = idCallerDate(i)
402- let id = $t01270212761._1
403- let caller = $t01270212761._2
404- let date = $t01270212761._3
403+ let $t01277512834 = idCallerDate(i)
404+ let id = $t01277512834._1
405+ let caller = $t01277512834._2
406+ let date = $t01277512834._3
405407 let isBid = if (if (if ((caller == issuer))
406408 then (bidOwner != "")
407409 else false)
408410 then (bidId != "")
409411 else false)
410412 then true
411413 else false
412414 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
413415 if (if (if ((blockEnd != 0))
414416 then (height >= blockEnd)
415417 else false)
416418 then !(isBid)
417419 else false)
418420 then throw("Sale ended.")
419421 else {
420422 let callerIsIssuer = (caller == issuer)
421423 let totalNFT = getIntegerByKey("total_nft_issued")
422424 let signID = getStringByKey(keySignID(issuer, artId))
423425 let artworkName = getStringByKey(keyName(issuer, artId))
424426 if ((artworkName == ""))
425427 then throw("Art doesn't exist")
426428 else {
427429 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
428430 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
429431 let artworkPrice = if (callerIsIssuer)
430432 then (currentCertificationPrice * 2)
431433 else getIntegerByKey(keyPrice(issuer, artId))
432434 let priceAssetId = if (callerIsIssuer)
433435 then toBase58String(signAssetId)
434436 else getStringByKey(keyAssetIdAccepted(issuer, artId))
435437 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
436438 if (if (if (!(isBid))
437439 then !(callerIsIssuer)
438440 else false)
439441 then if (if ((0 >= artworkPrice))
440442 then true
441443 else !(isOnSale))
442444 then true
443445 else (0 >= maxCanSell)
444446 else false)
445447 then throw("Art not for sale")
446448 else if (if (if (!(isBid))
447449 then callerIsIssuer
448450 else false)
449451 then (0 >= maxCanSell)
450452 else false)
451453 then throw("Max issuable not set")
452454 else {
453455 let checkUser = validateUser(issuer)
454456 if (if (isBid)
455457 then (checkUser != "")
456458 else false)
457459 then throw(checkUser)
458460 else {
459461 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
460- let $t01446414631 = if (isBid)
462+ let $t01453714704 = if (isBid)
461463 then getPriceAssetIdFromBid(bidDataKey)
462464 else validatePriceAssetId(i, priceAssetId, artworkPrice)
463- let amount = $t01446414631._1
464- let assetId = $t01446414631._2
465+ let amount = $t01453714704._1
466+ let assetId = $t01453714704._2
465467 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
466468 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
467469 let isWhitelisted = checkWhitelist(issuer)
468470 let cut = if ((isWhitelisted > height))
469471 then 0
470472 else if ((assetId == signAssetId))
471473 then signCut
472474 else usdnWaveCut
473475 let amountForSign = fraction(amount, cut, 100)
474476 let amountForAgent = if (if (if ((agent != feeReceiver))
475477 then (agentShare > 0)
476478 else false)
477479 then (height > isWhitelisted)
478480 else false)
479481 then fraction(amount, agentShare, 100)
480482 else 0
481483 let amountForCreator = (amount - amountForSign)
482484 if ((amountSold == maxCanSell))
483485 then throw("Art sold out")
484486 else {
485487 let newAmountSold = (amountSold + 1)
486488 let issueMeta = ((((((((((("Creator: " + issuer) + ",
487489 ArtID: ") + artId) + ",
488490 SignID: ") + signID) + ",
489491 Artwork name: ") + artworkName) + ",
490492 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
491493 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
492494 let idNFT = calculateAssetId(issueNFT)
493495 let sellStatus = if (if ((newAmountSold == maxCanSell))
494496 then true
495497 else !(isOnSale))
496498 then false
497499 else true
498500 let receiveNFT = if (if (if ((caller == issuer))
499501 then (bidOwner != "")
500502 else false)
501503 then (bidId != "")
502504 else false)
503505 then addressFromStringValue(bidOwner)
504506 else i.caller
505507 let assetIdBid = if (!(isDefined(assetId)))
506508 then "WAVES"
507509 else toBase58String(value(assetId))
508510 let bidData = getStringByKey((bidDataKey + "_OPEN"))
509511 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
510512 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
511513 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
512514 let soldValue = if (!(isBid))
513515 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
514516 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
515517 let soldData = StringEntry(soldKey, soldValue)
516518 let commissions = if ((amountForAgent != 0))
517519 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
518520 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
519521 let buyRes = ([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
520522 if (isBid)
521523 then [soldData, bidUpdate, bidDelOld] :: buyRes
522524 else soldData :: buyRes
523525 }
524526 }
525527 }
526528 }
527529 }
528530 }
529531
530532
531533 func asString (bv) = match bv {
532534 case bv0: String =>
533535 bv0
534536 case _ =>
535537 throw("Sponsored Public Key String expected")
536538 }
537539
538540
539541 @Callable(invoke)
540542 func setConf (key,val) = {
541543 let caller = toString(invoke.caller)
542544 if (containsElement([chris, toString(this)], caller))
543545 then if (contains(key, "conf_"))
544546 then [StringEntry(key, val)]
545547 else throw("Entries starting with conf_ only")
546548 else throw("You are not allowed to change this")
547549 }
548550
549551
550552
551553 @Callable(i)
552554 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t01866418724 = idCallerDateSponsored(i, pubKey)
554- let artId = $t01866418724._1
555- let caller = $t01866418724._2
556- let date = $t01866418724._3
555+ let $t01873718797 = idCallerDateSponsored(i, pubKey)
556+ let artId = $t01873718797._1
557+ let caller = $t01873718797._2
558+ let date = $t01873718797._3
557559 if (true)
558560 then throw(caller)
559561 else if (!(validateHash(sha256Hash)))
560562 then throw("Hash should be 64 characters maximum")
561563 else {
562- let $t01885618925 = setLIcence(cidLicence, sha256Licence)
563- let licenceCID = $t01885618925._1
564- let licenceHash = $t01885618925._2
564+ let $t01892918998 = setLIcence(cidLicence, sha256Licence)
565+ let licenceCID = $t01892918998._1
566+ let licenceHash = $t01892918998._2
565567 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
566568 if ((validateArtwork != ""))
567569 then throw("Something went wrong!")
568570 else {
569571 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
570- let $t01922419308 = if (whitelisted_drop)
572+ let $t01929719381 = if (whitelisted_drop)
571573 then $Tuple2(0, signID)
572574 else validatePayment(i)
573- let amount = $t01922419308._1
574- let assetId = $t01922419308._2
575+ let amount = $t01929719381._1
576+ let assetId = $t01929719381._2
575577 if (!(isDefined(amount)))
576578 then throw("Something went wrong")
577579 else {
578580 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
579581 if ((entryExist != ""))
580582 then throw("You already added it")
581583 else {
582584 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
583585 if ((hashExist != ""))
584586 then throw("Hash already registered")
585587 else {
586588 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
587589 if (!(isSignCertified))
588590 then throw("Sign Certificate not found for this address.")
589591 else {
590592 let decrease_whitelist_drop = if (whitelisted_drop)
591593 then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
592594 else unit
593595 if ((decrease_whitelist_drop == decrease_whitelist_drop))
594596 then [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(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)]
595597 else throw("Strict value is not equal to itself.")
596598 }
597599 }
598600 }
599601 }
600602 }
601603 }
602604 }
603605
604606
605607
606608 @Callable(i)
607609 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608610 then throw(maintenanceMSG)
609611 else {
610- let $t02225022307 = idCallerDateSponsored(i, pubKey)
611- let id = $t02225022307._1
612- let caller = $t02225022307._2
613- let date = $t02225022307._3
614- let $t02231722386 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02231722386._1
616- let licenceHash = $t02231722386._2
612+ let $t02232322380 = idCallerDateSponsored(i, pubKey)
613+ let id = $t02232322380._1
614+ let caller = $t02232322380._2
615+ let date = $t02232322380._3
616+ let $t02239022459 = setLIcence(cidLicence, sha256Licence)
617+ let licenceCID = $t02239022459._1
618+ let licenceHash = $t02239022459._2
617619 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618620 if ((validateArtwork != ""))
619621 then throw("Something went wrong!")
620622 else {
621623 let entryExist = getStringByKey(keyName(caller, txid))
622624 if ((entryExist == ""))
623625 then throw("Entry not found")
624626 else {
625627 let flag = getStringByKey(keyFlag(caller, txid))
626628 if ((flag == "ILLEGAL"))
627629 then throw("Cannot update ILLEGAL artwork")
628630 else if (!(isArtMinted(caller, txid)))
629631 then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)]
630632 else throw("Already minted")
631633 }
632634 }
633635 }
634636
635637
636638
637639 @Callable(i)
638640 func flagArtwork (artId,addr,flag,note) = {
639- let $t02388723921 = idCallerDate(i)
640- let id = $t02388723921._1
641- let caller = $t02388723921._2
641+ let $t02396023994 = idCallerDate(i)
642+ let id = $t02396023994._1
643+ let caller = $t02396023994._2
642644 if (containsElement([chris, toString(this)], caller))
643645 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644646 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
645647 else throw(("Unknow status " + flag))
646648 else throw("You are not allowed")
647649 }
648650
649651
650652
651653 @Callable(i)
652654 func deleteArtwork (artId,addr) = {
653- let $t02435724391 = idCallerDate(i)
654- let id = $t02435724391._1
655- let caller = $t02435724391._2
655+ let $t02443024464 = idCallerDate(i)
656+ let id = $t02443024464._1
657+ let caller = $t02443024464._2
656658 let addrToUse = if (containsElement([chris, toString(this)], caller))
657659 then addr
658660 else caller
659661 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
660662 if ((entryExist == ""))
661663 then throw("No art matching for this address")
662664 else {
663665 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
664666 if ((sha256Hash == ""))
665667 then throw("No art hash matching for this address")
666668 else {
667669 let signID = getStringByKey(keySignID(addrToUse, artId))
668670 if ((signID == ""))
669671 then throw("No SIGN ID matching")
670672 else {
671673 let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))]
672674 if (!(isArtMinted(addrToUse, artId)))
673675 then if (!(dappRunning))
674676 then throw(maintenanceMSG)
675677 else dataToDelete
676678 else if (containsElement([chris, toString(this)], caller))
677679 then dataToDelete
678680 else throw("Art already minted, you cannot delete it")
679681 }
680682 }
681683 }
682684 }
683685
684686
685687
686688 @Callable(i)
687689 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02722727278 = idCallerDateSponsored(i, pubKey)
689- let id = $t02722727278._1
690- let caller = $t02722727278._2
690+ let $t02730027351 = idCallerDateSponsored(i, pubKey)
691+ let id = $t02730027351._1
692+ let caller = $t02730027351._2
691693 let artworkName = getStringByKey(keyName(caller, artId))
692694 if ((artworkName == ""))
693695 then throw("This art doesn't match your account")
694696 else {
695697 let flag = getStringByKey(keyFlag(caller, artId))
696698 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
697699 then throw("Flagged artwork")
698700 else {
699701 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
700702 if ((0 > blockEnd))
701703 then throw("Negative end")
702704 else if (if ((blockEnd > 0))
703705 then if ((maxMint != 1))
704706 then true
705707 else (price != 0)
706708 else false)
707709 then throw("Timed offer only allowed for unique edition and offer only")
708710 else {
709711 let baseHeight = if ((blockEnd == 0))
710712 then 0
711713 else height
712714 if (!(acceptedAssetIds(assetId)))
713715 then throw("Something went wrong!")
714716 else if (!(validateMinSell(assetId, price)))
715717 then throw("Something went wrong!")
716718 else {
717719 let checkUser = validateUser(caller)
718720 if ((checkUser != ""))
719721 then throw(checkUser)
720722 else {
721723 let amountSold = getIntegerByKey(keyIssued(caller, artId))
722724 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
723725 if ((maxMint > 100))
724726 then throw("100 editions max per artwork")
725727 else if (if ((amountSold != 0))
726728 then (amountSold == maxCanSell)
727729 else false)
728730 then throw("Max edition reached.")
729731 else if (if ((amountSold > 0))
730732 then (maxCanSell != maxMint)
731733 else false)
732734 then throw("Cannot change maximum issuable anymore")
733735 else if (if ((bidNbr > 0))
734736 then (maxCanSell != maxMint)
735737 else false)
736738 then throw("Cannot change maximum issuable with active orders")
737739 else {
738740 let sellStatus = if (if ((price > 0))
739741 then (maxMint > 0)
740742 else false)
741743 then true
742744 else false
743745 [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))]
744746 }
745747 }
746748 }
747749 }
748750 }
749751 }
750752 }
751753
752754
753755
754756 @Callable(i)
755757 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
756758
757759
758760
759761 @Callable(i)
760762 func setBid (artId,issuer) = {
761- let $t02953529575 = idCallerDate(i)
762- let id = $t02953529575._1
763- let caller = $t02953529575._2
764- let date = $t02953529575._3
765- let $t02958029616 = isPayment(i)
766- let payment = $t02958029616._1
767- let amount = $t02958029616._2
763+ let $t02960829648 = idCallerDate(i)
764+ let id = $t02960829648._1
765+ let caller = $t02960829648._2
766+ let date = $t02960829648._3
767+ let $t02965329689 = isPayment(i)
768+ let payment = $t02965329689._1
769+ let amount = $t02965329689._2
768770 let assetId = if (!(isDefined(payment.assetId)))
769771 then "WAVES"
770772 else toBase58String(value(payment.assetId))
771773 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
772774 if (if ((blockEnd != 0))
773775 then (height >= blockEnd)
774776 else false)
775777 then throw("Sale ended.")
776778 else {
777779 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
778780 if (!(acceptedAssetIds(assetId)))
779781 then throw("asset not accepted")
780782 else if (!(validateMinSell(assetId, amount)))
781783 then throw("Wrong min sell")
782784 else {
783785 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
784786 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
785787 if ((0 >= maxCanSell))
786788 then throw("No max edition set for this artwork")
787789 else if ((amountSold >= maxCanSell))
788790 then throw("Sold out, you cannot bid")
789791 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
790792 }
791793 }
792794 }
793795
794796
795797
796798 @Callable(i)
797799 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03077430814 = idCallerDate(i)
799- let id = $t03077430814._1
800- let caller = $t03077430814._2
801- let date = $t03077430814._3
800+ let $t03084730887 = idCallerDate(i)
801+ let id = $t03084730887._1
802+ let caller = $t03084730887._2
803+ let date = $t03084730887._3
802804 if ((caller != issuer))
803805 then throw("You cannot do this action")
804806 else buyMint(i, artId, issuer, bidId, bidOwner)
805807 }
806808
807809
808810
809811 @Callable(i)
810812 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03104031101 = idCallerDate(i)
812- let id = $t03104031101._1
813- let caller = $t03104031101._2
814- let date = $t03104031101._3
813+ let $t03111331174 = idCallerDate(i)
814+ let id = $t03111331174._1
815+ let caller = $t03111331174._2
816+ let date = $t03111331174._3
815817 if (if ((caller != bidOwner))
816818 then (caller != issuer)
817819 else false)
818820 then throw("You cannot do this action")
819821 else {
820822 let returnMoneyTo = if ((caller == issuer))
821823 then bidOwner
822824 else caller
823825 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
824826 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
825827 let bidData = getStringByKey((bidDataKey + "_OPEN"))
826828 if ((bidData == ""))
827829 then throw("Bid not found")
828830 else {
829831 let bidDataArr = split(bidData, "_")
830832 let assetId = getBidAssetId(bidDataArr[0])
831833 let bidStatus = "CANCELED"
832834 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
833835 }
834836 }
835837 }
836838
837839
838840 @Verifier(tx)
839841 func verifier () = match tx {
840842 case inv: InvokeScriptTransaction =>
841843 if (if ((inv.function == "addArtwork"))
842844 then (inv.dApp == this)
843845 else false)
844846 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
845847 else if (if ((inv.function == "updateArtwork"))
846848 then (inv.dApp == this)
847849 else false)
848850 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
849851 else if (if ((inv.function == "sellArtwork"))
850852 then (inv.dApp == this)
851853 else false)
852854 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
853855 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
854856 case _ =>
855857 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
856858 }
857859

github/deemru/w8io/169f3d6 
98.41 ms