logo DERO HE BlockChain Explorer(v1) Mainnet

Tx hash: 87e927997383f8160b7b8dce87ab3565d499681d4d5e078f3b5186f6906195de Type SC

Block: 22cc05c578b6c1de2c26827f743506a07d601f70ab5a975aa19e42eb482bc4fc (VALID)
SCID current reserves
SCID Amount(in atomic units)
0000000000000000000000000000000000000000000000000000000000000000 0
SCID string variables
key value
C 2f2f2020436f7079726967687420323032342e20436976696c776172652e20416c6c207269676874732072657365727665642e0a2f2f202054454c4120446563656e7472616c697a65642057656220446f63756d656e74202854454c412d444f432d31290a46756e6374696f6e20496e697469616c697a655072697661746528292055696e7436340a313020494620696e69742829203d3d2030205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528226e616d65486472222c2022736372697074732e6a7322290a33312053544f524528226465736372486472222c20224a5322290a33322053544f5245282269636f6e55524c486472222c202222290a33332053544f524528226455524c222c2022736372697074732e6a7322290a33342053544f52452822646f6354797065222c202254454c412d4a532d3122290a33352053544f52452822737562446972222c20226a7322290a33362053544f5245282266696c65436865636b43222c20223234643530643636373933313863613061303131616432373936616138303164376439653961623766343566363036336238646235656337386535333231373422290a33372053544f5245282266696c65436865636b53222c20223265306265336664643766383936383666383334346563373166303735646334363861663130323538353364326365633235323536633262313866396634303122290a3130302052455455524e20300a456e642046756e6374696f6e0a0a46756e6374696f6e20696e697428292055696e7436340a31302049462045584953545328226f776e65722229203d3d2030205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528226f776e6572222c20616464726573732829290a35302053544f52452822646f6356657273696f6e222c2022312e302e3022290a36302053544f5245282268617368222c204845582854584944282929290a37302053544f524528226c696b6573222c2030290a38302053544f524528226469736c696b6573222c2030290a3130302052455455524e20300a456e642046756e6374696f6e0a0a46756e6374696f6e2061646472657373282920537472696e670a31302044494d207320617320537472696e670a3230204c45542073203d205349474e455228290a33302049462049535f414444524553535f56414c4944287329205448454e20474f544f2035300a34302052455455524e2022616e6f6e220a35302052455455524e20414444524553535f535452494e472873290a456e642046756e6374696f6e0a0a46756e6374696f6e205261746528722055696e743634292055696e7436340a31302044494d206164647220617320537472696e670a3135204c45542061646472203d206164647265737328290a31362049462072203c2031303020262620455849535453286164647229203d3d2030202626206164647220213d2022616e6f6e22205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528616464722c2022222b722b225f222b424c4f434b5f4845494748542829290a34302049462072203c203530205448454e20474f544f2037300a35302053544f524528226c696b6573222c204c4f414428226c696b657322292b31290a36302052455455524e20300a37302053544f524528226469736c696b6573222c204c4f414428226469736c696b657322292b31290a3130302052455455524e20300a456e642046756e6374696f6e0a0a2f2a66756e6374696f6e206762696428656c6964297b0a0972657475726e20646f63756d656e742e676574456c656d656e744279496428656c6964293b0a7d0a7661722072616e646f5f646573743d226465726f3171796b797461366e74706432376e6c3079713478747a6166346c733670356539707175306b3278347833707171357861766a73647871676e7938323730222f2f226465746f317179767965797a72636d32667a66366b79713765676b6573327566676e7935786e3737793674797068667839733777336d767964357171796e7235687822226465746f317179326e786774733777646e3238636b63346c3274657770686a637070716a666a363964646b786a6e30617938686c736a7837336a71676d6174357338222f2f0a7661722072616e646f5f7369676e65723d72616e646f5f646573740a76617220646f637479706573656c656374203d20676269642827646f635f7479706527293b0a76617220646f634e616d65486472203d20676269642827646f634e616d6548647227293b0a76617220646f634465736372486472203d20676269642827646f63446573637248647227293b0a76617220646f6349636f6e55524c486472203d20676269642827646f6349636f6e55524c48647227293b0a76617220646f634455524c203d20676269642827646f634455524c27293b0a76617220646f63537562446972203d20676269642827646f6353756244697227293b0a0a76617220646f63696e70757473203d205b646f634e616d654864722c646f6344657363724864722c646f6349636f6e55524c4864722c646f634455524c2c646f635375624469725d3b0a646f63696e707574732e666f72456163682828696e70757429203d3e207b0a09696e7075742e6164644576656e744c697374656e657228226b65797570222c20646f6345646974293b0a09696e7075742e6164644576656e744c697374656e657228226368616e6765222c20646f6345646974293b0a09696e7075742e6164644576656e744c697374656e65722822626c7572222c20646f6345646974293b0a7d293b0a646f637479706573656c6563742e6164644576656e744c697374656e657228226368616e6765222c20646f6345646974293b0a0a66756e6374696f6e20646f6345646974286576656e746f72696429207b200a09736d617274636f6e74726163742e76616c7565203d20676574446f635343436f646528293b0a096c6574206c6173745f6572726f7273203d206572726f72732e6d61702861203d3e20612e6572726f72293b0a096c657420746964203d2027273b0a096966286576656e746f72696420696e7374616e63656f6620537472696e67207c7c20747970656f66206576656e746f726964203d3d3d2027737472696e6727297b09090a0909746964093d206576656e746f7269643b090a097d656c73657b0a0909746964093d206576656e746f7269642e7461726765742e69643b0a097d0a096c6574206f6b203d20636865636b446f63496e7075747328746964293b0a090a202020206966286f6b2e6f6b297b0a0909616464446f63427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c7365207b0a0909616464446f63427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d0a0a20202020696628696e7374616c6c5f646f63732e6c656e67746820213d2030297b0a09096465706c6f79446f6373427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c7365207b0a09096465706c6f79446f6373427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d090a0a0a096c65742073616d655f6572726f72203d204a534f4e2e737472696e67696679286f6b2e6572726f72732e6d61702861203d3e20612e6572726f722929203d3d3d204a534f4e2e737472696e67696679286c6173745f6572726f7273293b0a09696628676269642827647761726e272920262620282173616d655f6572726f72207c7c206f6b2e6572726f72732e6c656e677468203d3d3d203029297b676269642827647761726e27292e72656d6f766528293b7d0a096966286f6b2e6572726f72732e6c656e67746820213d2030297b09090a09096c6574206572726f727354657874203d2022223b0a0909666f722028636f6e7374206572726f72206f66206f6b2e6572726f727329207b0a0909096572726f727354657874203d206572726f722e6572726f72202b206572726f727354657874202b20225c6e223b0a0909096966286572726f722e696420213d3d2727202626202173616d655f6572726f72297b0a090909096c6574207761726e203d20646f63756d656e742e637265617465456c656d656e7428227022293b0a090909097761726e2e696e6e657254657874203d206572726f722e6572726f723b0a090909097761726e2e6964203d22647761726e223b0a090909097761726e2e7374796c652e636f6c6f72203d2022726564223b0a0909090967626964286572726f722e6964292e6166746572287761726e293b0a0909097d0a0909090a09097d200a09096966282173616d655f6572726f72297b0909090a090909616c657274286572726f727354657874293b0a09097d0a097d0a7d0a766172206572726f7273203d205b5d3b0a66756e6374696f6e20636865636b446f63496e7075747328746964297b0a0a096c6574206f6b203d20747275653b0a096572726f7273203d205b5d3b090a09626c6f62203d206e657720426c6f62285b4a534f4e2e737472696e676966792867657451756f74654a534f4e28736d617274636f6e74726163742e76616c756529292b2866696c65436865636b43203d3d22223f2730272e72657065617428313238293a2222295d290a09696628626c6f622e73697a65203e203230303030297b0a0909696628746964203d3d3d2022646f63446573637248647222297b0a0909096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a224465736372697074696f6e206f7220646f6320746f6f206c617267652e2022202b20626c6f622e73697a65202b226279746573227d293b0a09097d656c73657b09090a0909096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a22446f6320746f6f206c617267652e2022202b20626c6f622e73697a65202b226279746573227d293b0a09097d0a09096f6b203d2066616c73653b0a097d0a090a0a0969662028646f63546578742e76616c75652e6d61746368282f5c75303032415c2f2f2929207b09090a09096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a224d756c74692d6c696e6520636f6d6d656e7473206e6f7420616c6c6f7765642e227d293b0a09096f6b203d2066616c73653b0a097d090a090a096966280a09646f637479706573656c6563742e76616c75653d3d22227c7c0a09646f634e616d654864722e76616c75653d3d22227c7c0a09646f6344657363724864722e76616c75653d3d22227c7c0a09646f634455524c2e76616c75653d3d22227c7c0a0966696c65436865636b433d3d22227c7c0a0966696c65436865636b533d3d22227c7c0a09646f63546578742e76616c75653d3d22227c7c0a0966696c656e616d653d3d22220a09297b0a09096f6b203d2066616c73653b0a097d0a0969662866696c656e616d6520213d2222297b0a09096c657420746573745f66696c656e616d65203d2022223b0a0909746573745f66696c656e616d65203d2066696c656e616d652e73706c697428272e27292e706f7028293b0a0a09096966282254454c412d222b746573745f66696c656e616d652e746f55707065724361736528292b222d312220213d20646f637479706573656c6563742e76616c7565297b0a0909096572726f72732e70757368287b226964223a7469642c226572726f72223a2246696c6520457874656e73696f6e20646f65736e2774206d617463682073656c656374656420646f63756d656e7420747970652e227d293b0a0909096f6b203d2066616c73653b0a09097d0a0909696628696e7374616c6c5f646f63732e6c656e677468203e2030297b0a0909096c65742066756c6c5f6c6f63203d20646f635375624469722e76616c7565202b20646f634e616d654864722e76616c75653b0a090909666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a0909090969662866756c6c5f6c6f63203d3d20696e7374616c6c5f646f63735b785d2e737562646972202b20696e7374616c6c5f646f63735b785d2e66696c656e616d65297b0a09090909096572726f72732e70757368287b226964223a7469642c226572726f72223a22446f6320616c726561647920616464656421227d293b0a09090909096f6b203d2066616c73653b0a090909097d0a0909097d0a09097d090a0909696628696e7374616c6c65645f646f63732e6c656e677468203e2030297b0a0909096c65742066756c6c5f6c6f63203d20646f635375624469722e76616c7565202b20646f634e616d654864722e76616c75653b0a090909666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a0909090969662866756c6c5f6c6f63203d3d20696e7374616c6c65645f646f63735b785d2e737562646972202b20696e7374616c6c65645f646f63735b785d2e66696c656e616d65297b0a09090909096572726f72732e70757368287b226964223a7469642c226572726f72223a22446f6320616c726561647920696e7374616c6c656421227d293b0a09090909096f6b203d2066616c73653b0a090909097d0a0909097d0a09097d0909090a097d090a0972657475726e207b226f6b223a6f6b2c226572726f7273223a6572726f72737d3b0a7d0a0a0a7661722066696c65436865636b43203d2022223b0a7661722066696c65436865636b53203d2022223b0a0a7661722066696c656e616d653d22223b0a76617220696e7374616c6c5f646f6373203d205b5d3b0a76617220696e7374616c6c65645f646f6373203d205b5d3b0a7661722066696c65436f6e74656e7473203d20646f63756d656e742e717565727953656c6563746f722827696e707574236f70656e5f66696c655b747970653d2266696c65225d27293b0a66696c65436f6e74656e74732e6164644576656e744c697374656e657228276368616e6765272c206173796e6320286529203d3e207b0a0a0969662866696c65436f6e74656e74732e66696c65732e6c656e67746820213d3d2031297b0a0909646f63546578742e76616c75653d22220a090966696c656e616d653d22220a0909646f634e616d654864722e76616c75653d22220a090966696c65436f6e74656e74732e76616c75653d22220a090966696c65436865636b433d22220a090966696c65436865636b533d22220a0909646f63456469742865290a090972657475726e0a097d0a202020206c65742066696c65203d2066696c65436f6e74656e74732e66696c65735b305d0a202020206c657420726561646572203d206e65772046696c6552656164657228290a202020207265616465722e6f6e6c6f6164203d206173796e63202829203d3e207b0a0909646f63546578742e76616c7565203d207265616465722e726573756c740a090966696c656e616d65203d2066696c652e6e616d650a0909646f634e616d654864722e76616c7565203d2066696c656e616d650a202020202020202066696c65436865636b433d22220a090966696c65436865636b533d22220a0909646f634564697428276f70656e5f66696c6527293b0a09096c6574207369676e6174757265203d2066616c73650a09096c657420726573756c74203d206572726f72732e66696e64286f626a203d3e206f626a2e74797065203d3d3d202266696c6522293b0a0909696628747970656f6620726573756c74203d3d3d2022756e646566696e656422297b0a0909097369676e6174757265203d206177616974207369676e4461746128646f63546578742e76616c7565290a09097d0a0909696628217369676e6174757265297b0a090909646f63546578742e76616c75653d22220a09090966696c656e616d653d22220a090909646f634e616d654864722e76616c75653d22220a09090966696c65436f6e74656e74732e76616c75653d22220a09090966696c65436865636b433d22220a09090966696c65436865636b533d22220a090909646f63456469742865290a09090972657475726e0a09097d0a0a09096c6574207369676e73203d2070617273655369676e656446696c65287369676e6174757265293b0a090966696c65436865636b43203d207369676e732e433b0a090966696c65436865636b53203d207369676e732e533b0a0909646f634564697428276f70656e5f66696c6527293b0a0a202020207d0a202020207265616465722e726561644173546578742866696c65290a7d293b0a0a0a66756e6374696f6e2070617273655369676e656446696c65287369676e6564297b0a096c65742063203d207369676e65642e73706c69742827433a20272c2032295b315d3b0a096c65742073203d20632e73706c69742827533a20272c2032295b315d3b0a0963203d20632e73706c6974282f5c723f5c6e2f2c2032295b305d3b0a0973203d20732e73706c6974282f5c723f5c6e2f2c2032295b305d3b0a0972657475726e207b2243223a632c2253223a737d3b0a7d0a0a0a76617220736d617274636f6e7472616374203d20676269642827736d617274636f6e747261637427293b0a76617220646f6354657874203d20676269642827646f63756d656e7427293b0a76617220616464446f63427574746f6e203d20676269642827616464446f6327293b0a766172206465706c6f79446f6373427574746f6e203d206762696428276465706c6f79446f637327293b0a0a66756e6374696f6e2067657451756f74654a534f4e28736d6172745f636f6e7472616374297b0a096c65742071756f74654a534f4e203d207b7d3b0a0971756f74654a534f4e2e6a736f6e727063203d2022322e30223b0a0971756f74654a534f4e2e6964203d202231223b0a0971756f74654a534f4e2e6d6574686f64203d20224445524f2e476574476173457374696d617465223b0a0971756f74654a534f4e2e706172616d73203d207b7d3b0a0971756f74654a534f4e2e706172616d732e7472616e7366657273203d205b7b0a090964657374696e6174696f6e3a2072616e646f5f646573742c0a0909616d6f756e743a302c0a09094275726e3a302c0a09097061796c6f61645f7270633a5b5d200a097d5d3b0a0971756f74654a534f4e2e706172616d732e7363203d20736d6172745f636f6e74726163743b0a0971756f74654a534f4e2e706172616d732e73635f76616c7565203d20303b0a0971756f74654a534f4e2e706172616d732e73635f727063203d205b5d3b0a0971756f74654a534f4e2e706172616d732e72696e6773697a65203d20323b0a0971756f74654a534f4e2e706172616d732e7369676e6572203d2072616e646f5f7369676e65723b0a0972657475726e2071756f74654a534f4e3b0a7d0a0a616464446f63427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c2066756e6374696f6e286576656e7429207b0a096c65742071756f74654a534f4e203d2067657451756f74654a534f4e28736d617274636f6e74726163742e76616c7565293b0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420436f73743a20222b286e696365526f756e642871756f74654a534f4e2e706172616d732e73632e6c656e677468202a2032202a202e3030303031292920202b22204445524f2c2041646420446f6320746f2051756575653f22293b0a0969662028726573756c7429207b0a0909616464446f6328293b0a097d20656c7365207b0a0909616c6572742822416374696f6e2063616e63656c65642e22293b0a097d0a7d293b0a0a0a6465706c6f79446f6373427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c206173796e632066756e6374696f6e286576656e7429207b0a096c657420746f74616c5f6c656e677468203d20303b0a09666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a0909746f74616c5f6c656e677468202b3d20696e7374616c6c5f646f63735b785d2e636f6e74726163742e6c656e6774683b0a097d0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420546f74616c20436f737420666f7220446f63733a20222b286e696365526f756e6428746f74616c5f6c656e677468202a2032202a202e3030303031292920202b22204445524f2c20436f6e74696e75653f22293b0a0969662028726573756c7429207b0a09096465706c6f79446f6373427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a0909617761697420696e7374616c6c446f637328293b0a0909616c6572742822446f63756d656e747320496e7374616c6c65642c2043726561746520616e20496e646578204e6578742e22293b0a090920696628696e7374616c6c5f646f63732e6c656e67746820213d2030297b0a0909096465706c6f79446f6373427574746f6e2e72656d6f7665417474726962757465282264697361626c656422290a0909207d090a097d20656c7365207b0a0909616c6572742822416374696f6e2063616e63656c65642e22293b0a097d0a0a7d293b0a0a2f2f496e7374616c6c204a534f4e0a66756e6374696f6e20676574496e7374616c6c4a534f4e28736d6172745f636f6e7472616374297b0a096c657420696e7374616c6c4a534f4e203d207b7d3b0a09696e7374616c6c4a534f4e2e6a736f6e727063203d2022322e30223b0a09696e7374616c6c4a534f4e2e6964203d202231223b0a09696e7374616c6c4a534f4e2e6d6574686f64203d20227472616e73666572223b0a09696e7374616c6c4a534f4e2e706172616d73203d207b7d3b0a09696e7374616c6c4a534f4e2e706172616d732e66656573203d20303b0a09696e7374616c6c4a534f4e2e706172616d732e7472616e7366657273203d205b7b0a090964657374696e6174696f6e3a2072616e646f5f646573742c0a0909616d6f756e743a302c0a09094275726e3a302c0a09097061796c6f61645f7270633a5b5d200a097d5d3b0a09696e7374616c6c4a534f4e2e706172616d732e7363203d20736d6172745f636f6e74726163743b0a09696e7374616c6c4a534f4e2e706172616d732e73635f76616c7565203d20303b0a09696e7374616c6c4a534f4e2e706172616d732e73635f727063203d205b5d3b0a09696e7374616c6c4a534f4e2e706172616d732e72696e6773697a65203d20323b0a0972657475726e20696e7374616c6c4a534f4e3b0a7d0a0a6173796e632066756e6374696f6e207369676e446174612864617461297b090a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6964203d202230223b0a094a534f4e522e6d6574686f64203d20225369676e44617461223b0a094a534f4e522e706172616d73203d2062746f612864617461293b0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a090972657475726e2061746f6228726573706f6e73652e726573756c742e7369676e6174757265293b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b09090a097d0a0972657475726e2066616c73653b0a7d0a66756e6374696f6e20696e7374616c6c4c69737428297b0a096c657420746578743d22220a09666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a090974657874202b3d2028696e7374616c6c5f646f63735b785d2e73756264697220213d22223f20696e7374616c6c5f646f63735b785d2e737562646972202b20222f22203a222229202b20696e7374616c6c5f646f63735b785d2e66696c656e616d65202b223c62723e220a097d0a0972657475726e20746578740a7d0a2f2f41646420446f632066756e6374696f6e0a6173796e632066756e6374696f6e20616464446f6328297b0a0a09696e7374616c6c5f646f63732e70757368287b22737562646972223a646f635375624469722e76616c75652e7265706c616365282f5e5c2f7c5c2f7c5c2f242f672c202727292c2266696c656e616d65223a66696c656e616d652c22646f636e616d65686472223a646f634e616d654864722e76616c75652c22636f6e7472616374223a736d617274636f6e74726163742e76616c75657d290a09646f634e616d654864722e76616c75653d22220a0966696c656e616d653d22220a0966696c65436f6e74656e74732e76616c75653d22220a0966696c65436865636b433d22220a0966696c65436865636b533d22220a09676269642822696e7374616c6c5f6f757470757422292e696e6e657248544d4c203d20696e7374616c6c4c69737428293b0a09646f634564697428272729090a7d0a6c657420636865636b6564203d2066616c73650a2f2f496e7374616c6c20446f63732066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c446f637328297b2020200a0a09696628696e7374616c6c5f646f63732e6c656e677468203e2030297b0a202020202020202069662821636865636b6564297b0a202020202020202020202020636865636b6564203d20747275653b0a2020202020202020202020206c65742074786964203d20617761697420646f63496e5472616e736665727328696e7374616c6c5f646f63735b305d2e636f6e7472616374293b0a2020202020202020202020206966287478696420213d202222297b0a20202020202020202020202020202020646f63496e7374616c6c656428696e7374616c6c5f646f63735b305d2c74786964290a2020202020202020202020202020202072657475726e20617761697420696e7374616c6c446f637328293b0a2020202020202020202020207d0a20202020202020207d0a09090a20202020202020206c65742070726f6772657373203d2020617761697420696e7374616c6c446f6328696e7374616c6c5f646f63735b305d290a090969662870726f677265737320213d3d20227375636365737322297b0a090909676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c203d20224572726f72206f636375727265643a222b2070726f6772657373202b20223c62723e22202b20676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c3b0a09097d0a090972657475726e20617761697420696e7374616c6c446f637328293b09090a097d0a20202020636865636b6564203d2066616c73650a0972657475726e20747275650a7d0a2f2f496e7374616c6c20446f632066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c446f6328646f63297b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e6428676574496e7374616c6c4a534f4e28646f632e636f6e747261637429293b0a09696628726573706f6e73652e726573756c74297b0a09096c657420696e7374616c6c6564203d20617761697420636f6e6669726d6174696f6e28726573706f6e73652e726573756c742e74786964290a09096966202821696e7374616c6c656429207b0a09090972657475726e202250726f626c656d20496e7374616c6c696e6720446f632c2074727920616761696e2e20545849443a222b726573706f6e73652e726573756c742e747869640a09097d0a0909646f63496e7374616c6c656428646f632c726573706f6e73652e726573756c742e74786964290a090972657475726e202273756363657373220a097d656c736520696628726573706f6e73652e6572726f72297b0a202020202020206c65742074786964203d2061776169742066696e64534328646f632e636f6e7472616374290a20202020202020206966287478696420213d202727297b0a202020202020202020202020646f63496e7374616c6c656428646f632c74786964290a20202020202020202020202072657475726e202273756363657373220a20202020202020207d0a090972657475726e20726573706f6e73652e6572726f722e6d6573736167650a097d09090a7d0a0a2f2f696e7374616c6c65640a66756e6374696f6e20646f63496e7374616c6c656428646f632c74786964297b200a20202020696e7374616c6c65645f646f63732e70757368287b22737562646972223a646f632e7375626469722c2266696c656e616d65223a646f632e66696c656e616d652c2273636964223a747869647d293b0a20202020696e7374616c6c5f646f63732e736869667428293b0a20202020676269642822696e7374616c6c5f6f757470757422292e696e6e657248544d4c203d20696e7374616c6c4c69737428293b0a0a202020206c6574206f757470757454657874203d22223b0a20202020666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a20202020202020206f757470757454657874202b3d2028696e7374616c6c65645f646f63735b785d2e73756264697220213d22223f20696e7374616c6c65645f646f63735b785d2e737562646972202b20222f22203a222229202b20696e7374616c6c65645f646f63735b785d2e66696c656e616d6520202b20223a22202b20696e7374616c6c65645f646f63735b785d2e73636964202b223c62723e223b0a202020207d0a202020206c657420746f74646f6373203d20696e7374616c6c5f646f63732e6c656e677468202b20696e7374616c6c65645f646f63732e6c656e6774683b09090a202020206c6574206d7367203d2022496e7374616c6c656420446f632023222b696e7374616c6c65645f646f63732e6c656e677468202b2022206f6620222b20746f74646f6373202b20223c62723e220a20202020696628696e7374616c6c65645f646f63732e6c656e677468203d3d20746f74646f6373297b0a20202020202020206d7367203d20746f74646f6373202b202220646f637320696e7374616c6c65642e3c62723e220a202020207d0a20202020676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c203d206d7367202b206f7574707574546578743b0a2020200a7d0a0a0a2f2f496e7374616c6c20496e6465782066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c496e64657828297b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e6428676574496e7374616c6c4a534f4e28696e6465785343436f64652e76616c756529293b0a09696628726573706f6e73652e726573756c74297b0a09096c657420696e7374616c6c6564203d20617761697420636f6e6669726d6174696f6e28726573706f6e73652e726573756c742e74786964290a09096966202821696e7374616c6c656429207b0a090909616c657274282250726f626c656d20496e7374616c6c696e6720496e6465782c2074727920616761696e2e20545849443a222b726573706f6e73652e726573756c742e74786964293b0a09090972657475726e2066616c73653b0a09097d0a0909676269642822696e6465787363696422292e696e6e657248544d4c203d202254656c61205369746520496e64657820534349443a22202b20726573706f6e73652e726573756c742e747869643b0a0909616c6572742822436f6e67726174732c20796f7527726520616c6c20646f6e6521205468697320697320796f75722054656c61205369746520534349443a22202b20726573706f6e73652e726573756c742e74786964293b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b0a097d09090a090a7d0a0a0a76617220696e6465784e616d65486472203d20676269642827696e6465784e616d6548647227293b0a76617220696e6465784465736372486472203d20676269642827696e646578446573637248647227293b0a76617220696e64657849636f6e55524c486472203d20676269642827696e64657849636f6e55524c48647227293b0a76617220696e6465784455524c203d20676269642827696e6465784455524c27293b0a76617220696e6465785343436f6465203d20676269642827696e6465785343436f646527293b0a0a766172206465706c6f79496e646578427574746f6e203d206762696428276465706c6f79496e64657827293b0a7661722067656e6572617465496e646578427574746f6e203d2067626964282767656e6572617465496e64657827293b0a0a0a76617220696e646578696e70757473203d205b696e6465784e616d654864722c696e64657844657363724864722c696e64657849636f6e55524c4864722c696e6465784455524c5d3b0a696e646578696e707574732e666f72456163682828696e70757429203d3e207b0a09696e7075742e6164644576656e744c697374656e657228226b65797570222c20696e64657845646974293b0a09696e7075742e6164644576656e744c697374656e657228226368616e6765222c20696e64657845646974293b0a09696e7075742e6164644576656e744c697374656e65722822626c7572222c20696e64657845646974293b0a7d293b0a0a66756e6374696f6e20696e64657845646974286576656e7429207b0a0a096c657420646f6373203d22223b0a096c6574206c696e655f6e6f203d2034303b0a09666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a0909646f6373202b3d20286c696e655f6e6f2b2b29202b20602053544f52452822444f43602b287061727365466c6f6174287829202b203129202b2060222c202260202b696e7374616c6c65645f646f63735b785d2e73636964202b20602229602b225c6e223b0a097d0a09696e6465785343436f64652e76616c7565203d20676574496e646578534328646f6373293b0a0a096c6574206f6b203d20636865636b496e646578496e7075747328293b0a202020206966286f6b2e6f6b297b0a09096465706c6f79496e646578427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c73657b0a09096465706c6f79496e646578427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d0a096966286f6b2e6572726f72732e6c656e67746820213d2030297b0a09096c6574206572726f727354657874203d2022223b0a0909666f722028636f6e7374206572726f72206f66206f6b2e6572726f727329207b0a0909096572726f727354657874203d206572726f72202b206572726f727354657874202b20225c6e223b0a09097d0a0909616c657274286572726f727354657874293b0a097d0a7d0a0a0a6465706c6f79496e646578427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c2066756e6374696f6e286576656e7429207b0a096c65742071756f74654a534f4e203d2067657451756f74654a534f4e28696e6465785343436f64652e76616c7565293b0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420436f73743a20222b286e696365526f756e642871756f74654a534f4e2e706172616d732e73632e6c656e677468202a2032202a202e3030303031292920202b22204445524f2c20496e7374616c6c2054656c612d496e6465783f22293b0a0969662028726573756c7429207b0a0909696e7374616c6c496e64657828696e6465785343436f64652e76616c7565293b0a097d20656c7365207b0a0909636f6e736f6c652e6c6f672822416374696f6e2063616e63656c65642e22293b0a097d0a7d293b0a0a0a66756e6374696f6e20636865636b496e646578496e7075747328297b0a096c6574206f6b203d20747275653b0a096c657420696572726f7273203d205b5d3b0a09626c6f62203d206e657720426c6f62285b696e6465785343436f64652e76616c75655d293b0a09696628626c6f622e73697a65203e203230303030297b0a0909696572726f72732e707573682822446f6320746f6f206c617267652e22293b0a09096f6b203d2066616c73653b0a097d0a096966280a09696e6465784e616d654864722e76616c75653d3d22227c7c0a09696e64657844657363724864722e76616c75653d3d22227c7c0a09696e6465784455524c2e76616c75653d3d22227c7c0a09696e6465785343436f64652e76616c75653d3d22227c7c0a09696e7374616c6c65645f646f63732e6c656e677468203d3d20300a09297b0a09096f6b203d2066616c73653b0a097d0a0972657475726e207b226f6b223a6f6b2c226572726f7273223a696572726f72737d3b0a7d0a0a66756e6374696f6e206e696365526f756e64286e756d626572297b0a0972657475726e204d6174682e726f756e64286e756d6265722a313030303030303030292f3130303030303030303b0a7d0a0a6173796e632066756e6374696f6e2067657448656967687428297b2020200a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6d6574686f64203d20224445524f2e476574486569676874223b0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a090972657475726e20726573706f6e73652e726573756c742e6865696768743b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b0a097d09090a7d0a0a6173796e632066756e6374696f6e2067657454785374617475732874786964297b0a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6964203d20303b0a094a534f4e522e6d6574686f64203d20224445524f2e4765745472616e73616374696f6e223b0a094a534f4e522e706172616d73203d207b7d3b0a094a534f4e522e706172616d732e7478735f686173686573203d205b747869645d3b0a0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a0909696628726573706f6e73652e726573756c742e737461747573297b0a090909696628726573706f6e73652e726573756c742e737461747573203d3d20224f4b22297b0a09090909696628726573706f6e73652e726573756c742e74787320213d206e756c6c297b0a09090909096c6574207478203d20726573706f6e73652e726573756c742e7478735b305d3b0a090909090969662028282174782e696e5f706f6f6c2026262074782e76616c69645f626c6f636b3d3d2222297c7c74782e69676e6f72656429207b0a09090909090972657475726e2066616c73650a09090909097d656c73652069662874782e696e5f706f6f6c297b0a09090909090972657475726e2066616c73650a09090909097d656c73657b0a09090909090972657475726e20747275650a09090909097d0909090a090909097d090909090a0909097d0a09097d0a090972657475726e2066616c73653b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909636f6e736f6c652e6c6f6728726573706f6e73652e6572726f722e6d657373616765293b0a090972657475726e20226572726f72220a097d0a7d0a0a76617220636f6e6669726d5f6865696768743d303b0a6173796e632066756e6374696f6e20636f6e6669726d6174696f6e287478696429207b0a09636f6e6669726d5f686569676874203d2061776169742067657448656967687428293b0a0972657475726e206e65772050726f6d6973652866756e6374696f6e20287265736f6c766529207b09090a09096c657420617474656d707473203d20303b09090a0909090a0909636f6e737420617474656d7074203d206173796e632829203d3e207b090a090909617474656d7074732b2b3b0a0909096c657420746869735f686569676874203d2061776169742067657448656967687428293b0909090a090909696628746869735f686569676874203e20636f6e6669726d5f686569676874297b0a09090909696628617474656d707473203e203336297b0a0909090909636c656172496e74657276616c28726574727954696d6572293b0a09090909097265736f6c76652866616c7365290a090909097d09090a090909096c6574207374617475735f6f6b203d2061776169742067657454785374617475732874786964290a090909096966287374617475735f6f6b203d3d3d2074727565297b0a0909090909636c65617254696d656f757428726574727954696d6572293b0a09090909097265736f6c76652874727565290a090909097d656c7365206966287374617475735f6f6b3d3d3d226572726f7222297b0a0909090909617474656d7074733d617474656d7074733e303f617474656d7074732d313a300a090909097d0a0909097d0a09097d0a09096c657420726574727954696d6572203d20736574496e74657276616c28617474656d70742c2032303030290909090a097d292020200a7d0a0a7661722066696e645f6865696768743d303b0a6173796e632066756e6374696f6e2066696e64534328636f6e747261637429207b0a0966696e645f686569676874203d2061776169742067657448656967687428293b0a0972657475726e206e65772050726f6d6973652866756e6374696f6e20287265736f6c766529207b09090a09096c657420617474656d707473203d20303b09090a0909090a0909636f6e737420617474656d7074203d206173796e632829203d3e207b090a090909617474656d7074732b2b3b0a0909096c657420746869735f686569676874203d2061776169742067657448656967687428293b0909090a090909696628746869735f686569676874203e2066696e645f686569676874297b0a09090909696628617474656d707473203e203237297b0a0909090909636c656172496e74657276616c28726574727954696d6572293b0a09090909097265736f6c7665282727290a090909097d09090a090909096c65742074786964203d20617761697420646f63496e5472616e736665727328636f6e7472616374290a090909096966287478696420213d202222297b0a0909090909636c65617254696d656f757428726574727954696d6572293b0a09090909097265736f6c76652874786964290a090909097d0a0909097d0a09097d0a09096c657420726574727954696d6572203d20736574496e74657276616c28617474656d70742c2032303030290909090a097d292020200a7d0a0a2f2f4765747320746865206c697374206f66206f7574676f696e67207472616e73666572730a6173796e632066756e6374696f6e20646f63496e5472616e736665727328636f6e7472616374297b0a2020200a202020206c6574204a534f4e4f626a203d207b7d3b0a094a534f4e4f626a2e6a736f6e727063203d2022322e30223b0a094a534f4e4f626a2e6d6574686f64203d20224765745472616e7366657273223b0a094a534f4e4f626a2e706172616d73203d207b7d3b0a094a534f4e4f626a2e706172616d732e6f7574203d20747275653b0a094a534f4e4f626a2e706172616d732e696e203d2066616c73653b0a202020202f2f4a534f4e4f626a2e706172616d732e6d696e5f686569676874203d207061727365496e7428636f6e6669726d5f686569676874290a0a202020206c657420726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e4f626a293b0a09696628726573706f6e73652e726573756c74297b0a20202020202020206c657420656e7472696573203d20726573706f6e73652e726573756c742e656e74726965730a2020202020202020696628656e74726965732e6c656e6774683e30297b0a2020202020202020202020206c657420656e7472696573203d20726573706f6e73652e726573756c742e656e74726965730a202020202020202020202020696628636f6e7472616374203d3d206177616974206765745343436f646528656e74726965735b656e74726965732e6c656e6774682d315d2e747869642929207b0a2020202020202020202020202020202072657475726e20656e74726965735b656e74726965732e6c656e6774682d315d2e747869643b0a2020202020202020202020207d2020202020202020202020200a20202020202020207d0a090972657475726e2022220a097d656c736520696628726573706f6e73652e6572726f72297b0a0909636f6e736f6c652e6c6f6728726573706f6e73652e6572726f722e6d657373616765293b0a202020202020202072657475726e2022220a097d09090a7d0a0a0a6173796e632066756e6374696f6e206765745343436f64652874786964297b0a6c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6d6574686f64203d20224445524f2e4765745343223b0a094a534f4e522e706172616d73203d207b7d3b0a094a534f4e522e706172616d732e73636964203d2022223b0a094a534f4e522e706172616d732e636f6465203d20747275653b0a094a534f4e522e706172616d732e7661726961626c6573203d2066616c73653b0a094a534f4e522e706172616d732e73636964203d20747869643b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a0909696628747970656f6620726573706f6e73652e726573756c7420213d3d2027756e646566696e65642720262620747970656f6620726573706f6e73652e726573756c742e636f646520213d3d2027756e646566696e656427297b09090a09090972657475726e20726573706f6e73652e726573756c742e636f6465090909090a09097d0a097d090a2020202072657475726e2022220a7d0a2a2f
dURL 736372697074732e6a73
descrHdr 4a53
dislikes 0
docType 54454c412d4a532d31
docVersion 312e302e30
fileCheckC 32346435306436363739333138636130613031316164323739366161383031643764396539616237663435663630363362386462356563373865353332313734
fileCheckS 32653062653366646437663839363836663833343465633731663037356463343638616631303235383533643263656332353235366332623138663966343031
hash 38376539323739393733383366383136306237623864636538376162333536356434393936383164346435653037386633623531383666363930363139356465
iconURLHdr
likes 0
nameHdr 736372697074732e6a73
owner 6465726f317179347966376335373777717a767a7134347833306c7967686135776a7a377772687736646e76356e337071346634643761716c75717133306d37616b
subDir 6a73
SCID uint64 variables
key value
built BLID : 62e877e1ddd84c5b2df947f37234d3db370b9c4dedd1ced0ea719a6ce7e9e04e
Tx RootHash: 6a5645f0f3327afa81ba588af581c0d041aa6014ab29925b0c3563ccfb3ddf93 built height : 6111569
Timestamp: 1761251614862 Timestamp [UTC]: 2025-10-23 21:33:34 Age [y:d:h:m:s]: 20:17:20.273
Block: 6111570 Fee: 0.25654 Tx size: 18.295 kB
Tx version: 1 No of confirmations: 3850 Signature type: DERO_HOMOMORPHIC
Extra:
DERO : 2 inputs/outputs (RING size) Fees 0.25654 Deposited to SC 0.00000
Sender : dero1qy4yf7c577wqzvzq44x30lygha5wjz7wrhw6dnv5n3pq4f4d7aqluqq30m7ak
address
dero1qy4yf7c577wqzvzq44x30lygha5wjz7wrhw6dnv5n3pq4f4d7aqluqq30m7ak
dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270
SC Balance: 0.00000 DERO
SC CODE:
  //  Copyright 2024. Civilware. All rights reserved.
//  TELA Decentralized Web Document (TELA-DOC-1)
Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "scripts.js")
31 STORE("descrHdr", "JS")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "scripts.js")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "js")
36 STORE("fileCheckC", "24d50d6679318ca0a011ad2796aa801d7d9e9ab7f45f6063b8db5ec78e532174")
37 STORE("fileCheckS", "2e0be3fdd7f89686f8344ec71f075dc468af1025853d2cec25256c2b18f9f401")
100 RETURN 0
End Function

Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("docVersion", "1.0.0")
60 STORE("hash", HEX(TXID()))
70 STORE("likes", 0)
80 STORE("dislikes", 0)
100 RETURN 0
End Function

Function address() String
10 DIM s as String
20 LET s = SIGNER()
30 IF IS_ADDRESS_VALID(s) THEN GOTO 50
40 RETURN "anon"
50 RETURN ADDRESS_STRING(s)
End Function

Function Rate(r Uint64) Uint64
10 DIM addr as String
15 LET addr = address()
16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30
20 RETURN 1
30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT())
40 IF r < 50 THEN GOTO 70
50 STORE("likes", LOAD("likes")+1)
60 RETURN 0
70 STORE("dislikes", LOAD("dislikes")+1)
100 RETURN 0
End Function

/*function gbid(elid){
	return document.getElementById(elid);
}
var rando_dest="dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270"//"deto1qyvyeyzrcm2fzf6kyq7egkes2ufgny5xn77y6typhfx9s7w3mvyd5qqynr5hx""deto1qy2nxgts7wdn28ckc4l2tewphjcppqjfj69ddkxjn0ay8hlsjx73jqgmat5s8"//
var rando_signer=rando_dest
var doctypeselect = gbid('doc_type');
var docNameHdr = gbid('docNameHdr');
var docDescrHdr = gbid('docDescrHdr');
var docIconURLHdr = gbid('docIconURLHdr');
var docDURL = gbid('docDURL');
var docSubDir = gbid('docSubDir');

var docinputs = [docNameHdr,docDescrHdr,docIconURLHdr,docDURL,docSubDir];
docinputs.forEach((input) => {
	input.addEventListener("keyup", docEdit);
	input.addEventListener("change", docEdit);
	input.addEventListener("blur", docEdit);
});
doctypeselect.addEventListener("change", docEdit);

function docEdit(eventorid) { 
	smartcontract.value = getDocSCCode();
	let last_errors = errors.map(a => a.error);
	let tid = '';
	if(eventorid instanceof String || typeof eventorid === 'string'){		
		tid	= eventorid;	
	}else{
		tid	= eventorid.target.id;
	}
	let ok = checkDocInputs(tid);
	
    if(ok.ok){
		addDocButton.removeAttribute("disabled");
	}else {
		addDocButton.setAttribute("disabled", true);
	}

    if(install_docs.length != 0){
		deployDocsButton.removeAttribute("disabled");
	}else {
		deployDocsButton.setAttribute("disabled", true);
	}	


	let same_error = JSON.stringify(ok.errors.map(a => a.error)) === JSON.stringify(last_errors);
	if(gbid('dwarn') && (!same_error || ok.errors.length === 0)){gbid('dwarn').remove();}
	if(ok.errors.length != 0){		
		let errorsText = "";
		for (const error of ok.errors) {
			errorsText = error.error + errorsText + "\n";
			if(error.id !=='' && !same_error){
				let warn = document.createElement("p");
				warn.innerText = error.error;
				warn.id ="dwarn";
				warn.style.color = "red";
				gbid(error.id).after(warn);
			}
			
		} 
		if(!same_error){			
			alert(errorsText);
		}
	}
}
var errors = [];
function checkDocInputs(tid){

	let ok = true;
	errors = [];	
	blob = new Blob([JSON.stringify(getQuoteJSON(smartcontract.value))+(fileCheckC ==""?'0'.repeat(128):"")])
	if(blob.size > 20000){
		if(tid === "docDescrHdr"){
			errors.push({"id":tid,"type":"file","error":"Description or doc too large. " + blob.size +"bytes"});
		}else{		
			errors.push({"id":tid,"type":"file","error":"Doc too large. " + blob.size +"bytes"});
		}
		ok = false;
	}
	

	if (docText.value.match(/\u002A\//)) {		
		errors.push({"id":tid,"type":"file","error":"Multi-line comments not allowed."});
		ok = false;
	}	
	
	if(
	doctypeselect.value==""||
	docNameHdr.value==""||
	docDescrHdr.value==""||
	docDURL.value==""||
	fileCheckC==""||
	fileCheckS==""||
	docText.value==""||
	filename==""
	){
		ok = false;
	}
	if(filename !=""){
		let test_filename = "";
		test_filename = filename.split('.').pop();

		if("TELA-"+test_filename.toUpperCase()+"-1" != doctypeselect.value){
			errors.push({"id":tid,"error":"File Extension doesn't match selected document type."});
			ok = false;
		}
		if(install_docs.length > 0){
			let full_loc = docSubDir.value + docNameHdr.value;
			for (let x in install_docs) {
				if(full_loc == install_docs[x].subdir + install_docs[x].filename){
					errors.push({"id":tid,"error":"Doc already added!"});
					ok = false;
				}
			}
		}	
		if(installed_docs.length > 0){
			let full_loc = docSubDir.value + docNameHdr.value;
			for (let x in installed_docs) {
				if(full_loc == installed_docs[x].subdir + installed_docs[x].filename){
					errors.push({"id":tid,"error":"Doc already installed!"});
					ok = false;
				}
			}
		}			
	}	
	return {"ok":ok,"errors":errors};
}


var fileCheckC = "";
var fileCheckS = "";

var filename="";
var install_docs = [];
var installed_docs = [];
var fileContents = document.querySelector('input#open_file[type="file"]');
fileContents.addEventListener('change', async (e) => {

	if(fileContents.files.length !== 1){
		docText.value=""
		filename=""
		docNameHdr.value=""
		fileContents.value=""
		fileCheckC=""
		fileCheckS=""
		docEdit(e)
		return
	}
    let file = fileContents.files[0]
    let reader = new FileReader()
    reader.onload = async () => {
		docText.value = reader.result
		filename = file.name
		docNameHdr.value = filename
        fileCheckC=""
		fileCheckS=""
		docEdit('open_file');
		let signature = false
		let result = errors.find(obj => obj.type === "file");
		if(typeof result === "undefined"){
			signature = await signData(docText.value)
		}
		if(!signature){
			docText.value=""
			filename=""
			docNameHdr.value=""
			fileContents.value=""
			fileCheckC=""
			fileCheckS=""
			docEdit(e)
			return
		}

		let signs = parseSignedFile(signature);
		fileCheckC = signs.C;
		fileCheckS = signs.S;
		docEdit('open_file');

    }
    reader.readAsText(file)
});


function parseSignedFile(signed){
	let c = signed.split('C: ', 2)[1];
	let s = c.split('S: ', 2)[1];
	c = c.split(/\r?\n/, 2)[0];
	s = s.split(/\r?\n/, 2)[0];
	return {"C":c,"S":s};
}


var smartcontract = gbid('smartcontract');
var docText = gbid('document');
var addDocButton = gbid('addDoc');
var deployDocsButton = gbid('deployDocs');

function getQuoteJSON(smart_contract){
	let quoteJSON = {};
	quoteJSON.jsonrpc = "2.0";
	quoteJSON.id = "1";
	quoteJSON.method = "DERO.GetGasEstimate";
	quoteJSON.params = {};
	quoteJSON.params.transfers = [{
		destination: rando_dest,
		amount:0,
		Burn:0,
		payload_rpc:[] 
	}];
	quoteJSON.params.sc = smart_contract;
	quoteJSON.params.sc_value = 0;
	quoteJSON.params.sc_rpc = [];
	quoteJSON.params.ringsize = 2;
	quoteJSON.params.signer = rando_signer;
	return quoteJSON;
}

addDocButton.addEventListener('click', function(event) {
	let quoteJSON = getQuoteJSON(smartcontract.value);
	let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001))  +" DERO, Add Doc to Queue?");
	if (result) {
		addDoc();
	} else {
		alert("Action canceled.");
	}
});


deployDocsButton.addEventListener('click', async function(event) {
	let total_length = 0;
	for (let x in install_docs) {
		total_length += install_docs[x].contract.length;
	}
	let result = confirm("Estimated Total Cost for Docs: "+(niceRound(total_length * 2 * .00001))  +" DERO, Continue?");
	if (result) {
		deployDocsButton.setAttribute("disabled", true);
		await installDocs();
		alert("Documents Installed, Create an Index Next.");
		 if(install_docs.length != 0){
			deployDocsButton.removeAttribute("disabled")
		 }	
	} else {
		alert("Action canceled.");
	}

});

//Install JSON
function getInstallJSON(smart_contract){
	let installJSON = {};
	installJSON.jsonrpc = "2.0";
	installJSON.id = "1";
	installJSON.method = "transfer";
	installJSON.params = {};
	installJSON.params.fees = 0;
	installJSON.params.transfers = [{
		destination: rando_dest,
		amount:0,
		Burn:0,
		payload_rpc:[] 
	}];
	installJSON.params.sc = smart_contract;
	installJSON.params.sc_value = 0;
	installJSON.params.sc_rpc = [];
	installJSON.params.ringsize = 2;
	return installJSON;
}

async function signData(data){	
	let JSONR = {};
	JSONR.jsonrpc = "2.0";
	JSONR.id = "0";
	JSONR.method = "SignData";
	JSONR.params = btoa(data);
	response = await socketSend(JSONR);
	if(response.result){
		return atob(response.result.signature);
	}else if(response.error){
		alert(response.error.message);		
	}
	return false;
}
function installList(){
	let text=""
	for (let x in install_docs) {
		text += (install_docs[x].subdir !=""? install_docs[x].subdir + "/" :"") + install_docs[x].filename +"<br>"
	}
	return text
}
//Add Doc function
async function addDoc(){

	install_docs.push({"subdir":docSubDir.value.replace(/^\/|\/|\/$/g, ''),"filename":filename,"docnamehdr":docNameHdr.value,"contract":smartcontract.value})
	docNameHdr.value=""
	filename=""
	fileContents.value=""
	fileCheckC=""
	fileCheckS=""
	gbid("install_output").innerHTML = installList();
	docEdit('')	
}
let checked = false
//Install Docs function
async function installDocs(){   

	if(install_docs.length > 0){
        if(!checked){
            checked = true;
            let txid = await docInTransfers(install_docs[0].contract);
            if(txid != ""){
                docInstalled(install_docs[0],txid)
                return await installDocs();
            }
        }
		
        let progress =  await installDoc(install_docs[0])
		if(progress !== "success"){
			gbid("installed_output").innerHTML = "Error occurred:"+ progress + "<br>" + gbid("installed_output").innerHTML;
		}
		return await installDocs();		
	}
    checked = false
	return true
}
//Install Doc function
async function installDoc(doc){
	let response = await socketSend(getInstallJSON(doc.contract));
	if(response.result){
		let installed = await confirmation(response.result.txid)
		if (!installed) {
			return "Problem Installing Doc, try again. TXID:"+response.result.txid
		}
		docInstalled(doc,response.result.txid)
		return "success"
	}else if(response.error){
       let txid = await findSC(doc.contract)
        if(txid != ''){
            docInstalled(doc,txid)
            return "success"
        }
		return response.error.message
	}		
}

//installed
function docInstalled(doc,txid){ 
    installed_docs.push({"subdir":doc.subdir,"filename":doc.filename,"scid":txid});
    install_docs.shift();
    gbid("install_output").innerHTML = installList();

    let outputText ="";
    for (let x in installed_docs) {
        outputText += (installed_docs[x].subdir !=""? installed_docs[x].subdir + "/" :"") + installed_docs[x].filename  + ":" + installed_docs[x].scid +"<br>";
    }
    let totdocs = install_docs.length + installed_docs.length;		
    let msg = "Installed Doc #"+installed_docs.length + " of "+ totdocs + "<br>"
    if(installed_docs.length == totdocs){
        msg = totdocs + " docs installed.<br>"
    }
    gbid("installed_output").innerHTML = msg + outputText;
   
}


//Install Index function
async function installIndex(){
	let response = await socketSend(getInstallJSON(indexSCCode.value));
	if(response.result){
		let installed = await confirmation(response.result.txid)
		if (!installed) {
			alert("Problem Installing Index, try again. TXID:"+response.result.txid);
			return false;
		}
		gbid("indexscid").innerHTML = "Tela Site Index SCID:" + response.result.txid;
		alert("Congrats, you're all done! This is your Tela Site SCID:" + response.result.txid);
	}else if(response.error){
		alert(response.error.message);
	}		
	
}


var indexNameHdr = gbid('indexNameHdr');
var indexDescrHdr = gbid('indexDescrHdr');
var indexIconURLHdr = gbid('indexIconURLHdr');
var indexDURL = gbid('indexDURL');
var indexSCCode = gbid('indexSCCode');

var deployIndexButton = gbid('deployIndex');
var generateIndexButton = gbid('generateIndex');


var indexinputs = [indexNameHdr,indexDescrHdr,indexIconURLHdr,indexDURL];
indexinputs.forEach((input) => {
	input.addEventListener("keyup", indexEdit);
	input.addEventListener("change", indexEdit);
	input.addEventListener("blur", indexEdit);
});

function indexEdit(event) {

	let docs ="";
	let line_no = 40;
	for (let x in installed_docs) {
		docs += (line_no++) + ` STORE("DOC`+(parseFloat(x) + 1) + `", "` +installed_docs[x].scid + `")`+"\n";
	}
	indexSCCode.value = getIndexSC(docs);

	let ok = checkIndexInputs();
    if(ok.ok){
		deployIndexButton.removeAttribute("disabled");
	}else{
		deployIndexButton.setAttribute("disabled", true);
	}
	if(ok.errors.length != 0){
		let errorsText = "";
		for (const error of ok.errors) {
			errorsText = error + errorsText + "\n";
		}
		alert(errorsText);
	}
}


deployIndexButton.addEventListener('click', function(event) {
	let quoteJSON = getQuoteJSON(indexSCCode.value);
	let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001))  +" DERO, Install Tela-Index?");
	if (result) {
		installIndex(indexSCCode.value);
	} else {
		console.log("Action canceled.");
	}
});


function checkIndexInputs(){
	let ok = true;
	let ierrors = [];
	blob = new Blob([indexSCCode.value]);
	if(blob.size > 20000){
		ierrors.push("Doc too large.");
		ok = false;
	}
	if(
	indexNameHdr.value==""||
	indexDescrHdr.value==""||
	indexDURL.value==""||
	indexSCCode.value==""||
	installed_docs.length == 0
	){
		ok = false;
	}
	return {"ok":ok,"errors":ierrors};
}

function niceRound(number){
	return Math.round(number*100000000)/100000000;
}

async function getHeight(){   
	let JSONR = {};
	JSONR.jsonrpc = "2.0";
	JSONR.method = "DERO.GetHeight";
	response = await socketSend(JSONR);
	if(response.result){
		return response.result.height;
	}else if(response.error){
		alert(response.error.message);
	}		
}

async function getTxStatus(txid){
	let JSONR = {};
	JSONR.jsonrpc = "2.0";
	JSONR.id = 0;
	JSONR.method = "DERO.GetTransaction";
	JSONR.params = {};
	JSONR.params.txs_hashes = [txid];

	response = await socketSend(JSONR);
	if(response.result){
		if(response.result.status){
			if(response.result.status == "OK"){
				if(response.result.txs != null){
					let tx = response.result.txs[0];
					if ((!tx.in_pool && tx.valid_block=="")||tx.ignored) {
						return false
					}else if(tx.in_pool){
						return false
					}else{
						return true
					}			
				}				
			}
		}
		return false;
	}else if(response.error){
		console.log(response.error.message);
		return "error"
	}
}

var confirm_height=0;
async function confirmation(txid) {
	confirm_height = await getHeight();
	return new Promise(function (resolve) {		
		let attempts = 0;		
			
		const attempt = async() => {	
			attempts++;
			let this_height = await getHeight();			
			if(this_height > confirm_height){
				if(attempts > 36){
					clearInterval(retryTimer);
					resolve(false)
				}		
				let status_ok = await getTxStatus(txid)
				if(status_ok === true){
					clearTimeout(retryTimer);
					resolve(true)
				}else if(status_ok==="error"){
					attempts=attempts>0?attempts-1:0
				}
			}
		}
		let retryTimer = setInterval(attempt, 2000)			
	})   
}

var find_height=0;
async function findSC(contract) {
	find_height = await getHeight();
	return new Promise(function (resolve) {		
		let attempts = 0;		
			
		const attempt = async() => {	
			attempts++;
			let this_height = await getHeight();			
			if(this_height > find_height){
				if(attempts > 27){
					clearInterval(retryTimer);
					resolve('')
				}		
				let txid = await docInTransfers(contract)
				if(txid != ""){
					clearTimeout(retryTimer);
					resolve(txid)
				}
			}
		}
		let retryTimer = setInterval(attempt, 2000)			
	})   
}

//Gets the list of outgoing transfers
async function docInTransfers(contract){
   
    let JSONObj = {};
	JSONObj.jsonrpc = "2.0";
	JSONObj.method = "GetTransfers";
	JSONObj.params = {};
	JSONObj.params.out = true;
	JSONObj.params.in = false;
    //JSONObj.params.min_height = parseInt(confirm_height)

    let response = await socketSend(JSONObj);
	if(response.result){
        let entries = response.result.entries
        if(entries.length>0){
            let entries = response.result.entries
            if(contract == await getSCCode(entries[entries.length-1].txid)) {
                return entries[entries.length-1].txid;
            }            
        }
		return ""
	}else if(response.error){
		console.log(response.error.message);
        return ""
	}		
}


async function getSCCode(txid){
let JSONR = {};
	JSONR.jsonrpc = "2.0";
	JSONR.method = "DERO.GetSC";
	JSONR.params = {};
	JSONR.params.scid = "";
	JSONR.params.code = true;
	JSONR.params.variables = false;
	JSONR.params.scid = txid;
	let response = await socketSend(JSONR);
	if(response.result){
		if(typeof response.result !== 'undefined' && typeof response.result.code !== 'undefined'){		
			return response.result.code				
		}
	}	
    return ""
}
*/
SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:'// Copyright 2024. Civilware. All rights reserved. // TELA Decentralized Web Document (TELA-DOC-1) Function InitializePrivate() Uint64 10 IF init() == 0 THEN GOTO 30 20 RETURN 1 30 STORE("nameHdr", "scripts.js") 31 STORE("descrHdr", "JS") 32 STORE("iconURLHdr", "") 33 STORE("dURL", "scripts.js") 34 STORE("docType", "TELA-JS-1") 35 STORE("subDir", "js") 36 STORE("fileCheckC", "24d50d6679318ca0a011ad2796aa801d7d9e9ab7f45f6063b8db5ec78e532174") 37 STORE("fileCheckS", "2e0be3fdd7f89686f8344ec71f075dc468af1025853d2cec25256c2b18f9f401") 100 RETURN 0 End Function Function init() Uint64 10 IF EXISTS("owner") == 0 THEN GOTO 30 20 RETURN 1 30 STORE("owner", address()) 50 STORE("docVersion", "1.0.0") 60 STORE("hash", HEX(TXID())) 70 STORE("likes", 0) 80 STORE("dislikes", 0) 100 RETURN 0 End Function Function address() String 10 DIM s as String 20 LET s = SIGNER() 30 IF IS_ADDRESS_VALID(s) THEN GOTO 50 40 RETURN "anon" 50 RETURN ADDRESS_STRING(s) End Function Function Rate(r Uint64) Uint64 10 DIM addr as String 15 LET addr = address() 16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30 20 RETURN 1 30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT()) 40 IF r < 50 THEN GOTO 70 50 STORE("likes", LOAD("likes")+1) 60 RETURN 0 70 STORE("dislikes", LOAD("dislikes")+1) 100 RETURN 0 End Function /*function gbid(elid){ return document.getElementById(elid); } var rando_dest="dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270"//"deto1qyvyeyzrcm2fzf6kyq7egkes2ufgny5xn77y6typhfx9s7w3mvyd5qqynr5hx""deto1qy2nxgts7wdn28ckc4l2tewphjcppqjfj69ddkxjn0ay8hlsjx73jqgmat5s8"// var rando_signer=rando_dest var doctypeselect = gbid('doc_type'); var docNameHdr = gbid('docNameHdr'); var docDescrHdr = gbid('docDescrHdr'); var docIconURLHdr = gbid('docIconURLHdr'); var docDURL = gbid('docDURL'); var docSubDir = gbid('docSubDir'); var docinputs = [docNameHdr,docDescrHdr,docIconURLHdr,docDURL,docSubDir]; docinputs.forEach((input) => { input.addEventListener("keyup", docEdit); input.addEventListener("change", docEdit); input.addEventListener("blur", docEdit); }); doctypeselect.addEventListener("change", docEdit); function docEdit(eventorid) { smartcontract.value = getDocSCCode(); let last_errors = errors.map(a => a.error); let tid = ''; if(eventorid instanceof String || typeof eventorid === 'string'){ tid = eventorid; }else{ tid = eventorid.target.id; } let ok = checkDocInputs(tid); if(ok.ok){ addDocButton.removeAttribute("disabled"); }else { addDocButton.setAttribute("disabled", true); } if(install_docs.length != 0){ deployDocsButton.removeAttribute("disabled"); }else { deployDocsButton.setAttribute("disabled", true); } let same_error = JSON.stringify(ok.errors.map(a => a.error)) === JSON.stringify(last_errors); if(gbid('dwarn') && (!same_error || ok.errors.length === 0)){gbid('dwarn').remove();} if(ok.errors.length != 0){ let errorsText = ""; for (const error of ok.errors) { errorsText = error.error + errorsText + "\n"; if(error.id !=='' && !same_error){ let warn = document.createElement("p"); warn.innerText = error.error; warn.id ="dwarn"; warn.style.color = "red"; gbid(error.id).after(warn); } } if(!same_error){ alert(errorsText); } } } var errors = []; function checkDocInputs(tid){ let ok = true; errors = []; blob = new Blob([JSON.stringify(getQuoteJSON(smartcontract.value))+(fileCheckC ==""?'0'.repeat(128):"")]) if(blob.size > 20000){ if(tid === "docDescrHdr"){ errors.push({"id":tid,"type":"file","error":"Description or doc too large. " + blob.size +"bytes"}); }else{ errors.push({"id":tid,"type":"file","error":"Doc too large. " + blob.size +"bytes"}); } ok = false; } if (docText.value.match(/\u002A\//)) { errors.push({"id":tid,"type":"file","error":"Multi-line comments not allowed."}); ok = false; } if( doctypeselect.value==""|| docNameHdr.value==""|| docDescrHdr.value==""|| docDURL.value==""|| fileCheckC==""|| fileCheckS==""|| docText.value==""|| filename=="" ){ ok = false; } if(filename !=""){ let test_filename = ""; test_filename = filename.split('.').pop(); if("TELA-"+test_filename.toUpperCase()+"-1" != doctypeselect.value){ errors.push({"id":tid,"error":"File Extension doesn't match selected document type."}); ok = false; } if(install_docs.length > 0){ let full_loc = docSubDir.value + docNameHdr.value; for (let x in install_docs) { if(full_loc == install_docs[x].subdir + install_docs[x].filename){ errors.push({"id":tid,"error":"Doc already added!"}); ok = false; } } } if(installed_docs.length > 0){ let full_loc = docSubDir.value + docNameHdr.value; for (let x in installed_docs) { if(full_loc == installed_docs[x].subdir + installed_docs[x].filename){ errors.push({"id":tid,"error":"Doc already installed!"}); ok = false; } } } } return {"ok":ok,"errors":errors}; } var fileCheckC = ""; var fileCheckS = ""; var filename=""; var install_docs = []; var installed_docs = []; var fileContents = document.querySelector('input#open_file[type="file"]'); fileContents.addEventListener('change', async (e) => { if(fileContents.files.length !== 1){ docText.value="" filename="" docNameHdr.value="" fileContents.value="" fileCheckC="" fileCheckS="" docEdit(e) return } let file = fileContents.files[0] let reader = new FileReader() reader.onload = async () => { docText.value = reader.result filename = file.name docNameHdr.value = filename fileCheckC="" fileCheckS="" docEdit('open_file'); let signature = false let result = errors.find(obj => obj.type === "file"); if(typeof result === "undefined"){ signature = await signData(docText.value) } if(!signature){ docText.value="" filename="" docNameHdr.value="" fileContents.value="" fileCheckC="" fileCheckS="" docEdit(e) return } let signs = parseSignedFile(signature); fileCheckC = signs.C; fileCheckS = signs.S; docEdit('open_file'); } reader.readAsText(file) }); function parseSignedFile(signed){ let c = signed.split('C: ', 2)[1]; let s = c.split('S: ', 2)[1]; c = c.split(/\r?\n/, 2)[0]; s = s.split(/\r?\n/, 2)[0]; return {"C":c,"S":s}; } var smartcontract = gbid('smartcontract'); var docText = gbid('document'); var addDocButton = gbid('addDoc'); var deployDocsButton = gbid('deployDocs'); function getQuoteJSON(smart_contract){ let quoteJSON = {}; quoteJSON.jsonrpc = "2.0"; quoteJSON.id = "1"; quoteJSON.method = "DERO.GetGasEstimate"; quoteJSON.params = {}; quoteJSON.params.transfers = [{ destination: rando_dest, amount:0, Burn:0, payload_rpc:[] }]; quoteJSON.params.sc = smart_contract; quoteJSON.params.sc_value = 0; quoteJSON.params.sc_rpc = []; quoteJSON.params.ringsize = 2; quoteJSON.params.signer = rando_signer; return quoteJSON; } addDocButton.addEventListener('click', function(event) { let quoteJSON = getQuoteJSON(smartcontract.value); let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001)) +" DERO, Add Doc to Queue?"); if (result) { addDoc(); } else { alert("Action canceled."); } }); deployDocsButton.addEventListener('click', async function(event) { let total_length = 0; for (let x in install_docs) { total_length += install_docs[x].contract.length; } let result = confirm("Estimated Total Cost for Docs: "+(niceRound(total_length * 2 * .00001)) +" DERO, Continue?"); if (result) { deployDocsButton.setAttribute("disabled", true); await installDocs(); alert("Documents Installed, Create an Index Next."); if(install_docs.length != 0){ deployDocsButton.removeAttribute("disabled") } } else { alert("Action canceled."); } }); //Install JSON function getInstallJSON(smart_contract){ let installJSON = {}; installJSON.jsonrpc = "2.0"; installJSON.id = "1"; installJSON.method = "transfer"; installJSON.params = {}; installJSON.params.fees = 0; installJSON.params.transfers = [{ destination: rando_dest, amount:0, Burn:0, payload_rpc:[] }]; installJSON.params.sc = smart_contract; installJSON.params.sc_value = 0; installJSON.params.sc_rpc = []; installJSON.params.ringsize = 2; return installJSON; } async function signData(data){ let JSONR = {}; JSONR.jsonrpc = "2.0"; JSONR.id = "0"; JSONR.method = "SignData"; JSONR.params = btoa(data); response = await socketSend(JSONR); if(response.result){ return atob(response.result.signature); }else if(response.error){ alert(response.error.message); } return false; } function installList(){ let text="" for (let x in install_docs) { text += (install_docs[x].subdir !=""? install_docs[x].subdir + "/" :"") + install_docs[x].filename +"<br>" } return text } //Add Doc function async function addDoc(){ install_docs.push({"subdir":docSubDir.value.replace(/^\/|\/|\/$/g, ''),"filename":filename,"docnamehdr":docNameHdr.value,"contract":smartcontract.value}) docNameHdr.value="" filename="" fileContents.value="" fileCheckC="" fileCheckS="" gbid("install_output").innerHTML = installList(); docEdit('') } let checked = false //Install Docs function async function installDocs(){ if(install_docs.length > 0){ if(!checked){ checked = true; let txid = await docInTransfers(install_docs[0].contract); if(txid != ""){ docInstalled(install_docs[0],txid) return await installDocs(); } } let progress = await installDoc(install_docs[0]) if(progress !== "success"){ gbid("installed_output").innerHTML = "Error occurred:"+ progress + "<br>" + gbid("installed_output").innerHTML; } return await installDocs(); } checked = false return true } //Install Doc function async function installDoc(doc){ let response = await socketSend(getInstallJSON(doc.contract)); if(response.result){ let installed = await confirmation(response.result.txid) if (!installed) { return "Problem Installing Doc, try again. TXID:"+response.result.txid } docInstalled(doc,response.result.txid) return "success" }else if(response.error){ let txid = await findSC(doc.contract) if(txid != ''){ docInstalled(doc,txid) return "success" } return response.error.message } } //installed function docInstalled(doc,txid){ installed_docs.push({"subdir":doc.subdir,"filename":doc.filename,"scid":txid}); install_docs.shift(); gbid("install_output").innerHTML = installList(); let outputText =""; for (let x in installed_docs) { outputText += (installed_docs[x].subdir !=""? installed_docs[x].subdir + "/" :"") + installed_docs[x].filename + ":" + installed_docs[x].scid +"<br>"; } let totdocs = install_docs.length + installed_docs.length; let msg = "Installed Doc #"+installed_docs.length + " of "+ totdocs + "<br>" if(installed_docs.length == totdocs){ msg = totdocs + " docs installed.<br>" } gbid("installed_output").innerHTML = msg + outputText; } //Install Index function async function installIndex(){ let response = await socketSend(getInstallJSON(indexSCCode.value)); if(response.result){ let installed = await confirmation(response.result.txid) if (!installed) { alert("Problem Installing Index, try again. TXID:"+response.result.txid); return false; } gbid("indexscid").innerHTML = "Tela Site Index SCID:" + response.result.txid; alert("Congrats, you're all done! This is your Tela Site SCID:" + response.result.txid); }else if(response.error){ alert(response.error.message); } } var indexNameHdr = gbid('indexNameHdr'); var indexDescrHdr = gbid('indexDescrHdr'); var indexIconURLHdr = gbid('indexIconURLHdr'); var indexDURL = gbid('indexDURL'); var indexSCCode = gbid('indexSCCode'); var deployIndexButton = gbid('deployIndex'); var generateIndexButton = gbid('generateIndex'); var indexinputs = [indexNameHdr,indexDescrHdr,indexIconURLHdr,indexDURL]; indexinputs.forEach((input) => { input.addEventListener("keyup", indexEdit); input.addEventListener("change", indexEdit); input.addEventListener("blur", indexEdit); }); function indexEdit(event) { let docs =""; let line_no = 40; for (let x in installed_docs) { docs += (line_no++) + ` STORE("DOC`+(parseFloat(x) + 1) + `", "` +installed_docs[x].scid + `")`+"\n"; } indexSCCode.value = getIndexSC(docs); let ok = checkIndexInputs(); if(ok.ok){ deployIndexButton.removeAttribute("disabled"); }else{ deployIndexButton.setAttribute("disabled", true); } if(ok.errors.length != 0){ let errorsText = ""; for (const error of ok.errors) { errorsText = error + errorsText + "\n"; } alert(errorsText); } } deployIndexButton.addEventListener('click', function(event) { let quoteJSON = getQuoteJSON(indexSCCode.value); let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001)) +" DERO, Install Tela-Index?"); if (result) { installIndex(indexSCCode.value); } else { console.log("Action canceled."); } }); function checkIndexInputs(){ let ok = true; let ierrors = []; blob = new Blob([indexSCCode.value]); if(blob.size > 20000){ ierrors.push("Doc too large."); ok = false; } if( indexNameHdr.value==""|| indexDescrHdr.value==""|| indexDURL.value==""|| indexSCCode.value==""|| installed_docs.length == 0 ){ ok = false; } return {"ok":ok,"errors":ierrors}; } function niceRound(number){ return Math.round(number*100000000)/100000000; } async function getHeight(){ let JSONR = {}; JSONR.jsonrpc = "2.0"; JSONR.method = "DERO.GetHeight"; response = await socketSend(JSONR); if(response.result){ return response.result.height; }else if(response.error){ alert(response.error.message); } } async function getTxStatus(txid){ let JSONR = {}; JSONR.jsonrpc = "2.0"; JSONR.id = 0; JSONR.method = "DERO.GetTransaction"; JSONR.params = {}; JSONR.params.txs_hashes = [txid]; response = await socketSend(JSONR); if(response.result){ if(response.result.status){ if(response.result.status == "OK"){ if(response.result.txs != null){ let tx = response.result.txs[0]; if ((!tx.in_pool && tx.valid_block=="")||tx.ignored) { return false }else if(tx.in_pool){ return false }else{ return true } } } } return false; }else if(response.error){ console.log(response.error.message); return "error" } } var confirm_height=0; async function confirmation(txid) { confirm_height = await getHeight(); return new Promise(function (resolve) { let attempts = 0; const attempt = async() => { attempts++; let this_height = await getHeight(); if(this_height > confirm_height){ if(attempts > 36){ clearInterval(retryTimer); resolve(false) } let status_ok = await getTxStatus(txid) if(status_ok === true){ clearTimeout(retryTimer); resolve(true) }else if(status_ok==="error"){ attempts=attempts>0?attempts-1:0 } } } let retryTimer = setInterval(attempt, 2000) }) } var find_height=0; async function findSC(contract) { find_height = await getHeight(); return new Promise(function (resolve) { let attempts = 0; const attempt = async() => { attempts++; let this_height = await getHeight(); if(this_height > find_height){ if(attempts > 27){ clearInterval(retryTimer); resolve('') } let txid = await docInTransfers(contract) if(txid != ""){ clearTimeout(retryTimer); resolve(txid) } } } let retryTimer = setInterval(attempt, 2000) }) } //Gets the list of outgoing transfers async function docInTransfers(contract){ let JSONObj = {}; JSONObj.jsonrpc = "2.0"; JSONObj.method = "GetTransfers"; JSONObj.params = {}; JSONObj.params.out = true; JSONObj.params.in = false; //JSONObj.params.min_height = parseInt(confirm_height) let response = await socketSend(JSONObj); if(response.result){ let entries = response.result.entries if(entries.length>0){ let entries = response.result.entries if(contract == await getSCCode(entries[entries.length-1].txid)) { return entries[entries.length-1].txid; } } return "" }else if(response.error){ console.log(response.error.message); return "" } } async function getSCCode(txid){ let JSONR = {}; JSONR.jsonrpc = "2.0"; JSONR.method = "DERO.GetSC"; JSONR.params = {}; JSONR.params.scid = ""; JSONR.params.code = true; JSONR.params.variables = false; JSONR.params.scid = txid; let response = await socketSend(JSONR); if(response.result){ if(typeof response.result !== 'undefined' && typeof response.result.code !== 'undefined'){ return response.result.code } } return "" } */']


Prove to someone that you have sent them DERO in this transaction

proof can be obtained using wallet command in dero-wallet-cli or from the statement
Note: proof is sent to the server, as the calculations are done on the server side


TX hex bytes
0100000500d182f50262e877e1ddd84c5b2df947f37234d3db370b9c4dedd1ced0ea719a6ce7e9e04e01000000000000000000000000000000000000000000000000000000000000000000010a69f733be75674d2a0040db20f0e5f1941d56bbcf5c88e9aeab5a72c837c6ae0170d7c9dfc927066ca2ccb81520404260810095cba34e1cd40e8224c279567349408aa9d2df36f31b34d2986cc593e3a809ef0f8d821f76024a44b3b11a570834533b3d12bd0d92e175b07bfdec2742765048cc8d2d17924c86092358337d37ad9249564c11508be2fe58af073f9c79740105b6c8011a4211874c0e3cb80d1fb06b3ead5e0d637932dec74d828340f8672898f06ef9010652cc4b75635d6e4e24045ddc739c49fca37afb426265cdcebc5ceb46d299eea649a2d4f6fc71d89edc0127379fcc9e5dab07a08e499215e34369da62b0429a2983ed87262327837aa19c016a5645f0f3327afa81ba588af581c0d041aa6014ab29925b0c3563ccfb3ddf93ff8401a26853435f434f4445537942662f2f2020436f7079726967687420323032342e20436976696c776172652e20416c6c207269676874732072657365727665642e0a2f2f202054454c4120446563656e7472616c697a65642057656220446f63756d656e74202854454c412d444f432d31290a46756e6374696f6e20496e697469616c697a655072697661746528292055696e7436340a313020494620696e69742829203d3d2030205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528226e616d65486472222c2022736372697074732e6a7322290a33312053544f524528226465736372486472222c20224a5322290a33322053544f5245282269636f6e55524c486472222c202222290a33332053544f524528226455524c222c2022736372697074732e6a7322290a33342053544f52452822646f6354797065222c202254454c412d4a532d3122290a33352053544f52452822737562446972222c20226a7322290a33362053544f5245282266696c65436865636b43222c20223234643530643636373933313863613061303131616432373936616138303164376439653961623766343566363036336238646235656337386535333231373422290a33372053544f5245282266696c65436865636b53222c20223265306265336664643766383936383666383334346563373166303735646334363861663130323538353364326365633235323536633262313866396634303122290a3130302052455455524e20300a456e642046756e6374696f6e0a0a46756e6374696f6e20696e697428292055696e7436340a31302049462045584953545328226f776e65722229203d3d2030205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528226f776e6572222c20616464726573732829290a35302053544f52452822646f6356657273696f6e222c2022312e302e3022290a36302053544f5245282268617368222c204845582854584944282929290a37302053544f524528226c696b6573222c2030290a38302053544f524528226469736c696b6573222c2030290a3130302052455455524e20300a456e642046756e6374696f6e0a0a46756e6374696f6e2061646472657373282920537472696e670a31302044494d207320617320537472696e670a3230204c45542073203d205349474e455228290a33302049462049535f414444524553535f56414c4944287329205448454e20474f544f2035300a34302052455455524e2022616e6f6e220a35302052455455524e20414444524553535f535452494e472873290a456e642046756e6374696f6e0a0a46756e6374696f6e205261746528722055696e743634292055696e7436340a31302044494d206164647220617320537472696e670a3135204c45542061646472203d206164647265737328290a31362049462072203c2031303020262620455849535453286164647229203d3d2030202626206164647220213d2022616e6f6e22205448454e20474f544f2033300a32302052455455524e20310a33302053544f524528616464722c2022222b722b225f222b424c4f434b5f4845494748542829290a34302049462072203c203530205448454e20474f544f2037300a35302053544f524528226c696b6573222c204c4f414428226c696b657322292b31290a36302052455455524e20300a37302053544f524528226469736c696b6573222c204c4f414428226469736c696b657322292b31290a3130302052455455524e20300a456e642046756e6374696f6e0a0a2f2a66756e6374696f6e206762696428656c6964297b0a0972657475726e20646f63756d656e742e676574456c656d656e744279496428656c6964293b0a7d0a7661722072616e646f5f646573743d226465726f3171796b797461366e74706432376e6c3079713478747a6166346c733670356539707175306b3278347833707171357861766a73647871676e7938323730222f2f226465746f317179767965797a72636d32667a66366b79713765676b6573327566676e7935786e3737793674797068667839733777336d767964357171796e7235687822226465746f317179326e786774733777646e3238636b63346c3274657770686a637070716a666a363964646b786a6e30617938686c736a7837336a71676d6174357338222f2f0a7661722072616e646f5f7369676e65723d72616e646f5f646573740a76617220646f637479706573656c656374203d20676269642827646f635f7479706527293b0a76617220646f634e616d65486472203d20676269642827646f634e616d6548647227293b0a76617220646f634465736372486472203d20676269642827646f63446573637248647227293b0a76617220646f6349636f6e55524c486472203d20676269642827646f6349636f6e55524c48647227293b0a76617220646f634455524c203d20676269642827646f634455524c27293b0a76617220646f63537562446972203d20676269642827646f6353756244697227293b0a0a76617220646f63696e70757473203d205b646f634e616d654864722c646f6344657363724864722c646f6349636f6e55524c4864722c646f634455524c2c646f635375624469725d3b0a646f63696e707574732e666f72456163682828696e70757429203d3e207b0a09696e7075742e6164644576656e744c697374656e657228226b65797570222c20646f6345646974293b0a09696e7075742e6164644576656e744c697374656e657228226368616e6765222c20646f6345646974293b0a09696e7075742e6164644576656e744c697374656e65722822626c7572222c20646f6345646974293b0a7d293b0a646f637479706573656c6563742e6164644576656e744c697374656e657228226368616e6765222c20646f6345646974293b0a0a66756e6374696f6e20646f6345646974286576656e746f72696429207b200a09736d617274636f6e74726163742e76616c7565203d20676574446f635343436f646528293b0a096c6574206c6173745f6572726f7273203d206572726f72732e6d61702861203d3e20612e6572726f72293b0a096c657420746964203d2027273b0a096966286576656e746f72696420696e7374616e63656f6620537472696e67207c7c20747970656f66206576656e746f726964203d3d3d2027737472696e6727297b09090a0909746964093d206576656e746f7269643b090a097d656c73657b0a0909746964093d206576656e746f7269642e7461726765742e69643b0a097d0a096c6574206f6b203d20636865636b446f63496e7075747328746964293b0a090a202020206966286f6b2e6f6b297b0a0909616464446f63427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c7365207b0a0909616464446f63427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d0a0a20202020696628696e7374616c6c5f646f63732e6c656e67746820213d2030297b0a09096465706c6f79446f6373427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c7365207b0a09096465706c6f79446f6373427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d090a0a0a096c65742073616d655f6572726f72203d204a534f4e2e737472696e67696679286f6b2e6572726f72732e6d61702861203d3e20612e6572726f722929203d3d3d204a534f4e2e737472696e67696679286c6173745f6572726f7273293b0a09696628676269642827647761726e272920262620282173616d655f6572726f72207c7c206f6b2e6572726f72732e6c656e677468203d3d3d203029297b676269642827647761726e27292e72656d6f766528293b7d0a096966286f6b2e6572726f72732e6c656e67746820213d2030297b09090a09096c6574206572726f727354657874203d2022223b0a0909666f722028636f6e7374206572726f72206f66206f6b2e6572726f727329207b0a0909096572726f727354657874203d206572726f722e6572726f72202b206572726f727354657874202b20225c6e223b0a0909096966286572726f722e696420213d3d2727202626202173616d655f6572726f72297b0a090909096c6574207761726e203d20646f63756d656e742e637265617465456c656d656e7428227022293b0a090909097761726e2e696e6e657254657874203d206572726f722e6572726f723b0a090909097761726e2e6964203d22647761726e223b0a090909097761726e2e7374796c652e636f6c6f72203d2022726564223b0a0909090967626964286572726f722e6964292e6166746572287761726e293b0a0909097d0a0909090a09097d200a09096966282173616d655f6572726f72297b0909090a090909616c657274286572726f727354657874293b0a09097d0a097d0a7d0a766172206572726f7273203d205b5d3b0a66756e6374696f6e20636865636b446f63496e7075747328746964297b0a0a096c6574206f6b203d20747275653b0a096572726f7273203d205b5d3b090a09626c6f62203d206e657720426c6f62285b4a534f4e2e737472696e676966792867657451756f74654a534f4e28736d617274636f6e74726163742e76616c756529292b2866696c65436865636b43203d3d22223f2730272e72657065617428313238293a2222295d290a09696628626c6f622e73697a65203e203230303030297b0a0909696628746964203d3d3d2022646f63446573637248647222297b0a0909096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a224465736372697074696f6e206f7220646f6320746f6f206c617267652e2022202b20626c6f622e73697a65202b226279746573227d293b0a09097d656c73657b09090a0909096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a22446f6320746f6f206c617267652e2022202b20626c6f622e73697a65202b226279746573227d293b0a09097d0a09096f6b203d2066616c73653b0a097d0a090a0a0969662028646f63546578742e76616c75652e6d61746368282f5c75303032415c2f2f2929207b09090a09096572726f72732e70757368287b226964223a7469642c2274797065223a2266696c65222c226572726f72223a224d756c74692d6c696e6520636f6d6d656e7473206e6f7420616c6c6f7765642e227d293b0a09096f6b203d2066616c73653b0a097d090a090a096966280a09646f637479706573656c6563742e76616c75653d3d22227c7c0a09646f634e616d654864722e76616c75653d3d22227c7c0a09646f6344657363724864722e76616c75653d3d22227c7c0a09646f634455524c2e76616c75653d3d22227c7c0a0966696c65436865636b433d3d22227c7c0a0966696c65436865636b533d3d22227c7c0a09646f63546578742e76616c75653d3d22227c7c0a0966696c656e616d653d3d22220a09297b0a09096f6b203d2066616c73653b0a097d0a0969662866696c656e616d6520213d2222297b0a09096c657420746573745f66696c656e616d65203d2022223b0a0909746573745f66696c656e616d65203d2066696c656e616d652e73706c697428272e27292e706f7028293b0a0a09096966282254454c412d222b746573745f66696c656e616d652e746f55707065724361736528292b222d312220213d20646f637479706573656c6563742e76616c7565297b0a0909096572726f72732e70757368287b226964223a7469642c226572726f72223a2246696c6520457874656e73696f6e20646f65736e2774206d617463682073656c656374656420646f63756d656e7420747970652e227d293b0a0909096f6b203d2066616c73653b0a09097d0a0909696628696e7374616c6c5f646f63732e6c656e677468203e2030297b0a0909096c65742066756c6c5f6c6f63203d20646f635375624469722e76616c7565202b20646f634e616d654864722e76616c75653b0a090909666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a0909090969662866756c6c5f6c6f63203d3d20696e7374616c6c5f646f63735b785d2e737562646972202b20696e7374616c6c5f646f63735b785d2e66696c656e616d65297b0a09090909096572726f72732e70757368287b226964223a7469642c226572726f72223a22446f6320616c726561647920616464656421227d293b0a09090909096f6b203d2066616c73653b0a090909097d0a0909097d0a09097d090a0909696628696e7374616c6c65645f646f63732e6c656e677468203e2030297b0a0909096c65742066756c6c5f6c6f63203d20646f635375624469722e76616c7565202b20646f634e616d654864722e76616c75653b0a090909666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a0909090969662866756c6c5f6c6f63203d3d20696e7374616c6c65645f646f63735b785d2e737562646972202b20696e7374616c6c65645f646f63735b785d2e66696c656e616d65297b0a09090909096572726f72732e70757368287b226964223a7469642c226572726f72223a22446f6320616c726561647920696e7374616c6c656421227d293b0a09090909096f6b203d2066616c73653b0a090909097d0a0909097d0a09097d0909090a097d090a0972657475726e207b226f6b223a6f6b2c226572726f7273223a6572726f72737d3b0a7d0a0a0a7661722066696c65436865636b43203d2022223b0a7661722066696c65436865636b53203d2022223b0a0a7661722066696c656e616d653d22223b0a76617220696e7374616c6c5f646f6373203d205b5d3b0a76617220696e7374616c6c65645f646f6373203d205b5d3b0a7661722066696c65436f6e74656e7473203d20646f63756d656e742e717565727953656c6563746f722827696e707574236f70656e5f66696c655b747970653d2266696c65225d27293b0a66696c65436f6e74656e74732e6164644576656e744c697374656e657228276368616e6765272c206173796e6320286529203d3e207b0a0a0969662866696c65436f6e74656e74732e66696c65732e6c656e67746820213d3d2031297b0a0909646f63546578742e76616c75653d22220a090966696c656e616d653d22220a0909646f634e616d654864722e76616c75653d22220a090966696c65436f6e74656e74732e76616c75653d22220a090966696c65436865636b433d22220a090966696c65436865636b533d22220a0909646f63456469742865290a090972657475726e0a097d0a202020206c65742066696c65203d2066696c65436f6e74656e74732e66696c65735b305d0a202020206c657420726561646572203d206e65772046696c6552656164657228290a202020207265616465722e6f6e6c6f6164203d206173796e63202829203d3e207b0a0909646f63546578742e76616c7565203d207265616465722e726573756c740a090966696c656e616d65203d2066696c652e6e616d650a0909646f634e616d654864722e76616c7565203d2066696c656e616d650a202020202020202066696c65436865636b433d22220a090966696c65436865636b533d22220a0909646f634564697428276f70656e5f66696c6527293b0a09096c6574207369676e6174757265203d2066616c73650a09096c657420726573756c74203d206572726f72732e66696e64286f626a203d3e206f626a2e74797065203d3d3d202266696c6522293b0a0909696628747970656f6620726573756c74203d3d3d2022756e646566696e656422297b0a0909097369676e6174757265203d206177616974207369676e4461746128646f63546578742e76616c7565290a09097d0a0909696628217369676e6174757265297b0a090909646f63546578742e76616c75653d22220a09090966696c656e616d653d22220a090909646f634e616d654864722e76616c75653d22220a09090966696c65436f6e74656e74732e76616c75653d22220a09090966696c65436865636b433d22220a09090966696c65436865636b533d22220a090909646f63456469742865290a09090972657475726e0a09097d0a0a09096c6574207369676e73203d2070617273655369676e656446696c65287369676e6174757265293b0a090966696c65436865636b43203d207369676e732e433b0a090966696c65436865636b53203d207369676e732e533b0a0909646f634564697428276f70656e5f66696c6527293b0a0a202020207d0a202020207265616465722e726561644173546578742866696c65290a7d293b0a0a0a66756e6374696f6e2070617273655369676e656446696c65287369676e6564297b0a096c65742063203d207369676e65642e73706c69742827433a20272c2032295b315d3b0a096c65742073203d20632e73706c69742827533a20272c2032295b315d3b0a0963203d20632e73706c6974282f5c723f5c6e2f2c2032295b305d3b0a0973203d20732e73706c6974282f5c723f5c6e2f2c2032295b305d3b0a0972657475726e207b2243223a632c2253223a737d3b0a7d0a0a0a76617220736d617274636f6e7472616374203d20676269642827736d617274636f6e747261637427293b0a76617220646f6354657874203d20676269642827646f63756d656e7427293b0a76617220616464446f63427574746f6e203d20676269642827616464446f6327293b0a766172206465706c6f79446f6373427574746f6e203d206762696428276465706c6f79446f637327293b0a0a66756e6374696f6e2067657451756f74654a534f4e28736d6172745f636f6e7472616374297b0a096c65742071756f74654a534f4e203d207b7d3b0a0971756f74654a534f4e2e6a736f6e727063203d2022322e30223b0a0971756f74654a534f4e2e6964203d202231223b0a0971756f74654a534f4e2e6d6574686f64203d20224445524f2e476574476173457374696d617465223b0a0971756f74654a534f4e2e706172616d73203d207b7d3b0a0971756f74654a534f4e2e706172616d732e7472616e7366657273203d205b7b0a090964657374696e6174696f6e3a2072616e646f5f646573742c0a0909616d6f756e743a302c0a09094275726e3a302c0a09097061796c6f61645f7270633a5b5d200a097d5d3b0a0971756f74654a534f4e2e706172616d732e7363203d20736d6172745f636f6e74726163743b0a0971756f74654a534f4e2e706172616d732e73635f76616c7565203d20303b0a0971756f74654a534f4e2e706172616d732e73635f727063203d205b5d3b0a0971756f74654a534f4e2e706172616d732e72696e6773697a65203d20323b0a0971756f74654a534f4e2e706172616d732e7369676e6572203d2072616e646f5f7369676e65723b0a0972657475726e2071756f74654a534f4e3b0a7d0a0a616464446f63427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c2066756e6374696f6e286576656e7429207b0a096c65742071756f74654a534f4e203d2067657451756f74654a534f4e28736d617274636f6e74726163742e76616c7565293b0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420436f73743a20222b286e696365526f756e642871756f74654a534f4e2e706172616d732e73632e6c656e677468202a2032202a202e3030303031292920202b22204445524f2c2041646420446f6320746f2051756575653f22293b0a0969662028726573756c7429207b0a0909616464446f6328293b0a097d20656c7365207b0a0909616c6572742822416374696f6e2063616e63656c65642e22293b0a097d0a7d293b0a0a0a6465706c6f79446f6373427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c206173796e632066756e6374696f6e286576656e7429207b0a096c657420746f74616c5f6c656e677468203d20303b0a09666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a0909746f74616c5f6c656e677468202b3d20696e7374616c6c5f646f63735b785d2e636f6e74726163742e6c656e6774683b0a097d0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420546f74616c20436f737420666f7220446f63733a20222b286e696365526f756e6428746f74616c5f6c656e677468202a2032202a202e3030303031292920202b22204445524f2c20436f6e74696e75653f22293b0a0969662028726573756c7429207b0a09096465706c6f79446f6373427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a0909617761697420696e7374616c6c446f637328293b0a0909616c6572742822446f63756d656e747320496e7374616c6c65642c2043726561746520616e20496e646578204e6578742e22293b0a090920696628696e7374616c6c5f646f63732e6c656e67746820213d2030297b0a0909096465706c6f79446f6373427574746f6e2e72656d6f7665417474726962757465282264697361626c656422290a0909207d090a097d20656c7365207b0a0909616c6572742822416374696f6e2063616e63656c65642e22293b0a097d0a0a7d293b0a0a2f2f496e7374616c6c204a534f4e0a66756e6374696f6e20676574496e7374616c6c4a534f4e28736d6172745f636f6e7472616374297b0a096c657420696e7374616c6c4a534f4e203d207b7d3b0a09696e7374616c6c4a534f4e2e6a736f6e727063203d2022322e30223b0a09696e7374616c6c4a534f4e2e6964203d202231223b0a09696e7374616c6c4a534f4e2e6d6574686f64203d20227472616e73666572223b0a09696e7374616c6c4a534f4e2e706172616d73203d207b7d3b0a09696e7374616c6c4a534f4e2e706172616d732e66656573203d20303b0a09696e7374616c6c4a534f4e2e706172616d732e7472616e7366657273203d205b7b0a090964657374696e6174696f6e3a2072616e646f5f646573742c0a0909616d6f756e743a302c0a09094275726e3a302c0a09097061796c6f61645f7270633a5b5d200a097d5d3b0a09696e7374616c6c4a534f4e2e706172616d732e7363203d20736d6172745f636f6e74726163743b0a09696e7374616c6c4a534f4e2e706172616d732e73635f76616c7565203d20303b0a09696e7374616c6c4a534f4e2e706172616d732e73635f727063203d205b5d3b0a09696e7374616c6c4a534f4e2e706172616d732e72696e6773697a65203d20323b0a0972657475726e20696e7374616c6c4a534f4e3b0a7d0a0a6173796e632066756e6374696f6e207369676e446174612864617461297b090a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6964203d202230223b0a094a534f4e522e6d6574686f64203d20225369676e44617461223b0a094a534f4e522e706172616d73203d2062746f612864617461293b0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a090972657475726e2061746f6228726573706f6e73652e726573756c742e7369676e6174757265293b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b09090a097d0a0972657475726e2066616c73653b0a7d0a66756e6374696f6e20696e7374616c6c4c69737428297b0a096c657420746578743d22220a09666f7220286c6574207820696e20696e7374616c6c5f646f637329207b0a090974657874202b3d2028696e7374616c6c5f646f63735b785d2e73756264697220213d22223f20696e7374616c6c5f646f63735b785d2e737562646972202b20222f22203a222229202b20696e7374616c6c5f646f63735b785d2e66696c656e616d65202b223c62723e220a097d0a0972657475726e20746578740a7d0a2f2f41646420446f632066756e6374696f6e0a6173796e632066756e6374696f6e20616464446f6328297b0a0a09696e7374616c6c5f646f63732e70757368287b22737562646972223a646f635375624469722e76616c75652e7265706c616365282f5e5c2f7c5c2f7c5c2f242f672c202727292c2266696c656e616d65223a66696c656e616d652c22646f636e616d65686472223a646f634e616d654864722e76616c75652c22636f6e7472616374223a736d617274636f6e74726163742e76616c75657d290a09646f634e616d654864722e76616c75653d22220a0966696c656e616d653d22220a0966696c65436f6e74656e74732e76616c75653d22220a0966696c65436865636b433d22220a0966696c65436865636b533d22220a09676269642822696e7374616c6c5f6f757470757422292e696e6e657248544d4c203d20696e7374616c6c4c69737428293b0a09646f634564697428272729090a7d0a6c657420636865636b6564203d2066616c73650a2f2f496e7374616c6c20446f63732066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c446f637328297b2020200a0a09696628696e7374616c6c5f646f63732e6c656e677468203e2030297b0a202020202020202069662821636865636b6564297b0a202020202020202020202020636865636b6564203d20747275653b0a2020202020202020202020206c65742074786964203d20617761697420646f63496e5472616e736665727328696e7374616c6c5f646f63735b305d2e636f6e7472616374293b0a2020202020202020202020206966287478696420213d202222297b0a20202020202020202020202020202020646f63496e7374616c6c656428696e7374616c6c5f646f63735b305d2c74786964290a2020202020202020202020202020202072657475726e20617761697420696e7374616c6c446f637328293b0a2020202020202020202020207d0a20202020202020207d0a09090a20202020202020206c65742070726f6772657373203d2020617761697420696e7374616c6c446f6328696e7374616c6c5f646f63735b305d290a090969662870726f677265737320213d3d20227375636365737322297b0a090909676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c203d20224572726f72206f636375727265643a222b2070726f6772657373202b20223c62723e22202b20676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c3b0a09097d0a090972657475726e20617761697420696e7374616c6c446f637328293b09090a097d0a20202020636865636b6564203d2066616c73650a0972657475726e20747275650a7d0a2f2f496e7374616c6c20446f632066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c446f6328646f63297b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e6428676574496e7374616c6c4a534f4e28646f632e636f6e747261637429293b0a09696628726573706f6e73652e726573756c74297b0a09096c657420696e7374616c6c6564203d20617761697420636f6e6669726d6174696f6e28726573706f6e73652e726573756c742e74786964290a09096966202821696e7374616c6c656429207b0a09090972657475726e202250726f626c656d20496e7374616c6c696e6720446f632c2074727920616761696e2e20545849443a222b726573706f6e73652e726573756c742e747869640a09097d0a0909646f63496e7374616c6c656428646f632c726573706f6e73652e726573756c742e74786964290a090972657475726e202273756363657373220a097d656c736520696628726573706f6e73652e6572726f72297b0a202020202020206c65742074786964203d2061776169742066696e64534328646f632e636f6e7472616374290a20202020202020206966287478696420213d202727297b0a202020202020202020202020646f63496e7374616c6c656428646f632c74786964290a20202020202020202020202072657475726e202273756363657373220a20202020202020207d0a090972657475726e20726573706f6e73652e6572726f722e6d6573736167650a097d09090a7d0a0a2f2f696e7374616c6c65640a66756e6374696f6e20646f63496e7374616c6c656428646f632c74786964297b200a20202020696e7374616c6c65645f646f63732e70757368287b22737562646972223a646f632e7375626469722c2266696c656e616d65223a646f632e66696c656e616d652c2273636964223a747869647d293b0a20202020696e7374616c6c5f646f63732e736869667428293b0a20202020676269642822696e7374616c6c5f6f757470757422292e696e6e657248544d4c203d20696e7374616c6c4c69737428293b0a0a202020206c6574206f757470757454657874203d22223b0a20202020666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a20202020202020206f757470757454657874202b3d2028696e7374616c6c65645f646f63735b785d2e73756264697220213d22223f20696e7374616c6c65645f646f63735b785d2e737562646972202b20222f22203a222229202b20696e7374616c6c65645f646f63735b785d2e66696c656e616d6520202b20223a22202b20696e7374616c6c65645f646f63735b785d2e73636964202b223c62723e223b0a202020207d0a202020206c657420746f74646f6373203d20696e7374616c6c5f646f63732e6c656e677468202b20696e7374616c6c65645f646f63732e6c656e6774683b09090a202020206c6574206d7367203d2022496e7374616c6c656420446f632023222b696e7374616c6c65645f646f63732e6c656e677468202b2022206f6620222b20746f74646f6373202b20223c62723e220a20202020696628696e7374616c6c65645f646f63732e6c656e677468203d3d20746f74646f6373297b0a20202020202020206d7367203d20746f74646f6373202b202220646f637320696e7374616c6c65642e3c62723e220a202020207d0a20202020676269642822696e7374616c6c65645f6f757470757422292e696e6e657248544d4c203d206d7367202b206f7574707574546578743b0a2020200a7d0a0a0a2f2f496e7374616c6c20496e6465782066756e6374696f6e0a6173796e632066756e6374696f6e20696e7374616c6c496e64657828297b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e6428676574496e7374616c6c4a534f4e28696e6465785343436f64652e76616c756529293b0a09696628726573706f6e73652e726573756c74297b0a09096c657420696e7374616c6c6564203d20617761697420636f6e6669726d6174696f6e28726573706f6e73652e726573756c742e74786964290a09096966202821696e7374616c6c656429207b0a090909616c657274282250726f626c656d20496e7374616c6c696e6720496e6465782c2074727920616761696e2e20545849443a222b726573706f6e73652e726573756c742e74786964293b0a09090972657475726e2066616c73653b0a09097d0a0909676269642822696e6465787363696422292e696e6e657248544d4c203d202254656c61205369746520496e64657820534349443a22202b20726573706f6e73652e726573756c742e747869643b0a0909616c6572742822436f6e67726174732c20796f7527726520616c6c20646f6e6521205468697320697320796f75722054656c61205369746520534349443a22202b20726573706f6e73652e726573756c742e74786964293b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b0a097d09090a090a7d0a0a0a76617220696e6465784e616d65486472203d20676269642827696e6465784e616d6548647227293b0a76617220696e6465784465736372486472203d20676269642827696e646578446573637248647227293b0a76617220696e64657849636f6e55524c486472203d20676269642827696e64657849636f6e55524c48647227293b0a76617220696e6465784455524c203d20676269642827696e6465784455524c27293b0a76617220696e6465785343436f6465203d20676269642827696e6465785343436f646527293b0a0a766172206465706c6f79496e646578427574746f6e203d206762696428276465706c6f79496e64657827293b0a7661722067656e6572617465496e646578427574746f6e203d2067626964282767656e6572617465496e64657827293b0a0a0a76617220696e646578696e70757473203d205b696e6465784e616d654864722c696e64657844657363724864722c696e64657849636f6e55524c4864722c696e6465784455524c5d3b0a696e646578696e707574732e666f72456163682828696e70757429203d3e207b0a09696e7075742e6164644576656e744c697374656e657228226b65797570222c20696e64657845646974293b0a09696e7075742e6164644576656e744c697374656e657228226368616e6765222c20696e64657845646974293b0a09696e7075742e6164644576656e744c697374656e65722822626c7572222c20696e64657845646974293b0a7d293b0a0a66756e6374696f6e20696e64657845646974286576656e7429207b0a0a096c657420646f6373203d22223b0a096c6574206c696e655f6e6f203d2034303b0a09666f7220286c6574207820696e20696e7374616c6c65645f646f637329207b0a0909646f6373202b3d20286c696e655f6e6f2b2b29202b20602053544f52452822444f43602b287061727365466c6f6174287829202b203129202b2060222c202260202b696e7374616c6c65645f646f63735b785d2e73636964202b20602229602b225c6e223b0a097d0a09696e6465785343436f64652e76616c7565203d20676574496e646578534328646f6373293b0a0a096c6574206f6b203d20636865636b496e646578496e7075747328293b0a202020206966286f6b2e6f6b297b0a09096465706c6f79496e646578427574746f6e2e72656d6f7665417474726962757465282264697361626c656422293b0a097d656c73657b0a09096465706c6f79496e646578427574746f6e2e736574417474726962757465282264697361626c6564222c2074727565293b0a097d0a096966286f6b2e6572726f72732e6c656e67746820213d2030297b0a09096c6574206572726f727354657874203d2022223b0a0909666f722028636f6e7374206572726f72206f66206f6b2e6572726f727329207b0a0909096572726f727354657874203d206572726f72202b206572726f727354657874202b20225c6e223b0a09097d0a0909616c657274286572726f727354657874293b0a097d0a7d0a0a0a6465706c6f79496e646578427574746f6e2e6164644576656e744c697374656e65722827636c69636b272c2066756e6374696f6e286576656e7429207b0a096c65742071756f74654a534f4e203d2067657451756f74654a534f4e28696e6465785343436f64652e76616c7565293b0a096c657420726573756c74203d20636f6e6669726d2822457374696d6174656420436f73743a20222b286e696365526f756e642871756f74654a534f4e2e706172616d732e73632e6c656e677468202a2032202a202e3030303031292920202b22204445524f2c20496e7374616c6c2054656c612d496e6465783f22293b0a0969662028726573756c7429207b0a0909696e7374616c6c496e64657828696e6465785343436f64652e76616c7565293b0a097d20656c7365207b0a0909636f6e736f6c652e6c6f672822416374696f6e2063616e63656c65642e22293b0a097d0a7d293b0a0a0a66756e6374696f6e20636865636b496e646578496e7075747328297b0a096c6574206f6b203d20747275653b0a096c657420696572726f7273203d205b5d3b0a09626c6f62203d206e657720426c6f62285b696e6465785343436f64652e76616c75655d293b0a09696628626c6f622e73697a65203e203230303030297b0a0909696572726f72732e707573682822446f6320746f6f206c617267652e22293b0a09096f6b203d2066616c73653b0a097d0a096966280a09696e6465784e616d654864722e76616c75653d3d22227c7c0a09696e64657844657363724864722e76616c75653d3d22227c7c0a09696e6465784455524c2e76616c75653d3d22227c7c0a09696e6465785343436f64652e76616c75653d3d22227c7c0a09696e7374616c6c65645f646f63732e6c656e677468203d3d20300a09297b0a09096f6b203d2066616c73653b0a097d0a0972657475726e207b226f6b223a6f6b2c226572726f7273223a696572726f72737d3b0a7d0a0a66756e6374696f6e206e696365526f756e64286e756d626572297b0a0972657475726e204d6174682e726f756e64286e756d6265722a313030303030303030292f3130303030303030303b0a7d0a0a6173796e632066756e6374696f6e2067657448656967687428297b2020200a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6d6574686f64203d20224445524f2e476574486569676874223b0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a090972657475726e20726573706f6e73652e726573756c742e6865696768743b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909616c65727428726573706f6e73652e6572726f722e6d657373616765293b0a097d09090a7d0a0a6173796e632066756e6374696f6e2067657454785374617475732874786964297b0a096c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6964203d20303b0a094a534f4e522e6d6574686f64203d20224445524f2e4765745472616e73616374696f6e223b0a094a534f4e522e706172616d73203d207b7d3b0a094a534f4e522e706172616d732e7478735f686173686573203d205b747869645d3b0a0a09726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a0909696628726573706f6e73652e726573756c742e737461747573297b0a090909696628726573706f6e73652e726573756c742e737461747573203d3d20224f4b22297b0a09090909696628726573706f6e73652e726573756c742e74787320213d206e756c6c297b0a09090909096c6574207478203d20726573706f6e73652e726573756c742e7478735b305d3b0a090909090969662028282174782e696e5f706f6f6c2026262074782e76616c69645f626c6f636b3d3d2222297c7c74782e69676e6f72656429207b0a09090909090972657475726e2066616c73650a09090909097d656c73652069662874782e696e5f706f6f6c297b0a09090909090972657475726e2066616c73650a09090909097d656c73657b0a09090909090972657475726e20747275650a09090909097d0909090a090909097d090909090a0909097d0a09097d0a090972657475726e2066616c73653b0a097d656c736520696628726573706f6e73652e6572726f72297b0a0909636f6e736f6c652e6c6f6728726573706f6e73652e6572726f722e6d657373616765293b0a090972657475726e20226572726f72220a097d0a7d0a0a76617220636f6e6669726d5f6865696768743d303b0a6173796e632066756e6374696f6e20636f6e6669726d6174696f6e287478696429207b0a09636f6e6669726d5f686569676874203d2061776169742067657448656967687428293b0a0972657475726e206e65772050726f6d6973652866756e6374696f6e20287265736f6c766529207b09090a09096c657420617474656d707473203d20303b09090a0909090a0909636f6e737420617474656d7074203d206173796e632829203d3e207b090a090909617474656d7074732b2b3b0a0909096c657420746869735f686569676874203d2061776169742067657448656967687428293b0909090a090909696628746869735f686569676874203e20636f6e6669726d5f686569676874297b0a09090909696628617474656d707473203e203336297b0a0909090909636c656172496e74657276616c28726574727954696d6572293b0a09090909097265736f6c76652866616c7365290a090909097d09090a090909096c6574207374617475735f6f6b203d2061776169742067657454785374617475732874786964290a090909096966287374617475735f6f6b203d3d3d2074727565297b0a0909090909636c65617254696d656f757428726574727954696d6572293b0a09090909097265736f6c76652874727565290a090909097d656c7365206966287374617475735f6f6b3d3d3d226572726f7222297b0a0909090909617474656d7074733d617474656d7074733e303f617474656d7074732d313a300a090909097d0a0909097d0a09097d0a09096c657420726574727954696d6572203d20736574496e74657276616c28617474656d70742c2032303030290909090a097d292020200a7d0a0a7661722066696e645f6865696768743d303b0a6173796e632066756e6374696f6e2066696e64534328636f6e747261637429207b0a0966696e645f686569676874203d2061776169742067657448656967687428293b0a0972657475726e206e65772050726f6d6973652866756e6374696f6e20287265736f6c766529207b09090a09096c657420617474656d707473203d20303b09090a0909090a0909636f6e737420617474656d7074203d206173796e632829203d3e207b090a090909617474656d7074732b2b3b0a0909096c657420746869735f686569676874203d2061776169742067657448656967687428293b0909090a090909696628746869735f686569676874203e2066696e645f686569676874297b0a09090909696628617474656d707473203e203237297b0a0909090909636c656172496e74657276616c28726574727954696d6572293b0a09090909097265736f6c7665282727290a090909097d09090a090909096c65742074786964203d20617761697420646f63496e5472616e736665727328636f6e7472616374290a090909096966287478696420213d202222297b0a0909090909636c65617254696d656f757428726574727954696d6572293b0a09090909097265736f6c76652874786964290a090909097d0a0909097d0a09097d0a09096c657420726574727954696d6572203d20736574496e74657276616c28617474656d70742c2032303030290909090a097d292020200a7d0a0a2f2f4765747320746865206c697374206f66206f7574676f696e67207472616e73666572730a6173796e632066756e6374696f6e20646f63496e5472616e736665727328636f6e7472616374297b0a2020200a202020206c6574204a534f4e4f626a203d207b7d3b0a094a534f4e4f626a2e6a736f6e727063203d2022322e30223b0a094a534f4e4f626a2e6d6574686f64203d20224765745472616e7366657273223b0a094a534f4e4f626a2e706172616d73203d207b7d3b0a094a534f4e4f626a2e706172616d732e6f7574203d20747275653b0a094a534f4e4f626a2e706172616d732e696e203d2066616c73653b0a202020202f2f4a534f4e4f626a2e706172616d732e6d696e5f686569676874203d207061727365496e7428636f6e6669726d5f686569676874290a0a202020206c657420726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e4f626a293b0a09696628726573706f6e73652e726573756c74297b0a20202020202020206c657420656e7472696573203d20726573706f6e73652e726573756c742e656e74726965730a2020202020202020696628656e74726965732e6c656e6774683e30297b0a2020202020202020202020206c657420656e7472696573203d20726573706f6e73652e726573756c742e656e74726965730a202020202020202020202020696628636f6e7472616374203d3d206177616974206765745343436f646528656e74726965735b656e74726965732e6c656e6774682d315d2e747869642929207b0a2020202020202020202020202020202072657475726e20656e74726965735b656e74726965732e6c656e6774682d315d2e747869643b0a2020202020202020202020207d2020202020202020202020200a20202020202020207d0a090972657475726e2022220a097d656c736520696628726573706f6e73652e6572726f72297b0a0909636f6e736f6c652e6c6f6728726573706f6e73652e6572726f722e6d657373616765293b0a202020202020202072657475726e2022220a097d09090a7d0a0a0a6173796e632066756e6374696f6e206765745343436f64652874786964297b0a6c6574204a534f4e52203d207b7d3b0a094a534f4e522e6a736f6e727063203d2022322e30223b0a094a534f4e522e6d6574686f64203d20224445524f2e4765745343223b0a094a534f4e522e706172616d73203d207b7d3b0a094a534f4e522e706172616d732e73636964203d2022223b0a094a534f4e522e706172616d732e636f6465203d20747275653b0a094a534f4e522e706172616d732e7661726961626c6573203d2066616c73653b0a094a534f4e522e706172616d732e73636964203d20747869643b0a096c657420726573706f6e7365203d20617761697420736f636b657453656e64284a534f4e52293b0a09696628726573706f6e73652e726573756c74297b0a0909696628747970656f6620726573706f6e73652e726573756c7420213d3d2027756e646566696e65642720262620747970656f6620726573706f6e73652e726573756c742e636f646520213d3d2027756e646566696e656427297b09090a09090972657475726e20726573706f6e73652e726573756c742e636f6465090909090a09097d0a097d090a2020202072657475726e2022220a7d0a2a2f6a53435f414354494f4e55010a43f7e53c0cd0c4b367f9705046e2b37f721bd8235b03b5433416a8866471d501138fc7d22ed857cbce05bc11b4cb2c8fdc48dc87abe961b9b9b5a08a3665cdba0004d3f42cf45aa85b809b055ba4912cec304b0fddfd39b52dc1c7b8ead17f5f710101329671602b8b2abbcbbebb1b84531619ef18cbae98d3838f1bdf372410097100136884eb726e9fc85214bd8f6e5091059379423ac07a0f3a12d0c1535d18e74e011280fc91089ed069f161f4b2992f0c5ff11a8aa887c86dcc5a7f9604756bc13300081fa9a2d73d8b83c7b2b861eb26ef5c6224e7da4805735cbcfb2f75a3a2789b0005540cb1dfc62fff71190282349063cd237e1a2f4cddba3dd822f887fe4b372e0108c9bb663f44be32d4d3896842f80414f0153262588a9e7e126dac6c3e06d775012199b868cbc245074d4bea10e53732206bd079f8992c901925813076bbfa3b9a001c1a7826342fdbb43e0845bb28a3121bc14758ed6b6ea9c61b1940ba2ef245850010d32498cedc617bc89705d3099fbb74520d6244e0e955f40ceeb1f363290c3e00185c2040123f143fcf686be1585313c76360f6ae59806a487284ffcbd323d721010000000000000000000000000000000000000000000000000000000000000000012f2683945ec968a6bf28055078188314d2755d253b26c5cfc1c20139b1e9fa10180f710c46fab0ddf1fef1a2abfca9c2ea889c22cd18e3cb4275a9a2f771601de984e7a86741804005bbc317fc0c6509df9fdf19ce983cc1ee55b53125c6a901231d0b58db654b583c44ebcf59ebe6b0c6d72a2c8c01cc4db774635fc99d47ab001e5067f5a53fdd8614a5d8e6aa3f70d0af6b07f9d2d412b397085ca7826a4c6603e8ebed00c5f5836af450e96c38a7f9a7700d6f62033a150cf16ee37c2481db1ab338d452f660a9c9d7c6efe2f527df804cf2f4874a03e03e0d04007248a7aa1411b7a8eae7d04827ec1da0b64e0b2d356f2b77d726c86cf4cf7d6a4bbf1cfa033fd8b584c7cfea27450977802adabb58dcfe49bbb2a36c71545c4fa523b07e0e21b98397ba899bec8716a90001320ae32e28d1f74e3e0445613e42a135a8a1277d6b790bb28a2cfec069df9f053b46eb699855d705bb7901f32c30edbd8b8f1ecddbbcc218956b459c255a6b77f29e828578a00018f224f680a896881a4949172e2aa5d4d57b479b8673f4f5901cc2bcbfd0fae9cee1f33dad292f8e710ffa1387227825f0a5a130dc3be7b3e3a533a2a42a288329e4a6132578f18cf44feb0000792953d5a44911a4602ca8becd0ac9efc177190caf30dca41549f805c3674f012c8ad73063097820e229d361f3a5f8b560df562f6bee5103a4346d82121b561e0101bc7b4861de07d28024b0b3a38ca6b01e3eacb4c6c63cc0263f562d7c238d3f0002e160ea625f1f58afd9192b1baf2939765e692388696eb1b2bda376f36b27ca0008ff43df3411e8ceb6e0b47a657e3ce9c089509a1cd2666d94b8fc802bbf7b65002d1144ccf02c5404ebeae5fadadc0e049258f156bcbddc6ed4e89201041606830020e77f14c8bc5e7ddced1ba4db86e30c849acb93f9bf4c95ad4300f4d040a7840104fc1dc7bee3c44cc42ebdbbc300febdb514fdfa5d0f45922ee9bcf2b1a934340106dcec578bdc203dbd9593e29d01c263e3947e41c33b1881ab6a29ea2631421401071f14b5074c147f2de8012d1f862d1f6fa54afad1650dd64de2f0f44afab626010ffc8a2be618abd05424d0d254e24907c32d2bc25dfb46a3e8ffd78965ee81f601233e9453775db856e74d83f4545ea0b780ea58be13f0542d295a640ee9f8b56e01189155c09f6efee49e4c75aedf215bb674cc4c7919516388fe8aa3e42b058ed701
DERO explorer source code | explorer version (api): under development (1.0) | dero version: golang pre-alpha | Copyright 2017-2022 Dero Project