diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol index b7040ede5..859be7ce4 100644 --- a/precompiles/Precompiles.sol +++ b/precompiles/Precompiles.sol @@ -32,7 +32,7 @@ contract Precompiles { bytes public constant BYTECODE_LOCKUP_TRANCHED = hex"60c0604052346103e457614ef06060813803918261001c816103e8565b9384928339810103126103e45780516001600160a01b038116908190036103e45760208201516001600160a01b03811692908390036103e4576040015161006360406103e8565b92601e84527f5361626c696572205632204c6f636b7570205472616e63686564204e46540000602085015261009860406103e8565b60118152705341422d56322d4c4f434b55502d54524160781b602082015230608052845190946001600160401b0382116102e75760015490600182811c921680156103da575b60208310146102c95781601f84931161036c575b50602090601f8311600114610306575f926102fb575b50508160011b915f199060031b1c1916176001555b83516001600160401b0381116102e757600254600181811c911680156102dd575b60208210146102c957601f8111610266575b50602094601f8211600114610203579481929394955f926101f8575b50508160011b915f199060031b1c1916176002555b5f80546001600160a01b031990811685178255600880549091169290921790915560405192907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a0526001600755614ae2908161040e823960805181613eeb015260a051818181612f4e0152613f940152f35b015190505f8061016c565b601f1982169560025f52805f20915f5b88811061024e57508360019596979810610236575b505050811b01600255610181565b01515f1960f88460031b161c191690555f8080610228565b91926020600181928685015181550194019201610213565b60025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f830160051c810191602084106102bf575b601f0160051c01905b8181106102b45750610150565b5f81556001016102a7565b909150819061029e565b634e487b7160e01b5f52602260045260245ffd5b90607f169061013e565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610108565b60015f9081528281209350601f198516905b818110610354575090846001959493921061033c575b505050811b0160015561011d565b01515f1960f88460031b161c191690555f808061032e565b92936020600181928786015181550195019301610318565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c810191602085106103d0575b90601f859493920160051c01905b8181106103c257506100f2565b5f81558493506001016103b5565b90915081906103a7565b91607f16916100de565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102e75760405256fe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a71461331a57508063027b6744146132f857806306fdde0314613204578063081812fc146131e6578063095ea7b3146130e15780631400ecec146130305780631c1cdd4c14612fa75780631e99d56914612f8a57806323b872dd14612f715780632fe4304114612f3757806332fbe22b14612dda57806340e58ee514612ac5578063425d30dd14612a7357806342842e0e14612a4957806342966c681461286c57806344267570146128455780634857501f146127cf5780634869e12d146127935780634cc55e111461230157806357404b12146122695780636352211e146122395780636d0cee751461223957806370a08231146121ce57806375829def1461215c5780637cad6cd1146120505780637de6b1db14611e5b5780637f5799f914611dff5780638659c27014611a5b578063894e9a0d14611707578063897f362b146114395780638f69b9931461139e5780639067b6771461134d57806395d89b4114611240578063a22cb4651461118a578063a80fc07114611137578063ad35efd4146110c4578063b256456914611072578063b88d4fde14610fe1578063b8a3be6614610fac578063b971302a14610f5c578063bc2be1be14610f0b578063c156a11d14610a60578063c87b56dd14610944578063d4dbd20b146108f1578063d511609f146108a4578063d975dfed14610857578063e985e9c514610804578063ea5ead1914610713578063eac8f5b8146106c0578063f590c17614610663578063f851a4401461063d5763fdd46d601461025a575f80fd5b346104d65760603660031901126104d65760043590610277613478565b604435926001600160801b0384169384810361063957610295613ee1565b818452600960205260ff600160408620015460a81c161561062757818452600960205260ff600160408620015460a01c16610614576001600160a01b03831680156106015785156105ee5782855260036020526001600160a01b0360408620541680821415806105de575b6105c3576001600160801b0361031585614739565b168088116105a85750859684875260096020526001600160a01b0360408820541692858852600960205261035385600260408b20015460801c61475f565b8689526009602052600260408a2001906001600160801b036001600160801b031983549260801b1691161790558588526009602052610397600260408a2001613a2f565b6001600160801b036103bb8160208401511692826040818351169201511690613663565b16111561056c575b8588526009602052857f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b03600160408d200154169461040c818c886148bd565b604051908152a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051868152a18033141580610562575b6104f3575b8133141590816104e8575b816104dd575b50610466578480f35b803b156104d957604051636fd110e960e01b815260048101939093523360248401526001600160a01b039390931660448301526001600160801b031660648201529082908290608490829084905af16104c1575b8080808480f35b816104cb916135ef565b6104d657805f6104ba565b80fd5b8480fd5b90508114155f61045d565b823b15159150610457565b803b1561055e57604051636fd110e960e01b8152600481018590523360248201526001600160a01b03861660448201526001600160801b03841660648201528690818160848183875af1610549575b505061044c565b81610553916135ef565b61055e57855f610542565b8580fd5b50803b1515610447565b858852600960205260016040892001600160a01b60ff60a01b1982541617905585885260096020526040882060ff60f01b1981541690556103c3565b86606491898763287ecaef60e21b8452600452602452604452fd5b606486838663b34359d360e01b835260045233602452604452fd5b506105e884614614565b15610300565b6024858463d2aabcd960e01b8252600452fd5b60248584630ff7ee2d60e31b8252600452fd5b60248483634a5541ef60e01b8252600452fd5b6024848362b8e7e760e51b8252600452fd5b8380fd5b50346104d657806003193601126104d6576001600160a01b036020915416604051908152f35b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57806020926040925260098352205460f81c6040519015158152f35b60249162b8e7e760e51b8252600452fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af5760016040826020946001600160a01b0394526009855220015416604051908152f35b50346104d65760403660031901126104d65760043590610731613478565b61073a83614739565b92610743613ee1565b808352600960205260ff600160408520015460a81c16156107f357808352600960205260ff600160408520015460a01c166107e1576001600160a01b0382169384156107ce576001600160801b0381169485156105ee5782855260036020526001600160a01b0360408620541680821415806105de576105c3576001600160801b0361031585614739565b60248483630ff7ee2d60e31b8252600452fd5b634a5541ef60e01b8352600452602482fd5b62b8e7e760e51b8352600452602482fd5b50346104d65760403660031901126104d6576001600160a01b036040610828613462565b9282610832613478565b9416815260066020522091165f52602052602060ff60405f2054166040519015158152f35b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57602061089383614739565b6001600160801b0360405191168152f35b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57604081602093600293526009845220015460801c604051908152f35b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af5760036040826020946001600160801b0394526009855220015416604051908152f35b50346104d65760203660031901126104d65760043561096281613bc6565b50816001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa908115610a555782916109d2575b604051602080825281906109ce9082018561343d565b0390f35b90503d8083833e6109e381836135ef565b810190602081830312610a515780519067ffffffffffffffff8211610639570181601f82011215610a5157805192610a1a84613611565b92610a2860405194856135ef565b848452602085840101116104d657506109ce92610a4b916020808501910161341c565b5f6109b8565b8280fd5b6040513d84823e3d90fd5b50346104d65760403660031901126104d65760043590610a7e613478565b91610a87613ee1565b808252600960205260ff600160408420015460a81c1615610ef95780825260036020526001600160a01b0360408320541692833303610ee257610ac982614739565b6001600160801b0381169081158015610b51575b5050506001600160a01b03811615610b3e57610b01826001600160a01b0392613d95565b1680610b1a5760248383637e27328960e01b8252600452fd5b90838203610b26578280f35b6064936364283d7b60e01b8452600452602452604452fd5b602483633250574960e11b815280600452fd5b610b59613ee1565b848652600960205260ff600160408820015460a81c1615610ed057848652600960205260ff600160408820015460a01c16610ebd578615610eaa57610e975783855260036020526001600160a01b036040862054168087141580610e87575b610e6c576001600160801b03610bcd86614739565b16808411610e51575084865260096020526001600160a01b03604087205416928587526009602052610c0983600260408a20015460801c61475f565b868852600960205260026040892001906001600160801b036001600160801b031983549260801b1691161790558587526009602052610c4d60026040892001613a2f565b6001600160801b03610c718160208401511692826040818351169201511690613663565b161115610e15575b858752600960205287867f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b03600160408d2001541694610cc38186886148bd565b604051908152a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051878152a18033141580610e0b575b610da0575b823314159081610d95575b81610d8a575b50610d20575b80610add565b813b156104d957604051636fd110e960e01b8152600481018590523360248201526001600160a01b03871660448201526001600160801b03919091166064820152849182908290608490829084905af115610d1a5781610d7f916135ef565b610a5157825f610d1a565b90508214155f610d14565b833b15159150610d0e565b803b1561055e57604051636fd110e960e01b8152600481018690523360248201526001600160a01b03881660448201526001600160801b03831660648201528690818160848183875af1610df6575b5050610d03565b81610e00916135ef565b61055e57855f610def565b50803b1515610cfe565b858752600960205260016040882001600160a01b60ff60a01b1982541617905585875260096020526040872060ff60f01b198154169055610c79565b86606491858863287ecaef60e21b8452600452602452604452fd5b606486888763b34359d360e01b835260045233602452604452fd5b50610e9185614614565b15610bb8565b6024858563d2aabcd960e01b8252600452fd5b60248686630ff7ee2d60e31b8252600452fd5b60248686634a5541ef60e01b8252600452fd5b6024868662b8e7e760e51b8252600452fd5b6044838363216caf0d60e01b825260045233602452fd5b6024925062b8e7e760e51b8252600452fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af5760408160209364ffffffffff935260098452205460a01c16604051908152f35b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af576040816020936001600160a01b03935260098452205416604051908152f35b50346104d65760203660031901126104d65760ff6001604060209360043581526009855220015460a81c166040519015158152f35b50346104d65760803660031901126104d657610ffb613462565b611003613478565b906064359067ffffffffffffffff82116106395736602383011215610639578160040135928461103285613611565b9361104060405195866135ef565b858552366024878301011161106e578561106b96602460209301838801378501015260443591613a82565b80f35b5080fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57600160408260209460ff94526009855220015460b01c166040519015158152f35b50346104d65760203660031901126104d657600435808252600960205260ff600160408420015460a81c1615611126576110fd90613d01565b60405190600581101561111257602092508152f35b602483634e487b7160e01b81526021600452fd5b62b8e7e760e51b8252600452602490fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af5760026040826020946001600160801b0394526009855220015416604051908152f35b50346104d65760403660031901126104d6576111a4613462565b60243590811515809203610a51576001600160a01b031690811561121457338352600660205260408320825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602483837f5b08ba18000000000000000000000000000000000000000000000000000000008252600452fd5b50346104d657806003193601126104d6576040519080600254908160011c91600181168015611343575b60208410811461132f5783865290811561130857506001146112ab575b6109ce84611297818603826135ef565b60405191829160208352602083019061343d565b600281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b8082106112ee5750909150810160200161129782611287565b9192600181602092548385880101520191019092916112d5565b60ff191660208087019190915292151560051b850190920192506112979150839050611287565b602483634e487b7160e01b81526022600452fd5b92607f169261126a565b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af5760408160209364ffffffffff935260098452205460c81c16604051908152f35b50346104d65760203660031901126104d657600435808252600960205260ff600160408420015460a81c1615611126576113d790613d01565b9060058210159081611418576002831491821561142c575b8215611403575b6020836040519015158152f35b90915061141857506004602091145f806113f6565b80634e487b7160e01b602492526021600452fd5b50600383149150806113ef565b50346104d65760203660031901126104d6576004359067ffffffffffffffff82116104d65781360361012060031982011261106e57611476613ee1565b60c4830135906022190181121561106e57820160048101359067ffffffffffffffff8211610a515760248101908260061b80360383136104d95760046020916114be866138ee565b956114cc60405197886135ef565b865282860193010101913683116104d957905b8282106116ed575050508051916114f5836138ee565b9261150360405194856135ef565b808452601f19611512826138ee565b01825b8181106116ca57505064ffffffffff4216926001600160801b0361153882613bf9565b51511664ffffffffff80602061154d85613bf9565b51015116860116604051916115618361359a565b8252602082015261157186613bf9565b5261157b85613bf9565b5060015b8281106116555750505061159584600401613a61565b906115a260248601613a61565b906115af6044870161398f565b6064870135916001600160a01b0383168093036104d657602061164d61160d6116428b8b8b8b8b8b6001600160801b038c6001600160a01b036115f460848a01613a75565b948161160260a48c01613a75565b976040519d8e613569565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e436910161393c565b610100820152613f3b565b604051908152f35b806001600160801b0361166a60019385613c06565b51511664ffffffffff8060206116835f1986018c613c06565b510151168160206116948689613c06565b510151160116604051916116a78361359a565b825260208201526116b88289613c06565b526116c38188613c06565b500161157f565b6020906040516116d98161359a565b5f81525f8382015282828901015201611515565b60206040916116fc3685613906565b8152019101906114df565b50346104d65760203660031901126104d657600435606061016060405161172d816135b6565b84815284602082015284604082015284838201528460808201528460a08201528460c08201528460e08201528461010082015284610120820152604051611773816135d3565b8581528560208201528560408201526101408201520152808252600960205260ff600160408420015460a81c1615611126578082526009602052604082209060405192610140840184811067ffffffffffffffff821117611a47576040528254906001600160a01b0382168552602085019364ffffffffff8360a01c168552856040810164ffffffffff8560c81c168152606082019460ff8160f01c1615158652608083019060f81c1515815260018401549360a08401966001600160a01b0386168852611870600260c087019360ff8960a01c161515855260ff61010060e08a0199828c60a81c1615158b52019960b01c161515895201613a2f565b6101208c019081526118818a613d01565b6005811015611a3357600214611a2b575b5197516001600160a01b0316935164ffffffffff169051151591511515945115159551151596898152600360205260408120546001600160a01b03169b516001600160a01b03169a5164ffffffffff16998152600a6020526040902092511515926040519a6119008c6135b6565b8b5260208b019b8c5260408b01998a5260608b0191825260808b0192835260a08b0193845260c08b0194855260e08b019586526101008b019687526101208b019788526101408b01988952611954906139bb565b986101608b01998a526040519b8c9b60208d52516001600160a01b031660208d0152516001600160a01b031660408c01525164ffffffffff1660608b01525164ffffffffff1660808a015251151560a089015251151560c0880152516001600160a01b031660e08701525115156101008601525115156101208501525115156101408401525180516001600160801b031661016084015260208101516001600160801b0316610180840152604001516001600160801b03166101a0830152516101c082016101c090526101e082016109ce9161350d565b878252611892565b602489634e487b7160e01b81526021600452fd5b602482634e487b7160e01b81526041600452fd5b50346104d65760203660031901126104d65760043567ffffffffffffffff811161106e57611a8d9036906004016134dc565b90611a96613ee1565b82915b808310611aa4578380f35b611aaf83828461396b565b3592611ab9613ee1565b838552600960205260ff600160408720015460a81c1615611ded578385526009602052604085206001015460a01c60ff1615611b025760248585634a5541ef60e01b8252600452fd5b9091928085526009602052604085205460f81c611ddb57611b37815f5260096020526001600160a01b0360405f205416331490565b15611dc557611b4581613c1a565b908086526009602052611b5d60026040882001613a2f565b916001600160801b038351166001600160801b0382161015611db257818752600960205260ff604088205460f01c1615611d9f5790611bb4826001600160801b036020818796818d99511603169501511690613663565b90808452600960205260408420600160f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82541617905580845260096020526040842060ff60f01b1981541690556001600160801b038216918215611d7a575b8185526009602052600360408620016001600160801b0385166001600160801b031982541617905581855260096020526001600160a01b036040862054169180865260036020526001600160a01b0360408720541691818752600960205282847f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50611cde6001600160a01b03600160408d2001541694611cb68b85886148bd565b604080518881526001600160801b03808e166020830152909216908201529081906060820190565b0390a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051838152a1813b611d22575b5050505050506001019190611a99565b813b1561055e57856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611d65575b80808080611d12565b81611d6f916135ef565b61063957835f611d5c565b818552600960205260016040862001600160a01b60ff60a01b19825416179055611c15565b602487836339c6dc7360e21b8252600452fd5b602487836322cad1af60e11b8252600452fd5b63216caf0d60e01b855260045233602452604484fd5b63fe19f19f60e01b8552600452602484fd5b6024858562b8e7e760e51b8252600452fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af576040816109ce93611e479352600a602052206139bb565b60405191829160208352602083019061350d565b50346104d65760203660031901126104d65760043590611e79613ee1565b818152600960205260ff600160408320015460a81c16156106af57611e9d82613d01565b600581101561203c5760048103611ec15750602491634a5541ef60e01b8252600452fd5b60038103611edc575060249163fe19f19f60e01b8252600452fd5b60021461202a57611f01825f5260096020526001600160a01b0360405f205416331490565b1561201457818152600960205260ff604082205460f01c161561200257818192825260096020526040822060ff60f01b1981541690557ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8680a2838152a180825260036020526001600160a01b0360408320541690813b611fa7575050f35b813b15611ffe5782916024839260405194859384927f4501546400000000000000000000000000000000000000000000000000000000845260048401525af1611fed5750f35b81611ff7916135ef565b6104d65780f35b5050fd5b6024916339c6dc7360e21b8252600452fd5b60449163216caf0d60e01b825260045233602452fd5b6024916322cad1af60e11b8252600452fd5b602482634e487b7160e01b81526021600452fd5b50346104d65760203660031901126104d6576004356001600160a01b03811680910361106e576001600160a01b0382541633810361212d575060085490806001600160a01b03198316176008556001600160a01b036040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007545f1981019081116121195760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b7fc6cce6a400000000000000000000000000000000000000000000000000000000835260045233602452604482fd5b50346104d65760203660031901126104d657612176613462565b9080546001600160a01b03811633810361212d57506001600160a01b036001600160a01b031992931691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b50346104d65760203660031901126104d6576001600160a01b036121f0613462565b16801561220d578160409160209352600483522054604051908152f35b6024827f89c62b6400000000000000000000000000000000000000000000000000000000815280600452fd5b50346104d65760203660031901126104d6576020612258600435613bc6565b6001600160a01b0360405191168152f35b50346104d65760203660031901126104d657600435906122876139a3565b50818152600960205260ff600160408320015460a81c16156106af579064ffffffffff604083838295526009602052828282205460a01c169381526009602052205460c81c168251916122d98361359a565b825260208201526122ff8251809264ffffffffff60208092828151168552015116910152565bf35b50346104d65760403660031901126104d65760043567ffffffffffffffff811161106e576123339036906004016134dc565b9060243567ffffffffffffffff8111610639576123549036906004016134dc565b9261235d613ee1565b83810361276357845b818110612371578580f35b61237c81838661396b565b3561238882848761396b565b35875260036020526001600160a01b03604088205416906123b26123ad84898861396b565b61398f565b6123ba613ee1565b818952600960205260ff600160408b20015460a81c161561275157818952600960205260ff600160408b20015460a01c1661273e57821561272b576001600160801b038116801561271857828a5260036020526001600160a01b0360408b2054168085141580612708575b6126ed576001600160801b0361243a85614739565b168083116126d25750908392918b9594865260096020526001600160a01b0360408720541691848752600960205261247c84600260408a20015460801c61475f565b858852600960205260026040892001906001600160801b036001600160801b031983549260801b16911617905584875260096020526124c060026040892001613a2f565b6001600160801b036124e48160208401511692826040818351169201511690613663565b161115612696575b848752600960205285857f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206001600160a01b03600160408d20015416946125368186886148bd565b604051908152a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051868152a1803314158061268c575b612621575b813314159081612616575b8161260b575b5061259a575b5050505050600101612366565b803b156104d957604051636fd110e960e01b815260048101939093523360248401526001600160a01b039390931660448301526001600160801b031660648201529082908290608490829084905af16125f6575b80808061258d565b81612600916135ef565b61055e57855f6125ee565b90508114155f612587565b823b15159150612581565b803b1561055e57604051636fd110e960e01b8152600481018590523360248201526001600160a01b03861660448201526001600160801b03841660648201528690818160848183875af1612677575b5050612576565b81612681916135ef565b61055e57855f612670565b50803b1515612571565b848752600960205260016040882001600160a01b60ff60a01b1982541617905584875260096020526040872060ff60f01b1981541690556124ec565b8b606491848763287ecaef60e21b8452600452602452604452fd5b60648b868663b34359d360e01b835260045233602452604452fd5b5061271284614614565b15612425565b60248a8463d2aabcd960e01b8252600452fd5b60248983630ff7ee2d60e31b8252600452fd5b60248983634a5541ef60e01b8252600452fd5b6024898362b8e7e760e51b8252600452fd5b84846044927faec93440000000000000000000000000000000000000000000000000000000008352600452602452fd5b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57602061089383614686565b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af578061280a83613d01565b92600584101561203c5760026020940361282b575b50506040519015158152f35b815260098352604090205460f01c60ff1690505f8061281f565b50346104d657806003193601126104d65760206001600160a01b0360085416604051908152f35b50346104d65760203660031901126104d657600435612889613ee1565b808252600960205260ff600160408420015460a81c161561112657808252600960205260ff600160408420015460a01c1615612a1e576128c881614614565b15612a085780825260036020526001600160a01b03604083205416151580612a01575b806129e4575b6129d2577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051838152a180825260036020526001600160a01b03604083205416801590811561299b575b8284526003602052604084206001600160a01b031981541690558284827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a450612989575080f35b637e27328960e01b8252600452602490fd5b6129ba835f52600560205260405f206001600160a01b03198154169055565b80845260046020526040842080545f1901905561293f565b630da9b01360e01b8252600452602490fd5b50808252600960205260ff600160408420015460b01c16156128f1565b50816128eb565b63216caf0d60e01b825260045233602452604490fd5b7f817cd639000000000000000000000000000000000000000000000000000000008252600452602490fd5b50346104d65761106b612a5b366134a2565b9060405192612a6b6020856135ef565b858452613a82565b50346104d65760203660031901126104d65760043590818152600960205260ff600160408320015460a81c16156106af57600160408260209460ff94526009855220015460a01c166040519015158152f35b5034612d51576020366003190112612d515760043590612ae3613ee1565b815f52600960205260ff600160405f20015460a81c1615612dc857815f52600960205260ff600160405f20015460a01c165f14612b2d5750634a5541ef60e01b5f5260045260245ffd5b90805f52600960205260405f205460f81c612db657612b60815f5260096020526001600160a01b0360405f205416331490565b15612da057612b6e81613c1a565b90805f526009602052612b86600260405f2001613a2f565b916001600160801b038351166001600160801b0382161015612d8d57815f52600960205260ff60405f205460f01c1615612d7a57806001600160801b03602081612bda948188511603169501511690613663565b5f82815260096020526040902080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790556001600160801b03811691908215612d55575b815f526009602052600360405f20016001600160801b0385166001600160801b0319825416179055815f5260096020526001600160a01b0360405f20541691805f5260036020526001600160a01b0360405f20541691815f52600960205282847f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50612cc56001600160a01b03600160405f2001541694611cb68b85886148bd565b0390a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051838152a1813b612cfc578580f35b813b15612d51575f6084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612d3e575b808080808580f35b612d4a91505f906135ef565b5f80612d36565b5f80fd5b815f526009602052600160405f2001600160a01b60ff60a01b19825416179055612c24565b506339c6dc7360e21b5f5260045260245ffd5b506322cad1af60e11b5f5260045260245ffd5b63216caf0d60e01b5f526004523360245260445ffd5b63fe19f19f60e01b5f5260045260245ffd5b5062b8e7e760e51b5f5260045260245ffd5b34612d51576020366003190112612d515760043567ffffffffffffffff8111612d51576101406003198236030112612d5157612e14613ee1565b604051612e2081613569565b612e2c8260040161348e565b8152612e3a6024830161348e565b6020820152612e4b6044830161362d565b604082015260648201356001600160a01b0381168103612d51576060820152612e766084830161355c565b6080820152612e8760a4830161355c565b60a0820152612e9860c483016138dc565b60c082015260e482013567ffffffffffffffff8111612d515782019136602384011215612d5157600483013592612ece846138ee565b90612edc60405192836135ef565b848252602060048184019660061b8301010190368211612d5157602401945b818610612f1d57602061164d86611642878760e084015261010436910161393c565b6020604091612f2c3689613906565b815201950194612efb565b34612d51575f366003190112612d515760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34612d5157612f88612f82366134a2565b91613697565b005b34612d51575f366003190112612d51576020600754604051908152f35b34612d51576020366003190112612d5157600435805f52600960205260ff600160405f20015460a81c161561301f57612fdf90613d01565b600581101561300b578060209115908115613000575b506040519015158152f35b600191501482612ff5565b634e487b7160e01b5f52602160045260245ffd5b62b8e7e760e51b5f5260045260245ffd5b34612d51576020366003190112612d5157600435805f52600960205260ff600160405f20015460a81c161561301f576020905f90805f526009835260ff60405f205460f01c16806130c5575b613093575b506001600160801b0360405191168152f35b6130bf9150805f52600983526130b96001600160801b03600260405f2001541691613c1a565b90613663565b82613081565b50805f526009835260ff600160405f20015460a01c161561307c565b34612d51576040366003190112612d51576130fa613462565b60243561310681613bc6565b331515806131d3575b806131a0575b6131745781906001600160a01b0380851691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f5260056020526001600160a01b0360405f2091166001600160a01b03198254161790555f80f35b7fa9fbf51f000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b0381165f52600660205260405f206001600160a01b0333165f5260205260ff60405f20541615613115565b50336001600160a01b038216141561310f565b34612d51576020366003190112612d51576020612258600435613641565b34612d51575f366003190112612d51576040515f6001548060011c906001811680156132ee575b6020831081146132da578285529081156132b65750600114613258575b6109ce83611297818503826135ef565b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061329c57509091508101602001611297613248565b919260018160209254838588010152019101909291613284565b60ff191660208086019190915291151560051b840190910191506112979050613248565b634e487b7160e01b5f52602260045260245ffd5b91607f169161322b565b34612d51575f366003190112612d5157602060405167016345785d8a00008152f35b34612d51576020366003190112612d5157600435907fffffffff000000000000000000000000000000000000000000000000000000008216809203612d5157817f49064906000000000000000000000000000000000000000000000000000000006020931490811561338e575b5015158152f35b7f80ac58cd000000000000000000000000000000000000000000000000000000008114915081156133f2575b81156133c8575b5083613387565b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836133c1565b7f5b5e139f00000000000000000000000000000000000000000000000000000000811491506133ba565b5f5b83811061342d5750505f910152565b818101518382015260200161341e565b906020916134568151809281855285808601910161341c565b601f01601f1916010190565b600435906001600160a01b0382168203612d5157565b602435906001600160a01b0382168203612d5157565b35906001600160a01b0382168203612d5157565b6060906003190112612d51576004356001600160a01b0381168103612d5157906024356001600160a01b0381168103612d51579060443590565b9181601f84011215612d515782359167ffffffffffffffff8311612d51576020808501948460051b010111612d5157565b90602080835192838152019201905f5b81811061352a5750505090565b825180516001600160801b0316855260209081015164ffffffffff16818601526040909401939092019160010161351d565b35908115158203612d5157565b610120810190811067ffffffffffffffff82111761358657604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761358657604052565b610180810190811067ffffffffffffffff82111761358657604052565b6060810190811067ffffffffffffffff82111761358657604052565b90601f8019910116810190811067ffffffffffffffff82111761358657604052565b67ffffffffffffffff811161358657601f01601f191660200190565b35906001600160801b0382168203612d5157565b61364a81613bc6565b505f5260056020526001600160a01b0360405f20541690565b906001600160801b03809116911603906001600160801b03821161368357565b634e487b7160e01b5f52601160045260245ffd5b91906001600160a01b031680156138c957815f5260036020526001600160a01b0360405f2054161515806138c1575b806138a4575b613891577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051848152a1815f5260036020526001600160a01b0360405f205416928233151592836137dc575b6001600160a01b039350856137a5575b805f52600460205260405f2060018154019055815f52600360205260405f20816001600160a01b0319825416179055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a41680830361378d57505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b6137c4825f52600560205260405f206001600160a01b03198154169055565b855f52600460205260405f205f19815401905561372c565b919290508061383a575b156137f35782829161371c565b828461380b57637e27328960e01b5f5260045260245ffd5b7f177e802f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b503384148015613868575b806137e65750825f526005602052336001600160a01b0360405f205416146137e6565b50835f52600660205260405f206001600160a01b0333165f5260205260ff60405f205416613845565b50630da9b01360e01b5f5260045260245ffd5b50815f52600960205260ff600160405f20015460b01c16156136cc565b5060016136c6565b633250574960e11b5f525f60045260245ffd5b359064ffffffffff82168203612d5157565b67ffffffffffffffff81116135865760051b60200190565b9190826040910312612d515760405161391e8161359a565b602061393781839561392f8161362d565b8552016138dc565b910152565b9190826040910312612d51576040516139548161359a565b60208082946139628161348e565b84520135910152565b919081101561397b5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160801b0381168103612d515790565b604051906139b08261359a565b5f6020838281520152565b9081546139c7816138ee565b926139d560405194856135ef565b81845260208401905f5260205f205f915b8383106139f35750505050565b600160208192604051613a058161359a565b64ffffffffff86546001600160801b038116835260801c16838201528152019201920191906139e6565b90604051613a3c816135d3565b60406001600160801b03600183958054838116865260801c6020860152015416910152565b356001600160a01b0381168103612d515790565b358015158103612d515790565b90613a8e838284613697565b803b613a9b575b50505050565b602091613ae16001600160a01b03809316956040519586948594630a85bd0160e11b8652336004870152166024850152604484015260806064840152608483019061343d565b03815f865af15f9181613b69575b50613b1d5750613afd61470a565b80519081613b185782633250574960e11b5f5260045260245ffd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000630a85bd0160e11b911603613b5757505f808080613a95565b633250574960e11b5f5260045260245ffd5b9091506020813d602011613bbe575b81613b85602093836135ef565b81010312612d5157517fffffffff0000000000000000000000000000000000000000000000000000000081168103612d5157905f613aef565b3d9150613b78565b805f5260036020526001600160a01b0360405f205416908115613be7575090565b637e27328960e01b5f5260045260245ffd5b80511561397b5760200190565b805182101561397b5760209160051b010190565b9064ffffffffff421691805f52600a602052613c3860405f206139bb565b908364ffffffffff6020613c4b85613bf9565b5101511611613cfa57805f5260096020528364ffffffffff60405f205460c81c161115613cdb57506001600160801b03613c8482613bf9565b515116916001925b8251841015613cd4578464ffffffffff6020613ca88787613c06565b5101511611613cd4576001600160801b0360019181613cc78787613c06565b5151160116930192613c8c565b9350915050565b919250505f5260096020526001600160801b03600260405f2001541690565b505f925050565b805f52600960205260ff600160405f20015460a01c165f14613d235750600490565b805f52600960205260405f205460f81c613d8f57805f52600960205264ffffffffff60405f205460a01c164210613d8a57613d5d81613c1a565b905f5260096020526001600160801b0380600260405f200154169116105f14613d8557600190565b600290565b505f90565b50600390565b90805f5260036020526001600160a01b0360405f205416151580613ecf575b80613eb2575b613ea0577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020604051838152a1805f5260036020526001600160a01b038060405f2054169283613e69575b1680613e51575b815f52600360205260405f20816001600160a01b0319825416179055827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a490565b805f52600460205260405f2060018154019055613e0d565b613e88835f52600560205260405f206001600160a01b03198154169055565b835f52600460205260405f205f198154019055613e06565b630da9b01360e01b5f5260045260245ffd5b50805f52600960205260ff600160405f20015460b01c1615613dba565b506001600160a01b0382161515613db4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613f1357565b7fa1c0d6e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90613f5d6001600160801b03604084015116602061010085015101519061477f565b916001600160801b038351169060e08101519160c082019264ffffffffff84511682156145ec5780156145c4578151801561459c577f00000000000000000000000000000000000000000000000000000000000000008111614571575064ffffffffff6020613fcb84613bf9565b5101511681101561452d57505f905f905f81515f905b8082106144a5575050505064ffffffffff804216911690818110156144775750506001600160801b03169081810361444957505060075493845f52600960205260405f20916001600160801b038251166001600160801b036002850191166001600160801b03198254161790556001600160a01b03606082015116916001600160a01b036001850193166001600160a01b031984541617835560808201948551151560ff60f01b197eff00000000000000000000000000000000000000000000000000000000000087549260f01b169116178555835493750100000000000000000000000000000000000000000060a08501957fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff76ff000000000000000000000000000000000000000000008851151560b01b169116171790556001600160a01b0380845116166001600160a01b03198654161785555184549060e0840151917fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff78ffffffffff00000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000060206141ad8751975f19890190613c06565b51015160c81b169360a01b169116171785555f5b818110614397575050600187016007556001600160a01b0360208301511680156138c9576141f7886001600160a01b0392613d95565b1661436b5786826142456001600160a01b0360607ffeb1cb9ce021c8bd5fb1eb836e6284c68866fa32d1d844238de19955238f8076960151166001600160801b03855116903090339061485c565b6001600160801b036020840151168061433b575b506001600160a01b03815116946143306143126001600160a01b03602085015116986001600160a01b036060860151169a511515935115156001600160a01b0361010060e088015193549764ffffffffff604051996142b78b61359a565b818160a01c168b5260c81c1660208a015201515116946001600160801b0360206040519a8b9a8b5233828c01528281511660408c01520151166060890152608088015260a087015261014060c087015261014086019061350d565b9260e085019064ffffffffff60208092828151168552015116910152565b6101208301520390a4565b614365906001600160a01b036060840151166001600160a01b03610100850151511690339061485c565b5f614259565b7f73c6ac6e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b885f52600a60205260405f20906143b28160e0870151613c06565b5182549268010000000000000000841015613586576001840180825584101561397b576001936020915f52815f2001916001600160801b0380825116166001600160801b031984541617835501517fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff74ffffffffff0000000000000000000000000000000083549260801b169116179055016141c1565b7f6375ff13000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f210aec0e000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b91935091936144c9906001600160801b036144c08588613c06565b5151169061475f565b9364ffffffffff8060206144dd8685613c06565b510151169416808511156144f957506001849301909291613fe1565b8490847fd97494c6000000000000000000000000000000000000000000000000000000005f5260045260245260445260645ffd5b64ffffffffff602061453e84613bf9565b51015116907ff1fb2cc5000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73627f74000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f7ea4ccdf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd572dbcb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f6095d3bc000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f5260036020526001600160a01b0360405f2054169081331491821561465a575b508115614641575090565b90506001600160a01b036146553392613641565b161490565b9091505f52600660205260405f206001600160a01b0333165f5260205260ff60405f205416905f614636565b805f52600960205261469d600260405f2001613a2f565b90805f52600960205260ff600160405f20015460a01c165f146146cb5750602001516001600160801b031690565b90815f52600960205260405f205460f81c6146ed57506146ea90613c1a565b90565b6146ea91506001600160801b036040818351169201511690613663565b3d15614734573d9061471b82613611565b9161472960405193846135ef565b82523d5f602084013e565b606090565b6146ea9061474681614686565b905f526009602052600260405f20015460801c90613663565b906001600160801b03809116911601906001600160801b03821161368357565b91909160405161478e8161359a565b5f81525f6020820152926001600160801b03821690811561483f5767016345785d8a00008111614808576147ca6001600160801b03918361499b565b16602085019181835211156147f4576001600160801b0391826147ef92511690613663565b168252565b634e487b7160e01b5f52600160045260245ffd5b7f4fea5c1a000000000000000000000000000000000000000000000000000000005f5260045267016345785d8a000060245260445ffd5b50505090506040516148508161359a565b5f81525f602082015290565b9091926001600160a01b036148bb9481604051957f23b872dd0000000000000000000000000000000000000000000000000000000060208801521660248601521660448401526064830152606482526148b66084836135ef565b61490d565b565b6148bb926001600160a01b03604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526148b66064836135ef565b5f806001600160a01b0361493693169360208151910182865af161492f61470a565b9083614a49565b8051908115159182614977575b505061494c5750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b8192509060209181010312612d515760200151801590811503612d51575f80614943565b9091905f1983820983820291828083109203918083039214614a3857670de0b6b3a7640000821015614a08577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b90614a865750805115614a5e57805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580614acc575b614a97575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15614a8f56fea164736f6c634300081a000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = - hex"60808060405234601557615e7e908161001a8239f35b5f80fdfe6102406040526004361015610012575f80fd5b5f3560e01c63e9dc637514610025575f80fd5b346141bf5760403660031901126141bf576001600160a01b036004351680600435036141bf576103e06040525f61024081905260606102608190526102808290526102a08290526102c08190526102e0819052610320819052610340819052610360819052610380526103a08190526103c0526103008190526100b6906100ad600435614827565b61032052614a3d565b61034052610300516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145bb575f91614684575b506001600160a01b0361012791168061024052614b39565b61026052610300516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145bb576fffffffffffffffffffffffffffffffff915f91614665575b501661028052610300516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145bb575f90614628575b6101f59150614cdb565b61036052610300516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145bb575f916145f9575b50610280516fffffffffffffffffffffffffffffffff1680156145e5576fffffffffffffffffffffffffffffffff612710819302160416610160610240015260405160208101904682526bffffffffffffffffffffffff1960043560601b1660408201526024356054820152605481526102c9607482614713565b51902061040a60028061016861ffff8560101c160693600161031c63ffffffff601e61031482601461030c82604660ff6050818d60081c16069b16069d16615408565b970116615408565b980116615408565b60246040519788947f68736c2800000000000000000000000000000000000000000000000000000000602087015261035d815180926020868a0191016146cd565b85017f2c00000000000000000000000000000000000000000000000000000000000000838201526103988251809360206025850191016146cd565b01017f252c000000000000000000000000000000000000000000000000000000000000838201526103d38251809360206003850191016146cd565b01017f2529000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614713565b6104446fffffffffffffffffffffffffffffffff604061024001511660ff61043d6001600160a01b036102405116614ddb565b1690614f41565b9061045a6001600160a01b036102405116614a3d565b6020610240015190602460206001600160a01b0360c0610240015116604051928380927fbc2be1be000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145bb576024915f916145c6575b5060206001600160a01b0360c0610240015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145bb5764ffffffffff8091610521945f9161458c575b50169116615237565b610340516103a05190939091906105ac600161054a6064610543818806615882565b9604615408565b6020604051968261056489945180928580880191016146cd565b8301610578825180938580850191016146cd565b01017f2500000000000000000000000000000000000000000000000000000000000000815203601e19810186520184614713565b61016061024001519361012061024001519760e061024001519760405161016052610140610160510161016051811067ffffffffffffffff821117614578576040526101605152602061016051015260406101605101526060610160510152608061016051015260a061016051015260c061016051015260e06101605101526101006101605101526101206101605101526040516101c0810181811067ffffffffffffffff82111761457857604052606081525f60208201525f60408201526060808201525f6080820152606060a08201525f60c08201525f60e082015260606101008201525f6101208201525f61014082015260606101608201525f6101808201525f6101a082015260a06101605101516108eb6109ca60046007602760586106e260c0610160510151610160515190615983565b60b76106ed5f615c76565b985f6102205260206102205261071560405161070c6102205182614713565b5f8152846156d2565b1561456e57601b60909a5b6107298c615408565b906040519b8c9889937f3c672069643d220000000000000000000000000000000000000000000000000061022051860152835161076f81846102205188019801886146cd565b8b017f222066696c6c3d2223666666223e000000000000000000000000000000000000838201527f3c726563742077696474683d220000000000000000000000000000000000000060358201526107d282518093604284019061022051016146cd565b0101917f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033858401527f222072783d223135222072793d22313522207374726f6b653d22236666662220603b8401527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647468605b8401527f3d2234222f3e0000000000000000000000000000000000000000000000000000607b8401527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60818401527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060a18401527f666f6e742d73697a653d2232327078223e00000000000000000000000000000060c184015251809360d28401906146cd565b0101661e17ba32bc3a1f60c91b838201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d60be8201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060de8201527f666f6e742d73697a653d2232367078223e00000000000000000000000000000060fe8201526109858251809361010f84019061022051016146cd565b0101661e17ba32bc3a1f60c91b838201526109ac82518093605f84019061022051016146cd565b0101631e17b39f60e11b838201520301601b19810184520182614713565b6101008301526101208201526101206101605101516108eb610a3860046007602760586040516109fd6102205182614713565b5f815260b7610a0c6001615c76565b98601b6028610a1a8c615d81565b610a2384615df9565b8082111561456757505b019a6107298c615408565b61016083015261018082015260206101605101516108eb610a796004600760276058604051610a6a6102205182614713565b5f815260b7610a0c6002615c76565b8252602082015260286080610160510151604051610a9a6102205182614713565b5f81526108eb610ae46004600760276058610ab56003615c76565b9660b7610ac189615d81565b610aca8b615df9565b8082111561455f5750995b601b8c8c019a6107298c615408565b60a085015260c0840152602083015101016101208201510161018082015101603081016080830152602f19906103e8030160011c8061014083015261012082015101601081016101a083015261018082015101610220518101604083015260106102205191602084015101010160e0820152610b7361010082015161016083015183519060a085015192614ed4565b60608201526101006101208190526040516101a0819052610b949190614713565b60c76101a051527f3c726563742077696474683d223130302522206865696768743d223130302522610220516101a05101527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260406101a05101527f37302220793d223730222077696474683d2238363022206865696768743d223860606101a05101527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060806101a05101527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a06101a05101527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c06101a05101527f683d2234222f3e0000000000000000000000000000000000000000000000000060e06101a05101526101605151610120610160510151906060830151610140525f610200526060610200526040516101e052610cf6610200516101e051614713565b60336101e051527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d22610220516101e05101527f75726c282352616469616c476c6f7729222f3e0000000000000000000000000060406101e051015261014060405190610d628183614713565b61011c82527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d2230610220518301527f2220793d2230222077696474683d223130302522206865696768743d2231303060408301527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c31312529610200518301527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808301527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08301527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08301527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08301527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c2220610120518301527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e000000006101208301525f6101c0526103a06101c0526119416118bc6073606b60405196610eeb6101c05189614713565b61037b88527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c610220518901527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408901527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c610200518901527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808901527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08901527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08901527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08901527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e610120518901527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208901527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c36868901527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608901527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808901527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08901527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08901527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08901527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008901527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208901527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408901527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608901527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808901527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08901527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08901527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08901527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008901527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208901527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408901527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608901527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808901525f6101805260a06101805260405160a0526113506101805160a051614713565b607560a051527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f6102205160a05101527f6e652220643d224d313235203435683735307338302030203830203830763735604060a05101527f307330203830202d3830203830682d373530732d38302030202d3830202d38306102005160a05101527f762d3735307330202d3830203830202d3830222f3e0000000000000000000000608060a051015261193c60146022611409615948565b9360a2604051957f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e610220518801527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604088015261153e6025603589605e8751956102205189019661147f818486018a6146cd565b83017f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000838201528f7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22908201526114e282518093609384019061022051016146cd565b01017f222073746f702d6f7061636974793d2230222f3e000000000000000000000000838201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060498201520301600581018a520188614713565b61165585602361154c615948565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d610220518401527f223025222079313d223025223e0000000000000000000000000000000000000060408401527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604d84015288516115d5818486018a6146cd565b83016211179f60e91b838201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22606e82015261161e82518093608e84019061022051016146cd565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60268201520301600b1981018b520189614713565b6117df60726023611664615948565b6040519c8d917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d2220610220518401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d220060548401526116f3815180928486019061022051016146cd565b82016211179f60e91b828201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22607682015288519061173782609683018a6146cd565b01016211179f60e91b838201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60268201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160468201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e00006066820152701e17b634b732b0b923b930b234b2b73a1f60791b60848201520301605281018c52018a614713565b6117e7615948565b906040519a8b947f3c6c696e6561724772616469656e742069643d22486f7572676c617373537472610220518701527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408701527f302922206772616469656e74556e6974733d227573657253706163654f6e5573610200518701527f65223e000000000000000000000000000000000000000000000000000000000060808701527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22006083870152518092858701906146cd565b83016211179f60e91b838201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a58201526119058251809360c484019061022051016146cd565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60258201520301600b19810187520185614713565b614ed4565b60e05261195561194f614c65565b856156d2565b938415614544575b5060c061010081905260405191906119759083614713565b609082527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c610220518301527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408301527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e3032222073610200518301527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808301527f726f6b652d77696474683d2234222f3e00000000000000000000000000000000610180518301526102c060405160c052611a528160c051614713565b61029860c051527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d6102205160c05101527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e31604060c05101527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d316102005160c05101527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d313532608060c05101527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e34316101805160c05101527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c6101005160c05101527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e060c05101527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101205160c05101527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c313961012060c05101527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c8260c05101527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e61016060c05101527f3630322c32312e303739733131312e3833312d372e3438372c3135322e35383761018060c05101527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a060c05101527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c060c05101527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e060c05101527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e3261020060c05101527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e373961022060c05101527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e303161024060c05101527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d61026060c05101527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a61028060c05101527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a060c0510152855f1461432f57604051611dcd6102205182614713565b5f8152955b156141dc57604051611de66101e082614713565b6101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d32610220518201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d3533610200518201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a610180518201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70617468610100518201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e610120518201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e838201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152905b6040519261201f6107e085614713565b6107a7845261022080517f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f7572908601527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408087019190915261020080517f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f908801527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c31608088015261018080517f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373690890152610100517f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e3139908901527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e089015261012080517f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e3335908a01527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e393533908901527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e36948801949094527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608801527f2c39362e3535342d37312e3932312c3231352e3635322d37312e393231733231938701939093527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08701527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c0808801919091527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08801527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c938701939093527f696e652078313d223133342e3336222079313d223136312e323033222078323d828701527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408701527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608701527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808701527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08701527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d22938601939093527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08601527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008601527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208601527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408601527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608601527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c313061038086015290517f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c3132908501527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08501527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08501527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008501527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208501527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408501527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608501527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808501527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08501527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08501527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08501527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008501527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208501527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408501527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608501527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808501527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08501527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08501527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08501527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008501527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208501527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408501527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608501527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808501527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08501527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08501527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08501527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008501527f2e383232203438312e393031203438312e373938203438312e383737203438316107208501527f2e373735203438312e383534203335302e303135203335302e303236203231386107408501527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608501527f223231382e313835203438312e393031203231382e323331203438312e3835346107808501527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08501527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0850152905181517f3c672069643d22486f7572676c617373223e00000000000000000000000000009082015284519151909788959092916129ee9183916032890191016146cd565b840160c051519060328101826102205160c0510191612a0c926146cd565b016032018082518093610220510191612a24926146cd565b018082518093610220510191612a39926146cd565b018082518093610220510191612a4e926146cd565b01631e17b39f60e11b815203601b1981018452600401612a6e9084614713565b60405160805261022051608051017f3c646566733e000000000000000000000000000000000000000000000000000090526101e0515160805160260181610220516101e0510191612abe926146cd565b60805101815191826026830191610220510191612ada926146cd565b016026018082518093610220510191612af2926146cd565b0160a051519080826102205160a0510191612b0c926146cd565b0160e051519080826102205160e0510191612b26926146cd565b018082518093610220510191612b3b926146cd565b01610140515190808261022051610140510191612b57926146cd565b017f3c2f646566733e000000000000000000000000000000000000000000000000008152608051900360181981016080515260070160805190612b9991614713565b6101605160e0015190610160516101000151916101605160400151906101605160600151612bc78583615bc7565b916040958651612bd78882614713565b600581526102205181017f2d31303025000000000000000000000000000000000000000000000000000000905287519485916102205183017f3c74657874506174682073746172744f66667365743d220000000000000000009052805190816037850191610220510191612c4a926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612d8e918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612dbf9085614713565b612dc891615bc7565b928551612dd58782614713565b60028152610220518101947f3025000000000000000000000000000000000000000000000000000000000000865287519586926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501612e41926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612f85918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612fb69085614713565b612fc08282615c31565b918651612fcd8882614713565b60048152610220518101937f2d35302500000000000000000000000000000000000000000000000000000000855288519485926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613039926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e000000000000000000610109820152815161022051909261317d918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018452600b016131ae9084614713565b6131b791615c31565b9085516131c48782614713565b60038152610220518101927f3530250000000000000000000000000000000000000000000000000000000000845287519384926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613230926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092613374918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018352600b016133a59083614713565b85519384936102205185017f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537090528785017f656564223e0000000000000000000000000000000000000000000000000000009052805190816045870191610220510191613411926146cd565b840181519182604583019161022051019161342b926146cd565b016045018082518093610220510191613443926146cd565b018082518093610220510191613458926146cd565b01661e17ba32bc3a1f60c91b8152036018198101825260070161347b9082614713565b610140820151916101a08101519060408101519060e001519361349d90615408565b916134a790615408565b906134b190615408565b936134bb90615408565b8551948592610220518401947f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2286528885017f2e39222f3e0000000000000000000000000000000000000000000000000000009052604585017f3c75736520687265663d2223476c6f772220783d22313030302220793d2231309052606585017f3030222066696c6c2d6f7061636974793d222e39222f3e0000000000000000009052607c85017f3c75736520687265663d22234c6f676f2220783d223137302220793d223137309052609c85017f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872905260bc85017f65663d2223486f7572676c6173732220783d223135302220793d223930222074905260dc85017f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d905260fc85017f6f726967696e3d2235303020353030222f3e0000000000000000000000000000905261010e85017f3c75736520687265663d222350726f67726573732220783d2200000000000000905280519081610127870191610220510191613662926146cd565b840161012781016a11103c9e911b9c9811179f60a91b905261013281017f3c75736520687265663d22235374617475732220783d220000000000000000009052815191826101498301916102205101916136bb926146cd565b0161012701602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d2223416d6f756e742220783d220000000000000000009052815191826044830191610220510191613714926146cd565b01602201602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d22234475726174696f6e2220783d2200000000000000905281519182604683019161022051019161376c926146cd565b01602201602481016a11103c9e911b9c9811179f60a91b90520360240160141981018452600b0161379d9084614713565b83519283926102205184017f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323090528584017f30302f737667222077696474683d223130303022206865696768743d2231303090526102005184017f30222076696577426f783d2230203020313030302031303030223e000000000090526101a05151607b850181610220516101a0510191613837926146cd565b84016080515190607b810182610220516080510191613855926146cd565b01607b01808251809361022051019161386d926146cd565b0191829151809361387d926146cd565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000815203601919810182526006016138b69082614713565b61038052610300518151610220517fb25645690000000000000000000000000000000000000000000000000000000090820190815260248035818401528252916001600160a01b03169061390b604482614713565b515a925f93928493fa61391c614796565b6102e0819052901580156103c0526141d45761022051818051810103126141bf5761022051015180151581036141bf575b15156102a052610260516103005182517fb971302a00000000000000000000000000000000000000000000000000000000815260248035600483015261022051919283919082906001600160a01b03165afa9081156141ca575f9161417e575b50600360236139be613ad693614a3d565b938161012061024001518780519788947f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a2261022051870152613a0b815180928589019061022051016146cd565b85017f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c75658382015262111d1160e91b61020051820152613a5682518093606384019061022051016146cd565b01017f227d2c7b2274726169745f74797065223a22537461747573222c2276616c75658382015262111d1160e91b6043820152613a9f82518093604684019061022051016146cd565b01017f227d5d0000000000000000000000000000000000000000000000000000000000838201520301601c19810184520182614713565b6103205161026051610340516102405191939291613afc906001600160a01b0316614a3d565b613b07602435615408565b6102a051909190156140f25761010051875190613b249082614713565b609b81527fe29aa0efb88f205741524e494e473a205472616e7366657272696e6720746865610220518201527f204e4654206d616b657320746865206e6577206f776e65722074686520726563888201527f697069656e74206f66207468652073747265616d2e205468652066756e647320610200518201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e2060808201527f666f72207468652070726576696f757320726563697069656e742e000000000061018051820152915b8751968794610220518601967f54686973204e465420726570726573656e74732061207061796d656e7420737488528a87017f7265616d20696e2061205361626c6965722056322000000000000000000000009052805190610220518101918060558a0190613c5c91856146cd565b7f20636f6e74726163742e20546865206f776e6572206f662074686973204e46546055918a01918201527f2063616e207769746864726177207468652073747265616d656420617373657460758201527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609582015284516102205186019691613cea8260b183018a6146cd565b01605501605c81017f2e5c6e5c6e2d2053747265616d2049443a200000000000000000000000000000905281519182606e830191610220510191613d2d926146cd565b01605c0190601282016302e3716960e51b905251918260168301613d50926146cd565b01601201600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613d80926146cd565b0160040190600a82016302e3716960e51b9052519182600e8301613da3926146cd565b01600a01600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613dd3926146cd565b01600401600a81017f5c6e5c6e00000000000000000000000000000000000000000000000000000000905281519182600e830191610220510191613e16926146cd565b01600a0103600401601f1981018452613e2f9084614713565b61032051613e3e602435615408565b85518091610220518201936a029b0b13634b2b9102b19160ad1b855280519081602b850191610220510191613e72926146cd565b8201602b81017f2023000000000000000000000000000000000000000000000000000000000000905281519182602d830191610220510191613eb3926146cd565b01602b0103600201601f1981018252613ecc9082614713565b61038051613ed990615567565b9286519586956102205187017f7b2261747472696275746573223a000000000000000000000000000000000000905280519081602e890191610220510191613f20926146cd565b860190602e82017f2c226465736372697074696f6e223a22000000000000000000000000000000009052519182603e8301613f5a926146cd565b01602e0190601082017f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c69659052603082017f722e636f6d222c226e616d65223a2200000000000000000000000000000000009052519182603f8301613fbd926146cd565b01601001602f81017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62619052604f81017f736536342c0000000000000000000000000000000000000000000000000000009052815191826054830191610220510191614027926146cd565b01602f01602581017f227d000000000000000000000000000000000000000000000000000000000000905203602501601d198101825260020161406a9082614713565b6102c081905261407990615567565b90805180926102205182017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000905280519081603d8401916102205101916140bf926146cd565b810103603d01601f19810183526140d69083614713565b5180916102205182526102205182016140ee916146ee565b0390f35b86516140ff608082614713565b605b81527fe29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e736665610220518201527f7261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e888201527f7366657272656420746f20616e6f74686572206163636f756e742e00000000006102005182015291613bed565b9050610220513d61022051116141c3575b6141998183614713565b816102205191810103126141bf57516001600160a01b03811681036141bf5760036139ad565b5f80fd5b503d61418f565b83513d5f823e3d90fd5b50600161394d565b6040516141eb61012082614713565b60f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e34343963610220518201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d610200518201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e64610180518201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d22610100518201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610120518201529061200f565b60405161433e6101c082614713565b61019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e30323620343135610220518201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70610200518201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e303736610180518201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e363234610100518201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e610120518201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c33838201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015295611dd2565b614558919450614552614ca0565b906156d2565b925f61195d565b905099610ad5565b9050610a2d565b601b60d09a610720565b634e487b7160e01b5f52604160045260245ffd5b6145ae915060203d6020116145b4575b6145a68183614713565b81019061475d565b5f610518565b503d61459c565b6040513d5f823e3d90fd5b6145df915060203d6020116145b4576145a68183614713565b5f6104b9565b634e487b7160e01b5f52601260045260245ffd5b61461b915060203d602011614621575b6146138183614713565b810190614735565b5f61024e565b503d614609565b506020813d60201161465d575b8161464260209383614713565b810103126141bf575160058110156141bf576101f5906101eb565b3d9150614635565b61467e915060203d602011614621576146138183614713565b5f610191565b90506020813d6020116146c5575b8161469f60209383614713565b810103126141bf57516001600160a01b03811681036141bf576001600160a01b0361010f565b3d9150614692565b5f5b8381106146de5750505f910152565b81810151838201526020016146cf565b90602091614707815180928185528580860191016146cd565b601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff82111761457857604052565b908160209103126141bf57516fffffffffffffffffffffffffffffffff811681036141bf5790565b908160209103126141bf575164ffffffffff811681036141bf5790565b67ffffffffffffffff811161457857601f01601f191660200190565b3d156147c0573d906147a78261477a565b916147b56040519384614713565b82523d5f602084013e565b606090565b6020818303126141bf5780519067ffffffffffffffff82116141bf570181601f820112156141bf5780516147f88161477a565b926148066040519485614713565b818452602082840101116141bf5761482491602080850191016146cd565b90565b6001600160a01b0316604051906395d89b4160e01b82525f82600481845afa9182156145bb575f92614a19575b5060409161489783516148678582614713565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020820152826156d2565b156148d75750506148aa81519182614713565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b61491683516148e68582614713565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020820152826156d2565b1561495657505061492981519182614713565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61499583516149658582614713565b601181527f5341422d56322d4c4f434b55502d5452410000000000000000000000000000006020820152826156d2565b156149d55750506149a881519182614713565b600f81527f4c6f636b7570205472616e636865640000000000000000000000000000000000602082015290565b614a159083519384937f814a8a2e0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301906146ee565b0390fd5b614a369192503d805f833e614a2e8183614713565b8101906147c5565b905f614854565b6001600160a01b03168060405191614a56606084614713565b602a8352602083016040368237835115614b255760309053825160011015614b25576078602184015360295b60018111614ac35750614a93575090565b7fe22e27eb000000000000000000000000000000000000000000000000000000005f52600452601460245260445ffd5b90600f81166010811015614b25577f3031323334353637383961626364656600000000000000000000000000000000901a614afe83866156ff565b5360041c908015614b11575f1901614a82565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f809160405160208101906395d89b4160e01b825260048152614b5d602482614713565b51915afa614b69614796565b90158015614c59575b614c1d5780602080614b89935183010191016147c5565b601e8151115f14614bd05750604051614ba3604082614713565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b614bd981615710565b15614be15790565b50604051614bf0604082614713565b601781527f4e6f6e2d416c7068616e756d657269632053796d626f6c000000000000000000602082015290565b50604051614c2c604082614713565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b50604081511115614b72565b60405190614c74604083614713565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190614caf604083614713565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b6005811015614dc75760048103614cf55750614824614ca0565b60038103614d395750604051614d0c604082614713565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b60018103614d7d5750604051614d50604082614713565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b600203614d8c57614824614c65565b604051614d9a604082614713565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b5f52602160045260245ffd5b5f809160405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152614e18602482614713565b51915afa614e24614796565b9080614e53575b15614e4e576020818051810103126141bf576020015160ff811681036141bf5790565b505f90565b506020815114614e2b565b60405190614e6d604083614713565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614ea8604083614713565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614eff9493614f306020614f3f95614f22828096816040519c8d8b83829d519485930191016146cd565b8901614f13825180938580850191016146cd565b010191828151948592016146cd565b0191828151948592016146cd565b0103601f198101845283614713565b565b908115615216578061520657505b806001811015614fb8575050614f63614e99565b6148246002602060405184614f8182965180928580860191016146cd565b81017f2031000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614713565b66038d7ea4c6800011156151a8576040519060a0820182811067ffffffffffffffff82111761457857604052602091604051614ff48482614713565b5f8152815260409182516150088482614713565b600181527f4b00000000000000000000000000000000000000000000000000000000000000858201528483015282516150418482614713565b600181527f4d000000000000000000000000000000000000000000000000000000000000008582015283830152825161507a8482614713565b600181527f420000000000000000000000000000000000000000000000000000000000000085820152606083015282516150b48482614713565b600181527f54000000000000000000000000000000000000000000000000000000000000008582015260808301525f905f945b6103e882101561518e578451946150fe8187614713565b600786527f2623383830353b000000000000000000000000000000000000000000000000008287015251945f5b6007811061517b575050600160fd1b602786015250600884526151629061515c90615157602887614713565b615408565b91615882565b916005851015614b25576148249460051b015192614ed4565b818101830151878201840152820161512b565b9490915060016103e86064600a85040693049101946150e7565b506151b1614e5e565b61482460086020604051846151cf82965180928580860191016146cd565b81017f203939392e393954000000000000000000000000000000000000000000000000838201520301601719810184520182614713565b600a0a9081156145e55704614f4f565b5050604051615226604082614713565b60018152600360fc1b602082015290565b62015180910304806152a1575061524c614e99565b614824600660206040518461526a82965180928580860191016146cd565b81017f2031204461790000000000000000000000000000000000000000000000000000838201520301601919810184520182614713565b61270f81116153785760018103615334576148246152f66040516152c6604082614713565b600481527f2044617900000000000000000000000000000000000000000000000000000000602082015292615408565b6020604051938261531086945180928580880191016146cd565b8301615324825180938580850191016146cd565b010103601f198101835282614713565b6148246152f6604051615348604082614713565b600581527f2044617973000000000000000000000000000000000000000000000000000000602082015292615408565b50615381614e5e565b614824600a60206040518461539f82965180928580860191016146cd565b81017f2039393939204461797300000000000000000000000000000000000000000000838201520301601519810184520182614713565b906153e08261477a565b6153ed6040519182614713565b82815280926153fe601f199161477a565b0190602036910137565b805f917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000082101561553f575b806d04ee2d6d415b85acef8100000000600a921015615524575b662386f26fc10000811015615510575b6305f5e1008110156154ff575b6127108110156154f0575b60648110156154e2575b10156154d7575b600a6021615492600185016153d6565b938401015b5f1901917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156154d257600a9091615497565b505090565b600190910190615482565b60646002910493019261547b565b61271060049104930192615471565b6305f5e10060089104930192615466565b662386f26fc1000060109104930192615459565b6d04ee2d6d415b85acef810000000060209104930192615449565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000810461542f565b908151156156bc576040519161557e606084614713565b604083527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208401527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040840152805160028101809111614b1157600390047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614b11576156149060021b6153d6565b90602082019080815182019560208701908151925f83525b88811061566e575050600393949596505251068060011461565c57600214615652575090565b603d905f19015390565b50603d90815f19820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c168701015160028501531684010151600382015301949761562c565b90506040516156cc602082614713565b5f815290565b90815181519081811493846156e9575b5050505090565b602092939450820120920120145f8080806156e2565b908151811015614b25570160200190565b8051905f5b82811061572457505050600190565b7fff0000000000000000000000000000000000000000000000000000000000000061574f82846156ff565b5116600160fd1b811490600360fc1b81101580615858575b7f4100000000000000000000000000000000000000000000000000000000000000821015908161582d575b7f61000000000000000000000000000000000000000000000000000000000000008310159283615802575b5083156157fa575b5082156157f2575b5081156157ea575b50156157e357600101615715565b5050505f90565b90505f6157d5565b91505f6157cd565b92505f6157c5565b7f7a00000000000000000000000000000000000000000000000000000000000000101592505f6157bd565b7f5a000000000000000000000000000000000000000000000000000000000000008311159150615792565b507f3900000000000000000000000000000000000000000000000000000000000000811115615767565b8061589657506040516156cc602082614713565b600a8110156158fc576158a890615408565b614824602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526158eb81518092602086860191016146cd565b81010301601f198101835282614713565b61590590615408565b614824602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158eb81518092602086860191016146cd565b60405190615957604083614713565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615bb757615991615948565b9061271003906127108211614b1157602e60619160506159b361482495615408565b60576040519788947f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208701527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8701527f7374726f6b653d22000000000000000000000000000000000000000000000000604f870152615a40815180926020868a0191016146cd565b85017f22207374726f6b652d77696474683d223130222f3e0000000000000000000000838201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615ac782518093602060a7850191016146cd565b01017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b838201527f652d646173686f66667365743d220000000000000000000000000000000000006070820152615b28825180936020607e850191016146cd565b01017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d838201527f77696474683d223522207472616e73666f726d3d22726f74617465282d393029604e8201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000606e820152631e17b39f60e11b608b82015203016041810184520182614713565b50506040516156cc602082614713565b6010614f3f9193929360206040519582615bea88945180928580880191016146cd565b830164010714051160dd1b838201526a029b0b13634b2b9102b19160ad1b6025820152615c2082518093856030850191016146cd565b01010301601f198101845283614713565b6005614f3f9193929360206040519582615c5488945180928580880191016146cd565b830164010714051160dd1b83820152615c2082518093856025850191016146cd565b6004811015614dc75780615cc05750604051615c93604082614713565b600881527f50726f6772657373000000000000000000000000000000000000000000000000602082015290565b60018103615d045750604051615cd7604082614713565b600681527f5374617475730000000000000000000000000000000000000000000000000000602082015290565b600203615d4657604051615d19604082614713565b600681527f416d6f756e740000000000000000000000000000000000000000000000000000602082015290565b604051615d54604082614713565b600881527f4475726174696f6e000000000000000000000000000000000000000000000000602082015290565b5f90805180156157e35790600d915f925f925b828410615da75750505050600d02900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615ddb88856156ff565b511614615df1575b820194600101929190615d94565b859450615de3565b5f90805180156157e357906010915f925f925b828410615e1f575050505060041b900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615e5388856156ff565b511614615e69575b820194600101929190615e0c565b859450615e5b56fea164736f6c634300081a000a"; + hex"60808060405234601557615e7e908161001a8239f35b5f80fdfe6102406040526004361015610012575f80fd5b5f3560e01c63e9dc637514610025575f80fd5b346141bf5760403660031901126141bf576001600160a01b036004351680600435036141bf576103e06040525f61024081905260606102608190526102808290526102a08290526102c08190526102e0819052610320819052610340819052610360819052610380526103a08190526103c0526103008190526100b6906100ad600435614827565b61032052614a3d565b61034052610300516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145bb575f91614684575b506001600160a01b0361012791168061024052614b39565b61026052610300516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145bb576fffffffffffffffffffffffffffffffff915f91614665575b501661028052610300516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156145bb575f90614628575b6101f59150614cdb565b61036052610300516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156145bb575f916145f9575b50610280516fffffffffffffffffffffffffffffffff1680156145e5576fffffffffffffffffffffffffffffffff612710819302160416610160610240015260405160208101904682526bffffffffffffffffffffffff1960043560601b1660408201526024356054820152605481526102c9607482614713565b51902061040a60028061016861ffff8560101c160693600161031c63ffffffff601e61031482601461030c82604660ff6050818d60081c16069b16069d16615408565b970116615408565b980116615408565b60246040519788947f68736c2800000000000000000000000000000000000000000000000000000000602087015261035d815180926020868a0191016146cd565b85017f2c00000000000000000000000000000000000000000000000000000000000000838201526103988251809360206025850191016146cd565b01017f252c000000000000000000000000000000000000000000000000000000000000838201526103d38251809360206003850191016146cd565b01017f2529000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614713565b6104446fffffffffffffffffffffffffffffffff604061024001511660ff61043d6001600160a01b036102405116614ddb565b1690614f41565b9061045a6001600160a01b036102405116614a3d565b6020610240015190602460206001600160a01b0360c0610240015116604051928380927fbc2be1be000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145bb576024915f916145c6575b5060206001600160a01b0360c0610240015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa80156145bb5764ffffffffff8091610521945f9161458c575b50169116615237565b610340516103a05190939091906105ac600161054a6064610543818806615882565b9604615408565b6020604051968261056489945180928580880191016146cd565b8301610578825180938580850191016146cd565b01017f2500000000000000000000000000000000000000000000000000000000000000815203601e19810186520184614713565b61016061024001519361012061024001519760e061024001519760405161016052610140610160510161016051811067ffffffffffffffff821117614578576040526101605152602061016051015260406101605101526060610160510152608061016051015260a061016051015260c061016051015260e06101605101526101006101605101526101206101605101526040516101c0810181811067ffffffffffffffff82111761457857604052606081525f60208201525f60408201526060808201525f6080820152606060a08201525f60c08201525f60e082015260606101008201525f6101208201525f61014082015260606101608201525f6101808201525f6101a082015260a06101605101516108eb6109ca60046007602760586106e260c0610160510151610160515190615983565b60b76106ed5f615c76565b985f6102205260206102205261071560405161070c6102205182614713565b5f8152846156d2565b1561456e57601b60909a5b6107298c615408565b906040519b8c9889937f3c672069643d220000000000000000000000000000000000000000000000000061022051860152835161076f81846102205188019801886146cd565b8b017f222066696c6c3d2223666666223e000000000000000000000000000000000000838201527f3c726563742077696474683d220000000000000000000000000000000000000060358201526107d282518093604284019061022051016146cd565b0101917f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033858401527f222072783d223135222072793d22313522207374726f6b653d22236666662220603b8401527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647468605b8401527f3d2234222f3e0000000000000000000000000000000000000000000000000000607b8401527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60818401527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060a18401527f666f6e742d73697a653d2232327078223e00000000000000000000000000000060c184015251809360d28401906146cd565b0101661e17ba32bc3a1f60c91b838201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d60be8201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060de8201527f666f6e742d73697a653d2232367078223e00000000000000000000000000000060fe8201526109858251809361010f84019061022051016146cd565b0101661e17ba32bc3a1f60c91b838201526109ac82518093605f84019061022051016146cd565b0101631e17b39f60e11b838201520301601b19810184520182614713565b6101008301526101208201526101206101605101516108eb610a3860046007602760586040516109fd6102205182614713565b5f815260b7610a0c6001615c76565b98601b6028610a1a8c615d81565b610a2384615df9565b8082111561456757505b019a6107298c615408565b61016083015261018082015260206101605101516108eb610a796004600760276058604051610a6a6102205182614713565b5f815260b7610a0c6002615c76565b8252602082015260286080610160510151604051610a9a6102205182614713565b5f81526108eb610ae46004600760276058610ab56003615c76565b9660b7610ac189615d81565b610aca8b615df9565b8082111561455f5750995b601b8c8c019a6107298c615408565b60a085015260c0840152602083015101016101208201510161018082015101603081016080830152602f19906103e8030160011c8061014083015261012082015101601081016101a083015261018082015101610220518101604083015260106102205191602084015101010160e0820152610b7361010082015161016083015183519060a085015192614ed4565b60608201526101006101208190526040516101a0819052610b949190614713565b60c76101a051527f3c726563742077696474683d223130302522206865696768743d223130302522610220516101a05101527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260406101a05101527f37302220793d223730222077696474683d2238363022206865696768743d223860606101a05101527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060806101a05101527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a06101a05101527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c06101a05101527f683d2234222f3e0000000000000000000000000000000000000000000000000060e06101a05101526101605151610120610160510151906060830151610140525f610200526060610200526040516101e052610cf6610200516101e051614713565b60336101e051527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d22610220516101e05101527f75726c282352616469616c476c6f7729222f3e0000000000000000000000000060406101e051015261014060405190610d628183614713565b61011c82527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d2230610220518301527f2220793d2230222077696474683d223130302522206865696768743d2231303060408301527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c31312529610200518301527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808301527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08301527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08301527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08301527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c2220610120518301527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e000000006101208301525f6101c0526103a06101c0526119416118bc6073606b60405196610eeb6101c05189614713565b61037b88527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c610220518901527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408901527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c610200518901527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808901527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08901527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08901527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08901527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e610120518901527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208901527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c36868901527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608901527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808901527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08901527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08901527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08901527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008901527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208901527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408901527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608901527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808901527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08901527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08901527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08901527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008901527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208901527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408901527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608901527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808901525f6101805260a06101805260405160a0526113506101805160a051614713565b607560a051527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f6102205160a05101527f6e652220643d224d313235203435683735307338302030203830203830763735604060a05101527f307330203830202d3830203830682d373530732d38302030202d3830202d38306102005160a05101527f762d3735307330202d3830203830202d3830222f3e0000000000000000000000608060a051015261193c60146022611409615948565b9360a2604051957f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e610220518801527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604088015261153e6025603589605e8751956102205189019661147f818486018a6146cd565b83017f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000838201528f7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22908201526114e282518093609384019061022051016146cd565b01017f222073746f702d6f7061636974793d2230222f3e000000000000000000000000838201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060498201520301600581018a520188614713565b61165585602361154c615948565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d610220518401527f223025222079313d223025223e0000000000000000000000000000000000000060408401527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000604d84015288516115d5818486018a6146cd565b83016211179f60e91b838201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22606e82015261161e82518093608e84019061022051016146cd565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60268201520301600b1981018b520189614713565b6117df60726023611664615948565b6040519c8d917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d2220610220518401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d220060548401526116f3815180928486019061022051016146cd565b82016211179f60e91b828201527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22607682015288519061173782609683018a6146cd565b01016211179f60e91b838201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60268201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160468201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e00006066820152701e17b634b732b0b923b930b234b2b73a1f60791b60848201520301605281018c52018a614713565b6117e7615948565b906040519a8b947f3c6c696e6561724772616469656e742069643d22486f7572676c617373537472610220518701527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408701527f302922206772616469656e74556e6974733d227573657253706163654f6e5573610200518701527f65223e000000000000000000000000000000000000000000000000000000000060808701527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22006083870152518092858701906146cd565b83016211179f60e91b838201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a58201526119058251809360c484019061022051016146cd565b01016211179f60e91b83820152701e17b634b732b0b923b930b234b2b73a1f60791b60258201520301600b19810187520185614713565b614ed4565b60e05261195561194f614c65565b856156d2565b938415614544575b5060c061010081905260405191906119759083614713565b609082527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c610220518301527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408301527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e3032222073610200518301527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808301527f726f6b652d77696474683d2234222f3e00000000000000000000000000000000610180518301526102c060405160c052611a528160c051614713565b61029860c051527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d6102205160c05101527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e31604060c05101527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d316102005160c05101527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d313532608060c05101527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e34316101805160c05101527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c6101005160c05101527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e060c05101527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101205160c05101527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c313961012060c05101527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c8260c05101527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e61016060c05101527f3630322c32312e303739733131312e3833312d372e3438372c3135322e35383761018060c05101527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a060c05101527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c060c05101527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e060c05101527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e3261020060c05101527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e373961022060c05101527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e303161024060c05101527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d61026060c05101527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a61028060c05101527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a060c0510152855f1461432f57604051611dcd6102205182614713565b5f8152955b156141dc57604051611de66101e082614713565b6101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d32610220518201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d3533610200518201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a610180518201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70617468610100518201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e610120518201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e838201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152905b6040519261201f6107e085614713565b6107a7845261022080517f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f7572908601527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408087019190915261020080517f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f908801527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c31608088015261018080517f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373690890152610100517f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e3139908901527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e089015261012080517f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e3335908a01527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e393533908901527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e36948801949094527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608801527f2c39362e3535342d37312e3932312c3231352e3635322d37312e393231733231938701939093527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08701527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c0808801919091527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08801527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c938701939093527f696e652078313d223133342e3336222079313d223136312e323033222078323d828701527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408701527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608701527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808701527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08701527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d22938601939093527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08601527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008601527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208601527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408601527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608601527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c313061038086015290517f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c3132908501527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08501527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08501527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008501527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208501527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408501527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608501527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808501527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08501527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08501527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08501527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008501527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208501527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408501527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608501527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808501527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08501527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08501527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08501527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008501527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208501527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408501527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608501527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808501527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08501527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08501527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08501527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008501527f2e383232203438312e393031203438312e373938203438312e383737203438316107208501527f2e373735203438312e383534203335302e303135203335302e303236203231386107408501527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608501527f223231382e313835203438312e393031203231382e323331203438312e3835346107808501527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08501527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0850152905181517f3c672069643d22486f7572676c617373223e00000000000000000000000000009082015284519151909788959092916129ee9183916032890191016146cd565b840160c051519060328101826102205160c0510191612a0c926146cd565b016032018082518093610220510191612a24926146cd565b018082518093610220510191612a39926146cd565b018082518093610220510191612a4e926146cd565b01631e17b39f60e11b815203601b1981018452600401612a6e9084614713565b60405160805261022051608051017f3c646566733e000000000000000000000000000000000000000000000000000090526101e0515160805160260181610220516101e0510191612abe926146cd565b60805101815191826026830191610220510191612ada926146cd565b016026018082518093610220510191612af2926146cd565b0160a051519080826102205160a0510191612b0c926146cd565b0160e051519080826102205160e0510191612b26926146cd565b018082518093610220510191612b3b926146cd565b01610140515190808261022051610140510191612b57926146cd565b017f3c2f646566733e000000000000000000000000000000000000000000000000008152608051900360181981016080515260070160805190612b9991614713565b6101605160e0015190610160516101000151916101605160400151906101605160600151612bc78583615bc7565b916040958651612bd78882614713565b600581526102205181017f2d31303025000000000000000000000000000000000000000000000000000000905287519485916102205183017f3c74657874506174682073746172744f66667365743d220000000000000000009052805190816037850191610220510191612c4a926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612d8e918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612dbf9085614713565b612dc891615bc7565b928551612dd58782614713565b60028152610220518101947f3025000000000000000000000000000000000000000000000000000000000000865287519586926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501612e41926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092612f85918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018552600b01612fb69085614713565b612fc08282615c31565b918651612fcd8882614713565b60048152610220518101937f2d35302500000000000000000000000000000000000000000000000000000000855288519485926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613039926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e000000000000000000610109820152815161022051909261317d918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018452600b016131ae9084614713565b6131b791615c31565b9085516131c48782614713565b60038152610220518101927f3530250000000000000000000000000000000000000000000000000000000000845287519384926102205184017f3c74657874506174682073746172744f66667365743d22000000000000000000905251908160378501613230926146cd565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d222366666037918401918201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528151610220519092613374918491610120850191016146cd565b0160370160e981016a1e17ba32bc3a2830ba341f60a91b90520360e90160141981018352600b016133a59083614713565b85519384936102205185017f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537090528785017f656564223e0000000000000000000000000000000000000000000000000000009052805190816045870191610220510191613411926146cd565b840181519182604583019161022051019161342b926146cd565b016045018082518093610220510191613443926146cd565b018082518093610220510191613458926146cd565b01661e17ba32bc3a1f60c91b8152036018198101825260070161347b9082614713565b610140820151916101a08101519060408101519060e001519361349d90615408565b916134a790615408565b906134b190615408565b936134bb90615408565b8551948592610220518401947f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2286528885017f2e39222f3e0000000000000000000000000000000000000000000000000000009052604585017f3c75736520687265663d2223476c6f772220783d22313030302220793d2231309052606585017f3030222066696c6c2d6f7061636974793d222e39222f3e0000000000000000009052607c85017f3c75736520687265663d22234c6f676f2220783d223137302220793d223137309052609c85017f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872905260bc85017f65663d2223486f7572676c6173732220783d223135302220793d223930222074905260dc85017f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d905260fc85017f6f726967696e3d2235303020353030222f3e0000000000000000000000000000905261010e85017f3c75736520687265663d222350726f67726573732220783d2200000000000000905280519081610127870191610220510191613662926146cd565b840161012781016a11103c9e911b9c9811179f60a91b905261013281017f3c75736520687265663d22235374617475732220783d220000000000000000009052815191826101498301916102205101916136bb926146cd565b0161012701602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d2223416d6f756e742220783d220000000000000000009052815191826044830191610220510191613714926146cd565b01602201602281016a11103c9e911b9c9811179f60a91b9052602d81017f3c75736520687265663d22234475726174696f6e2220783d2200000000000000905281519182604683019161022051019161376c926146cd565b01602201602481016a11103c9e911b9c9811179f60a91b90520360240160141981018452600b0161379d9084614713565b83519283926102205184017f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323090528584017f30302f737667222077696474683d223130303022206865696768743d2231303090526102005184017f30222076696577426f783d2230203020313030302031303030223e000000000090526101a05151607b850181610220516101a0510191613837926146cd565b84016080515190607b810182610220516080510191613855926146cd565b01607b01808251809361022051019161386d926146cd565b0191829151809361387d926146cd565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000815203601919810182526006016138b69082614713565b61038052610300518151610220517fb25645690000000000000000000000000000000000000000000000000000000090820190815260248035818401528252916001600160a01b03169061390b604482614713565b515a925f93928493fa61391c614796565b6102e0819052901580156103c0526141d45761022051818051810103126141bf5761022051015180151581036141bf575b15156102a052610260516103005182517fb971302a00000000000000000000000000000000000000000000000000000000815260248035600483015261022051919283919082906001600160a01b03165afa9081156141ca575f9161417e575b50600360236139be613ad693614a3d565b938161012061024001518780519788947f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a2261022051870152613a0b815180928589019061022051016146cd565b85017f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c75658382015262111d1160e91b61020051820152613a5682518093606384019061022051016146cd565b01017f227d2c7b2274726169745f74797065223a22537461747573222c2276616c75658382015262111d1160e91b6043820152613a9f82518093604684019061022051016146cd565b01017f227d5d0000000000000000000000000000000000000000000000000000000000838201520301601c19810184520182614713565b6103205161026051610340516102405191939291613afc906001600160a01b0316614a3d565b613b07602435615408565b6102a051909190156140f25761010051875190613b249082614713565b609b81527fe29aa0efb88f205741524e494e473a205472616e7366657272696e6720746865610220518201527f204e4654206d616b657320746865206e6577206f776e65722074686520726563888201527f697069656e74206f66207468652073747265616d2e205468652066756e647320610200518201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e2060808201527f666f72207468652070726576696f757320726563697069656e742e000000000061018051820152915b8751968794610220518601967f54686973204e465420726570726573656e74732061207061796d656e7420737488528a87017f7265616d20696e2061205361626c6965722056322000000000000000000000009052805190610220518101918060558a0190613c5c91856146cd565b7f20636f6e74726163742e20546865206f776e6572206f662074686973204e46546055918a01918201527f2063616e207769746864726177207468652073747265616d656420617373657460758201527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609582015284516102205186019691613cea8260b183018a6146cd565b01605501605c81017f2e5c6e5c6e2d2053747265616d2049443a200000000000000000000000000000905281519182606e830191610220510191613d2d926146cd565b01605c0190601282016302e3716960e51b905251918260168301613d50926146cd565b01601201600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613d80926146cd565b0160040190600a82016302e3716960e51b9052519182600e8301613da3926146cd565b01600a01600481016901020b2323932b9b99d160b51b905281519182600e830191610220510191613dd3926146cd565b01600401600a81017f5c6e5c6e00000000000000000000000000000000000000000000000000000000905281519182600e830191610220510191613e16926146cd565b01600a0103600401601f1981018452613e2f9084614713565b61032051613e3e602435615408565b85518091610220518201936a029b0b13634b2b9102b19160ad1b855280519081602b850191610220510191613e72926146cd565b8201602b81017f2023000000000000000000000000000000000000000000000000000000000000905281519182602d830191610220510191613eb3926146cd565b01602b0103600201601f1981018252613ecc9082614713565b61038051613ed990615567565b9286519586956102205187017f7b2261747472696275746573223a000000000000000000000000000000000000905280519081602e890191610220510191613f20926146cd565b860190602e82017f2c226465736372697074696f6e223a22000000000000000000000000000000009052519182603e8301613f5a926146cd565b01602e0190601082017f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c69659052603082017f722e636f6d222c226e616d65223a2200000000000000000000000000000000009052519182603f8301613fbd926146cd565b01601001602f81017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62619052604f81017f736536342c0000000000000000000000000000000000000000000000000000009052815191826054830191610220510191614027926146cd565b01602f01602581017f227d000000000000000000000000000000000000000000000000000000000000905203602501601d198101825260020161406a9082614713565b6102c081905261407990615567565b90805180926102205182017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000905280519081603d8401916102205101916140bf926146cd565b810103603d01601f19810183526140d69083614713565b5180916102205182526102205182016140ee916146ee565b0390f35b86516140ff608082614713565b605b81527fe29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e736665610220518201527f7261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e888201527f7366657272656420746f20616e6f74686572206163636f756e742e00000000006102005182015291613bed565b9050610220513d61022051116141c3575b6141998183614713565b816102205191810103126141bf57516001600160a01b03811681036141bf5760036139ad565b5f80fd5b503d61418f565b83513d5f823e3d90fd5b50600161394d565b6040516141eb61012082614713565b60f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e34343963610220518201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d610200518201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e64610180518201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d22610100518201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e0000000000000000610120518201529061200f565b60405161433e6101c082614713565b61019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e30323620343135610220518201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c70610200518201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e303736610180518201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e363234610100518201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e610120518201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c33838201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015295611dd2565b614558919450614552614ca0565b906156d2565b925f61195d565b905099610ad5565b9050610a2d565b601b60d09a610720565b634e487b7160e01b5f52604160045260245ffd5b6145ae915060203d6020116145b4575b6145a68183614713565b81019061475d565b5f610518565b503d61459c565b6040513d5f823e3d90fd5b6145df915060203d6020116145b4576145a68183614713565b5f6104b9565b634e487b7160e01b5f52601260045260245ffd5b61461b915060203d602011614621575b6146138183614713565b810190614735565b5f61024e565b503d614609565b506020813d60201161465d575b8161464260209383614713565b810103126141bf575160058110156141bf576101f5906101eb565b3d9150614635565b61467e915060203d602011614621576146138183614713565b5f610191565b90506020813d6020116146c5575b8161469f60209383614713565b810103126141bf57516001600160a01b03811681036141bf576001600160a01b0361010f565b3d9150614692565b5f5b8381106146de5750505f910152565b81810151838201526020016146cf565b90602091614707815180928185528580860191016146cd565b601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff82111761457857604052565b908160209103126141bf57516fffffffffffffffffffffffffffffffff811681036141bf5790565b908160209103126141bf575164ffffffffff811681036141bf5790565b67ffffffffffffffff811161457857601f01601f191660200190565b3d156147c0573d906147a78261477a565b916147b56040519384614713565b82523d5f602084013e565b606090565b6020818303126141bf5780519067ffffffffffffffff82116141bf570181601f820112156141bf5780516147f88161477a565b926148066040519485614713565b818452602082840101116141bf5761482491602080850191016146cd565b90565b6001600160a01b0316604051906395d89b4160e01b82525f82600481845afa9182156145bb575f92614a19575b5060409161489783516148678582614713565b601181527f5341422d56322d4c4f434b55502d4c494e0000000000000000000000000000006020820152826156d2565b156148d75750506148aa81519182614713565b600d81527f4c6f636b7570204c696e65617200000000000000000000000000000000000000602082015290565b61491683516148e68582614713565b601181527f5341422d56322d4c4f434b55502d44594e0000000000000000000000000000006020820152826156d2565b1561495657505061492981519182614713565b600e81527f4c6f636b75702044796e616d6963000000000000000000000000000000000000602082015290565b61499583516149658582614713565b601181527f5341422d56322d4c4f434b55502d5452410000000000000000000000000000006020820152826156d2565b156149d55750506149a881519182614713565b600f81527f4c6f636b7570205472616e636865640000000000000000000000000000000000602082015290565b614a159083519384937f814a8a2e0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301906146ee565b0390fd5b614a369192503d805f833e614a2e8183614713565b8101906147c5565b905f614854565b6001600160a01b03168060405191614a56606084614713565b602a8352602083016040368237835115614b255760309053825160011015614b25576078602184015360295b60018111614ac35750614a93575090565b7fe22e27eb000000000000000000000000000000000000000000000000000000005f52600452601460245260445ffd5b90600f81166010811015614b25577f3031323334353637383961626364656600000000000000000000000000000000901a614afe83866156ff565b5360041c908015614b11575f1901614a82565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f809160405160208101906395d89b4160e01b825260048152614b5d602482614713565b51915afa614b69614796565b90158015614c59575b614c1d5780602080614b89935183010191016147c5565b601e8151115f14614bd05750604051614ba3604082614713565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b614bd981615710565b15614be15790565b50604051614bf0604082614713565b601281527f556e737570706f727465642053796d626f6c0000000000000000000000000000602082015290565b50604051614c2c604082614713565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b50604081511115614b72565b60405190614c74604083614713565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190614caf604083614713565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b6005811015614dc75760048103614cf55750614824614ca0565b60038103614d395750604051614d0c604082614713565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b60018103614d7d5750604051614d50604082614713565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b600203614d8c57614824614c65565b604051614d9a604082614713565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b5f52602160045260245ffd5b5f809160405160208101907f313ce56700000000000000000000000000000000000000000000000000000000825260048152614e18602482614713565b51915afa614e24614796565b9080614e53575b15614e4e576020818051810103126141bf576020015160ff811681036141bf5790565b505f90565b506020815114614e2b565b60405190614e6d604083614713565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190614ea8604083614713565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b90614eff9493614f306020614f3f95614f22828096816040519c8d8b83829d519485930191016146cd565b8901614f13825180938580850191016146cd565b010191828151948592016146cd565b0191828151948592016146cd565b0103601f198101845283614713565b565b908115615216578061520657505b806001811015614fb8575050614f63614e99565b6148246002602060405184614f8182965180928580860191016146cd565b81017f2031000000000000000000000000000000000000000000000000000000000000838201520301601d19810184520182614713565b66038d7ea4c6800011156151a8576040519060a0820182811067ffffffffffffffff82111761457857604052602091604051614ff48482614713565b5f8152815260409182516150088482614713565b600181527f4b00000000000000000000000000000000000000000000000000000000000000858201528483015282516150418482614713565b600181527f4d000000000000000000000000000000000000000000000000000000000000008582015283830152825161507a8482614713565b600181527f420000000000000000000000000000000000000000000000000000000000000085820152606083015282516150b48482614713565b600181527f54000000000000000000000000000000000000000000000000000000000000008582015260808301525f905f945b6103e882101561518e578451946150fe8187614713565b600786527f2623383830353b000000000000000000000000000000000000000000000000008287015251945f5b6007811061517b575050600160fd1b602786015250600884526151629061515c90615157602887614713565b615408565b91615882565b916005851015614b25576148249460051b015192614ed4565b818101830151878201840152820161512b565b9490915060016103e86064600a85040693049101946150e7565b506151b1614e5e565b61482460086020604051846151cf82965180928580860191016146cd565b81017f203939392e393954000000000000000000000000000000000000000000000000838201520301601719810184520182614713565b600a0a9081156145e55704614f4f565b5050604051615226604082614713565b60018152600360fc1b602082015290565b62015180910304806152a1575061524c614e99565b614824600660206040518461526a82965180928580860191016146cd565b81017f2031204461790000000000000000000000000000000000000000000000000000838201520301601919810184520182614713565b61270f81116153785760018103615334576148246152f66040516152c6604082614713565b600481527f2044617900000000000000000000000000000000000000000000000000000000602082015292615408565b6020604051938261531086945180928580880191016146cd565b8301615324825180938580850191016146cd565b010103601f198101835282614713565b6148246152f6604051615348604082614713565b600581527f2044617973000000000000000000000000000000000000000000000000000000602082015292615408565b50615381614e5e565b614824600a60206040518461539f82965180928580860191016146cd565b81017f2039393939204461797300000000000000000000000000000000000000000000838201520301601519810184520182614713565b906153e08261477a565b6153ed6040519182614713565b82815280926153fe601f199161477a565b0190602036910137565b805f917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000082101561553f575b806d04ee2d6d415b85acef8100000000600a921015615524575b662386f26fc10000811015615510575b6305f5e1008110156154ff575b6127108110156154f0575b60648110156154e2575b10156154d7575b600a6021615492600185016153d6565b938401015b5f1901917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156154d257600a9091615497565b505090565b600190910190615482565b60646002910493019261547b565b61271060049104930192615471565b6305f5e10060089104930192615466565b662386f26fc1000060109104930192615459565b6d04ee2d6d415b85acef810000000060209104930192615449565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000810461542f565b908151156156bc576040519161557e606084614713565b604083527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208401527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040840152805160028101809111614b1157600390047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103614b11576156149060021b6153d6565b90602082019080815182019560208701908151925f83525b88811061566e575050600393949596505251068060011461565c57600214615652575090565b603d905f19015390565b50603d90815f19820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c168701015160028501531684010151600382015301949761562c565b90506040516156cc602082614713565b5f815290565b90815181519081811493846156e9575b5050505090565b602092939450820120920120145f8080806156e2565b908151811015614b25570160200190565b8051905f5b82811061572457505050600190565b7fff0000000000000000000000000000000000000000000000000000000000000061574f82846156ff565b5116600160fd1b811490600360fc1b81101580615858575b7f4100000000000000000000000000000000000000000000000000000000000000821015908161582d575b7f61000000000000000000000000000000000000000000000000000000000000008310159283615802575b5083156157fa575b5082156157f2575b5081156157ea575b50156157e357600101615715565b5050505f90565b90505f6157d5565b91505f6157cd565b92505f6157c5565b7f7a00000000000000000000000000000000000000000000000000000000000000101592505f6157bd565b7f5a000000000000000000000000000000000000000000000000000000000000008311159150615792565b507f3900000000000000000000000000000000000000000000000000000000000000811115615767565b8061589657506040516156cc602082614713565b600a8110156158fc576158a890615408565b614824602260405180937f2e3000000000000000000000000000000000000000000000000000000000000060208301526158eb81518092602086860191016146cd565b81010301601f198101835282614713565b61590590615408565b614824602160405180937f2e0000000000000000000000000000000000000000000000000000000000000060208301526158eb81518092602086860191016146cd565b60405190615957604083614713565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615bb757615991615948565b9061271003906127108211614b1157602e60619160506159b361482495615408565b60576040519788947f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208701527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8701527f7374726f6b653d22000000000000000000000000000000000000000000000000604f870152615a40815180926020868a0191016146cd565b85017f22207374726f6b652d77696474683d223130222f3e0000000000000000000000838201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615ac782518093602060a7850191016146cd565b01017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b838201527f652d646173686f66667365743d220000000000000000000000000000000000006070820152615b28825180936020607e850191016146cd565b01017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d838201527f77696474683d223522207472616e73666f726d3d22726f74617465282d393029604e8201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000606e820152631e17b39f60e11b608b82015203016041810184520182614713565b50506040516156cc602082614713565b6010614f3f9193929360206040519582615bea88945180928580880191016146cd565b830164010714051160dd1b838201526a029b0b13634b2b9102b19160ad1b6025820152615c2082518093856030850191016146cd565b01010301601f198101845283614713565b6005614f3f9193929360206040519582615c5488945180928580880191016146cd565b830164010714051160dd1b83820152615c2082518093856025850191016146cd565b6004811015614dc75780615cc05750604051615c93604082614713565b600881527f50726f6772657373000000000000000000000000000000000000000000000000602082015290565b60018103615d045750604051615cd7604082614713565b600681527f5374617475730000000000000000000000000000000000000000000000000000602082015290565b600203615d4657604051615d19604082614713565b600681527f416d6f756e740000000000000000000000000000000000000000000000000000602082015290565b604051615d54604082614713565b600881527f4475726174696f6e000000000000000000000000000000000000000000000000602082015290565b5f90805180156157e35790600d915f925f925b828410615da75750505050600d02900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615ddb88856156ff565b511614615df1575b820194600101929190615d94565b859450615de3565b5f90805180156157e357906010915f925f925b828410615e1f575050505060041b900390565b90919294603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615e5388856156ff565b511614615e69575b820194600101929190615e0c565b859450615e5b56fea164736f6c634300081a000a"; /*////////////////////////////////////////////////////////////////////////// DEPLOYERS diff --git a/src/SablierV2NFTDescriptor.sol b/src/SablierV2NFTDescriptor.sol index 7535afac1..4b56a6c03 100644 --- a/src/SablierV2NFTDescriptor.sol +++ b/src/SablierV2NFTDescriptor.sol @@ -303,8 +303,8 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { } /// @notice Checks whether the provided string contains only alphanumeric characters and spaces. - /// @dev Note that this returns true for empty strings, but it is not a security concern. - function isAlphanumeric(string memory str) internal pure returns (bool) { + /// @dev Note that this returns true for empty strings. + function isAlphanumericWithSpaces(string memory str) internal pure returns (bool) { // Convert the string to bytes to iterate over its characters. bytes memory b = bytes(str); @@ -368,8 +368,8 @@ contract SablierV2NFTDescriptor is ISablierV2NFTDescriptor { if (bytes(symbol).length > 30) { return "Long Symbol"; } else { - if (!isAlphanumeric(symbol)) { - return "Non-Alphanumeric Symbol"; + if (!isAlphanumericWithSpaces(symbol)) { + return "Unsupported Symbol"; } return symbol; } diff --git a/test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.t.sol b/test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.t.sol new file mode 100644 index 000000000..59fa92a11 --- /dev/null +++ b/test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.t.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.22 <0.9.0; + +import { NFTDescriptor_Integration_Shared_Test } from "../../../shared/nft-descriptor/NFTDescriptor.t.sol"; + +contract IsAlphanumericWithSpaces_Integration_Concrete_Test is NFTDescriptor_Integration_Shared_Test { + function test_IsAlphanumericWithSpaces_EmptyString() external view { + string memory symbol = ""; + bool result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + } + + modifier whenNotEmptyString() { + _; + } + + function test_IsAlphanumericWithSpaces_ContainsUnsupportedCharacters() external view whenNotEmptyString { + string memory symbol = ""; + bool result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo/"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo\\"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo%"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo&"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo("; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo)"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo\""; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo'"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo`"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo;"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + + symbol = "foo%20"; // URL-encoded empty space + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertFalse(result, "isAlphanumericWithSpaces"); + } + + modifier whenOnlySupportedCharacters() { + _; + } + + function test_IsAlphanumericWithSpaces() external view whenNotEmptyString whenOnlySupportedCharacters { + string memory symbol = "foo"; + bool result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = "Foo"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = "Foo "; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = "Foo Bar"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = " "; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = "foo01234"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + + symbol = "123456789"; + result = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertTrue(result, "isAlphanumericWithSpaces"); + } +} diff --git a/test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.tree b/test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.tree similarity index 56% rename from test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.tree rename to test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.tree index c02ab1f10..4583ea755 100644 --- a/test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.tree +++ b/test/integration/concrete/nft-descriptor/is-alphanumeric-with-spaces/isAlphanumericWithSpaces.tree @@ -1,8 +1,8 @@ -isAlphanumeric.t.sol +isAlphanumericWithSpaces.t.sol ├── when the symbol is an empty string │ └── it should return true └── when the symbol is not an empty string - ├── given the symbol does not contain only alphanumeric characters + ├── given the symbol contain unsupported characters │ └── it should return false - └── given the symbol contains only alphanumeric characters + └── given the symbol contains only supported characters └── it should return true diff --git a/test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.t.sol b/test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.t.sol deleted file mode 100644 index 7c24e44d5..000000000 --- a/test/integration/concrete/nft-descriptor/is-alphanumeric/isAlphanumeric.t.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.22 <0.9.0; - -import { NFTDescriptor_Integration_Shared_Test } from "../../../shared/nft-descriptor/NFTDescriptor.t.sol"; - -contract IsAlphanumeric_Integration_Concrete_Test is NFTDescriptor_Integration_Shared_Test { - function test_IsAlphanumeric_EmptyString() external view { - string memory symbol = ""; - bool result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - } - - modifier whenNotEmptyString() { - _; - } - - function test_IsAlphanumeric_ContainsNonAlphanumericCharacters() external view whenNotEmptyString { - string memory symbol = ""; - bool result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo/"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo\\"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo%"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo&"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo("; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo)"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo\""; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo'"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo`"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo;"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - - symbol = "foo%20"; // URL-encoded empty space - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertFalse(result, "isAlphanumeric"); - } - - modifier whenOnlyAlphanumericCharacters() { - _; - } - - function test_IsAlphanumeric() external view whenNotEmptyString whenOnlyAlphanumericCharacters { - string memory symbol = "foo"; - bool result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = "Foo"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = "Foo "; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = "Foo Bar"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = " "; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = "foo01234"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - - symbol = "123456789"; - result = nftDescriptorMock.isAlphanumeric_(symbol); - assertTrue(result, "isAlphanumeric"); - } -} diff --git a/test/integration/concrete/nft-descriptor/safe-asset-symbol/safeAssetSymbol.t.sol b/test/integration/concrete/nft-descriptor/safe-asset-symbol/safeAssetSymbol.t.sol index 7238f0a29..f2e1e9a10 100644 --- a/test/integration/concrete/nft-descriptor/safe-asset-symbol/safeAssetSymbol.t.sol +++ b/test/integration/concrete/nft-descriptor/safe-asset-symbol/safeAssetSymbol.t.sol @@ -51,7 +51,7 @@ contract SafeAssetSymbol_Integration_Concrete_Test is NFTDescriptor_Integration_ function test_SafeAssetSymbol_NonAlphanumeric() external whenERC20Contract givenSymbolString givenSymbolNotLong { ERC20Mock asset = new ERC20Mock({ name: "Token", symbol: "" }); string memory actualSymbol = nftDescriptorMock.safeAssetSymbol_(address(asset)); - string memory expectedSymbol = "Non-Alphanumeric Symbol"; + string memory expectedSymbol = "Unsupported Symbol"; assertEq(actualSymbol, expectedSymbol, "symbol"); } diff --git a/test/integration/fuzz/nft-descriptor/isAlphanumeric.t.sol b/test/integration/fuzz/nft-descriptor/isAlphanumericWithSpaces.t.sol similarity index 74% rename from test/integration/fuzz/nft-descriptor/isAlphanumeric.t.sol rename to test/integration/fuzz/nft-descriptor/isAlphanumericWithSpaces.t.sol index e16a18529..4d5df33df 100644 --- a/test/integration/fuzz/nft-descriptor/isAlphanumeric.t.sol +++ b/test/integration/fuzz/nft-descriptor/isAlphanumericWithSpaces.t.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.22 <0.9.0; import { NFTDescriptor_Integration_Shared_Test } from "../../shared/nft-descriptor/NFTDescriptor.t.sol"; -contract IsAlphanumeric_Integration_Fuzz_Test is NFTDescriptor_Integration_Shared_Test { +contract IsAlphanumericWithSpaces_Integration_Fuzz_Test is NFTDescriptor_Integration_Shared_Test { bytes1 internal constant SPACE = 0x20; // ASCII 32 bytes1 internal constant ZERO = 0x30; // ASCII 48 bytes1 internal constant NINE = 0x39; // ASCII 57 @@ -21,22 +21,22 @@ contract IsAlphanumeric_Integration_Fuzz_Test is NFTDescriptor_Integration_Share /// - String with only alphanumerical characters /// - String with only non-alphanumerical characters /// - String with both alphanumerical and non-alphanumerical characters - function testFuzz_IsAlphanumeric(string memory symbol) external view whenNotEmptyString { + function testFuzz_IsAlphanumericWithSpaces(string memory symbol) external view whenNotEmptyString { bytes memory b = bytes(symbol); uint256 length = b.length; bool expectedResult = true; for (uint256 i = 0; i < length; ++i) { bytes1 char = b[i]; - if (!isAlphanumericChar(char)) { + if (!isAlphanumericOrSpaceChar(char)) { expectedResult = false; break; } } - bool actualResult = nftDescriptorMock.isAlphanumeric_(symbol); - assertEq(actualResult, expectedResult, "isAlphanumeric"); + bool actualResult = nftDescriptorMock.isAlphanumericWithSpaces_(symbol); + assertEq(actualResult, expectedResult, "isAlphanumericWithSpaces"); } - function isAlphanumericChar(bytes1 char) internal pure returns (bool) { + function isAlphanumericOrSpaceChar(bytes1 char) internal pure returns (bool) { bool isSpace = char == SPACE; bool isDigit = char >= ZERO && char <= NINE; bool isUppercaseLetter = char >= A && char <= Z; diff --git a/test/mocks/NFTDescriptorMock.sol b/test/mocks/NFTDescriptorMock.sol index a5b7176ae..f63eca0cf 100644 --- a/test/mocks/NFTDescriptorMock.sol +++ b/test/mocks/NFTDescriptorMock.sol @@ -78,8 +78,8 @@ contract NFTDescriptorMock is SablierV2NFTDescriptor { return SVGElements.hourglass(status); } - function isAlphanumeric_(string memory symbol) external pure returns (bool) { - return isAlphanumeric(symbol); + function isAlphanumericWithSpaces_(string memory symbol) external pure returns (bool) { + return isAlphanumericWithSpaces(symbol); } function mapSymbol_(IERC721Metadata nft) external view returns (string memory) {