Contract Address Details

0x6328Be6cCB6625dA04695A57983950EBdF52c1b9

Token
VICI (VICI)
Creator
0x863e2a–b48652 at 0x8403a2–0dccee
Balance
0 VLX
Tokens
Fetching tokens...
Transactions
32 Transactions
Transfers
0 Transfers
Gas Used
1,334,526
Last Balance Update
68789927
Contract name:
VICI




Optimization enabled
false
Compiler version
v0.8.2+commit.661d1103




EVM Version
default




Verified at
2021-11-14T12:10:06.008654Z

Constructor Arguments

{
	"generatedSources": [
		{
			"ast": {
				"nodeType": "YulBlock",
				"src": "0:1958:13",
				"statements": [
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "72:53:13",
							"statements": [
								{
									"expression": {
										"arguments": [
											{
												"name": "pos",
												"nodeType": "YulIdentifier",
												"src": "89:3:13"
											},
											{
												"arguments": [
													{
														"name": "value",
														"nodeType": "YulIdentifier",
														"src": "112:5:13"
													}
												],
												"functionName": {
													"name": "cleanup_t_address",
													"nodeType": "YulIdentifier",
													"src": "94:17:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "94:24:13"
											}
										],
										"functionName": {
											"name": "mstore",
											"nodeType": "YulIdentifier",
											"src": "82:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "82:37:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "82:37:13"
								}
							]
						},
						"name": "abi_encode_t_address_to_t_address_fromStack",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "60:5:13",
								"type": ""
							},
							{
								"name": "pos",
								"nodeType": "YulTypedName",
								"src": "67:3:13",
								"type": ""
							}
						],
						"src": "7:118:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "196:53:13",
							"statements": [
								{
									"expression": {
										"arguments": [
											{
												"name": "pos",
												"nodeType": "YulIdentifier",
												"src": "213:3:13"
											},
											{
												"arguments": [
													{
														"name": "value",
														"nodeType": "YulIdentifier",
														"src": "236:5:13"
													}
												],
												"functionName": {
													"name": "cleanup_t_bytes32",
													"nodeType": "YulIdentifier",
													"src": "218:17:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "218:24:13"
											}
										],
										"functionName": {
											"name": "mstore",
											"nodeType": "YulIdentifier",
											"src": "206:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "206:37:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "206:37:13"
								}
							]
						},
						"name": "abi_encode_t_bytes32_to_t_bytes32_fromStack",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "184:5:13",
								"type": ""
							},
							{
								"name": "pos",
								"nodeType": "YulTypedName",
								"src": "191:3:13",
								"type": ""
							}
						],
						"src": "131:118:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "320:53:13",
							"statements": [
								{
									"expression": {
										"arguments": [
											{
												"name": "pos",
												"nodeType": "YulIdentifier",
												"src": "337:3:13"
											},
											{
												"arguments": [
													{
														"name": "value",
														"nodeType": "YulIdentifier",
														"src": "360:5:13"
													}
												],
												"functionName": {
													"name": "cleanup_t_uint256",
													"nodeType": "YulIdentifier",
													"src": "342:17:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "342:24:13"
											}
										],
										"functionName": {
											"name": "mstore",
											"nodeType": "YulIdentifier",
											"src": "330:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "330:37:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "330:37:13"
								}
							]
						},
						"name": "abi_encode_t_uint256_to_t_uint256_fromStack",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "308:5:13",
								"type": ""
							},
							{
								"name": "pos",
								"nodeType": "YulTypedName",
								"src": "315:3:13",
								"type": ""
							}
						],
						"src": "255:118:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "589:454:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "599:27:13",
									"value": {
										"arguments": [
											{
												"name": "headStart",
												"nodeType": "YulIdentifier",
												"src": "611:9:13"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "622:3:13",
												"type": "",
												"value": "160"
											}
										],
										"functionName": {
											"name": "add",
											"nodeType": "YulIdentifier",
											"src": "607:3:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "607:19:13"
									},
									"variableNames": [
										{
											"name": "tail",
											"nodeType": "YulIdentifier",
											"src": "599:4:13"
										}
									]
								},
								{
									"expression": {
										"arguments": [
											{
												"name": "value0",
												"nodeType": "YulIdentifier",
												"src": "680:6:13"
											},
											{
												"arguments": [
													{
														"name": "headStart",
														"nodeType": "YulIdentifier",
														"src": "693:9:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "704:1:13",
														"type": "",
														"value": "0"
													}
												],
												"functionName": {
													"name": "add",
													"nodeType": "YulIdentifier",
													"src": "689:3:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "689:17:13"
											}
										],
										"functionName": {
											"name": "abi_encode_t_bytes32_to_t_bytes32_fromStack",
											"nodeType": "YulIdentifier",
											"src": "636:43:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "636:71:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "636:71:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"name": "value1",
												"nodeType": "YulIdentifier",
												"src": "761:6:13"
											},
											{
												"arguments": [
													{
														"name": "headStart",
														"nodeType": "YulIdentifier",
														"src": "774:9:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "785:2:13",
														"type": "",
														"value": "32"
													}
												],
												"functionName": {
													"name": "add",
													"nodeType": "YulIdentifier",
													"src": "770:3:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "770:18:13"
											}
										],
										"functionName": {
											"name": "abi_encode_t_bytes32_to_t_bytes32_fromStack",
											"nodeType": "YulIdentifier",
											"src": "717:43:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "717:72:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "717:72:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"name": "value2",
												"nodeType": "YulIdentifier",
												"src": "843:6:13"
											},
											{
												"arguments": [
													{
														"name": "headStart",
														"nodeType": "YulIdentifier",
														"src": "856:9:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "867:2:13",
														"type": "",
														"value": "64"
													}
												],
												"functionName": {
													"name": "add",
													"nodeType": "YulIdentifier",
													"src": "852:3:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "852:18:13"
											}
										],
										"functionName": {
											"name": "abi_encode_t_bytes32_to_t_bytes32_fromStack",
											"nodeType": "YulIdentifier",
											"src": "799:43:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "799:72:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "799:72:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"name": "value3",
												"nodeType": "YulIdentifier",
												"src": "925:6:13"
											},
											{
												"arguments": [
													{
														"name": "headStart",
														"nodeType": "YulIdentifier",
														"src": "938:9:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "949:2:13",
														"type": "",
														"value": "96"
													}
												],
												"functionName": {
													"name": "add",
													"nodeType": "YulIdentifier",
													"src": "934:3:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "934:18:13"
											}
										],
										"functionName": {
											"name": "abi_encode_t_uint256_to_t_uint256_fromStack",
											"nodeType": "YulIdentifier",
											"src": "881:43:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "881:72:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "881:72:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"name": "value4",
												"nodeType": "YulIdentifier",
												"src": "1007:6:13"
											},
											{
												"arguments": [
													{
														"name": "headStart",
														"nodeType": "YulIdentifier",
														"src": "1020:9:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "1031:3:13",
														"type": "",
														"value": "128"
													}
												],
												"functionName": {
													"name": "add",
													"nodeType": "YulIdentifier",
													"src": "1016:3:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "1016:19:13"
											}
										],
										"functionName": {
											"name": "abi_encode_t_address_to_t_address_fromStack",
											"nodeType": "YulIdentifier",
											"src": "963:43:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "963:73:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "963:73:13"
								}
							]
						},
						"name": "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "headStart",
								"nodeType": "YulTypedName",
								"src": "529:9:13",
								"type": ""
							},
							{
								"name": "value4",
								"nodeType": "YulTypedName",
								"src": "541:6:13",
								"type": ""
							},
							{
								"name": "value3",
								"nodeType": "YulTypedName",
								"src": "549:6:13",
								"type": ""
							},
							{
								"name": "value2",
								"nodeType": "YulTypedName",
								"src": "557:6:13",
								"type": ""
							},
							{
								"name": "value1",
								"nodeType": "YulTypedName",
								"src": "565:6:13",
								"type": ""
							},
							{
								"name": "value0",
								"nodeType": "YulTypedName",
								"src": "573:6:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "tail",
								"nodeType": "YulTypedName",
								"src": "584:4:13",
								"type": ""
							}
						],
						"src": "379:664:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1094:51:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "1104:35:13",
									"value": {
										"arguments": [
											{
												"name": "value",
												"nodeType": "YulIdentifier",
												"src": "1133:5:13"
											}
										],
										"functionName": {
											"name": "cleanup_t_uint160",
											"nodeType": "YulIdentifier",
											"src": "1115:17:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1115:24:13"
									},
									"variableNames": [
										{
											"name": "cleaned",
											"nodeType": "YulIdentifier",
											"src": "1104:7:13"
										}
									]
								}
							]
						},
						"name": "cleanup_t_address",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "1076:5:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "cleaned",
								"nodeType": "YulTypedName",
								"src": "1086:7:13",
								"type": ""
							}
						],
						"src": "1049:96:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1196:32:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "1206:16:13",
									"value": {
										"name": "value",
										"nodeType": "YulIdentifier",
										"src": "1217:5:13"
									},
									"variableNames": [
										{
											"name": "cleaned",
											"nodeType": "YulIdentifier",
											"src": "1206:7:13"
										}
									]
								}
							]
						},
						"name": "cleanup_t_bytes32",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "1178:5:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "cleaned",
								"nodeType": "YulTypedName",
								"src": "1188:7:13",
								"type": ""
							}
						],
						"src": "1151:77:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1279:81:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "1289:65:13",
									"value": {
										"arguments": [
											{
												"name": "value",
												"nodeType": "YulIdentifier",
												"src": "1304:5:13"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1311:42:13",
												"type": "",
												"value": "0xffffffffffffffffffffffffffffffffffffffff"
											}
										],
										"functionName": {
											"name": "and",
											"nodeType": "YulIdentifier",
											"src": "1300:3:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1300:54:13"
									},
									"variableNames": [
										{
											"name": "cleaned",
											"nodeType": "YulIdentifier",
											"src": "1289:7:13"
										}
									]
								}
							]
						},
						"name": "cleanup_t_uint160",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "1261:5:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "cleaned",
								"nodeType": "YulTypedName",
								"src": "1271:7:13",
								"type": ""
							}
						],
						"src": "1234:126:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1411:32:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "1421:16:13",
									"value": {
										"name": "value",
										"nodeType": "YulIdentifier",
										"src": "1432:5:13"
									},
									"variableNames": [
										{
											"name": "cleaned",
											"nodeType": "YulIdentifier",
											"src": "1421:7:13"
										}
									]
								}
							]
						},
						"name": "cleanup_t_uint256",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "value",
								"nodeType": "YulTypedName",
								"src": "1393:5:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "cleaned",
								"nodeType": "YulTypedName",
								"src": "1403:7:13",
								"type": ""
							}
						],
						"src": "1366:77:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1500:269:13",
							"statements": [
								{
									"nodeType": "YulAssignment",
									"src": "1510:22:13",
									"value": {
										"arguments": [
											{
												"name": "data",
												"nodeType": "YulIdentifier",
												"src": "1524:4:13"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1530:1:13",
												"type": "",
												"value": "2"
											}
										],
										"functionName": {
											"name": "div",
											"nodeType": "YulIdentifier",
											"src": "1520:3:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1520:12:13"
									},
									"variableNames": [
										{
											"name": "length",
											"nodeType": "YulIdentifier",
											"src": "1510:6:13"
										}
									]
								},
								{
									"nodeType": "YulVariableDeclaration",
									"src": "1541:38:13",
									"value": {
										"arguments": [
											{
												"name": "data",
												"nodeType": "YulIdentifier",
												"src": "1571:4:13"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1577:1:13",
												"type": "",
												"value": "1"
											}
										],
										"functionName": {
											"name": "and",
											"nodeType": "YulIdentifier",
											"src": "1567:3:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1567:12:13"
									},
									"variables": [
										{
											"name": "outOfPlaceEncoding",
											"nodeType": "YulTypedName",
											"src": "1545:18:13",
											"type": ""
										}
									]
								},
								{
									"body": {
										"nodeType": "YulBlock",
										"src": "1618:51:13",
										"statements": [
											{
												"nodeType": "YulAssignment",
												"src": "1632:27:13",
												"value": {
													"arguments": [
														{
															"name": "length",
															"nodeType": "YulIdentifier",
															"src": "1646:6:13"
														},
														{
															"kind": "number",
															"nodeType": "YulLiteral",
															"src": "1654:4:13",
															"type": "",
															"value": "0x7f"
														}
													],
													"functionName": {
														"name": "and",
														"nodeType": "YulIdentifier",
														"src": "1642:3:13"
													},
													"nodeType": "YulFunctionCall",
													"src": "1642:17:13"
												},
												"variableNames": [
													{
														"name": "length",
														"nodeType": "YulIdentifier",
														"src": "1632:6:13"
													}
												]
											}
										]
									},
									"condition": {
										"arguments": [
											{
												"name": "outOfPlaceEncoding",
												"nodeType": "YulIdentifier",
												"src": "1598:18:13"
											}
										],
										"functionName": {
											"name": "iszero",
											"nodeType": "YulIdentifier",
											"src": "1591:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1591:26:13"
									},
									"nodeType": "YulIf",
									"src": "1588:2:13"
								},
								{
									"body": {
										"nodeType": "YulBlock",
										"src": "1721:42:13",
										"statements": [
											{
												"expression": {
													"arguments": [],
													"functionName": {
														"name": "panic_error_0x22",
														"nodeType": "YulIdentifier",
														"src": "1735:16:13"
													},
													"nodeType": "YulFunctionCall",
													"src": "1735:18:13"
												},
												"nodeType": "YulExpressionStatement",
												"src": "1735:18:13"
											}
										]
									},
									"condition": {
										"arguments": [
											{
												"name": "outOfPlaceEncoding",
												"nodeType": "YulIdentifier",
												"src": "1685:18:13"
											},
											{
												"arguments": [
													{
														"name": "length",
														"nodeType": "YulIdentifier",
														"src": "1708:6:13"
													},
													{
														"kind": "number",
														"nodeType": "YulLiteral",
														"src": "1716:2:13",
														"type": "",
														"value": "32"
													}
												],
												"functionName": {
													"name": "lt",
													"nodeType": "YulIdentifier",
													"src": "1705:2:13"
												},
												"nodeType": "YulFunctionCall",
												"src": "1705:14:13"
											}
										],
										"functionName": {
											"name": "eq",
											"nodeType": "YulIdentifier",
											"src": "1682:2:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1682:38:13"
									},
									"nodeType": "YulIf",
									"src": "1679:2:13"
								}
							]
						},
						"name": "extract_byte_array_length",
						"nodeType": "YulFunctionDefinition",
						"parameters": [
							{
								"name": "data",
								"nodeType": "YulTypedName",
								"src": "1484:4:13",
								"type": ""
							}
						],
						"returnVariables": [
							{
								"name": "length",
								"nodeType": "YulTypedName",
								"src": "1493:6:13",
								"type": ""
							}
						],
						"src": "1449:320:13"
					},
					{
						"body": {
							"nodeType": "YulBlock",
							"src": "1803:152:13",
							"statements": [
								{
									"expression": {
										"arguments": [
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1820:1:13",
												"type": "",
												"value": "0"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1823:77:13",
												"type": "",
												"value": "35408467139433450592217433187231851964531694900788300625387963629091585785856"
											}
										],
										"functionName": {
											"name": "mstore",
											"nodeType": "YulIdentifier",
											"src": "1813:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1813:88:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "1813:88:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1917:1:13",
												"type": "",
												"value": "4"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1920:4:13",
												"type": "",
												"value": "0x22"
											}
										],
										"functionName": {
											"name": "mstore",
											"nodeType": "YulIdentifier",
											"src": "1910:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1910:15:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "1910:15:13"
								},
								{
									"expression": {
										"arguments": [
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1941:1:13",
												"type": "",
												"value": "0"
											},
											{
												"kind": "number",
												"nodeType": "YulLiteral",
												"src": "1944:4:13",
												"type": "",
												"value": "0x24"
											}
										],
										"functionName": {
											"name": "revert",
											"nodeType": "YulIdentifier",
											"src": "1934:6:13"
										},
										"nodeType": "YulFunctionCall",
										"src": "1934:15:13"
									},
									"nodeType": "YulExpressionStatement",
									"src": "1934:15:13"
								}
							]
						},
						"name": "panic_error_0x22",
						"nodeType": "YulFunctionDefinition",
						"src": "1775:180:13"
					}
				]
			},
			"contents": "{\n\n    function abi_encode_t_address_to_t_address_fromStack(value, pos) {\n        mstore(pos, cleanup_t_address(value))\n    }\n\n    function abi_encode_t_bytes32_to_t_bytes32_fromStack(value, pos) {\n        mstore(pos, cleanup_t_bytes32(value))\n    }\n\n    function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n        mstore(pos, cleanup_t_uint256(value))\n    }\n\n    function abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed(headStart , value4, value3, value2, value1, value0) -> tail {\n        tail := add(headStart, 160)\n\n        abi_encode_t_bytes32_to_t_bytes32_fromStack(value0,  add(headStart, 0))\n\n        abi_encode_t_bytes32_to_t_bytes32_fromStack(value1,  add(headStart, 32))\n\n        abi_encode_t_bytes32_to_t_bytes32_fromStack(value2,  add(headStart, 64))\n\n        abi_encode_t_uint256_to_t_uint256_fromStack(value3,  add(headStart, 96))\n\n        abi_encode_t_address_to_t_address_fromStack(value4,  add(headStart, 128))\n\n    }\n\n    function cleanup_t_address(value) -> cleaned {\n        cleaned := cleanup_t_uint160(value)\n    }\n\n    function cleanup_t_bytes32(value) -> cleaned {\n        cleaned := value\n    }\n\n    function cleanup_t_uint160(value) -> cleaned {\n        cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n    }\n\n    function cleanup_t_uint256(value) -> cleaned {\n        cleaned := value\n    }\n\n    function extract_byte_array_length(data) -> length {\n        length := div(data, 2)\n        let outOfPlaceEncoding := and(data, 1)\n        if iszero(outOfPlaceEncoding) {\n            length := and(length, 0x7f)\n        }\n\n        if eq(outOfPlaceEncoding, lt(length, 32)) {\n            panic_error_0x22()\n        }\n    }\n\n    function panic_error_0x22() {\n        mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n        mstore(4, 0x22)\n        revert(0, 0x24)\n    }\n\n}\n",
			"id": 13,
			"language": "Yul",
			"name": "#utility.yul"
		}
	],
	"linkReferences": {},
	"object": "6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120908152503480156200003a57600080fd5b506040518060400160405280600481526020017f5649434900000000000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f56494349000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f564943490000000000000000000000000000000000000000000000000000000081525081600390805190602001906200012c92919062000311565b5080600490805190602001906200014592919062000311565b5050506000600560006101000a81548160ff02191690831515021790555062000183620001776200020760201b60201c565b6200020f60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001eb818484620002d560201b60201c565b60808181525050806101008181525050505050505050620004fe565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620002f2959493929190620003f4565b6040516020818303038152906040528051906020012090509392505050565b8280546200031f9062000499565b90600052602060002090601f0160209004810192826200034357600085556200038f565b82601f106200035e57805160ff19168380011785556200038f565b828001600101855582156200038f579182015b828111156200038e57825182559160200191906001019062000371565b5b5090506200039e9190620003a2565b5090565b5b80821115620003bd576000816000905550600101620003a3565b5090565b620003cc8162000451565b82525050565b620003dd8162000465565b82525050565b620003ee816200048f565b82525050565b600060a0820190506200040b6000830188620003d2565b6200041a6020830187620003d2565b620004296040830186620003d2565b620004386060830185620003e3565b620004476080830184620003c1565b9695505050505050565b60006200045e826200046f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620004b257607f821691505b60208210811415620004c957620004c8620004cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160e05161010051610120516131086200054e6000396000610c2c015260006113510152600061139301526000611372015260006112fe0152600061132601526131086000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c357806395d89b411161007c57806395d89b4114610368578063a457c2d714610386578063a9059cbb146103b6578063d505accf146103e6578063dd62ed3e14610402578063f2fde38b146104325761014d565b806370a08231146102ba578063715018a6146102ea57806379cc6790146102f45780637ecebe00146103105780638456cb59146103405780638da5cb5b1461034a5761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633f4ba83a1461025a57806340c10f191461026457806342966c68146102805780635c975abb1461029c5761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61044e565b604051610167919061261c565b60405180910390f35b61018a60048036038101906101859190612099565b6104e0565b60405161019791906124ed565b60405180910390f35b6101a86104fe565b6040516101b591906128de565b60405180910390f35b6101d860048036038101906101d39190611fac565b610508565b6040516101e591906124ed565b60405180910390f35b6101f6610600565b60405161020391906128f9565b60405180910390f35b610214610609565b6040516102219190612508565b60405180910390f35b610244600480360381019061023f9190612099565b610618565b60405161025191906124ed565b60405180910390f35b6102626106c4565b005b61027e60048036038101906102799190612099565b61074a565b005b61029a600480360381019061029591906120d5565b6107d4565b005b6102a46107e8565b6040516102b191906124ed565b60405180910390f35b6102d460048036038101906102cf9190611f47565b6107ff565b6040516102e191906128de565b60405180910390f35b6102f2610847565b005b61030e60048036038101906103099190612099565b6108cf565b005b61032a60048036038101906103259190611f47565b61094a565b60405161033791906128de565b60405180910390f35b61034861099a565b005b610352610a20565b60405161035f91906124d2565b60405180910390f35b610370610a4a565b60405161037d919061261c565b60405180910390f35b6103a0600480360381019061039b9190612099565b610adc565b6040516103ad91906124ed565b60405180910390f35b6103d060048036038101906103cb9190612099565b610bc7565b6040516103dd91906124ed565b60405180910390f35b61040060048036038101906103fb9190611ffb565b610be5565b005b61041c60048036038101906104179190611f70565b610d27565b60405161042991906128de565b60405180910390f35b61044c60048036038101906104479190611f47565b610dae565b005b60606003805461045d90612a57565b80601f016020809104026020016040519081016040528092919081815260200182805461048990612a57565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b60006104f46104ed610ea6565b8484610eae565b6001905092915050565b6000600254905090565b6000610515848484611079565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610560610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d7906127de565b60405180910390fd5b6105f4856105ec610ea6565b858403610eae565b60019150509392505050565b60006012905090565b60006106136112fa565b905090565b60006106ba610625610ea6565b848460016000610633610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106b5919061293b565b610eae565b6001905092915050565b6106cc610ea6565b73ffffffffffffffffffffffffffffffffffffffff166106ea610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610737906127fe565b60405180910390fd5b6107486113bd565b565b610752610ea6565b73ffffffffffffffffffffffffffffffffffffffff16610770610a20565b73ffffffffffffffffffffffffffffffffffffffff16146107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd906127fe565b60405180910390fd5b6107d0828261145f565b5050565b6107e56107df610ea6565b826115bf565b50565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61084f610ea6565b73ffffffffffffffffffffffffffffffffffffffff1661086d610a20565b73ffffffffffffffffffffffffffffffffffffffff16146108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba906127fe565b60405180910390fd5b6108cd6000611796565b565b60006108e2836108dd610ea6565b610d27565b905081811015610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e9061281e565b60405180910390fd5b61093b83610933610ea6565b848403610eae565b61094583836115bf565b505050565b6000610993600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061185c565b9050919050565b6109a2610ea6565b73ffffffffffffffffffffffffffffffffffffffff166109c0610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d906127fe565b60405180910390fd5b610a1e61186a565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5990612a57565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8590612a57565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050905090565b60008060016000610aeb610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f9061289e565b60405180910390fd5b610bbc610bb3610ea6565b85858403610eae565b600191505092915050565b6000610bdb610bd4610ea6565b8484611079565b6001905092915050565b83421115610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f9061271e565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c578c61190d565b89604051602001610c6d96959493929190612523565b6040516020818303038152906040528051906020012090506000610c908261196b565b90506000610ca082878787611985565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906127be565b60405180910390fd5b610d1b8a8a8a610eae565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610db6610ea6565b73ffffffffffffffffffffffffffffffffffffffff16610dd4610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906127fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906126de565b60405180910390fd5b610ea381611796565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f159061287e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f85906126fe565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161106c91906128de565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061285e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111509061265e565b60405180910390fd5b6111648383836119b0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e19061273e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127d919061293b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112e191906128de565b60405180910390a36112f4848484611a08565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561134c577f000000000000000000000000000000000000000000000000000000000000000090506113ba565b6113b77f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611a0d565b90505b90565b6113c56107e8565b611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061267e565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611448610ea6565b60405161145591906124d2565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c6906128be565b60405180910390fd5b6114db600083836119b0565b80600260008282546114ed919061293b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611542919061293b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115a791906128de565b60405180910390a36115bb60008383611a08565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116269061283e565b60405180910390fd5b61163b826000836119b0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b89061269e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546117189190612991565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161177d91906128de565b60405180910390a361179183600084611a08565b505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6118726107e8565b156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061277e565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f6610ea6565b60405161190391906124d2565b60405180910390a1565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061195a8161185c565b915061196581611a47565b50919050565b600061197e6119786112fa565b83611a5d565b9050919050565b600080600061199687878787611a90565b915091506119a381611b9d565b8192505050949350505050565b6119b86107e8565b156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef9061277e565b60405180910390fd5b611a03838383611eee565b505050565b505050565b60008383834630604051602001611a28959493929190612584565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611a7292919061249b565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611acb576000600391509150611b94565b601b8560ff1614158015611ae35750601c8560ff1614155b15611af5576000600491509150611b94565b600060018787878760405160008152602001604052604051611b1a94939291906125d7565b6020604051602081039080840390855afa158015611b3c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8b57600060019250925050611b94565b80600092509250505b94509492505050565b60006004811115611bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c10577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c1b57611eeb565b60016004811115611c55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc69061263e565b60405180910390fd5b60026004811115611d09577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a906126be565b60405180910390fd5b60036004811115611dbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e9061275e565b60405180910390fd5b600480811115611e70577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611ea9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061279e565b60405180910390fd5b5b50565b505050565b600081359050611f0281613076565b92915050565b600081359050611f178161308d565b92915050565b600081359050611f2c816130a4565b92915050565b600081359050611f41816130bb565b92915050565b600060208284031215611f5957600080fd5b6000611f6784828501611ef3565b91505092915050565b60008060408385031215611f8357600080fd5b6000611f9185828601611ef3565b9250506020611fa285828601611ef3565b9150509250929050565b600080600060608486031215611fc157600080fd5b6000611fcf86828701611ef3565b9350506020611fe086828701611ef3565b9250506040611ff186828701611f1d565b9150509250925092565b600080600080600080600060e0888a03121561201657600080fd5b60006120248a828b01611ef3565b97505060206120358a828b01611ef3565b96505060406120468a828b01611f1d565b95505060606120578a828b01611f1d565b94505060806120688a828b01611f32565b93505060a06120798a828b01611f08565b92505060c061208a8a828b01611f08565b91505092959891949750929550565b600080604083850312156120ac57600080fd5b60006120ba85828601611ef3565b92505060206120cb85828601611f1d565b9150509250929050565b6000602082840312156120e757600080fd5b60006120f584828501611f1d565b91505092915050565b612107816129c5565b82525050565b612116816129d7565b82525050565b612125816129e3565b82525050565b61213c612137826129e3565b612a89565b82525050565b600061214d82612914565b612157818561291f565b9350612167818560208601612a24565b61217081612af1565b840191505092915050565b600061218860188361291f565b915061219382612b02565b602082019050919050565b60006121ab60238361291f565b91506121b682612b2b565b604082019050919050565b60006121ce60148361291f565b91506121d982612b7a565b602082019050919050565b60006121f160228361291f565b91506121fc82612ba3565b604082019050919050565b6000612214601f8361291f565b915061221f82612bf2565b602082019050919050565b600061223760268361291f565b915061224282612c1b565b604082019050919050565b600061225a60228361291f565b915061226582612c6a565b604082019050919050565b600061227d600283612930565b915061228882612cb9565b600282019050919050565b60006122a0601d8361291f565b91506122ab82612ce2565b602082019050919050565b60006122c360268361291f565b91506122ce82612d0b565b604082019050919050565b60006122e660228361291f565b91506122f182612d5a565b604082019050919050565b600061230960108361291f565b915061231482612da9565b602082019050919050565b600061232c60228361291f565b915061233782612dd2565b604082019050919050565b600061234f601e8361291f565b915061235a82612e21565b602082019050919050565b600061237260288361291f565b915061237d82612e4a565b604082019050919050565b600061239560208361291f565b91506123a082612e99565b602082019050919050565b60006123b860248361291f565b91506123c382612ec2565b604082019050919050565b60006123db60218361291f565b91506123e682612f11565b604082019050919050565b60006123fe60258361291f565b915061240982612f60565b604082019050919050565b600061242160248361291f565b915061242c82612faf565b604082019050919050565b600061244460258361291f565b915061244f82612ffe565b604082019050919050565b6000612467601f8361291f565b91506124728261304d565b602082019050919050565b61248681612a0d565b82525050565b61249581612a17565b82525050565b60006124a682612270565b91506124b2828561212b565b6020820191506124c2828461212b565b6020820191508190509392505050565b60006020820190506124e760008301846120fe565b92915050565b6000602082019050612502600083018461210d565b92915050565b600060208201905061251d600083018461211c565b92915050565b600060c082019050612538600083018961211c565b61254560208301886120fe565b61255260408301876120fe565b61255f606083018661247d565b61256c608083018561247d565b61257960a083018461247d565b979650505050505050565b600060a082019050612599600083018861211c565b6125a6602083018761211c565b6125b3604083018661211c565b6125c0606083018561247d565b6125cd60808301846120fe565b9695505050505050565b60006080820190506125ec600083018761211c565b6125f9602083018661248c565b612606604083018561211c565b612613606083018461211c565b95945050505050565b600060208201905081810360008301526126368184612142565b905092915050565b600060208201905081810360008301526126578161217b565b9050919050565b600060208201905081810360008301526126778161219e565b9050919050565b60006020820190508181036000830152612697816121c1565b9050919050565b600060208201905081810360008301526126b7816121e4565b9050919050565b600060208201905081810360008301526126d781612207565b9050919050565b600060208201905081810360008301526126f78161222a565b9050919050565b600060208201905081810360008301526127178161224d565b9050919050565b6000602082019050818103600083015261273781612293565b9050919050565b60006020820190508181036000830152612757816122b6565b9050919050565b60006020820190508181036000830152612777816122d9565b9050919050565b60006020820190508181036000830152612797816122fc565b9050919050565b600060208201905081810360008301526127b78161231f565b9050919050565b600060208201905081810360008301526127d781612342565b9050919050565b600060208201905081810360008301526127f781612365565b9050919050565b6000602082019050818103600083015261281781612388565b9050919050565b60006020820190508181036000830152612837816123ab565b9050919050565b60006020820190508181036000830152612857816123ce565b9050919050565b60006020820190508181036000830152612877816123f1565b9050919050565b6000602082019050818103600083015261289781612414565b9050919050565b600060208201905081810360008301526128b781612437565b9050919050565b600060208201905081810360008301526128d78161245a565b9050919050565b60006020820190506128f3600083018461247d565b92915050565b600060208201905061290e600083018461248c565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061294682612a0d565b915061295183612a0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561298657612985612a93565b5b828201905092915050565b600061299c82612a0d565b91506129a783612a0d565b9250828210156129ba576129b9612a93565b5b828203905092915050565b60006129d0826129ed565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612a42578082015181840152602081019050612a27565b83811115612a51576000848401525b50505050565b60006002820490506001821680612a6f57607f821691505b60208210811415612a8357612a82612ac2565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61307f816129c5565b811461308a57600080fd5b50565b613096816129e3565b81146130a157600080fd5b50565b6130ad81612a0d565b81146130b857600080fd5b50565b6130c481612a17565b81146130cf57600080fd5b5056fea26469706673582212200f6d34e84eb4b21062db48603434ae6edf979b8db55c8195dec71a9d3b26366d64736f6c63430008020033",
	"opcodes": "PUSH2 0x140 PUSH1 0x40 MSTORE PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH2 0x120 SWAP1 DUP2 MSTORE POP CALLVALUE DUP1 ISZERO PUSH3 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5649434900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP1 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3100000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5649434900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5649434900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x12C SWAP3 SWAP2 SWAP1 PUSH3 0x311 JUMP JUMPDEST POP DUP1 PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x145 SWAP3 SWAP2 SWAP1 PUSH3 0x311 JUMP JUMPDEST POP POP POP PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH3 0x183 PUSH3 0x177 PUSH3 0x207 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x20F PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x0 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F SWAP1 POP DUP3 PUSH1 0xC0 DUP2 DUP2 MSTORE POP POP DUP2 PUSH1 0xE0 DUP2 DUP2 MSTORE POP POP CHAINID PUSH1 0xA0 DUP2 DUP2 MSTORE POP POP PUSH3 0x1EB DUP2 DUP5 DUP5 PUSH3 0x2D5 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 MSTORE POP POP DUP1 PUSH2 0x100 DUP2 DUP2 MSTORE POP POP POP POP POP POP POP POP PUSH3 0x4FE JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 PUSH1 0x5 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 CHAINID ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH3 0x2F2 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x3F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH3 0x31F SWAP1 PUSH3 0x499 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH3 0x343 JUMPI PUSH1 0x0 DUP6 SSTORE PUSH3 0x38F JUMP JUMPDEST DUP3 PUSH1 0x1F LT PUSH3 0x35E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x38F JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x38F JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x38E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x371 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x39E SWAP2 SWAP1 PUSH3 0x3A2 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3BD JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x3A3 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3CC DUP2 PUSH3 0x451 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x3DD DUP2 PUSH3 0x465 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x3EE DUP2 PUSH3 0x48F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH3 0x40B PUSH1 0x0 DUP4 ADD DUP9 PUSH3 0x3D2 JUMP JUMPDEST PUSH3 0x41A PUSH1 0x20 DUP4 ADD DUP8 PUSH3 0x3D2 JUMP JUMPDEST PUSH3 0x429 PUSH1 0x40 DUP4 ADD DUP7 PUSH3 0x3D2 JUMP JUMPDEST PUSH3 0x438 PUSH1 0x60 DUP4 ADD DUP6 PUSH3 0x3E3 JUMP JUMPDEST PUSH3 0x447 PUSH1 0x80 DUP4 ADD DUP5 PUSH3 0x3C1 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x45E DUP3 PUSH3 0x46F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 DIV SWAP1 POP PUSH1 0x1 DUP3 AND DUP1 PUSH3 0x4B2 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH3 0x4C9 JUMPI PUSH3 0x4C8 PUSH3 0x4CF JUMP JUMPDEST JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 MLOAD PUSH2 0x100 MLOAD PUSH2 0x120 MLOAD PUSH2 0x3108 PUSH3 0x54E PUSH1 0x0 CODECOPY PUSH1 0x0 PUSH2 0xC2C ADD MSTORE PUSH1 0x0 PUSH2 0x1351 ADD MSTORE PUSH1 0x0 PUSH2 0x1393 ADD MSTORE PUSH1 0x0 PUSH2 0x1372 ADD MSTORE PUSH1 0x0 PUSH2 0x12FE ADD MSTORE PUSH1 0x0 PUSH2 0x1326 ADD MSTORE PUSH2 0x3108 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x14D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x368 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x3B6 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x402 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x432 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2EA JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x2F4 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x310 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x34A JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0x115 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x20C JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x264 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x29C JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15A PUSH2 0x44E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x261C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x18A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x185 SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x4E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x197 SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1A8 PUSH2 0x4FE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1B5 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1D3 SWAP2 SWAP1 PUSH2 0x1FAC JUMP JUMPDEST PUSH2 0x508 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E5 SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1F6 PUSH2 0x600 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x203 SWAP2 SWAP1 PUSH2 0x28F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x214 PUSH2 0x609 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x2508 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x244 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x23F SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x618 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x251 SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x262 PUSH2 0x6C4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x27E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x279 SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x74A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x29A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x295 SWAP2 SWAP1 PUSH2 0x20D5 JUMP JUMPDEST PUSH2 0x7D4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2A4 PUSH2 0x7E8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2B1 SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2D4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x2CF SWAP2 SWAP1 PUSH2 0x1F47 JUMP JUMPDEST PUSH2 0x7FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2E1 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2F2 PUSH2 0x847 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x30E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x309 SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0x8CF JUMP JUMPDEST STOP JUMPDEST PUSH2 0x32A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x325 SWAP2 SWAP1 PUSH2 0x1F47 JUMP JUMPDEST PUSH2 0x94A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x337 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x348 PUSH2 0x99A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x352 PUSH2 0xA20 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x35F SWAP2 SWAP1 PUSH2 0x24D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x370 PUSH2 0xA4A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x37D SWAP2 SWAP1 PUSH2 0x261C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x3A0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x39B SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0xADC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3AD SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x3D0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3CB SWAP2 SWAP1 PUSH2 0x2099 JUMP JUMPDEST PUSH2 0xBC7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3DD SWAP2 SWAP1 PUSH2 0x24ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x400 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x3FB SWAP2 SWAP1 PUSH2 0x1FFB JUMP JUMPDEST PUSH2 0xBE5 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x41C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x417 SWAP2 SWAP1 PUSH2 0x1F70 JUMP JUMPDEST PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x429 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x44C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x447 SWAP2 SWAP1 PUSH2 0x1F47 JUMP JUMPDEST PUSH2 0xDAE JUMP JUMPDEST STOP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x45D SWAP1 PUSH2 0x2A57 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x489 SWAP1 PUSH2 0x2A57 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x4D6 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4AB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4D6 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4B9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F4 PUSH2 0x4ED PUSH2 0xEA6 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xEAE JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x515 DUP5 DUP5 DUP5 PUSH2 0x1079 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x560 PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0x5E0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5D7 SWAP1 PUSH2 0x27DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x5F4 DUP6 PUSH2 0x5EC PUSH2 0xEA6 JUMP JUMPDEST DUP6 DUP5 SUB PUSH2 0xEAE JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x12 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x613 PUSH2 0x12FA JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6BA PUSH2 0x625 PUSH2 0xEA6 JUMP JUMPDEST DUP5 DUP5 PUSH1 0x1 PUSH1 0x0 PUSH2 0x633 PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x6B5 SWAP2 SWAP1 PUSH2 0x293B JUMP JUMPDEST PUSH2 0xEAE JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x6CC PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x6EA PUSH2 0xA20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x740 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x737 SWAP1 PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x748 PUSH2 0x13BD JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x752 PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x770 PUSH2 0xA20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x7C6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x7BD SWAP1 PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7D0 DUP3 DUP3 PUSH2 0x145F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x7E5 PUSH2 0x7DF PUSH2 0xEA6 JUMP JUMPDEST DUP3 PUSH2 0x15BF JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x84F PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x86D PUSH2 0xA20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8C3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8BA SWAP1 PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x8CD PUSH1 0x0 PUSH2 0x1796 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E2 DUP4 PUSH2 0x8DD PUSH2 0xEA6 JUMP JUMPDEST PUSH2 0xD27 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x927 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x91E SWAP1 PUSH2 0x281E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x93B DUP4 PUSH2 0x933 PUSH2 0xEA6 JUMP JUMPDEST DUP5 DUP5 SUB PUSH2 0xEAE JUMP JUMPDEST PUSH2 0x945 DUP4 DUP4 PUSH2 0x15BF JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x993 PUSH1 0x6 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x185C JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x9A2 PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9C0 PUSH2 0xA20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA16 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA0D SWAP1 PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA1E PUSH2 0x186A JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0xA59 SWAP1 PUSH2 0x2A57 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xA85 SWAP1 PUSH2 0x2A57 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xAD2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAA7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xAD2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xAB5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0xAEB PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0xBA8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB9F SWAP1 PUSH2 0x289E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xBBC PUSH2 0xBB3 PUSH2 0xEA6 JUMP JUMPDEST DUP6 DUP6 DUP5 SUB PUSH2 0xEAE JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBDB PUSH2 0xBD4 PUSH2 0xEA6 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x1079 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xC28 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC1F SWAP1 PUSH2 0x271E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x0 DUP9 DUP9 DUP9 PUSH2 0xC57 DUP13 PUSH2 0x190D JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC6D SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2523 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xC90 DUP3 PUSH2 0x196B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCA0 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1985 JUMP JUMPDEST SWAP1 POP DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xD10 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD07 SWAP1 PUSH2 0x27BE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xD1B DUP11 DUP11 DUP11 PUSH2 0xEAE JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xDB6 PUSH2 0xEA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xDD4 PUSH2 0xA20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE2A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE21 SWAP1 PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE9A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE91 SWAP1 PUSH2 0x26DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xEA3 DUP2 PUSH2 0x1796 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xF1E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF15 SWAP1 PUSH2 0x287E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xF8E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF85 SWAP1 PUSH2 0x26FE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP4 PUSH1 0x40 MLOAD PUSH2 0x106C SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x10E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x10E0 SWAP1 PUSH2 0x285E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1159 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1150 SWAP1 PUSH2 0x265E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1164 DUP4 DUP4 DUP4 PUSH2 0x19B0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x11EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x11E1 SWAP1 PUSH2 0x273E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 DUP2 SUB PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x127D SWAP2 SWAP1 PUSH2 0x293B JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x12E1 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x12F4 DUP5 DUP5 DUP5 PUSH2 0x1A08 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 CHAINID EQ ISZERO PUSH2 0x134C JUMPI PUSH32 0x0 SWAP1 POP PUSH2 0x13BA JUMP JUMPDEST PUSH2 0x13B7 PUSH32 0x0 PUSH32 0x0 PUSH32 0x0 PUSH2 0x1A0D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x13C5 PUSH2 0x7E8 JUMP JUMPDEST PUSH2 0x1404 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13FB SWAP1 PUSH2 0x267E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA PUSH2 0x1448 PUSH2 0xEA6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1455 SWAP2 SWAP1 PUSH2 0x24D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x14CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x14C6 SWAP1 PUSH2 0x28BE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x14DB PUSH1 0x0 DUP4 DUP4 PUSH2 0x19B0 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x14ED SWAP2 SWAP1 PUSH2 0x293B JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1542 SWAP2 SWAP1 PUSH2 0x293B JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD PUSH2 0x15A7 SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x15BB PUSH1 0x0 DUP4 DUP4 PUSH2 0x1A08 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x162F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1626 SWAP1 PUSH2 0x283E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x163B DUP3 PUSH1 0x0 DUP4 PUSH2 0x19B0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x16C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16B8 SWAP1 PUSH2 0x269E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 DUP2 SUB PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x1718 SWAP2 SWAP1 PUSH2 0x2991 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x177D SWAP2 SWAP1 PUSH2 0x28DE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x1791 DUP4 PUSH1 0x0 DUP5 PUSH2 0x1A08 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 PUSH1 0x5 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1872 PUSH2 0x7E8 JUMP JUMPDEST ISZERO PUSH2 0x18B2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18A9 SWAP1 PUSH2 0x277E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 PUSH2 0x18F6 PUSH2 0xEA6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1903 SWAP2 SWAP1 PUSH2 0x24D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x6 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH2 0x195A DUP2 PUSH2 0x185C JUMP JUMPDEST SWAP2 POP PUSH2 0x1965 DUP2 PUSH2 0x1A47 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x197E PUSH2 0x1978 PUSH2 0x12FA JUMP JUMPDEST DUP4 PUSH2 0x1A5D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1996 DUP8 DUP8 DUP8 DUP8 PUSH2 0x1A90 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x19A3 DUP2 PUSH2 0x1B9D JUMP JUMPDEST DUP2 SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x19B8 PUSH2 0x7E8 JUMP JUMPDEST ISZERO PUSH2 0x19F8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x19EF SWAP1 PUSH2 0x277E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1A03 DUP4 DUP4 DUP4 PUSH2 0x1EEE JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 CHAINID ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A28 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2584 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x0 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A72 SWAP3 SWAP2 SWAP1 PUSH2 0x249B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 PUSH1 0x0 SHR GT ISZERO PUSH2 0x1ACB JUMPI PUSH1 0x0 PUSH1 0x3 SWAP2 POP SWAP2 POP PUSH2 0x1B94 JUMP JUMPDEST PUSH1 0x1B DUP6 PUSH1 0xFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x1AE3 JUMPI POP PUSH1 0x1C DUP6 PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 PUSH1 0x4 SWAP2 POP SWAP2 POP PUSH2 0x1B94 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1B1A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x25D7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B3C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1B8B JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0x1B94 JUMP JUMPDEST DUP1 PUSH1 0x0 SWAP3 POP SWAP3 POP POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1BD7 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1C10 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST EQ ISZERO PUSH2 0x1C1B JUMPI PUSH2 0x1EEB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1C55 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1C8E JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST EQ ISZERO PUSH2 0x1CCF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1CC6 SWAP1 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1D09 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1D42 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST EQ ISZERO PUSH2 0x1D83 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D7A SWAP1 PUSH2 0x26BE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x3 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1DBD JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1DF6 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST EQ ISZERO PUSH2 0x1E37 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E2E SWAP1 PUSH2 0x275E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 DUP2 GT ISZERO PUSH2 0x1E70 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1EA9 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST EQ ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EE1 SWAP1 PUSH2 0x279E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1F02 DUP2 PUSH2 0x3076 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1F17 DUP2 PUSH2 0x308D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1F2C DUP2 PUSH2 0x30A4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1F41 DUP2 PUSH2 0x30BB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1F67 DUP5 DUP3 DUP6 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1F83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1F91 DUP6 DUP3 DUP7 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1FA2 DUP6 DUP3 DUP7 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1FC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1FCF DUP7 DUP3 DUP8 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1FE0 DUP7 DUP3 DUP8 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x1FF1 DUP7 DUP3 DUP8 ADD PUSH2 0x1F1D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2016 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2024 DUP11 DUP3 DUP12 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH2 0x2035 DUP11 DUP3 DUP12 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 PUSH2 0x2046 DUP11 DUP3 DUP12 ADD PUSH2 0x1F1D JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 PUSH2 0x2057 DUP11 DUP3 DUP12 ADD PUSH2 0x1F1D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2068 DUP11 DUP3 DUP12 ADD PUSH2 0x1F32 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2079 DUP11 DUP3 DUP12 ADD PUSH2 0x1F08 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x208A DUP11 DUP3 DUP12 ADD PUSH2 0x1F08 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x20AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x20BA DUP6 DUP3 DUP7 ADD PUSH2 0x1EF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x20CB DUP6 DUP3 DUP7 ADD PUSH2 0x1F1D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x20E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x20F5 DUP5 DUP3 DUP6 ADD PUSH2 0x1F1D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2107 DUP2 PUSH2 0x29C5 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2116 DUP2 PUSH2 0x29D7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2125 DUP2 PUSH2 0x29E3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x213C PUSH2 0x2137 DUP3 PUSH2 0x29E3 JUMP JUMPDEST PUSH2 0x2A89 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x214D DUP3 PUSH2 0x2914 JUMP JUMPDEST PUSH2 0x2157 DUP2 DUP6 PUSH2 0x291F JUMP JUMPDEST SWAP4 POP PUSH2 0x2167 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x2A24 JUMP JUMPDEST PUSH2 0x2170 DUP2 PUSH2 0x2AF1 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2188 PUSH1 0x18 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2193 DUP3 PUSH2 0x2B02 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x21AB PUSH1 0x23 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x21B6 DUP3 PUSH2 0x2B2B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x21CE PUSH1 0x14 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x21D9 DUP3 PUSH2 0x2B7A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x21F1 PUSH1 0x22 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x21FC DUP3 PUSH2 0x2BA3 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2214 PUSH1 0x1F DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x221F DUP3 PUSH2 0x2BF2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2237 PUSH1 0x26 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2242 DUP3 PUSH2 0x2C1B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x225A PUSH1 0x22 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2265 DUP3 PUSH2 0x2C6A JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x227D PUSH1 0x2 DUP4 PUSH2 0x2930 JUMP JUMPDEST SWAP2 POP PUSH2 0x2288 DUP3 PUSH2 0x2CB9 JUMP JUMPDEST PUSH1 0x2 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x22A0 PUSH1 0x1D DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x22AB DUP3 PUSH2 0x2CE2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x22C3 PUSH1 0x26 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x22CE DUP3 PUSH2 0x2D0B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x22E6 PUSH1 0x22 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x22F1 DUP3 PUSH2 0x2D5A JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2309 PUSH1 0x10 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2314 DUP3 PUSH2 0x2DA9 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x232C PUSH1 0x22 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2337 DUP3 PUSH2 0x2DD2 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x234F PUSH1 0x1E DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x235A DUP3 PUSH2 0x2E21 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2372 PUSH1 0x28 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x237D DUP3 PUSH2 0x2E4A JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2395 PUSH1 0x20 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x23A0 DUP3 PUSH2 0x2E99 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23B8 PUSH1 0x24 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x23C3 DUP3 PUSH2 0x2EC2 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23DB PUSH1 0x21 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x23E6 DUP3 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23FE PUSH1 0x25 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2409 DUP3 PUSH2 0x2F60 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2421 PUSH1 0x24 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x242C DUP3 PUSH2 0x2FAF JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2444 PUSH1 0x25 DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x244F DUP3 PUSH2 0x2FFE JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2467 PUSH1 0x1F DUP4 PUSH2 0x291F JUMP JUMPDEST SWAP2 POP PUSH2 0x2472 DUP3 PUSH2 0x304D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2486 DUP2 PUSH2 0x2A0D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2495 DUP2 PUSH2 0x2A17 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x24A6 DUP3 PUSH2 0x2270 JUMP JUMPDEST SWAP2 POP PUSH2 0x24B2 DUP3 DUP6 PUSH2 0x212B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH2 0x24C2 DUP3 DUP5 PUSH2 0x212B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP DUP2 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x24E7 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x20FE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2502 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x210D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x251D PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x211C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 ADD SWAP1 POP PUSH2 0x2538 PUSH1 0x0 DUP4 ADD DUP10 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x2545 PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x20FE JUMP JUMPDEST PUSH2 0x2552 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x20FE JUMP JUMPDEST PUSH2 0x255F PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x247D JUMP JUMPDEST PUSH2 0x256C PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x247D JUMP JUMPDEST PUSH2 0x2579 PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x247D JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0x2599 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x25A6 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x25B3 PUSH1 0x40 DUP4 ADD DUP7 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x25C0 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x247D JUMP JUMPDEST PUSH2 0x25CD PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x20FE JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x25EC PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x25F9 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x248C JUMP JUMPDEST PUSH2 0x2606 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x211C JUMP JUMPDEST PUSH2 0x2613 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x211C JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2636 DUP2 DUP5 PUSH2 0x2142 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2657 DUP2 PUSH2 0x217B JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2677 DUP2 PUSH2 0x219E JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2697 DUP2 PUSH2 0x21C1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x26B7 DUP2 PUSH2 0x21E4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x26D7 DUP2 PUSH2 0x2207 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x26F7 DUP2 PUSH2 0x222A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2717 DUP2 PUSH2 0x224D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2737 DUP2 PUSH2 0x2293 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2757 DUP2 PUSH2 0x22B6 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2777 DUP2 PUSH2 0x22D9 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2797 DUP2 PUSH2 0x22FC JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x27B7 DUP2 PUSH2 0x231F JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x27D7 DUP2 PUSH2 0x2342 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x27F7 DUP2 PUSH2 0x2365 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2817 DUP2 PUSH2 0x2388 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2837 DUP2 PUSH2 0x23AB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2857 DUP2 PUSH2 0x23CE JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2877 DUP2 PUSH2 0x23F1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x2897 DUP2 PUSH2 0x2414 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x28B7 DUP2 PUSH2 0x2437 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x28D7 DUP2 PUSH2 0x245A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x28F3 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x247D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x290E PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x248C JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2946 DUP3 PUSH2 0x2A0D JUMP JUMPDEST SWAP2 POP PUSH2 0x2951 DUP4 PUSH2 0x2A0D JUMP JUMPDEST SWAP3 POP DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB DUP3 GT ISZERO PUSH2 0x2986 JUMPI PUSH2 0x2985 PUSH2 0x2A93 JUMP JUMPDEST JUMPDEST DUP3 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x299C DUP3 PUSH2 0x2A0D JUMP JUMPDEST SWAP2 POP PUSH2 0x29A7 DUP4 PUSH2 0x2A0D JUMP JUMPDEST SWAP3 POP DUP3 DUP3 LT ISZERO PUSH2 0x29BA JUMPI PUSH2 0x29B9 PUSH2 0x2A93 JUMP JUMPDEST JUMPDEST DUP3 DUP3 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29D0 DUP3 PUSH2 0x29ED JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2A42 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2A27 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2A51 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 DIV SWAP1 POP PUSH1 0x1 DUP3 AND DUP1 PUSH2 0x2A6F JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH2 0x2A83 JUMPI PUSH2 0x2A82 PUSH2 0x2AC2 JUMP JUMPDEST JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x6573730000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x5061757361626C653A206E6F7420706175736564000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A206275726E20616D6F756E7420657863656564732062616C616E PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x6365000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7373000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x616C616E63650000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x5061757361626C653A2070617573656400000000000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202776272076616C PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732061 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x6C6C6F77616E6365000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A206275726E20616D6F756E74206578636565647320616C6C6F77 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x616E636500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A206275726E2066726F6D20746865207A65726F20616464726573 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7300000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x6472657373000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7265737300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x207A65726F000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH2 0x307F DUP2 PUSH2 0x29C5 JUMP JUMPDEST DUP2 EQ PUSH2 0x308A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x3096 DUP2 PUSH2 0x29E3 JUMP JUMPDEST DUP2 EQ PUSH2 0x30A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x30AD DUP2 PUSH2 0x2A0D JUMP JUMPDEST DUP2 EQ PUSH2 0x30B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x30C4 DUP2 PUSH2 0x2A17 JUMP JUMPDEST DUP2 EQ PUSH2 0x30CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF PUSH14 0x34E84EB4B21062DB48603434AE6E 0xDF SWAP8 SWAP12 DUP14 0xB5 0x5C DUP2 SWAP6 0xDE 0xC7 BYTE SWAP14 EXTCODESIZE 0x26 CALLDATASIZE PUSH14 0x64736F6C63430008020033000000 ",
	"sourceMap": "452:568:12:-:0;;;1049:95:6;996:148;;;;;528:58:12;;;;;;;;;;1376:52:6;;;;;;;;;;;;;;;;;1415:4;2340:564:11;;;;;;;;;;;;;;;;;1906:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1980:5;1972;:13;;;;;;;;;;;;:::i;:::-;;2005:7;1995;:17;;;;;;;;;;;;:::i;:::-;;1906:113;;934:5:1;924:7;;:15;;;;;;;;;;;;;;;;;;867:23:0;877:12;:10;;;:12;;:::i;:::-;867:9;;;:23;;:::i;:::-;2405:18:11;2442:4;2426:22;;;;;;2405:43;;2458:21;2498:7;2482:25;;;;;;2458:49;;2517:16;2536:117;2517:136;;2678:10;2663:25;;;;;;2716:13;2698:31;;;;;;2758:13;2739:32;;;;;;2808:58;2830:8;2840:10;2852:13;2808:21;;;:58;;:::i;:::-;2781:85;;;;;;2889:8;2876:21;;;;;;2340:564;;;;;1376:52:6;452:568:12;;587:96:8;640:7;666:10;659:17;;587:96;:::o;2041:169:0:-;2096:16;2115:6;;;;;;;;;;;2096:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2194:8;2163:40;;2184:8;2163:40;;;;;;;;;;;;2041:169;;:::o;3271:257:11:-;3411:7;3458:8;3468;3478:11;3491:13;3514:4;3447:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3437:84;;;;;;3430:91;;3271:257;;;;;:::o;452:568:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:118:13:-;94:24;112:5;94:24;:::i;:::-;89:3;82:37;72:53;;:::o;131:118::-;218:24;236:5;218:24;:::i;:::-;213:3;206:37;196:53;;:::o;255:118::-;342:24;360:5;342:24;:::i;:::-;337:3;330:37;320:53;;:::o;379:664::-;;622:3;611:9;607:19;599:27;;636:71;704:1;693:9;689:17;680:6;636:71;:::i;:::-;717:72;785:2;774:9;770:18;761:6;717:72;:::i;:::-;799;867:2;856:9;852:18;843:6;799:72;:::i;:::-;881;949:2;938:9;934:18;925:6;881:72;:::i;:::-;963:73;1031:3;1020:9;1016:19;1007:6;963:73;:::i;:::-;589:454;;;;;;;;:::o;1049:96::-;;1115:24;1133:5;1115:24;:::i;:::-;1104:35;;1094:51;;;:::o;1151:77::-;;1217:5;1206:16;;1196:32;;;:::o;1234:126::-;;1311:42;1304:5;1300:54;1289:65;;1279:81;;;:::o;1366:77::-;;1432:5;1421:16;;1411:32;;;:::o;1449:320::-;;1530:1;1524:4;1520:12;1510:22;;1577:1;1571:4;1567:12;1598:18;1588:2;;1654:4;1646:6;1642:17;1632:27;;1588:2;1716;1708:6;1705:14;1685:18;1682:38;1679:2;;;1735:18;;:::i;:::-;1679:2;1500:269;;;;:::o;1775:180::-;1823:77;1820:1;1813:88;1920:4;1917:1;1910:15;1944:4;1941:1;1934:15;452:568:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
}
              

Contract source code

// File: @openzeppelin/[email protected]/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/draft-EIP712.sol



pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-IERC20Permit.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/[email protected]/utils/Context.sol



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/[email protected]/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-ERC20Permit.sol



pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Burnable.sol



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

// File: contract-bc1d88a0fa.sol


pragma solidity ^0.8.2;






/// @custom:security-contact [email protected]
contract VICI is ERC20, ERC20Burnable, Pausable, Ownable, ERC20Permit {
    constructor() ERC20("VICI", "VICI") ERC20Permit("VICI") {}

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, amount);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c357806395d89b411161007c57806395d89b4114610368578063a457c2d714610386578063a9059cbb146103b6578063d505accf146103e6578063dd62ed3e14610402578063f2fde38b146104325761014d565b806370a08231146102ba578063715018a6146102ea57806379cc6790146102f45780637ecebe00146103105780638456cb59146103405780638da5cb5b1461034a5761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633f4ba83a1461025a57806340c10f191461026457806342966c68146102805780635c975abb1461029c5761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61044e565b604051610167919061261c565b60405180910390f35b61018a60048036038101906101859190612099565b6104e0565b60405161019791906124ed565b60405180910390f35b6101a86104fe565b6040516101b591906128de565b60405180910390f35b6101d860048036038101906101d39190611fac565b610508565b6040516101e591906124ed565b60405180910390f35b6101f6610600565b60405161020391906128f9565b60405180910390f35b610214610609565b6040516102219190612508565b60405180910390f35b610244600480360381019061023f9190612099565b610618565b60405161025191906124ed565b60405180910390f35b6102626106c4565b005b61027e60048036038101906102799190612099565b61074a565b005b61029a600480360381019061029591906120d5565b6107d4565b005b6102a46107e8565b6040516102b191906124ed565b60405180910390f35b6102d460048036038101906102cf9190611f47565b6107ff565b6040516102e191906128de565b60405180910390f35b6102f2610847565b005b61030e60048036038101906103099190612099565b6108cf565b005b61032a60048036038101906103259190611f47565b61094a565b60405161033791906128de565b60405180910390f35b61034861099a565b005b610352610a20565b60405161035f91906124d2565b60405180910390f35b610370610a4a565b60405161037d919061261c565b60405180910390f35b6103a0600480360381019061039b9190612099565b610adc565b6040516103ad91906124ed565b60405180910390f35b6103d060048036038101906103cb9190612099565b610bc7565b6040516103dd91906124ed565b60405180910390f35b61040060048036038101906103fb9190611ffb565b610be5565b005b61041c60048036038101906104179190611f70565b610d27565b60405161042991906128de565b60405180910390f35b61044c60048036038101906104479190611f47565b610dae565b005b60606003805461045d90612a57565b80601f016020809104026020016040519081016040528092919081815260200182805461048990612a57565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b60006104f46104ed610ea6565b8484610eae565b6001905092915050565b6000600254905090565b6000610515848484611079565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610560610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d7906127de565b60405180910390fd5b6105f4856105ec610ea6565b858403610eae565b60019150509392505050565b60006012905090565b60006106136112fa565b905090565b60006106ba610625610ea6565b848460016000610633610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106b5919061293b565b610eae565b6001905092915050565b6106cc610ea6565b73ffffffffffffffffffffffffffffffffffffffff166106ea610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610737906127fe565b60405180910390fd5b6107486113bd565b565b610752610ea6565b73ffffffffffffffffffffffffffffffffffffffff16610770610a20565b73ffffffffffffffffffffffffffffffffffffffff16146107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd906127fe565b60405180910390fd5b6107d0828261145f565b5050565b6107e56107df610ea6565b826115bf565b50565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61084f610ea6565b73ffffffffffffffffffffffffffffffffffffffff1661086d610a20565b73ffffffffffffffffffffffffffffffffffffffff16146108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba906127fe565b60405180910390fd5b6108cd6000611796565b565b60006108e2836108dd610ea6565b610d27565b905081811015610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e9061281e565b60405180910390fd5b61093b83610933610ea6565b848403610eae565b61094583836115bf565b505050565b6000610993600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061185c565b9050919050565b6109a2610ea6565b73ffffffffffffffffffffffffffffffffffffffff166109c0610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d906127fe565b60405180910390fd5b610a1e61186a565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5990612a57565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8590612a57565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050905090565b60008060016000610aeb610ea6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f9061289e565b60405180910390fd5b610bbc610bb3610ea6565b85858403610eae565b600191505092915050565b6000610bdb610bd4610ea6565b8484611079565b6001905092915050565b83421115610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f9061271e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c578c61190d565b89604051602001610c6d96959493929190612523565b6040516020818303038152906040528051906020012090506000610c908261196b565b90506000610ca082878787611985565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906127be565b60405180910390fd5b610d1b8a8a8a610eae565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610db6610ea6565b73ffffffffffffffffffffffffffffffffffffffff16610dd4610a20565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906127fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906126de565b60405180910390fd5b610ea381611796565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f159061287e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f85906126fe565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161106c91906128de565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061285e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111509061265e565b60405180910390fd5b6111648383836119b0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e19061273e565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127d919061293b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112e191906128de565b60405180910390a36112f4848484611a08565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000006a46141561134c577f8bf20a801316300a050709ee4a459e98599cc42bb09a4d4f545d775559ae7fa890506113ba565b6113b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fdf777f8baf80e84fe7184c11b3918f6cd83b47ea6ae989e80744d375c5ef88897fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611a0d565b90505b90565b6113c56107e8565b611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061267e565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611448610ea6565b60405161145591906124d2565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c6906128be565b60405180910390fd5b6114db600083836119b0565b80600260008282546114ed919061293b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611542919061293b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115a791906128de565b60405180910390a36115bb60008383611a08565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116269061283e565b60405180910390fd5b61163b826000836119b0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b89061269e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546117189190612991565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161177d91906128de565b60405180910390a361179183600084611a08565b505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6118726107e8565b156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061277e565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f6610ea6565b60405161190391906124d2565b60405180910390a1565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061195a8161185c565b915061196581611a47565b50919050565b600061197e6119786112fa565b83611a5d565b9050919050565b600080600061199687878787611a90565b915091506119a381611b9d565b8192505050949350505050565b6119b86107e8565b156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef9061277e565b60405180910390fd5b611a03838383611eee565b505050565b505050565b60008383834630604051602001611a28959493929190612584565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611a7292919061249b565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611acb576000600391509150611b94565b601b8560ff1614158015611ae35750601c8560ff1614155b15611af5576000600491509150611b94565b600060018787878760405160008152602001604052604051611b1a94939291906125d7565b6020604051602081039080840390855afa158015611b3c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8b57600060019250925050611b94565b80600092509250505b94509492505050565b60006004811115611bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c10577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c1b57611eeb565b60016004811115611c55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc69061263e565b60405180910390fd5b60026004811115611d09577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a906126be565b60405180910390fd5b60036004811115611dbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e9061275e565b60405180910390fd5b600480811115611e70577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611ea9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061279e565b60405180910390fd5b5b50565b505050565b600081359050611f0281613076565b92915050565b600081359050611f178161308d565b92915050565b600081359050611f2c816130a4565b92915050565b600081359050611f41816130bb565b92915050565b600060208284031215611f5957600080fd5b6000611f6784828501611ef3565b91505092915050565b60008060408385031215611f8357600080fd5b6000611f9185828601611ef3565b9250506020611fa285828601611ef3565b9150509250929050565b600080600060608486031215611fc157600080fd5b6000611fcf86828701611ef3565b9350506020611fe086828701611ef3565b9250506040611ff186828701611f1d565b9150509250925092565b600080600080600080600060e0888a03121561201657600080fd5b60006120248a828b01611ef3565b97505060206120358a828b01611ef3565b96505060406120468a828b01611f1d565b95505060606120578a828b01611f1d565b94505060806120688a828b01611f32565b93505060a06120798a828b01611f08565b92505060c061208a8a828b01611f08565b91505092959891949750929550565b600080604083850312156120ac57600080fd5b60006120ba85828601611ef3565b92505060206120cb85828601611f1d565b9150509250929050565b6000602082840312156120e757600080fd5b60006120f584828501611f1d565b91505092915050565b612107816129c5565b82525050565b612116816129d7565b82525050565b612125816129e3565b82525050565b61213c612137826129e3565b612a89565b82525050565b600061214d82612914565b612157818561291f565b9350612167818560208601612a24565b61217081612af1565b840191505092915050565b600061218860188361291f565b915061219382612b02565b602082019050919050565b60006121ab60238361291f565b91506121b682612b2b565b604082019050919050565b60006121ce60148361291f565b91506121d982612b7a565b602082019050919050565b60006121f160228361291f565b91506121fc82612ba3565b604082019050919050565b6000612214601f8361291f565b915061221f82612bf2565b602082019050919050565b600061223760268361291f565b915061224282612c1b565b604082019050919050565b600061225a60228361291f565b915061226582612c6a565b604082019050919050565b600061227d600283612930565b915061228882612cb9565b600282019050919050565b60006122a0601d8361291f565b91506122ab82612ce2565b602082019050919050565b60006122c360268361291f565b91506122ce82612d0b565b604082019050919050565b60006122e660228361291f565b91506122f182612d5a565b604082019050919050565b600061230960108361291f565b915061231482612da9565b602082019050919050565b600061232c60228361291f565b915061233782612dd2565b604082019050919050565b600061234f601e8361291f565b915061235a82612e21565b602082019050919050565b600061237260288361291f565b915061237d82612e4a565b604082019050919050565b600061239560208361291f565b91506123a082612e99565b602082019050919050565b60006123b860248361291f565b91506123c382612ec2565b604082019050919050565b60006123db60218361291f565b91506123e682612f11565b604082019050919050565b60006123fe60258361291f565b915061240982612f60565b604082019050919050565b600061242160248361291f565b915061242c82612faf565b604082019050919050565b600061244460258361291f565b915061244f82612ffe565b604082019050919050565b6000612467601f8361291f565b91506124728261304d565b602082019050919050565b61248681612a0d565b82525050565b61249581612a17565b82525050565b60006124a682612270565b91506124b2828561212b565b6020820191506124c2828461212b565b6020820191508190509392505050565b60006020820190506124e760008301846120fe565b92915050565b6000602082019050612502600083018461210d565b92915050565b600060208201905061251d600083018461211c565b92915050565b600060c082019050612538600083018961211c565b61254560208301886120fe565b61255260408301876120fe565b61255f606083018661247d565b61256c608083018561247d565b61257960a083018461247d565b979650505050505050565b600060a082019050612599600083018861211c565b6125a6602083018761211c565b6125b3604083018661211c565b6125c0606083018561247d565b6125cd60808301846120fe565b9695505050505050565b60006080820190506125ec600083018761211c565b6125f9602083018661248c565b612606604083018561211c565b612613606083018461211c565b95945050505050565b600060208201905081810360008301526126368184612142565b905092915050565b600060208201905081810360008301526126578161217b565b9050919050565b600060208201905081810360008301526126778161219e565b9050919050565b60006020820190508181036000830152612697816121c1565b9050919050565b600060208201905081810360008301526126b7816121e4565b9050919050565b600060208201905081810360008301526126d781612207565b9050919050565b600060208201905081810360008301526126f78161222a565b9050919050565b600060208201905081810360008301526127178161224d565b9050919050565b6000602082019050818103600083015261273781612293565b9050919050565b60006020820190508181036000830152612757816122b6565b9050919050565b60006020820190508181036000830152612777816122d9565b9050919050565b60006020820190508181036000830152612797816122fc565b9050919050565b600060208201905081810360008301526127b78161231f565b9050919050565b600060208201905081810360008301526127d781612342565b9050919050565b600060208201905081810360008301526127f781612365565b9050919050565b6000602082019050818103600083015261281781612388565b9050919050565b60006020820190508181036000830152612837816123ab565b9050919050565b60006020820190508181036000830152612857816123ce565b9050919050565b60006020820190508181036000830152612877816123f1565b9050919050565b6000602082019050818103600083015261289781612414565b9050919050565b600060208201905081810360008301526128b781612437565b9050919050565b600060208201905081810360008301526128d78161245a565b9050919050565b60006020820190506128f3600083018461247d565b92915050565b600060208201905061290e600083018461248c565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061294682612a0d565b915061295183612a0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561298657612985612a93565b5b828201905092915050565b600061299c82612a0d565b91506129a783612a0d565b9250828210156129ba576129b9612a93565b5b828203905092915050565b60006129d0826129ed565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612a42578082015181840152602081019050612a27565b83811115612a51576000848401525b50505050565b60006002820490506001821680612a6f57607f821691505b60208210811415612a8357612a82612ac2565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61307f816129c5565b811461308a57600080fd5b50565b613096816129e3565b81146130a157600080fd5b50565b6130ad81612a0d565b81146130b857600080fd5b50565b6130c481612a17565b81146130cf57600080fd5b5056fea26469706673582212200f6d34e84eb4b21062db48603434ae6edf979b8db55c8195dec71a9d3b26366d64736f6c63430008020033