commit defaa2d0f79265e9edbfe11dd04a0cac379b6079
parent be8c5712669d85b7be177daacd93bc23bf7c1910
Author: lash <dev@holbrook.no>
Date: Mon, 20 Feb 2023 21:51:28 +0000
Add writer access option in contract
Diffstat:
5 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b506040516200437a3803806200437a833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000564565b508160079081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b613d1f806200065b6000396000f3fe6080604052600436106101df576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c7111610114578063b242e534116100b2578063d824ee4f11610081578063d824ee4f146106e4578063e985e9c514610721578063f117e1731461075e578063f9613ab21461079b576101df565b8063b242e53414610611578063b88d4fde1461064e578063c87b56dd1461066a578063c9796c39146106a7576101df565b806395d89b41116100ee57806395d89b4114610555578063a22cb46514610580578063adf288df146105a9578063b1a6afd3146105e6576101df565b806369e85c71146104b057806370a08231146104ed5780638da5cb5b1461052a576101df565b806340c84b0e116101815780634d03546a1161015b5780634d03546a146103ba5780634f64b2be146103f7578063559f5dc9146104345780636352211e14610473576101df565b806340c84b0e1461034a57806342842e0e1461037557806349f2553a14610391576101df565b806318160ddd116101bd57806318160ddd1461028957806323b872dd146102b457806324e0febc146102d05780633fd2f5931461030d576101df565b806301ffc9a7146101e457806306fdde0314610221578063081812fc1461024c575b600080fd5b3480156101f057600080fd5b5061020b60048036038101906102069190612e79565b6107d8565b6040516102189190612ec1565b60405180910390f35b34801561022d57600080fd5b5061023661092c565b6040516102439190612f6c565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612fc4565b6109ba565b6040516102809190613032565b60405180910390f35b34801561029557600080fd5b5061029e6109f7565b6040516102ab919061305c565b60405180910390f35b6102ce60048036038101906102c991906130a3565b610a01565b005b3480156102dc57600080fd5b506102f760048036038101906102f2919061312c565b610a6c565b6040516103049190613168565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061312c565b610a84565b60405161034191906131d8565b60405180910390f35b34801561035657600080fd5b5061035f610de3565b60405161036c91906131d8565b60405180910390f35b61038f600480360381019061038a91906130a3565b610e71565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061332f565b610edc565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906133b6565b6111f4565b6040516103ee9190612ec1565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612fc4565b61147e565b60405161042b9190613168565b60405180910390f35b34801561044057600080fd5b5061045b600480360381019061045691906133f6565b6114a2565b60405161046a93929190613445565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612fc4565b611516565b6040516104a79190613032565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061312c565b611552565b6040516104e49190612f6c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061347c565b61176b565b604051610521919061305c565b60405180910390f35b34801561053657600080fd5b5061053f6117b4565b60405161054c9190613032565b60405180910390f35b34801561056157600080fd5b5061056a6117d8565b6040516105779190612f6c565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906134d5565b611866565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613515565b611b08565b6040516105dd9190613168565b60405180910390f35b3480156105f257600080fd5b506105fb611d26565b6040516106089190613168565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906134d5565b611d2c565b6040516106459190612ec1565b60405180910390f35b610668600480360381019061066391906135f6565b611e0d565b005b34801561067657600080fd5b50610691600480360381019061068c9190612fc4565b611ee8565b60405161069e9190612f6c565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c9919061312c565b611f5a565b6040516106db9190612f6c565b60405180910390f35b3480156106f057600080fd5b5061070b600480360381019061070691906136b3565b612354565b6040516107189190613168565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613706565b612507565b6040516107559190612ec1565b60405180910390f35b34801561076a57600080fd5b5061078560048036038101906107809190613746565b61259f565b6040516107929190613168565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd919061312c565b6126a4565b6040516107cf9190613168565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361082c5760019050610927565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361087e5760019050610927565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d05760019050610927565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109225760019050610927565b600090505b919050565b60068054610939906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906137dc565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610a0c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610aa557610aa4613204565b5b6040519080825280601f01601f191660200182016040528015610ad75781602001600182028036833780820191505090505b5092506000905060005b6020811015610dd757600460f0878360208110610b0157610b0061380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610bd957603083610b709190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ba557610ba461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c4b565b605783610be69190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c1b57610c1a61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610c6057610c5f61380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610d3757603083610cc29190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610cf291906138ad565b81518110610d0357610d0261380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610db5565b605783610d449190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610d7491906138ad565b81518110610d8557610d8461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610dc291906138ad565b91508080610dcf906138e1565b915050610ae1565b50829350505050919050565b600a8054610df0906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1c906137dc565b8015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b505050505081565b610e7c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3957600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f729190613929565b81518110610f8357610f8261380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611003578080610fff906138e1565b9150505b8067ffffffffffffffff81111561101d5761101c613204565b5b6040519080825280601f01601f19166020018201604052801561104f5781602001600182028036833780820191505090505b50600a908161105e9190613b0f565b5060005b825181101561114f5782818151811061107e5761107d61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a8281546110d6906137dc565b81106110e5576110e461380d565b5b8154600116156111045790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080611147906138e1565b915050611062565b50815181146111ef577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154611188906137dc565b81106111975761119661380d565b5b8154600116156111b65790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b611257612dda565b6002600086815260200190815260200160002080549050915060008211156112d4576000600260008781526020019081526020016000206000815481106112a1576112a061380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f9576001600860008282546113ed91906138ad565b9250508190555061141b565b8365ffffffffffff166008600082825461141391906138ad565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146a9190613168565b60405180910390a360019250505092915050565b6001818154811061148e57600080fd5b906000526020600020016000915090505481565b600260205281600052604060002081815481106114be57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061156285610a84565b9150600a8054611571906137dc565b9050905080825161158291906138ad565b67ffffffffffffffff81111561159b5761159a613204565b5b6040519080825280601f01601f1916602001820160405280156115cd5781602001600182028036833780820191505090505b50925060005b8181101561169257600a8181546115e9906137dc565b81106115f8576115f761380d565b5b8154600116156116175790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106116505761164f61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061168a906138e1565b9150506115d3565b5060005b825181101561175f578281815181106116b2576116b161380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061170f5761170e61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611749906138e1565b9250508080611757906138e1565b915050611696565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600780546117e5906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611811906137dc565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505081565b801561198757600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a9f565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a1f57600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc9190612ec1565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b6001600260008581526020019081526020016000208054905014611b8657600080fd5b600060026000858152602001908152602001600020600081548110611bae57611bad61380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611be057600080fd5b6000600102600360008581526020019081526020016000205414611c0357600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906138ad565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611d14919061305c565b60405180910390a38291505092915050565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8757600080fd5b600060149054906101000a900460ff1615611da157600080fd5b8115611dc3576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611e18848484612750565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611ecd90613c06565b604051611eda9190613168565b60405180910390a450505050565b606060008260010290506000600260008381526020019081526020016000208054905003611f2357611f19816126a4565b9050806001900492505b6000600260008381526020019081526020016000208054905011611f4657600080fd5b611f5283600102611552565b915050919050565b60608060606000611f6a85610a84565b9150604767ffffffffffffffff811115611f8757611f86613204565b5b6040519080825280601f01601f191660200182016040528015611fb95781602001600182028036833780820191505090505b5092507f730000000000000000000000000000000000000000000000000000000000000083600081518110611ff157611ff061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106120555761205461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106120b9576120b861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061211d5761211c61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106121815761218061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3600000000000000000000000000000000000000000000000000000000000000836005815181106121e5576121e461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106122495761224861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156123485782818151811061229b5761229a61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106122f8576122f761380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180612332906138e1565b9250508080612340906138e1565b91505061227f565b50829350505050919050565b600080600260008581526020019081526020016000208361ffff16815481106123805761237f61380d565b5b90600052602060002001905080600001600c9054906101000a900460ff16156123a857600080fd5b60008361ffff161480156123da575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156124395760018160000160068282829054906101000a900465ffffffffffff166124059190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506124318585611b08565b915050612500565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106124d957600080fd5b6124fc8585858460000160069054906101000a900465ffffffffffff1685612a67565b9150505b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff16815481106125cb576125ca61380d565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262f57600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161265a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061268c57600080fd5b6126998686868685612a67565b915050949350505050565b600080600360008481526020019081526020016000205490506126c681612ce5565b6126cf57600080fd5b6126d881612d17565b156126e6578291505061274b565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127a7919061305c565b602060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e89190613cbc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461282257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612956573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061294c57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61295557600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506129b38284612d49565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a039190613929565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5a91906138ad565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600360008381526020019081526020016000205414612afa57600080fd5b84600001600c9054906101000a900460ff16612b5c578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612b5b57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16612bdd9190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6a91906138ad565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051612cce919061305c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203612d7957600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5681612e21565b8114612e6157600080fd5b50565b600081359050612e7381612e4d565b92915050565b600060208284031215612e8f57612e8e612e17565b5b6000612e9d84828501612e64565b91505092915050565b60008115159050919050565b612ebb81612ea6565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f16578082015181840152602081019050612efb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3e82612edc565b612f488185612ee7565b9350612f58818560208601612ef8565b612f6181612f22565b840191505092915050565b60006020820190508181036000830152612f868184612f33565b905092915050565b6000819050919050565b612fa181612f8e565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612e17565b5b6000612fe884828501612faf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301c82612ff1565b9050919050565b61302c81613011565b82525050565b60006020820190506130476000830184613023565b92915050565b61305681612f8e565b82525050565b6000602082019050613071600083018461304d565b92915050565b61308081613011565b811461308b57600080fd5b50565b60008135905061309d81613077565b92915050565b6000806000606084860312156130bc576130bb612e17565b5b60006130ca8682870161308e565b93505060206130db8682870161308e565b92505060406130ec86828701612faf565b9150509250925092565b6000819050919050565b613109816130f6565b811461311457600080fd5b50565b60008135905061312681613100565b92915050565b60006020828403121561314257613141612e17565b5b600061315084828501613117565b91505092915050565b613162816130f6565b82525050565b600060208201905061317d6000830184613159565b92915050565b600081519050919050565b600082825260208201905092915050565b60006131aa82613183565b6131b4818561318e565b93506131c4818560208601612ef8565b6131cd81612f22565b840191505092915050565b600060208201905081810360008301526131f2818461319f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61323c82612f22565b810181811067ffffffffffffffff8211171561325b5761325a613204565b5b80604052505050565b600061326e612e0d565b905061327a8282613233565b919050565b600067ffffffffffffffff82111561329a57613299613204565b5b6132a382612f22565b9050602081019050919050565b82818337600083830152505050565b60006132d26132cd8461327f565b613264565b9050828152602081018484840111156132ee576132ed6131ff565b5b6132f98482856132b0565b509392505050565b600082601f830112613316576133156131fa565b5b81356133268482602086016132bf565b91505092915050565b60006020828403121561334557613344612e17565b5b600082013567ffffffffffffffff81111561336357613362612e1c565b5b61336f84828501613301565b91505092915050565b600065ffffffffffff82169050919050565b61339381613378565b811461339e57600080fd5b50565b6000813590506133b08161338a565b92915050565b600080604083850312156133cd576133cc612e17565b5b60006133db85828601613117565b92505060206133ec858286016133a1565b9150509250929050565b6000806040838503121561340d5761340c612e17565b5b600061341b85828601613117565b925050602061342c85828601612faf565b9150509250929050565b61343f81613378565b82525050565b600060608201905061345a6000830186613436565b6134676020830185613436565b6134746040830184612eb2565b949350505050565b60006020828403121561349257613491612e17565b5b60006134a08482850161308e565b91505092915050565b6134b281612ea6565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b600080604083850312156134ec576134eb612e17565b5b60006134fa8582860161308e565b925050602061350b858286016134c0565b9150509250929050565b6000806040838503121561352c5761352b612e17565b5b600061353a8582860161308e565b925050602061354b85828601613117565b9150509250929050565b600067ffffffffffffffff8211156135705761356f613204565b5b61357982612f22565b9050602081019050919050565b600061359961359484613555565b613264565b9050828152602081018484840111156135b5576135b46131ff565b5b6135c08482856132b0565b509392505050565b600082601f8301126135dd576135dc6131fa565b5b81356135ed848260208601613586565b91505092915050565b600080600080608085870312156136105761360f612e17565b5b600061361e8782880161308e565b945050602061362f8782880161308e565b935050604061364087828801612faf565b925050606085013567ffffffffffffffff81111561366157613660612e1c565b5b61366d878288016135c8565b91505092959194509250565b600061ffff82169050919050565b61369081613679565b811461369b57600080fd5b50565b6000813590506136ad81613687565b92915050565b6000806000606084860312156136cc576136cb612e17565b5b60006136da8682870161308e565b93505060206136eb86828701613117565b92505060406136fc8682870161369e565b9150509250925092565b6000806040838503121561371d5761371c612e17565b5b600061372b8582860161308e565b925050602061373c8582860161308e565b9150509250929050565b600080600080608085870312156137605761375f612e17565b5b600061376e8782880161308e565b945050602061377f87828801613117565b93505060406137908782880161369e565b92505060606137a1878288016133a1565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137f457607f821691505b602082108103613807576138066137ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138838261383c565b915061388e8361383c565b9250828201905060ff8111156138a7576138a6613849565b5b92915050565b60006138b882612f8e565b91506138c383612f8e565b92508282019050808211156138db576138da613849565b5b92915050565b60006138ec82612f8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361391e5761391d613849565b5b600182019050919050565b600061393482612f8e565b915061393f83612f8e565b925082820390508181111561395757613956613849565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026139c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613982565b6139cc8683613982565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a09613a046139ff84612f8e565b6139e4565b612f8e565b9050919050565b6000819050919050565b613a23836139ee565b613a37613a2f82613a10565b848454613992565b825550505050565b600090565b613a4c613a3f565b613a57818484613a1a565b505050565b5b81811015613a7b57613a70600082613a44565b600181019050613a5d565b5050565b601f821115613ac057613a918161395d565b613a9a84613972565b81016020851015613aa9578190505b613abd613ab585613972565b830182613a5c565b50505b505050565b60008160020a8304905092915050565b6000613ae660001984600802613ac5565b1980831691505092915050565b6000613aff8383613ad5565b9150826002028217905092915050565b613b1882613183565b67ffffffffffffffff811115613b3157613b30613204565b5b613b3b82546137dc565b613b46828285613a7f565b600060209050601f831160018114613b795760008415613b67578287015190505b613b718582613af3565b865550613bd9565b601f198416613b878661395d565b60005b82811015613baf57848901518255600182019150602085019450602081019050613b8a565b86831015613bcc5784890151613bc8601f891682613ad5565b8355505b6001600288020188555050505b505050505050565b6000819050602082019050919050565b6000613bfd82516130f6565b80915050919050565b6000613c1182613183565b82613c1b84613be1565b9050613c2681613bf1565b92506020821015613c6657613c617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613982565b831692505b5050919050565b6000613c7882613378565b9150613c8383613378565b9250828201905065ffffffffffff811115613ca157613ca0613849565b5b92915050565b600081519050613cb681613077565b92915050565b600060208284031215613cd257613cd1612e17565b5b6000613ce084828501613ca7565b9150509291505056fea2646970667358221220a61ab7da49ebc6608666d52010ac708bffa9f8c1c0c76f149381a0a6304083bd64736f6c63430008110033
-\ No newline at end of file
+60806040523480156200001157600080fd5b506040516200480d3803806200480d833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6141b2806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a981eb4f116100ee578063a981eb4f146105f3578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806370a08231146105375780638da5cb5b1461057457806395d89b411461059f578063a22cb465146105ca57610200565b806342842e0e11610197578063559f5dc911610166578063559f5dc9146104555780635ae06f7e146104945780636352211e146104bd57806369e85c71146104fa57610200565b806342842e0e1461039657806349f2553a146103b25780634d03546a146103db5780634f64b2be1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780633fd2f5931461032e57806340c84b0e1461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906132a0565b610888565b60405161023991906132e8565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b6040516102649190613393565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f91906133eb565b610a6a565b6040516102a19190613459565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc9190613483565b60405180910390f35b6102ef60048036038101906102ea91906134ca565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613553565b610b1c565b604051610325919061358f565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613553565b610b34565b60405161036291906135ff565b60405180910390f35b34801561037757600080fd5b50610380610e93565b60405161038d91906135ff565b60405180910390f35b6103b060048036038101906103ab91906134ca565b610f21565b005b3480156103be57600080fd5b506103d960048036038101906103d49190613756565b610f8c565b005b3480156103e757600080fd5b5061040260048036038101906103fd91906137dd565b6112a4565b60405161040f91906132e8565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a91906133eb565b611582565b60405161044c919061358f565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061381d565b6115a6565b60405161048b9392919061386c565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b691906138a3565b61161a565b005b3480156104c957600080fd5b506104e460048036038101906104df91906133eb565b611739565b6040516104f19190613459565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613553565b611775565b60405161052e9190613393565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906138a3565b61198e565b60405161056b9190613483565b60405180910390f35b34801561058057600080fd5b506105896119d7565b6040516105969190613459565b60405180910390f35b3480156105ab57600080fd5b506105b46119fb565b6040516105c19190613393565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906138fc565b611a89565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906138a3565b611d2b565b60405161062791906132e8565b60405180910390f35b34801561063c57600080fd5b506106576004803603810190610652919061393c565b611d4b565b604051610664919061358f565b60405180910390f35b34801561067957600080fd5b50610682611fbd565b60405161068f919061358f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba91906138fc565b611fc3565b6040516106cc91906132e8565b60405180910390f35b6106ef60048036038101906106ea9190613a1d565b6120a4565b005b3480156106fd57600080fd5b50610718600480360381019061071391906133eb565b61217f565b6040516107259190613393565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613553565b6121f1565b6040516107629190613393565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613ada565b6125eb565b60405161079f919061358f565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906138a3565b6127f2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613b2d565b6128da565b60405161080591906132e8565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613b6d565b612972565b604051610842919061358f565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613553565b612acb565b60405161087f919061358f565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c03565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610b5557610b5461362b565b5b6040519080825280601f01601f191660200182016040528015610b875781602001600182028036833780820191505090505b5092506000905060005b6020811015610e8757600460f0878360208110610bb157610bb0613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610c8957603083610c209190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c5557610c54613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610cfb565b605783610c969190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ccb57610cca613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610d1057610d0f613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610de757603083610d729190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610da29190613cd4565b81518110610db357610db2613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610e65565b605783610df49190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e249190613cd4565b81518110610e3557610e34613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610e729190613cd4565b91508080610e7f90613d08565b915050610b91565b50829350505050919050565b600c8054610ea090613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90613c03565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b505050505081565b610f2c838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fe957600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110229190613d50565b8151811061103357611032613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110b35780806110af90613d08565b9150505b8067ffffffffffffffff8111156110cd576110cc61362b565b5b6040519080825280601f01601f1916602001820160405280156110ff5781602001600182028036833780820191505090505b50600c908161110e9190613f36565b5060005b82518110156111ff5782818151811061112e5761112d613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461118690613c03565b811061119557611194613c34565b5b8154600116156111b45790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111f790613d08565b915050611112565b508151811461129f577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461123890613c03565b811061124757611246613c34565b5b8154600116156112665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134a5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61135357600080fd5b61135b613201565b6004600086815260200190815260200160002080549050915060008211156113d8576000600460008781526020019081526020016000206000815481106113a5576113a4613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116113d757600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036114fd576001600a60008282546114f19190613cd4565b9250508190555061151f565b8365ffffffffffff16600a60008282546115179190613cd4565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161156e919061358f565b60405180910390a360019250505092915050565b6003818154811061159257600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106115c257600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061169f575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614054565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061178585610b34565b9150600c805461179490613c03565b905090508082516117a59190613cd4565b67ffffffffffffffff8111156117be576117bd61362b565b5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b50925060005b818110156118b557600c81815461180c90613c03565b811061181b5761181a613c34565b5b81546001161561183a5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061187357611872613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118ad90613d08565b9150506117f6565b5060005b8251811015611982578281815181106118d5576118d4613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061193257611931613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061196c90613d08565b925050808061197a90613d08565b9150506118b9565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611a0890613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490613c03565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b8015611baa57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2757600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611cc2565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c4257600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1f91906132e8565b60405180910390a35050565b60016020528060005260406000206000915054906101000a900460ff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611df15750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611dfa57600080fd5b6001600460008581526020019081526020016000208054905014611e1d57600080fd5b600060046000858152602001908152602001600020600081548110611e4557611e44613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611e7757600080fd5b6000600102600560008581526020019081526020016000205414611e9a57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613cd4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611fab9190613483565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201e57600080fd5b600260009054906101000a900460ff161561203857600080fd5b811561205a576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b6120af848484612b77565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461216490614099565b604051612171919061358f565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036121ba576121b081612acb565b9050806001900492505b60006004600083815260200190815260200160002080549050116121dd57600080fd5b6121e983600102611775565b915050919050565b6060806060600061220185610b34565b9150604767ffffffffffffffff81111561221e5761221d61362b565b5b6040519080825280601f01601f1916602001820160405280156122505781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061228857612287613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122ec576122eb613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123505761234f613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106123b4576123b3613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061241857612417613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061247c5761247b613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106124e0576124df613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156125df5782818151811061253257612531613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061258f5761258e613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806125c990613d08565b92505080806125d790613d08565b915050612516565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061261757612616613c34565b5b90600052602060002001905080600001600c9054906101000a900460ff161561263f57600080fd5b60008361ffff16148015612671575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156126d05760018160000160068282829054906101000a900465ffffffffffff1661269c9190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506126c88585611d4b565b9150506127eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127735750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61277c57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127c457600080fd5b6127e78585858460000160069054906101000a900465ffffffffffff1685612e8e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614054565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061299e5761299d613c34565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a5657600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612a8157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612ab357600080fd5b612ac08686868685612e8e565b915050949350505050565b60008060056000848152602001908152602001600020549050612aed8161310c565b612af657600080fd5b612aff8161313e565b15612b0d5782915050612b72565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612bce9190613483565b602060405180830381865afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f919061414f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c4957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d7d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612d7357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612d7c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612dda8284613170565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190613d50565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e819190613cd4565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612f2157600080fd5b84600001600c9054906101000a900460ff16612f83578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612f8257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166130049190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130919190613cd4565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516130f59190613483565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036131a057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61327d81613248565b811461328857600080fd5b50565b60008135905061329a81613274565b92915050565b6000602082840312156132b6576132b561323e565b5b60006132c48482850161328b565b91505092915050565b60008115159050919050565b6132e2816132cd565b82525050565b60006020820190506132fd60008301846132d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b60008484015250505050565b6000601f19601f8301169050919050565b600061336582613303565b61336f818561330e565b935061337f81856020860161331f565b61338881613349565b840191505092915050565b600060208201905081810360008301526133ad818461335a565b905092915050565b6000819050919050565b6133c8816133b5565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000602082840312156134015761340061323e565b5b600061340f848285016133d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344382613418565b9050919050565b61345381613438565b82525050565b600060208201905061346e600083018461344a565b92915050565b61347d816133b5565b82525050565b60006020820190506134986000830184613474565b92915050565b6134a781613438565b81146134b257600080fd5b50565b6000813590506134c48161349e565b92915050565b6000806000606084860312156134e3576134e261323e565b5b60006134f1868287016134b5565b9350506020613502868287016134b5565b9250506040613513868287016133d6565b9150509250925092565b6000819050919050565b6135308161351d565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b6000602082840312156135695761356861323e565b5b60006135778482850161353e565b91505092915050565b6135898161351d565b82525050565b60006020820190506135a46000830184613580565b92915050565b600081519050919050565b600082825260208201905092915050565b60006135d1826135aa565b6135db81856135b5565b93506135eb81856020860161331f565b6135f481613349565b840191505092915050565b6000602082019050818103600083015261361981846135c6565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366382613349565b810181811067ffffffffffffffff821117156136825761368161362b565b5b80604052505050565b6000613695613234565b90506136a1828261365a565b919050565b600067ffffffffffffffff8211156136c1576136c061362b565b5b6136ca82613349565b9050602081019050919050565b82818337600083830152505050565b60006136f96136f4846136a6565b61368b565b90508281526020810184848401111561371557613714613626565b5b6137208482856136d7565b509392505050565b600082601f83011261373d5761373c613621565b5b813561374d8482602086016136e6565b91505092915050565b60006020828403121561376c5761376b61323e565b5b600082013567ffffffffffffffff81111561378a57613789613243565b5b61379684828501613728565b91505092915050565b600065ffffffffffff82169050919050565b6137ba8161379f565b81146137c557600080fd5b50565b6000813590506137d7816137b1565b92915050565b600080604083850312156137f4576137f361323e565b5b60006138028582860161353e565b9250506020613813858286016137c8565b9150509250929050565b600080604083850312156138345761383361323e565b5b60006138428582860161353e565b9250506020613853858286016133d6565b9150509250929050565b6138668161379f565b82525050565b6000606082019050613881600083018661385d565b61388e602083018561385d565b61389b60408301846132d9565b949350505050565b6000602082840312156138b9576138b861323e565b5b60006138c7848285016134b5565b91505092915050565b6138d9816132cd565b81146138e457600080fd5b50565b6000813590506138f6816138d0565b92915050565b600080604083850312156139135761391261323e565b5b6000613921858286016134b5565b9250506020613932858286016138e7565b9150509250929050565b600080604083850312156139535761395261323e565b5b6000613961858286016134b5565b92505060206139728582860161353e565b9150509250929050565b600067ffffffffffffffff8211156139975761399661362b565b5b6139a082613349565b9050602081019050919050565b60006139c06139bb8461397c565b61368b565b9050828152602081018484840111156139dc576139db613626565b5b6139e78482856136d7565b509392505050565b600082601f830112613a0457613a03613621565b5b8135613a148482602086016139ad565b91505092915050565b60008060008060808587031215613a3757613a3661323e565b5b6000613a45878288016134b5565b9450506020613a56878288016134b5565b9350506040613a67878288016133d6565b925050606085013567ffffffffffffffff811115613a8857613a87613243565b5b613a94878288016139ef565b91505092959194509250565b600061ffff82169050919050565b613ab781613aa0565b8114613ac257600080fd5b50565b600081359050613ad481613aae565b92915050565b600080600060608486031215613af357613af261323e565b5b6000613b01868287016134b5565b9350506020613b128682870161353e565b9250506040613b2386828701613ac5565b9150509250925092565b60008060408385031215613b4457613b4361323e565b5b6000613b52858286016134b5565b9250506020613b63858286016134b5565b9150509250929050565b60008060008060808587031215613b8757613b8661323e565b5b6000613b95878288016134b5565b9450506020613ba68782880161353e565b9350506040613bb787828801613ac5565b9250506060613bc8878288016137c8565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613c63565b9150613cb583613c63565b9250828201905060ff811115613cce57613ccd613c70565b5b92915050565b6000613cdf826133b5565b9150613cea836133b5565b9250828201905080821115613d0257613d01613c70565b5b92915050565b6000613d13826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4557613d44613c70565b5b600182019050919050565b6000613d5b826133b5565b9150613d66836133b5565b9250828203905081811115613d7e57613d7d613c70565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613de97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613da9565b613df38683613da9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e30613e2b613e26846133b5565b613e0b565b6133b5565b9050919050565b6000819050919050565b613e4a83613e15565b613e5e613e5682613e37565b848454613db9565b825550505050565b600090565b613e73613e66565b613e7e818484613e41565b505050565b5b81811015613ea257613e97600082613e6b565b600181019050613e84565b5050565b601f821115613ee757613eb881613d84565b613ec184613d99565b81016020851015613ed0578190505b613ee4613edc85613d99565b830182613e83565b50505b505050565b60008160020a8304905092915050565b6000613f0d60001984600802613eec565b1980831691505092915050565b6000613f268383613efc565b9150826002028217905092915050565b613f3f826135aa565b67ffffffffffffffff811115613f5857613f5761362b565b5b613f628254613c03565b613f6d828285613ea6565b600060209050601f831160018114613fa05760008415613f8e578287015190505b613f988582613f1a565b865550614000565b601f198416613fae86613d84565b60005b82811015613fd657848901518255600182019150602085019450602081019050613fb1565b86831015613ff35784890151613fef601f891682613efc565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061403e600a8361330e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b6000819050602082019050919050565b6000614090825161351d565b80915050919050565b60006140a4826135aa565b826140ae84614074565b90506140b981614084565b925060208210156140f9576140f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613da9565b831692505b5050919050565b600061410b8261379f565b91506141168361379f565b9250828201905065ffffffffffff81111561413457614133613c70565b5b92915050565b6000815190506141498161349e565b92915050565b6000602082840312156141655761416461323e565b5b60006141738482850161413a565b9150509291505056fea264697066735822122016c5775db036c021867f0c38ab4a57d2665c32f2760c28648d23663e38656ea464736f6c63430008120033
+\ No newline at end of file
diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"writer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b506040516200437a3803806200437a833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000564565b508160079081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b613d1f806200065b6000396000f3fe6080604052600436106101df576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c7111610114578063b242e534116100b2578063d824ee4f11610081578063d824ee4f146106e4578063e985e9c514610721578063f117e1731461075e578063f9613ab21461079b576101df565b8063b242e53414610611578063b88d4fde1461064e578063c87b56dd1461066a578063c9796c39146106a7576101df565b806395d89b41116100ee57806395d89b4114610555578063a22cb46514610580578063adf288df146105a9578063b1a6afd3146105e6576101df565b806369e85c71146104b057806370a08231146104ed5780638da5cb5b1461052a576101df565b806340c84b0e116101815780634d03546a1161015b5780634d03546a146103ba5780634f64b2be146103f7578063559f5dc9146104345780636352211e14610473576101df565b806340c84b0e1461034a57806342842e0e1461037557806349f2553a14610391576101df565b806318160ddd116101bd57806318160ddd1461028957806323b872dd146102b457806324e0febc146102d05780633fd2f5931461030d576101df565b806301ffc9a7146101e457806306fdde0314610221578063081812fc1461024c575b600080fd5b3480156101f057600080fd5b5061020b60048036038101906102069190612e79565b6107d8565b6040516102189190612ec1565b60405180910390f35b34801561022d57600080fd5b5061023661092c565b6040516102439190612f6c565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612fc4565b6109ba565b6040516102809190613032565b60405180910390f35b34801561029557600080fd5b5061029e6109f7565b6040516102ab919061305c565b60405180910390f35b6102ce60048036038101906102c991906130a3565b610a01565b005b3480156102dc57600080fd5b506102f760048036038101906102f2919061312c565b610a6c565b6040516103049190613168565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061312c565b610a84565b60405161034191906131d8565b60405180910390f35b34801561035657600080fd5b5061035f610de3565b60405161036c91906131d8565b60405180910390f35b61038f600480360381019061038a91906130a3565b610e71565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061332f565b610edc565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906133b6565b6111f4565b6040516103ee9190612ec1565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612fc4565b61147e565b60405161042b9190613168565b60405180910390f35b34801561044057600080fd5b5061045b600480360381019061045691906133f6565b6114a2565b60405161046a93929190613445565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612fc4565b611516565b6040516104a79190613032565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061312c565b611552565b6040516104e49190612f6c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061347c565b61176b565b604051610521919061305c565b60405180910390f35b34801561053657600080fd5b5061053f6117b4565b60405161054c9190613032565b60405180910390f35b34801561056157600080fd5b5061056a6117d8565b6040516105779190612f6c565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906134d5565b611866565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613515565b611b08565b6040516105dd9190613168565b60405180910390f35b3480156105f257600080fd5b506105fb611d26565b6040516106089190613168565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906134d5565b611d2c565b6040516106459190612ec1565b60405180910390f35b610668600480360381019061066391906135f6565b611e0d565b005b34801561067657600080fd5b50610691600480360381019061068c9190612fc4565b611ee8565b60405161069e9190612f6c565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c9919061312c565b611f5a565b6040516106db9190612f6c565b60405180910390f35b3480156106f057600080fd5b5061070b600480360381019061070691906136b3565b612354565b6040516107189190613168565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613706565b612507565b6040516107559190612ec1565b60405180910390f35b34801561076a57600080fd5b5061078560048036038101906107809190613746565b61259f565b6040516107929190613168565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd919061312c565b6126a4565b6040516107cf9190613168565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361082c5760019050610927565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361087e5760019050610927565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d05760019050610927565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109225760019050610927565b600090505b919050565b60068054610939906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906137dc565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610a0c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610aa557610aa4613204565b5b6040519080825280601f01601f191660200182016040528015610ad75781602001600182028036833780820191505090505b5092506000905060005b6020811015610dd757600460f0878360208110610b0157610b0061380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610bd957603083610b709190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ba557610ba461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c4b565b605783610be69190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c1b57610c1a61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610c6057610c5f61380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610d3757603083610cc29190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610cf291906138ad565b81518110610d0357610d0261380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610db5565b605783610d449190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610d7491906138ad565b81518110610d8557610d8461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610dc291906138ad565b91508080610dcf906138e1565b915050610ae1565b50829350505050919050565b600a8054610df0906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1c906137dc565b8015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b505050505081565b610e7c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3957600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f729190613929565b81518110610f8357610f8261380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611003578080610fff906138e1565b9150505b8067ffffffffffffffff81111561101d5761101c613204565b5b6040519080825280601f01601f19166020018201604052801561104f5781602001600182028036833780820191505090505b50600a908161105e9190613b0f565b5060005b825181101561114f5782818151811061107e5761107d61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a8281546110d6906137dc565b81106110e5576110e461380d565b5b8154600116156111045790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080611147906138e1565b915050611062565b50815181146111ef577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154611188906137dc565b81106111975761119661380d565b5b8154600116156111b65790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b611257612dda565b6002600086815260200190815260200160002080549050915060008211156112d4576000600260008781526020019081526020016000206000815481106112a1576112a061380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f9576001600860008282546113ed91906138ad565b9250508190555061141b565b8365ffffffffffff166008600082825461141391906138ad565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146a9190613168565b60405180910390a360019250505092915050565b6001818154811061148e57600080fd5b906000526020600020016000915090505481565b600260205281600052604060002081815481106114be57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061156285610a84565b9150600a8054611571906137dc565b9050905080825161158291906138ad565b67ffffffffffffffff81111561159b5761159a613204565b5b6040519080825280601f01601f1916602001820160405280156115cd5781602001600182028036833780820191505090505b50925060005b8181101561169257600a8181546115e9906137dc565b81106115f8576115f761380d565b5b8154600116156116175790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106116505761164f61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061168a906138e1565b9150506115d3565b5060005b825181101561175f578281815181106116b2576116b161380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061170f5761170e61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611749906138e1565b9250508080611757906138e1565b915050611696565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600780546117e5906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611811906137dc565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505081565b801561198757600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a9f565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a1f57600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc9190612ec1565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b6001600260008581526020019081526020016000208054905014611b8657600080fd5b600060026000858152602001908152602001600020600081548110611bae57611bad61380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611be057600080fd5b6000600102600360008581526020019081526020016000205414611c0357600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906138ad565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611d14919061305c565b60405180910390a38291505092915050565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8757600080fd5b600060149054906101000a900460ff1615611da157600080fd5b8115611dc3576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611e18848484612750565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611ecd90613c06565b604051611eda9190613168565b60405180910390a450505050565b606060008260010290506000600260008381526020019081526020016000208054905003611f2357611f19816126a4565b9050806001900492505b6000600260008381526020019081526020016000208054905011611f4657600080fd5b611f5283600102611552565b915050919050565b60608060606000611f6a85610a84565b9150604767ffffffffffffffff811115611f8757611f86613204565b5b6040519080825280601f01601f191660200182016040528015611fb95781602001600182028036833780820191505090505b5092507f730000000000000000000000000000000000000000000000000000000000000083600081518110611ff157611ff061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106120555761205461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106120b9576120b861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061211d5761211c61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106121815761218061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3600000000000000000000000000000000000000000000000000000000000000836005815181106121e5576121e461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106122495761224861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156123485782818151811061229b5761229a61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106122f8576122f761380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180612332906138e1565b9250508080612340906138e1565b91505061227f565b50829350505050919050565b600080600260008581526020019081526020016000208361ffff16815481106123805761237f61380d565b5b90600052602060002001905080600001600c9054906101000a900460ff16156123a857600080fd5b60008361ffff161480156123da575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156124395760018160000160068282829054906101000a900465ffffffffffff166124059190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506124318585611b08565b915050612500565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106124d957600080fd5b6124fc8585858460000160069054906101000a900465ffffffffffff1685612a67565b9150505b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff16815481106125cb576125ca61380d565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262f57600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161265a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061268c57600080fd5b6126998686868685612a67565b915050949350505050565b600080600360008481526020019081526020016000205490506126c681612ce5565b6126cf57600080fd5b6126d881612d17565b156126e6578291505061274b565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127a7919061305c565b602060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e89190613cbc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461282257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612956573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061294c57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61295557600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506129b38284612d49565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a039190613929565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5a91906138ad565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600360008381526020019081526020016000205414612afa57600080fd5b84600001600c9054906101000a900460ff16612b5c578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612b5b57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16612bdd9190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6a91906138ad565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051612cce919061305c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203612d7957600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5681612e21565b8114612e6157600080fd5b50565b600081359050612e7381612e4d565b92915050565b600060208284031215612e8f57612e8e612e17565b5b6000612e9d84828501612e64565b91505092915050565b60008115159050919050565b612ebb81612ea6565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f16578082015181840152602081019050612efb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3e82612edc565b612f488185612ee7565b9350612f58818560208601612ef8565b612f6181612f22565b840191505092915050565b60006020820190508181036000830152612f868184612f33565b905092915050565b6000819050919050565b612fa181612f8e565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612e17565b5b6000612fe884828501612faf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301c82612ff1565b9050919050565b61302c81613011565b82525050565b60006020820190506130476000830184613023565b92915050565b61305681612f8e565b82525050565b6000602082019050613071600083018461304d565b92915050565b61308081613011565b811461308b57600080fd5b50565b60008135905061309d81613077565b92915050565b6000806000606084860312156130bc576130bb612e17565b5b60006130ca8682870161308e565b93505060206130db8682870161308e565b92505060406130ec86828701612faf565b9150509250925092565b6000819050919050565b613109816130f6565b811461311457600080fd5b50565b60008135905061312681613100565b92915050565b60006020828403121561314257613141612e17565b5b600061315084828501613117565b91505092915050565b613162816130f6565b82525050565b600060208201905061317d6000830184613159565b92915050565b600081519050919050565b600082825260208201905092915050565b60006131aa82613183565b6131b4818561318e565b93506131c4818560208601612ef8565b6131cd81612f22565b840191505092915050565b600060208201905081810360008301526131f2818461319f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61323c82612f22565b810181811067ffffffffffffffff8211171561325b5761325a613204565b5b80604052505050565b600061326e612e0d565b905061327a8282613233565b919050565b600067ffffffffffffffff82111561329a57613299613204565b5b6132a382612f22565b9050602081019050919050565b82818337600083830152505050565b60006132d26132cd8461327f565b613264565b9050828152602081018484840111156132ee576132ed6131ff565b5b6132f98482856132b0565b509392505050565b600082601f830112613316576133156131fa565b5b81356133268482602086016132bf565b91505092915050565b60006020828403121561334557613344612e17565b5b600082013567ffffffffffffffff81111561336357613362612e1c565b5b61336f84828501613301565b91505092915050565b600065ffffffffffff82169050919050565b61339381613378565b811461339e57600080fd5b50565b6000813590506133b08161338a565b92915050565b600080604083850312156133cd576133cc612e17565b5b60006133db85828601613117565b92505060206133ec858286016133a1565b9150509250929050565b6000806040838503121561340d5761340c612e17565b5b600061341b85828601613117565b925050602061342c85828601612faf565b9150509250929050565b61343f81613378565b82525050565b600060608201905061345a6000830186613436565b6134676020830185613436565b6134746040830184612eb2565b949350505050565b60006020828403121561349257613491612e17565b5b60006134a08482850161308e565b91505092915050565b6134b281612ea6565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b600080604083850312156134ec576134eb612e17565b5b60006134fa8582860161308e565b925050602061350b858286016134c0565b9150509250929050565b6000806040838503121561352c5761352b612e17565b5b600061353a8582860161308e565b925050602061354b85828601613117565b9150509250929050565b600067ffffffffffffffff8211156135705761356f613204565b5b61357982612f22565b9050602081019050919050565b600061359961359484613555565b613264565b9050828152602081018484840111156135b5576135b46131ff565b5b6135c08482856132b0565b509392505050565b600082601f8301126135dd576135dc6131fa565b5b81356135ed848260208601613586565b91505092915050565b600080600080608085870312156136105761360f612e17565b5b600061361e8782880161308e565b945050602061362f8782880161308e565b935050604061364087828801612faf565b925050606085013567ffffffffffffffff81111561366157613660612e1c565b5b61366d878288016135c8565b91505092959194509250565b600061ffff82169050919050565b61369081613679565b811461369b57600080fd5b50565b6000813590506136ad81613687565b92915050565b6000806000606084860312156136cc576136cb612e17565b5b60006136da8682870161308e565b93505060206136eb86828701613117565b92505060406136fc8682870161369e565b9150509250925092565b6000806040838503121561371d5761371c612e17565b5b600061372b8582860161308e565b925050602061373c8582860161308e565b9150509250929050565b600080600080608085870312156137605761375f612e17565b5b600061376e8782880161308e565b945050602061377f87828801613117565b93505060406137908782880161369e565b92505060606137a1878288016133a1565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137f457607f821691505b602082108103613807576138066137ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138838261383c565b915061388e8361383c565b9250828201905060ff8111156138a7576138a6613849565b5b92915050565b60006138b882612f8e565b91506138c383612f8e565b92508282019050808211156138db576138da613849565b5b92915050565b60006138ec82612f8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361391e5761391d613849565b5b600182019050919050565b600061393482612f8e565b915061393f83612f8e565b925082820390508181111561395757613956613849565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026139c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613982565b6139cc8683613982565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a09613a046139ff84612f8e565b6139e4565b612f8e565b9050919050565b6000819050919050565b613a23836139ee565b613a37613a2f82613a10565b848454613992565b825550505050565b600090565b613a4c613a3f565b613a57818484613a1a565b505050565b5b81811015613a7b57613a70600082613a44565b600181019050613a5d565b5050565b601f821115613ac057613a918161395d565b613a9a84613972565b81016020851015613aa9578190505b613abd613ab585613972565b830182613a5c565b50505b505050565b60008160020a8304905092915050565b6000613ae660001984600802613ac5565b1980831691505092915050565b6000613aff8383613ad5565b9150826002028217905092915050565b613b1882613183565b67ffffffffffffffff811115613b3157613b30613204565b5b613b3b82546137dc565b613b46828285613a7f565b600060209050601f831160018114613b795760008415613b67578287015190505b613b718582613af3565b865550613bd9565b601f198416613b878661395d565b60005b82811015613baf57848901518255600182019150602085019450602081019050613b8a565b86831015613bcc5784890151613bc8601f891682613ad5565b8355505b6001600288020188555050505b505050505050565b6000819050602082019050919050565b6000613bfd82516130f6565b80915050919050565b6000613c1182613183565b82613c1b84613be1565b9050613c2681613bf1565b92506020821015613c6657613c617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613982565b831692505b5050919050565b6000613c7882613378565b9150613c8383613378565b9250828201905065ffffffffffff811115613ca157613ca0613849565b5b92915050565b600081519050613cb681613077565b92915050565b600060208284031215613cd257613cd1612e17565b5b6000613ce084828501613ca7565b9150509291505056fea2646970667358221220a61ab7da49ebc6608666d52010ac708bffa9f8c1c0c76f149381a0a6304083bd64736f6c63430008110033
-\ No newline at end of file
+60806040523480156200001157600080fd5b506040516200480d3803806200480d833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6141b2806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a981eb4f116100ee578063a981eb4f146105f3578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806370a08231146105375780638da5cb5b1461057457806395d89b411461059f578063a22cb465146105ca57610200565b806342842e0e11610197578063559f5dc911610166578063559f5dc9146104555780635ae06f7e146104945780636352211e146104bd57806369e85c71146104fa57610200565b806342842e0e1461039657806349f2553a146103b25780634d03546a146103db5780634f64b2be1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780633fd2f5931461032e57806340c84b0e1461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c600480360381019061022791906132a0565b610888565b60405161023991906132e8565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b6040516102649190613393565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f91906133eb565b610a6a565b6040516102a19190613459565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc9190613483565b60405180910390f35b6102ef60048036038101906102ea91906134ca565b610ab1565b005b3480156102fd57600080fd5b5061031860048036038101906103139190613553565b610b1c565b604051610325919061358f565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613553565b610b34565b60405161036291906135ff565b60405180910390f35b34801561037757600080fd5b50610380610e93565b60405161038d91906135ff565b60405180910390f35b6103b060048036038101906103ab91906134ca565b610f21565b005b3480156103be57600080fd5b506103d960048036038101906103d49190613756565b610f8c565b005b3480156103e757600080fd5b5061040260048036038101906103fd91906137dd565b6112a4565b60405161040f91906132e8565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a91906133eb565b611582565b60405161044c919061358f565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061381d565b6115a6565b60405161048b9392919061386c565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b691906138a3565b61161a565b005b3480156104c957600080fd5b506104e460048036038101906104df91906133eb565b611739565b6040516104f19190613459565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c9190613553565b611775565b60405161052e9190613393565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906138a3565b61198e565b60405161056b9190613483565b60405180910390f35b34801561058057600080fd5b506105896119d7565b6040516105969190613459565b60405180910390f35b3480156105ab57600080fd5b506105b46119fb565b6040516105c19190613393565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906138fc565b611a89565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906138a3565b611d2b565b60405161062791906132e8565b60405180910390f35b34801561063c57600080fd5b506106576004803603810190610652919061393c565b611d4b565b604051610664919061358f565b60405180910390f35b34801561067957600080fd5b50610682611fbd565b60405161068f919061358f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba91906138fc565b611fc3565b6040516106cc91906132e8565b60405180910390f35b6106ef60048036038101906106ea9190613a1d565b6120a4565b005b3480156106fd57600080fd5b50610718600480360381019061071391906133eb565b61217f565b6040516107259190613393565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613553565b6121f1565b6040516107629190613393565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613ada565b6125eb565b60405161079f919061358f565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906138a3565b6127f2565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613b2d565b6128da565b60405161080591906132e8565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613b6d565b612972565b604051610842919061358f565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613553565b612acb565b60405161087f919061358f565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c03565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610b5557610b5461362b565b5b6040519080825280601f01601f191660200182016040528015610b875781602001600182028036833780820191505090505b5092506000905060005b6020811015610e8757600460f0878360208110610bb157610bb0613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610c8957603083610c209190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c5557610c54613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610cfb565b605783610c969190613c9f565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ccb57610cca613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610d1057610d0f613c34565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610de757603083610d729190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610da29190613cd4565b81518110610db357610db2613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610e65565b605783610df49190613c9f565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e249190613cd4565b81518110610e3557610e34613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610e729190613cd4565b91508080610e7f90613d08565b915050610b91565b50829350505050919050565b600c8054610ea090613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90613c03565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b505050505081565b610f2c838383612b77565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fe957600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110229190613d50565b8151811061103357611032613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110b35780806110af90613d08565b9150505b8067ffffffffffffffff8111156110cd576110cc61362b565b5b6040519080825280601f01601f1916602001820160405280156110ff5781602001600182028036833780820191505090505b50600c908161110e9190613f36565b5060005b82518110156111ff5782818151811061112e5761112d613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461118690613c03565b811061119557611194613c34565b5b8154600116156111b45790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111f790613d08565b915050611112565b508151811461129f577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461123890613c03565b811061124757611246613c34565b5b8154600116156112665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134a5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61135357600080fd5b61135b613201565b6004600086815260200190815260200160002080549050915060008211156113d8576000600460008781526020019081526020016000206000815481106113a5576113a4613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116113d757600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036114fd576001600a60008282546114f19190613cd4565b9250508190555061151f565b8365ffffffffffff16600a60008282546115179190613cd4565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161156e919061358f565b60405180910390a360019250505092915050565b6003818154811061159257600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106115c257600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061169f575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614054565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061178585610b34565b9150600c805461179490613c03565b905090508082516117a59190613cd4565b67ffffffffffffffff8111156117be576117bd61362b565b5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b50925060005b818110156118b557600c81815461180c90613c03565b811061181b5761181a613c34565b5b81546001161561183a5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061187357611872613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118ad90613d08565b9150506117f6565b5060005b8251811015611982578281815181106118d5576118d4613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061193257611931613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061196c90613d08565b925050808061197a90613d08565b9150506118b9565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611a0890613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490613c03565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b8015611baa57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2757600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611cc2565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c4257600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1f91906132e8565b60405180910390a35050565b60016020528060005260406000206000915054906101000a900460ff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611df15750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611dfa57600080fd5b6001600460008581526020019081526020016000208054905014611e1d57600080fd5b600060046000858152602001908152602001600020600081548110611e4557611e44613c34565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611e7757600080fd5b6000600102600560008581526020019081526020016000205414611e9a57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613cd4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611fab9190613483565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201e57600080fd5b600260009054906101000a900460ff161561203857600080fd5b811561205a576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b6120af848484612b77565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461216490614099565b604051612171919061358f565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036121ba576121b081612acb565b9050806001900492505b60006004600083815260200190815260200160002080549050116121dd57600080fd5b6121e983600102611775565b915050919050565b6060806060600061220185610b34565b9150604767ffffffffffffffff81111561221e5761221d61362b565b5b6040519080825280601f01601f1916602001820160405280156122505781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061228857612287613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122ec576122eb613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123505761234f613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106123b4576123b3613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061241857612417613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061247c5761247b613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106124e0576124df613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156125df5782818151811061253257612531613c34565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061258f5761258e613c34565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806125c990613d08565b92505080806125d790613d08565b915050612516565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061261757612616613c34565b5b90600052602060002001905080600001600c9054906101000a900460ff161561263f57600080fd5b60008361ffff16148015612671575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156126d05760018160000160068282829054906101000a900465ffffffffffff1661269c9190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506126c88585611d4b565b9150506127eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127735750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61277c57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127c457600080fd5b6127e78585858460000160069054906101000a900465ffffffffffff1685612e8e565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614054565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061299e5761299d613c34565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612a5657600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612a8157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612ab357600080fd5b612ac08686868685612e8e565b915050949350505050565b60008060056000848152602001908152602001600020549050612aed8161310c565b612af657600080fd5b612aff8161313e565b15612b0d5782915050612b72565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612bce9190613483565b602060405180830381865afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f919061414f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c4957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d7d573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612d7357503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612d7c57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612dda8284613170565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190613d50565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e819190613cd4565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612f2157600080fd5b84600001600c9054906101000a900460ff16612f83578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612f8257600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166130049190614100565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130919190613cd4565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516130f59190613483565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036131a057600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61327d81613248565b811461328857600080fd5b50565b60008135905061329a81613274565b92915050565b6000602082840312156132b6576132b561323e565b5b60006132c48482850161328b565b91505092915050565b60008115159050919050565b6132e2816132cd565b82525050565b60006020820190506132fd60008301846132d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561333d578082015181840152602081019050613322565b60008484015250505050565b6000601f19601f8301169050919050565b600061336582613303565b61336f818561330e565b935061337f81856020860161331f565b61338881613349565b840191505092915050565b600060208201905081810360008301526133ad818461335a565b905092915050565b6000819050919050565b6133c8816133b5565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000602082840312156134015761340061323e565b5b600061340f848285016133d6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344382613418565b9050919050565b61345381613438565b82525050565b600060208201905061346e600083018461344a565b92915050565b61347d816133b5565b82525050565b60006020820190506134986000830184613474565b92915050565b6134a781613438565b81146134b257600080fd5b50565b6000813590506134c48161349e565b92915050565b6000806000606084860312156134e3576134e261323e565b5b60006134f1868287016134b5565b9350506020613502868287016134b5565b9250506040613513868287016133d6565b9150509250925092565b6000819050919050565b6135308161351d565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b6000602082840312156135695761356861323e565b5b60006135778482850161353e565b91505092915050565b6135898161351d565b82525050565b60006020820190506135a46000830184613580565b92915050565b600081519050919050565b600082825260208201905092915050565b60006135d1826135aa565b6135db81856135b5565b93506135eb81856020860161331f565b6135f481613349565b840191505092915050565b6000602082019050818103600083015261361981846135c6565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366382613349565b810181811067ffffffffffffffff821117156136825761368161362b565b5b80604052505050565b6000613695613234565b90506136a1828261365a565b919050565b600067ffffffffffffffff8211156136c1576136c061362b565b5b6136ca82613349565b9050602081019050919050565b82818337600083830152505050565b60006136f96136f4846136a6565b61368b565b90508281526020810184848401111561371557613714613626565b5b6137208482856136d7565b509392505050565b600082601f83011261373d5761373c613621565b5b813561374d8482602086016136e6565b91505092915050565b60006020828403121561376c5761376b61323e565b5b600082013567ffffffffffffffff81111561378a57613789613243565b5b61379684828501613728565b91505092915050565b600065ffffffffffff82169050919050565b6137ba8161379f565b81146137c557600080fd5b50565b6000813590506137d7816137b1565b92915050565b600080604083850312156137f4576137f361323e565b5b60006138028582860161353e565b9250506020613813858286016137c8565b9150509250929050565b600080604083850312156138345761383361323e565b5b60006138428582860161353e565b9250506020613853858286016133d6565b9150509250929050565b6138668161379f565b82525050565b6000606082019050613881600083018661385d565b61388e602083018561385d565b61389b60408301846132d9565b949350505050565b6000602082840312156138b9576138b861323e565b5b60006138c7848285016134b5565b91505092915050565b6138d9816132cd565b81146138e457600080fd5b50565b6000813590506138f6816138d0565b92915050565b600080604083850312156139135761391261323e565b5b6000613921858286016134b5565b9250506020613932858286016138e7565b9150509250929050565b600080604083850312156139535761395261323e565b5b6000613961858286016134b5565b92505060206139728582860161353e565b9150509250929050565b600067ffffffffffffffff8211156139975761399661362b565b5b6139a082613349565b9050602081019050919050565b60006139c06139bb8461397c565b61368b565b9050828152602081018484840111156139dc576139db613626565b5b6139e78482856136d7565b509392505050565b600082601f830112613a0457613a03613621565b5b8135613a148482602086016139ad565b91505092915050565b60008060008060808587031215613a3757613a3661323e565b5b6000613a45878288016134b5565b9450506020613a56878288016134b5565b9350506040613a67878288016133d6565b925050606085013567ffffffffffffffff811115613a8857613a87613243565b5b613a94878288016139ef565b91505092959194509250565b600061ffff82169050919050565b613ab781613aa0565b8114613ac257600080fd5b50565b600081359050613ad481613aae565b92915050565b600080600060608486031215613af357613af261323e565b5b6000613b01868287016134b5565b9350506020613b128682870161353e565b9250506040613b2386828701613ac5565b9150509250925092565b60008060408385031215613b4457613b4361323e565b5b6000613b52858286016134b5565b9250506020613b63858286016134b5565b9150509250929050565b60008060008060808587031215613b8757613b8661323e565b5b6000613b95878288016134b5565b9450506020613ba68782880161353e565b9350506040613bb787828801613ac5565b9250506060613bc8878288016137c8565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caa82613c63565b9150613cb583613c63565b9250828201905060ff811115613cce57613ccd613c70565b5b92915050565b6000613cdf826133b5565b9150613cea836133b5565b9250828201905080821115613d0257613d01613c70565b5b92915050565b6000613d13826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4557613d44613c70565b5b600182019050919050565b6000613d5b826133b5565b9150613d66836133b5565b9250828203905081811115613d7e57613d7d613c70565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613de97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613da9565b613df38683613da9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e30613e2b613e26846133b5565b613e0b565b6133b5565b9050919050565b6000819050919050565b613e4a83613e15565b613e5e613e5682613e37565b848454613db9565b825550505050565b600090565b613e73613e66565b613e7e818484613e41565b505050565b5b81811015613ea257613e97600082613e6b565b600181019050613e84565b5050565b601f821115613ee757613eb881613d84565b613ec184613d99565b81016020851015613ed0578190505b613ee4613edc85613d99565b830182613e83565b50505b505050565b60008160020a8304905092915050565b6000613f0d60001984600802613eec565b1980831691505092915050565b6000613f268383613efc565b9150826002028217905092915050565b613f3f826135aa565b67ffffffffffffffff811115613f5857613f5761362b565b5b613f628254613c03565b613f6d828285613ea6565b600060209050601f831160018114613fa05760008415613f8e578287015190505b613f988582613f1a565b865550614000565b601f198416613fae86613d84565b60005b82811015613fd657848901518255600182019150602085019450602081019050613fb1565b86831015613ff35784890151613fef601f891682613efc565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061403e600a8361330e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b6000819050602082019050919050565b6000614090825161351d565b80915050919050565b60006140a4826135aa565b826140ae84614074565b90506140b981614084565b925060208210156140f9576140f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613da9565b831692505b5050919050565b600061410b8261379f565b91506141168361379f565b9250828201905065ffffffffffff81111561413457614133613c70565b5b92915050565b6000815190506141498161349e565b92915050565b6000602082840312156141655761416461323e565b5b60006141738482850161413a565b9150509291505056fea264697066735822122016c5775db036c021867f0c38ab4a57d2665c32f2760c28648d23663e38656ea464736f6c63430008120033
+\ No newline at end of file
diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"writer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol
@@ -22,6 +22,9 @@ contract CraftNFT {
// Only the owner may mint tokens.
address public owner;
+ // Addresses with access to allocate and mint tokens..
+ mapping ( address => bool ) public writer;
+
// If set, ownership of the token contract cannot change.
bool ownerFinal;
@@ -93,6 +96,18 @@ contract CraftNFT {
return true;
}
+ // implements Writer
+ function addWriter(address _writer) public {
+ require(msg.sender == owner, 'ERR_ACCESS');
+ writer[_writer] = true;
+ }
+
+ // implements Writer
+ function deleteWriter(address _writer) public {
+ require(msg.sender == _writer || msg.sender == owner, 'ERR_ACCESS');
+ writer[_writer] = false;
+ }
+
// Check bit that is always set on the content data when a token has been minted.
function isActive(bytes32 _tokenContent) private pure returns(bool) {
return uint256(_tokenContent) & 0x8000000000000000000000000000000000000000000000000000000000000000 > 0;
@@ -124,7 +139,7 @@ contract CraftNFT {
// if count is set to 0, only a single unique token can be minted.
function allocate(bytes32 content, uint48 count) public returns (bool) {
uint256 l;
- require(msg.sender == owner);
+ require(msg.sender == owner || writer[msg.sender]);
tokenSpec memory _token;
@@ -161,7 +176,7 @@ contract CraftNFT {
function mintTo(address _recipient, bytes32 _content) public returns (bytes32) {
uint256 right;
- require(msg.sender == owner);
+ require(msg.sender == owner || writer[msg.sender]);
require(token[_content].length == 1);
require(token[_content][0].count == 0);
require(mintedToken[_content] == bytes32(0x00));
@@ -209,7 +224,7 @@ contract CraftNFT {
spec.cursor += 1;
return mintTo(_recipient, _content);
}
- require(msg.sender == owner);
+ require(msg.sender == owner || writer[msg.sender]);
require(spec.cursor < spec.count);
return mintBatchCore(_recipient, _content, _batch, spec.cursor, spec);
}
@@ -224,7 +239,7 @@ contract CraftNFT {
tokenSpec storage spec;
spec = token[_content][_batch];
- require(msg.sender == owner);
+ require(msg.sender == owner || writer[msg.sender]);
require(spec.count > 0);
require(_index < spec.count);
return mintBatchCore(_recipient, _content, _batch, _index, spec);