tx · CywthyCVjKYhb4uuuH2p8FbEodkECnCi69jctcf7dPAn

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.03200000 Waves

2024.03.10 16:35 [4077837] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "CywthyCVjKYhb4uuuH2p8FbEodkECnCi69jctcf7dPAn", "fee": 3200000, "feeAssetId": null, "timestamp": 1710077801530, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "3cArS7cYDgTqnPzVHcF7egjJNCkNyvtfWnWPBNxJYMHoYCz5YoCnvRub3Sds1ASQj7nvtj573Fr1YT6X3gyk9yGD" ], "script": "base64:BgJsCAISABIDCgEIEgMKAQgSBAoCCAESAwoBCBIECgIBCBIECgIBCBIDCgEIEgMKAQgSBAoCCAgSABIFCgMIAQESAwoBCBIAEgASABIECgIICBIFCgMICAESAwoBARIKCggBCAEECAEBARIDCgEBRgEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzARRzdGF0aWNLZXlfZWdnQXNzZXRJZAACEXN0YXRpY19lZ2dBc3NldElkARpzdGF0aWNLZXlfdHJ1c3RlZENvbnRyYWN0cwACF3N0YXRpY190cnVzdGVkQ29udHJhY3RzARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAAhVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwACG3N0YXRpY190dXJ0bGVSZWJpcnRoQWRkcmVzcwEWc3RhdGljS2V5X3BpcGVsaW5lVXNlcgACE3N0YXRpY19waXBlbGluZVVzZXIBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEbc3RhdGljS2V5X2h1bnREaXN0cm9BZGRyZXNzAAIYc3RhdGljX2h1bnREaXN0cm9BZGRyZXNzARJzdGF0aWNLZXlfd2Fyc1BLZXkAAg9zdGF0aWNfd2Fyc1BLZXkBF3N0YXRpY0tleV9kdXBsaWNhdG9yRmVlAAIUc3RhdGljX2R1cGxpY2F0b3JGZWUBEWtleV9hcnRlZmFjdE93bmVyAgxhcnRlZmFjdE5hbWUFb3duZXIJAKwCAgkArAICCQCsAgIFDGFydGVmYWN0TmFtZQIBXwUFb3duZXICBl9vd25lcgERa2V5X3Vuc3Rha2VIZWlnaHQCDGFydGVmYWN0TmFtZQphcnRlZmFjdElkCQCsAgIJAKwCAgkArAICBQxhcnRlZmFjdE5hbWUCAV8FCmFydGVmYWN0SWQCD191bnN0YWtlX2hlaWdodAEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQZkdWNrSWQJAKwCAgUGZHVja0lkAhRfZHVja19leHRlcm5hbF9ib29zdAEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCFF91c2VyX2V4dGVybmFsX2Jvb3N0ARFrZXlfcHJpY2VDb3NtZXRpYwEEaXRlbQkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtARRrZXlfbWF4U2FsZXNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CCl9tYXhfc2FsZXMBEGtleV9zYWxlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgVfc2FsZQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CC19wcmljZUFzc2V0ARprZXlfZ3Jvd1BlcmNlbnRhZ2VDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CE19ncm93aW5nX3BlcmNlbnRhZ2UBEGtleV9zb2xkQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgVfc29sZAEVa2V5X2xhc3RQcmljZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQILX2xhc3RfcHJpY2UBE2tleV9zdGFydFRzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAghfc3RhcnRUcwERa2V5X2VuZFRzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgZfZW5kVHMBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAIDX2ZoARhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAhVzdGF0aWNfY291cG9uc0FkZHJlc3MACmRldkFkZHJlc3MBGgFXF3fYQk8hOgpGT8vir4YiaxOc51un3nx7AAplZ2dzTmVlZGVkCQBoAgADAIDC1y8ADmFydGVmYWN0c0xpbWl0CQBkAgCtAgDYBAAJZnJlZUdlbmVzCQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGCQDMCAICAUcJAMwIAgIBSAkAzAgCAgFJBQNuaWwADG9sZEFydGVmYWN0cwkAzAgCAghBUlQtTEFLRQkAzAgCAglBUlQtSE9VU0UJAMwIAgIMQVJULUJJR0hPVVNFCQDMCAICC0FSVC1GSVhHRU5FCQDMCAICDEFSVC1GUkVFR0VORQkAzAgCAgpBUlQtTUlSUk9SCQDMCAICCEFSVC1QT01QCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIOQVJULUNVU1RPTURVQ0sFA25pbAAJYXJ0ZWZhY3RzCQDMCAICCkFSVC1YTUlTVEwJAMwIAgIIQVJULVhIQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIJAMwIAgIJQVJULVhTT0NLCQDMCAICCUFSVC1YVFJFRQUDbmlsAAthbGxBcnRlZmFjdAkAzggCBQlhcnRlZmFjdHMFDG9sZEFydGVmYWN0cwAIYm9vc3RlcnMJAMwIAgIKQVJULVRJTlNFTAkAzAgCAgpBUlQtRkVFRDEwCQDMCAICDkFSVC1HTkdSX0JSRUFECQDMCAICDEFSVC1TTk9XQkFMTAkAzAgCAg5BUlQtR0lGVF9ET1VCTAUDbmlsAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQMZmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBQxmaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIJAMsBAgEEHEF95gUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBEWdldFJhbmRvbUFydGVmYWN0AgVib3hJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCWFydGVmYWN0cwUFYm94SWQFAWgAAQkAkQMCBQlhcnRlZmFjdHMFDHJhbmRvbU51bWJlcgEOZ2V0UmFuZG9tR2VuZXMCBHR4SWQBaAQMcmFuZG9tTnVtYmVyCQEPZ2V0UmFuZG9tTnVtYmVyBAkAkAMBBQlmcmVlR2VuZXMFBHR4SWQFAWgAAgkAkQMCBQlmcmVlR2VuZXMFDHJhbmRvbU51bWJlcgEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARNnZXRUcnVzdGVkQ29udHJhY3RzAAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARpzdGF0aWNLZXlfdHJ1c3RlZENvbnRyYWN0cwABEWdldFJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfdHVydGxlUmViaXJ0aEFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAARRnZXRIdW50RGlzdHJvQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBG3N0YXRpY0tleV9odW50RGlzdHJvQWRkcmVzcwABC2dldFdhcnNQS2V5AAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV93YXJzUEtleQABEGdldER1cGxpY2F0b3JGZWUACQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZHVwbGljYXRvckZlZQABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBGl0ZW0EA2tleQkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQkArAICCQCsAgICCElUR0NJUDogBQRpdGVtAh8gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUhAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQ5tYW5pcHVsYXRlTmFtZQMJYXNzZXROYW1lCHBvc2l0aW9uBGNoYXIJAKwCAgkArAICCQCvAgIFCWFzc2V0TmFtZQkAZQIFCHBvc2l0aW9uAAEFBGNoYXIJALICAgUJYXNzZXROYW1lCQBlAgAQBQhwb3NpdGlvbgEQaXRlbUlzSW5Db29sRG93bgIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQEEXVuc3Rha2VIZWlnaHRMYXN0CQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfdW5zdGFrZUhlaWdodAIFDGFydGVmYWN0TmFtZQUKYXJ0ZWZhY3RJZAQOY29vbGRvd25QZXJpb2QA8AEDCQBmAgUGaGVpZ2h0CQBkAgURdW5zdGFrZUhlaWdodExhc3QFDmNvb2xkb3duUGVyaW9kBwYBCWlzVGVzdEVudgAJAQ10cnlHZXRCb29sZWFuAQIHVEVTVEVOVgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQlpc3N1ZUl0ZW0DBHR5cGUFbm9uY2UHYWRkcmVzcwQIYXJ0ZWZhY3QJAMMIBwUEdHlwZQIhTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWUuAAEAAAcFBHVuaXQFBW5vbmNlBAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUEdHlwZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQFA25pbAkA2AQBBQphcnRlZmFjdElkAQppdGVtTWVyZ2VyCQhiYXNlSXRlbQ5hbW91bnRCYXNlSXRlbQdlbmRJdGVtCHBheW1lbnRzCWZlZUFtb3VudApmZWVBc3NldElkCXJlY2lwaWVudA1pbnN0YW50RmluaXNoBHR4SWQDCQECIT0CCQCQAwEFCHBheW1lbnRzCQBkAgUOYW1vdW50QmFzZUl0ZW0AAQkAAgEJAKwCAgkArAICAhNJSUQ6IFBsZWFzZSBhdHRhY2ggCQCkAwEJAGQCBQ5hbW91bnRCYXNlSXRlbQACAgogcGF5bWVudHMhCgEKaXNCYXNlSXRlbQILYWNjdW11bGF0ZWQDcGF5AwMJAAACCAUDcGF5B2Fzc2V0SWQFBHVuaXQGCQAAAggFA3BheQdhc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAJQKAggFC2FjY3VtdWxhdGVkAl8xCQBkAggFC2FjY3VtdWxhdGVkAl8yAAAEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwYXkHYXNzZXRJZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDCQAAAgUIYXJ0ZWZhY3QFCGJhc2VJdGVtCQCUCgIJAM4IAggFC2FjY3VtdWxhdGVkAl8xCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJAGQCCAULYWNjdW11bGF0ZWQCXzIAAQkAlAoCCAULYWNjdW11bGF0ZWQCXzEJAGQCCAULYWNjdW11bGF0ZWQCXzIAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNdG90YWxCYXNlSXRlbQoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmlzQmFzZUl0ZW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQECIT0CCAUNdG90YWxCYXNlSXRlbQJfMgUOYW1vdW50QmFzZUl0ZW0JAAIBCQCsAgIJAKwCAgkArAICAhNJSUQ6IFBsZWFzZSBhdHRhY2ggCQCkAwEFDmFtb3VudEJhc2VJdGVtAhMgYXJ0ZWZhY3RzIG9mIHR5cGUgBQhiYXNlSXRlbQQKZmVlUGF5bWVudAkAkQMCBQhwYXltZW50cwUOYW1vdW50QmFzZUl0ZW0DCQECIT0CCAUKZmVlUGF5bWVudAdhc3NldElkBQpmZWVBc3NldElkCQACAQIlSUlEOiBZb3UgbWlzcyBhIHBheW1lbnQgd2l0aCB0aGUgZmVlIQMJAQIhPQIIBQpmZWVQYXltZW50BmFtb3VudAUJZmVlQW1vdW50CQACAQIvSUlEOiBZb3UgZGlkIG5vdCBhdHRhY2ggdGhlIGNvcnJlY3QgZmVlIGFtb3VudCEECGFydGVmYWN0CQDDCAcFB2VuZEl0ZW0JAKwCAgIiTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWU6IAUHZW5kSXRlbQABAAAHBQR1bml0AAAECmFydGVmYWN0SWQJALgIAQUIYXJ0ZWZhY3QEB2luc3RhbnQDBQ1pbnN0YW50RmluaXNoCQEJaXNzdWVJdGVtAwUHZW5kSXRlbQAABQlyZWNpcGllbnQJAJQKAgUDbmlsAgAJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAgZtZXJnZV8FBHR4SWQCCF9pbnN0YW50BQ1pbnN0YW50RmluaXNoCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50CAUKZmVlUGF5bWVudAdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZtZXJnZV8FBHR4SWQCB19yZXdhcmQFB2VuZEl0ZW0JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAgZtZXJnZV8FBHR4SWQCCV9maW5pc2hlZAUNaW5zdGFudEZpbmlzaAUDbmlsCAUHaW5zdGFudAJfMQgFDXRvdGFsQmFzZUl0ZW0CXzEIBQdpbnN0YW50Al8yARFnZXRBbW91bnRCYXNlSXRlbQEIYmFzZUl0ZW0JARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAgdfYW1vdW50AQpnZXRFbmRJdGVtAQhiYXNlSXRlbQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQCsAgICBm1lcmdlXwUIYmFzZUl0ZW0CCF9lbmRJdGVtAQhnZXRQcmljZQEIYmFzZUl0ZW0JARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAgZfcHJpY2UBCmdldEluc3RhbnQBCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NikBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIIX2luc3RhbnQBCGdldEFzc2V0AQhiYXNlSXRlbQQFYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAgZfYXNzZXQDCQAAAgUFYXNzZXQCBVdBVkVTBQR1bml0CQDZBAEFBWFzc2V0AQ51c2VyRXhwZXJpZW5jZQEEdXNlcgkArAICBQR1c2VyAgtfZXhwZXJpZW5jZQEZZmluaXNoU2hha2VJdEJhYnlJbnRlcm5hbAMGaW5pdFR4B2FkZHJlc3MHcGF5bWVudAQHZXhwVXNlcgkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIJARFnZXRDb3Vwb25zQWRkcmVzcwAJAQ51c2VyRXhwZXJpZW5jZQEFB2FkZHJlc3MECm11bHRpcGxpZXIJAJcDAQkAzAgCCQBkAgkAaQIFB2V4cFVzZXIAZAABCQDMCAIABgUDbmlsBAZmaW5pc2gJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCDF9maW5pc2hCbG9jawMJAGYCBQZmaW5pc2gFBmhlaWdodAkAAgECKVBsZWFzZSB3YWl0IHRpbGwgdGhlIHNoYWtpbmcgaXMgZmluaXNoZWQhAwkBAiE9AgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBG9wZW4JAAIBAiZGU0k6IE9ubHkgb3BlbiBzdGF0dXMgY2FuIGJlIGZpbmlzaGVkIQoBCmhhbmRsZU1pbnQCA2FjYwVpbmRleAMJAGcCBQptdWx0aXBsaWVyBQVpbmRleAQOcmFuZG9tUG9zaXRpb24JAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCGJvb3N0ZXJzCQDZBAEFBmluaXRUeAUGZmluaXNoBQVpbmRleAQDd2luCQCRAwIFCGJvb3N0ZXJzBQ5yYW5kb21Qb3NpdGlvbgkAzggCCQDOCAIFA2FjYwgJAQlpc3N1ZUl0ZW0DBQN3aW4JAGUCBQVpbmRleAABCQERQGV4dHJOYXRpdmUoMTA2MikBBQdhZGRyZXNzAl8xCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIEX3dpbgkApAMBCQBlAgUFaW5kZXgAAQUDd2luBQNuaWwFA2FjYwkAzggCCgACJGwJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKaGFuZGxlTWludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzAgZmaW5pc2gFA25pbBUBaQEQc3RhcnRTaGFrZUl0QmFieQAEC2l0ZW1QYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEEC2l0ZW1Bc3NldElkCQDYBAEJAQV2YWx1ZQEIBQtpdGVtUGF5bWVudAdhc3NldElkAwkBAiE9AggFC2l0ZW1QYXltZW50BmFtb3VudAABCQACAQIdSUlEOiBJdGVtIE5GVCBpcyBub3QgYXR0YWNoZWQEDWdsb2JlQXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgULaXRlbUFzc2V0SWQFA25pbAUDbmlsAwkAAAIFDWdsb2JlQXJ0ZWZhY3QFDWdsb2JlQXJ0ZWZhY3QDCQECIT0CBQ1nbG9iZUFydGVmYWN0Ag1BUlQtU05XX0dMQkVTCQACAQIwSUlEOiBZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtU05XX0dMQkVTIGFydGVmYWN0BAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQGaW5pdFR4CQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAULaXRlbVBheW1lbnQHYXNzZXRJZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfZmluaXNoQmxvY2sJAGQCBQZoZWlnaHQAAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzAgRvcGVuCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9hc3NldElkBQtpdGVtQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWZpbmlzaFNoYWtlSXRCYWJ5AQZpbml0VHgJARlmaW5pc2hTaGFrZUl0QmFieUludGVybmFsAwUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwAAAWkBD2luc3Rhbk1lcmdlSXRlbQEIYmFzZUl0ZW0DCQAAAgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAghfZW5kSXRlbQIACQACAQImSUlEOiBPbmx5IGNlcnRhaW4gaXRlbXMgY2FuIGJlIG1lcmdlZCEEBnBhcmFtcwkAlwoFCQERZ2V0QW1vdW50QmFzZUl0ZW0BBQhiYXNlSXRlbQkBCmdldEVuZEl0ZW0BBQhiYXNlSXRlbQkBCGdldFByaWNlAQUIYmFzZUl0ZW0JAQhnZXRBc3NldAEFCGJhc2VJdGVtCQEKZ2V0SW5zdGFudAEFCGJhc2VJdGVtBAhncmFudEV4cAkA/AcECQERZ2V0Q291cG9uc0FkZHJlc3MAAgtpbmNyZWFzZUV4cAkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUIZ3JhbnRFeHAFCGdyYW50RXhwCQEKaXRlbU1lcmdlcgkFCGJhc2VJdGVtCAUGcGFyYW1zAl8xCAUGcGFyYW1zAl8yCAUBaQhwYXltZW50cwgFBnBhcmFtcwJfMwgFBnBhcmFtcwJfNAgFAWkGY2FsbGVyCAUGcGFyYW1zAl81CQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZGlyZWN0QnV5SXRlbU11bHRpcGxlAghpdGVtTmFtZQppdGVtQW1vdW50BAVhcnJheQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8JAMwIAgAQCQDMCAIAEQkAzAgCABIJAMwIAgATCQDMCAIAFAkAzAgCABUJAMwIAgAWCQDMCAIAFwkAzAgCABgJAMwIAgAZCQDMCAIAGgkAzAgCABsJAMwIAgAcCQDMCAIAHQUDbmlsBAliYXNlUHJpY2UJARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEFCGl0ZW1OYW1lBARncm93CQENdHJ5R2V0SW50ZWdlcgEJARprZXlfZ3Jvd1BlcmNlbnRhZ2VDb3NtZXRpYwEFCGl0ZW1OYW1lBAdzdGFydFRzCQENdHJ5R2V0SW50ZWdlcgEJARNrZXlfc3RhcnRUc0Nvc21ldGljAQUIaXRlbU5hbWUEBWVuZFRzCQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfZW5kVHNDb3NtZXRpYwEFCGl0ZW1OYW1lAwMJAQIhPQIFB3N0YXJ0VHMAAAkAZgIFB3N0YXJ0VHMIBQlsYXN0QmxvY2sJdGltZXN0YW1wBwkAAgECIUlEQkk6IFRoZSBzYWxlIGRpZCBub3Qgc3RhcnQgeWV0IQMDCQECIT0CBQVlbmRUcwAACQBmAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFBWVuZFRzBwkAAgECJElEQkk6IFRoZSBzYWxlIGhhcyBhbHJlYWR5IGZpbmlzaGVkIQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BCQEQa2V5X3NhbGVDb3NtZXRpYwEFCGl0ZW1OYW1lCQACAQkArAICAh9JREJJOiBJdGVtIG5vdCBmb3Igc2FsZSBhbnltb3JlCQEQa2V5X3NhbGVDb3NtZXRpYwEFCGl0ZW1OYW1lBA1tYXhTYWxlc1ZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARRrZXlfbWF4U2FsZXNDb3NtZXRpYwEFCGl0ZW1OYW1lBAlzb2xkVmFsdWUJAQ10cnlHZXRJbnRlZ2VyAQkBEGtleV9zb2xkQ29zbWV0aWMBBQhpdGVtTmFtZQMJAGYCBQppdGVtQW1vdW50CQCQAwEFBWFycmF5CQACAQkArAICAh1JREJJOiBNYXggYW1vdW50IHRvIGlzc3VlIGlzIAkApAMBCQCQAwEFBWFycmF5BAVwcmljZQMJAAACBQRncm93AAAJAGgCBQliYXNlUHJpY2UFCml0ZW1BbW91bnQJAAIBAjpJREJJOiBJdGVtcyB0aGF0IGdyb3cgaW4gcHJpY2UgY2FuIG5vdCBiZSBib3VnaHQgaW4gYmF0Y2ghAwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQVwcmljZQkAAgEJAKwCAgIqSURCSTogUGxlYXNlIGF0dGFjaCB0aGUgZXhhY3QgYXNzZXQgYW1vdW50CQCkAwEFBXByaWNlBAd0eElkU3RyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2FkZHJlc3MIBQFpDG9yaWdpbkNhbGxlcgoBCmhhbmRsZU1pbnQCA2FjYwVpbmRleAMJAGYCBQppdGVtQW1vdW50BQVpbmRleAkAzggCBQNhY2MICQEJaXNzdWVJdGVtAwUIaXRlbU5hbWUFBWluZGV4BQdhZGRyZXNzAl8xBQNhY2MEBmlzc3VlcwoAAiRsBQVhcnJheQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKaGFuZGxlTWludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4JAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5X2xhc3RQcmljZUNvc21ldGljAQUIaXRlbU5hbWUFCWJhc2VQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleV9zb2xkQ29zbWV0aWMBBQhpdGVtTmFtZQkAZAIFCXNvbGRWYWx1ZQUKaXRlbUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFBmFtb3VudAUHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQFBmlzc3VlcwFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQVwcmljZQkAAgEJAKwCAgIqSURCSTogUGxlYXNlIGF0dGFjaCB0aGUgZXhhY3QgYXNzZXQgYW1vdW50CQCkAwEFBXByaWNlBAd0eElkU3RyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2FkZHJlc3MIBQFpDG9yaWdpbkNhbGxlcgQIYXJ0ZWZhY3QJAMMIBwUIaXRlbU5hbWUJAKwCAgIiTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWU6IAUIaXRlbU5hbWUAAQAABwUEdW5pdAAABAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAM4IAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQhpdGVtTmFtZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleV9sYXN0UHJpY2VDb3NtZXRpYwEFCGl0ZW1OYW1lBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleV9zb2xkQ29zbWV0aWMBBQhpdGVtTmFtZQkAZAIFCXNvbGRWYWx1ZQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MAAQUKYXJ0ZWZhY3RJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFBmFtb3VudAUHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJANgEAQUKYXJ0ZWZhY3RJZAFpAQ9tYW5pcHVsYXRlQm9vc3QCBWJvb3N0BmR1Y2tJZAQQYWxsb3dlZENvbnRyYWN0cwkBE2dldFRydXN0ZWRDb250cmFjdHMABBRhbGxvd2VkQ29udHJhY3RzTGlzdAkAtQkCBRBhbGxvd2VkQ29udHJhY3RzAgE7BApkYXBwVG9DYWxsCQClCAEIBQFpBmNhbGxlcgMJAAACCQDPCAIFFGFsbG93ZWRDb250cmFjdHNMaXN0BQpkYXBwVG9DYWxsBQR1bml0CQACAQI0SU1COiBUaGlzIHNtYXJ0IGNvbnRyYWN0IGNhbid0IG1hbmlwdWxhdGUgdGhlIGJvb3N0IQQDa2V5CQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkBJTUI6IFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggYm9vc3QsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFCG5ld0Jvb3N0BQNuaWwBaQEWbWFuaXB1bGF0ZUJvb3N0QWNjb3VudAIFYm9vc3QHYWRkcmVzcwQQYWxsb3dlZENvbnRyYWN0cwkBE2dldFRydXN0ZWRDb250cmFjdHMABBRhbGxvd2VkQ29udHJhY3RzTGlzdAkAtQkCBRBhbGxvd2VkQ29udHJhY3RzAgE7BApkYXBwVG9DYWxsCQClCAEIBQFpBmNhbGxlcgMJAAACCQDPCAIFFGFsbG93ZWRDb250cmFjdHNMaXN0BQpkYXBwVG9DYWxsBQR1bml0CQACAQI1SU1CQTogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBGGtleV9leHRlcm5hbEJvb3N0QWRkcmVzcwEFB2FkZHJlc3MEC2FjdGl2ZUJvb3N0CQENdHJ5R2V0SW50ZWdlcgEFA2tleQQIbmV3Qm9vc3QJAGQCBQthY3RpdmVCb29zdAUFYm9vc3QDCQBmAgAABQhuZXdCb29zdAkAAgECQUlNQkE6IFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggYm9vc3QsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFCG5ld0Jvb3N0BQNuaWwBaQEUY2hlY2tBcnRlZmFjdERldGFpbHMBB2Fzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAQJYXNzZXROYW1lCQEFdmFsdWUBCAUFYXNzZXQEbmFtZQMDAwkBD2NvbnRhaW5zRWxlbWVudAIFC2FsbEFydGVmYWN0BQlhc3NldE5hbWUGCQEJaXNEZWZpbmVkAQkBF3RyeUdldENvc21ldGljSXRlbVByaWNlAQUJYXNzZXROYW1lCQAAAggFBWFzc2V0Bmlzc3VlcgUEdGhpcwcJAJQKAgUDbmlsBQlhc3NldE5hbWUJAAIBAhBJbnZhbGlkIGFydGVmYWN0AWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MABQZvcmFjbGUFA25pbAFpARpjYWxjdWxhdGVGYXJtaW5nUG93ZXJCb29zdAIGZHVja0lkB2FkZHJlc3MEEWV4dGVybmFsQm9vc3REdWNrCQENdHJ5R2V0SW50ZWdlcgEJARVrZXlfZXh0ZXJuYWxCb29zdER1Y2sBBQZkdWNrSWQEFGV4dGVybmFsQm9vc3RBZGRyZXNzCQENdHJ5R2V0SW50ZWdlcgEJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAp0b3RhbEJvb3N0CQBkAgURZXh0ZXJuYWxCb29zdER1Y2sFFGV4dGVybmFsQm9vc3RBZGRyZXNzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGZHVja0lkAgtfbGFzdF9ib29zdAUKdG90YWxCb29zdAUDbmlsBQp0b3RhbEJvb3N0AWkBDml0ZW1EdXBsaWNhdG9yAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMABAkAAgECHklJRDogRm91ciBwYXltZW50cyBhcmUgbmVlZGVkIQQRZHVwbGljYXRvclBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQLaXRlbVBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwACBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwADBBFkdXBsaWNhdG9yQXNzZXRJZAkA2AQBCQEFdmFsdWUBCAURZHVwbGljYXRvclBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBRFkdXBsaWNhdG9yUGF5bWVudAZhbW91bnQAAQkAAgECI0lJRDogRHVwbGljYXRvciBORlQgaXMgbm90IGF0dGFjaGVkBAtpdGVtQXNzZXRJZAkA2AQBCQEFdmFsdWUBCAULaXRlbVBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQtpdGVtUGF5bWVudAZhbW91bnQAAQkAAgECHUlJRDogSXRlbSBORlQgaXMgbm90IGF0dGFjaGVkBAplZ2dBc3NldElkCQEFdmFsdWUBCAUKZWdnUGF5bWVudAdhc3NldElkAwkBAiE9AgUKZWdnQXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQACQACAQIYSUlEOiBQbGVhc2UgYXR0YWNoIGVnZ3MhAwkAZgIJARBnZXREdXBsaWNhdG9yRmVlAAgFCmVnZ1BheW1lbnQGYW1vdW50CQACAQkArAICAkVJSUQ6IHRvIGR1cGxpY2F0ZSBhbiBpdGVtcyB5b3UgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBlZ2dsZXRzOiAJAKQDAQkBEGdldER1cGxpY2F0b3JGZWUABBJkdXBsaWNhdG9yQXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgURZHVwbGljYXRvckFzc2V0SWQFA25pbAUDbmlsAwkAAAIFEmR1cGxpY2F0b3JBcnRlZmFjdAUSZHVwbGljYXRvckFydGVmYWN0AwkBAiE9AgUSZHVwbGljYXRvckFydGVmYWN0Ag5BUlQtSVRFTV9EVVBMSQkAAgECMUlJRDogWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUlURU1fRFVQTEkgYXJ0ZWZhY3QEDGFydGVmYWN0TmFtZQkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQtpdGVtQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUMYXJ0ZWZhY3ROYW1lBQxhcnRlZmFjdE5hbWUECGFydGVmYWN0CQDDCAcFDGFydGVmYWN0TmFtZQkArAICAiJORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZTogBQxhcnRlZmFjdE5hbWUAAQAABwUEdW5pdAAABAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAM4IAgkAzAgCBQhhcnRlZmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIJYXJ0ZWZhY3RfCQDYBAEFCmFydGVmYWN0SWQCBV90eXBlBQxhcnRlZmFjdE5hbWUJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAURZHVwbGljYXRvclBheW1lbnQHYXNzZXRJZAABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcgABCAULaXRlbVBheW1lbnQHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIAAQUKYXJ0ZWZhY3RJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAIBQplZ2dQYXltZW50BmFtb3VudAgFCmVnZ1BheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJANgEAQUKYXJ0ZWZhY3RJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlmaXhlZEdlbmUDB3R4SWRTdHIPcGFyZW50Rml4ZWRHZW5lEXBvc2l0aW9uRml4ZWRHZW5lAwMJAQIhPQIFD3BhcmVudEZpeGVkR2VuZQABCQECIT0CBQ9wYXJlbnRGaXhlZEdlbmUAAgcJAAIBAihGRzogUGFyZW50IGZpeGVkIGdlbmUgY2FuIGJlIG9ubHkgMSBvciAyBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgtBUlQtRklYR0VORQkAAgECKVlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GSVhHRU5FIGFydGVmYWN0BAR0eElkCQDZBAEFB3R4SWRTdHIED2ZpbmlzaEhlaWdodEtleQkBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEE3Byb2Nlc3NGaW5pc2hIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFnZXRCcmVlZGVyQWRkcmVzcwAFD2ZpbmlzaEhlaWdodEtleQQPZHVja0dlbmVzU3RyaW5nCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgUPcGFyZW50Rml4ZWRHZW5lCQDMCAIFEXBvc2l0aW9uRml4ZWRHZW5lCQDMCAICAAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwUPZHVja0dlbmVzU3RyaW5nBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQDMCAIFB3R4SWRTdHIJAMwIAgUPZHVja0dlbmVzU3RyaW5nBQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwABCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAgUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZyZWVHZW5lAQd0eElkU3RyBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgxBUlQtRlJFRUdFTkUJAAIBAipZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtRlJFRUdFTkUgYXJ0ZWZhY3QEBHR4SWQJANkEAQUHdHhJZFN0cgQPZmluaXNoSGVpZ2h0S2V5CQEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgkBEWdldEJyZWVkZXJBZGRyZXNzAAUPZmluaXNoSGVpZ2h0S2V5BAxzZWxlY3RlZEdlbmUJAQ5nZXRSYW5kb21HZW5lcwIFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQEDnJhbmRvbVBvc2l0aW9uCQEPZ2V0UmFuZG9tTnVtYmVyBAAIBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0AAMED2R1Y2tHZW5lc1N0cmluZwkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAgxnZW5lcmF0ZUR1Y2sJAMwIAgUEdHhJZAkAzAgCBRNwcm9jZXNzRmluaXNoSGVpZ2h0CQDMCAIAAAkAzAgCAAAJAMwIAgUMc2VsZWN0ZWRHZW5lCQDMCAIFDnJhbmRvbVBvc2l0aW9uBQNuaWwFA25pbAMJAAACBQ9kdWNrR2VuZXNTdHJpbmcFD2R1Y2tHZW5lc1N0cmluZwQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhdmaW5pc2hEdWNrSGF0Y2hpbmdJdGVtcwkAzAgCBQd0eElkU3RyCQDMCAIFD2R1Y2tHZW5lc1N0cmluZwUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAIFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhjb3B5RHVjawAEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA1zZWNvbmRQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAIEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUMZmlyc3RBc3NldElkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4DAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDCQECIT0CBQhhcnRlZmFjdAIKQVJULU1JUlJPUgkAAgECKFlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1NSVJST1IgYXJ0ZWZhY3QEB25mdEluZm8JAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAlhc3NldDFHZW4JALUJAggFB25mdEluZm8EbmFtZQIAAwMJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFHBgkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUoJAAIBAhpZb3UgY2FuJ3QgbWlycm9yIHRoaXMgZHVjawQHZHVja0dlbggFB25mdEluZm8EbmFtZQQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZjcmVhdGVEdWNrU3BlY2lhbEdlbmVzCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgUHZHVja0dlbgkAzAgCBQhjaGlsZHJlbgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkAAEFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWFkZEFydGVGYWN0VG9EdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAgQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAMDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABBgkBAiE9AggFDXNlY29uZFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIY2hpbGRyZW4FCGNoaWxkcmVuAwkAAAIFCGNoaWxkcmVuAAAJAAIBAiRZb3UgY2FuIG9ubHkgcGljayBhIHN0ZXJpbGUgTkZULWR1Y2sECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwMJAQIhPQIFCGFydGVmYWN0AghBUlQtWEhBVAkBAiE9AgUIYXJ0ZWZhY3QCCEFSVC1QT01QBwkAAgECMllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1YSEFUIG9yIEFSVC1QT01QIGFydGVmYWN0BAduZnRJbmZvCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQJYXNzZXQxR2VuCQC1CQIIBQduZnRJbmZvBG5hbWUCAAMDCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBRwYJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFKCQACAQIaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sDAwkAAAIJAJEDAgUJYXNzZXQxR2VuAAUCAVMGCQAAAgkAkQMCBQlhc3NldDFHZW4ABQIBVAkAAgECH3lvdSBhbHJlYWR5IGF0dGFjaGVkIGEgYXJ0ZWZhY3QEBGNoYXIDCQAAAgUIYXJ0ZWZhY3QCCEFSVC1YSEFUAgFUAwkAAAIFCGFydGVmYWN0AghBUlQtUE9NUAIBUwkAAgECD05vIGNoYXIgZGVmaW5lZAQKb2xkRHVja0dlbggFB25mdEluZm8EbmFtZQQKb2xkRmFybUdlbgkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQpvbGREdWNrR2VuBQNuaWwFA25pbAMJAAACBQpvbGRGYXJtR2VuBQpvbGRGYXJtR2VuBAdkdWNrR2VuCQEObWFuaXB1bGF0ZU5hbWUDBQpvbGREdWNrR2VuAAYFBGNoYXIEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWY3JlYXRlRHVja1NwZWNpYWxHZW5lcwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFB2R1Y2tHZW4JAMwIAgUIY2hpbGRyZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwECmNhbGxSZWR1Y2UJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMcmVkdWNlUmFyaXR5CQDMCAIFDGZpcnN0QXNzZXRJZAkAzAgCBQpvbGRGYXJtR2VuBQNuaWwFA25pbAMJAAACBQpjYWxsUmVkdWNlBQpjYWxsUmVkdWNlCQDOCAIJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHcHJlSW5pdAAJAMwIAgkBDEludGVnZXJFbnRyeQICHHN0YXRpY19BUlQtTEFLRV9mYXJtaW5nU2xvdHMAyAEJAMwIAgkBDEludGVnZXJFbnRyeQICHHN0YXRpY19BUlQtTEFLRV9mYXJtaW5nQm9vc3QAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nU2xvdHMABAkAzAgCCQEMSW50ZWdlckVudHJ5AgIdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nQm9vc3QAHgkAzAgCCQEMSW50ZWdlckVudHJ5AgIgc3RhdGljX0FSVC1CSUdIT1VTRV9mYXJtaW5nU2xvdHMACgkAzAgCCQEMSW50ZWdlckVudHJ5AgIgc3RhdGljX0FSVC1CSUdIT1VTRV9mYXJtaW5nQm9vc3QADwUDbmlsAWkBDWlzc3VlQXJ0ZWZhY3QCBHR5cGUIcmVjZWl2ZXIDAwMDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJARFnZXRSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIJARRnZXRIdW50RGlzdHJvQWRkcmVzcwAHCQECIT0CCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQtnZXRXYXJzUEtleQAHCQACAQIKYWRtaW4gb25seQMDAwMJAAACCAUBaQZjYWxsZXIJARRnZXRIdW50RGlzdHJvQWRkcmVzcwAGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQELZ2V0V2Fyc1BLZXkACQEBIQEJAQhjb250YWlucwIFBHR5cGUCCUFSVC1GSVJFXwcJAQEhAQkBDXRyeUdldEJvb2xlYW4BCQCsAgIFBHR5cGUCBl9pc3N1ZQcJAAIBAh1GSVJFIEFORCBXSElURUxJU1QgSVRFTSBPTkxZIQQHYWRkcmVzcwkBB0FkZHJlc3MBCQDZBAEFCHJlY2VpdmVyCQEJaXNzdWVJdGVtAwUEdHlwZQAABQdhZGRyZXNzAWkBEmlzc3VlQXJ0ZWZhY3RJbmRleAMEdHlwZQhyZWNlaXZlcgVub25jZQMDAwMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldFJlYmlydGhBZGRyZXNzAAcJAQIhPQIIBQFpBmNhbGxlcgkBF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAcJAQIhPQIIBQFpBmNhbGxlcgkBFGdldEh1bnREaXN0cm9BZGRyZXNzAAcJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQkBC2dldFdhcnNQS2V5AAcJAAIBAgphZG1pbiBvbmx5AwMDAwkAAAIIBQFpBmNhbGxlcgkBFGdldEh1bnREaXN0cm9BZGRyZXNzAAYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQtnZXRXYXJzUEtleQAJAQEhAQkBCGNvbnRhaW5zAgUEdHlwZQIJQVJULUZJUkVfBwkBASEBCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgUEdHlwZQIGX2lzc3VlBwkAAgECHUZJUkUgQU5EIFdISVRFTElTVCBJVEVNIE9OTFkhBAdhZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUIcmVjZWl2ZXIEC2lzc3VlUmVzdWx0CQEJaXNzdWVJdGVtAwUEdHlwZQUFbm9uY2UFB2FkZHJlc3MFC2lzc3VlUmVzdWx0AWkBB3NldExvY2sBAW4DCQAAAggFAWkGY2FsbGVyBQR0aGlzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1nbG9iYWxfbG9ja2VkBQFuBQNuaWwJAAIBAgphZG1pbiBvbmx5AWkBDmFkZEl0ZW1Ub1N0b3JlCAVwcmljZQRpdGVtCG1heFNhbGVzBHNhbGUJcHJpY2Vzc2V0EGdyb3d0aFBlcmNlbnRhZ2UHc3RhcnRUcwVlbmRUcwMJAQIhPQIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARZzdGF0aWNLZXlfcGlwZWxpbmVVc2VyAAkAAgECHklBSVRTOiBPbmx5IGZvciB0cnVzdGVkIHVzZXJzIQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlfbWF4U2FsZXNDb3NtZXRpYwEFBGl0ZW0FCG1heFNhbGVzCQDMCAIJAQxCb29sZWFuRW50cnkCCQEQa2V5X3NhbGVDb3NtZXRpYwEFBGl0ZW0FBHNhbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQRpdGVtBQlwcmljZXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlfZ3Jvd1BlcmNlbnRhZ2VDb3NtZXRpYwEFBGl0ZW0FEGdyb3d0aFBlcmNlbnRhZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlfc3RhcnRUc0Nvc21ldGljAQUEaXRlbQUHc3RhcnRUcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleV9lbmRUc0Nvc21ldGljAQUEaXRlbQUFZW5kVHMFA25pbAFpARJzZXRHbG9iYWxBcnRBbW91bnQBCW5ld0Ftb3VudAMDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkAAAIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBBQpkZXZBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBnbG9iYWxfYXJ0QW1vdW50BQluZXdBbW91bnQFA25pbAkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASDBbN+O7dONc4+Lovn6iQ/0dc1EG1RyUqO0nNJWpC3gdQQJdGhpcmRVc2VyASDnW/SOqtL5SZ5uhCa4+X4f3GeofdwruNTqe83yaArBJQQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAkmJ/zk=", "height": 4077837, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AGGjhw8yFmLJUCPuWkfm3DeECG8WZWhke9VHwsP4TtTM Next: none Diff:
OldNewDifferences
252252 func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
253253 then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
254254 else {
255- func isBaseItem (accumulated,pay) = if ((pay.assetId == unit))
255+ func isBaseItem (accumulated,pay) = if (if ((pay.assetId == unit))
256+ then true
257+ else (pay.assetId == getEggAssetId()))
256258 then $Tuple2(accumulated._1, (accumulated._2 + 0))
257259 else {
258260 let assetId = value(pay.assetId)
292294 let instant = if (instantFinish)
293295 then issueItem(endItem, 0, recipient)
294296 else $Tuple2(nil, "")
295- $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), !(instantFinish))] ++ instant._1) ++ totalBaseItem._1), instant._2)
297+ $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), instantFinish)] ++ instant._1) ++ totalBaseItem._1), instant._2)
296298 }
297299 }
298300 }
637639
638640
639641 @Callable(i)
640-func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
641- let firstPayment = value(i.payments[0])
642- let validPayment = checkAdditionalPayment(i.payments[1])
643- let firstAssetId = toBase58String(value(firstPayment.assetId))
644- if ((firstPayment.amount != 1))
645- then throw("NFT is not attached")
646- else {
647- let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
648- if ((artefact == artefact))
649- then if ((artefact != "ART-FIXGENE"))
650- then throw("You need to attach a ART-FIXGENE artefact")
651- else {
652- let txId = fromBase58String(txIdStr)
653- let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
654- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
655- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
656- if ((duckGenesString == duckGenesString))
657- then {
658- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
659- if ((call == call))
660- then [Burn(value(firstPayment.assetId), 1)]
661- else throw("Strict value is not equal to itself.")
662- }
663- else throw("Strict value is not equal to itself.")
664- }
665- else throw("Strict value is not equal to itself.")
666- }
667- }
642+func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = if (if ((parentFixedGene != 1))
643+ then (parentFixedGene != 2)
644+ else false)
645+ then throw("FG: Parent fixed gene can be only 1 or 2")
646+ else {
647+ let firstPayment = value(i.payments[0])
648+ let validPayment = checkAdditionalPayment(i.payments[1])
649+ let firstAssetId = toBase58String(value(firstPayment.assetId))
650+ if ((firstPayment.amount != 1))
651+ then throw("NFT is not attached")
652+ else {
653+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
654+ if ((artefact == artefact))
655+ then if ((artefact != "ART-FIXGENE"))
656+ then throw("You need to attach a ART-FIXGENE artefact")
657+ else {
658+ let txId = fromBase58String(txIdStr)
659+ let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
660+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
661+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
662+ if ((duckGenesString == duckGenesString))
663+ then {
664+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
665+ if ((call == call))
666+ then [Burn(value(firstPayment.assetId), 1)]
667+ else throw("Strict value is not equal to itself.")
668+ }
669+ else throw("Strict value is not equal to itself.")
670+ }
671+ else throw("Strict value is not equal to itself.")
672+ }
673+ }
668674
669675
670676
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func staticKey_oracleAddress () = "static_oracleAddress"
55
66
77 func staticKey_breederAddress () = "static_breederAddress"
88
99
1010 func staticKey_eggAssetId () = "static_eggAssetId"
1111
1212
1313 func staticKey_trustedContracts () = "static_trustedContracts"
1414
1515
1616 func staticKey_rebirthAddress () = "static_rebirthAddress"
1717
1818
1919 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
2020
2121
2222 func staticKey_pipelineUser () = "static_pipelineUser"
2323
2424
2525 func staticKey_extraFee () = "static_extraFee"
2626
2727
2828 func staticKey_feeAggregator () = "static_feeAggregator"
2929
3030
3131 func staticKey_huntDistroAddress () = "static_huntDistroAddress"
3232
3333
3434 func staticKey_warsPKey () = "static_warsPKey"
3535
3636
3737 func staticKey_duplicatorFee () = "static_duplicatorFee"
3838
3939
4040 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
4141
4242
4343 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
4444
4545
4646 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
4747
4848
4949 func key_externalBoostAddress (address) = (address + "_user_external_boost")
5050
5151
5252 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
5353
5454
5555 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
5656
5757
5858 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
5959
6060
6161 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
6262
6363
6464 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
6565
6666
6767 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
6868
6969
7070 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
7171
7272
7373 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
7474
7575
7676 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
7777
7878
7979 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
8080
8181
8282 func staticKey_couponsAddress () = "static_couponsAddress"
8383
8484
8585 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
8686
8787 let eggsNeeded = (3 * 100000000)
8888
8989 let artefactsLimit = (301 + 600)
9090
9191 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
9292
9393 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
9494
9595 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9696
9797 let allArtefact = (artefacts ++ oldArtefacts)
9898
9999 let boosters = ["ART-TINSEL", "ART-FEED10", "ART-GNGR_BREAD", "ART-SNOWBALL", "ART-GIFT_DOUBL"]
100100
101101 func tryGetBoolean (key) = match getBoolean(this, key) {
102102 case b: Boolean =>
103103 b
104104 case _ =>
105105 false
106106 }
107107
108108
109109 func tryGetString (key) = match getString(this, key) {
110110 case a: String =>
111111 a
112112 case _ =>
113113 ""
114114 }
115115
116116
117117 func tryGetInteger (key) = match getInteger(this, key) {
118118 case a: Int =>
119119 a
120120 case _ =>
121121 0
122122 }
123123
124124
125125 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
126126 case b: Int =>
127127 b
128128 case _ =>
129129 0
130130 }
131131
132132
133133 func getRandomNumber (variants,txId,finishHeight,offset) = {
134134 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
135135 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
136136 (toInt(randomHash, offset) % variants)
137137 }
138138
139139
140140 func getRandomArtefact (boxId,h) = {
141141 let randomNumber = getRandomNumber(size(artefacts), boxId, h, 1)
142142 artefacts[randomNumber]
143143 }
144144
145145
146146 func getRandomGenes (txId,h) = {
147147 let randomNumber = getRandomNumber(size(freeGenes), txId, h, 2)
148148 freeGenes[randomNumber]
149149 }
150150
151151
152152 func tryGetStringExternal (address,key) = match getString(address, key) {
153153 case a: String =>
154154 a
155155 case _ =>
156156 ""
157157 }
158158
159159
160160 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
161161
162162
163163 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
164164
165165
166166 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
167167
168168
169169 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
170170
171171
172172 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
173173
174174
175175 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
176176
177177
178178 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
179179
180180
181181 func getHuntDistroAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntDistroAddress())))
182182
183183
184184 func getWarsPKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_warsPKey()))
185185
186186
187187 func getDuplicatorFee () = tryGetIntegerExternal(getOracle(), staticKey_duplicatorFee())
188188
189189
190190 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
191191
192192
193193 func tryGetCosmeticItemPrice (item) = {
194194 let key = key_priceCosmetic(item)
195195 match getInteger(this, key) {
196196 case a: Int =>
197197 a
198198 case _ =>
199199 throw((("ITGCIP: " + item) + " is not available in the store!"))
200200 }
201201 }
202202
203203
204204 func asString (value) = match value {
205205 case string: String =>
206206 string
207207 case _ =>
208208 throw("wrong type, expected: String")
209209 }
210210
211211
212212 func asInt (value) = match value {
213213 case int: Int =>
214214 int
215215 case _ =>
216216 throw("wrong type, expected: Int")
217217 }
218218
219219
220220 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
221221
222222
223223 func itemIsInCoolDown (artefactName,artefactId) = {
224224 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
225225 let cooldownPeriod = 240
226226 if ((height > (unstakeHeightLast + cooldownPeriod)))
227227 then false
228228 else true
229229 }
230230
231231
232232 func isTestEnv () = tryGetBoolean("TESTENV")
233233
234234
235235 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
236236 then throw("WCAP: Please attach waves")
237237 else {
238238 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
239239 if ((payment.amount != feeAmount))
240240 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
241241 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
242242 }
243243
244244
245245 func issueItem (type,nonce,address) = {
246246 let artefact = Issue(type, "NFT artefact of Waves Ducks game.", 1, 0, false, unit, nonce)
247247 let artefactId = calculateAssetId(artefact)
248248 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
249249 }
250250
251251
252252 func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
253253 then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
254254 else {
255- func isBaseItem (accumulated,pay) = if ((pay.assetId == unit))
255+ func isBaseItem (accumulated,pay) = if (if ((pay.assetId == unit))
256+ then true
257+ else (pay.assetId == getEggAssetId()))
256258 then $Tuple2(accumulated._1, (accumulated._2 + 0))
257259 else {
258260 let assetId = value(pay.assetId)
259261 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
260262 if ((artefact == artefact))
261263 then if ((artefact == baseItem))
262264 then $Tuple2((accumulated._1 ++ [Burn(assetId, 1)]), (accumulated._2 + 1))
263265 else $Tuple2(accumulated._1, (accumulated._2 + 0))
264266 else throw("Strict value is not equal to itself.")
265267 }
266268
267269 let totalBaseItem = {
268270 let $l = payments
269271 let $s = size($l)
270272 let $acc0 = $Tuple2(nil, 0)
271273 func $f0_1 ($a,$i) = if (($i >= $s))
272274 then $a
273275 else isBaseItem($a, $l[$i])
274276
275277 func $f0_2 ($a,$i) = if (($i >= $s))
276278 then $a
277279 else throw("List size exceeds 10")
278280
279281 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
280282 }
281283 if ((totalBaseItem._2 != amountBaseItem))
282284 then throw(((("IID: Please attach " + toString(amountBaseItem)) + " artefacts of type ") + baseItem))
283285 else {
284286 let feePayment = payments[amountBaseItem]
285287 if ((feePayment.assetId != feeAssetId))
286288 then throw("IID: You miss a payment with the fee!")
287289 else if ((feePayment.amount != feeAmount))
288290 then throw("IID: You did not attach the correct fee amount!")
289291 else {
290292 let artefact = Issue(endItem, ("NFT artefact of Waves Ducks game: " + endItem), 1, 0, false, unit, 0)
291293 let artefactId = calculateAssetId(artefact)
292294 let instant = if (instantFinish)
293295 then issueItem(endItem, 0, recipient)
294296 else $Tuple2(nil, "")
295- $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), !(instantFinish))] ++ instant._1) ++ totalBaseItem._1), instant._2)
297+ $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), instantFinish)] ++ instant._1) ++ totalBaseItem._1), instant._2)
296298 }
297299 }
298300 }
299301
300302
301303 func getAmountBaseItem (baseItem) = getIntegerValue((("merge_" + baseItem) + "_amount"))
302304
303305
304306 func getEndItem (baseItem) = getStringValue((("merge_" + baseItem) + "_endItem"))
305307
306308
307309 func getPrice (baseItem) = getIntegerValue((("merge_" + baseItem) + "_price"))
308310
309311
310312 func getInstant (baseItem) = getBooleanValue((("merge_" + baseItem) + "_instant"))
311313
312314
313315 func getAsset (baseItem) = {
314316 let asset = getStringValue((("merge_" + baseItem) + "_asset"))
315317 if ((asset == "WAVES"))
316318 then unit
317319 else fromBase58String(asset)
318320 }
319321
320322
321323 func userExperience (user) = (user + "_experience")
322324
323325
324326 func finishShakeItBabyInternal (initTx,address,payment) = {
325327 let expUser = tryGetIntegerExternal(getCouponsAddress(), userExperience(address))
326328 let multiplier = min([((expUser / 100) + 1), 6])
327329 let finish = getIntegerValue((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
328330 if ((finish > height))
329331 then throw("Please wait till the shaking is finished!")
330332 else if ((tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status")) != "open"))
331333 then throw("FSI: Only open status can be finished!")
332334 else {
333335 func handleMint (acc,index) = if ((multiplier >= index))
334336 then {
335337 let randomPosition = getRandomNumber(size(boosters), fromBase58String(initTx), finish, index)
336338 let win = boosters[randomPosition]
337339 ((acc ++ issueItem(win, (index - 1), addressFromStringValue(address))._1) ++ [StringEntry(((((("address_" + address) + "_initTx_") + initTx) + "_win") + toString((index - 1))), win)])
338340 }
339341 else acc
340342
341343 ({
342344 let $l = [1, 2, 3, 4, 5, 6]
343345 let $s = size($l)
344346 let $acc0 = nil
345347 func $f0_1 ($a,$i) = if (($i >= $s))
346348 then $a
347349 else handleMint($a, $l[$i])
348350
349351 func $f0_2 ($a,$i) = if (($i >= $s))
350352 then $a
351353 else throw("List size exceeds 6")
352354
353355 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
354356 } ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")])
355357 }
356358 }
357359
358360
359361 @Callable(i)
360362 func startShakeItBaby () = {
361363 let itemPayment = value(i.payments[0])
362364 let validPayment = checkAdditionalPayment(i.payments[1])
363365 let itemAssetId = toBase58String(value(itemPayment.assetId))
364366 if ((itemPayment.amount != 1))
365367 then throw("IID: Item NFT is not attached")
366368 else {
367369 let globeArtefact = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
368370 if ((globeArtefact == globeArtefact))
369371 then if ((globeArtefact != "ART-SNW_GLBES"))
370372 then throw("IID: You need to attach a ART-SNW_GLBES artefact")
371373 else {
372374 let address = toString(i.caller)
373375 let initTx = toBase58String(i.transactionId)
374376 [Burn(value(itemPayment.assetId), 1), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + 2)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), itemAssetId)]
375377 }
376378 else throw("Strict value is not equal to itself.")
377379 }
378380 }
379381
380382
381383
382384 @Callable(i)
383385 func finishShakeItBaby (initTx) = finishShakeItBabyInternal(initTx, toString(i.caller), i.payments[0])
384386
385387
386388
387389 @Callable(i)
388390 func instanMergeItem (baseItem) = if ((tryGetString((("merge_" + baseItem) + "_endItem")) == ""))
389391 then throw("IID: Only certain items can be merged!")
390392 else {
391393 let params = $Tuple5(getAmountBaseItem(baseItem), getEndItem(baseItem), getPrice(baseItem), getAsset(baseItem), getInstant(baseItem))
392394 let grantExp = invoke(getCouponsAddress(), "increaseExp", [toString(i.caller)], nil)
393395 if ((grantExp == grantExp))
394396 then itemMerger(baseItem, params._1, params._2, i.payments, params._3, params._4, i.caller, params._5, toBase58String(i.transactionId))
395397 else throw("Strict value is not equal to itself.")
396398 }
397399
398400
399401
400402 @Callable(i)
401403 func directBuyItemMultiple (itemName,itemAmount) = {
402404 let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
403405 let basePrice = tryGetCosmeticItemPrice(itemName)
404406 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
405407 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
406408 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
407409 if (if ((startTs != 0))
408410 then (startTs > lastBlock.timestamp)
409411 else false)
410412 then throw("IDBI: The sale did not start yet!")
411413 else if (if ((endTs != 0))
412414 then (lastBlock.timestamp > endTs)
413415 else false)
414416 then throw("IDBI: The sale has already finished!")
415417 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
416418 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
417419 else {
418420 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
419421 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
420422 if ((itemAmount > size(array)))
421423 then throw(("IDBI: Max amount to issue is " + toString(size(array))))
422424 else {
423425 let price = if ((grow == 0))
424426 then (basePrice * itemAmount)
425427 else throw("IDBI: Items that grow in price can not be bought in batch!")
426428 if (if ((maxSalesValue != 0))
427429 then (soldValue >= maxSalesValue)
428430 else false)
429431 then throw("IDBI: Max editions sold!")
430432 else {
431433 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
432434 then getEggAssetId()
433435 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
434436 then unit
435437 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
436438 let validPayment = checkAdditionalPayment(i.payments[0])
437439 let firstPayment = value(i.payments[1])
438440 let amount = firstPayment.amount
439441 if ((firstPayment.assetId != assetId))
440442 then throw("IDBI: You can attach only tokens with the correct payment ")
441443 else if ((amount != price))
442444 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
443445 else {
444446 let txIdStr = toBase58String(i.transactionId)
445447 let address = i.originCaller
446448 func handleMint (acc,index) = if ((itemAmount > index))
447449 then (acc ++ issueItem(itemName, index, address)._1)
448450 else acc
449451
450452 let issues = {
451453 let $l = array
452454 let $s = size($l)
453455 let $acc0 = nil
454456 func $f0_1 ($a,$i) = if (($i >= $s))
455457 then $a
456458 else handleMint($a, $l[$i])
457459
458460 func $f0_2 ($a,$i) = if (($i >= $s))
459461 then $a
460462 else throw("List size exceeds 30")
461463
462464 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
463465 }
464466 (([IntegerEntry(key_lastPriceCosmetic(itemName), basePrice), IntegerEntry(key_soldCosmetic(itemName), (soldValue + itemAmount)), ScriptTransfer(getFeeAggregator(), amount, assetId)] ++ validPayment) ++ issues)
465467 }
466468 }
467469 }
468470 }
469471 }
470472
471473
472474
473475 @Callable(i)
474476 func directBuyItem (itemName) = {
475477 let basePrice = tryGetCosmeticItemPrice(itemName)
476478 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
477479 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
478480 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
479481 if (if ((startTs != 0))
480482 then (startTs > lastBlock.timestamp)
481483 else false)
482484 then throw("IDBI: The sale did not start yet!")
483485 else if (if ((endTs != 0))
484486 then (lastBlock.timestamp > endTs)
485487 else false)
486488 then throw("IDBI: The sale has already finished!")
487489 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
488490 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
489491 else {
490492 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
491493 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
492494 let price = if ((grow == 0))
493495 then basePrice
494496 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
495497 if (if ((maxSalesValue != 0))
496498 then (soldValue >= maxSalesValue)
497499 else false)
498500 then throw("IDBI: Max editions sold!")
499501 else {
500502 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
501503 then getEggAssetId()
502504 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
503505 then unit
504506 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
505507 let validPayment = checkAdditionalPayment(i.payments[0])
506508 let firstPayment = value(i.payments[1])
507509 let amount = firstPayment.amount
508510 if ((firstPayment.assetId != assetId))
509511 then throw("IDBI: You can attach only tokens with the correct payment ")
510512 else if ((amount != price))
511513 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
512514 else {
513515 let txIdStr = toBase58String(i.transactionId)
514516 let address = i.originCaller
515517 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
516518 let artefactId = calculateAssetId(artefact)
517519 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), itemName), IntegerEntry(key_lastPriceCosmetic(itemName), price), IntegerEntry(key_soldCosmetic(itemName), (soldValue + 1)), ScriptTransfer(address, 1, artefactId), ScriptTransfer(getFeeAggregator(), amount, assetId)] ++ validPayment), toBase58String(artefactId))
518520 }
519521 }
520522 }
521523 }
522524
523525
524526
525527 @Callable(i)
526528 func manipulateBoost (boost,duckId) = {
527529 let allowedContracts = getTrustedContracts()
528530 let allowedContractsList = split(allowedContracts, ";")
529531 let dappToCall = toString(i.caller)
530532 if ((indexOf(allowedContractsList, dappToCall) == unit))
531533 then throw("IMB: This smart contract can't manipulate the boost!")
532534 else {
533535 let key = key_externalBoostDuck(duckId)
534536 let activeBoost = tryGetInteger(key)
535537 let newBoost = (activeBoost + boost)
536538 if ((0 > newBoost))
537539 then throw("IMB: Something went wrong with boost, please contact the admins!")
538540 else [IntegerEntry(key, newBoost)]
539541 }
540542 }
541543
542544
543545
544546 @Callable(i)
545547 func manipulateBoostAccount (boost,address) = {
546548 let allowedContracts = getTrustedContracts()
547549 let allowedContractsList = split(allowedContracts, ";")
548550 let dappToCall = toString(i.caller)
549551 if ((indexOf(allowedContractsList, dappToCall) == unit))
550552 then throw("IMBA: This smart contract can't manipulate the boost!")
551553 else {
552554 let key = key_externalBoostAddress(address)
553555 let activeBoost = tryGetInteger(key)
554556 let newBoost = (activeBoost + boost)
555557 if ((0 > newBoost))
556558 then throw("IMBA: Something went wrong with boost, please contact the admins!")
557559 else [IntegerEntry(key, newBoost)]
558560 }
559561 }
560562
561563
562564
563565 @Callable(i)
564566 func checkArtefactDetails (assetId) = {
565567 let asset = value(assetInfo(fromBase58String(assetId)))
566568 let assetName = value(asset.name)
567569 if (if (if (containsElement(allArtefact, assetName))
568570 then true
569571 else isDefined(tryGetCosmeticItemPrice(assetName)))
570572 then (asset.issuer == this)
571573 else false)
572574 then $Tuple2(nil, assetName)
573575 else throw("Invalid artefact")
574576 }
575577
576578
577579
578580 @Callable(i)
579581 func configureOracle (oracle) = if ((i.caller != this))
580582 then throw("admin only")
581583 else [StringEntry(staticKey_oracleAddress(), oracle)]
582584
583585
584586
585587 @Callable(i)
586588 func calculateFarmingPowerBoost (duckId,address) = {
587589 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
588590 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
589591 let totalBoost = (externalBoostDuck + externalBoostAddress)
590592 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
591593 }
592594
593595
594596
595597 @Callable(i)
596598 func itemDuplicator () = if ((size(i.payments) != 4))
597599 then throw("IID: Four payments are needed!")
598600 else {
599601 let duplicatorPayment = value(i.payments[0])
600602 let itemPayment = value(i.payments[1])
601603 let eggPayment = value(i.payments[2])
602604 let validPayment = checkAdditionalPayment(i.payments[3])
603605 let duplicatorAssetId = toBase58String(value(duplicatorPayment.assetId))
604606 if ((duplicatorPayment.amount != 1))
605607 then throw("IID: Duplicator NFT is not attached")
606608 else {
607609 let itemAssetId = toBase58String(value(itemPayment.assetId))
608610 if ((itemPayment.amount != 1))
609611 then throw("IID: Item NFT is not attached")
610612 else {
611613 let eggAssetId = value(eggPayment.assetId)
612614 if ((eggAssetId != getEggAssetId()))
613615 then throw("IID: Please attach eggs!")
614616 else if ((getDuplicatorFee() > eggPayment.amount))
615617 then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(getDuplicatorFee())))
616618 else {
617619 let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
618620 if ((duplicatorArtefact == duplicatorArtefact))
619621 then if ((duplicatorArtefact != "ART-ITEM_DUPLI"))
620622 then throw("IID: You need to attach a ART-ITEM_DUPLI artefact")
621623 else {
622624 let artefactName = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
623625 if ((artefactName == artefactName))
624626 then {
625627 let artefact = Issue(artefactName, ("NFT artefact of Waves Ducks game: " + artefactName), 1, 0, false, unit, 0)
626628 let artefactId = calculateAssetId(artefact)
627629 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), artefactName), Burn(value(duplicatorPayment.assetId), 1), ScriptTransfer(i.originCaller, 1, itemPayment.assetId), ScriptTransfer(i.originCaller, 1, artefactId), ScriptTransfer(getFeeAggregator(), eggPayment.amount, eggPayment.assetId)] ++ validPayment), toBase58String(artefactId))
628630 }
629631 else throw("Strict value is not equal to itself.")
630632 }
631633 else throw("Strict value is not equal to itself.")
632634 }
633635 }
634636 }
635637 }
636638
637639
638640
639641 @Callable(i)
640-func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
641- let firstPayment = value(i.payments[0])
642- let validPayment = checkAdditionalPayment(i.payments[1])
643- let firstAssetId = toBase58String(value(firstPayment.assetId))
644- if ((firstPayment.amount != 1))
645- then throw("NFT is not attached")
646- else {
647- let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
648- if ((artefact == artefact))
649- then if ((artefact != "ART-FIXGENE"))
650- then throw("You need to attach a ART-FIXGENE artefact")
651- else {
652- let txId = fromBase58String(txIdStr)
653- let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
654- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
655- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
656- if ((duckGenesString == duckGenesString))
657- then {
658- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
659- if ((call == call))
660- then [Burn(value(firstPayment.assetId), 1)]
661- else throw("Strict value is not equal to itself.")
662- }
663- else throw("Strict value is not equal to itself.")
664- }
665- else throw("Strict value is not equal to itself.")
666- }
667- }
642+func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = if (if ((parentFixedGene != 1))
643+ then (parentFixedGene != 2)
644+ else false)
645+ then throw("FG: Parent fixed gene can be only 1 or 2")
646+ else {
647+ let firstPayment = value(i.payments[0])
648+ let validPayment = checkAdditionalPayment(i.payments[1])
649+ let firstAssetId = toBase58String(value(firstPayment.assetId))
650+ if ((firstPayment.amount != 1))
651+ then throw("NFT is not attached")
652+ else {
653+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
654+ if ((artefact == artefact))
655+ then if ((artefact != "ART-FIXGENE"))
656+ then throw("You need to attach a ART-FIXGENE artefact")
657+ else {
658+ let txId = fromBase58String(txIdStr)
659+ let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
660+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
661+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
662+ if ((duckGenesString == duckGenesString))
663+ then {
664+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
665+ if ((call == call))
666+ then [Burn(value(firstPayment.assetId), 1)]
667+ else throw("Strict value is not equal to itself.")
668+ }
669+ else throw("Strict value is not equal to itself.")
670+ }
671+ else throw("Strict value is not equal to itself.")
672+ }
673+ }
668674
669675
670676
671677 @Callable(i)
672678 func freeGene (txIdStr) = {
673679 let firstPayment = value(i.payments[0])
674680 let firstAssetId = toBase58String(value(firstPayment.assetId))
675681 if ((firstPayment.amount != 1))
676682 then throw("NFT is not attached")
677683 else {
678684 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
679685 if ((artefact == artefact))
680686 then if ((artefact != "ART-FREEGENE"))
681687 then throw("You need to attach a ART-FREEGENE artefact")
682688 else {
683689 let txId = fromBase58String(txIdStr)
684690 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
685691 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
686692 let selectedGene = getRandomGenes(txId, processFinishHeight)
687693 let randomPosition = getRandomNumber(8, txId, processFinishHeight, 3)
688694 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
689695 if ((duckGenesString == duckGenesString))
690696 then {
691697 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
692698 if ((call == call))
693699 then [Burn(value(firstPayment.assetId), 1)]
694700 else throw("Strict value is not equal to itself.")
695701 }
696702 else throw("Strict value is not equal to itself.")
697703 }
698704 else throw("Strict value is not equal to itself.")
699705 }
700706 }
701707
702708
703709
704710 @Callable(i)
705711 func copyDuck () = {
706712 let firstPayment = value(i.payments[0])
707713 let secondPayment = value(i.payments[1])
708714 let validPayment = checkAdditionalPayment(i.payments[2])
709715 let firstAssetId = toBase58String(value(firstPayment.assetId))
710716 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
711717 if ((children == children))
712718 then if (if ((firstPayment.amount != 1))
713719 then true
714720 else (secondPayment.amount != 1))
715721 then throw("NFT is not attached")
716722 else {
717723 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
718724 if ((artefact == artefact))
719725 then if ((artefact != "ART-MIRROR"))
720726 then throw("You need to attach a ART-MIRROR artefact")
721727 else {
722728 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
723729 let asset1Gen = split(nftInfo.name, "")
724730 if (if ((asset1Gen[14] == "G"))
725731 then true
726732 else (asset1Gen[14] == "J"))
727733 then throw("You can't mirror this duck")
728734 else {
729735 let duckGen = nftInfo.name
730736 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
731737 if ((call == call))
732738 then ([ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
733739 else throw("Strict value is not equal to itself.")
734740 }
735741 }
736742 else throw("Strict value is not equal to itself.")
737743 }
738744 else throw("Strict value is not equal to itself.")
739745 }
740746
741747
742748
743749 @Callable(i)
744750 func addArteFactToDuck () = {
745751 let firstPayment = value(i.payments[0])
746752 let secondPayment = value(i.payments[1])
747753 let validPayment = checkAdditionalPayment(i.payments[2])
748754 let firstAssetId = toBase58String(value(firstPayment.assetId))
749755 if (if ((firstPayment.amount != 1))
750756 then true
751757 else (secondPayment.amount != 1))
752758 then throw("NFT is not attached")
753759 else {
754760 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
755761 if ((children == children))
756762 then if ((children == 0))
757763 then throw("You can only pick a sterile NFT-duck")
758764 else {
759765 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
760766 if ((artefact == artefact))
761767 then if (if ((artefact != "ART-XHAT"))
762768 then (artefact != "ART-POMP")
763769 else false)
764770 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
765771 else {
766772 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
767773 let asset1Gen = split(nftInfo.name, "")
768774 if (if ((asset1Gen[14] == "G"))
769775 then true
770776 else (asset1Gen[14] == "J"))
771777 then throw("You can't mirror this duck")
772778 else if (if ((asset1Gen[5] == "S"))
773779 then true
774780 else (asset1Gen[5] == "T"))
775781 then throw("you already attached a artefact")
776782 else {
777783 let char = if ((artefact == "ART-XHAT"))
778784 then "T"
779785 else if ((artefact == "ART-POMP"))
780786 then "S"
781787 else throw("No char defined")
782788 let oldDuckGen = nftInfo.name
783789 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
784790 if ((oldFarmGen == oldFarmGen))
785791 then {
786792 let duckGen = manipulateName(oldDuckGen, 6, char)
787793 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
788794 if ((call == call))
789795 then {
790796 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
791797 if ((callReduce == callReduce))
792798 then ([Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
793799 else throw("Strict value is not equal to itself.")
794800 }
795801 else throw("Strict value is not equal to itself.")
796802 }
797803 else throw("Strict value is not equal to itself.")
798804 }
799805 }
800806 else throw("Strict value is not equal to itself.")
801807 }
802808 else throw("Strict value is not equal to itself.")
803809 }
804810 }
805811
806812
807813
808814 @Callable(i)
809815 func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
810816
811817
812818
813819 @Callable(i)
814820 func issueArtefact (type,receiver) = if (if (if (if (if ((i.caller != this))
815821 then (i.caller != getRebirthAddress())
816822 else false)
817823 then (i.caller != getTurtleRebirthAddress())
818824 else false)
819825 then (i.caller != getHuntDistroAddress())
820826 else false)
821827 then (i.callerPublicKey != getWarsPKey())
822828 else false)
823829 then throw("admin only")
824830 else if (if (if (if ((i.caller == getHuntDistroAddress()))
825831 then true
826832 else (i.callerPublicKey == getWarsPKey()))
827833 then !(contains(type, "ART-FIRE_"))
828834 else false)
829835 then !(tryGetBoolean((type + "_issue")))
830836 else false)
831837 then throw("FIRE AND WHITELIST ITEM ONLY!")
832838 else {
833839 let address = Address(fromBase58String(receiver))
834840 issueItem(type, 0, address)
835841 }
836842
837843
838844
839845 @Callable(i)
840846 func issueArtefactIndex (type,receiver,nonce) = if (if (if (if (if ((i.caller != this))
841847 then (i.caller != getRebirthAddress())
842848 else false)
843849 then (i.caller != getTurtleRebirthAddress())
844850 else false)
845851 then (i.caller != getHuntDistroAddress())
846852 else false)
847853 then (i.callerPublicKey != getWarsPKey())
848854 else false)
849855 then throw("admin only")
850856 else if (if (if (if ((i.caller == getHuntDistroAddress()))
851857 then true
852858 else (i.callerPublicKey == getWarsPKey()))
853859 then !(contains(type, "ART-FIRE_"))
854860 else false)
855861 then !(tryGetBoolean((type + "_issue")))
856862 else false)
857863 then throw("FIRE AND WHITELIST ITEM ONLY!")
858864 else {
859865 let address = Address(fromBase58String(receiver))
860866 let issueResult = issueItem(type, nonce, address)
861867 issueResult
862868 }
863869
864870
865871
866872 @Callable(i)
867873 func setLock (n) = if ((i.caller == this))
868874 then [IntegerEntry("global_locked", n)]
869875 else throw("admin only")
870876
871877
872878
873879 @Callable(i)
874880 func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
875881 then throw("IAITS: Only for trusted users!")
876882 else [IntegerEntry(key_priceCosmetic(item), price), IntegerEntry(key_maxSalesCosmetic(item), maxSales), BooleanEntry(key_saleCosmetic(item), sale), StringEntry(key_priceAssetCosmetic(item), pricesset), IntegerEntry(key_growPercentageCosmetic(item), growthPercentage), IntegerEntry(key_startTsCosmetic(item), startTs), IntegerEntry(key_endTsCosmetic(item), endTs)]
877883
878884
879885
880886 @Callable(i)
881887 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
882888 then true
883889 else (i.caller == Address(devAddress)))
884890 then [IntegerEntry("global_artAmount", newAmount)]
885891 else throw("Permission denied")
886892
887893
888894 @Verifier(tx)
889895 func verify () = if (isTestEnv())
890896 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
891897 else {
892898 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
893899 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
894900 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
895901 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
896902 then 1
897903 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
898904 then 1
899905 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
900906 then 1
901907 else 0
902908 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
903909 then 1
904910 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
905911 then 1
906912 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
907913 then 1
908914 else 0
909915 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
910916 then 1
911917 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
912918 then 1
913919 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
914920 then 1
915921 else 0
916922 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
917923 match tx {
918924 case _ =>
919925 (signaturesCount >= 2)
920926 }
921927 }
922928

github/deemru/w8io/3ef1775 
112.64 ms