ETH Price: $2,535.89 (-0.17%)

Transaction Decoder

Block:
21025039 at Oct-23-2024 01:36:59 AM +UTC
Transaction Fee:
0.024816544264561686 ETH $62.93
Gas Used:
5,395,866 Gas / 4.599177271 Gwei

Emitted Events:

59 MultiOperatorHost.Host( from=0x0000000000000000000000000000000000000000, to=0x0000000000000000000000000000000000000000 )
60 0x8d53afbeb62c18917b5f71385d52e8ba87669794.0xfc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae( 0xfc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x000000000000000000000000f5c377b99576f944a7389c0c1d065bda3653dbde, 0xc0329d4c4486b7bcc53c01fc0dcb30cc4ddf05a85259706eabc66d56b05ab44d )
61 0x8d53afbeb62c18917b5f71385d52e8ba87669794.0x362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a( 0x362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a, 0x0000000000000000000000000000000000000000000000000000000000000000, 0xc0329d4c4486b7bcc53c01fc0dcb30cc4ddf05a85259706eabc66d56b05ab44d, 0x00000000000000000000000056edd292baa96b729fc1f77d1c38afe6f6f96dbf )
62 0x8d53afbeb62c18917b5f71385d52e8ba87669794.0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b( 0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b, 0x00000000000000000000000056edd292baa96b729fc1f77d1c38afe6f6f96dbf, 0000000000000000000000000000000000000000000000000000000000000020, 000000000000000000000000000000000000000000000000000000000000003a, 697066733a2f2f697066732f516d58746732745952735657527668395045536a, 324478327043776f3968714855324d6f4c4d5431726f62347a48000000000000 )
63 ItemInteroperableInterface.Transfer( from=0x0000000000000000000000000000000000000000, to=[Sender] 0x82f3aa8808e7d675f8b0ea94f91b7b5f3248761d, value=42000000000000000000000000000000000 )
64 0x8d53afbeb62c18917b5f71385d52e8ba87669794.0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb( 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x00000000000000000000000082f3aa8808e7d675f8b0ea94f91b7b5f3248761d, 0000000000000000000000000000000000000000000000000000000000000040, 0000000000000000000000000000000000000000000000000000000000000080, 0000000000000000000000000000000000000000000000000000000000000001, 00000000000000000000000056edd292baa96b729fc1f77d1c38afe6f6f96dbf, 0000000000000000000000000000000000000000000000000000000000000001, 00000000000000000000000000000000000816c2873f3a274fb8efa400000000 )
65 MultiOperatorHost.Operator( op=1, from=0x0000000000000000000000000000000000000000, to=[Sender] 0x82f3aa8808e7d675f8b0ea94f91b7b5f3248761d )
66 MultiOperatorHost.Operator( op=4, from=0x0000000000000000000000000000000000000000, to=[Sender] 0x82f3aa8808e7d675f8b0ea94f91b7b5f3248761d )
67 0xd95eaf5591961e304e33b52730963c1cfaa09b7c.0xe0c363f71c2006b5e1500c6e2f7c2e0c418ae6dd653297537b337f7f6d6eeea2( 0xe0c363f71c2006b5e1500c6e2f7c2e0c418ae6dd653297537b337f7f6d6eeea2, 0x0000000000000000000000000120394adba6b61590061b32372f343189bc7f6b, 0x000000000000000000000000f5c377b99576f944a7389c0c1d065bda3653dbde, 0x00000000000000000000000082f3aa8808e7d675f8b0ea94f91b7b5f3248761d, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x56EdD292...6F6f96dBf
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 1309377182488738081883937822495712248062129428003917695072431634754940267390834487985083237120042674623010242551409976664245214151902256385166510123927300798783476256300996625085178363310563849688442350949803480773216646072921518852485462034936130871491515308062010505670414907385402760852957101388070322618022404821388647352822523761333116760947046847282095065083310817774813322431253539522666808587738259164832987176376901061030511585234580896856156525218063597968349072495775342661963370395967399626605758224865710179881892380420443587426402312337981102521592714275965201001908779041591171647553328818231035702602827714555642081878540589812665372027508539683109731827293533406186157164647513586557804838713806213240061239375950701911354434581621300253625594363927688157544729363346121382240201777882534042608368828524809564616524742015114532573324900354665946418958405545171728028086600532583855122759617540212507525008719093327245653899068124961308892323634339877647770913049093817692368600662133863056000591092672883568339995698724594735743617699275859870452234693209628195499174734540072366331358104434565681418101484797978729259028919317844646408588596818276908732677322437274122893167384429123290573536365927622071477427319783963030481597460195404072893625952679700455815379672915160567888689907389142779608707497500219184406114383890448358430793511650923419749013267138513411940150380550087121274217213346673238156491757743768216559556626102373976782757663408966872987411389045987832558712821212579120386892597551956059764001536062206086574377992182320408440880650534049162055483879379527222418585964771139794308738147053347135709435305685187773217012165630480157420490687476139315702815725100439521665519746524800696147137001886209216487808864211938232870473904697360129716383528177833486778207989624040590104307540927653323449076631334625119732510796503622783211123092588943243150361930996134224520494387111199842182541865871088463419439214659243230516698689908594989598844188959924884129155884616363134225523930324154293693573076801296077646246059092008724455800629550735121684359451102739805834736519610990280812470197245371777871581270882321678906734366635670072733027411481463886023363395932374432164423939552222855403953163100716293535454666367669673074930778671237402973046756623734306745458392114135688311122028116935794693015423314934577348636114597413799102400505135529599358731872573185681876827186037319345798017298187702441494193132046242921758641670716896124182484493743464346306507421544994887434516877870266348949970807881797358805633868159709811337706208100786413266712751306671986126100247259314986222646651049823641350683740608000953858000772349716861119327403758256112973590877804691380232331323762662786770734173658286326059076507851752885413159640660089045133782706311305877918962188423501119968862281563807447386802782816085208324588565636713761322776765734208519024001690358483601534978446982849089547796328678854379398530017847142034816631622099011495812772192730661889932234520968295460593704914009089203074288663657132178008977107202188632747974625679971034395443237680380011967120143519108529669335982763682713593375320379735911331861589747584341230650247205721910725497861673223382940725064986250757854475228454156864479652208018142963681695406922752275999201091575879646736674947191930940018314033976978353985381540175147572682618406130609753990392316654900035567979442669746260405731253974558669905156342901956332687170925306588276030331201911314565429074241250741132962060269898950576201283927448074349838743925921272168572193548855331241099458460728427832117499598690441128102454641276514241591220995774290282049600612594734802703308522307306003850423451588010525777239497663585509895160518128579457768363791055752486017837971549077054876323311569192481640609366062931925017273512794406645559773181769389835669807537336716987924761478334683261677122569524920769510201447477656151340606682135925635472748956967206397884526363108965690375432977292236755222061868392383548433109763711829422488459711871917972108942658079594347607933059058219787107014275306494205529226684345478601547016615853656528973152408011858760933183266118699950567752125021294527401013632132844220231410613958182028537730642352840530044385510223557748890529046806257946579138305364029478613042120903959859262575976484634073870616477690160831957988663278948945010575751185302970088336423867032344171587861061847847187391149137494093303561992039187386816884738354599549284973749965836313240963664218319168458184527316933676050900752526225298501132319540970097334496896632454380696583332062205568522304018173761551939395949816408203055866781376460715076760607063345865158178832388700940832504977036878183724498672227770619970019501215426885704856813497572651695682669804162508528986196818156413027867523931708129693710322027866410294382078746406069139798045119891936519285810653533430555342887275813669603713086647070091769435484818389914975719921843410366715175019139577689227675333217560274128295380168451529388894946195884170702621657547622716666445607240536480357530697659131690942048316813682297745915731507537314689625022436494835335844463538521636970470878205707899043594836698188312124388996695487567807211533749640030477832747989356569169907781819759805474649178813721008030401053677771104302552811486761489906514347978430873056609897642276082352806508620418265500709726927997797487564115232909810211618666891345152770414537958550972630944923275330171734523113713293011243642069823097907851330982826027368711767462417343869940305377230675283294644671602917842439256464257754879595564770153456524723858014825811495699559854241862487121042624379587090143850830627568574723539562941136551376434187089777996317213420916556793551674644872602629142952316181008812483881862467371654745833910537379755275223588141599264903466131241168182241302924007915240297531733384284008955696371004561085036323224181582294162769719044040731518537325329471630140181681269750586968980432064957479757479268083871716270053866095420809559146356022260686793386324983124691741381978176931558251447373315602344362964702776187367560288145576191544459823431119985136459006926539599483029882522288607171821325871421654424085500401899599253514125162961361590990538356979596895354941237401324237518529777207449929278121005152552642048309417479088902119148113465628936196993359112877644442399599242062330924130034889772258999448228195872091905882997927260163847943128198215553535500724396835263864800526293238013844042633577367118327788580144293374404647546483811702193703220143416072061996952698100273403145361679892694050298817514773518952070044484471599829317700049386681557951939217108813617674663769634883907825768960967481191286253134125136766856688859114640551122154128328221316672731063332333838465443729183119710946017526859059770923037063427915336146033934598976444201867080380891570769707417304412555169056380064343567814195553214311439127849649254830013772146267372859276522253777465022560818514827123394325381856148798283133594507332754058013905332682811448198430853047678063527846242442791648464462660518313185564195401351339266645968485021795613194231636920039313124814898391660337937905540431758323090817132347896064618520458263176370570993552543448797877841986654428168587825257939132407045264878301825534018395366491553908554825360555513848013765737390367939636479095244752983114294985137936339675807401455111817261477540647116201214618774170201257171825722928095346964659024991376993607907058126908272029478120933559628225055685394398877373763726132308291855229709466027857634168820832549404085573981061969463456638797760769665452839402641128156777588060372044609832514554790822438096871579460910888110276977417848469766281475801116937120747479836502549289948781806586573039646840139779865595097707687312229407420195015331647032030493624488080319823880190920502368733305840857612340725583274124058178495828744902503587504529981679406465107199685856113231293557428673638929993732686744947445727861225352498036484088346688787658701153674108329963204578191006056779766968011957342840287326914018339520746072009839520337418715574782593680169678495432180643422594890368135964956000065822412841577735103515139511292884593372766874563436497757880351716515172466768957718896376699569796404404968339057068760532174260034988285238300179157703543098892288882308453560784793154117163562682199981214933934613675068394517655723512906167782278742253890521454894703628977878517955431474635763526273498751032605752601614478732053135141817443794590088567241813586544249803999025129646180021096101686044749340089744755995049402992113679160594196100777079318808934999566837887725287288926801967904797695501726057550403273029126875454807246397292206771146526095521982003568242893945985860472708424907435602122593727730349800995831341969660157611131818032274706023988399777701212117550541988795549659048905911331301368212555306344978942024194591583123509451265945824875917659999713305717057647067267976458716351820037571789183041605968767318201168659090819644494541475600660489845301311084001325548390250163240087398942869495516094310426961561450331417146498675054364447232673786147572330527482867388424407303612959890392189916902121590212545772327119315228516279313525952615078557064202872799404862678985219716977060381681248299170560162172194545546345277008788935053587968112994262586416874761244244751691082202273365208319191936757280235927964381355651560303478840759634142041467391652243771883458967932831917083653527132783074087962673700458146519580797484681843135038026999487501397742808535360501527658083680823797190386562861514842667527136925544368249754051997245186792196729220952265747034937395545321352002942764414694478232213818284974528867475915828576606666151305341458880328346773937127084547952798138575156320152247532057679786503605503468541842747405339155249273959032274053437051163130210951537834742874707587927299559548914698883393831031559122683515565232916917063846674679644077184303924900140227849960187920784796139517809615465796164839521640578256880399182434201055777332845120929464255592115142900713335279239921770355512359460264026301919173493230764437131546199692242103307095286097672485577247750934463545966507714839637577547490496090768567436707055870029407098217093112388803745261568733459855962974694122651950711959971799847070519195062060327035830595275132290184388023578097773827967469800795275580218655222472140641942216443405815145146812676563614177071904840998291874584181450120714480492958259590603596606628218903601577988151866609061408890246372194493982634775597894622343762870313030140313479833112558269675038511161076921963214954265228664311914166325839199161181755973817793561432805025157875888373517127101679174493050634494449492782841103398156275620236617334980277409380551841543940996008824212094986007101569983667200986686906127344328565752634557015963693305686684636830095158623875461527955563042020958567839375178190310499276716948550492624970441119422752694552001037088085583468620802469922600955814876812273002070246842183235778964555488004423297464649078016795556571438020671372734957705763531712461822344646847479940830507792347806302243388221757357927478966798974671847983912439820422401557536584299361217479503489091586369275718416402462256512019798288236375744724266119976201616923763714460086307843912481986933754586016346428437214699975236276429835676131032604216708757278318923033069187771800362524307697173647188051299152244154043949971978828047031242990211332590975506394552465758531056957309410255394062557979426414617591623253468963615332160145477159869958159530970157943484592747716308588746165938104049328517570851391440340424217331852305859960858635587955780797121087805238190611191661140385726047118922758298879716725756092812893270709132268130414614386595524275103066749795263119328259025566077296237345486739993464727662632610432878474485305509954307910657472572021724305451562100737706141019151569266684959081366791908467953494987177682011430325011791971662676447819148844455803840195595570663832530677142052579075024337487823622894849547927959647419771410037866635862928881908209867987459024410773774035048800263872036614010696729644312067543230373889748314813143412541373567942794034355361644543562309742914316137818407615778008414139194291276552324959689938652039280625423024425366640282184589099763789851244902247589912604117545676508288091632977058286030359486654083864097683677988605934392708418445163601382025017649580765714911374236557209374871644291688550931801890237498934375902133500959920708998651099665388382093543751223067646007330715773107701039991018630546656619407181430770794851667872780494509387119984292372589719313249075778437850415124543408410135882163159518689551267699276712556567043789228396270548002124854691332286126512531184406748468876426978611766534292247337545625834447244875763610464610829274061924613851947593080743378885271004876630034928439574747916222766863080988602704896385451472136049005132798052518933199081282091759817247280592899522913963026066646491191180275949428517474240178116710021361873789053689884084442950820186611449357386468521541683
0x82F3aA88...F3248761d
0.07 Eth
Nonce: 0
0.045183455735438314 Eth
Nonce: 1
0.024816544264561686
0x8d53aFBE...a87669794
(beaverbuild)
17.197345123053782887 Eth17.197798375797782887 Eth0.000453252744
0xD95Eaf55...cFAa09b7c
0xF5C377B9...A3653DbdE
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 813881722574101833096589863826865774853760493899263672500123428826997630130959266411804220161481807426886645548847362538222443660691431370964426309164452155182768585375115370684389920245361178700916837594858920199365346467326638662816413610142956736868456445341664069896044027165538354821725585271865505639600000178602974531909233330842017288244095239052999574363267803713051970321245995712192185680884992890629248289396747806400286760487739388466240303008761465389945308336781508729193919551117740432915751042456149317003093664712825716137998458940359870717495782163595686992918700480645315626764666859393190435937334502633152111038881763193008453057763369421142320135633374641012471690226146455680690653854678886495635691297286092588017731907556819672964018150950872422345162747862487315321921983322202988875164807794079903658643749960190981020896296781584322120586333510558486209551882069104760260530714457310863636226209287680747460613445518437063010343280828310712273853133401383237417784782218265354203892817420344377217620593774165708829069124096828035884707426303129262420198558623016115838285151078348599437987156435856841828151826129529099450619819733025495813879107046252051789732599698168668523442827977164797466098308664344237423346734079611041436917483526762928154986139569249442580440527339579249814726617904337840296552911475631644613817874678464312886145899221252988922620865980472746923271778940149775631146791903499040197294600158868540830503874395611806479534730031757490271012627011023266920957890138321489027371254194957963800636229066534806397345637550341141064028370785846726871153725433850484046915916684109326417531133050702653049328709715072759378479173043287513185644113387400391473346000212757117552908337750089089723139537247382783501708699359356070671572240485849874217191851982026486437964726576859355511766966024881671923344560713137602007798051790776413030348682386787759482188667291450682028674046596750631592400059523094898729137455266355653467547724536765926131261028400844818006330736672048871028457942083519286403323636712650941461078342475902371547883351305281680843243053136532010814414694762351592753584570439899995258816728537670752397018686552714401564318860959550645866430705510817703467970962229534757626987712564752905086742004400541894787192167999243775174412517670027767121943842164102254963584663018384019864032753448779626543477804480409894308220671526522128941349967764901918225295625744531261541349714287436319225117675937054898373112068947188550076882451364767163327188028014466201080544141876378065452715975348606546696551536521284499907797070570758175056691841838386269476869332491660136719930862655549952362716979549456407574257695688855428048066275643917026910123521416581155688423877668400678628248273048619719531826997351277931525966349865234298921364194566751192786117661034168332910648653380730028289020205737639455757814162428307481398868882066298578463481415718736946743842276976875532694437995855316321535164241791415229513659038757470979051095383362056714749790253902246009225959713634081000428586841789958350975506830369219286856848419815369789005563451492948713766610064426754527732071321690155490595321282505666682137369188987695172970579461990322248881281773849906049727725942133646112248357004559354301126373417636992749006603418172211094774310201928098351851301241115812856218771734683631193834435416944303903027977316180017325302342502676695822887252103708109832802361410725354715064396393304500595981129178053361926426200864389837019400492100430405577470642023760975442345583805679165183057800319492419549825944752781197449948481920275623772299186162720358722572678964290905354395029703641639510963572275904241296344460191332602054164127684027074341728989830756383121822671347679709887549654332300934245248098307438622609123024561448278416860640102604480703607145351670248262110091729824100873707871612439771323685999727606621106701996509393308740419545679795774603305970611403584048928602252389146363736983029895603325443134132383944435401403177254293098724866080232010407094776934789684699136055315576860238383498536417282843523812175667351201997889656349270350085974010312429283584560825531037007499734580948109235403506664989200907776310375897182787716597276157805355657600321749521689112582809081559786938208351401314517992135810547781904035178195983665200839043383286487434078057998151914683497241155094893054307118326040058805527658191634418414735856992770955821921541309126998559082932342780241700656766317037342306713300990165687266096217325905336161622679890244385048318714988266227847037900885338747890600785647641006986401239939541063018714033772983063503971412796503238767877038912205976324410108524302852352436799673565473530995412544415904032132451454271275472352303353462982896125430260038489037306683814220455937148526564741497884995082238041863901109366730732048902911927575105829645485736463665176452181172462561265341948582607332224631709273618399626632830465426181984915644588940787455958830630360242472342301914469452134307518158349377487763289889181325430422981566352428587956342001906414243839313196068589917763245774505242045763161419486207283434001512904731468124570678652325529250986681621601386145635923950373611714046941559021076479084625348083763729873980619294487406474342512765836623894435408498435078404095802515203678730279622817621660073420884076817491025792499287104252227650773466646250678708718185303690905454608812404403631543752601191807600521809058727747363728826686092402389679319066662990011811407099847649223119309060240204238409838849958375501982178326320572796485317953366543111284116777967003617530030124217540645829100816166055233316099298659680994775212699056593198271580715752531313104644296904923774201359207455178159782284280025193563937857721161209275590952229207202559750813617676022346366427614747018884882735937738029615886713160064791264906455058863227622359905683372177243201895660773602028759543362627616600157728760457052974623575805148000219518041781214021525348381304962301745463284686735474334360301397802309391270448540229110162711656985300414170970425040673593352160609219833956606471615284709078529668727778226469003022792445611671883636120182329771775207531384488027099383242520187519346553602865196913793629060932445376450972932978473659610636585040816250573994363803976366729558080644730030463636115632605559271407886048316354734720685591897638786468607237399023420276226273572533278197741440559469804319808417447520539518271824908752176857988205183238709530518902896221294651473592748407477419065628202802954124477398896602426648611793919834058158656857870702155890910799741636475766133107173347029217776946300919771191250400170740352435762060831022043816447127411185209733126637848482245821896523326278894060618288321522330986702602210168632354315698437970795957448369317947953340129924737908092702835482883479418694644965394242264265386793930924159823532270938531057331754933969390463912560067396496222488199361382927149075008456331150189750291934393465387102179016700445034673029901062212403075415366928789015447812116737132942551403455938622867652907715253098829557096215187669423952099998888126675009780153340125630883961430241999224650518092412282964198396223847368902065415179900776018219053835086164462773185214099647905505020069884377504861054549299485564632758127234273003878460721250912570882256584377067376404791890634686415672552279806766653583326631956775064921085867750490907950693823779361439622499573432590166611658819047014424754609675315159926947413341108455303583294743099651638866897541034597700210677769465913581670767961547019377190693112374329200261839620743346858499463226333815829863727103019627855476443094835783813096057504098332898022707606810849996206972609475845059525021324931154478664462947772691535570694347888888242155754213622509835701087896986051106657916409721078013288640660417002488693518912421752353761541339439462101137609041621196158183753785519394768290742545587905665648850597764313718570783422619278840340025205791806582799211809237066253124377369578266538033070566974619372512669990224659155270982539654191707298659143023982719904802793668456912947618376719467729821409238623791084664017588217212411537758866914610052028683466157298906249049093849587851382733200607813048584911462392436181085457018217409658260621124612802106910117526355610993876880378338858057100763122216815353718195507722817424719245555208177004277623146440209468949733422699130655519043956836761116809886963317399595367754100485884898156156379703260910879562629163139287825820539648674086869261263243453658409572242807149645617327400440367035778218027421814466673435448779106238656206509262074722674981054700327065302042603186951434076484221951232743183085561855819633219868273600876501262064734441658731912210139609396026341333029764605001258480936324057391786547097999376264499645444593390395159001902277242125008402333284376352215695918263206007521524092838640301652959179882655044919087015699364974595065781390801698488593024461682787544762733712053231811843069692846367759958325347326906603211217691387202302222157154191446326686016284059346218873703035876420459089381687619403562198773527518577577013954101473380842633476911162996795851659538015367697205667618697026562309885462070821020770873388575613398266914963157427150537470788226255586678025199252075868979178067325365679970787461469675936804813495367989871961432643206326716482076746729409862674085494544334808322828634929590710880902509040228268757667767450356700728621024902378209419403752221590681782575702877014443630831875631347309255177795866178527465213387807098073753076420377277163709346990692544627843564772244827247727596672227678401335292396176513440837451652208250551693729948659171798475389379695802171334970394261256237708481451379865849907478601937701337902152217320355656795655054049614676762080365905941065190081498296805204477290365081971977685969099942677262705172952046982893469987475398012327825386952346299184456118881453394404090509885739311696349779959664938797002922303688601950429109244118211642416667186280183426396309245701421762225757072072903616942420871048266082953275366245354293982207834575171052740651822187957218472602008569042570273832673227916330488278426529682699901448863687368843291811350737765975298957749161633102946793536628885745716286945154812855212163814842419516856619008465943576687770355763506803605312769098842559606796184330611776988382732003605270587072576967179522337977904329897361605816141968185526633769999209127840109617753317498237023124346919783391503892655051188059799040059158608939075749736222943276515282568843772916364402192755428115092717436281000724936142837686692442335324421843442126050523617248030958212229059129599316115426745493012347919553818660319077477891117973762066928413273944776796381170998027022909422274509496231146958364733207101797296120803470337971731151462318221291146238007246650456762911256678085378153685119476360272233548290586996129782762412771925623739137665972938102233319922080189923569278136386833155744373893212024363342007710708315478402528306343751599828766804132499534211875923224764604176451928752688042864675566661661433806824477767413580207099733712130856095490799912598556403286256374589083772078297582646615933356663025624411720409369670366266797218181901407824350419978746622651889030457944523947026580915241872095372675776198726615517545613941799806372349225008742686901609031727431298974381814926876652055972332874195963241028378420019181194050231160330118358238025401743117359257533013395597143426572032426105273400872343496634465823399487561498267020004112564121078639617855430037320095493163988908957562173702206815262727990511551374331125399952152043736298453870899112515433281129359752446474716832511637551664041397676762269362864454825758978086703784641430972504488419080751296498122138053429038854429543597850603612060736481712166193813576928078511695252656797095389992636995838378167648685521740865185890990093698956248797632452182472149623154489481796087424086946109907722223383526795414494214999456500852652804856906105671267822913753264496740910943976083588248004184407477531643985633971942013816855672421365998173755340298779728055068467427678600171368323509834194922133344544658005982603375968342132126239321701640850424572849068062171879069522356237034006506384151169567890403854060442069878198440478554696661873293342592121441481108347937601823139308700854058580391888614205716684661975502069437650782514613767643797506363996493431120263084199588053456339545077780373719421640435449759908512608599196658590492080786125804376707885990219945674180208980904443990652104758742444233102606472288545887836737204074276861222910012086557390390672299580319573527336967359870486464527350063287398203164294433957382088959540515922433884208826722092439314953246654739947215203594266268467796849332564876637642930563619894722277221050978873431971928949141059198658109061666048908326703867916374092609102489376583039376359295484670550084886671705651156968829005906200517935095505848928711516062561166870933589653742607053229350498022482017958752044315382351723734457269683672676578433910190539198075492896317331378115322742985705866109966572921526282807271461789038892803779287678753795614520686789927141942383893755868431258102439210364703071519486964007698230114312548095832968663464167957548225584546838702913564818042108480187123413694064394938462751778800907595207769905632040425275004304870404746956150167927154404866552741465944898707090269810862247557763827840590870038414074018253035351367822206637709923288644323633649102410819878022847386416723259512261725401241724518423957449624357230770403362807723981421190973635035907542060157288007025871597404821766448871421980029020036960375922610762649229734344434073343951797280735024813129192615062922038578783482974917039248166042071307887239235802118433888534996075974862935082284956298721662824268754667474700099891720176087148636070234561641364679045928661756457538395445557588174825874209796561253826390572061498795444325658376094733883631711022548771977883300228683158683037118512128139233728498942972867660016794760004733968724138383335838715427991011222566491003306185802433184110251424174911320306032936224786636834792575605315547104697950766968604523746398938417910401836814557811395557692100393709605547084399892504644340520235003902160955969003663179656194731384689382238457640538185656519705246220587923456944561491257426877896290196160691613828012210461674857503020061401373467452802950468946245467011223480479211709534269816474221951424495971012950511651899481049746469720196154786193092944271178576419284800696686274171139760691312478830156767565337250453794963440256305023810142504633786764659982411874913366385621068789620318492307433846898115531017359310126374210384791448020310628796336328317617253320348117238025394671436575760989723204113589555772090828616021691650479100766006827612303289672809506114744146179718575781808764020876929353101178854450943298238363036140236184226209061088343735847167456116524854274873567975193629107745207477865075307609267326334009621501268192540028611249260681796706627334345411864454479252941854393693346943848057300726569732683005893460860790458415320551578198349336111522713673195346667959097134779744533579718891946927408129435054517860858464100748109167766764449051856982988770307696740802668271374490498030066819712934603227326482160349404763589320384458555731510749866216383454574137785707441376990980996549289141464397071528448485100132932819833491660882209937928382988933516394694703215138551962538523224175437019473473605322134255893995351337030261580165039250811808239530811959472870028946645241337866708301552226875296875810225347283207157436302949622068212905414702612949684072633415560618292300149786723991721151981089128577614491173601148889558661109600961735843043040678086752059057885202157725242998888735326582154146173620503511204522835464045058597654988888839177821958134153714022476913136214954996286162595768436402040257421789619010229810104378668341538329177948965345674553168548025542020669542719960138592757738704821251167941662835713094837697195481203639164999890056633727889359577186744850676368859009116577199490967595320262364842984499754961175721045913336650167569298225008799983476487467686412485154593594803263691983310668599771037043451082311655588501327512922032195696561524567990125973047692926825286578618325764664516846489606149494152757318427748187432377612389808030921168722795942932681176880515087941119953719696129650371373779460239207861182597784237920738430292517012327584486841655922719876219512319650175571660252882896180684807102534356420234715492783886628603693763652065589743808263390536161320813487548150328988593122655995841571532359028278759690657814143164469595529458535835106024645074418889942120696691577728405047663428460591105404593932002877905924923238348961477070079789104294983645527450509571358258594002213974865209149121389519460731935508335062815795904201063921340122370981292886698385603000564813753812509030407934596405946694502398729427284102923151041994548817926238064906039156791390655628443749404200346209525454334910660380612929614845899853220053462766019141967854922777278165119808057559997883889008156970664503294462292501870236325899595886060928818398391903972775808797476568519843449205761919341339763513434333876981328606871348130995589968005993058215510632419929346711173779536921152598898684325462934465670938482397945508386167170874418341942856669806269172379859559215899486151860325116435632103631461603540690745123622869857660558538959631085189144069363677898295368322428654675510311881374051286513732702681420970382272419144410276108292809840928415311568974988143140081803409482264224301480915522078492358604532821943354948087497813636221457123172975863665586549553227289180239969291086750152874998982460832205907730507526722810968193461516216898875972890800420374380182561111609927876211154176885529359852344292556468593214831067511533222834481415852206248976561137074243158117471053266822570570943760705298228244535950790941659959821829031976167457270941625844326493572890350425020751818143114482502273550676476733255439590201002319854401858770245721340683331800328932767388487288534769213571519030007735274864162349964262166430568625031503530186842895857250411740284044144527185498504037748156092453885600661842728684227948410060466037926103884118957869728133718671060431082610455325293231843564167271495444650143327071202805294965761850914987730827707353385628966558224433051265173561911602297952836258299551322069262219157507316544437327380471609747128794981717849882666557246682187493921381725038135017112370342001651959718528183473170778780717371444175256803571654254659696293019998307774384016204067397971063016369302608036756505863325212343210569119299329357620454821439664289878643991997956689025572883987513270940623554310500642614551391898096019358374858971073591851980305936995866514168409683788052027726198672402315509420846791837248585112254421314514219962665421154204822773236504379989788650419819215408499512929337383898577086613140770543921575579542719914527607347370456207429483791753975157012114394413385952399578218914181573042141331412039112960551549583126591443953510696042721002962305017765404936873491226645136454845478254501875217414001974499274573694812018319421511482484399966810227925118192065345374067593533034016243258257560940788319723371224226755353437390810675557080595181709065535088614047432771700860379419140350506475338311487877638656675250725876017380422845339916254831995430367211662187586988305595434683838473687398377310994594788234698137893952658710801353391379981856160864032124419003993860815995353351330343881945020000598509446316245676803105641727357185374572938884550959872521021352418869461612653726865331014576602533126128399580442587598073487838195078452660657789647325284776930461979852448802042940842799239317458492168099287196680049119560900305587343117779895569775065029767749475262298965322482611518325821842565773592067289836221864216306231437119214734444596118040752038269726726477287898161581528829399418360402960209141258702637431790845745065399946729126847847634221564956125046347077215720459843920996606193626025082044078181727359100937428626376652131975729948123881419858108557497798123571280318834051463248243945082661745074765484068649702463080493307566909220386017884192683872047125835674298548083486558329382758608361183372465083797608728712186809875044061573612376259886737441473029214121677330106964250194478354703802911010313416265494885152085070390161877415158112608175252666843156168600486067421004093880843493830385649216763027327762286384805339076069937002992260962995782039607255191478256326262370417430846448120856199965668153602410145274439456630387933269143647942644770937306907021014019052717842489371609898847447569994075894397761222614988599574614284858996989654344444701398493300928404780914196481424969365306651337357623802431548978824760289919902535478141227290533380351941910897712350186525857888501246961638406504012222577376524509049400231009815502608863173308363994444544362914302640368247575429641942435449394644622845566400469223751735375892039526657675200692395275190013195141927309142776666850740437244710539615790722543810589078632258147949336100408276607878406552480083417687573354334639078152770348703959855239991349587810973828405298380555152366629494992198916957049699456819463901420385089240999570935900292515223431120660776114979289465473301029009778430090104036757589888724622711828187339772034223556429506453894825394423602184796173549419729350651952823880123895181846195613333843978993318475643792580169723143275291711950523018745430872743642354156738852837361699621891596749564714076205160053537851870730525039609856712550234160586144055500720086048192867912167057029767793290476457004089129245014908425592656605029343928343527232554535183103783736128688499067450637948957891410303927379065750410556460005495404499888778328744642115271203370279715250528540238881278676846423834860132344731582801491889968986880065455585616510160017410747074446065779932313240160291727261063895977796171823839462547503873748112586671118859338353117355730143404447436044068301934472774370158820028849232396786447890715720459063765276068168652656109363296218649461048668412471207476084768617550871118158362579985403561442813320787279252237315621013427170137383972783221477409985873311651571480537663597065687945887571183075362401538161608908375813823561808591943583786812423473078739220778400462825949861623887733834641448642449745353185497574496650402430077682967148396887379927467511146857565162384375730820321329122143179412304682442877916478806961882599551085490329462136148689448716777522882380085421757037355347548857861556270315407231905562922364945580346240596773087856429878712112391315769285475193733700134905640147699919451488648510733418799247174133611676191024391736886795439420706634440303978725086400793420936743718435523378905195398878254163883655878742178279517467695702523198158927398436938550868343588477693549241275598286576930901105691280221337825667960679773654431642409077050041937408564496615186057909285783182512841807017147040109393045455371882274726002417390065988602854134918147641406305598415228475252876913520107688259803498463597534677305099842229760791719892232899227554091498779052500787836405759397811003937484206808666671865735020334631696965383744983451287392505128242483350539929404912743430589072821928788923976050515080846936941359081240159117516305518916242104357679122410971035299113210217955072422651827808011489493503524468546304681875846444101075038017260798402959524542853537092794130031518591742163212546882031067340514519225534228826711249522109145142419749852888396459601692746472247096759344111183234252716853572928155389874328423599803143038656564616308222751795379770660174801128044558155961390474689919168399559251810943060917211627466024464792629793762263832422113220212931706797759966323201500187414250939230410906106561065452457809371086629746655224951517354175737301578099100213505270293113427434117091253462433871429039651654918097616450769705452037864341336210043839097772555586216341095078828954601388909371157498464829489869702721384361140206462944549191334565924951654248979445976030802097866635070509987054774787240390048456946204727082867643872229408606663588510145061739390047762494425154826508872918533893907010605386904905838378510306653198640579227795171938353821930377927538954394920337860062380745474100956448846938004387866938790193384849124014097636610747478857045882793550208236823167248318186922168083557129252980824886037073379141566001976702477892515570282420960580627665772974310762156791073765248010614466839363889821647233054299768386723836708199416193417527351647921621110987465886924836426513578872634642601876387821096529569727029390338633016621228564706910746751517656818887303933264438054870324630641327052720016854290432929837134209049942676381646980691630008762113761181146312723062016524706131781506580742001968657045944241046822884126664861736721569084359048840660124842027721543119094930853364548730938694237593678597512206162604142860539776928242515016635017614490675431755740870907677996163303316536267561073862556741284304542408452408105707311120028703591597301692802749492107581183871485495795799035986815644969070119272330349327094110314389516271621072665874469681062031670041586953328951398731806128683041239226234073590753926184835914355646328678165780167111133774263188106424503312881442124091352321811873995356269358295729321475813775000009307272488557168801144603720664386516488112001713206888822468402720241010200012682522993438340317248213794892326941874784125926122121419600494703875122768321364264193266608245302552505671468261494543801695690418559754764992185728097201467423868619421374398771000002537610535308721115689649300914999073483055055019170281472152354017968474363320592942412590864848545025540604180385834052930127567262812916065945309124960453752041780261673847604457033545697053749884991630933930128564102439295355786383342652259315822691665486115845936604205944731237855350545554874892893269859317758707857059675316879659064182917898497498537142483065685158226354635563608917950947003303339265465964863826740323781221437461144352775055377019010878093833990220602160405501250961055805423191515523305507751527279536653245148712417222801645496625646669988749571536861504052611927170904050172631175356876753806372526502138745466130798350333340223269913011410419321782029276839574024516346760200142521315787251211371141680251426820250742030747310693338906917035179984296184989529231729541752387979527684974116998792251331166325918126420545514054160564080334179713634877547931610584918018737876605963780673920100829908958732584149042366098501637108724864838877472452502477786603429496923244571467282549876327672909371772547045561900091430881503402348388623664267282814428082081709296542672618660349777196676411987794470688713258174602485622599904728731213870957216547151942671501297281871338926088607570833084638472857664567259598727914465950463315388894501745281300728566145830011026442568096011323478034063733064485220891895477737136951502655487495194396934824256432884929261876329353632112041504657979674979654339020280390870385569884732902999844088494783971250608369184011716335595198206000896280102632547619406970314896967764696584407437211353689422839008022980716773685044418772360296076823086662986719038219434391695024016082437754581824571969079132080053706940805849001774464847179208296321737055785521249853521487517341149077594741411907645556427318164690585633568916502871984149943751200131378670433401859457147383545654943831534083167397962752397464488879702279920749575932371697739770925309163685130197342363947307031943364807290535007372734003354800723106861667533062168845180292344080023914496102037239499026761314577204808220227403767918944784167559805908990742143994436601496259255821204103756443541310145917165511509962614006549340566124652557063551025523382890343099669854299701946828129950912827737578372429388791601061930120058282705628810963392670208816846949922998046726746346504464688809985638611781629178840922622400795903729442633764822211880889442349755707929097206506310571774999560589353218646294924700666293763161131936170035815774464846958217018996937836632139312790646084449474266052623496960303644625230331327743075799286188231492918517685160128145744841676112486775779862710900590737618419415320134567334668180490424714695721092105586344901128160761701570582452392192188131204081801111559907169241113113036626632896614426220901886810829467687141592781183327446559327934932324368139342494754943874596611044855052044579986622527458246612519973276009437703263632241336252169173062656904552197277371311004433048349626529907238338433322675289261370119984433714003671235636194310465912467770792709301178652085734472892126898530351586579692017596025019712245314611996634734753585332232137394031107795410299259550706318101432701765911925542523047808712783741378605073073480909989762612150008960956692725794974400300193809963135842567013123489963689186645779374795227315266663023455256954809185523479500625209392497545211436258757330536506201668989046966624846509706279850001927985087613155160645441657476333729011619377300214411384763260183940461784126604415251296787262320288651320030560937197777237932600582090348929747947778440065936359449381381803868489944670550246854498773639294980818393256148773447974827126237102110185175887608005883336082167052546457682770048414290947297817042244768331282433239522213555168489449460133064640952406151414409253835504466526575356120070367163783107886378633537920873721339026923039215560508722441275352065039857712459560655504451885793526763270718139303083108364085520083397323822939594436162728454273157558835082717359400618367563257395916743288671826181205888178067670314605576804268266681513826864347424098031398931332708816934553631003834812701997464251074055442640854038665622969789857989085922197821830160817190147342044797259729462407673266909551163342928347633467074727558516808230611294459436823353738149190862330260145969545962569531289576307442615888542341480825741227554866267340692969453369271299457971729796809064350796865938289559501371460312289536330732193649863535428947918286751632842228250116991713165855198186209074872612290103832864892447971013310295330934505331190009941130678667522885387223118636911654960024548517424169448380957889883684893159949675661027602614741724333475250584078557322328768676947831833721865801052756431095136055442195095123071995698817032160930635001168452230936623919353398960955207700579129418791407926152580089008032184414666035242034074902487223506324853225578410198260491035038650640487444488293400471618429166550322918016670016038903832349857284091859457462212953444355590909874656252892088922466360601966962267685689857792806750906498593677171982939193794969478926297470986285902334321224800710978015533177911430264774393511982119316361179365545815043272433222752357569872045021003014726910216207528747768237321182139401513091846529855807263596410537762869240059030020656387516184751919838154721428107192138180566471305514648857035587147576588281558682541681260441516995742984704516445738626721852786614146978067847958077908499086687300140925731152132998134445103650803392362269884847579084828140936499209837293451160129181558703067234991217444797610578605441445477608794438104052851329378329131401876358659124761745986495330039547669413213500057924815718570007687866976954864570810203461360049164647814149795148883790806351218031855942941364805217252686893485687407910208564914190544004508162510372748749051920814695417785520165143787009193547895793130664329731544732384007675596892438631475625738101020037478096789749532190982026070962082337444357712774750607286114470577067024660238211597603451299556885150036739497676323107972182510459917320158509621792649633692779202534873274644839975668592535370095764912052787079246061896263695136286657931702655216785047138003584814211884745618636489503969478548518214354123832197128493108206017026724973926508712184538587410450339693356906572120026644109223780171245043536427150514378399057213767035732740518260068263366964880343819647093417659597993748910275934273525791853646633516644055259926284012497901312346611568567503891383646765098594688018818811088529288168672210253235205757470672215172305701778153593239103036720434909769945941012668573987520900011623261632409680325540781839866131782849990902858477551064216710221358529011704406410489851333824588107980594310358517262655317935516888339043497650208184538122320889487272415767102282589126766895208308567031035997780800436088990563895998086872595259913288903166950442773511419690640309111978194300871582878574992347441202622082184112062857434968969448962992368569610625961633644266261883141983157440710059878209469898828964440642322023868669394483696130358852803962778388761713795351004978544880734517793946709243836809919695792942928969130582011217307417688061447579723212098553248742181901950866177426558986833358457080430055028088093566861788376189683376999417863442885215296107475710458964803023137785663991730373468261644061015141145683759123438321808856685703779214263880160419061770780249419688813758091996599237808317024170206226404208469030121905385670296584096991765763918094976865829825934565423598145844872549659680829088849568957245189797207543704730642811381917787520423317849719148590663688580319657711788672878216472592373707344032193591737510814468252133689657272155901101306191655750145754500134991071835683138504001625187791210347072308432657051834820506760172515257740761951453532140502827629318090993662459301347794253315885972323770735553640815779365490785453267082035658324692275965618577559681771639964563564400321085134326368833167591813053714927574130089854279952040206539340108805794386058411484084269126583987210795148559785734719757320182865869711886875606492832060257798277066320208710326373837555982199233538751059207370022364986253090111669231624165603771369945460566355888883850779401354297568700586763580240671649907411021644196988574275155126808461174915885687972260682847145317613662176025197264336300955115419494554519370378764962836612328224456242363332792764379399464117318352667472255574666508321260860430550694630223773368639265598626184083511534745128973779108410262878808401451265665999517119607241467573202391430215170329744654264865595875222527641146865275454395654625035077215397348893356414938409759372388263963570041446804065859119933080770712458894444220373700954140539305230405473953047092406119452188872358643021524276596706059579864610443928235330997046141802255870372913727888849620016871293073574164156571751602671408046703606459012583064968459088414687373470288013898132104923013158008906757411804241579884359941229814528383084251381636650504973541832298703758872581194620577423222327740523217733547162471758215323358519338120738183746840703195406060956053410162455594474912698576555266515367177998079947116011992785836897241995375648380054139422643985347452307268110804119370335104459778122813593052540788089932120029786547956491641114424014450761283532258231095140387322918396530525637373438389326000147721841420847413661094674072605837691947494311525562258818360289982253438588148333299552993455577169274510695381179818227953458277041829326355674800986764201988898452380531674966182487043787832272714608023578729428631559361082548035709553294170083219729489202886781789043057022877156813590633108240956914050753040279952152291904919850733871588838146153396515751922691806621015644648404061222686486965498621872482598077934271398207953697751152135078179433309488990438195898507676085122026718133822620084026183378341544815782271194607676255493769038216106116480139569971793303591164858338585879322422076920901593138906872573818714613164884539167298646599062436101642923953834229487187718120845540329187973115023725402378816586267054071252048489506105803569839598194364001450618481164061543887470264606807280790483088946483087445631847231790747259838189700385146226598320195089354450741233450564471273089269529709846518304394694624773049327499630365182446327125293044314889847817738817558391033671731990702396394927954252302444676899853153634238623549080837777086009763626482131351780789710383898486786878873033601542106225269841625863622056320257766325158318791892786495146420388754191423506714645529506184039448453331162332927205450093930549874220120578135118146129913769623409965209535653428008519576807100454099659638887649381215358816883731039377935780603694352300813332597198631177094574110119161936065412678159996643526636234954431857999701064918013999503055462041927030570378964302878878833329203517439813990379126306476177706216304233433428212853641298344998293256116678533728673099669933854738651287723369441573016821464631524083212793308877249719920997859655006257441006600784132511412724064703673225361846078831927954148231102155178680792940544497877075872917334742732387312337775176572012621037476432838806008583488312256020308920864877787479621278338964252361673553314931728309100846146083579691979770633759666135223523809918771850182783650606627464067298829185942767156115748766403474404372354654696171077952961064683539406414388641426235800664449311434599618653841545012347367646028077100250185601316563761238677716051671935177790036348207896916608345033208606023034049048865065583448987938192177058655316890428423425199136735665005836146273787453264321431293483393794338949065039917202351602904085409363550588508988480839574153879616876017359346716401503664685269324935516736137522873331374424967047717042618145440262750654542690096846856885145555871827278541023708016826228531193890242134044690571527595054646083365640949217698310243715058338583686036819475412256223118256747985150912591002162043892278581651230430221831670502459910834820752255166138785642836741184462631920087141239446001717320944109454740093632592426889595732261554460168335203517794966799817066900676014274531489642180716316257694836266880182696765471620540119391133297625157037352509713966425919481550436236172319858597262883846958722363228460649159296271951409946874509521117751392184622693912731698701310498432973340222488776793953730593302062224517626826087707710939410234854664419065509205696937364865446717495674824476856068948333233928114799574783113294980631981109467962556444434710121755451208067284901788607818955214972861854901979179635545155027407351662214891034326081705643262998477148284113839235212760147024564061853073307485043980697405012318717601106717987144187430329078259271250950848403590462076708293728632272259979194914710938331438026711812262353271067155403222862352244326530373018999394710495054576487509695039065327742043390114754731523412284234958310579565772007088375704450159679076230055227650950913965905360283315970739007305507975188416602882286974920731451066166621506583223101370052690667598246561026874415145956305555762984353598614272359148878463966611235402709944134574483301759289135890286556427058294179807732388974282811217604729821074245962061503913414860055987371813264838704102443971762268201216061180079074950389377905478336253950284552666852535981167699967107752254139952684577839337492237324124279777633807901753690505605777202655247492877675825770848369218744515409225710017813990436488389410187639128102116393161859393006364968616939037207188776777723286654448336849559649726209330945193909025041239750126039228665585609194983721119100234601805296567147581615369089831117930052723887623237021212070301749977797548168504755911213913226066960834321911986201597666936249608042631280218971711260030565324041235701310557569054044124313841304299147563531828278564039694773740218008197534803889569545679792467815150475266844645964126105483602243403297626434965858330197863001870410846960325552569140485955040652626202087545246607739507641954364005335679169952727991782968983733791906020305683564133177104882783311515744736932697149177279999508578090938229529954242222419661956115610950893564345643262696813390412773092243041771205262645425131491310752723417027857664178746854822215945773756025151224266796531585029025261428586413924793296969498321906875507386521029716368539961137344296736650817789570184801257659636762402170662007353987011260073722711586975093268346073035638529034878424886315156426945537146925939020450012269913190776401314498153394704224221318093448833191866381815350128629154692832603224925297321817688994118357861338928585907028570953850074026357619571450953924352170185653550957114691155863871621105090578025864967503843811690146275769212319100855183761769896423231785146443177268506909871745384279996242202461653559982247564335702417120341114658545378480501240315353357712737759399376172988208377373577462643914609736742118286496004174403303641185617685411214694234845284607368539752324458091228286278708882032545131058122479890191495092817146132387034697031496731774929617072302200834527396429527767166963740807165234377505236521366883292987306287528812862050280860191965105471430774866482047404773625910522801824926486906591768326324435745495022338571696226003746465358756541133618901809488763691245518843447990564858557615058562156720108118342541982642064304178792402142092832565683780063091410097299995380809550673327193207017358844923819886110224307697934083078164815498313003177698181869993608597729836633411034055345681457367210376724550329902613101009766372971909270173428520796160937484031949986563726898441129228612040194770897322280964476325183121047336506682862534302580100421217258339082788337993301191249169271890981357825299237972058389646521082923145390946166294208180495248687433806611238742340068361653423552259306325826109666930746774325738679729790816668662438944579136927139809007571382650080281580036210221345100031705254160764038041711816573116800484652758415826070492673462494300469761548666457610934983258566097480221748570091712264528888259168590742530222292158346480372170837604296135786207487135512287791349955308947430361194668287021651550757069921526675455647025516670174384597257180426824900246535533850131216907221004833186807842392389301027743291163400583188670939138075412470772667668224112726440724983822141337945793506149945450448229771837251846850094266679054237030150273768138538936455274811966819527725217113336488784070006504801888618731086306483418901317796519262048608599523076756634141294263099890941493451988453115157922685456572657408047715191116787379416112085406728169941349401462817711243734192579341948094823050241352224927061834849528971315

Execution Trace

0xd95eaf5591961e304e33b52730963c1cfaa09b7c.00774360( )
  • MultiOperatorHost.58807301( )
  • MultiOperatorHost.lazyInit( lazyInitData=0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006200000000000000000000000008D53AFBEB62C18917B5F71385D52E8BA87669794000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001E000000000000000000000000000000000000000000000000000000000000004A000000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000C5472756D70456C6F6E476F64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035445470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003A697066733A2F2F697066732F516D58746732745952735657527668395045536A324478327043776F3968714855324D6F4C4D5431726F62347A480000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000C5472756D70456C6F6E476F64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035445470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003A697066733A2F2F697066732F516D58746732745952735657527668395045536A324478327043776F3968714855324D6F4C4D5431726F62347A48000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000816C2873F3A274FB8EFA4000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D00000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D ) => ( lazyInitResponse=0x )
    • Fake_Phishing308087.5611d4e9( )
      • 0xd95eaf5591961e304e33b52730963c1cfaa09b7c.b9caf9d9( )
      • ItemInteroperableInterface.588073d5( )
      • ItemInteroperableInterface.CALL( )
      • ItemInteroperableInterface.emitEvent( forApprove=False, isMulti=True, data=0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082F3AA8808E7D675F8B0EA94F91B7B5F3248761D000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000816C2873F3A274FB8EFA400000000 )
      • MultiOperatorHost.STATICCALL( )
        File 1 of 2: MultiOperatorHost
        // File: @openzeppelin\contracts\utils\introspection\IERC165.sol
        
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Interface of the ERC165 standard, as defined in the
         * https://eips.ethereum.org/EIPS/eip-165[EIP].
         *
         * Implementers can declare support of contract interfaces, which can then be
         * queried by others ({ERC165Checker}).
         *
         * For an implementation, see {ERC165}.
         */
        interface IERC165 {
            /**
             * @dev Returns true if this contract implements the interface defined by
             * `interfaceId`. See the corresponding
             * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
             * to learn more about how these ids are created.
             *
             * This function call must use less than 30 000 gas.
             */
            function supportsInterface(bytes4 interfaceId) external view returns (bool);
        }
        
        // File: @openzeppelin\contracts\token\ERC1155\IERC1155.sol
        
        // SPDX_License_Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Required interface of an ERC1155 compliant contract, as defined in the
         * https://eips.ethereum.org/EIPS/eip-1155[EIP].
         *
         * _Available since v3.1._
         */
        interface IERC1155 is IERC165 {
            /**
             * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
             */
            event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
        
            /**
             * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
             * transfers.
             */
            event TransferBatch(
                address indexed operator,
                address indexed from,
                address indexed to,
                uint256[] ids,
                uint256[] values
            );
        
            /**
             * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
             * `approved`.
             */
            event ApprovalForAll(address indexed account, address indexed operator, bool approved);
        
            /**
             * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
             *
             * If an {URI} event was emitted for `id`, the standard
             * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
             * returned by {IERC1155MetadataURI-uri}.
             */
            event URI(string value, uint256 indexed id);
        
            /**
             * @dev Returns the amount of tokens of token type `id` owned by `account`.
             *
             * Requirements:
             *
             * - `account` cannot be the zero address.
             */
            function balanceOf(address account, uint256 id) external view returns (uint256);
        
            /**
             * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
             *
             * Requirements:
             *
             * - `accounts` and `ids` must have the same length.
             */
            function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
                external
                view
                returns (uint256[] memory);
        
            /**
             * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
             *
             * Emits an {ApprovalForAll} event.
             *
             * Requirements:
             *
             * - `operator` cannot be the caller.
             */
            function setApprovalForAll(address operator, bool approved) external;
        
            /**
             * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
             *
             * See {setApprovalForAll}.
             */
            function isApprovedForAll(address account, address operator) external view returns (bool);
        
            /**
             * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
             *
             * Emits a {TransferSingle} event.
             *
             * Requirements:
             *
             * - `to` cannot be the zero address.
             * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
             * - `from` must have a balance of tokens of type `id` of at least `amount`.
             * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
             * acceptance magic value.
             */
            function safeTransferFrom(
                address from,
                address to,
                uint256 id,
                uint256 amount,
                bytes calldata data
            ) external;
        
            /**
             * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
             *
             * Emits a {TransferBatch} event.
             *
             * Requirements:
             *
             * - `ids` and `amounts` must have the same length.
             * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
             * acceptance magic value.
             */
            function safeBatchTransferFrom(
                address from,
                address to,
                uint256[] calldata ids,
                uint256[] calldata amounts,
                bytes calldata data
            ) external;
        }
        
        // File: contracts\model\IERC1155Views.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        
        /**
         * @title IERC1155Views - An optional utility interface to improve the ERC-1155 Standard.
         * @dev This interface introduces some additional capabilities for ERC-1155 Tokens.
         */
        interface IERC1155Views {
        
            /**
             * @dev Returns the total supply of the given token id
             * @param itemId the id of the token whose availability you want to know 
             */
            function totalSupply(uint256 itemId) external view returns (uint256);
        
            /**
             * @dev Returns the name of the given token id
             * @param itemId the id of the token whose name you want to know 
             */
            function name(uint256 itemId) external view returns (string memory);
        
            /**
             * @dev Returns the symbol of the given token id
             * @param itemId the id of the token whose symbol you want to know 
             */
            function symbol(uint256 itemId) external view returns (string memory);
        
            /**
             * @dev Returns the decimals of the given token id
             * @param itemId the id of the token whose decimals you want to know 
             */
            function decimals(uint256 itemId) external view returns (uint256);
        
            /**
             * @dev Returns the uri of the given token id
             * @param itemId the id of the token whose uri you want to know 
             */
            function uri(uint256 itemId) external view returns (string memory);
        }
        
        // File: contracts\model\Item.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        pragma abicoder v2;
        
        
        struct Header {
            address host;
            string name;
            string symbol;
            string uri;
        }
        
        struct CreateItem {
            Header header;
            bytes32 collectionId;
            uint256 id;
            address[] accounts;
            uint256[] amounts;
        }
        
        interface Item is IERC1155, IERC1155Views {
        
            event CollectionItem(bytes32 indexed fromCollectionId, bytes32 indexed toCollectionId, uint256 indexed itemId);
        
            function name() external view returns(string memory);
            function symbol() external view returns(string memory);
            function decimals() external view returns(uint256);
        
            function burn(address account, uint256 itemId, uint256 amount) external;
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) external;
        
            function burn(address account, uint256 itemId, uint256 amount, bytes calldata data) external;
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) external;
        
            function mintItems(CreateItem[] calldata items) external returns(uint256[] memory itemIds);
            function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) external returns(bytes32[] memory oldCollectionIds);
            function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata newValues) external returns(Header[] memory oldValues);
        
            function interoperableOf(uint256 itemId) external view returns(address);
        }
        
        // File: @ethereansos\swissknife\contracts\generic\model\ILazyInitCapableElement.sol
        
        // SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        interface ILazyInitCapableElement is IERC165 {
        
            function lazyInit(bytes calldata lazyInitData) external returns(bytes memory initResponse);
            function initializer() external view returns(address);
        
            event Host(address indexed from, address indexed to);
        
            function host() external view returns(address);
            function setHost(address newValue) external returns(address oldValue);
        
            function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) external view returns(bool);
        }
        
        // File: contracts\projection\IItemProjection.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        //pragma abicoder v2;
        
        
        interface IItemProjection is Item, ILazyInitCapableElement {
        
            function mainInterface() external view returns(address);
        
            function collectionId() external view returns(bytes32);
            function uri() external view returns(string memory);
            function plainUri() external view returns(string memory);
            function itemPlainUri(uint256 itemId) external view returns(string memory);
            function setHeader(Header calldata value) external returns(Header memory oldValue);
        
            function toInteroperableInterfaceAmount(uint256 amount, uint256 itemId, address account) external view returns(uint256);
            function toMainInterfaceAmount(uint256 amount, uint256 itemId) external view returns(uint256);
        }
        
        // File: contracts\projection\multiOperatorHost\model\IMultiOperatorHost.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        //pragma abicoder v2;
        
        interface IMultiOperatorHost is IItemProjection {
        
            event Operator(uint256 indexed op, address indexed from, address indexed to);
        
            function operator(uint256 op) external view returns (address);
        
            function setOperator(uint256 op, address newValue) external returns(address oldValue);
        }
        
        // File: contracts\model\IItemMainInterface.sol
        
        //SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        struct ItemData {
            bytes32 collectionId;
            Header header;
            bytes32 domainSeparator;
            uint256 totalSupply;
            mapping(address => uint256) balanceOf;
            mapping(address => mapping(address => uint256)) allowance;
            mapping(address => uint256) nonces;
        }
        
        interface IItemMainInterface is Item {
        
            event Collection(address indexed from, address indexed to, bytes32 indexed collectionId);
        
            function interoperableInterfaceModel() external view returns(address);
        
            function uri() external view returns(string memory);
            function plainUri() external view returns(string memory);
            function dynamicUriResolver() external view returns(address);
            function hostInitializer() external view returns(address);
        
            function collection(bytes32 collectionId) external view returns(address host, string memory name, string memory symbol, string memory uri);
            function collectionUri(bytes32 collectionId) external view returns(string memory);
            function createCollection(Header calldata _collection, CreateItem[] calldata items) external returns(bytes32 collectionId, uint256[] memory itemIds);
            function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) external returns(Header[] memory oldValues);
        
            function setApprovalForAllByCollectionHost(bytes32 collectionId, address account, address operator, bool approved) external;
        
            function item(uint256 itemId) external view returns(bytes32 collectionId, Header memory header, bytes32 domainSeparator, uint256 totalSupply);
        
            function mintTransferOrBurn(bool isMulti, bytes calldata data) external;
        
            function allowance(address account, address spender, uint256 itemId) external view returns(uint256);
            function approve(address account, address spender, uint256 amount, uint256 itemId) external;
            function TYPEHASH_PERMIT() external view returns (bytes32);
            function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory domainSeparatorName, string memory domainSeparatorVersion);
            function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
            function nonces(address owner, uint256 itemId) external view returns(uint256);
        }
        
        // File: @openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol
        
        // SPDX_License_Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev _Available since v3.1._
         */
        interface IERC1155Receiver is IERC165 {
            /**
             * @dev Handles the receipt of a single ERC1155 token type. This function is
             * called at the end of a `safeTransferFrom` after the balance has been updated.
             *
             * NOTE: To accept the transfer, this must return
             * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
             * (i.e. 0xf23a6e61, or its own function selector).
             *
             * @param operator The address which initiated the transfer (i.e. msg.sender)
             * @param from The address which previously owned the token
             * @param id The ID of the token being transferred
             * @param value The amount of tokens being transferred
             * @param data Additional data with no specified format
             * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
             */
            function onERC1155Received(
                address operator,
                address from,
                uint256 id,
                uint256 value,
                bytes calldata data
            ) external returns (bytes4);
        
            /**
             * @dev Handles the receipt of a multiple ERC1155 token types. This function
             * is called at the end of a `safeBatchTransferFrom` after the balances have
             * been updated.
             *
             * NOTE: To accept the transfer(s), this must return
             * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
             * (i.e. 0xbc197c81, or its own function selector).
             *
             * @param operator The address which initiated the batch transfer (i.e. msg.sender)
             * @param from The address which previously owned the token
             * @param ids An array containing ids of each token being transferred (order and length must match values array)
             * @param values An array containing amounts of each token being transferred (order and length must match ids array)
             * @param data Additional data with no specified format
             * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
             */
            function onERC1155BatchReceived(
                address operator,
                address from,
                uint256[] calldata ids,
                uint256[] calldata values,
                bytes calldata data
            ) external returns (bytes4);
        }
        
        // File: @openzeppelin\contracts\token\ERC20\IERC20.sol
        
        // SPDX_License_Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Interface of the ERC20 standard as defined in the EIP.
         */
        interface IERC20 {
            /**
             * @dev Returns the amount of tokens in existence.
             */
            function totalSupply() external view returns (uint256);
        
            /**
             * @dev Returns the amount of tokens owned by `account`.
             */
            function balanceOf(address account) external view returns (uint256);
        
            /**
             * @dev Moves `amount` tokens from the caller's account to `to`.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transfer(address to, uint256 amount) external returns (bool);
        
            /**
             * @dev Returns the remaining number of tokens that `spender` will be
             * allowed to spend on behalf of `owner` through {transferFrom}. This is
             * zero by default.
             *
             * This value changes when {approve} or {transferFrom} are called.
             */
            function allowance(address owner, address spender) external view returns (uint256);
        
            /**
             * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * IMPORTANT: Beware that changing an allowance with this method brings the risk
             * that someone may use both the old and the new allowance by unfortunate
             * transaction ordering. One possible solution to mitigate this race
             * condition is to first reduce the spender's allowance to 0 and set the
             * desired value afterwards:
             * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
             *
             * Emits an {Approval} event.
             */
            function approve(address spender, uint256 amount) external returns (bool);
        
            /**
             * @dev Moves `amount` tokens from `from` to `to` using the
             * allowance mechanism. `amount` is then deducted from the caller's
             * allowance.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transferFrom(
                address from,
                address to,
                uint256 amount
            ) external returns (bool);
        
            /**
             * @dev Emitted when `value` tokens are moved from one account (`from`) to
             * another (`to`).
             *
             * Note that `value` may be zero.
             */
            event Transfer(address indexed from, address indexed to, uint256 value);
        
            /**
             * @dev Emitted when the allowance of a `spender` for an `owner` is set by
             * a call to {approve}. `value` is the new allowance.
             */
            event Approval(address indexed owner, address indexed spender, uint256 value);
        }
        
        // File: @ethereansos\swissknife\contracts\lib\GeneralUtilities.sol
        
        // SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        library BehaviorUtilities {
        
            function randomKey(uint256 i) internal view returns (bytes32) {
                return keccak256(abi.encode(i, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
            }
        
            function calculateProjectedArraySizeAndLoopUpperBound(uint256 arraySize, uint256 start, uint256 offset) internal pure returns(uint256 projectedArraySize, uint256 projectedArrayLoopUpperBound) {
                if(arraySize != 0 && start < arraySize && offset != 0) {
                    uint256 length = start + offset;
                    if(start < (length = length > arraySize ? arraySize : length)) {
                        projectedArraySize = (projectedArrayLoopUpperBound = length) - start;
                    }
                }
            }
        }
        
        library ReflectionUtilities {
        
            function read(address subject, bytes memory inputData) internal view returns(bytes memory returnData) {
                bool result;
                (result, returnData) = subject.staticcall(inputData);
                if(!result) {
                    assembly {
                        revert(add(returnData, 0x20), mload(returnData))
                    }
                }
            }
        
            function submit(address subject, uint256 value, bytes memory inputData) internal returns(bytes memory returnData) {
                bool result;
                (result, returnData) = subject.call{value : value}(inputData);
                if(!result) {
                    assembly {
                        revert(add(returnData, 0x20), mload(returnData))
                    }
                }
            }
        
            function isContract(address subject) internal view returns (bool) {
                if(subject == address(0)) {
                    return false;
                }
                uint256 codeLength;
                assembly {
                    codeLength := extcodesize(subject)
                }
                return codeLength > 0;
            }
        
            function clone(address originalContract) internal returns(address copyContract) {
                assembly {
                    mstore(
                        0,
                        or(
                            0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                            mul(originalContract, 0x1000000000000000000)
                        )
                    )
                    copyContract := create(0, 0, 32)
                    switch extcodesize(copyContract)
                        case 0 {
                            invalid()
                        }
                }
            }
        }
        
        library BytesUtilities {
        
            bytes private constant ALPHABET = "0123456789abcdef";
            string internal constant BASE64_ENCODER_DATA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        
            function asAddress(bytes memory b) internal pure returns(address) {
                if(b.length == 0) {
                    return address(0);
                }
                if(b.length == 20) {
                    address addr;
                    assembly {
                        addr := mload(add(b, 20))
                    }
                    return addr;
                }
                return abi.decode(b, (address));
            }
        
            function asAddressArray(bytes memory b) internal pure returns(address[] memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (address[]));
                }
            }
        
            function asBool(bytes memory bs) internal pure returns(bool) {
                return asUint256(bs) != 0;
            }
        
            function asBoolArray(bytes memory b) internal pure returns(bool[] memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (bool[]));
                }
            }
        
            function asBytesArray(bytes memory b) internal pure returns(bytes[] memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (bytes[]));
                }
            }
        
            function asString(bytes memory b) internal pure returns(string memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (string));
                }
            }
        
            function asStringArray(bytes memory b) internal pure returns(string[] memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (string[]));
                }
            }
        
            function asUint256(bytes memory bs) internal pure returns(uint256 x) {
                if (bs.length >= 32) {
                    assembly {
                        x := mload(add(bs, add(0x20, 0)))
                    }
                }
            }
        
            function asUint256Array(bytes memory b) internal pure returns(uint256[] memory callResult) {
                if(b.length > 0) {
                    return abi.decode(b, (uint256[]));
                }
            }
        
            function toString(bytes memory data) internal pure returns(string memory) {
                bytes memory str = new bytes(2 + data.length * 2);
                str[0] = "0";
                str[1] = "x";
                for (uint256 i = 0; i < data.length; i++) {
                    str[2+i*2] = ALPHABET[uint256(uint8(data[i] >> 4))];
                    str[3+i*2] = ALPHABET[uint256(uint8(data[i] & 0x0f))];
                }
                return string(str);
            }
        
            function asSingletonArray(bytes memory a) internal pure returns(bytes[] memory array) {
                array = new bytes[](1);
                array[0] = a;
            }
        
            function toBase64(bytes memory data) internal pure returns (string memory) {
                if (data.length == 0) return '';
        
                string memory table = BASE64_ENCODER_DATA;
        
                uint256 encodedLen = 4 * ((data.length + 2) / 3);
        
                string memory result = new string(encodedLen + 32);
        
                assembly {
                    mstore(result, encodedLen)
        
                    let tablePtr := add(table, 1)
        
                    let dataPtr := data
                    let endPtr := add(dataPtr, mload(data))
        
                    let resultPtr := add(result, 32)
        
                    for {} lt(dataPtr, endPtr) {}
                    {
                        dataPtr := add(dataPtr, 3)
                        let input := mload(dataPtr)
        
                        mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                        resultPtr := add(resultPtr, 1)
                        mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                        resultPtr := add(resultPtr, 1)
                        mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                        resultPtr := add(resultPtr, 1)
                        mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                        resultPtr := add(resultPtr, 1)
                    }
        
                    switch mod(mload(data), 3)
                    case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
                    case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
                }
        
                return result;
            }
        }
        
        library StringUtilities {
        
            bytes1 private constant CHAR_0 = bytes1('0');
            bytes1 private constant CHAR_A = bytes1('A');
            bytes1 private constant CHAR_a = bytes1('a');
            bytes1 private constant CHAR_f = bytes1('f');
        
            bytes  internal constant BASE64_DECODER_DATA = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                                           hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                                           hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                                           hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";
        
            function isEmpty(string memory test) internal pure returns (bool) {
                return equals(test, "");
            }
        
            function equals(string memory a, string memory b) internal pure returns(bool) {
                return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
            }
        
            function toLowerCase(string memory str) internal pure returns(string memory) {
                bytes memory bStr = bytes(str);
                for (uint256 i = 0; i < bStr.length; i++) {
                    bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
                }
                return string(bStr);
            }
        
            function asBytes(string memory str) internal pure returns(bytes memory toDecode) {
                bytes memory data = abi.encodePacked(str);
                if(data.length == 0 || data[0] != "0" || (data[1] != "x" && data[1] != "X")) {
                    return "";
                }
                uint256 start = 2;
                toDecode = new bytes((data.length - 2) / 2);
        
                for(uint256 i = 0; i < toDecode.length; i++) {
                    toDecode[i] = bytes1(_fromHexChar(uint8(data[start++])) + _fromHexChar(uint8(data[start++])) * 16);
                }
            }
        
            function toBase64(string memory input) internal pure returns(string memory) {
                return BytesUtilities.toBase64(abi.encodePacked(input));
            }
        
            function fromBase64(string memory _data) internal pure returns (bytes memory) {
                bytes memory data = bytes(_data);
        
                if (data.length == 0) return new bytes(0);
                require(data.length % 4 == 0, "invalid base64 decoder input");
        
                bytes memory table = BASE64_DECODER_DATA;
        
                uint256 decodedLen = (data.length / 4) * 3;
        
                bytes memory result = new bytes(decodedLen + 32);
        
                assembly {
                    let lastBytes := mload(add(data, mload(data)))
                    if eq(and(lastBytes, 0xFF), 0x3d) {
                        decodedLen := sub(decodedLen, 1)
                        if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                            decodedLen := sub(decodedLen, 1)
                        }
                    }
        
                    mstore(result, decodedLen)
        
                    let tablePtr := add(table, 1)
        
                    let dataPtr := data
                    let endPtr := add(dataPtr, mload(data))
        
                    let resultPtr := add(result, 32)
        
                    for {} lt(dataPtr, endPtr) {}
                    {
                       dataPtr := add(dataPtr, 4)
                       let input := mload(dataPtr)
        
                       let output := add(
                           add(
                               shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                               shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                           add(
                               shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                                       and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                            )
                        )
                        mstore(resultPtr, shl(232, output))
                        resultPtr := add(resultPtr, 3)
                    }
                }
        
                return result;
            }
        
            function _fromHexChar(uint8 c) private pure returns (uint8) {
                bytes1 charc = bytes1(c);
                return charc < CHAR_0 || charc > CHAR_f ? 0 : (charc < CHAR_A ? 0 : 10) + c - uint8(charc < CHAR_A ? CHAR_0 : charc < CHAR_a ? CHAR_A : CHAR_a);
            }
        }
        
        library Uint256Utilities {
            function asSingletonArray(uint256 n) internal pure returns(uint256[] memory array) {
                array = new uint256[](1);
                array[0] = n;
            }
        
            function toHex(uint256 _i) internal pure returns (string memory) {
                return BytesUtilities.toString(abi.encodePacked(_i));
            }
        
            function toString(uint256 _i) internal pure returns (string memory _uintAsString) {
                if (_i == 0) {
                    return "0";
                }
                uint256 j = _i;
                uint256 len;
                while (j != 0) {
                    len++;
                    j /= 10;
                }
                bytes memory bstr = new bytes(len);
                uint256 k = len;
                while (_i != 0) {
                    k = k-1;
                    uint8 temp = (48 + uint8(_i - _i / 10 * 10));
                    bytes1 b1 = bytes1(temp);
                    bstr[k] = b1;
                    _i /= 10;
                }
                return string(bstr);
            }
        
            function sum(uint256[] memory arr) internal pure returns (uint256 result) {
                for(uint256 i = 0; i < arr.length; i++) {
                    result += arr[i];
                }
            }
        }
        
        library AddressUtilities {
            function asSingletonArray(address a) internal pure returns(address[] memory array) {
                array = new address[](1);
                array[0] = a;
            }
        
            function toString(address _addr) internal pure returns (string memory) {
                return _addr == address(0) ? "0x0000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(_addr));
            }
        }
        
        library Bytes32Utilities {
        
            function asSingletonArray(bytes32 a) internal pure returns(bytes32[] memory array) {
                array = new bytes32[](1);
                array[0] = a;
            }
        
            function toString(bytes32 bt) internal pure returns (string memory) {
                return bt == bytes32(0) ?  "0x0000000000000000000000000000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(bt));
            }
        }
        
        library TransferUtilities {
            using ReflectionUtilities for address;
        
            function balanceOf(address erc20TokenAddress, address account) internal view returns(uint256) {
                if(erc20TokenAddress == address(0)) {
                    return account.balance;
                }
                return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).balanceOf.selector, account)), (uint256));
            }
        
            function allowance(address erc20TokenAddress, address account, address spender) internal view returns(uint256) {
                if(erc20TokenAddress == address(0)) {
                    return 0;
                }
                return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).allowance.selector, account, spender)), (uint256));
            }
        
            function safeApprove(address erc20TokenAddress, address spender, uint256 value) internal {
                bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, spender, value));
                require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED');
            }
        
            function safeTransfer(address erc20TokenAddress, address to, uint256 value) internal {
                if(value == 0) {
                    return;
                }
                if(erc20TokenAddress == address(0)) {
                    to.submit(value, "");
                    return;
                }
                bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value));
                require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
            }
        
            function safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) internal {
                if(value == 0) {
                    return;
                }
                if(erc20TokenAddress == address(0)) {
                    to.submit(value, "");
                    return;
                }
                bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value));
                require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
            }
        }
        
        // File: @ethereansos\swissknife\contracts\generic\impl\LazyInitCapableElement.sol
        
        // SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        
        abstract contract LazyInitCapableElement is ILazyInitCapableElement {
            using ReflectionUtilities for address;
        
            address public override initializer;
            address public override host;
        
            constructor(bytes memory lazyInitData) {
                if(lazyInitData.length > 0) {
                    _privateLazyInit(lazyInitData);
                }
            }
        
            function lazyInit(bytes calldata lazyInitData) override external returns (bytes memory lazyInitResponse) {
                return _privateLazyInit(lazyInitData);
            }
        
            function supportsInterface(bytes4 interfaceId) override external view returns(bool) {
                return
                    interfaceId == type(IERC165).interfaceId ||
                    interfaceId == this.supportsInterface.selector ||
                    interfaceId == type(ILazyInitCapableElement).interfaceId ||
                    interfaceId == this.lazyInit.selector ||
                    interfaceId == this.initializer.selector ||
                    interfaceId == this.subjectIsAuthorizedFor.selector ||
                    interfaceId == this.host.selector ||
                    interfaceId == this.setHost.selector ||
                    _supportsInterface(interfaceId);
            }
        
            function setHost(address newValue) external override authorizedOnly returns(address oldValue) {
                oldValue = host;
                host = newValue;
                emit Host(oldValue, newValue);
            }
        
            function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) public override virtual view returns(bool) {
                (bool chidlElementValidationIsConsistent, bool chidlElementValidationResult) = _subjectIsAuthorizedFor(subject, location, selector, payload, value);
                if(chidlElementValidationIsConsistent) {
                    return chidlElementValidationResult;
                }
                if(subject == host) {
                    return true;
                }
                if(!host.isContract()) {
                    return false;
                }
                (bool result, bytes memory resultData) = host.staticcall(abi.encodeWithSelector(ILazyInitCapableElement(host).subjectIsAuthorizedFor.selector, subject, location, selector, payload, value));
                return result && abi.decode(resultData, (bool));
            }
        
            function _privateLazyInit(bytes memory lazyInitData) private returns (bytes memory lazyInitResponse) {
                require(initializer == address(0), "init");
                initializer = msg.sender;
                (host, lazyInitResponse) = abi.decode(lazyInitData, (address, bytes));
                emit Host(address(0), host);
                lazyInitResponse = _lazyInit(lazyInitResponse);
            }
        
            function _lazyInit(bytes memory) internal virtual returns (bytes memory) {
                return "";
            }
        
            function _supportsInterface(bytes4 selector) internal virtual view returns (bool);
        
            function _subjectIsAuthorizedFor(address, address, bytes4, bytes calldata, uint256) internal virtual view returns(bool, bool) {
            }
        
            modifier authorizedOnly {
                require(_authorizedOnly(), "unauthorized");
                _;
            }
        
            function _authorizedOnly() internal returns(bool) {
                return subjectIsAuthorizedFor(msg.sender, address(this), msg.sig, msg.data, msg.value);
            }
        }
        
        // File: contracts\util\ERC1155CommonLibrary.sol
        
        //SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        
        library ERC1155CommonLibrary {
            using ReflectionUtilities for address;
        
            function doSafeTransferAcceptanceCheck(
                address operator,
                address from,
                address to,
                uint256 id,
                uint256 amount,
                bytes calldata data
            ) internal {
                if (to.isContract()) {
                    try
                        IERC1155Receiver(to).onERC1155Received(
                            operator,
                            from,
                            id,
                            amount,
                            data
                        )
                    returns (bytes4 response) {
                        if (
                            response != IERC1155Receiver(to).onERC1155Received.selector
                        ) {
                            revert("ERC1155: ERC1155Receiver rejected tokens");
                        }
                    } catch Error(string memory reason) {
                        revert(reason);
                    } catch {
                        revert("ERC1155: transfer to non ERC1155Receiver implementer");
                    }
                }
            }
        
            function doSafeBatchTransferAcceptanceCheck(
                address operator,
                address from,
                address to,
                uint256[] calldata ids,
                uint256[] calldata amounts,
                bytes calldata data
            ) internal {
                if (to.isContract()) {
                    try
                        IERC1155Receiver(to).onERC1155BatchReceived(
                            operator,
                            from,
                            ids,
                            amounts,
                            data
                        )
                    returns (bytes4 response) {
                        if (
                            response !=
                            IERC1155Receiver(to).onERC1155BatchReceived.selector
                        ) {
                            revert("ERC1155: ERC1155Receiver rejected tokens");
                        }
                    } catch Error(string memory reason) {
                        revert(reason);
                    } catch {
                        revert("ERC1155: transfer to non ERC1155Receiver implementer");
                    }
                }
            }
        }
        
        // File: contracts\projection\ItemProjection.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        //pragma abicoder v2;
        
        
        
        
        
        
        
        abstract contract ItemProjection is IItemProjection, LazyInitCapableElement {
            using AddressUtilities for address;
            using BytesUtilities for bytes;
        
            address public override mainInterface;
            bytes32 public override collectionId;
        
            constructor(bytes memory lazyInitData) LazyInitCapableElement(lazyInitData) {
            }
        
            function _lazyInit(bytes memory lazyInitParams) override virtual internal returns(bytes memory lazyInitResponse) {
                (mainInterface, lazyInitResponse) = abi.decode(lazyInitParams, (address, bytes));
                Header memory header;
                CreateItem[] memory items;
                (collectionId, header, items, lazyInitResponse) = abi.decode(lazyInitResponse, (bytes32, Header, CreateItem[], bytes));
                if(collectionId == bytes32(0)) {
                    header.host = address(this);
                    (collectionId,) = IItemMainInterface(mainInterface).createCollection(header, items);
                } else if(items.length > 0) {
                    IItemMainInterface(mainInterface).mintItems(items);
                }
                lazyInitResponse = _projectionLazyInit(lazyInitResponse);
            }
        
            function _supportsInterface(bytes4 interfaceId) override internal pure returns (bool) {
                return
                    interfaceId == type(IItemProjection).interfaceId ||
                    interfaceId == 0xeac989f8 ||//uri()
                    interfaceId == this.mainInterface.selector ||
                    interfaceId == this.collectionId.selector ||
                    interfaceId == this.plainUri.selector ||
                    interfaceId == this.itemPlainUri.selector ||
                    interfaceId == this.setHeader.selector ||
                    interfaceId == this.toInteroperableInterfaceAmount.selector ||
                    interfaceId == this.toMainInterfaceAmount.selector ||
                    interfaceId == this.balanceOf.selector ||
                    interfaceId == this.balanceOfBatch.selector ||
                    interfaceId == this.setApprovalForAll.selector ||
                    interfaceId == this.isApprovedForAll.selector ||
                    interfaceId == this.safeTransferFrom.selector ||
                    interfaceId == this.safeBatchTransferFrom.selector ||
                    interfaceId == 0xd9b67a26 ||//OpenSea Standard
                    interfaceId == type(IERC1155Views).interfaceId ||
                    interfaceId == this.totalSupply.selector ||
                    interfaceId == 0x00ad800c ||//name(uint256)
                    interfaceId == 0x4e41a1fb ||//symbol(uint256)
                    interfaceId == 0x3f47e662 ||//decimals(uint256)
                    interfaceId == 0x313ce567 ||//decimals()
                    interfaceId == 0x0e89341c ||//uri(uint256)
                    interfaceId == type(Item).interfaceId ||
                    interfaceId == 0x06fdde03 ||//name()
                    interfaceId == 0x95d89b41 ||//symbol()
                    interfaceId == 0xf5298aca ||//burn(address,uint256,uint256)
                    interfaceId == 0x6b20c454 ||//burnBatch(address,uint256[],uint256[])
                    interfaceId == 0x8a94b05f ||//burn(address,uint256,uint256,bytes)
                    interfaceId == 0x5473422e ||//burnBatch(address,uint256[],uint256[],bytes)
                    interfaceId == this.mintItems.selector ||
                    interfaceId == this.setItemsCollection.selector ||
                    interfaceId == this.setItemsMetadata.selector ||
                    interfaceId == this.interoperableOf.selector;
            }
        
            function _projectionLazyInit(bytes memory) internal virtual returns (bytes memory) {
                return "";
            }
        
            function setHeader(Header calldata value) authorizedOnly override external virtual returns(Header memory oldValue) {
                Header[] memory values = new Header[](1);
                values[0] = value;
                bytes32[] memory collectionIds = new bytes32[](1);
                collectionIds[0] = collectionId;
                return IItemMainInterface(mainInterface).setCollectionsMetadata(collectionIds, values)[0];
            }
        
            function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata values) authorizedOnly override external virtual returns(Header[] memory oldValues) {
                return IItemMainInterface(mainInterface).setItemsMetadata(itemIds, values);
            }
        
            function mintItems(CreateItem[] memory items) authorizedOnly virtual override public returns(uint256[] memory itemIds) {
                uint256 multiplier = 10 ** (18 - decimals(0));
                for(uint256 i = 0; i < items.length; i++) {
                    items[i].collectionId = collectionId;
                    uint256[] memory amounts = items[i].amounts;
                    for(uint256 z = 0; z < amounts.length; z++) {
                        amounts[z] = amounts[z] * multiplier;
                    }
                    items[i].amounts = amounts;
                }
                return IItemMainInterface(mainInterface).mintItems(items);
            }
        
            function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) authorizedOnly virtual override external returns(bytes32[] memory oldCollectionIds) {
                return IItemMainInterface(mainInterface).setItemsCollection(itemIds, collectionIds);
            }
        
            function name() override external view returns(string memory value) {
                (,value,,) = IItemMainInterface(mainInterface).collection(collectionId);
            }
        
            function symbol() override external view returns(string memory value) {
                (,,value,) = IItemMainInterface(mainInterface).collection(collectionId);
            }
        
            function plainUri() override public view returns(string memory value) {
                (,,,value) = IItemMainInterface(mainInterface).collection(collectionId);
            }
        
            function uri() override public view returns(string memory) {
                return IItemMainInterface(mainInterface).collectionUri(collectionId);
            }
        
            function interoperableOf(uint256 itemId) override public pure returns(address) {
                return address(uint160(itemId));
            }
        
            function name(uint256 itemId) override external view returns(string memory) {
                (,Header memory header,,) = IItemMainInterface(mainInterface).item(itemId);
                return header.name;
            }
        
            function symbol(uint256 itemId) override external view returns(string memory) {
                (,Header memory header,,) = IItemMainInterface(mainInterface).item(itemId);
                return header.symbol;
            }
        
            function decimals(uint256) override public virtual view returns(uint256) {
                return 18;
            }
        
            function decimals() external override view returns(uint256) {
                return 18;
            }
        
            function toMainInterfaceAmount(uint256 interoperableInterfaceAmount, uint256 itemId) override public view returns(uint256) {
                if(interoperableInterfaceAmount == 0) {
                    return 0;
                }
                uint256 itemDecimals = decimals(itemId);
                if(itemDecimals == 18) {
                    return interoperableInterfaceAmount;
                }
                uint256 interoperableTotalSupply = IERC20(interoperableOf(itemId)).totalSupply();
                uint256 interoperableUnity = 1e18;
                uint256 interoperableHalfUnity = (interoperableUnity / 51) * 100;
                uint256 mainInterfaceUnity = 10 ** itemDecimals;
                if(interoperableTotalSupply <= interoperableUnity && interoperableInterfaceAmount <= interoperableUnity) {
                    return interoperableInterfaceAmount < interoperableHalfUnity ? 0 : mainInterfaceUnity;
                }
                return (interoperableInterfaceAmount * mainInterfaceUnity) / interoperableUnity;
            }
        
            function toInteroperableInterfaceAmount(uint256 mainInterfaceAmount, uint256 itemId, address account) override public view returns(uint256) {
                if(mainInterfaceAmount == 0) {
                    return 0;
                }
                if(decimals(itemId) == 18) {
                    return mainInterfaceAmount;
                }
                uint256 interoperableInterfaceAmount = mainInterfaceAmount * 10 ** (18 - decimals(itemId));
                if(account == address(0)) {
                    return interoperableInterfaceAmount;
                }
                uint256 interoperableBalance = IItemMainInterface(mainInterface).balanceOf(account, itemId);
                if(interoperableBalance == 0) {
                    return interoperableInterfaceAmount;
                }
                uint256 interoperableTotalSupply = IERC20(interoperableOf(itemId)).totalSupply();
                uint256 interoperableUnity = 1e18;
                uint256 interoperableHalfUnity = (interoperableUnity / 51) * 100;
                if(interoperableTotalSupply <= interoperableUnity && interoperableInterfaceAmount == interoperableUnity && interoperableBalance >= interoperableHalfUnity) {
                    return interoperableBalance < interoperableInterfaceAmount ? interoperableBalance : interoperableInterfaceAmount;
                }
                return interoperableInterfaceAmount;
            }
        
            function uri(uint256 itemId) override external view returns(string memory) {
                return IItemMainInterface(mainInterface).uri(itemId);
            }
        
            function itemPlainUri(uint256 itemId) override external view returns(string memory) {
                (, Header memory header,,) = IItemMainInterface(mainInterface).item(itemId);
                return header.uri;
            }
        
            function totalSupply(uint256 itemId) override external view returns (uint256) {
                return IItemMainInterface(mainInterface).totalSupply(itemId);
            }
        
            function balanceOf(address account, uint256 itemId) override external view returns (uint256) {
                return toMainInterfaceAmount(IItemMainInterface(mainInterface).balanceOf(account, itemId), itemId);
            }
        
            function balanceOfBatch(address[] calldata accounts, uint256[] calldata itemIds) override external view returns (uint256[] memory balances) {
                balances = IItemMainInterface(mainInterface).balanceOfBatch(accounts, itemIds);
                for(uint256 i = 0; i < itemIds.length; i++) {
                    balances[i] = toMainInterfaceAmount(balances[i], itemIds[i]);
                }
            }
        
            function isApprovedForAll(address account, address operator) override external view returns (bool) {
                return IItemMainInterface(mainInterface).isApprovedForAll(account, operator);
            }
        
            function setApprovalForAll(address operator, bool approved) override external virtual {
                IItemMainInterface(mainInterface).setApprovalForAllByCollectionHost(collectionId, msg.sender, operator, approved);
            }
        
            function safeTransferFrom(address from, address to, uint256 itemId, uint256 amount, bytes calldata data) override external virtual {
                require(from != address(0), "required from");
                require(to != address(0), "required to");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(msg.sender, from, to, itemId, toInteroperableInterfaceAmount(amount, itemId, from)));
                ERC1155CommonLibrary.doSafeTransferAcceptanceCheck(msg.sender, from, to, itemId, amount, data);
                emit TransferSingle(msg.sender, from, to, itemId, amount);
            }
        
            function safeBatchTransferFrom(address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) override external virtual {
                require(from != address(0), "required from");
                require(to != address(0), "required to");
                uint256[] memory interoperableInterfaceAmounts = new uint256[](amounts.length);
                for(uint256 i = 0 ; i < interoperableInterfaceAmounts.length; i++) {
                    interoperableInterfaceAmounts[i] = toInteroperableInterfaceAmount(amounts[i], itemIds[i], from);
                }
                IItemMainInterface(mainInterface).mintTransferOrBurn(true, abi.encode(true, abi.encode(abi.encode(msg.sender, from, to, itemIds, interoperableInterfaceAmounts).asSingletonArray())));
                ERC1155CommonLibrary.doSafeBatchTransferAcceptanceCheck(msg.sender, from, to, itemIds, amounts, data);
                emit TransferBatch(msg.sender, from, to, itemIds, amounts);
            }
        
            function burn(address account, uint256 itemId, uint256 amount) override external {
                burn(account, itemId, amount, "");
            }
        
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) override external {
                burnBatch(account, itemIds, amounts, "");
            }
        
            function burn(address account, uint256 itemId, uint256 amount, bytes memory) override virtual public {
                require(account != address(0), "required account");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(msg.sender, account, address(0), itemId, toInteroperableInterfaceAmount(amount, itemId, account)));
                emit TransferSingle(msg.sender, account, address(0), itemId, amount);
            }
        
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes memory) override virtual public {
                require(account != address(0), "required account");
                uint256[] memory interoperableInterfaceAmounts = new uint256[](amounts.length);
                for(uint256 i = 0 ; i < interoperableInterfaceAmounts.length; i++) {
                    interoperableInterfaceAmounts[i] = toInteroperableInterfaceAmount(amounts[i], itemIds[i], account);
                }
                IItemMainInterface(mainInterface).mintTransferOrBurn(true, abi.encode(true, abi.encode(abi.encode(msg.sender, account, address(0), itemIds, interoperableInterfaceAmounts).asSingletonArray())));
                emit TransferBatch(msg.sender, account, address(0), itemIds, amounts);
            }
        }
        
        // File: contracts\projection\multiOperatorHost\impl\MultiOperatorHost.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        //pragma abicoder v2;
        
        
        contract MultiOperatorHost is IMultiOperatorHost, ItemProjection {
            using BytesUtilities for bytes;
        
            mapping(uint256 => address) public override operator;
        
            constructor(bytes memory lazyInitData) ItemProjection(lazyInitData) {
            }
        
            function _projectionLazyInit(bytes memory lazyInitData) internal override returns(bytes memory) {
                require(host == address(0), "No host allowed");
                (uint256[] memory ops, address[] memory authorized) = abi.decode(lazyInitData, (uint256[], address[]));
                for(uint256 i = 0; i < ops.length; i++) {
                    _setOperator(ops[i], authorized[i]);
                }
                return "";
            }
        
            function setOperator(uint256 op, address newValue) external override returns(address oldValue) {
                require(operator[op] == msg.sender, "Unauthorized");
                return _setOperator(op, newValue);
            }
        
            function setApprovalForAll(address, bool) authorizedOnly override(ItemProjection, IERC1155) external {
                revert();
            }
        
            function setHeader(Header memory value) authorizedOnly override(IItemProjection, ItemProjection) external returns(Header memory oldValue) {
                value.host = address(this);
                Header[] memory values = new Header[](1);
                values[0] = value;
                bytes32[] memory collectionIds = new bytes32[](1);
                collectionIds[0] = collectionId;
                oldValue = IItemMainInterface(mainInterface).setCollectionsMetadata(collectionIds, values)[0];
                (address currentHost,,,) =  IItemMainInterface(mainInterface).collection(collectionId);
                require(currentHost == address(this), "Invalid change");
                return oldValue;
            }
        
            function safeTransferFrom(address from, address to, uint256 itemId, uint256 amount, bytes calldata data) authorizedOnly override(ItemProjection, IERC1155) external {
                require(from != address(0), "required from");
                require(to != address(0), "required to");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(from, from, to, itemId, toInteroperableInterfaceAmount(amount, itemId, from)));
                ERC1155CommonLibrary.doSafeTransferAcceptanceCheck(msg.sender, from, to, itemId, amount, data);
                emit TransferSingle(msg.sender, from, to, itemId, amount);
            }
        
            function safeBatchTransferFrom(address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) authorizedOnly override(ItemProjection, IERC1155) external {
                require(from != address(0), "required from");
                require(to != address(0), "required to");
                uint256[] memory interoperableInterfaceAmounts = new uint256[](amounts.length);
                for(uint256 i = 0 ; i < interoperableInterfaceAmounts.length; i++) {
                    interoperableInterfaceAmounts[i] = toInteroperableInterfaceAmount(amounts[i], itemIds[i], from);
                }
                IItemMainInterface(mainInterface).mintTransferOrBurn(true, abi.encode(true, abi.encode(abi.encode(from, from, to, itemIds, interoperableInterfaceAmounts).asSingletonArray())));
                ERC1155CommonLibrary.doSafeBatchTransferAcceptanceCheck(msg.sender, from, to, itemIds, amounts, data);
                emit TransferBatch(msg.sender, from, to, itemIds, amounts);
            }
        
            function burn(address account, uint256 itemId, uint256 amount, bytes memory) authorizedOnly override(ItemProjection, Item) public {
                require(account != address(0), "required account");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(account, account, address(0), itemId, toInteroperableInterfaceAmount(amount, itemId, account)));
                emit TransferSingle(msg.sender, account, address(0), itemId, amount);
            }
        
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes memory) authorizedOnly override(ItemProjection, Item) public {
                require(account != address(0), "required account");
                uint256[] memory interoperableInterfaceAmounts = new uint256[](amounts.length);
                for(uint256 i = 0 ; i < interoperableInterfaceAmounts.length; i++) {
                    interoperableInterfaceAmounts[i] = toInteroperableInterfaceAmount(amounts[i], itemIds[i], account);
                }
                IItemMainInterface(mainInterface).mintTransferOrBurn(true, abi.encode(true, abi.encode(abi.encode(account, account, address(0), itemIds, interoperableInterfaceAmounts).asSingletonArray())));
                emit TransferBatch(msg.sender, account, address(0), itemIds, amounts);
            }
        
            function _setOperator(uint256 op, address newValue) private returns(address oldValue) {
                require(op > 0, "invalid op");
                oldValue = operator[op];
                operator[op] = newValue;
                emit Operator(op, oldValue, newValue);
            }
        
            function _subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata, uint256) internal virtual override view returns(bool, bool) {
                //1 = mintItems, 2 = burn, 3 = transfer, 4 = setMetadata, 5 = itemsCollection
                uint256 op = selector == this.mintItems.selector ? 1 :
                    /*(
                        selector == 0xf5298aca ||//burn(address,uint256,uint256)
                        selector == 0x6b20c454 ||//burnBatch(address,uint256[],uint256[])
                        selector == 0x8a94b05f ||//burn(address,uint256,uint256,bytes)
                        selector == 0x5473422e   //burnBatch(address,uint256[],uint256[],bytes)
                    ) ? 2 :
                    (selector == this.safeTransferFrom.selector || selector == this.safeBatchTransferFrom.selector) ? 3 :*/
                    (selector == this.setHeader.selector || selector == this.setItemsMetadata.selector) ? 4 : 0;
                    //selector == this.setItemsCollection.selector ? 5 : 0;
                return(true, op > 0 && location == address(this) && operator[op] == subject);
            }
        }

        File 2 of 2: ItemInteroperableInterface
        // File: node_modules\@openzeppelin\contracts\utils\introspection\IERC165.sol
        
        // SPDX-License-Identifier: MIT
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Interface of the ERC165 standard, as defined in the
         * https://eips.ethereum.org/EIPS/eip-165[EIP].
         *
         * Implementers can declare support of contract interfaces, which can then be
         * queried by others ({ERC165Checker}).
         *
         * For an implementation, see {ERC165}.
         */
        interface IERC165 {
            /**
             * @dev Returns true if this contract implements the interface defined by
             * `interfaceId`. See the corresponding
             * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
             * to learn more about how these ids are created.
             *
             * This function call must use less than 30 000 gas.
             */
            function supportsInterface(bytes4 interfaceId) external view returns (bool);
        }
        
        // File: @openzeppelin\contracts\token\ERC1155\IERC1155.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity ^0.8.0;
        
        
        /**
         * @dev Required interface of an ERC1155 compliant contract, as defined in the
         * https://eips.ethereum.org/EIPS/eip-1155[EIP].
         *
         * _Available since v3.1._
         */
        interface IERC1155 is IERC165 {
            /**
             * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
             */
            event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
        
            /**
             * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
             * transfers.
             */
            event TransferBatch(
                address indexed operator,
                address indexed from,
                address indexed to,
                uint256[] ids,
                uint256[] values
            );
        
            /**
             * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
             * `approved`.
             */
            event ApprovalForAll(address indexed account, address indexed operator, bool approved);
        
            /**
             * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
             *
             * If an {URI} event was emitted for `id`, the standard
             * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
             * returned by {IERC1155MetadataURI-uri}.
             */
            event URI(string value, uint256 indexed id);
        
            /**
             * @dev Returns the amount of tokens of token type `id` owned by `account`.
             *
             * Requirements:
             *
             * - `account` cannot be the zero address.
             */
            function balanceOf(address account, uint256 id) external view returns (uint256);
        
            /**
             * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
             *
             * Requirements:
             *
             * - `accounts` and `ids` must have the same length.
             */
            function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
                external
                view
                returns (uint256[] memory);
        
            /**
             * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
             *
             * Emits an {ApprovalForAll} event.
             *
             * Requirements:
             *
             * - `operator` cannot be the caller.
             */
            function setApprovalForAll(address operator, bool approved) external;
        
            /**
             * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
             *
             * See {setApprovalForAll}.
             */
            function isApprovedForAll(address account, address operator) external view returns (bool);
        
            /**
             * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
             *
             * Emits a {TransferSingle} event.
             *
             * Requirements:
             *
             * - `to` cannot be the zero address.
             * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
             * - `from` must have a balance of tokens of type `id` of at least `amount`.
             * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
             * acceptance magic value.
             */
            function safeTransferFrom(
                address from,
                address to,
                uint256 id,
                uint256 amount,
                bytes calldata data
            ) external;
        
            /**
             * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
             *
             * Emits a {TransferBatch} event.
             *
             * Requirements:
             *
             * - `ids` and `amounts` must have the same length.
             * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
             * acceptance magic value.
             */
            function safeBatchTransferFrom(
                address from,
                address to,
                uint256[] calldata ids,
                uint256[] calldata amounts,
                bytes calldata data
            ) external;
        }
        
        // File: contracts\model\IERC1155Views.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        
        /**
         * @title IERC1155Views - An optional utility interface to improve the ERC-1155 Standard.
         * @dev This interface introduces some additional capabilities for ERC-1155 Tokens.
         */
        interface IERC1155Views {
        
            /**
             * @dev Returns the total supply of the given token id
             * @param itemId the id of the token whose availability you want to know 
             */
            function totalSupply(uint256 itemId) external view returns (uint256);
        
            /**
             * @dev Returns the name of the given token id
             * @param itemId the id of the token whose name you want to know 
             */
            function name(uint256 itemId) external view returns (string memory);
        
            /**
             * @dev Returns the symbol of the given token id
             * @param itemId the id of the token whose symbol you want to know 
             */
            function symbol(uint256 itemId) external view returns (string memory);
        
            /**
             * @dev Returns the decimals of the given token id
             * @param itemId the id of the token whose decimals you want to know 
             */
            function decimals(uint256 itemId) external view returns (uint256);
        
            /**
             * @dev Returns the uri of the given token id
             * @param itemId the id of the token whose uri you want to know 
             */
            function uri(uint256 itemId) external view returns (string memory);
        }
        
        // File: contracts\model\Item.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        pragma abicoder v2;
        
        
        
        struct Header {
            address host;
            string name;
            string symbol;
            string uri;
        }
        
        struct CreateItem {
            Header header;
            bytes32 collectionId;
            uint256 id;
            address[] accounts;
            uint256[] amounts;
        }
        
        interface Item is IERC1155, IERC1155Views {
        
            event CollectionItem(bytes32 indexed fromCollectionId, bytes32 indexed toCollectionId, uint256 indexed itemId);
        
            function name() external view returns(string memory);
            function symbol() external view returns(string memory);
            function decimals() external view returns(uint256);
        
            function burn(address account, uint256 itemId, uint256 amount) external;
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) external;
        
            function burn(address account, uint256 itemId, uint256 amount, bytes calldata data) external;
            function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) external;
        
            function mintItems(CreateItem[] calldata items) external returns(uint256[] memory itemIds);
            function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) external returns(bytes32[] memory oldCollectionIds);
            function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata newValues) external returns(Header[] memory oldValues);
        
            function interoperableOf(uint256 itemId) external view returns(address);
        }
        
        // File: contracts\model\IItemMainInterface.sol
        
        //SPDX_License_Identifier: MIT
        pragma solidity >=0.7.0;
        
        
        struct ItemData {
            bytes32 collectionId;
            Header header;
            bytes32 domainSeparator;
            uint256 totalSupply;
            mapping(address => uint256) balanceOf;
            mapping(address => mapping(address => uint256)) allowance;
            mapping(address => uint256) nonces;
        }
        
        interface IItemMainInterface is Item {
        
            event Collection(address indexed from, address indexed to, bytes32 indexed collectionId);
        
            function interoperableInterfaceModel() external view returns(address);
        
            function uri() external view returns(string memory);
            function plainUri() external view returns(string memory);
            function dynamicUriResolver() external view returns(address);
            function hostInitializer() external view returns(address);
        
            function collection(bytes32 collectionId) external view returns(address host, string memory name, string memory symbol, string memory uri);
            function collectionUri(bytes32 collectionId) external view returns(string memory);
            function createCollection(Header calldata _collection, CreateItem[] calldata items) external returns(bytes32 collectionId, uint256[] memory itemIds);
            function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) external returns(Header[] memory oldValues);
        
            function setApprovalForAllByCollectionHost(bytes32 collectionId, address account, address operator, bool approved) external;
        
            function item(uint256 itemId) external view returns(bytes32 collectionId, Header memory header, bytes32 domainSeparator, uint256 totalSupply);
        
            function mintTransferOrBurn(bool isMulti, bytes calldata data) external;
        
            function allowance(address account, address spender, uint256 itemId) external view returns(uint256);
            function approve(address account, address spender, uint256 amount, uint256 itemId) external;
            function TYPEHASH_PERMIT() external view returns (bytes32);
            function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory domainSeparatorName, string memory domainSeparatorVersion);
            function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
            function nonces(address owner, uint256 itemId) external view returns(uint256);
        }
        
        // File: @openzeppelin\contracts\token\ERC20\IERC20.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Interface of the ERC20 standard as defined in the EIP.
         */
        interface IERC20 {
            /**
             * @dev Returns the amount of tokens in existence.
             */
            function totalSupply() external view returns (uint256);
        
            /**
             * @dev Returns the amount of tokens owned by `account`.
             */
            function balanceOf(address account) external view returns (uint256);
        
            /**
             * @dev Moves `amount` tokens from the caller's account to `recipient`.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transfer(address recipient, uint256 amount) external returns (bool);
        
            /**
             * @dev Returns the remaining number of tokens that `spender` will be
             * allowed to spend on behalf of `owner` through {transferFrom}. This is
             * zero by default.
             *
             * This value changes when {approve} or {transferFrom} are called.
             */
            function allowance(address owner, address spender) external view returns (uint256);
        
            /**
             * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * IMPORTANT: Beware that changing an allowance with this method brings the risk
             * that someone may use both the old and the new allowance by unfortunate
             * transaction ordering. One possible solution to mitigate this race
             * condition is to first reduce the spender's allowance to 0 and set the
             * desired value afterwards:
             * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
             *
             * Emits an {Approval} event.
             */
            function approve(address spender, uint256 amount) external returns (bool);
        
            /**
             * @dev Moves `amount` tokens from `sender` to `recipient` using the
             * allowance mechanism. `amount` is then deducted from the caller's
             * allowance.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transferFrom(
                address sender,
                address recipient,
                uint256 amount
            ) external returns (bool);
        
            /**
             * @dev Emitted when `value` tokens are moved from one account (`from`) to
             * another (`to`).
             *
             * Note that `value` may be zero.
             */
            event Transfer(address indexed from, address indexed to, uint256 value);
        
            /**
             * @dev Emitted when the allowance of a `spender` for an `owner` is set by
             * a call to {approve}. `value` is the new allowance.
             */
            event Approval(address indexed owner, address indexed spender, uint256 value);
        }
        
        // File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity ^0.8.0;
        
        
        /**
         * @dev Interface for the optional metadata functions from the ERC20 standard.
         *
         * _Available since v4.1._
         */
        interface IERC20Metadata is IERC20 {
            /**
             * @dev Returns the name of the token.
             */
            function name() external view returns (string memory);
        
            /**
             * @dev Returns the symbol of the token.
             */
            function symbol() external view returns (string memory);
        
            /**
             * @dev Returns the decimals places of the token.
             */
            function decimals() external view returns (uint8);
        }
        
        // File: @openzeppelin\contracts\token\ERC20\extensions\draft-IERC20Permit.sol
        
        // SPDX_License_Identifier: MIT
        
        pragma solidity ^0.8.0;
        
        /**
         * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
         * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
         *
         * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
         * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
         * need to send a transaction, and thus is not required to hold Ether at all.
         */
        interface IERC20Permit {
            /**
             * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
             * given ``owner``'s signed approval.
             *
             * IMPORTANT: The same issues {IERC20-approve} has related to transaction
             * ordering also apply here.
             *
             * Emits an {Approval} event.
             *
             * Requirements:
             *
             * - `spender` cannot be the zero address.
             * - `deadline` must be a timestamp in the future.
             * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
             * over the EIP712-formatted function arguments.
             * - the signature must use ``owner``'s current nonce (see {nonces}).
             *
             * For more information on the signature format, see the
             * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
             * section].
             */
            function permit(
                address owner,
                address spender,
                uint256 value,
                uint256 deadline,
                uint8 v,
                bytes32 r,
                bytes32 s
            ) external;
        
            /**
             * @dev Returns the current nonce for `owner`. This value must be
             * included whenever a signature is generated for {permit}.
             *
             * Every successful call to {permit} increases ``owner``'s nonce by one. This
             * prevents a signature from being used multiple times.
             */
            function nonces(address owner) external view returns (uint256);
        
            /**
             * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
             */
            // solhint-disable-next-line func-name-mixedcase
            function DOMAIN_SEPARATOR() external view returns (bytes32);
        }
        
        // File: contracts\model\IItemInteroperableInterface.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        
        
        
        
        interface IItemInteroperableInterface is IERC20, IERC20Metadata, IERC20Permit {
        
            function init() external;
            function mainInterface() external view returns(address);
            function itemId() external view returns(uint256);
            function emitEvent(bool forApprove, bool isMulti, bytes calldata data) external;
            function burn(uint256 amount) external;
            function burnFrom(address account, uint256 amount) external;
            function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory name, string memory version);
        }
        
        // File: contracts\impl\ItemInteroperableInterface.sol
        
        //SPDX_License_Identifier: MIT
        
        pragma solidity >=0.7.0;
        
        
        
        contract ItemInteroperableInterface is IItemInteroperableInterface {
        
            address public override mainInterface;
        
            function init() override external {
                require(mainInterface == address(0));
                mainInterface = msg.sender;
            }
        
            function DOMAIN_SEPARATOR() external override view returns (bytes32 domainSeparatorValue) {
                (,,domainSeparatorValue,) = IItemMainInterface(mainInterface).item(itemId());
            }
        
            function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external override view returns(string memory, string memory) {
                return IItemMainInterface(mainInterface).EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION();
            }
        
            function itemId() override public view returns(uint256) {
                return uint160(address(this));
            }
        
            function emitEvent(bool forApprove, bool isMulti, bytes calldata data) override external {
                require(msg.sender == mainInterface, "Unauthorized");
                if(isMulti) {
                    (address[] memory froms, address[] memory tos, uint256[] memory amounts) = abi.decode(data, (address[], address[], uint256[]));
                    for(uint256 i = 0; i < froms.length; i++) {
                        if(forApprove) {
                            emit Approval(froms[i], tos[i], amounts[i]);
                        } else {
                            emit Transfer(froms[i], tos[i], amounts[i]);
                        }
                    }
                    return;
                }
                (address from, address to, uint256 amount) = abi.decode(data, (address, address, uint256));
                if(forApprove) {
                    emit Approval(from, to, amount);
                } else {
                    emit Transfer(from, to, amount);
               }
            }
        
            function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) override external {
                IItemMainInterface(mainInterface).permit(itemId(), owner, spender, value, deadline, v, r, s);
                emit Approval(owner, spender, value);
            }
        
            function burn(uint256 amount) override external {
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(msg.sender, msg.sender, address(0), itemId(), amount));
                emit Transfer(msg.sender, address(0), amount);
            }
        
            function burnFrom(address account, uint256 amount) external override {
                require(account != address(0), "burn zero address");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(msg.sender, account, address(0), itemId(), amount));
                emit Transfer(msg.sender, address(0), amount);
            }
        
            function name() override external view returns (string memory) {
                (, Header memory header,,) = IItemMainInterface(mainInterface).item(itemId());
                return header.name;
            }
        
            function symbol() override external view returns (string memory) {
                (, Header memory header,,) = IItemMainInterface(mainInterface).item(itemId());
                return header.symbol;
            }
        
            function decimals() override external pure returns (uint8) {
                return 18;
            }
        
            function nonces(address owner) external override view returns(uint256) {
                return IItemMainInterface(mainInterface).nonces(owner, itemId());
            }
        
            function totalSupply() override external view returns (uint256 totalSupplyValue) {
                (,,, totalSupplyValue) = IItemMainInterface(mainInterface).item(itemId());
            }
        
            function balanceOf(address account) override external view returns (uint256) {
                return IItemMainInterface(mainInterface).balanceOf(account, itemId());
            }
        
            function allowance(address owner, address spender) override external view returns (uint256) {
                return IItemMainInterface(mainInterface).allowance(owner, spender, itemId());
            }
        
            function approve(address spender, uint256 amount) override external returns(bool) {
                IItemMainInterface(mainInterface).approve(msg.sender, spender, amount, itemId());
                emit Approval(msg.sender, spender, amount);
                return true;
            }
        
            function transfer(address recipient, uint256 amount) override external returns(bool) {
                return _transferFrom(msg.sender, recipient, amount);
            }
        
            function transferFrom(address sender, address recipient, uint256 amount) override external returns(bool) {
                return _transferFrom(sender, recipient, amount);
            }
        
            function _transferFrom(address sender, address recipient, uint256 amount) private returns(bool) {
                require(sender != address(0), "transfer from the zero address");
                require(recipient != address(0), "transfer to the zero address");
                IItemMainInterface(mainInterface).mintTransferOrBurn(false, abi.encode(msg.sender, sender, recipient, itemId(), amount));
                emit Transfer(sender, recipient, amount);
                return true;
            }
        }