diff --git a/docs/core/proto-docs.md b/docs/core/proto-docs.md index bf05fd5c9d2b..005bd2c4079f 100644 --- a/docs/core/proto-docs.md +++ b/docs/core/proto-docs.md @@ -6655,6 +6655,8 @@ RedelegationEntry defines a redelegation object with relevant metadata. | `completion_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | completion_time defines the unix time for redelegation completion. | | `initial_balance` | [string](#string) | | initial_balance defines the initial balance when redelegation started. | | `shares_dst` | [string](#string) | | shares_dst is the amount of destination-validator shares created by redelegation. | +| `unbonding_id` | [uint64](#uint64) | | Incrementing id that uniquely identifies this entry | +| `unbonding_on_hold` | [bool](#bool) | | True if this entry's unbonding has been stopped by an external module | @@ -6729,8 +6731,8 @@ UnbondingDelegationEntry defines an unbonding object with relevant metadata. | `completion_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | completion_time is the unix time for unbonding completion. | | `initial_balance` | [string](#string) | | initial_balance defines the tokens initially scheduled to receive at completion. | | `balance` | [string](#string) | | balance defines the tokens to receive at completion. | -| `id` | [uint64](#uint64) | | Incrementing id that uniquely identifies this entry | -| `on_hold` | [bool](#bool) | | True if this entry's unbonding has been stopped by an external module | +| `unbonding_id` | [uint64](#uint64) | | Incrementing id that uniquely identifies this entry | +| `unbonding_on_hold` | [bool](#bool) | | True if this entry's unbonding has been stopped by an external module | @@ -6778,6 +6780,7 @@ multiplied by exchange rate. | `unbonding_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | unbonding_time defines, if unbonding, the min time for the validator to complete unbonding. | | `commission` | [Commission](#cosmos.staking.v1beta1.Commission) | | commission defines the commission parameters. | | `min_self_delegation` | [string](#string) | | min_self_delegation is the validator's self declared minimum self delegation. | +| `unbonding_on_hold` | [bool](#bool) | | True if this validator's unbonding has been stopped by an external module | diff --git a/proto/cosmos/bank/v1beta1/query.proto b/proto/cosmos/bank/v1beta1/query.proto index a567e073f381..81a140764d92 100644 --- a/proto/cosmos/bank/v1beta1/query.proto +++ b/proto/cosmos/bank/v1beta1/query.proto @@ -94,30 +94,6 @@ message QueryAllBalancesResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QuerySpendableBalancesRequest defines the gRPC request structure for querying -// an account's spendable balances. -message QuerySpendableBalancesRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address to query spendable balances for. - string address = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QuerySpendableBalancesResponse defines the gRPC response structure for querying -// an account's spendable balances. -message QuerySpendableBalancesResponse { - // balances is the spendable balances of all the coins. - repeated cosmos.base.v1beta1.Coin balances = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - // QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC // method. message QueryTotalSupplyRequest { diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 406351049fef..e95502ddf48b 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -117,6 +117,9 @@ message Validator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + + // True if this validator's unbonding has been stopped by an external module + bool unbonding_on_hold = 12; } // BondStatus is the status of a validator. @@ -225,13 +228,13 @@ message UnbondingDelegationEntry { (gogoproto.moretags) = "yaml:\"initial_balance\"" ]; // balance defines the tokens to receive at completion. - string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; + string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; // Incrementing id that uniquely identifies this entry - uint64 id = 5; + uint64 unbonding_id = 5; // True if this entry's unbonding has been stopped by an external module - bool on_hold = 6; + bool unbonding_on_hold = 6; } // RedelegationEntry defines a redelegation object with relevant metadata. @@ -253,6 +256,12 @@ message RedelegationEntry { // shares_dst is the amount of destination-validator shares created by redelegation. string shares_dst = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; + + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // True if this entry's unbonding has been stopped by an external module + bool unbonding_on_hold = 6; } // Redelegation contains the list of a particular delegator's redelegating bonds diff --git a/x/bank/types/query.pb.go b/x/bank/types/query.pb.go index e81ca6b3b6fc..8e2c7f253d3c 100644 --- a/x/bank/types/query.pb.go +++ b/x/bank/types/query.pb.go @@ -805,63 +805,59 @@ func init() { func init() { proto.RegisterFile("cosmos/bank/v1beta1/query.proto", fileDescriptor_9c6fc1939682df13) } var fileDescriptor_9c6fc1939682df13 = []byte{ - // 896 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x97, 0x5d, 0x6b, 0x23, 0x55, - 0x18, 0xc7, 0x73, 0xaa, 0x4d, 0xd3, 0x27, 0x28, 0x78, 0x1a, 0x31, 0x9d, 0xda, 0x89, 0x4c, 0xb5, - 0x4d, 0x6b, 0x3a, 0xd3, 0x24, 0x82, 0xd6, 0x1b, 0x69, 0x2a, 0x7a, 0x21, 0xd2, 0x98, 0x7a, 0x25, - 0x48, 0x39, 0x49, 0xc6, 0x31, 0x34, 0x99, 0x33, 0xcd, 0x99, 0x88, 0xa1, 0x14, 0x44, 0x10, 0x04, - 0x41, 0x05, 0x6f, 0x04, 0x6f, 0xea, 0x8d, 0xa0, 0x5f, 0xc0, 0xaf, 0xd0, 0x8b, 0xbd, 0x28, 0xbb, - 0x37, 0x7b, 0xb5, 0xbb, 0xb4, 0x7b, 0xb1, 0x37, 0xfb, 0x1d, 0x96, 0x9c, 0x97, 0x74, 0x92, 0x4c, - 0x92, 0x59, 0xc8, 0xb2, 0xec, 0x55, 0x93, 0x33, 0xcf, 0xcb, 0xef, 0xf9, 0x9f, 0x33, 0xff, 0x93, - 0x42, 0xa6, 0x46, 0x59, 0x8b, 0x32, 0xab, 0x4a, 0xdc, 0x63, 0xeb, 0xbb, 0x7c, 0xd5, 0xf6, 0x49, - 0xde, 0x3a, 0xe9, 0xd8, 0xed, 0xae, 0xe9, 0xb5, 0xa9, 0x4f, 0xf1, 0x92, 0x08, 0x30, 0x7b, 0x01, - 0xa6, 0x0c, 0xd0, 0xb6, 0xfa, 0x59, 0xcc, 0x16, 0xd1, 0xfd, 0x5c, 0x8f, 0x38, 0x0d, 0x97, 0xf8, - 0x0d, 0xea, 0x8a, 0x02, 0x5a, 0xca, 0xa1, 0x0e, 0xe5, 0x1f, 0xad, 0xde, 0x27, 0xb9, 0xfa, 0xa6, - 0x43, 0xa9, 0xd3, 0xb4, 0x2d, 0xe2, 0x35, 0x2c, 0xe2, 0xba, 0xd4, 0xe7, 0x29, 0x4c, 0x3e, 0xd5, - 0x83, 0xf5, 0x55, 0xe5, 0x1a, 0x6d, 0xb8, 0x23, 0xcf, 0x03, 0xd4, 0x9c, 0x90, 0x3f, 0x37, 0x0e, - 0x60, 0xe9, 0x8b, 0x1e, 0x55, 0x89, 0x34, 0x89, 0x5b, 0xb3, 0x2b, 0xf6, 0x49, 0xc7, 0x66, 0x3e, - 0x4e, 0xc3, 0x02, 0xa9, 0xd7, 0xdb, 0x36, 0x63, 0x69, 0xf4, 0x16, 0xca, 0x2e, 0x56, 0xd4, 0x57, - 0x9c, 0x82, 0xf9, 0xba, 0xed, 0xd2, 0x56, 0x7a, 0x8e, 0xaf, 0x8b, 0x2f, 0x1f, 0x26, 0x7e, 0x3e, - 0xcf, 0xc4, 0x1e, 0x9d, 0x67, 0x62, 0xc6, 0x67, 0x90, 0x1a, 0x2c, 0xc8, 0x3c, 0xea, 0x32, 0x1b, - 0x17, 0x61, 0xa1, 0x2a, 0x96, 0x78, 0xc5, 0x64, 0x61, 0xd9, 0xec, 0xeb, 0xc5, 0x6c, 0xa5, 0x97, - 0xb9, 0x4f, 0x1b, 0x6e, 0x45, 0x45, 0x1a, 0x3f, 0x21, 0x78, 0x83, 0x57, 0xdb, 0x6b, 0x36, 0x65, - 0x41, 0x36, 0x1d, 0xf1, 0x13, 0x80, 0x1b, 0x6d, 0x39, 0x67, 0xb2, 0xb0, 0x3e, 0xd0, 0x4d, 0x6c, - 0x9b, 0xea, 0x59, 0x26, 0x8e, 0x1a, 0xbc, 0x12, 0xc8, 0x0c, 0x0c, 0x75, 0x0b, 0x41, 0x7a, 0x94, - 0x43, 0x4e, 0xe6, 0x40, 0x42, 0xf2, 0xf6, 0x48, 0x5e, 0x9a, 0x38, 0x5a, 0x69, 0xe7, 0xe2, 0x5e, - 0x26, 0xf6, 0xdf, 0xfd, 0x4c, 0xd6, 0x69, 0xf8, 0xdf, 0x76, 0xaa, 0x66, 0x8d, 0xb6, 0x2c, 0xb9, - 0x45, 0xe2, 0xcf, 0x36, 0xab, 0x1f, 0x5b, 0x7e, 0xd7, 0xb3, 0x19, 0x4f, 0x60, 0x95, 0x7e, 0x71, - 0xfc, 0x69, 0xc8, 0x5c, 0x1b, 0x53, 0xe7, 0x12, 0x94, 0xc1, 0xc1, 0x8c, 0x5f, 0x10, 0xac, 0xf2, - 0x71, 0x0e, 0x3d, 0xdb, 0xad, 0x93, 0x6a, 0xd3, 0x7e, 0x9e, 0xe2, 0xde, 0x46, 0xa0, 0x8f, 0xa3, - 0x79, 0x61, 0x25, 0x3e, 0x96, 0x07, 0xf7, 0x4b, 0xea, 0x93, 0xe6, 0x61, 0xc7, 0xf3, 0x9a, 0x5d, - 0xa5, 0xed, 0xa0, 0x82, 0x68, 0x06, 0x0a, 0x5e, 0xa8, 0xe3, 0x39, 0xd0, 0x4d, 0x6a, 0x57, 0x83, - 0x38, 0xe3, 0x2b, 0xcf, 0x42, 0x39, 0x59, 0x7a, 0x76, 0xba, 0xe5, 0xa4, 0x7d, 0x88, 0x21, 0x0e, - 0xbe, 0x51, 0xa2, 0xf5, 0x6d, 0x07, 0x05, 0x6c, 0xc7, 0x28, 0xc3, 0xeb, 0x43, 0xd1, 0x72, 0xe8, - 0xf7, 0x21, 0x4e, 0x5a, 0xb4, 0xe3, 0xfa, 0x53, 0xcd, 0xa6, 0xf4, 0x72, 0x6f, 0xe8, 0x8a, 0x0c, - 0x37, 0x52, 0x80, 0x79, 0xc5, 0x32, 0x69, 0x93, 0x96, 0x7a, 0x1d, 0x8c, 0xb2, 0x74, 0x49, 0xb5, - 0x2a, 0xbb, 0xec, 0x42, 0xdc, 0xe3, 0x2b, 0xb2, 0xcb, 0x8a, 0x19, 0x72, 0x05, 0x98, 0x22, 0x49, - 0xf5, 0x11, 0x09, 0x46, 0x1d, 0x34, 0x5e, 0xf1, 0xe3, 0xde, 0x1c, 0xec, 0x73, 0xdb, 0x27, 0x75, - 0xe2, 0x93, 0x19, 0x1f, 0x11, 0xe3, 0x5f, 0x04, 0x2b, 0xa1, 0x6d, 0xe4, 0x00, 0x7b, 0xb0, 0xd8, - 0x92, 0x6b, 0xea, 0xc5, 0x5a, 0x0d, 0x9d, 0x41, 0x65, 0xca, 0x29, 0x6e, 0xb2, 0x66, 0xb7, 0xf3, - 0x79, 0x58, 0xbe, 0x41, 0x1d, 0x16, 0x24, 0x7c, 0xfb, 0xbf, 0x0e, 0x8a, 0x38, 0x32, 0xdc, 0x47, - 0x90, 0x50, 0x98, 0x52, 0xc2, 0x48, 0xb3, 0xf5, 0x93, 0x0a, 0x8f, 0x17, 0x61, 0x9e, 0xd7, 0xc7, - 0x7f, 0x22, 0x58, 0x90, 0xa6, 0x84, 0xb3, 0xa1, 0x45, 0x42, 0x2e, 0x51, 0x6d, 0x33, 0x42, 0xa4, - 0x60, 0x35, 0x3e, 0xf8, 0xf1, 0xce, 0xc3, 0x3f, 0xe6, 0x0a, 0x78, 0xc7, 0x0a, 0xbf, 0xaf, 0x85, - 0x3d, 0x59, 0xa7, 0xd2, 0x85, 0xcf, 0xac, 0x6a, 0xf7, 0x88, 0x6b, 0x80, 0xff, 0x42, 0x90, 0x0c, - 0xdc, 0x4a, 0x38, 0x37, 0xbe, 0xe9, 0xe8, 0x25, 0xaa, 0x6d, 0x47, 0x8c, 0x96, 0x98, 0x16, 0xc7, - 0xdc, 0xc4, 0x1b, 0x11, 0x31, 0xf1, 0xff, 0x08, 0x5e, 0x1b, 0xb1, 0x75, 0x5c, 0x18, 0xdf, 0x75, - 0xdc, 0x8d, 0xa4, 0x15, 0x9f, 0x2a, 0x47, 0xf2, 0xee, 0x72, 0xde, 0x22, 0xce, 0x87, 0xf2, 0x32, - 0x95, 0x77, 0x14, 0x42, 0xfe, 0x1b, 0x82, 0x64, 0xc0, 0x4e, 0x27, 0xe9, 0x3a, 0xea, 0xf1, 0x93, - 0x74, 0x0d, 0xf1, 0x68, 0x63, 0x8d, 0x73, 0xae, 0xe2, 0x95, 0x70, 0x4e, 0x41, 0xf0, 0x2b, 0x82, - 0x84, 0x32, 0x3a, 0x3c, 0xe1, 0x6c, 0x0d, 0x59, 0xa7, 0xb6, 0x15, 0x25, 0x54, 0x82, 0xbc, 0xcb, - 0x41, 0xde, 0xc1, 0x6b, 0x13, 0x40, 0xac, 0x53, 0x7e, 0xf2, 0xce, 0xf0, 0x0f, 0x08, 0xe2, 0xc2, - 0xdc, 0xf0, 0xc6, 0xf8, 0x1e, 0x03, 0x4e, 0xaa, 0x65, 0xa7, 0x07, 0x46, 0xd2, 0x44, 0xd8, 0x28, - 0xfe, 0x07, 0xc1, 0x2b, 0x03, 0x6f, 0x3f, 0x36, 0xc7, 0x37, 0x08, 0x73, 0x16, 0xcd, 0x8a, 0x1c, - 0x2f, 0xb9, 0xde, 0xe3, 0x5c, 0x26, 0xce, 0x85, 0x72, 0x71, 0x69, 0xd8, 0x91, 0xf2, 0x90, 0xbe, - 0x56, 0x7f, 0x23, 0x78, 0x75, 0xd0, 0x84, 0xf1, 0xb4, 0xce, 0xc3, 0xb7, 0x82, 0xb6, 0x13, 0x3d, - 0x41, 0xb2, 0xe6, 0x38, 0xeb, 0x3a, 0x7e, 0x3b, 0x0a, 0x6b, 0x69, 0xff, 0xe2, 0x4a, 0x47, 0x97, - 0x57, 0x3a, 0x7a, 0x70, 0xa5, 0xa3, 0xdf, 0xaf, 0xf5, 0xd8, 0xe5, 0xb5, 0x1e, 0xbb, 0x7b, 0xad, - 0xc7, 0xbe, 0xda, 0x9c, 0xf8, 0x83, 0xe0, 0x7b, 0x51, 0x96, 0xff, 0x2e, 0xa8, 0xc6, 0xf9, 0xff, - 0x15, 0xc5, 0x27, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xfd, 0x88, 0xa1, 0x2f, 0x0d, 0x00, 0x00, + // 829 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x6b, 0x13, 0x5b, + 0x18, 0xce, 0xe9, 0xbd, 0x4d, 0xd3, 0x37, 0xdc, 0xbb, 0x38, 0xcd, 0xe5, 0xa6, 0xd3, 0xdb, 0xe4, + 0x32, 0xd5, 0x36, 0xad, 0xe9, 0x4c, 0x9b, 0x0a, 0x7e, 0x6c, 0xa4, 0xa9, 0xe8, 0x42, 0xa4, 0x31, + 0xba, 0x12, 0xa4, 0x9c, 0x24, 0xe3, 0x18, 0x9a, 0xcc, 0x99, 0xe6, 0x4c, 0xc4, 0x50, 0x0a, 0x22, + 0x08, 0xae, 0x54, 0x70, 0x23, 0xb8, 0xa9, 0x1b, 0x41, 0xb7, 0xfe, 0x89, 0x2e, 0x5c, 0x14, 0xdc, + 0xb8, 0x52, 0x69, 0x5d, 0xf8, 0x33, 0x24, 0xe7, 0x23, 0x9d, 0x24, 0xd3, 0x64, 0x16, 0x71, 0x95, + 0x99, 0x77, 0xde, 0x8f, 0xe7, 0x79, 0xce, 0xbc, 0xcf, 0x04, 0xd2, 0x65, 0xca, 0xea, 0x94, 0x99, + 0x25, 0xe2, 0x6c, 0x9b, 0x0f, 0x57, 0x4b, 0x96, 0x47, 0x56, 0xcd, 0x9d, 0xa6, 0xd5, 0x68, 0x19, + 0x6e, 0x83, 0x7a, 0x14, 0x4f, 0x89, 0x04, 0xa3, 0x9d, 0x60, 0xc8, 0x04, 0x6d, 0xa9, 0x53, 0xc5, + 0x2c, 0x91, 0xdd, 0xa9, 0x75, 0x89, 0x5d, 0x75, 0x88, 0x57, 0xa5, 0x8e, 0x68, 0xa0, 0x25, 0x6c, + 0x6a, 0x53, 0x7e, 0x69, 0xb6, 0xaf, 0x64, 0xf4, 0x3f, 0x9b, 0x52, 0xbb, 0x66, 0x99, 0xc4, 0xad, + 0x9a, 0xc4, 0x71, 0xa8, 0xc7, 0x4b, 0x98, 0x7c, 0x9a, 0xf2, 0xf7, 0x57, 0x9d, 0xcb, 0xb4, 0xea, + 0xf4, 0x3d, 0xf7, 0xa1, 0xe6, 0x08, 0xf9, 0x73, 0x7d, 0x13, 0xa6, 0x6e, 0xb5, 0x51, 0xe5, 0x49, + 0x8d, 0x38, 0x65, 0xab, 0x68, 0xed, 0x34, 0x2d, 0xe6, 0xe1, 0x24, 0x4c, 0x90, 0x4a, 0xa5, 0x61, + 0x31, 0x96, 0x44, 0xff, 0xa3, 0xcc, 0x64, 0x51, 0xdd, 0xe2, 0x04, 0x8c, 0x57, 0x2c, 0x87, 0xd6, + 0x93, 0x63, 0x3c, 0x2e, 0x6e, 0x2e, 0xc7, 0x9e, 0xed, 0xa7, 0x23, 0x3f, 0xf7, 0xd3, 0x11, 0xfd, + 0x06, 0x24, 0xba, 0x1b, 0x32, 0x97, 0x3a, 0xcc, 0xc2, 0x6b, 0x30, 0x51, 0x12, 0x21, 0xde, 0x31, + 0x9e, 0x9b, 0x36, 0x3a, 0x7a, 0x31, 0x4b, 0xe9, 0x65, 0x6c, 0xd0, 0xaa, 0x53, 0x54, 0x99, 0xfa, + 0x53, 0x04, 0xff, 0xf2, 0x6e, 0xeb, 0xb5, 0x9a, 0x6c, 0xc8, 0x86, 0x43, 0xbc, 0x06, 0x70, 0xa2, + 0x2d, 0xc7, 0x19, 0xcf, 0xcd, 0x77, 0x4d, 0x13, 0xc7, 0xa6, 0x66, 0x16, 0x88, 0xad, 0x88, 0x17, + 0x7d, 0x95, 0x3e, 0x52, 0x9f, 0x10, 0x24, 0xfb, 0x71, 0x48, 0x66, 0x36, 0xc4, 0x24, 0xde, 0x36, + 0x92, 0x3f, 0x06, 0x52, 0xcb, 0xaf, 0x1c, 0x7c, 0x4d, 0x47, 0x3e, 0x7c, 0x4b, 0x67, 0xec, 0xaa, + 0xf7, 0xa0, 0x59, 0x32, 0xca, 0xb4, 0x6e, 0xca, 0x23, 0x12, 0x3f, 0xcb, 0xac, 0xb2, 0x6d, 0x7a, + 0x2d, 0xd7, 0x62, 0xbc, 0x80, 0x15, 0x3b, 0xcd, 0xf1, 0xf5, 0x00, 0x5e, 0x0b, 0x43, 0x79, 0x09, + 0x94, 0x7e, 0x62, 0xfa, 0xb6, 0x54, 0xf5, 0x0e, 0xf5, 0x48, 0xed, 0x76, 0xd3, 0x75, 0x6b, 0x2d, + 0xa5, 0x6a, 0xb7, 0x76, 0x68, 0x04, 0xda, 0x1d, 0x28, 0xed, 0xba, 0xa6, 0x49, 0xed, 0xca, 0x10, + 0x65, 0x3c, 0xf2, 0x3b, 0x94, 0x93, 0xad, 0x47, 0xa7, 0x5b, 0x56, 0xbe, 0xdb, 0x82, 0xc4, 0xe6, + 0x7d, 0x25, 0x5a, 0x67, 0x27, 0x90, 0x6f, 0x27, 0xf4, 0x02, 0xfc, 0xd3, 0x93, 0x2d, 0x49, 0x5f, + 0x80, 0x28, 0xa9, 0xd3, 0xa6, 0xe3, 0x0d, 0xdd, 0x84, 0xfc, 0x9f, 0x6d, 0xd2, 0x45, 0x99, 0xae, + 0x27, 0x00, 0xf3, 0x8e, 0x05, 0xd2, 0x20, 0x75, 0xb5, 0x08, 0x7a, 0x41, 0xae, 0xb0, 0x8a, 0xca, + 0x29, 0x97, 0x20, 0xea, 0xf2, 0x88, 0x9c, 0x32, 0x63, 0x04, 0xf8, 0x93, 0x21, 0x8a, 0xd4, 0x1c, + 0x51, 0xa0, 0x57, 0x40, 0xe3, 0x1d, 0xaf, 0xb6, 0x79, 0xb0, 0x9b, 0x96, 0x47, 0x2a, 0xc4, 0x23, + 0x23, 0x7e, 0x45, 0xf4, 0xf7, 0x08, 0x66, 0x02, 0xc7, 0x48, 0x02, 0xeb, 0x30, 0x59, 0x97, 0x31, + 0xb5, 0x58, 0xb3, 0x81, 0x1c, 0x54, 0xa5, 0x64, 0x71, 0x52, 0x35, 0xba, 0x93, 0x5f, 0x85, 0xe9, + 0x13, 0xa8, 0xbd, 0x82, 0x04, 0x1f, 0xff, 0x3d, 0xbf, 0x88, 0x7d, 0xe4, 0xae, 0x40, 0x4c, 0xc1, + 0x94, 0x12, 0x86, 0xe2, 0xd6, 0x29, 0xca, 0x7d, 0x8c, 0xc1, 0x38, 0xef, 0x8f, 0x5f, 0x23, 0x98, + 0x90, 0xa6, 0x84, 0x33, 0x81, 0x4d, 0x02, 0x1c, 0x5e, 0x5b, 0x0c, 0x91, 0x29, 0xb0, 0xea, 0x17, + 0x9f, 0x7c, 0xfe, 0xf1, 0x6a, 0x2c, 0x87, 0x57, 0xcc, 0xe0, 0x8f, 0x89, 0xb0, 0x27, 0x73, 0x57, + 0xfa, 0xef, 0x9e, 0x59, 0x6a, 0x6d, 0x71, 0x0d, 0xf0, 0x1b, 0x04, 0x71, 0x9f, 0x65, 0xe2, 0xec, + 0xe9, 0x43, 0xfb, 0x1d, 0x5e, 0x5b, 0x0e, 0x99, 0x2d, 0x61, 0x9a, 0x1c, 0xe6, 0x22, 0x5e, 0x08, + 0x09, 0x13, 0xbf, 0x40, 0x10, 0xf7, 0x99, 0xd2, 0x20, 0x74, 0xfd, 0x4e, 0x39, 0x08, 0x5d, 0x80, + 0xd3, 0xe9, 0x73, 0x1c, 0xdd, 0x2c, 0x9e, 0x09, 0x44, 0x27, 0x9d, 0xea, 0x39, 0x82, 0x98, 0xb2, + 0x0b, 0x3c, 0xe0, 0x84, 0x7a, 0x0c, 0x48, 0x5b, 0x0a, 0x93, 0x2a, 0x81, 0x9c, 0xe3, 0x40, 0xce, + 0xe2, 0xb9, 0x01, 0x40, 0xcc, 0x5d, 0x7e, 0x7e, 0x7b, 0xf8, 0x31, 0x82, 0xa8, 0xb0, 0x08, 0xbc, + 0x70, 0xfa, 0x8c, 0x2e, 0x3f, 0xd2, 0x32, 0xc3, 0x13, 0x43, 0x69, 0x22, 0xcc, 0x08, 0xbf, 0x43, + 0xf0, 0x57, 0xd7, 0x0e, 0x61, 0xe3, 0xf4, 0x01, 0x41, 0xfb, 0xa9, 0x99, 0xa1, 0xf3, 0x25, 0xae, + 0xf3, 0x1c, 0x97, 0x81, 0xb3, 0x81, 0xb8, 0xb8, 0x34, 0x6c, 0x4b, 0x6d, 0x62, 0x47, 0xab, 0xb7, + 0x08, 0xfe, 0xee, 0xb6, 0x32, 0x3c, 0x6c, 0x72, 0xaf, 0xb7, 0x6a, 0x2b, 0xe1, 0x0b, 0x24, 0xd6, + 0x2c, 0xc7, 0x3a, 0x8f, 0xcf, 0x84, 0xc1, 0x9a, 0xdf, 0x38, 0x38, 0x4a, 0xa1, 0xc3, 0xa3, 0x14, + 0xfa, 0x7e, 0x94, 0x42, 0x2f, 0x8f, 0x53, 0x91, 0xc3, 0xe3, 0x54, 0xe4, 0xcb, 0x71, 0x2a, 0x72, + 0x77, 0x71, 0xe0, 0x67, 0xf5, 0x91, 0x68, 0xcb, 0xbf, 0xae, 0xa5, 0x28, 0xff, 0xeb, 0xb8, 0xf6, + 0x2b, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x6f, 0x29, 0xd7, 0x12, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 6d498c643590..2d2d1a6a5ab6 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -1,8 +1,6 @@ package keeper import ( - "time" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -107,8 +105,5 @@ func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} -func (h Hooks) UnbondingDelegationEntryCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress, _ int64, _ time.Time, _ sdk.Int, _ uint64) { -} -func (h Hooks) BeforeUnbondingDelegationEntryComplete(_ sdk.Context, _ uint64) bool { - return false +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) { } diff --git a/x/slashing/handler_test.go b/x/slashing/handler_test.go index e6b6af64b68d..25fed487ba79 100644 --- a/x/slashing/handler_test.go +++ b/x/slashing/handler_test.go @@ -219,14 +219,14 @@ func TestHandleAbsentValidator(t *testing.T) { // validator should have been slashed require.True(t, amt.Sub(slashAmt).Equal(validator.GetTokens())) - // 502nd block *also* missed (since the LastCommit would have still included the just-unbonded validator) height++ ctx = ctx.WithBlockHeight(height) app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) require.True(t, found) require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, int64(1), info.MissedBlocksCounter) + // validator missed block should not be incremented since it is jailed (#11425) + require.Equal(t, int64(0), info.MissedBlocksCounter) // end block staking.EndBlocker(ctx, app.StakingKeeper) @@ -260,8 +260,8 @@ func TestHandleAbsentValidator(t *testing.T) { info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) require.True(t, found) require.Equal(t, int64(0), info.StartHeight) - // we've missed 2 blocks more than the maximum, so the counter was reset to 0 at 1 block more and is now 1 - require.Equal(t, int64(1), info.MissedBlocksCounter) + // validator missed block should not have been changed + require.Equal(t, int64(0), info.MissedBlocksCounter) // validator should not be immediately jailed again height++ diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 432c8bbb395b..445cd80d00d0 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -77,8 +77,5 @@ func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) {} -func (h Hooks) UnbondingDelegationEntryCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress, _ int64, _ time.Time, _ sdk.Int, _ uint64) { -} -func (h Hooks) BeforeUnbondingDelegationEntryComplete(_ sdk.Context, _ uint64) bool { - return false +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) { } diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index daa6c791ea20..7f3d42b0a7ed 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -4,15 +4,12 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/testslashing" - "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/staking/teststaking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -279,52 +276,3 @@ func TestValidatorDippingInAndOut(t *testing.T) { staking.EndBlocker(ctx, app.StakingKeeper) tstaking.CheckValidator(valAddr, stakingtypes.Unbonding, true) } - -type MockSlashingHooks struct { - triggered bool -} - -func (h *MockSlashingHooks) AfterValidatorDowntime(_ sdk.Context, _ sdk.ConsAddress, _ int64) { - h.triggered = true -} - -// Test hook is triggered when validator is down -func TestValidatorDowntimedHook(t *testing.T) { - // initial setup - app := simapp.Setup(false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - - // create a validator pubkey and address - pubkey := ed25519.GenPrivKey().PubKey() - consAddr := sdk.ConsAddress(pubkey.Address()) - - // store the validator pubkey and signing info - app.SlashingKeeper.AddPubkey(ctx, pubkey) - valInfo := types.NewValidatorSigningInfo(consAddr, ctx.BlockHeight(), ctx.BlockHeight()-1, - time.Time{}.UTC(), false, int64(0)) - app.SlashingKeeper.SetValidatorSigningInfo(ctx, consAddr, valInfo) - - // define a slashing hook mock - - mh := MockSlashingHooks{} - app.SlashingKeeper.SetHooks(&mh) - - // 1000 first blocks OK - height := int64(0) - power := int64(1) - - for ; height < app.SlashingKeeper.SignedBlocksWindow(ctx); height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, pubkey.Address(), power, true) - } - // hook shouldn't be triggered - require.False(t, mh.triggered) - - // 501 blocks missed - for ; height < app.SlashingKeeper.SignedBlocksWindow(ctx)+(app.SlashingKeeper.SignedBlocksWindow(ctx)-app.SlashingKeeper.MinSignedPerWindow(ctx))+1; height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, pubkey.Address(), power, false) - } - - require.True(t, mh.triggered) -} diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index e02c1e59f39f..d04f6b412de7 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -2,7 +2,6 @@ package keeper import ( "bytes" - "encoding/binary" "fmt" "time" @@ -11,28 +10,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking/types" ) -// Increments and returns a unique ID for an UnbondingDelegationEntry -func (k Keeper) IncrementUnbondingDelegationEntryId(ctx sdk.Context) (unbondingDelegationEntryId uint64) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(types.UnbondingDelegationEntryIdKey) - - if bz == nil { - unbondingDelegationEntryId = 0 - } else { - unbondingDelegationEntryId = binary.BigEndian.Uint64(bz) - } - - unbondingDelegationEntryId = unbondingDelegationEntryId + 1 - - // Convert back into bytes for storage - bz = make([]byte, 8) - binary.BigEndian.PutUint64(bz, unbondingDelegationEntryId) - - store.Set(types.UnbondingDelegationEntryIdKey, bz) - - return unbondingDelegationEntryId -} - // return a specific delegation func (k Keeper) GetDelegation(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, @@ -172,58 +149,6 @@ func (k Keeper) GetUnbondingDelegation( return ubd, true } -// return a unbonding delegation that has an unbonding delegation entry with a certain ID -func (k Keeper) GetUnbondingDelegationByEntry( - ctx sdk.Context, id uint64, -) (ubd types.UnbondingDelegation, found bool) { - store := ctx.KVStore(k.storeKey) - indexKey := types.GetUnbondingDelegationEntryIndexKey(id) - ubdeKey := store.Get(indexKey) - - if ubdeKey == nil { - return ubd, false - } - - value := store.Get(ubdeKey) - - if value == nil { - return ubd, false - } - - ubd = types.MustUnmarshalUBD(k.cdc, value) - - return ubd, true -} - -// Set an index to look up an UnbondingDelegation by the ID of an UnbondingDelegationEntry that it contains -func (k Keeper) SetUBDByEntryIndex(ctx sdk.Context, ubd types.UnbondingDelegation, id uint64) { - store := ctx.KVStore(k.storeKey) - - delAddr, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) - if err != nil { - panic(err) - } - - valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) - if err != nil { - panic(err) - } - - indexKey := types.GetUnbondingDelegationEntryIndexKey(id) - ubdKey := types.GetUBDKey(delAddr, valAddr) - - store.Set(indexKey, ubdKey) -} - -// Remove a UBDByEntryIndex -func (k Keeper) DeleteUBDByEntryIndex(ctx sdk.Context, id uint64) { - store := ctx.KVStore(k.storeKey) - - indexKey := types.GetUnbondingDelegationEntryIndexKey(id) - - store.Delete(indexKey) -} - // return all unbonding delegations from a particular validator func (k Keeper) GetUnbondingDelegationsFromValidator(ctx sdk.Context, valAddr sdk.ValAddress) (ubds []types.UnbondingDelegation) { store := ctx.KVStore(k.storeKey) @@ -383,7 +308,7 @@ func (k Keeper) SetUnbondingDelegationEntry( creationHeight int64, minTime time.Time, balance sdk.Int, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) - id := k.IncrementUnbondingDelegationEntryId(ctx) + id := k.IncrementUnbondingId(ctx) if found { ubd.AddEntry(creationHeight, minTime, balance, id) } else { @@ -392,11 +317,11 @@ func (k Keeper) SetUnbondingDelegationEntry( k.SetUnbondingDelegation(ctx, ubd) - // Add to the UBDByEntry index to look up the UBD by the UBDE ID - k.SetUBDByEntryIndex(ctx, ubd, id) + // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID + k.SetUnbondingDelegationByUnbondingIndex(ctx, ubd, id) // Call hook - k.UnbondingDelegationEntryCreated(ctx, delegatorAddr, validatorAddr, creationHeight, minTime, balance, id) + k.AfterUnbondingInitiated(ctx, id) return ubd } @@ -575,8 +500,8 @@ func (k Keeper) SetRedelegation(ctx sdk.Context, red types.Redelegation) { store.Set(types.GetREDByValDstIndexKey(delegatorAddress, valSrcAddr, valDestAddr), []byte{}) } -// SetRedelegationEntry adds an entry to the unbonding delegation at the given -// addresses. It creates the unbonding delegation if it does not exist. +// SetRedelegationEntry adds an entry to the redelegation at +// the given addresses. It creates the redelegation if it does not exist func (k Keeper) SetRedelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, @@ -584,15 +509,22 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) + id := k.IncrementUnbondingId(ctx) if found { - red.AddEntry(creationHeight, minTime, balance, sharesDst) + red.AddEntry(creationHeight, minTime, balance, sharesDst, false, id) } else { red = types.NewRedelegation(delegatorAddr, validatorSrcAddr, - validatorDstAddr, creationHeight, minTime, balance, sharesDst) + validatorDstAddr, creationHeight, minTime, balance, sharesDst, false, id) } k.SetRedelegation(ctx, red) + // Add to the UBDByEntry index to look up the UBD by the UBDE ID + k.SetRedelegationByUnbondingIndex(ctx, red, id) + + // Call hook + k.AfterUnbondingInitiated(ctx, id) + return red } @@ -934,67 +866,10 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd // loop through all the entries and try to complete unbonding mature entries for i := 0; i < len(ubd.Entries); i++ { entry := &ubd.Entries[i] - if entry.IsMature(ctxTime) { - // This hook allows external modules to stop an unbonding delegation entry from fully unbonding - // when the completionTime has passed. This allows them to prolong the unbonding period. - onHold := k.BeforeUnbondingDelegationEntryComplete(ctx, entry.Id) - if onHold { - // Mark that the entry is stopped - entry.OnHold = true - } else { - // Proceed with unbonding - ubd.RemoveEntry(int64(i)) - i-- - - // track undelegation only when remaining or truncated shares are non-zero - if !entry.Balance.IsZero() { - amt := sdk.NewCoin(bondDenom, entry.Balance) - if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( - ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), - ); err != nil { - return nil, err - } - - balances = balances.Add(amt) - } - } - } - } - - // set the unbonding delegation or remove it if there are no more entries - if len(ubd.Entries) == 0 { - k.RemoveUnbondingDelegation(ctx, ubd) - } else { - k.SetUnbondingDelegation(ctx, ubd) - } - - return balances, nil -} - -// This can be called to complete the unbonding of an unbonding delegation entry that was previously -// stopped by the BeforeUnbondingDelegationEntryComplete hook in CompleteUnbonding -func (k Keeper) CompleteStoppedUnbonding(ctx sdk.Context, id uint64) (found bool, err error) { - ubd, found := k.GetUnbondingDelegationByEntry(ctx, id) - if !found { - return false, nil - } - - for i, entry := range ubd.Entries { - // we find the entry with the right ID and make sure that it - // is on hold. - if entry.Id == id && entry.OnHold { - // Complete unbonding - delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) - if err != nil { - return true, err - } - - bondDenom := k.GetParams(ctx).BondDenom - - // Remove entry + if entry.IsMature(ctxTime) && !entry.UnbondingOnHold { + // Proceed with unbonding ubd.RemoveEntry(int64(i)) - // Remove from the UBDByEntry index - k.DeleteUBDByEntryIndex(ctx, entry.Id) + i-- // track undelegation only when remaining or truncated shares are non-zero if !entry.Balance.IsZero() { @@ -1002,24 +877,22 @@ func (k Keeper) CompleteStoppedUnbonding(ctx sdk.Context, id uint64) (found bool if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), ); err != nil { - return false, err + return nil, err } - } - // set the unbonding delegation or remove it if there are no more entries - if len(ubd.Entries) == 0 { - k.RemoveUnbondingDelegation(ctx, ubd) - } else { - k.SetUnbondingDelegation(ctx, ubd) + balances = balances.Add(amt) } - - // Successfully completed unbonding - return true, nil } } - // If an entry was not found - return false, nil + // set the unbonding delegation or remove it if there are no more entries + if len(ubd.Entries) == 0 { + k.RemoveUnbondingDelegation(ctx, ubd) + } else { + k.SetUnbondingDelegation(ctx, ubd) + } + + return balances, nil } // begin unbonding / redelegation; create a redelegation record @@ -1094,10 +967,10 @@ func (k Keeper) CompleteRedelegation( balances := sdk.NewCoins() ctxTime := ctx.BlockHeader().Time - // loop through all the entries and complete mature redelegation entries + // loop through all the entries and try to complete mature redelegation entries for i := 0; i < len(red.Entries); i++ { - entry := red.Entries[i] - if entry.IsMature(ctxTime) { + entry := &red.Entries[i] + if entry.IsMature(ctxTime) && !entry.UnbondingOnHold { red.RemoveEntry(int64(i)) i-- diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 88cadd74f2be..f63eebd7ef2b 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -148,7 +148,7 @@ func TestUnbondingDelegation(t *testing.T) { 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), - app.StakingKeeper.IncrementUnbondingDelegationEntryId(ctx), + app.StakingKeeper.IncrementUnbondingId(ctx), ) // set and retrieve a record @@ -306,134 +306,6 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { require.True(sdk.IntEq(t, newNotBonded, oldNotBonded.AddRaw(1))) } -type MockStakingHooks struct { - types.StakingHooksTemplate - beforeUnbondingDelegationEntryComplete func() bool - unbondingDelegationEntryCreated func(uint64) -} - -func (h MockStakingHooks) UnbondingDelegationEntryCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress, _ int64, _ time.Time, _ sdk.Int, id uint64) { - h.unbondingDelegationEntryCreated(id) -} -func (h MockStakingHooks) BeforeUnbondingDelegationEntryComplete(_ sdk.Context, _ uint64) bool { - return h.beforeUnbondingDelegationEntryComplete() -} - -func TestUnbondingDelegationOnHold(t *testing.T) { - _, app, ctx := createTestInput() - - stakingKeeper := keeper.NewKeeper( - app.AppCodec(), - app.GetKey(types.StoreKey), - app.GetKey(types.StoreKey), - app.AccountKeeper, - app.BankKeeper, - app.GetSubspace(types.ModuleName), - ) - - onHold := true - udecHookCalled := false - var ubdeID uint64 - - myHooks := MockStakingHooks{ - beforeUnbondingDelegationEntryComplete: func() bool { - return onHold - }, - unbondingDelegationEntryCreated: func(id uint64) { - udecHookCalled = true - ubdeID = id - }, - } - - stakingKeeper.SetHooks( - types.NewMultiStakingHooks(myHooks), - ) - - app.StakingKeeper = stakingKeeper - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - - bondDenom := app.StakingKeeper.BondDenom(ctx) - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - // create a validator and a delegator to that validator - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - - validator, issuedShares := validator.AddTokensFromDel(startTokens) - require.Equal(t, startTokens, issuedShares.RoundInt()) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(sdk.IntEq(t, startTokens, validator.BondedTokens())) - require.True(t, validator.IsBonded()) - - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - // UNDELEGATE - // Save original bonded and unbonded amounts - bondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - - completionTime, err := app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) - require.NoError(t, err) - - // check that the unbonding actually happened - bondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - // Bonded amount is less - require.True(sdk.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) - // Unbonded amount is more - require.True(sdk.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) - - // check that our hook was called - require.True(t, udecHookCalled) - - // TRY TO COMPLETE STOPPED UNBONDING TOO EARLY - found, err := app.StakingKeeper.CompleteStoppedUnbonding(ctx, ubdeID) - require.NoError(t, err) - require.False(t, found) - - bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - - // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the - // unbondingDelegation has not been put on hold - require.True(sdk.IntEq(t, bondedAmt2, bondedAmt3)) - require.True(sdk.IntEq(t, notBondedAmt2, notBondedAmt3)) - - // TRY TO COMPLETE UNBONDING - // will not work yet, unbonding will be put on hold - ctx = ctx.WithBlockTime(completionTime) - _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) - require.NoError(t, err) - - bondedAmt4 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt4 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - - // Bonded and unbonded amounts are the same as before because the unbonding was stopped - require.True(sdk.IntEq(t, bondedAmt2, bondedAmt4)) - require.True(sdk.IntEq(t, notBondedAmt2, notBondedAmt4)) - - // COMPLETE STOPPED UNBONDING - found, err = app.StakingKeeper.CompleteStoppedUnbonding(ctx, ubdeID) - require.NoError(t, err) - require.True(t, found) - - // Check that the unbonding was finally completed - bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - - require.True(sdk.IntEq(t, bondedAmt2, bondedAmt5)) - // Not bonded amount back to what it was originaly - require.True(sdk.IntEq(t, notBondedAmt2.SubRaw(1), notBondedAmt5)) -} - //// test undelegating self delegation from a validator pushing it below MinSelfDelegation //// shift it from the bonded to unbonding state and jailed func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { @@ -744,7 +616,7 @@ func TestGetRedelegationsFromSrcValidator(t *testing.T) { rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0), sdk.NewInt(5), - sdk.NewDec(5)) + sdk.NewDec(5), false, 1) // set and retrieve a record app.StakingKeeper.SetRedelegation(ctx, rd) @@ -771,7 +643,7 @@ func TestRedelegation(t *testing.T) { rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), - sdk.NewDec(5)) + sdk.NewDec(5), false, 1) // test shouldn't have and redelegations has := app.StakingKeeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1]) diff --git a/x/staking/keeper/hooks.go b/x/staking/keeper/hooks.go index 7340f8222672..ae0c98401b7d 100644 --- a/x/staking/keeper/hooks.go +++ b/x/staking/keeper/hooks.go @@ -1,8 +1,6 @@ package keeper import ( - "time" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -81,18 +79,8 @@ func (k Keeper) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, } // This is called when an UnbondingDelegationEntry is first created -func (k Keeper) UnbondingDelegationEntryCreated(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, completionTime time.Time, balance sdk.Int, id uint64) { - if k.hooks != nil { - k.hooks.UnbondingDelegationEntryCreated(ctx, delegatorAddr, validatorAddr, creationHeight, completionTime, balance, id) - } -} - -// This is called before completing unbonding of a UnbondingDelegationEntry. returning true -// will stop the unbonding. -func (k Keeper) BeforeUnbondingDelegationEntryComplete(ctx sdk.Context, id uint64) bool { +func (k Keeper) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { if k.hooks != nil { - return k.hooks.BeforeUnbondingDelegationEntryComplete(ctx, id) + k.hooks.AfterUnbondingInitiated(ctx, id) } - return false } diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index 5ff081e2a3b8..fe5aa110d8a8 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -512,6 +512,8 @@ func RedelegationsToRedelegationResponses( entry.SharesDst, entry.InitialBalance, val.TokensFromShares(entry.SharesDst).TruncateInt(), + entry.UnbondingOnHold, + entry.UnbondingId, ) } diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 79c72d4013ba..25af167b25d1 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -176,7 +176,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.UnbondingOnHold { // Unbonding delegation no longer eligible for slashing, skip it continue } @@ -229,7 +229,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.UnbondingOnHold { // Redelegation no longer eligible for slashing, skip it continue } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 9c1ff8961359..04509606885d 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -80,7 +80,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), sdk.NewInt(10), app.StakingKeeper.IncrementUnbondingDelegationEntryId(ctx)) + time.Unix(5, 0), sdk.NewInt(10), app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) @@ -131,7 +131,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), sdk.NewInt(10), sdk.NewDec(10)) + time.Unix(5, 0), sdk.NewInt(10), sdk.NewDec(10), false, 1) app.StakingKeeper.SetRedelegation(ctx, rd) @@ -264,7 +264,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, app.StakingKeeper.IncrementUnbondingDelegationEntryId(ctx)) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) // slash validator for the first time @@ -390,7 +390,7 @@ func TestSlashWithRedelegation(t *testing.T) { // set a redelegation rdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, - time.Unix(0, 0), rdTokens, rdTokens.ToDec()) + time.Unix(0, 0), rdTokens, rdTokens.ToDec(), false, 1) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation @@ -544,7 +544,7 @@ func TestSlashBoth(t *testing.T) { rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, - rdATokens.ToDec()) + rdATokens.ToDec(), false, 1) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation @@ -555,7 +555,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens, app.StakingKeeper.IncrementUnbondingDelegationEntryId(ctx)) + time.Unix(0, 0), ubdATokens, app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubdA) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go new file mode 100644 index 000000000000..a52f3f55bcdc --- /dev/null +++ b/x/staking/keeper/unbonding.go @@ -0,0 +1,418 @@ +package keeper + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Increments and returns a unique ID for an UnbondingDelegationEntry +func (k Keeper) IncrementUnbondingId(ctx sdk.Context) (unbondingDelegationEntryId uint64) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.UnbondingDelegationEntryIdKey) + + if bz == nil { + unbondingDelegationEntryId = 0 + } else { + unbondingDelegationEntryId = binary.BigEndian.Uint64(bz) + } + + unbondingDelegationEntryId = unbondingDelegationEntryId + 1 + + // Convert back into bytes for storage + bz = make([]byte, 8) + binary.BigEndian.PutUint64(bz, unbondingDelegationEntryId) + + store.Set(types.UnbondingDelegationEntryIdKey, bz) + + return unbondingDelegationEntryId +} + +// Remove a ValidatorByUnbondingIndex +func (k Keeper) DeleteUnbondingIndex(ctx sdk.Context, id uint64) { + store := ctx.KVStore(k.storeKey) + + indexKey := types.GetUnbondingIndexKey(id) + + store.Delete(indexKey) +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetUnbondingDelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (ubd types.UnbondingDelegation, found bool) { + store := ctx.KVStore(k.storeKey) + indexKey := types.GetUnbondingIndexKey(id) + ubdeKey := store.Get(indexKey) + + if ubdeKey == nil { + return types.UnbondingDelegation{}, false + } + + value := store.Get(ubdeKey) + + if value == nil { + return types.UnbondingDelegation{}, false + } + + ubd, err := types.UnmarshalUBD(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.UnbondingDelegation{}, false + } + + return ubd, true +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetRedelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (red types.Redelegation, found bool) { + store := ctx.KVStore(k.storeKey) + indexKey := types.GetUnbondingIndexKey(id) + redKey := store.Get(indexKey) + + if redKey == nil { + return types.Redelegation{}, false + } + + value := store.Get(redKey) + + if value == nil { + return types.Redelegation{}, false + } + + red, err := types.UnmarshalRED(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Redelegation{}, false + } + + return red, true +} + +// return the validator that is unbonding with a certain unbonding op ID +func (k Keeper) GetValidatorByUnbondingId( + ctx sdk.Context, id uint64, +) (val types.Validator, found bool) { + store := ctx.KVStore(k.storeKey) + indexKey := types.GetUnbondingIndexKey(id) + valKey := store.Get(indexKey) + + if valKey == nil { + return types.Validator{}, false + } + + value := store.Get(valKey) + + if value == nil { + return types.Validator{}, false + } + + val, err := types.UnmarshalValidator(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Validator{}, false + } + + return val, true +} + +// Set an index to look up an UnbondingDelegation by the unbondingId of an UnbondingDelegationEntry that it contains +func (k Keeper) SetUnbondingDelegationByUnbondingIndex(ctx sdk.Context, ubd types.UnbondingDelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + panic(err) + } + + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + if err != nil { + panic(err) + } + + indexKey := types.GetUnbondingIndexKey(id) + ubdKey := types.GetUBDKey(delAddr, valAddr) + + store.Set(indexKey, ubdKey) +} + +// Set an index to look up an Redelegation by the unbondingId of an RedelegationEntry that it contains +func (k Keeper) SetRedelegationByUnbondingIndex(ctx sdk.Context, red types.Redelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(red.DelegatorAddress) + if err != nil { + panic(err) + } + + valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + if err != nil { + panic(err) + } + + valDstAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + if err != nil { + panic(err) + } + + indexKey := types.GetUnbondingIndexKey(id) + redKey := types.GetREDKey(delAddr, valSrcAddr, valDstAddr) + + store.Set(indexKey, redKey) +} + +// Set an index to look up a Validator by the unbondingId corresponding to its current unbonding +func (k Keeper) SetValidatorByUnbondingIndex(ctx sdk.Context, val types.Validator, id uint64) { + store := ctx.KVStore(k.storeKey) + + valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + if err != nil { + panic(err) + } + + indexKey := types.GetUnbondingIndexKey(id) + valKey := types.GetValidatorKey(valAddr) + + store.Set(indexKey, valKey) +} + +// unbondingDelegationEntryArrayIndex and redelegationEntryArrayIndex are utilities to find +// at which position in the Entries array the entry with a given id is +// ---------------------------------------------------------------------------------------- + +func unbondingDelegationEntryArrayIndex(ubd types.UnbondingDelegation, id uint64) (index int, found bool) { + for i, entry := range ubd.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +func redelegationEntryArrayIndex(red types.Redelegation, id uint64) (index int, found bool) { + for i, entry := range red.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +// UnbondingCanComplete allows a stopped unbonding operation such as an +// unbonding delegation, a redelegation, or a validator unbonding to complete +// ---------------------------------------------------------------------------------------- + +func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { + found, err := k.unbondingDelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + found, err = k.redelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + found, err = k.validatorUnbondingCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return false, nil + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + + if !found { + return false, nil + } + + // Check if entry is matured. + if !ubd.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If not matured, set onHold to false + ubd.Entries[i].UnbondingOnHold = false + } else { + // If matured, complete it. + delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + return false, err + } + + bondDenom := k.GetParams(ctx).BondDenom + + // track undelegation only when remaining or truncated shares are non-zero + if !ubd.Entries[i].Balance.IsZero() { + amt := sdk.NewCoin(bondDenom, ubd.Entries[i].Balance) + if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( + ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), + ); err != nil { + return false, err + } + } + + // Remove entry + ubd.RemoveEntry(int64(i)) + // Remove from the UnbondingIndex + k.DeleteUnbondingIndex(ctx, id) + } + + // set the unbonding delegation or remove it if there are no more entries + if len(ubd.Entries) == 0 { + k.RemoveUnbondingDelegation(ctx, ubd) + } else { + k.SetUnbondingDelegation(ctx, ubd) + } + + // Successfully completed unbonding + return true, nil +} + +func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return false, nil + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return false, nil + } + + if !red.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If not matured, set onHold to false + red.Entries[i].UnbondingOnHold = false + } else { + // If matured, complete it. + // Remove entry + red.RemoveEntry(int64(i)) + // Remove from the Unbonding index + k.DeleteUnbondingIndex(ctx, id) + } + + // set the redelegation or remove it if there are no more entries + if len(red.Entries) == 0 { + k.RemoveRedelegation(ctx, red) + } else { + k.SetRedelegation(ctx, red) + } + + // Successfully completed unbonding + return true, nil +} + +func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return false, nil + } + + if !val.IsMature(ctx.BlockTime(), ctx.BlockHeight()) { + val.UnbondingOnHold = false + k.SetValidator(ctx, val) + } else { + // If unbonding is mature complete it + val = k.UnbondingToUnbonded(ctx, val) + if val.GetDelegatorShares().IsZero() { + k.RemoveValidator(ctx, val.GetOperator()) + } + + k.DeleteUnbondingIndex(ctx, id) + } + + return true, nil +} + +// PutUnbondingOnHold allows an external module to stop an unbonding operation such as an +// unbonding delegation, a redelegation, or a validator unbonding +// ---------------------------------------------------------------------------------------- +func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { + found := k.putUnbondingDelegationEntryOnHold(ctx, id) + if found { + return nil + } + + found = k.putRedelegationEntryOnHold(ctx, id) + if found { + return nil + } + + found = k.putValidatorOnHold(ctx, id) + if found { + return nil + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) (found bool) { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return false + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + if !found { + return false + } + + ubd.Entries[i].UnbondingOnHold = true + + k.SetUnbondingDelegation(ctx, ubd) + + return true +} + +func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) (found bool) { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return false + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return false + } + + red.Entries[i].UnbondingOnHold = true + + k.SetRedelegation(ctx, red) + + return true +} + +func (k Keeper) putValidatorOnHold(ctx sdk.Context, id uint64) (found bool) { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return false + } + + val.UnbondingOnHold = true + + k.SetValidator(ctx, val) + + return true +} diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..e652c4c2b1c9 --- /dev/null +++ b/x/staking/keeper/unbonding_test.go @@ -0,0 +1,328 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" +) + +type MockStakingHooks struct { + types.StakingHooksTemplate + afterUnbondingInitiated func(uint64) +} + +func (h MockStakingHooks) AfterUnbondingInitiated(_ sdk.Context, id uint64) { + h.afterUnbondingInitiated(id) +} + +func setup(t *testing.T, hookCalled *bool, ubdeID *uint64) ( + app *simapp.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, +) { + _, app, ctx = createTestInput() + + stakingKeeper := keeper.NewKeeper( + app.AppCodec(), + app.GetKey(types.StoreKey), + app.GetKey(types.StoreKey), + app.AccountKeeper, + app.BankKeeper, + app.GetSubspace(types.ModuleName), + ) + + myHooks := MockStakingHooks{ + afterUnbondingInitiated: func(id uint64) { + *hookCalled = true + // save id + *ubdeID = id + // call back to stop unbonding + err := app.StakingKeeper.PutUnbondingOnHold(ctx, id) + require.NoError(t, err) + }, + } + + stakingKeeper.SetHooks( + types.NewMultiStakingHooks(myHooks), + ) + + app.StakingKeeper = stakingKeeper + + addrDels = simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000)) + addrVals = simapp.ConvertAddrsToValAddrs(addrDels) + + valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) + + bondDenom = app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // Create a validator + validator1 := teststaking.NewValidator(t, addrVals[0], PKs[0]) + validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares1.RoundInt()) + + validator1 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator1, true) + require.True(sdk.IntEq(t, valTokens, validator1.BondedTokens())) + require.True(t, validator1.IsBonded()) + + // Create a delegator + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + app.StakingKeeper.SetDelegation(ctx, delegation) + + // Create a validator to redelegate to + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) + validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares2.RoundInt()) + + validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) + require.Equal(t, types.Bonded, validator2.Status) + require.True(t, validator2.IsBonded()) + + return +} + +func doUnbondingDelegation( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time, bondedAmt sdk.Int, notBondedAmt sdk.Int) { + // UNDELEGATE + // Save original bonded and unbonded amounts + bondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + var err error + completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + require.NoError(t, err) + + // check that the unbonding actually happened + bondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + // Bonded amount is less + require.True(sdk.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) + // Unbonded amount is more + require.True(sdk.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) + + // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares + unbondingDelegations := app.StakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) + require.Equal(t, sdk.NewInt(1), unbondingDelegations[0].Entries[0].Balance) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime, bondedAmt2, notBondedAmt2 +} + +func doRedelegation( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time) { + var err error + completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) + require.NoError(t, err) + + // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime +} + +func doValidatorUnbonding( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (validator types.Validator) { + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + // Check that status is bonded + require.Equal(t, types.BondStatus(3), validator.Status) + + validator, err := app.StakingKeeper.BeginUnbondingValidator(ctx, validator) + require.NoError(t, err) + + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // check that our hook was called + require.True(t, *hookCalled) + + return validator +} + +func TestValidatorUnbondingOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + validator := doValidatorUnbonding(t, app, ctx, addrDels, addrVals, &hookCalled) + + completionTime := validator.UnbondingTime + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Check that unbonding is not complete + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + // Check that status is unbonded + require.Equal(t, types.BondStatus(1), validator.Status) +} + +func TestValidatorUnbondingOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + validator := doValidatorUnbonding(t, app, ctx, addrDels, addrVals, &hookCalled) + + completionTime := validator.UnbondingTime + completionHeight := validator.UnbondingHeight + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is not complete + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + // Check that status is unbonded + require.Equal(t, types.BondStatus(1), validator.Status) +} + +func TestRedelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestRedelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestUnbondingDelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} + +func TestUnbondingDelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index eaa5ab718636..70543543626b 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -247,7 +247,7 @@ func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) (t panic(fmt.Sprintf("bad state transition bondedToUnbonding, validator: %v\n", validator)) } - return k.beginUnbondingValidator(ctx, validator) + return k.BeginUnbondingValidator(ctx, validator) } func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { @@ -272,7 +272,7 @@ func (k Keeper) UnbondingToUnbonded(ctx sdk.Context, validator types.Validator) panic(fmt.Sprintf("bad state transition unbondingToBonded, validator: %v\n", validator)) } - return k.completeUnbondingValidator(ctx, validator) + return k.CompleteUnbondingValidator(ctx, validator) } // send a validator to jail @@ -322,7 +322,7 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) (types } // perform all the store operations for when a validator begins unbonding -func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { +func (k Keeper) BeginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { params := k.GetParams(ctx) // delete the validator by power index, as the key will change @@ -353,11 +353,16 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat } k.AfterValidatorBeginUnbonding(ctx, consAddr, validator.GetOperator()) + id := k.IncrementUnbondingId(ctx) + k.SetValidatorByUnbondingIndex(ctx, validator, id) + + k.AfterUnbondingInitiated(ctx, id) + return validator, nil } // perform all the store operations for when a validator status becomes unbonded -func (k Keeper) completeUnbondingValidator(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) CompleteUnbondingValidator(ctx sdk.Context, validator types.Validator) types.Validator { validator = validator.UpdateStatus(types.Unbonded) k.SetValidator(ctx, validator) diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 99c878f849a8..7a32f59b693e 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -434,10 +434,11 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { if !val.IsUnbonding() { panic("unexpected validator in unbonding queue; status was not unbonding") } - - val = k.UnbondingToUnbonded(ctx, val) - if val.GetDelegatorShares().IsZero() { - k.RemoveValidator(ctx, val.GetOperator()) + if !val.UnbondingOnHold { + val = k.UnbondingToUnbonded(ctx, val) + if val.GetDelegatorShares().IsZero() { + k.RemoveValidator(ctx, val.GetOperator()) + } } } diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 6c8d890b3fb3..2e8b578e789c 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -40,7 +40,7 @@ func TestDecodeStore(t *testing.T) { require.NoError(t, err) del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec()) ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt(), 1) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec()) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec(), false, 0) kvPairs := kv.Pairs{ Pairs: []kv.Pair{ diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index bf69011decea..589bb49a5697 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -96,7 +96,7 @@ func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, CompletionTime: completionTime, InitialBalance: balance, Balance: balance, - Id: id, + UnbondingId: id, } } @@ -207,12 +207,14 @@ func (ubds UnbondingDelegations) String() (out string) { return strings.TrimSpace(out) } -func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int, sharesDst sdk.Dec) RedelegationEntry { +func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int, sharesDst sdk.Dec, onHold bool, id uint64) RedelegationEntry { return RedelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - SharesDst: sharesDst, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + SharesDst: sharesDst, + UnbondingOnHold: onHold, + UnbondingId: id, } } @@ -230,21 +232,21 @@ func (e RedelegationEntry) IsMature(currentTime time.Time) bool { //nolint:interfacer func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, + creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, onHold bool, unbondingId uint64, ) Redelegation { return Redelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorSrcAddress: validatorSrcAddr.String(), ValidatorDstAddress: validatorDstAddr.String(), Entries: []RedelegationEntry{ - NewRedelegationEntry(creationHeight, minTime, balance, sharesDst), + NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, onHold, unbondingId), }, } } // AddEntry - append entry to the unbonding delegation -func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec) { - entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst) +func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, onHold bool, unbondingId uint64) { + entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, onHold, unbondingId) red.Entries = append(red.Entries, entry) } @@ -370,9 +372,9 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance sdk.Int) RedelegationEntryResponse { + creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance sdk.Int, onHold bool, id uint64) RedelegationEntryResponse { return RedelegationEntryResponse{ - RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst), + RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, onHold, id), Balance: balance, } } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 456a57ad52cb..fa42b6652a5d 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -56,10 +56,10 @@ func TestUnbondingDelegationString(t *testing.T) { func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(0)) + sdk.NewDec(0), false, 1) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(0)) + sdk.NewDec(0), false, 2) ok := r1.String() == r2.String() require.True(t, ok) @@ -74,7 +74,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(10)) + sdk.NewDec(10), false, 1) require.NotEmpty(t, r.String()) } @@ -111,8 +111,8 @@ func TestDelegationResponses(t *testing.T) { func TestRedelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() entries := []types.RedelegationEntryResponse{ - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5), false, 0), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5), false, 0), } rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index 777941e53cfe..b08b115020b0 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -49,4 +49,5 @@ var ( ErrInvalidHistoricalInfo = sdkerrors.Register(ModuleName, 37, "invalid historical info") ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") + ErrUnbondingNotFound = sdkerrors.Register(ModuleName, 40, "unbonding operation not found") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index a81f456288b3..fea9259ddd52 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -1,8 +1,6 @@ package types import ( - "time" - sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -103,7 +101,5 @@ type StakingHooks interface { BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) // Must be called when a delegation is removed AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) - UnbondingDelegationEntryCreated(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, completionTime time.Time, balance sdk.Int, id uint64) - BeforeUnbondingDelegationEntryComplete(ctx sdk.Context, id uint64) bool + AfterUnbondingInitiated(ctx sdk.Context, id uint64) } diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index 5ef89c7692d9..13a7442bf19a 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -1,8 +1,6 @@ package types import ( - "time" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -63,17 +61,8 @@ func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.V h[i].BeforeValidatorSlashed(ctx, valAddr, fraction) } } -func (h MultiStakingHooks) UnbondingDelegationEntryCreated(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, completionTime time.Time, balance sdk.Int, id uint64) { - for i := range h { - h[i].UnbondingDelegationEntryCreated(ctx, delegatorAddr, validatorAddr, creationHeight, completionTime, balance, id) - } -} -func (h MultiStakingHooks) BeforeUnbondingDelegationEntryComplete(ctx sdk.Context, id uint64) bool { +func (h MultiStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { for i := range h { - if h[i].BeforeUnbondingDelegationEntryComplete(ctx, id) { - return true - } + h[i].AfterUnbondingInitiated(ctx, id) } - return false } diff --git a/x/staking/types/hooks_template.go b/x/staking/types/hooks_template.go index daf806da5b83..ba002554fc1e 100644 --- a/x/staking/types/hooks_template.go +++ b/x/staking/types/hooks_template.go @@ -1,8 +1,6 @@ package types import ( - "time" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -30,8 +28,5 @@ func (h StakingHooksTemplate) AfterDelegationModified(ctx sdk.Context, delAddr s } func (h StakingHooksTemplate) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { } -func (h StakingHooksTemplate) UnbondingDelegationEntryCreated(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, creationHeight int64, completionTime time.Time, balance sdk.Int, id uint64) { -} -func (h StakingHooksTemplate) BeforeUnbondingDelegationEntryComplete(ctx sdk.Context, id uint64) bool { - return false +func (h StakingHooksTemplate) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { } diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index bd1039a69faa..2047aeda7a50 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -46,8 +46,8 @@ var ( RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator - UnbondingDelegationEntryIdKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingDelegationEntries - UnbondingDelegationEntryIndexKey = []byte{0x38} // prefix for an index for looking up UnbondingDelegations by UnbondingDelegationEntry ID + UnbondingDelegationEntryIdKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingDelegationEntries + UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up UnbondingDelegations by UnbondingDelegationEntry ID UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue @@ -58,10 +58,10 @@ var ( ) // Returns a key for the index for looking up UnbondingDelegations by the UnbondingDelegationEntries they contain -func GetUnbondingDelegationEntryIndexKey(id uint64) []byte { +func GetUnbondingIndexKey(id uint64) []byte { bz := make([]byte, 8) binary.BigEndian.PutUint64(bz, id) - return append(UnbondingDelegationEntryIndexKey, bz...) + return append(UnbondingIndexKey, bz...) } // GetValidatorKey creates the key for the validator with address diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 1faee07b58fb..4683a3604028 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -334,6 +334,8 @@ type Validator struct { Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` // min_self_delegation is the validator's self declared minimum self delegation. MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` + // True if this validator's unbonding has been stopped by an external module + UnbondingOnHold bool `protobuf:"varint,12,opt,name=unbonding_on_hold,json=unbondingOnHold,proto3" json:"unbonding_on_hold,omitempty"` } func (m *Validator) Reset() { *m = Validator{} } @@ -682,9 +684,9 @@ type UnbondingDelegationEntry struct { // balance defines the tokens to receive at completion. Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` // Incrementing id that uniquely identifies this entry - Id uint64 `protobuf:"varint,5,opt,name=id,proto3" json:"id,omitempty"` + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` // True if this entry's unbonding has been stopped by an external module - OnHold bool `protobuf:"varint,6,opt,name=on_hold,json=onHold,proto3" json:"on_hold,omitempty"` + UnbondingOnHold bool `protobuf:"varint,6,opt,name=unbonding_on_hold,json=unbondingOnHold,proto3" json:"unbonding_on_hold,omitempty"` } func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } @@ -733,16 +735,16 @@ func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { return time.Time{} } -func (m *UnbondingDelegationEntry) GetId() uint64 { +func (m *UnbondingDelegationEntry) GetUnbondingId() uint64 { if m != nil { - return m.Id + return m.UnbondingId } return 0 } -func (m *UnbondingDelegationEntry) GetOnHold() bool { +func (m *UnbondingDelegationEntry) GetUnbondingOnHold() bool { if m != nil { - return m.OnHold + return m.UnbondingOnHold } return false } @@ -757,6 +759,10 @@ type RedelegationEntry struct { InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // True if this entry's unbonding has been stopped by an external module + UnbondingOnHold bool `protobuf:"varint,6,opt,name=unbonding_on_hold,json=unbondingOnHold,proto3" json:"unbonding_on_hold,omitempty"` } func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } @@ -805,6 +811,20 @@ func (m *RedelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *RedelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *RedelegationEntry) GetUnbondingOnHold() bool { + if m != nil { + return m.UnbondingOnHold + } + return false +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -1156,122 +1176,123 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1828 bytes of a gzipped FileDescriptorProto + // 1849 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0x3b, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xe3, 0x98, 0xc1, 0xed, 0x6d, - 0x56, 0x4b, 0x40, 0xbb, 0x0e, 0x93, 0x45, 0x8b, 0xc8, 0x05, 0xc6, 0x71, 0x86, 0x58, 0xbb, 0x0c, - 0xa1, 0x93, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, - 0x58, 0xda, 0x03, 0xc7, 0x65, 0x10, 0xd2, 0x72, 0xdb, 0xcb, 0x48, 0x23, 0xed, 0x75, 0x25, 0x2e, - 0x08, 0x71, 0xe3, 0xba, 0xc0, 0x65, 0xb8, 0x21, 0x84, 0x0c, 0x9a, 0xb9, 0x20, 0x4e, 0xc8, 0x07, - 0xc4, 0x0d, 0x54, 0x3f, 0xfd, 0x93, 0x76, 0x3c, 0x33, 0x1e, 0xed, 0x61, 0x25, 0xf6, 0x92, 0xb8, - 0x5e, 0xbd, 0xf7, 0xbd, 0x7a, 0xbf, 0xf5, 0xaa, 0xe1, 0x15, 0xcb, 0xa7, 0xae, 0x4f, 0xb7, 0x28, - 0xc3, 0x67, 0x8e, 0xd7, 0xdb, 0xba, 0x77, 0xb3, 0x4b, 0x18, 0xbe, 0x19, 0xae, 0x1b, 0x83, 0xc0, - 0x67, 0x3e, 0xba, 0x26, 0xb9, 0x1a, 0x21, 0x55, 0x71, 0x55, 0xd7, 0x7b, 0x7e, 0xcf, 0x17, 0x2c, - 0x5b, 0xfc, 0x97, 0xe4, 0xae, 0x6e, 0xf4, 0x7c, 0xbf, 0xd7, 0x27, 0x5b, 0x62, 0xd5, 0x1d, 0x9e, - 0x6c, 0x61, 0x6f, 0xa4, 0xb6, 0x6a, 0xe9, 0x2d, 0x7b, 0x18, 0x60, 0xe6, 0xf8, 0x9e, 0xda, 0xd7, - 0xd3, 0xfb, 0xcc, 0x71, 0x09, 0x65, 0xd8, 0x1d, 0x84, 0xd8, 0xf2, 0x24, 0x1d, 0xa9, 0x54, 0x1d, - 0x4b, 0x61, 0x2b, 0x53, 0xba, 0x98, 0x92, 0xc8, 0x0e, 0xcb, 0x77, 0x42, 0xec, 0x1b, 0x8c, 0x78, - 0x36, 0x09, 0x5c, 0xc7, 0x63, 0x5b, 0x6c, 0x34, 0x20, 0x54, 0xfe, 0x95, 0xbb, 0xc6, 0xcf, 0x34, - 0x58, 0xd9, 0x77, 0x28, 0xf3, 0x03, 0xc7, 0xc2, 0xfd, 0xb6, 0x77, 0xe2, 0xa3, 0x37, 0x21, 0x7f, - 0x4a, 0xb0, 0x4d, 0x82, 0x8a, 0x56, 0xd7, 0x36, 0x4b, 0xdb, 0x95, 0x46, 0x8c, 0xd0, 0x90, 0xb2, - 0xfb, 0x62, 0xbf, 0x99, 0xfb, 0x78, 0xac, 0x67, 0x4c, 0xc5, 0x8d, 0xbe, 0x01, 0xf9, 0x7b, 0xb8, - 0x4f, 0x09, 0xab, 0x64, 0xeb, 0x0b, 0x9b, 0xa5, 0xed, 0x97, 0x1b, 0x97, 0xbb, 0xaf, 0x71, 0x8c, - 0xfb, 0x8e, 0x8d, 0x99, 0x1f, 0x01, 0x48, 0x31, 0xe3, 0x57, 0x59, 0x28, 0xef, 0xfa, 0xae, 0xeb, - 0x50, 0xea, 0xf8, 0x9e, 0x89, 0x19, 0xa1, 0xa8, 0x09, 0xb9, 0x00, 0x33, 0x22, 0x8e, 0x52, 0x6c, - 0x36, 0x38, 0xff, 0x5f, 0xc6, 0xfa, 0xab, 0x3d, 0x87, 0x9d, 0x0e, 0xbb, 0x0d, 0xcb, 0x77, 0x95, - 0x33, 0xd4, 0xbf, 0xd7, 0xa9, 0x7d, 0xa6, 0xec, 0x6b, 0x11, 0xcb, 0x14, 0xb2, 0xe8, 0x1d, 0x28, - 0xb8, 0xf8, 0xbc, 0x23, 0x70, 0xb2, 0x02, 0xe7, 0xd6, 0x7c, 0x38, 0x93, 0xb1, 0x5e, 0x1e, 0x61, - 0xb7, 0xbf, 0x63, 0x84, 0x38, 0x86, 0xb9, 0xe8, 0xe2, 0x73, 0x7e, 0x44, 0x34, 0x80, 0x32, 0xa7, - 0x5a, 0xa7, 0xd8, 0xeb, 0x11, 0xa9, 0x64, 0x41, 0x28, 0xd9, 0x9f, 0x5b, 0xc9, 0xb5, 0x58, 0x49, - 0x02, 0xce, 0x30, 0x97, 0x5d, 0x7c, 0xbe, 0x2b, 0x08, 0x5c, 0xe3, 0x4e, 0xe1, 0x83, 0x87, 0x7a, - 0xe6, 0x1f, 0x0f, 0x75, 0xcd, 0xf8, 0x93, 0x06, 0x10, 0x7b, 0x0c, 0xbd, 0x03, 0xab, 0x56, 0xb4, - 0x12, 0xb2, 0x54, 0xc5, 0xf0, 0x8b, 0xb3, 0x62, 0x91, 0xf2, 0x77, 0xb3, 0xc0, 0x0f, 0xfd, 0x68, - 0xac, 0x6b, 0x66, 0xd9, 0x4a, 0x85, 0xe2, 0x07, 0x50, 0x1a, 0x0e, 0x6c, 0xcc, 0x48, 0x87, 0x67, - 0xa7, 0xf0, 0x64, 0x69, 0xbb, 0xda, 0x90, 0xa9, 0xdb, 0x08, 0x53, 0xb7, 0x71, 0x14, 0xa6, 0x6e, - 0xb3, 0xc6, 0xb1, 0x26, 0x63, 0x1d, 0x49, 0xb3, 0x12, 0xc2, 0xc6, 0xfb, 0x7f, 0xd3, 0x35, 0x13, - 0x24, 0x85, 0x0b, 0x24, 0x6c, 0xfa, 0xbd, 0x06, 0xa5, 0x16, 0xa1, 0x56, 0xe0, 0x0c, 0x78, 0x85, - 0xa0, 0x0a, 0x2c, 0xba, 0xbe, 0xe7, 0x9c, 0xa9, 0x7c, 0x2c, 0x9a, 0xe1, 0x12, 0x55, 0xa1, 0xe0, - 0xd8, 0xc4, 0x63, 0x0e, 0x1b, 0xc9, 0xb8, 0x9a, 0xd1, 0x9a, 0x4b, 0xfd, 0x84, 0x74, 0xa9, 0x13, - 0x46, 0xc3, 0x0c, 0x97, 0xe8, 0x36, 0xac, 0x52, 0x62, 0x0d, 0x03, 0x87, 0x8d, 0x3a, 0x96, 0xef, - 0x31, 0x6c, 0xb1, 0x4a, 0x4e, 0x04, 0xec, 0x73, 0x93, 0xb1, 0x7e, 0x5d, 0x9e, 0x35, 0xcd, 0x61, - 0x98, 0xe5, 0x90, 0xb4, 0x2b, 0x29, 0x5c, 0x83, 0x4d, 0x18, 0x76, 0xfa, 0xb4, 0xf2, 0x92, 0xd4, - 0xa0, 0x96, 0x09, 0x5b, 0x3e, 0x5a, 0x84, 0x62, 0x94, 0xed, 0x5c, 0xb3, 0x3f, 0x20, 0x01, 0xff, - 0xdd, 0xc1, 0xb6, 0x1d, 0x10, 0x4a, 0x55, 0x5e, 0x27, 0x34, 0xa7, 0x39, 0x0c, 0xb3, 0x1c, 0x92, - 0x6e, 0x49, 0x0a, 0x62, 0x3c, 0xcc, 0x1e, 0x25, 0x1e, 0x1d, 0xd2, 0xce, 0x60, 0xd8, 0x3d, 0x23, - 0x23, 0x15, 0x8d, 0xf5, 0xa9, 0x68, 0xdc, 0xf2, 0x46, 0xcd, 0x37, 0x62, 0xf4, 0xb4, 0x9c, 0xf1, - 0x87, 0x5f, 0xbf, 0xbe, 0xae, 0x52, 0xc3, 0x0a, 0x46, 0x03, 0xe6, 0x37, 0x0e, 0x86, 0xdd, 0xb7, - 0xc8, 0x88, 0x87, 0x5f, 0xb1, 0x1e, 0x08, 0x4e, 0x74, 0x0d, 0xf2, 0x3f, 0xc2, 0x4e, 0x9f, 0xd8, - 0xc2, 0xa1, 0x05, 0x53, 0xad, 0xd0, 0x0e, 0xe4, 0x29, 0xc3, 0x6c, 0x48, 0x85, 0x17, 0x57, 0xb6, - 0x8d, 0x59, 0xa9, 0xd6, 0xf4, 0x3d, 0xfb, 0x50, 0x70, 0x9a, 0x4a, 0x02, 0xdd, 0x86, 0x3c, 0xf3, - 0xcf, 0x88, 0xa7, 0x5c, 0x38, 0x57, 0x7d, 0xb7, 0x3d, 0x66, 0x2a, 0x69, 0xee, 0x11, 0x9b, 0xf4, - 0x49, 0x4f, 0x38, 0x8e, 0x9e, 0xe2, 0x80, 0xd0, 0x4a, 0x5e, 0x20, 0xb6, 0xe7, 0x2e, 0x42, 0xe5, - 0xa9, 0x34, 0x9e, 0x61, 0x96, 0x23, 0xd2, 0xa1, 0xa0, 0xa0, 0xb7, 0xa0, 0x64, 0xc7, 0x89, 0x5a, - 0x59, 0x14, 0x21, 0xf8, 0xc2, 0x2c, 0xf3, 0x13, 0x39, 0xad, 0xfa, 0x5e, 0x52, 0x9a, 0x27, 0xc7, - 0xd0, 0xeb, 0xfa, 0x9e, 0xed, 0x78, 0xbd, 0xce, 0x29, 0x71, 0x7a, 0xa7, 0xac, 0x52, 0xa8, 0x6b, - 0x9b, 0x0b, 0xc9, 0xe4, 0x48, 0x73, 0x18, 0x66, 0x39, 0x22, 0xed, 0x0b, 0x0a, 0xb2, 0x61, 0x25, - 0xe6, 0x12, 0x85, 0x5a, 0x7c, 0x66, 0xa1, 0xbe, 0xac, 0x0a, 0xf5, 0x6a, 0x5a, 0x4b, 0x5c, 0xab, - 0xcb, 0x11, 0x91, 0x8b, 0xa1, 0x7d, 0x80, 0xb8, 0x3d, 0x54, 0x40, 0x68, 0x30, 0x9e, 0xdd, 0x63, - 0x94, 0xe1, 0x09, 0x59, 0xf4, 0x2e, 0x5c, 0x71, 0x1d, 0xaf, 0x43, 0x49, 0xff, 0xa4, 0xa3, 0x1c, - 0xcc, 0x21, 0x4b, 0x22, 0x7a, 0x6f, 0xcf, 0x97, 0x0f, 0x93, 0xb1, 0x5e, 0x55, 0x2d, 0x74, 0x1a, - 0xd2, 0x30, 0xd7, 0x5c, 0xc7, 0x3b, 0x24, 0xfd, 0x93, 0x56, 0x44, 0xdb, 0x59, 0x7a, 0xef, 0xa1, - 0x9e, 0x51, 0xe5, 0x9a, 0x31, 0xde, 0x84, 0xa5, 0x63, 0xdc, 0x57, 0x65, 0x46, 0x28, 0xba, 0x01, - 0x45, 0x1c, 0x2e, 0x2a, 0x5a, 0x7d, 0x61, 0xb3, 0x68, 0xc6, 0x04, 0x59, 0xe6, 0x3f, 0xfd, 0x6b, - 0x5d, 0x33, 0x3e, 0xd2, 0x20, 0xdf, 0x3a, 0x3e, 0xc0, 0x4e, 0x80, 0xda, 0xb0, 0x16, 0x67, 0xce, - 0xc5, 0x22, 0xbf, 0x31, 0x19, 0xeb, 0x95, 0x74, 0x72, 0x45, 0x55, 0x1e, 0x27, 0x70, 0x58, 0xe6, - 0x6d, 0x58, 0xbb, 0x17, 0xf6, 0x8e, 0x08, 0x2a, 0x9b, 0x86, 0x9a, 0x62, 0x31, 0xcc, 0xd5, 0x88, - 0xa6, 0xa0, 0x52, 0x66, 0xee, 0xc1, 0xa2, 0x3c, 0x2d, 0x45, 0x3b, 0xf0, 0xd2, 0x80, 0xff, 0x10, - 0xd6, 0x95, 0xb6, 0x6b, 0x33, 0x93, 0x57, 0xf0, 0xab, 0xf0, 0x49, 0x11, 0xe3, 0x97, 0x59, 0x80, - 0xd6, 0xf1, 0xf1, 0x51, 0xe0, 0x0c, 0xfa, 0x84, 0x7d, 0x92, 0x96, 0x1f, 0xc1, 0xd5, 0xd8, 0x2c, - 0x1a, 0x58, 0x29, 0xeb, 0xeb, 0x93, 0xb1, 0x7e, 0x23, 0x6d, 0x7d, 0x82, 0xcd, 0x30, 0xaf, 0x44, - 0xf4, 0xc3, 0xc0, 0xba, 0x14, 0xd5, 0xa6, 0x2c, 0x42, 0x5d, 0x98, 0x8d, 0x9a, 0x60, 0x4b, 0xa2, - 0xb6, 0x28, 0xbb, 0xdc, 0xb5, 0x87, 0x50, 0x8a, 0x5d, 0x42, 0x51, 0x0b, 0x0a, 0x4c, 0xfd, 0x56, - 0x1e, 0x36, 0x66, 0x7b, 0x38, 0x14, 0x53, 0x5e, 0x8e, 0x24, 0x8d, 0xff, 0x68, 0x00, 0x71, 0xce, - 0x7e, 0x3a, 0x53, 0x8c, 0xb7, 0x72, 0xd5, 0x78, 0x17, 0x5e, 0x68, 0x54, 0x53, 0xd2, 0x29, 0x7f, - 0xfe, 0x3c, 0x0b, 0x57, 0xee, 0x86, 0x9d, 0xe7, 0x53, 0xef, 0x83, 0x03, 0x58, 0x24, 0x1e, 0x0b, - 0x1c, 0xe1, 0x04, 0x1e, 0xed, 0xaf, 0xcc, 0x8a, 0xf6, 0x25, 0x36, 0xed, 0x79, 0x2c, 0x18, 0xa9, - 0xd8, 0x87, 0x30, 0x29, 0x6f, 0xfc, 0x76, 0x01, 0x2a, 0xb3, 0x24, 0xd1, 0x2e, 0x94, 0xad, 0x80, - 0x08, 0x42, 0x78, 0x7f, 0x68, 0xe2, 0xfe, 0xa8, 0xc6, 0x93, 0x65, 0x8a, 0xc1, 0x30, 0x57, 0x42, - 0x8a, 0xba, 0x3d, 0x7a, 0xc0, 0xc7, 0x3e, 0x9e, 0x76, 0x9c, 0xeb, 0x39, 0xe7, 0x3c, 0x43, 0x5d, - 0x1f, 0xa1, 0x92, 0x8b, 0x00, 0xf2, 0xfe, 0x58, 0x89, 0xa9, 0xe2, 0x02, 0xf9, 0x31, 0x94, 0x1d, - 0xcf, 0x61, 0x0e, 0xee, 0x77, 0xba, 0xb8, 0x8f, 0x3d, 0xeb, 0x45, 0xa6, 0x66, 0xd9, 0xf2, 0x95, - 0xda, 0x14, 0x9c, 0x61, 0xae, 0x28, 0x4a, 0x53, 0x12, 0xd0, 0x3e, 0x2c, 0x86, 0xaa, 0x72, 0x2f, - 0x34, 0x6d, 0x84, 0xe2, 0x68, 0x05, 0xb2, 0x8e, 0x2d, 0x46, 0x96, 0x9c, 0x99, 0x75, 0x6c, 0x74, - 0x1d, 0x16, 0xb9, 0x4f, 0xfd, 0xbe, 0x2d, 0xa6, 0x8e, 0x82, 0x99, 0xf7, 0xbd, 0x7d, 0xbf, 0x6f, - 0x27, 0x26, 0xc1, 0x5f, 0x2c, 0xc0, 0x9a, 0x49, 0xec, 0xcf, 0x62, 0x36, 0x5f, 0xcc, 0xbe, 0x0d, - 0x20, 0xfb, 0x02, 0xef, 0xc4, 0x2f, 0x10, 0x36, 0xde, 0x59, 0x8a, 0x12, 0xa1, 0x45, 0x59, 0x22, - 0x1e, 0xe3, 0x2c, 0x2c, 0x25, 0xe3, 0xf1, 0x7f, 0x7a, 0x7d, 0xa1, 0x76, 0xdc, 0xb2, 0x72, 0xa2, - 0x65, 0x7d, 0x69, 0x56, 0xcb, 0x9a, 0xca, 0xde, 0xa7, 0xf7, 0xaa, 0x7f, 0x67, 0x21, 0x7f, 0x80, - 0x03, 0xec, 0x52, 0x64, 0x4d, 0x8d, 0xa4, 0xf2, 0x51, 0xba, 0x31, 0x95, 0x9f, 0x2d, 0xf5, 0x59, - 0xe4, 0x19, 0x13, 0xe9, 0x07, 0x97, 0x4c, 0xa4, 0xdf, 0x84, 0x15, 0xfe, 0x6e, 0x8e, 0x6c, 0x94, - 0xde, 0x5e, 0x6e, 0x6e, 0xc4, 0x28, 0x17, 0xf7, 0xe5, 0xb3, 0x3a, 0x7a, 0x9d, 0x51, 0xf4, 0x35, - 0x28, 0x71, 0x8e, 0xb8, 0x83, 0x73, 0xf1, 0x6b, 0xf1, 0xfb, 0x35, 0xb1, 0x69, 0x98, 0xe0, 0xe2, - 0xf3, 0x3d, 0xb9, 0x40, 0x6f, 0x03, 0x3a, 0x8d, 0x3e, 0xa1, 0x74, 0x62, 0x77, 0x72, 0xf9, 0xcf, - 0x4f, 0xc6, 0xfa, 0x86, 0x94, 0x9f, 0xe6, 0x31, 0xcc, 0xb5, 0x98, 0x18, 0xa2, 0x7d, 0x15, 0x80, - 0xdb, 0xd5, 0xb1, 0x89, 0xe7, 0xbb, 0xea, 0x5d, 0x74, 0x75, 0x32, 0xd6, 0xd7, 0x24, 0x4a, 0xbc, - 0x67, 0x98, 0x45, 0xbe, 0x68, 0xf1, 0xdf, 0x89, 0xcc, 0xfe, 0x50, 0x03, 0x14, 0xdf, 0x0d, 0x26, - 0xa1, 0x03, 0xfe, 0x90, 0xe3, 0x13, 0x7b, 0x62, 0xbc, 0xd6, 0x9e, 0x3e, 0xb1, 0xc7, 0xf2, 0xe1, - 0xc4, 0x9e, 0xa8, 0x94, 0xaf, 0xc7, 0x7d, 0x34, 0xab, 0xe2, 0xa8, 0x60, 0xba, 0x98, 0x92, 0xc4, - 0xd4, 0xef, 0x84, 0xd2, 0x21, 0x7f, 0x74, 0xca, 0x8c, 0xf1, 0x47, 0x0d, 0x36, 0xa6, 0x32, 0x2a, - 0x3a, 0xec, 0x0f, 0x01, 0x05, 0x89, 0x4d, 0xe1, 0xaf, 0x91, 0x3a, 0xf4, 0xdc, 0x09, 0xba, 0x16, - 0x4c, 0xf5, 0xdd, 0x4f, 0xec, 0x2a, 0xd8, 0xc9, 0x09, 0x9f, 0xff, 0x4e, 0x83, 0xf5, 0xa4, 0xfa, - 0xc8, 0x90, 0x3b, 0xb0, 0x94, 0xd4, 0xae, 0x4c, 0x78, 0xe5, 0x79, 0x4c, 0x50, 0xa7, 0xbf, 0x20, - 0x8f, 0xbe, 0x1b, 0x97, 0xab, 0xfc, 0xc8, 0x76, 0xf3, 0xb9, 0xbd, 0x11, 0x9e, 0x29, 0x5d, 0xb6, - 0x39, 0x11, 0x8f, 0xff, 0x6a, 0x90, 0x3b, 0xf0, 0xfd, 0x3e, 0xf2, 0x61, 0xcd, 0xf3, 0x59, 0x87, - 0x67, 0x16, 0xb1, 0x3b, 0xea, 0x75, 0x2e, 0xfb, 0xe0, 0xee, 0x7c, 0x4e, 0xfa, 0xe7, 0x58, 0x9f, - 0x86, 0x32, 0xcb, 0x9e, 0xcf, 0x9a, 0x82, 0x72, 0x24, 0xdf, 0xee, 0xef, 0xc2, 0xf2, 0x45, 0x65, - 0xb2, 0x4b, 0x7e, 0x6f, 0x6e, 0x65, 0x17, 0x61, 0x26, 0x63, 0x7d, 0x3d, 0xae, 0x98, 0x88, 0x6c, - 0x98, 0x4b, 0xdd, 0x84, 0xf6, 0x9d, 0x02, 0x8f, 0xdf, 0xbf, 0x1e, 0xea, 0xda, 0x97, 0x7f, 0xa3, - 0x01, 0xc4, 0x9f, 0x28, 0xd0, 0x6b, 0x70, 0xbd, 0xf9, 0x9d, 0x3b, 0xad, 0xce, 0xe1, 0xd1, 0xad, - 0xa3, 0xbb, 0x87, 0x9d, 0xbb, 0x77, 0x0e, 0x0f, 0xf6, 0x76, 0xdb, 0xb7, 0xdb, 0x7b, 0xad, 0xd5, - 0x4c, 0xb5, 0x7c, 0xff, 0x41, 0xbd, 0x74, 0xd7, 0xa3, 0x03, 0x62, 0x39, 0x27, 0x0e, 0xb1, 0xd1, - 0xab, 0xb0, 0x7e, 0x91, 0x9b, 0xaf, 0xf6, 0x5a, 0xab, 0x5a, 0x75, 0xe9, 0xfe, 0x83, 0x7a, 0x41, - 0x0e, 0x6d, 0xc4, 0x46, 0x9b, 0x70, 0x75, 0x9a, 0xaf, 0x7d, 0xe7, 0x5b, 0xab, 0xd9, 0xea, 0xf2, - 0xfd, 0x07, 0xf5, 0x62, 0x34, 0xdd, 0x21, 0x03, 0x50, 0x92, 0x53, 0xe1, 0x2d, 0x54, 0xe1, 0xfe, - 0x83, 0x7a, 0x5e, 0x3a, 0xb0, 0x9a, 0x7b, 0xef, 0xc3, 0x5a, 0xa6, 0x79, 0xfb, 0xe3, 0xc7, 0x35, - 0xed, 0xd1, 0xe3, 0x9a, 0xf6, 0xf7, 0xc7, 0x35, 0xed, 0xfd, 0x27, 0xb5, 0xcc, 0xa3, 0x27, 0xb5, - 0xcc, 0x9f, 0x9f, 0xd4, 0x32, 0xdf, 0x7f, 0xed, 0xa9, 0xbe, 0x3b, 0x8f, 0xbe, 0x7e, 0x0b, 0x2f, - 0x76, 0xf3, 0xa2, 0x0d, 0xbf, 0xf1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x28, 0xd0, 0xbc, - 0x1c, 0x17, 0x00, 0x00, + 0xf5, 0x77, 0xdb, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xb8, 0x26, 0x33, 0xeb, 0xf8, 0x3f, 0x7f, 0xb7, + 0xa7, 0x59, 0x2d, 0x61, 0xb5, 0xeb, 0x30, 0x59, 0xb4, 0x88, 0x5c, 0x60, 0x1c, 0x67, 0x88, 0xb5, + 0xcb, 0x6c, 0xe8, 0x64, 0x82, 0x04, 0x2b, 0xac, 0x72, 0x77, 0xc5, 0x69, 0x62, 0x77, 0x9b, 0xae, + 0xf2, 0x10, 0x4b, 0x7b, 0xe0, 0xb8, 0x0c, 0x97, 0xe5, 0xb6, 0x97, 0x91, 0x46, 0xda, 0x2b, 0x12, + 0x17, 0xc4, 0x95, 0xeb, 0x02, 0x97, 0xe1, 0xb6, 0x42, 0x2b, 0x83, 0x66, 0x2e, 0x88, 0x13, 0xf2, + 0x01, 0x71, 0x03, 0xd5, 0x47, 0x7f, 0xa4, 0x1d, 0xcf, 0x8c, 0x47, 0x8b, 0xb4, 0x12, 0x5c, 0x12, + 0xd7, 0xab, 0xf7, 0x7e, 0xaf, 0xde, 0xef, 0xbd, 0x7a, 0x55, 0xd5, 0xf0, 0x8a, 0xe5, 0xd1, 0x81, + 0x47, 0xb7, 0x28, 0xc3, 0x67, 0x8e, 0xdb, 0xdb, 0xba, 0x77, 0xb3, 0x4b, 0x18, 0xbe, 0x19, 0x8c, + 0x1b, 0x43, 0xdf, 0x63, 0x1e, 0xba, 0x26, 0xb5, 0x1a, 0x81, 0x54, 0x69, 0x55, 0xd7, 0x7b, 0x5e, + 0xcf, 0x13, 0x2a, 0x5b, 0xfc, 0x97, 0xd4, 0xae, 0x6e, 0xf4, 0x3c, 0xaf, 0xd7, 0x27, 0x5b, 0x62, + 0xd4, 0x1d, 0x9d, 0x6c, 0x61, 0x77, 0xac, 0xa6, 0x6a, 0xc9, 0x29, 0x7b, 0xe4, 0x63, 0xe6, 0x78, + 0xae, 0x9a, 0xd7, 0x93, 0xf3, 0xcc, 0x19, 0x10, 0xca, 0xf0, 0x60, 0x18, 0x60, 0xcb, 0x95, 0x74, + 0xa4, 0x53, 0xb5, 0x2c, 0x85, 0xad, 0x42, 0xe9, 0x62, 0x4a, 0xc2, 0x38, 0x2c, 0xcf, 0x09, 0xb0, + 0xaf, 0x33, 0xe2, 0xda, 0xc4, 0x1f, 0x38, 0x2e, 0xdb, 0x62, 0xe3, 0x21, 0xa1, 0xf2, 0xaf, 0x9c, + 0x35, 0x7e, 0xa6, 0xc1, 0xea, 0xbe, 0x43, 0x99, 0xe7, 0x3b, 0x16, 0xee, 0xb7, 0xdd, 0x13, 0x0f, + 0xbd, 0x05, 0xb9, 0x53, 0x82, 0x6d, 0xe2, 0x57, 0xb4, 0xba, 0xb6, 0x59, 0xdc, 0xae, 0x34, 0x22, + 0x84, 0x86, 0xb4, 0xdd, 0x17, 0xf3, 0xcd, 0xec, 0x27, 0x13, 0x3d, 0x65, 0x2a, 0x6d, 0xf4, 0x4d, + 0xc8, 0xdd, 0xc3, 0x7d, 0x4a, 0x58, 0x25, 0x5d, 0xcf, 0x6c, 0x16, 0xb7, 0x6f, 0x34, 0x2e, 0xa7, + 0xaf, 0x71, 0x8c, 0xfb, 0x8e, 0x8d, 0x99, 0x17, 0x02, 0x48, 0x33, 0xe3, 0x57, 0x69, 0x28, 0xed, + 0x7a, 0x83, 0x81, 0x43, 0xa9, 0xe3, 0xb9, 0x26, 0x66, 0x84, 0xa2, 0x26, 0x64, 0x7d, 0xcc, 0x88, + 0x58, 0x4a, 0xa1, 0xd9, 0xe0, 0xfa, 0x7f, 0x9a, 0xe8, 0xaf, 0xf6, 0x1c, 0x76, 0x3a, 0xea, 0x36, + 0x2c, 0x6f, 0xa0, 0xc8, 0x50, 0xff, 0xde, 0xa0, 0xf6, 0x99, 0x8a, 0xaf, 0x45, 0x2c, 0x53, 0xd8, + 0xa2, 0xf7, 0x20, 0x3f, 0xc0, 0xe7, 0x1d, 0x81, 0x93, 0x16, 0x38, 0xb7, 0x16, 0xc3, 0x99, 0x4e, + 0xf4, 0xd2, 0x18, 0x0f, 0xfa, 0x3b, 0x46, 0x80, 0x63, 0x98, 0x4b, 0x03, 0x7c, 0xce, 0x97, 0x88, + 0x86, 0x50, 0xe2, 0x52, 0xeb, 0x14, 0xbb, 0x3d, 0x22, 0x9d, 0x64, 0x84, 0x93, 0xfd, 0x85, 0x9d, + 0x5c, 0x8b, 0x9c, 0xc4, 0xe0, 0x0c, 0x73, 0x65, 0x80, 0xcf, 0x77, 0x85, 0x80, 0x7b, 0xdc, 0xc9, + 0x7f, 0xf4, 0x50, 0x4f, 0xfd, 0xf5, 0xa1, 0xae, 0x19, 0x7f, 0xd4, 0x00, 0x22, 0xc6, 0xd0, 0x7b, + 0xb0, 0x66, 0x85, 0x23, 0x61, 0x4b, 0x55, 0x0e, 0xbf, 0x3c, 0x2f, 0x17, 0x09, 0xbe, 0x9b, 0x79, + 0xbe, 0xe8, 0x47, 0x13, 0x5d, 0x33, 0x4b, 0x56, 0x22, 0x15, 0x3f, 0x80, 0xe2, 0x68, 0x68, 0x63, + 0x46, 0x3a, 0xbc, 0x3a, 0x05, 0x93, 0xc5, 0xed, 0x6a, 0x43, 0x96, 0x6e, 0x23, 0x28, 0xdd, 0xc6, + 0x51, 0x50, 0xba, 0xcd, 0x1a, 0xc7, 0x9a, 0x4e, 0x74, 0x24, 0xc3, 0x8a, 0x19, 0x1b, 0x1f, 0xfe, + 0x59, 0xd7, 0x4c, 0x90, 0x12, 0x6e, 0x10, 0x8b, 0xe9, 0x77, 0x1a, 0x14, 0x5b, 0x84, 0x5a, 0xbe, + 0x33, 0xe4, 0x3b, 0x04, 0x55, 0x60, 0x69, 0xe0, 0xb9, 0xce, 0x99, 0xaa, 0xc7, 0x82, 0x19, 0x0c, + 0x51, 0x15, 0xf2, 0x8e, 0x4d, 0x5c, 0xe6, 0xb0, 0xb1, 0xcc, 0xab, 0x19, 0x8e, 0xb9, 0xd5, 0x4f, + 0x48, 0x97, 0x3a, 0x41, 0x36, 0xcc, 0x60, 0x88, 0x6e, 0xc3, 0x1a, 0x25, 0xd6, 0xc8, 0x77, 0xd8, + 0xb8, 0x63, 0x79, 0x2e, 0xc3, 0x16, 0xab, 0x64, 0x45, 0xc2, 0xfe, 0x6f, 0x3a, 0xd1, 0x5f, 0x96, + 0x6b, 0x4d, 0x6a, 0x18, 0x66, 0x29, 0x10, 0xed, 0x4a, 0x09, 0xf7, 0x60, 0x13, 0x86, 0x9d, 0x3e, + 0xad, 0xbc, 0x24, 0x3d, 0xa8, 0x61, 0x2c, 0x96, 0x4f, 0x97, 0xa0, 0x10, 0x56, 0x3b, 0xf7, 0xec, + 0x0d, 0x89, 0xcf, 0x7f, 0x77, 0xb0, 0x6d, 0xfb, 0x84, 0x52, 0x55, 0xd7, 0x31, 0xcf, 0x49, 0x0d, + 0xc3, 0x2c, 0x05, 0xa2, 0x5b, 0x52, 0x82, 0x18, 0x4f, 0xb3, 0x4b, 0x89, 0x4b, 0x47, 0xb4, 0x33, + 0x1c, 0x75, 0xcf, 0xc8, 0x58, 0x65, 0x63, 0x7d, 0x26, 0x1b, 0xb7, 0xdc, 0x71, 0xf3, 0xcd, 0x08, + 0x3d, 0x69, 0x67, 0xfc, 0xfe, 0xd7, 0x6f, 0xac, 0xab, 0xd2, 0xb0, 0xfc, 0xf1, 0x90, 0x79, 0x8d, + 0x83, 0x51, 0xf7, 0x6d, 0x32, 0xe6, 0xe9, 0x57, 0xaa, 0x07, 0x42, 0x13, 0x5d, 0x83, 0xdc, 0x8f, + 0xb0, 0xd3, 0x27, 0xb6, 0x20, 0x34, 0x6f, 0xaa, 0x11, 0xda, 0x81, 0x1c, 0x65, 0x98, 0x8d, 0xa8, + 0x60, 0x71, 0x75, 0xdb, 0x98, 0x57, 0x6a, 0x4d, 0xcf, 0xb5, 0x0f, 0x85, 0xa6, 0xa9, 0x2c, 0xd0, + 0x6d, 0xc8, 0x31, 0xef, 0x8c, 0xb8, 0x8a, 0xc2, 0x85, 0xf6, 0x77, 0xdb, 0x65, 0xa6, 0xb2, 0xe6, + 0x8c, 0xd8, 0xa4, 0x4f, 0x7a, 0x82, 0x38, 0x7a, 0x8a, 0x7d, 0x42, 0x2b, 0x39, 0x81, 0xd8, 0x5e, + 0x78, 0x13, 0x2a, 0xa6, 0x92, 0x78, 0x86, 0x59, 0x0a, 0x45, 0x87, 0x42, 0x82, 0xde, 0x86, 0xa2, + 0x1d, 0x15, 0x6a, 0x65, 0x49, 0xa4, 0xe0, 0x4b, 0xf3, 0xc2, 0x8f, 0xd5, 0xb4, 0xea, 0x7b, 0x71, + 0x6b, 0x5e, 0x1c, 0x23, 0xb7, 0xeb, 0xb9, 0xb6, 0xe3, 0xf6, 0x3a, 0xa7, 0xc4, 0xe9, 0x9d, 0xb2, + 0x4a, 0xbe, 0xae, 0x6d, 0x66, 0xe2, 0xc5, 0x91, 0xd4, 0x30, 0xcc, 0x52, 0x28, 0xda, 0x17, 0x12, + 0x64, 0xc3, 0x6a, 0xa4, 0x25, 0x36, 0x6a, 0xe1, 0x99, 0x1b, 0xf5, 0x86, 0xda, 0xa8, 0x57, 0x93, + 0x5e, 0xa2, 0xbd, 0xba, 0x12, 0x0a, 0xb9, 0x19, 0xda, 0x07, 0x88, 0xda, 0x43, 0x05, 0x84, 0x07, + 0xe3, 0xd9, 0x3d, 0x46, 0x05, 0x1e, 0xb3, 0x45, 0xef, 0xc3, 0x95, 0x81, 0xe3, 0x76, 0x28, 0xe9, + 0x9f, 0x74, 0x14, 0xc1, 0x1c, 0xb2, 0x28, 0xb2, 0xf7, 0xce, 0x62, 0xf5, 0x30, 0x9d, 0xe8, 0x55, + 0xd5, 0x42, 0x67, 0x21, 0x0d, 0xb3, 0x3c, 0x70, 0xdc, 0x43, 0xd2, 0x3f, 0x69, 0x85, 0x32, 0xf4, + 0x1a, 0x94, 0xa3, 0x68, 0x3d, 0xb7, 0x73, 0xea, 0xf5, 0xed, 0xca, 0xb2, 0xa8, 0xef, 0x88, 0xd9, + 0x77, 0xdd, 0x7d, 0xaf, 0x6f, 0xef, 0x2c, 0x7f, 0xf0, 0x50, 0x4f, 0xa9, 0xad, 0x9d, 0x32, 0xde, + 0x82, 0xe5, 0x63, 0xdc, 0x57, 0x5b, 0x92, 0x50, 0x74, 0x1d, 0x0a, 0x38, 0x18, 0x54, 0xb4, 0x7a, + 0x66, 0xb3, 0x60, 0x46, 0x02, 0xd9, 0x12, 0x7e, 0xfa, 0x59, 0x5d, 0x33, 0x7e, 0xa9, 0x41, 0xae, + 0x75, 0x7c, 0x80, 0x1d, 0x1f, 0xb5, 0xa1, 0x1c, 0x55, 0xd9, 0xc5, 0x86, 0x70, 0x7d, 0x3a, 0xd1, + 0x2b, 0xc9, 0x42, 0x0c, 0x3b, 0x42, 0x54, 0xec, 0x41, 0x4b, 0x68, 0x43, 0xf9, 0x5e, 0xd0, 0x67, + 0x42, 0xa8, 0x74, 0x12, 0x6a, 0x46, 0xc5, 0x30, 0xd7, 0x42, 0x99, 0x82, 0x4a, 0x84, 0xb9, 0x07, + 0x4b, 0x72, 0xb5, 0x14, 0xed, 0xc0, 0x4b, 0x43, 0xfe, 0x43, 0x44, 0x57, 0xdc, 0xae, 0xcd, 0x2d, + 0x74, 0xa1, 0xaf, 0x52, 0x2d, 0x4d, 0x8c, 0x5f, 0xa4, 0x01, 0x5a, 0xc7, 0xc7, 0x47, 0xbe, 0x33, + 0xec, 0x13, 0xf6, 0x79, 0x46, 0x7e, 0x04, 0x57, 0xa3, 0xb0, 0xa8, 0x6f, 0x25, 0xa2, 0xaf, 0x4f, + 0x27, 0xfa, 0xf5, 0x64, 0xf4, 0x31, 0x35, 0xc3, 0xbc, 0x12, 0xca, 0x0f, 0x7d, 0xeb, 0x52, 0x54, + 0x9b, 0xb2, 0x10, 0x35, 0x33, 0x1f, 0x35, 0xa6, 0x16, 0x47, 0x6d, 0x51, 0x76, 0x39, 0xb5, 0x87, + 0x50, 0x8c, 0x28, 0xa1, 0xa8, 0x05, 0x79, 0xa6, 0x7e, 0x2b, 0x86, 0x8d, 0xf9, 0x0c, 0x07, 0x66, + 0x8a, 0xe5, 0xd0, 0xd2, 0xf8, 0xa7, 0x06, 0x10, 0xab, 0xef, 0x2f, 0x64, 0x89, 0xf1, 0xb6, 0xaf, + 0x9a, 0x74, 0xe6, 0x85, 0xae, 0x75, 0xca, 0x3a, 0xc1, 0xe7, 0xcf, 0xd3, 0x70, 0xe5, 0x6e, 0xb0, + 0x67, 0xbf, 0xf0, 0x1c, 0x1c, 0xc0, 0x12, 0x71, 0x99, 0xef, 0x08, 0x12, 0x78, 0xb6, 0xbf, 0x3a, + 0x2f, 0xdb, 0x97, 0xc4, 0xb4, 0xe7, 0x32, 0x7f, 0xac, 0x72, 0x1f, 0xc0, 0x24, 0xd8, 0x98, 0x64, + 0xa0, 0x32, 0xcf, 0x12, 0xed, 0x42, 0xc9, 0xf2, 0x89, 0x10, 0x04, 0x67, 0x8d, 0x26, 0xce, 0x9a, + 0x6a, 0x74, 0x0b, 0x4d, 0x28, 0x18, 0xe6, 0x6a, 0x20, 0x51, 0x27, 0x4d, 0x0f, 0xf8, 0x15, 0x91, + 0x97, 0x1d, 0xd7, 0x7a, 0xce, 0x3b, 0xa1, 0xa1, 0x8e, 0x9a, 0xc0, 0xc9, 0x45, 0x00, 0x79, 0xd6, + 0xac, 0x46, 0x52, 0x71, 0xd8, 0xfc, 0x18, 0x4a, 0x8e, 0xeb, 0x30, 0x07, 0xf7, 0x3b, 0x5d, 0xdc, + 0xc7, 0xae, 0xf5, 0x22, 0x37, 0x6c, 0x79, 0x3c, 0x28, 0xb7, 0x09, 0x38, 0xc3, 0x5c, 0x55, 0x92, + 0xa6, 0x14, 0xa0, 0x7d, 0x58, 0x0a, 0x5c, 0x65, 0x5f, 0xe8, 0x66, 0x12, 0x98, 0xa3, 0x1b, 0xb0, + 0x1c, 0x9d, 0x30, 0x8e, 0x2d, 0x2e, 0x3a, 0x59, 0xb3, 0x18, 0xca, 0xda, 0xf6, 0xe5, 0x87, 0x50, + 0xee, 0xf2, 0x43, 0x28, 0xba, 0x5b, 0x7e, 0x96, 0x81, 0xb2, 0x49, 0xec, 0xff, 0x65, 0x76, 0xb1, + 0xcc, 0x7e, 0x07, 0x40, 0x76, 0x0f, 0xde, 0xaf, 0x5f, 0x20, 0xb9, 0xbc, 0xff, 0x14, 0x24, 0x42, + 0x8b, 0xb2, 0xff, 0x5c, 0x7a, 0x27, 0x69, 0x58, 0x8e, 0xa7, 0xf7, 0xbf, 0xf4, 0xcc, 0x44, 0xed, + 0xa8, 0x4f, 0x66, 0x45, 0x9f, 0xfc, 0xca, 0xbc, 0x3e, 0x39, 0xb3, 0x19, 0x9e, 0xde, 0x20, 0xff, + 0x91, 0x86, 0xdc, 0x01, 0xf6, 0xf1, 0x80, 0x22, 0x6b, 0xe6, 0xce, 0x2c, 0x5f, 0xcd, 0x1b, 0x33, + 0xe5, 0xde, 0x52, 0xdf, 0x6d, 0x9e, 0x71, 0x65, 0xfe, 0xe8, 0x92, 0x2b, 0xf3, 0xb7, 0x60, 0x95, + 0x3f, 0xec, 0xc3, 0x18, 0x25, 0xdb, 0x2b, 0xcd, 0x8d, 0x08, 0xe5, 0xe2, 0xbc, 0x7c, 0xf7, 0x87, + 0xcf, 0x47, 0x8a, 0xbe, 0x0e, 0x45, 0xae, 0x11, 0x1d, 0x1b, 0xdc, 0xfc, 0x5a, 0xf4, 0xc0, 0x8e, + 0x4d, 0x1a, 0x26, 0x0c, 0xf0, 0xf9, 0x9e, 0x1c, 0xa0, 0x77, 0x00, 0x9d, 0x86, 0xdf, 0x78, 0x3a, + 0x11, 0x9d, 0xdc, 0xfe, 0xff, 0xa7, 0x13, 0x7d, 0x43, 0xda, 0xcf, 0xea, 0x18, 0x66, 0x39, 0x12, + 0x06, 0x68, 0x5f, 0x03, 0xe0, 0x71, 0x75, 0x6c, 0xe2, 0x7a, 0x03, 0xf5, 0x70, 0xbb, 0x3a, 0x9d, + 0xe8, 0x65, 0x89, 0x12, 0xcd, 0x19, 0x66, 0x81, 0x0f, 0x5a, 0xfc, 0x77, 0xac, 0xb2, 0x3f, 0xd6, + 0x00, 0x45, 0x07, 0x92, 0x49, 0xe8, 0x90, 0xbf, 0x34, 0xf9, 0x93, 0x22, 0x76, 0xff, 0xd7, 0x9e, + 0xfe, 0xa4, 0x88, 0xec, 0x83, 0x27, 0x45, 0x6c, 0xa7, 0x7c, 0x23, 0x6a, 0xde, 0x69, 0x95, 0x47, + 0x05, 0xd3, 0xc5, 0x94, 0xc4, 0x9e, 0x25, 0x4e, 0x60, 0x1d, 0xe8, 0x87, 0xab, 0x4c, 0x19, 0x7f, + 0xd0, 0x60, 0x63, 0xa6, 0xa2, 0xc2, 0xc5, 0xfe, 0x10, 0x90, 0x1f, 0x9b, 0x14, 0x7c, 0x8d, 0xd5, + 0xa2, 0x17, 0x2e, 0xd0, 0xb2, 0x3f, 0xd3, 0xc6, 0x3f, 0xb7, 0xf3, 0x67, 0x27, 0x2b, 0x38, 0xff, + 0xad, 0x06, 0xeb, 0x71, 0xf7, 0x61, 0x20, 0x77, 0x60, 0x39, 0xee, 0x5d, 0x85, 0xf0, 0xca, 0xf3, + 0x84, 0xa0, 0x56, 0x7f, 0xc1, 0x1e, 0x7d, 0x37, 0xda, 0xae, 0xf2, 0x2b, 0xe0, 0xcd, 0xe7, 0x66, + 0x23, 0x58, 0x53, 0x72, 0xdb, 0x66, 0x45, 0x3e, 0xfe, 0xa5, 0x41, 0xf6, 0xc0, 0xf3, 0xfa, 0xc8, + 0x83, 0xb2, 0xeb, 0xb1, 0x0e, 0xaf, 0x2c, 0x62, 0x77, 0xd4, 0xe7, 0x03, 0xd9, 0x07, 0x77, 0x17, + 0x23, 0xe9, 0x6f, 0x13, 0x7d, 0x16, 0xca, 0x2c, 0xb9, 0x1e, 0x6b, 0x0a, 0xc9, 0x91, 0xfc, 0xb8, + 0xf0, 0x3e, 0xac, 0x5c, 0x74, 0x26, 0xbb, 0xe4, 0xf7, 0x16, 0x76, 0x76, 0x11, 0x66, 0x3a, 0xd1, + 0xd7, 0xa3, 0x1d, 0x13, 0x8a, 0x0d, 0x73, 0xb9, 0x1b, 0xf3, 0xbe, 0x93, 0xe7, 0xf9, 0xfb, 0xfb, + 0x43, 0x5d, 0x7b, 0xed, 0x37, 0x1a, 0x40, 0xf4, 0x0d, 0x05, 0xbd, 0x0e, 0x2f, 0x37, 0xdf, 0xbd, + 0xd3, 0xea, 0x1c, 0x1e, 0xdd, 0x3a, 0xba, 0x7b, 0xd8, 0xb9, 0x7b, 0xe7, 0xf0, 0x60, 0x6f, 0xb7, + 0x7d, 0xbb, 0xbd, 0xd7, 0x5a, 0x4b, 0x55, 0x4b, 0xf7, 0x1f, 0xd4, 0x8b, 0x77, 0x5d, 0x3a, 0x24, + 0x96, 0x73, 0xe2, 0x10, 0x1b, 0xbd, 0x0a, 0xeb, 0x17, 0xb5, 0xf9, 0x68, 0xaf, 0xb5, 0xa6, 0x55, + 0x97, 0xef, 0x3f, 0xa8, 0xe7, 0xe5, 0x4d, 0x91, 0xd8, 0x68, 0x13, 0xae, 0xce, 0xea, 0xb5, 0xef, + 0x7c, 0x7b, 0x2d, 0x5d, 0x5d, 0xb9, 0xff, 0xa0, 0x5e, 0x08, 0xaf, 0x94, 0xc8, 0x00, 0x14, 0xd7, + 0x54, 0x78, 0x99, 0x2a, 0xdc, 0x7f, 0x50, 0xcf, 0x49, 0x02, 0xab, 0xd9, 0x0f, 0x3e, 0xae, 0xa5, + 0x9a, 0xb7, 0x3f, 0x79, 0x5c, 0xd3, 0x1e, 0x3d, 0xae, 0x69, 0x7f, 0x79, 0x5c, 0xd3, 0x3e, 0x7c, + 0x52, 0x4b, 0x3d, 0x7a, 0x52, 0x4b, 0x7d, 0xfa, 0xa4, 0x96, 0xfa, 0xfe, 0xeb, 0x4f, 0xe5, 0xee, + 0x3c, 0xfc, 0x3c, 0x2f, 0x58, 0xec, 0xe6, 0x44, 0x1b, 0x7e, 0xf3, 0xdf, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x68, 0xc9, 0xd4, 0xc5, 0xbd, 0x17, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1280,624 +1301,625 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9865 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x5c, 0xd7, - 0x75, 0x18, 0x8e, 0xb7, 0x1f, 0xc0, 0xee, 0xc1, 0x02, 0x58, 0x5c, 0x80, 0xe4, 0x72, 0x49, 0x02, - 0xd0, 0xd3, 0x17, 0x45, 0x49, 0xa0, 0x44, 0x89, 0x94, 0xb4, 0xb4, 0x2d, 0xef, 0x62, 0x97, 0x20, - 0x44, 0x7c, 0xe9, 0x01, 0xa0, 0x64, 0xd9, 0xf9, 0xed, 0x3c, 0xec, 0x5e, 0x2c, 0x9e, 0xb0, 0xfb, - 0xde, 0xd3, 0x7b, 0x6f, 0x49, 0x80, 0xb6, 0x7f, 0x23, 0x7f, 0xd4, 0xb5, 0x99, 0x49, 0x6b, 0xd7, - 0x9d, 0xc6, 0x96, 0x4d, 0x57, 0x8e, 0xd3, 0x3a, 0x75, 0xdc, 0xc6, 0x8e, 0x5d, 0x37, 0x69, 0x3b, - 0x53, 0xbb, 0x33, 0x69, 0x6c, 0xb7, 0xc9, 0xd8, 0x6d, 0xa6, 0x4d, 0x33, 0x29, 0x9d, 0xca, 0x9e, - 0x54, 0x75, 0xdd, 0xc6, 0x61, 0xdd, 0x36, 0x1d, 0x4f, 0xa7, 0x9d, 0xfb, 0xf5, 0xbe, 0xf6, 0x13, - 0x10, 0x69, 0x3b, 0x4d, 0xff, 0xc2, 0xde, 0x73, 0xcf, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0x3d, 0xf7, - 0xdc, 0xaf, 0x07, 0xf8, 0xe2, 0x79, 0x98, 0xa9, 0x19, 0x46, 0xad, 0x8e, 0x4f, 0x9b, 0x96, 0xe1, - 0x18, 0x9b, 0xcd, 0xad, 0xd3, 0x55, 0x6c, 0x57, 0x2c, 0xcd, 0x74, 0x0c, 0x6b, 0x96, 0xc2, 0xd0, - 0x18, 0xc3, 0x98, 0x15, 0x18, 0xf2, 0x12, 0x8c, 0x5f, 0xd0, 0xea, 0xb8, 0xe8, 0x22, 0xae, 0x61, - 0x07, 0x3d, 0x09, 0xb1, 0x2d, 0xad, 0x8e, 0x33, 0xd2, 0x4c, 0xf4, 0xe4, 0xf0, 0x99, 0x7b, 0x66, - 0x43, 0x44, 0xb3, 0x41, 0x8a, 0x55, 0x02, 0x56, 0x28, 0x85, 0xfc, 0xbd, 0x18, 0x4c, 0xb4, 0xa9, - 0x45, 0x08, 0x62, 0xba, 0xda, 0x20, 0x1c, 0xa5, 0x93, 0x49, 0x85, 0xfe, 0x46, 0x19, 0x18, 0x32, - 0xd5, 0xca, 0x8e, 0x5a, 0xc3, 0x99, 0x08, 0x05, 0x8b, 0x22, 0x9a, 0x02, 0xa8, 0x62, 0x13, 0xeb, - 0x55, 0xac, 0x57, 0xf6, 0x32, 0xd1, 0x99, 0xe8, 0xc9, 0xa4, 0xe2, 0x83, 0xa0, 0x07, 0x61, 0xdc, - 0x6c, 0x6e, 0xd6, 0xb5, 0x4a, 0xd9, 0x87, 0x06, 0x33, 0xd1, 0x93, 0x71, 0x25, 0xcd, 0x2a, 0x8a, - 0x1e, 0xf2, 0xfd, 0x30, 0x76, 0x15, 0xab, 0x3b, 0x7e, 0xd4, 0x61, 0x8a, 0x3a, 0x4a, 0xc0, 0x3e, - 0xc4, 0x39, 0x48, 0x35, 0xb0, 0x6d, 0xab, 0x35, 0x5c, 0x76, 0xf6, 0x4c, 0x9c, 0x89, 0x51, 0xed, - 0x67, 0x5a, 0xb4, 0x0f, 0x6b, 0x3e, 0xcc, 0xa9, 0xd6, 0xf7, 0x4c, 0x8c, 0xf2, 0x90, 0xc4, 0x7a, - 0xb3, 0xc1, 0x38, 0xc4, 0x3b, 0xd8, 0xaf, 0xa4, 0x37, 0x1b, 0x61, 0x2e, 0x09, 0x42, 0xc6, 0x59, - 0x0c, 0xd9, 0xd8, 0xba, 0xa2, 0x55, 0x70, 0x66, 0x90, 0x32, 0xb8, 0xbf, 0x85, 0xc1, 0x1a, 0xab, - 0x0f, 0xf3, 0x10, 0x74, 0x68, 0x0e, 0x92, 0x78, 0xd7, 0xc1, 0xba, 0xad, 0x19, 0x7a, 0x66, 0x88, - 0x32, 0xb9, 0xb7, 0x4d, 0x2f, 0xe2, 0x7a, 0x35, 0xcc, 0xc2, 0xa3, 0x43, 0xe7, 0x60, 0xc8, 0x30, - 0x1d, 0xcd, 0xd0, 0xed, 0x4c, 0x62, 0x46, 0x3a, 0x39, 0x7c, 0xe6, 0x78, 0x5b, 0x47, 0x58, 0x61, - 0x38, 0x8a, 0x40, 0x46, 0x0b, 0x90, 0xb6, 0x8d, 0xa6, 0x55, 0xc1, 0xe5, 0x8a, 0x51, 0xc5, 0x65, - 0x4d, 0xdf, 0x32, 0x32, 0x49, 0xca, 0x60, 0xba, 0x55, 0x11, 0x8a, 0x38, 0x67, 0x54, 0xf1, 0x82, - 0xbe, 0x65, 0x28, 0xa3, 0x76, 0xa0, 0x8c, 0x0e, 0xc3, 0xa0, 0xbd, 0xa7, 0x3b, 0xea, 0x6e, 0x26, - 0x45, 0x3d, 0x84, 0x97, 0xe4, 0xdf, 0x1c, 0x84, 0xb1, 0x7e, 0x5c, 0xec, 0x3c, 0xc4, 0xb7, 0x88, - 0x96, 0x99, 0xc8, 0x7e, 0x6c, 0xc0, 0x68, 0x82, 0x46, 0x1c, 0x3c, 0xa0, 0x11, 0xf3, 0x30, 0xac, - 0x63, 0xdb, 0xc1, 0x55, 0xe6, 0x11, 0xd1, 0x3e, 0x7d, 0x0a, 0x18, 0x51, 0xab, 0x4b, 0xc5, 0x0e, - 0xe4, 0x52, 0xcf, 0xc3, 0x98, 0x2b, 0x52, 0xd9, 0x52, 0xf5, 0x9a, 0xf0, 0xcd, 0xd3, 0xbd, 0x24, - 0x99, 0x2d, 0x09, 0x3a, 0x85, 0x90, 0x29, 0xa3, 0x38, 0x50, 0x46, 0x45, 0x00, 0x43, 0xc7, 0xc6, - 0x56, 0xb9, 0x8a, 0x2b, 0xf5, 0x4c, 0xa2, 0x83, 0x95, 0x56, 0x08, 0x4a, 0x8b, 0x95, 0x0c, 0x06, - 0xad, 0xd4, 0xd1, 0x53, 0x9e, 0xab, 0x0d, 0x75, 0xf0, 0x94, 0x25, 0x36, 0xc8, 0x5a, 0xbc, 0x6d, - 0x03, 0x46, 0x2d, 0x4c, 0xfc, 0x1e, 0x57, 0xb9, 0x66, 0x49, 0x2a, 0xc4, 0x6c, 0x4f, 0xcd, 0x14, - 0x4e, 0xc6, 0x14, 0x1b, 0xb1, 0xfc, 0x45, 0x74, 0x37, 0xb8, 0x80, 0x32, 0x75, 0x2b, 0xa0, 0x51, - 0x28, 0x25, 0x80, 0xcb, 0x6a, 0x03, 0x67, 0xaf, 0xc1, 0x68, 0xd0, 0x3c, 0x68, 0x12, 0xe2, 0xb6, - 0xa3, 0x5a, 0x0e, 0xf5, 0xc2, 0xb8, 0xc2, 0x0a, 0x28, 0x0d, 0x51, 0xac, 0x57, 0x69, 0x94, 0x8b, - 0x2b, 0xe4, 0x27, 0x7a, 0xab, 0xa7, 0x70, 0x94, 0x2a, 0x7c, 0x5f, 0x6b, 0x8f, 0x06, 0x38, 0x87, - 0xf5, 0xce, 0x3e, 0x01, 0x23, 0x01, 0x05, 0xfa, 0x6d, 0x5a, 0x7e, 0x17, 0x1c, 0x6a, 0xcb, 0x1a, - 0x3d, 0x0f, 0x93, 0x4d, 0x5d, 0xd3, 0x1d, 0x6c, 0x99, 0x16, 0x26, 0x1e, 0xcb, 0x9a, 0xca, 0xfc, - 0x87, 0xa1, 0x0e, 0x3e, 0xb7, 0xe1, 0xc7, 0x66, 0x5c, 0x94, 0x89, 0x66, 0x2b, 0xf0, 0x54, 0x32, - 0xf1, 0xfa, 0x50, 0xfa, 0xe5, 0x97, 0x5f, 0x7e, 0x39, 0x22, 0x7f, 0x6d, 0x10, 0x26, 0xdb, 0x8d, - 0x99, 0xb6, 0xc3, 0xf7, 0x30, 0x0c, 0xea, 0xcd, 0xc6, 0x26, 0xb6, 0xa8, 0x91, 0xe2, 0x0a, 0x2f, - 0xa1, 0x3c, 0xc4, 0xeb, 0xea, 0x26, 0xae, 0x67, 0x62, 0x33, 0xd2, 0xc9, 0xd1, 0x33, 0x0f, 0xf6, - 0x35, 0x2a, 0x67, 0x17, 0x09, 0x89, 0xc2, 0x28, 0xd1, 0x5b, 0x20, 0xc6, 0x43, 0x34, 0xe1, 0x70, - 0xaa, 0x3f, 0x0e, 0x64, 0x2c, 0x29, 0x94, 0x0e, 0x1d, 0x83, 0x24, 0xf9, 0xcb, 0x7c, 0x63, 0x90, - 0xca, 0x9c, 0x20, 0x00, 0xe2, 0x17, 0x28, 0x0b, 0x09, 0x3a, 0x4c, 0xaa, 0x58, 0x4c, 0x6d, 0x6e, - 0x99, 0x38, 0x56, 0x15, 0x6f, 0xa9, 0xcd, 0xba, 0x53, 0xbe, 0xa2, 0xd6, 0x9b, 0x98, 0x3a, 0x7c, - 0x52, 0x49, 0x71, 0xe0, 0x65, 0x02, 0x43, 0xd3, 0x30, 0xcc, 0x46, 0x95, 0xa6, 0x57, 0xf1, 0x2e, - 0x8d, 0x9e, 0x71, 0x85, 0x0d, 0xb4, 0x05, 0x02, 0x21, 0xcd, 0xbf, 0x68, 0x1b, 0xba, 0x70, 0x4d, - 0xda, 0x04, 0x01, 0xd0, 0xe6, 0x9f, 0x08, 0x07, 0xee, 0x13, 0xed, 0xd5, 0x6b, 0x19, 0x4b, 0xf7, - 0xc3, 0x18, 0xc5, 0x78, 0x8c, 0x77, 0xbd, 0x5a, 0xcf, 0x8c, 0xcf, 0x48, 0x27, 0x13, 0xca, 0x28, - 0x03, 0xaf, 0x70, 0xa8, 0xfc, 0x95, 0x08, 0xc4, 0x68, 0x60, 0x19, 0x83, 0xe1, 0xf5, 0xb7, 0xad, - 0x96, 0xca, 0xc5, 0x95, 0x8d, 0xc2, 0x62, 0x29, 0x2d, 0xa1, 0x51, 0x00, 0x0a, 0xb8, 0xb0, 0xb8, - 0x92, 0x5f, 0x4f, 0x47, 0xdc, 0xf2, 0xc2, 0xf2, 0xfa, 0xb9, 0xc7, 0xd3, 0x51, 0x97, 0x60, 0x83, - 0x01, 0x62, 0x7e, 0x84, 0xc7, 0xce, 0xa4, 0xe3, 0x28, 0x0d, 0x29, 0xc6, 0x60, 0xe1, 0xf9, 0x52, - 0xf1, 0xdc, 0xe3, 0xe9, 0xc1, 0x20, 0xe4, 0xb1, 0x33, 0xe9, 0x21, 0x34, 0x02, 0x49, 0x0a, 0x29, - 0xac, 0xac, 0x2c, 0xa6, 0x13, 0x2e, 0xcf, 0xb5, 0x75, 0x65, 0x61, 0x79, 0x3e, 0x9d, 0x74, 0x79, - 0xce, 0x2b, 0x2b, 0x1b, 0xab, 0x69, 0x70, 0x39, 0x2c, 0x95, 0xd6, 0xd6, 0xf2, 0xf3, 0xa5, 0xf4, - 0xb0, 0x8b, 0x51, 0x78, 0xdb, 0x7a, 0x69, 0x2d, 0x9d, 0x0a, 0x88, 0xf5, 0xd8, 0x99, 0xf4, 0x88, - 0xdb, 0x44, 0x69, 0x79, 0x63, 0x29, 0x3d, 0x8a, 0xc6, 0x61, 0x84, 0x35, 0x21, 0x84, 0x18, 0x0b, - 0x81, 0xce, 0x3d, 0x9e, 0x4e, 0x7b, 0x82, 0x30, 0x2e, 0xe3, 0x01, 0xc0, 0xb9, 0xc7, 0xd3, 0x48, - 0x9e, 0x83, 0x38, 0x75, 0x43, 0x84, 0x60, 0x74, 0x31, 0x5f, 0x28, 0x2d, 0x96, 0x57, 0x56, 0xd7, - 0x17, 0x56, 0x96, 0xf3, 0x8b, 0x69, 0xc9, 0x83, 0x29, 0xa5, 0x67, 0x37, 0x16, 0x94, 0x52, 0x31, - 0x1d, 0xf1, 0xc3, 0x56, 0x4b, 0xf9, 0xf5, 0x52, 0x31, 0x1d, 0x95, 0x2b, 0x30, 0xd9, 0x2e, 0xa0, - 0xb6, 0x1d, 0x42, 0x3e, 0x5f, 0x88, 0x74, 0xf0, 0x05, 0xca, 0x2b, 0xec, 0x0b, 0xf2, 0x77, 0x23, - 0x30, 0xd1, 0x66, 0x52, 0x69, 0xdb, 0xc8, 0xd3, 0x10, 0x67, 0xbe, 0xcc, 0xa6, 0xd9, 0x07, 0xda, - 0xce, 0x4e, 0xd4, 0xb3, 0x5b, 0xa6, 0x5a, 0x4a, 0xe7, 0x4f, 0x35, 0xa2, 0x1d, 0x52, 0x0d, 0xc2, - 0xa2, 0xc5, 0x61, 0x7f, 0xae, 0x25, 0xf8, 0xb3, 0xf9, 0xf1, 0x5c, 0x3f, 0xf3, 0x23, 0x85, 0xed, - 0x6f, 0x12, 0x88, 0xb7, 0x99, 0x04, 0xce, 0xc3, 0x78, 0x0b, 0xa3, 0xbe, 0x83, 0xf1, 0xfb, 0x24, - 0xc8, 0x74, 0x32, 0x4e, 0x8f, 0x90, 0x18, 0x09, 0x84, 0xc4, 0xf3, 0x61, 0x0b, 0xde, 0xd5, 0xb9, - 0x13, 0x5a, 0xfa, 0xfa, 0xb3, 0x12, 0x1c, 0x6e, 0x9f, 0x52, 0xb6, 0x95, 0xe1, 0x2d, 0x30, 0xd8, - 0xc0, 0xce, 0xb6, 0x21, 0xd2, 0xaa, 0xfb, 0xda, 0x4c, 0xd6, 0xa4, 0x3a, 0xdc, 0xd9, 0x9c, 0xca, - 0x3f, 0xdb, 0x47, 0x3b, 0xe5, 0x85, 0x4c, 0x9a, 0x16, 0x49, 0x3f, 0x14, 0x81, 0x43, 0x6d, 0x99, - 0xb7, 0x15, 0xf4, 0x04, 0x80, 0xa6, 0x9b, 0x4d, 0x87, 0xa5, 0x4e, 0x2c, 0x12, 0x27, 0x29, 0x84, - 0x06, 0x2f, 0x12, 0x65, 0x9b, 0x8e, 0x5b, 0x1f, 0xa5, 0xf5, 0xc0, 0x40, 0x14, 0xe1, 0x49, 0x4f, - 0xd0, 0x18, 0x15, 0x74, 0xaa, 0x83, 0xa6, 0x2d, 0x8e, 0xf9, 0x08, 0xa4, 0x2b, 0x75, 0x0d, 0xeb, - 0x4e, 0xd9, 0x76, 0x2c, 0xac, 0x36, 0x34, 0xbd, 0x46, 0xa7, 0x9a, 0x44, 0x2e, 0xbe, 0xa5, 0xd6, - 0x6d, 0xac, 0x8c, 0xb1, 0xea, 0x35, 0x51, 0x4b, 0x28, 0xa8, 0x03, 0x59, 0x3e, 0x8a, 0xc1, 0x00, - 0x05, 0xab, 0x76, 0x29, 0xe4, 0x8f, 0x24, 0x61, 0xd8, 0x97, 0x80, 0xa3, 0xbb, 0x20, 0xf5, 0xa2, - 0x7a, 0x45, 0x2d, 0x8b, 0x45, 0x15, 0xb3, 0xc4, 0x30, 0x81, 0xad, 0xf2, 0x85, 0xd5, 0x23, 0x30, - 0x49, 0x51, 0x8c, 0xa6, 0x83, 0xad, 0x72, 0xa5, 0xae, 0xda, 0x36, 0x35, 0x5a, 0x82, 0xa2, 0x22, - 0x52, 0xb7, 0x42, 0xaa, 0xe6, 0x44, 0x0d, 0x3a, 0x0b, 0x13, 0x94, 0xa2, 0xd1, 0xac, 0x3b, 0x9a, - 0x59, 0xc7, 0x65, 0xb2, 0xcc, 0xb3, 0xe9, 0x94, 0xe3, 0x4a, 0x36, 0x4e, 0x30, 0x96, 0x38, 0x02, - 0x91, 0xc8, 0x46, 0x45, 0x38, 0x41, 0xc9, 0x6a, 0x58, 0xc7, 0x96, 0xea, 0xe0, 0x32, 0x7e, 0xa9, - 0xa9, 0xd6, 0xed, 0xb2, 0xaa, 0x57, 0xcb, 0xdb, 0xaa, 0xbd, 0x9d, 0x99, 0x24, 0x0c, 0x0a, 0x91, - 0x8c, 0xa4, 0x1c, 0x25, 0x88, 0xf3, 0x1c, 0xaf, 0x44, 0xd1, 0xf2, 0x7a, 0xf5, 0xa2, 0x6a, 0x6f, - 0xa3, 0x1c, 0x1c, 0xa6, 0x5c, 0x6c, 0xc7, 0xd2, 0xf4, 0x5a, 0xb9, 0xb2, 0x8d, 0x2b, 0x3b, 0xe5, - 0xa6, 0xb3, 0xf5, 0x64, 0xe6, 0x98, 0xbf, 0x7d, 0x2a, 0xe1, 0x1a, 0xc5, 0x99, 0x23, 0x28, 0x1b, - 0xce, 0xd6, 0x93, 0x68, 0x0d, 0x52, 0xa4, 0x33, 0x1a, 0xda, 0x35, 0x5c, 0xde, 0x32, 0x2c, 0x3a, - 0x87, 0x8e, 0xb6, 0x09, 0x4d, 0x3e, 0x0b, 0xce, 0xae, 0x70, 0x82, 0x25, 0xa3, 0x8a, 0x73, 0xf1, - 0xb5, 0xd5, 0x52, 0xa9, 0xa8, 0x0c, 0x0b, 0x2e, 0x17, 0x0c, 0x8b, 0x38, 0x54, 0xcd, 0x70, 0x0d, - 0x3c, 0xcc, 0x1c, 0xaa, 0x66, 0x08, 0xf3, 0x9e, 0x85, 0x89, 0x4a, 0x85, 0xe9, 0xac, 0x55, 0xca, - 0x7c, 0x31, 0x66, 0x67, 0xd2, 0x01, 0x63, 0x55, 0x2a, 0xf3, 0x0c, 0x81, 0xfb, 0xb8, 0x8d, 0x9e, - 0x82, 0x43, 0x9e, 0xb1, 0xfc, 0x84, 0xe3, 0x2d, 0x5a, 0x86, 0x49, 0xcf, 0xc2, 0x84, 0xb9, 0xd7, - 0x4a, 0x88, 0x02, 0x2d, 0x9a, 0x7b, 0x61, 0xb2, 0x27, 0x60, 0xd2, 0xdc, 0x36, 0x5b, 0xe9, 0x4e, - 0xf9, 0xe9, 0x90, 0xb9, 0x6d, 0x86, 0x09, 0xef, 0xa5, 0x2b, 0x73, 0x0b, 0x57, 0x54, 0x07, 0x57, - 0x33, 0x47, 0xfc, 0xe8, 0xbe, 0x0a, 0x34, 0x0b, 0xe9, 0x4a, 0xa5, 0x8c, 0x75, 0x75, 0xb3, 0x8e, - 0xcb, 0xaa, 0x85, 0x75, 0xd5, 0xce, 0x4c, 0x53, 0xe4, 0x98, 0x63, 0x35, 0xb1, 0x32, 0x5a, 0xa9, - 0x94, 0x68, 0x65, 0x9e, 0xd6, 0xa1, 0x53, 0x30, 0x6e, 0x6c, 0xbe, 0x58, 0x61, 0x1e, 0x59, 0x36, - 0x2d, 0xbc, 0xa5, 0xed, 0x66, 0xee, 0xa1, 0xe6, 0x1d, 0x23, 0x15, 0xd4, 0x1f, 0x57, 0x29, 0x18, - 0x3d, 0x00, 0xe9, 0x8a, 0xbd, 0xad, 0x5a, 0x26, 0x0d, 0xc9, 0xb6, 0xa9, 0x56, 0x70, 0xe6, 0x5e, - 0x86, 0xca, 0xe0, 0xcb, 0x02, 0x4c, 0x46, 0x84, 0x7d, 0x55, 0xdb, 0x72, 0x04, 0xc7, 0xfb, 0xd9, - 0x88, 0xa0, 0x30, 0xce, 0xed, 0x24, 0xa4, 0x89, 0x25, 0x02, 0x0d, 0x9f, 0xa4, 0x68, 0xa3, 0xe6, - 0xb6, 0xe9, 0x6f, 0xf7, 0x6e, 0x18, 0x21, 0x98, 0x5e, 0xa3, 0x0f, 0xb0, 0xc4, 0xcd, 0xdc, 0xf6, - 0xb5, 0xf8, 0x38, 0x1c, 0x26, 0x48, 0x0d, 0xec, 0xa8, 0x55, 0xd5, 0x51, 0x7d, 0xd8, 0x0f, 0x51, - 0x6c, 0x62, 0xf6, 0x25, 0x5e, 0x19, 0x90, 0xd3, 0x6a, 0x6e, 0xee, 0xb9, 0x8e, 0xf5, 0x30, 0x93, - 0x93, 0xc0, 0x84, 0x6b, 0xdd, 0xb1, 0xe4, 0x5c, 0xce, 0x41, 0xca, 0xef, 0xf7, 0x28, 0x09, 0xcc, - 0xf3, 0xd3, 0x12, 0x49, 0x82, 0xe6, 0x56, 0x8a, 0x24, 0x7d, 0x79, 0xa1, 0x94, 0x8e, 0x90, 0x34, - 0x6a, 0x71, 0x61, 0xbd, 0x54, 0x56, 0x36, 0x96, 0xd7, 0x17, 0x96, 0x4a, 0xe9, 0xa8, 0x2f, 0xb1, - 0x7f, 0x26, 0x96, 0xb8, 0x2f, 0x7d, 0xbf, 0xfc, 0xed, 0x08, 0x8c, 0x06, 0x57, 0x6a, 0xe8, 0x4d, - 0x70, 0x44, 0x6c, 0xab, 0xd8, 0xd8, 0x29, 0x5f, 0xd5, 0x2c, 0x3a, 0x20, 0x1b, 0x2a, 0x9b, 0x1c, - 0x5d, 0xff, 0x99, 0xe4, 0x58, 0x6b, 0xd8, 0x79, 0x4e, 0xb3, 0xc8, 0x70, 0x6b, 0xa8, 0x0e, 0x5a, - 0x84, 0x69, 0xdd, 0x28, 0xdb, 0x8e, 0xaa, 0x57, 0x55, 0xab, 0x5a, 0xf6, 0x36, 0xb4, 0xca, 0x6a, - 0xa5, 0x82, 0x6d, 0xdb, 0x60, 0x13, 0xa1, 0xcb, 0xe5, 0xb8, 0x6e, 0xac, 0x71, 0x64, 0x6f, 0x86, - 0xc8, 0x73, 0xd4, 0x90, 0xfb, 0x46, 0x3b, 0xb9, 0xef, 0x31, 0x48, 0x36, 0x54, 0xb3, 0x8c, 0x75, - 0xc7, 0xda, 0xa3, 0xf9, 0x79, 0x42, 0x49, 0x34, 0x54, 0xb3, 0x44, 0xca, 0x3f, 0x91, 0x65, 0xd2, - 0x33, 0xb1, 0x44, 0x22, 0x9d, 0x7c, 0x26, 0x96, 0x48, 0xa6, 0x41, 0x7e, 0x2d, 0x0a, 0x29, 0x7f, - 0xbe, 0x4e, 0x96, 0x3f, 0x15, 0x3a, 0x63, 0x49, 0x34, 0xa6, 0xdd, 0xdd, 0x35, 0xbb, 0x9f, 0x9d, - 0x23, 0x53, 0x59, 0x6e, 0x90, 0x25, 0xc7, 0x0a, 0xa3, 0x24, 0x69, 0x04, 0x71, 0x36, 0xcc, 0x92, - 0x91, 0x84, 0xc2, 0x4b, 0x68, 0x1e, 0x06, 0x5f, 0xb4, 0x29, 0xef, 0x41, 0xca, 0xfb, 0x9e, 0xee, - 0xbc, 0x9f, 0x59, 0xa3, 0xcc, 0x93, 0xcf, 0xac, 0x95, 0x97, 0x57, 0x94, 0xa5, 0xfc, 0xa2, 0xc2, - 0xc9, 0xd1, 0x51, 0x88, 0xd5, 0xd5, 0x6b, 0x7b, 0xc1, 0x49, 0x8f, 0x82, 0xfa, 0xed, 0x84, 0xa3, - 0x10, 0xbb, 0x8a, 0xd5, 0x9d, 0xe0, 0x54, 0x43, 0x41, 0x77, 0x70, 0x30, 0x9c, 0x86, 0x38, 0xb5, - 0x17, 0x02, 0xe0, 0x16, 0x4b, 0x0f, 0xa0, 0x04, 0xc4, 0xe6, 0x56, 0x14, 0x32, 0x20, 0xd2, 0x90, - 0x62, 0xd0, 0xf2, 0xea, 0x42, 0x69, 0xae, 0x94, 0x8e, 0xc8, 0x67, 0x61, 0x90, 0x19, 0x81, 0x0c, - 0x16, 0xd7, 0x0c, 0xe9, 0x01, 0x5e, 0xe4, 0x3c, 0x24, 0x51, 0xbb, 0xb1, 0x54, 0x28, 0x29, 0xe9, - 0x48, 0xb0, 0xab, 0x63, 0xe9, 0xb8, 0x6c, 0x43, 0xca, 0x9f, 0x87, 0xff, 0x64, 0x16, 0xe3, 0x5f, - 0x95, 0x60, 0xd8, 0x97, 0x57, 0x93, 0x84, 0x48, 0xad, 0xd7, 0x8d, 0xab, 0x65, 0xb5, 0xae, 0xa9, - 0x36, 0x77, 0x0d, 0xa0, 0xa0, 0x3c, 0x81, 0xf4, 0xdb, 0x75, 0x3f, 0xa1, 0x21, 0x12, 0x4f, 0x0f, - 0xca, 0x9f, 0x92, 0x20, 0x1d, 0x4e, 0x6c, 0x43, 0x62, 0x4a, 0x3f, 0x4d, 0x31, 0xe5, 0x4f, 0x4a, - 0x30, 0x1a, 0xcc, 0x66, 0x43, 0xe2, 0xdd, 0xf5, 0x53, 0x15, 0xef, 0x8f, 0x22, 0x30, 0x12, 0xc8, - 0x61, 0xfb, 0x95, 0xee, 0x25, 0x18, 0xd7, 0xaa, 0xb8, 0x61, 0x1a, 0x0e, 0xd6, 0x2b, 0x7b, 0xe5, - 0x3a, 0xbe, 0x82, 0xeb, 0x19, 0x99, 0x06, 0x8d, 0xd3, 0xdd, 0xb3, 0xe4, 0xd9, 0x05, 0x8f, 0x6e, - 0x91, 0x90, 0xe5, 0x26, 0x16, 0x8a, 0xa5, 0xa5, 0xd5, 0x95, 0xf5, 0xd2, 0xf2, 0xdc, 0xdb, 0xca, - 0x1b, 0xcb, 0x97, 0x96, 0x57, 0x9e, 0x5b, 0x56, 0xd2, 0x5a, 0x08, 0xed, 0x0e, 0x0e, 0xfb, 0x55, - 0x48, 0x87, 0x85, 0x42, 0x47, 0xa0, 0x9d, 0x58, 0xe9, 0x01, 0x34, 0x01, 0x63, 0xcb, 0x2b, 0xe5, - 0xb5, 0x85, 0x62, 0xa9, 0x5c, 0xba, 0x70, 0xa1, 0x34, 0xb7, 0xbe, 0xc6, 0xf6, 0x3d, 0x5c, 0xec, - 0xf5, 0xc0, 0x00, 0x97, 0x5f, 0x89, 0xc2, 0x44, 0x1b, 0x49, 0x50, 0x9e, 0xaf, 0x58, 0xd8, 0x22, - 0xea, 0xe1, 0x7e, 0xa4, 0x9f, 0x25, 0x39, 0xc3, 0xaa, 0x6a, 0x39, 0x7c, 0x81, 0xf3, 0x00, 0x10, - 0x2b, 0xe9, 0x8e, 0xb6, 0xa5, 0x61, 0x8b, 0xef, 0x27, 0xb1, 0x65, 0xcc, 0x98, 0x07, 0x67, 0x5b, - 0x4a, 0x0f, 0x01, 0x32, 0x0d, 0x5b, 0x73, 0xb4, 0x2b, 0xb8, 0xac, 0xe9, 0x62, 0xf3, 0x89, 0x2c, - 0x6b, 0x62, 0x4a, 0x5a, 0xd4, 0x2c, 0xe8, 0x8e, 0x8b, 0xad, 0xe3, 0x9a, 0x1a, 0xc2, 0x26, 0xc1, - 0x3c, 0xaa, 0xa4, 0x45, 0x8d, 0x8b, 0x7d, 0x17, 0xa4, 0xaa, 0x46, 0x93, 0xe4, 0x7a, 0x0c, 0x8f, - 0xcc, 0x1d, 0x92, 0x32, 0xcc, 0x60, 0x2e, 0x0a, 0xcf, 0xe2, 0xbd, 0x5d, 0xaf, 0x94, 0x32, 0xcc, - 0x60, 0x0c, 0xe5, 0x7e, 0x18, 0x53, 0x6b, 0x35, 0x8b, 0x30, 0x17, 0x8c, 0xd8, 0xba, 0x64, 0xd4, - 0x05, 0x53, 0xc4, 0xec, 0x33, 0x90, 0x10, 0x76, 0x20, 0x53, 0x35, 0xb1, 0x44, 0xd9, 0x64, 0x8b, - 0xed, 0xc8, 0xc9, 0xa4, 0x92, 0xd0, 0x45, 0xe5, 0x5d, 0x90, 0xd2, 0xec, 0xb2, 0xb7, 0x89, 0x1f, - 0x99, 0x89, 0x9c, 0x4c, 0x28, 0xc3, 0x9a, 0xed, 0x6e, 0x80, 0xca, 0x9f, 0x8d, 0xc0, 0x68, 0xf0, - 0x10, 0x02, 0x15, 0x21, 0x51, 0x37, 0x2a, 0x2a, 0x75, 0x2d, 0x76, 0x02, 0x76, 0xb2, 0xc7, 0xb9, - 0xc5, 0xec, 0x22, 0xc7, 0x57, 0x5c, 0xca, 0xec, 0xef, 0x4a, 0x90, 0x10, 0x60, 0x74, 0x18, 0x62, - 0xa6, 0xea, 0x6c, 0x53, 0x76, 0xf1, 0x42, 0x24, 0x2d, 0x29, 0xb4, 0x4c, 0xe0, 0xb6, 0xa9, 0xea, - 0xd4, 0x05, 0x38, 0x9c, 0x94, 0x49, 0xbf, 0xd6, 0xb1, 0x5a, 0xa5, 0x8b, 0x1e, 0xa3, 0xd1, 0xc0, - 0xba, 0x63, 0x8b, 0x7e, 0xe5, 0xf0, 0x39, 0x0e, 0x46, 0x0f, 0xc2, 0xb8, 0x63, 0xa9, 0x5a, 0x3d, - 0x80, 0x1b, 0xa3, 0xb8, 0x69, 0x51, 0xe1, 0x22, 0xe7, 0xe0, 0xa8, 0xe0, 0x5b, 0xc5, 0x8e, 0x5a, - 0xd9, 0xc6, 0x55, 0x8f, 0x68, 0x90, 0x6e, 0x6e, 0x1c, 0xe1, 0x08, 0x45, 0x5e, 0x2f, 0x68, 0xe5, - 0x6f, 0x4b, 0x30, 0x2e, 0x96, 0x69, 0x55, 0xd7, 0x58, 0x4b, 0x00, 0xaa, 0xae, 0x1b, 0x8e, 0xdf, - 0x5c, 0xad, 0xae, 0xdc, 0x42, 0x37, 0x9b, 0x77, 0x89, 0x14, 0x1f, 0x83, 0x6c, 0x03, 0xc0, 0xab, - 0xe9, 0x68, 0xb6, 0x69, 0x18, 0xe6, 0x27, 0x4c, 0xf4, 0x98, 0x92, 0x2d, 0xec, 0x81, 0x81, 0xc8, - 0x7a, 0x0e, 0x4d, 0x42, 0x7c, 0x13, 0xd7, 0x34, 0x9d, 0xef, 0x1b, 0xb3, 0x82, 0xd8, 0x7e, 0x89, - 0xb9, 0xdb, 0x2f, 0x85, 0xff, 0x1f, 0x26, 0x2a, 0x46, 0x23, 0x2c, 0x6e, 0x21, 0x1d, 0xda, 0x5c, - 0xb0, 0x2f, 0x4a, 0x2f, 0x3c, 0xcc, 0x91, 0x6a, 0x46, 0x5d, 0xd5, 0x6b, 0xb3, 0x86, 0x55, 0xf3, - 0x8e, 0x59, 0x49, 0xc6, 0x63, 0xfb, 0x0e, 0x5b, 0xcd, 0xcd, 0x3f, 0x93, 0xa4, 0x5f, 0x8a, 0x44, - 0xe7, 0x57, 0x0b, 0x9f, 0x8b, 0x64, 0xe7, 0x19, 0xe1, 0xaa, 0x30, 0x86, 0x82, 0xb7, 0xea, 0xb8, - 0x42, 0x14, 0x84, 0xef, 0x3f, 0x08, 0x93, 0x35, 0xa3, 0x66, 0x50, 0x4e, 0xa7, 0xc9, 0x2f, 0x7e, - 0x4e, 0x9b, 0x74, 0xa1, 0xd9, 0x9e, 0x87, 0xba, 0xb9, 0x65, 0x98, 0xe0, 0xc8, 0x65, 0x7a, 0x50, - 0xc4, 0x96, 0x31, 0xa8, 0xeb, 0x1e, 0x5a, 0xe6, 0x8b, 0xdf, 0xa3, 0xd3, 0xb7, 0x32, 0xce, 0x49, - 0x49, 0x1d, 0x5b, 0xe9, 0xe4, 0x14, 0x38, 0x14, 0xe0, 0xc7, 0x06, 0x29, 0xb6, 0x7a, 0x70, 0xfc, - 0x2d, 0xce, 0x71, 0xc2, 0xc7, 0x71, 0x8d, 0x93, 0xe6, 0xe6, 0x60, 0x64, 0x3f, 0xbc, 0xfe, 0x19, - 0xe7, 0x95, 0xc2, 0x7e, 0x26, 0xf3, 0x30, 0x46, 0x99, 0x54, 0x9a, 0xb6, 0x63, 0x34, 0x68, 0x04, - 0xec, 0xce, 0xe6, 0xb7, 0xbf, 0xc7, 0x46, 0xcd, 0x28, 0x21, 0x9b, 0x73, 0xa9, 0x72, 0x39, 0xa0, - 0x67, 0x63, 0x55, 0x5c, 0xa9, 0xf7, 0xe0, 0xf0, 0x75, 0x2e, 0x88, 0x8b, 0x9f, 0xbb, 0x0c, 0x93, - 0xe4, 0x37, 0x0d, 0x50, 0x7e, 0x49, 0x7a, 0x6f, 0xb8, 0x65, 0xbe, 0xfd, 0x3e, 0x36, 0x30, 0x27, - 0x5c, 0x06, 0x3e, 0x99, 0x7c, 0xbd, 0x58, 0xc3, 0x8e, 0x83, 0x2d, 0xbb, 0xac, 0xd6, 0xdb, 0x89, - 0xe7, 0xdb, 0xb1, 0xc8, 0x7c, 0xfc, 0x07, 0xc1, 0x5e, 0x9c, 0x67, 0x94, 0xf9, 0x7a, 0x3d, 0xb7, - 0x01, 0x47, 0xda, 0x78, 0x45, 0x1f, 0x3c, 0x5f, 0xe1, 0x3c, 0x27, 0x5b, 0x3c, 0x83, 0xb0, 0x5d, - 0x05, 0x01, 0x77, 0xfb, 0xb2, 0x0f, 0x9e, 0x9f, 0xe0, 0x3c, 0x11, 0xa7, 0x15, 0x5d, 0x4a, 0x38, - 0x3e, 0x03, 0xe3, 0x57, 0xb0, 0xb5, 0x69, 0xd8, 0x7c, 0x97, 0xa8, 0x0f, 0x76, 0x9f, 0xe4, 0xec, - 0xc6, 0x38, 0x21, 0xdd, 0x36, 0x22, 0xbc, 0x9e, 0x82, 0xc4, 0x96, 0x5a, 0xc1, 0x7d, 0xb0, 0xb8, - 0xc1, 0x59, 0x0c, 0x11, 0x7c, 0x42, 0x9a, 0x87, 0x54, 0xcd, 0xe0, 0x73, 0x54, 0x6f, 0xf2, 0x4f, - 0x71, 0xf2, 0x61, 0x41, 0xc3, 0x59, 0x98, 0x86, 0xd9, 0xac, 0x93, 0x09, 0xac, 0x37, 0x8b, 0xbf, - 0x29, 0x58, 0x08, 0x1a, 0xce, 0x62, 0x1f, 0x66, 0x7d, 0x55, 0xb0, 0xb0, 0x7d, 0xf6, 0x7c, 0x1a, - 0x86, 0x0d, 0xbd, 0xbe, 0x67, 0xe8, 0xfd, 0x08, 0xf1, 0x69, 0xce, 0x01, 0x38, 0x09, 0x61, 0x70, - 0x1e, 0x92, 0xfd, 0x76, 0xc4, 0xdf, 0xfa, 0x81, 0x18, 0x1e, 0xa2, 0x07, 0xe6, 0x61, 0x4c, 0x04, - 0x28, 0xcd, 0xd0, 0xfb, 0x60, 0xf1, 0xb7, 0x39, 0x8b, 0x51, 0x1f, 0x19, 0x57, 0xc3, 0xc1, 0xb6, - 0x53, 0xc3, 0xfd, 0x30, 0xf9, 0xac, 0x50, 0x83, 0x93, 0x70, 0x53, 0x6e, 0x62, 0xbd, 0xb2, 0xdd, - 0x1f, 0x87, 0x5f, 0x11, 0xa6, 0x14, 0x34, 0x84, 0xc5, 0x1c, 0x8c, 0x34, 0x54, 0xcb, 0xde, 0x56, - 0xeb, 0x7d, 0x75, 0xc7, 0xdf, 0xe1, 0x3c, 0x52, 0x2e, 0x11, 0xb7, 0x48, 0x53, 0xdf, 0x0f, 0x9b, - 0xcf, 0x09, 0x8b, 0xf8, 0xc8, 0xf8, 0xd0, 0xb3, 0x1d, 0xba, 0xa5, 0xb6, 0x1f, 0x6e, 0xbf, 0x2a, - 0x86, 0x1e, 0xa3, 0x5d, 0xf2, 0x73, 0x3c, 0x0f, 0x49, 0x5b, 0xbb, 0xd6, 0x17, 0x9b, 0xcf, 0x8b, - 0x9e, 0xa6, 0x04, 0x84, 0xf8, 0x6d, 0x70, 0xb4, 0xed, 0x34, 0xd1, 0x07, 0xb3, 0xbf, 0xcb, 0x99, - 0x1d, 0x6e, 0x33, 0x55, 0xf0, 0x90, 0xb0, 0x5f, 0x96, 0x7f, 0x4f, 0x84, 0x04, 0x1c, 0xe2, 0xb5, - 0x4a, 0x56, 0x0d, 0xb6, 0xba, 0xb5, 0x3f, 0xab, 0xfd, 0x9a, 0xb0, 0x1a, 0xa3, 0x0d, 0x58, 0x6d, - 0x1d, 0x0e, 0x73, 0x8e, 0xfb, 0xeb, 0xd7, 0x2f, 0x88, 0xc0, 0xca, 0xa8, 0x37, 0x82, 0xbd, 0xfb, - 0x76, 0xc8, 0xba, 0xe6, 0x14, 0xe9, 0xa9, 0x5d, 0x6e, 0xa8, 0x66, 0x1f, 0x9c, 0xbf, 0xc8, 0x39, - 0x8b, 0x88, 0xef, 0xe6, 0xb7, 0xf6, 0x92, 0x6a, 0x12, 0xe6, 0xcf, 0x43, 0x46, 0x30, 0x6f, 0xea, - 0x16, 0xae, 0x18, 0x35, 0x5d, 0xbb, 0x86, 0xab, 0x7d, 0xb0, 0xfe, 0xf5, 0x50, 0x57, 0x6d, 0xf8, - 0xc8, 0x09, 0xe7, 0x05, 0x48, 0xbb, 0xb9, 0x4a, 0x59, 0x6b, 0x98, 0x86, 0xe5, 0xf4, 0xe0, 0xf8, - 0x25, 0xd1, 0x53, 0x2e, 0xdd, 0x02, 0x25, 0xcb, 0x95, 0x80, 0x9d, 0x33, 0xf7, 0xeb, 0x92, 0x5f, - 0xe6, 0x8c, 0x46, 0x3c, 0x2a, 0x1e, 0x38, 0x2a, 0x46, 0xc3, 0x54, 0xad, 0x7e, 0xe2, 0xdf, 0xdf, - 0x17, 0x81, 0x83, 0x93, 0xf0, 0xc0, 0x41, 0x32, 0x3a, 0x32, 0xdb, 0xf7, 0xc1, 0xe1, 0x2b, 0x22, - 0x70, 0x08, 0x1a, 0xce, 0x42, 0x24, 0x0c, 0x7d, 0xb0, 0xf8, 0x07, 0x82, 0x85, 0xa0, 0x21, 0x2c, - 0x9e, 0xf5, 0x26, 0x5a, 0x0b, 0xd7, 0x34, 0xdb, 0xb1, 0x58, 0x52, 0xdc, 0x9d, 0xd5, 0x6f, 0xfc, - 0x20, 0x98, 0x84, 0x29, 0x3e, 0x52, 0x12, 0x89, 0xf8, 0x26, 0x2b, 0x5d, 0x33, 0xf5, 0x16, 0xec, - 0x37, 0x45, 0x24, 0xf2, 0x91, 0x11, 0xd9, 0x7c, 0x19, 0x22, 0x31, 0x7b, 0x85, 0xac, 0x14, 0xfa, - 0x60, 0xf7, 0x0f, 0x43, 0xc2, 0xad, 0x09, 0x5a, 0xc2, 0xd3, 0x97, 0xff, 0x34, 0xf5, 0x1d, 0xbc, - 0xd7, 0x97, 0x77, 0xfe, 0xa3, 0x50, 0xfe, 0xb3, 0xc1, 0x28, 0x59, 0x0c, 0x19, 0x0b, 0xe5, 0x53, - 0xa8, 0xd7, 0xad, 0xa2, 0xcc, 0x7b, 0x7e, 0xc4, 0xf5, 0x0d, 0xa6, 0x53, 0xb9, 0x45, 0xe2, 0xe4, - 0xc1, 0xa4, 0xa7, 0x37, 0xb3, 0xf7, 0xfd, 0xc8, 0xf5, 0xf3, 0x40, 0xce, 0x93, 0xbb, 0x00, 0x23, - 0x81, 0x84, 0xa7, 0x37, 0xab, 0xf7, 0x73, 0x56, 0x29, 0x7f, 0xbe, 0x93, 0x3b, 0x0b, 0x31, 0x92, - 0xbc, 0xf4, 0x26, 0xff, 0x4b, 0x9c, 0x9c, 0xa2, 0xe7, 0xde, 0x0c, 0x09, 0x91, 0xb4, 0xf4, 0x26, - 0xfd, 0x00, 0x27, 0x75, 0x49, 0x08, 0xb9, 0x48, 0x58, 0x7a, 0x93, 0xff, 0x65, 0x41, 0x2e, 0x48, - 0x08, 0x79, 0xff, 0x26, 0xfc, 0xea, 0xcf, 0xc7, 0xf8, 0xa4, 0x23, 0x6c, 0x77, 0x1e, 0x86, 0x78, - 0xa6, 0xd2, 0x9b, 0xfa, 0x43, 0xbc, 0x71, 0x41, 0x91, 0x7b, 0x02, 0xe2, 0x7d, 0x1a, 0xfc, 0x17, - 0x38, 0x29, 0xc3, 0xcf, 0xcd, 0xc1, 0xb0, 0x2f, 0x3b, 0xe9, 0x4d, 0xfe, 0x57, 0x38, 0xb9, 0x9f, - 0x8a, 0x88, 0xce, 0xb3, 0x93, 0xde, 0x0c, 0xfe, 0xaa, 0x10, 0x9d, 0x53, 0x10, 0xb3, 0x89, 0xc4, - 0xa4, 0x37, 0xf5, 0x87, 0x85, 0xd5, 0x05, 0x49, 0xee, 0x69, 0x48, 0xba, 0x93, 0x4d, 0x6f, 0xfa, - 0x8f, 0x70, 0x7a, 0x8f, 0x86, 0x58, 0xc0, 0x37, 0xd9, 0xf5, 0x66, 0xf1, 0xd7, 0x84, 0x05, 0x7c, - 0x54, 0x64, 0x18, 0x85, 0x13, 0x98, 0xde, 0x9c, 0x3e, 0x2a, 0x86, 0x51, 0x28, 0x7f, 0x21, 0xbd, - 0x49, 0x63, 0x7e, 0x6f, 0x16, 0x7f, 0x5d, 0xf4, 0x26, 0xc5, 0x27, 0x62, 0x84, 0x33, 0x82, 0xde, - 0x3c, 0x7e, 0x51, 0x88, 0x11, 0x4a, 0x08, 0x72, 0xab, 0x80, 0x5a, 0xb3, 0x81, 0xde, 0xfc, 0x3e, - 0xc6, 0xf9, 0x8d, 0xb7, 0x24, 0x03, 0xb9, 0xe7, 0xe0, 0x70, 0xfb, 0x4c, 0xa0, 0x37, 0xd7, 0x8f, - 0xff, 0x28, 0xb4, 0x76, 0xf3, 0x27, 0x02, 0xb9, 0x75, 0x6f, 0x4a, 0xf1, 0x67, 0x01, 0xbd, 0xd9, - 0xbe, 0xf2, 0xa3, 0x60, 0xe0, 0xf6, 0x27, 0x01, 0xb9, 0x3c, 0x80, 0x37, 0x01, 0xf7, 0xe6, 0xf5, - 0x49, 0xce, 0xcb, 0x47, 0x44, 0x86, 0x06, 0x9f, 0x7f, 0x7b, 0xd3, 0xdf, 0x10, 0x43, 0x83, 0x53, - 0x90, 0xa1, 0x21, 0xa6, 0xde, 0xde, 0xd4, 0x9f, 0x12, 0x43, 0x43, 0x90, 0x10, 0xcf, 0xf6, 0xcd, - 0x6e, 0xbd, 0x39, 0x7c, 0x5a, 0x78, 0xb6, 0x8f, 0x2a, 0xb7, 0x0c, 0xe3, 0x2d, 0x13, 0x62, 0x6f, - 0x56, 0xbf, 0xc4, 0x59, 0xa5, 0xc3, 0xf3, 0xa1, 0x7f, 0xf2, 0xe2, 0x93, 0x61, 0x6f, 0x6e, 0x9f, - 0x09, 0x4d, 0x5e, 0x7c, 0x2e, 0xcc, 0x9d, 0x87, 0x84, 0xde, 0xac, 0xd7, 0xc9, 0xe0, 0x41, 0xdd, - 0x6f, 0x02, 0x66, 0xfe, 0xe3, 0x8f, 0xb9, 0x75, 0x04, 0x41, 0xee, 0x2c, 0xc4, 0x71, 0x63, 0x13, - 0x57, 0x7b, 0x51, 0x7e, 0xff, 0xc7, 0x22, 0x60, 0x12, 0xec, 0xdc, 0xd3, 0x00, 0x6c, 0x6b, 0x84, - 0x1e, 0x06, 0xf6, 0xa0, 0xfd, 0x4f, 0x3f, 0xe6, 0x57, 0x6f, 0x3c, 0x12, 0x8f, 0x01, 0xbb, 0xc8, - 0xd3, 0x9d, 0xc1, 0x0f, 0x82, 0x0c, 0x68, 0x8f, 0x3c, 0x05, 0x43, 0x2f, 0xda, 0x86, 0xee, 0xa8, - 0xb5, 0x5e, 0xd4, 0xff, 0x99, 0x53, 0x0b, 0x7c, 0x62, 0xb0, 0x86, 0x61, 0x61, 0x47, 0xad, 0xd9, - 0xbd, 0x68, 0xff, 0x0b, 0xa7, 0x75, 0x09, 0x08, 0x71, 0x45, 0xb5, 0x9d, 0x7e, 0xf4, 0xfe, 0x13, - 0x41, 0x2c, 0x08, 0x88, 0xd0, 0xe4, 0xf7, 0x0e, 0xde, 0xeb, 0x45, 0xfb, 0x43, 0x21, 0x34, 0xc7, - 0xcf, 0xbd, 0x19, 0x92, 0xe4, 0x27, 0xbb, 0x4f, 0xd7, 0x83, 0xf8, 0x4f, 0x39, 0xb1, 0x47, 0x41, - 0x5a, 0xb6, 0x9d, 0xaa, 0xa3, 0xf5, 0x36, 0xf6, 0x2d, 0xde, 0xd3, 0x02, 0x3f, 0x97, 0x87, 0x61, - 0xdb, 0xa9, 0x56, 0x9b, 0x3c, 0x3f, 0xed, 0x41, 0xfe, 0x5f, 0x7f, 0xec, 0x6e, 0x59, 0xb8, 0x34, - 0xa4, 0xb7, 0xaf, 0xee, 0x38, 0xa6, 0x41, 0x0f, 0x3c, 0x7a, 0x71, 0xf8, 0x11, 0xe7, 0xe0, 0x23, - 0xc9, 0xcd, 0x41, 0x8a, 0xe8, 0x62, 0x61, 0x13, 0xd3, 0xd3, 0xa9, 0x1e, 0x2c, 0xfe, 0x1b, 0x37, - 0x40, 0x80, 0xa8, 0xf0, 0x73, 0x5f, 0x7f, 0x6d, 0x4a, 0xfa, 0xd6, 0x6b, 0x53, 0xd2, 0x1f, 0xbd, - 0x36, 0x25, 0x7d, 0xf8, 0xbb, 0x53, 0x03, 0xdf, 0xfa, 0xee, 0xd4, 0xc0, 0xef, 0x7f, 0x77, 0x6a, - 0xa0, 0xfd, 0x2e, 0x31, 0xcc, 0x1b, 0xf3, 0x06, 0xdb, 0x1f, 0x7e, 0x41, 0xae, 0x69, 0xce, 0x76, - 0x73, 0x73, 0xb6, 0x62, 0x34, 0xe8, 0x36, 0xae, 0xb7, 0x5b, 0xeb, 0x2e, 0x72, 0xe0, 0xbd, 0x51, - 0x38, 0x5a, 0x31, 0xec, 0x86, 0x61, 0x97, 0xd9, 0x7e, 0x2f, 0x2b, 0xf0, 0x1d, 0xdf, 0x94, 0xbf, - 0xaa, 0x8f, 0x4d, 0xdf, 0x8b, 0x30, 0x4a, 0x55, 0xa7, 0xdb, 0x5d, 0xd4, 0xdb, 0x7a, 0x06, 0x88, - 0x6f, 0xfc, 0xeb, 0x38, 0xd5, 0x7a, 0xc4, 0x25, 0xa4, 0xa7, 0xf7, 0xeb, 0x30, 0xa9, 0x35, 0xcc, - 0x3a, 0xa6, 0xdb, 0xfc, 0x65, 0xb7, 0xae, 0x37, 0xbf, 0x6f, 0x72, 0x7e, 0x13, 0x1e, 0xf9, 0x82, - 0xa0, 0xce, 0x2d, 0xc2, 0xb8, 0x5a, 0xa9, 0x60, 0x33, 0xc0, 0xb2, 0x47, 0xb7, 0x08, 0x01, 0xd3, - 0x9c, 0xd2, 0xe5, 0x56, 0x78, 0xba, 0x53, 0xd7, 0xbc, 0x70, 0xaf, 0xcf, 0xf2, 0x16, 0xae, 0x61, - 0xfd, 0x61, 0x1d, 0x3b, 0x57, 0x0d, 0x6b, 0x87, 0x9b, 0xf7, 0x61, 0xd6, 0xd4, 0x20, 0xbb, 0xc1, - 0x0c, 0xef, 0x8f, 0xc2, 0x14, 0xab, 0x38, 0xbd, 0xa9, 0xda, 0xf8, 0xf4, 0x95, 0x47, 0x37, 0xb1, - 0xa3, 0x3e, 0x7a, 0xba, 0x62, 0x68, 0x3a, 0xef, 0x89, 0x09, 0xde, 0x2f, 0xa4, 0x7e, 0x96, 0xd7, - 0x67, 0xdb, 0x6e, 0xd3, 0xcb, 0xf3, 0x10, 0x9b, 0x33, 0x34, 0x1d, 0x4d, 0x42, 0xbc, 0x8a, 0x75, - 0xa3, 0xc1, 0xef, 0xdc, 0xb1, 0x02, 0xba, 0x1b, 0x06, 0xd5, 0x86, 0xd1, 0xd4, 0x1d, 0x76, 0x42, - 0x51, 0x18, 0xfe, 0xfa, 0xcd, 0xe9, 0x81, 0x3f, 0xb8, 0x39, 0x1d, 0x5d, 0xd0, 0x1d, 0x85, 0x57, - 0xe5, 0x62, 0xaf, 0xbf, 0x3a, 0x2d, 0xc9, 0xcf, 0xc0, 0x50, 0x11, 0x57, 0x0e, 0xc2, 0xab, 0x88, - 0x2b, 0x21, 0x5e, 0x0f, 0x40, 0x62, 0x41, 0x77, 0xd8, 0xad, 0xc8, 0x13, 0x10, 0xd5, 0x74, 0x76, - 0xd1, 0x26, 0xd4, 0x3e, 0x81, 0x13, 0xd4, 0x22, 0xae, 0xb8, 0xa8, 0x55, 0x5c, 0x09, 0xa3, 0x12, - 0xf6, 0x04, 0x5e, 0x28, 0xfe, 0xfe, 0xbf, 0x9f, 0x1a, 0x78, 0xf9, 0xb5, 0xa9, 0x81, 0x8e, 0x3d, - 0xe1, 0x1f, 0x03, 0xdc, 0xc4, 0xbc, 0x0b, 0xec, 0xea, 0x0e, 0x3b, 0x23, 0x71, 0xbb, 0xe1, 0x77, - 0x06, 0x41, 0xe6, 0x38, 0xb6, 0xa3, 0xee, 0x68, 0x7a, 0xcd, 0xed, 0x09, 0xb5, 0xe9, 0x6c, 0x5f, - 0xe3, 0x5d, 0x71, 0x98, 0x77, 0x05, 0xc7, 0xe9, 0xde, 0x1b, 0xd9, 0xce, 0xa3, 0x2b, 0xdb, 0xa3, - 0xcf, 0xe5, 0x7f, 0x11, 0x05, 0xb4, 0xe6, 0xa8, 0x3b, 0x38, 0xdf, 0x74, 0xb6, 0x0d, 0x4b, 0xbb, - 0xc6, 0x62, 0x19, 0x06, 0x68, 0xa8, 0xbb, 0x65, 0xc7, 0xd8, 0xc1, 0xba, 0x4d, 0x4d, 0x33, 0x7c, - 0xe6, 0xe8, 0x6c, 0x1b, 0xff, 0x98, 0x25, 0x5d, 0x57, 0x78, 0xf0, 0x73, 0xdf, 0x99, 0xbe, 0xbf, - 0xb7, 0x15, 0x28, 0x32, 0x49, 0xae, 0x77, 0xd7, 0x29, 0x63, 0x74, 0x19, 0xd8, 0x25, 0x8b, 0x72, - 0x5d, 0xb3, 0x1d, 0x7e, 0x4f, 0xfb, 0xec, 0x6c, 0x7b, 0xdd, 0x67, 0x5b, 0xc5, 0x9c, 0xbd, 0xac, - 0xd6, 0xb5, 0xaa, 0xea, 0x18, 0x96, 0x7d, 0x71, 0x40, 0x49, 0x52, 0x56, 0x8b, 0x9a, 0xed, 0xa0, - 0x75, 0x48, 0x56, 0xb1, 0xbe, 0xc7, 0xd8, 0x46, 0xdf, 0x18, 0xdb, 0x04, 0xe1, 0x44, 0xb9, 0x3e, - 0x0f, 0x48, 0xf5, 0xe3, 0x89, 0x87, 0x49, 0xec, 0x7e, 0x65, 0x07, 0xf6, 0x01, 0xce, 0xf4, 0x1d, - 0xc5, 0xb8, 0x1a, 0x06, 0x65, 0xef, 0x03, 0xf0, 0xda, 0x44, 0x19, 0x18, 0x52, 0xab, 0x55, 0x0b, - 0xdb, 0x36, 0x3d, 0x00, 0x4c, 0x2a, 0xa2, 0x98, 0x1b, 0xff, 0x97, 0x5f, 0x7e, 0x78, 0x24, 0xc0, - 0xb1, 0x90, 0x02, 0xb8, 0xe2, 0x92, 0x9e, 0xfa, 0x94, 0x04, 0xe3, 0x2d, 0x2d, 0x22, 0x19, 0xa6, - 0xf2, 0x1b, 0xeb, 0x17, 0x57, 0x94, 0x85, 0x17, 0xf2, 0xeb, 0x0b, 0x2b, 0xcb, 0x65, 0x76, 0xe5, - 0x7f, 0x79, 0x6d, 0xb5, 0x34, 0xb7, 0x70, 0x61, 0xa1, 0x54, 0x4c, 0x0f, 0xa0, 0x69, 0x38, 0xd6, - 0x06, 0xa7, 0x58, 0x5a, 0x2c, 0xcd, 0xe7, 0xd7, 0x4b, 0x69, 0x09, 0xdd, 0x05, 0x27, 0xda, 0x32, - 0x71, 0x51, 0x22, 0x1d, 0x50, 0x94, 0x92, 0x8b, 0x12, 0x2d, 0x5c, 0xe8, 0x38, 0x8a, 0x1e, 0xea, - 0xea, 0x3f, 0xbb, 0xee, 0x70, 0x09, 0x8e, 0xa7, 0xf7, 0x44, 0xe0, 0x68, 0x78, 0xca, 0x50, 0xf5, - 0xbd, 0x0e, 0xaf, 0x3e, 0x3b, 0x44, 0xb3, 0x8b, 0x10, 0xcd, 0xeb, 0x7b, 0xe8, 0x28, 0xcb, 0xa7, - 0xcb, 0x4d, 0xab, 0xce, 0x63, 0xd0, 0x10, 0x29, 0x6f, 0x58, 0x75, 0x12, 0x9b, 0xc4, 0x45, 0x7f, - 0xe9, 0x64, 0x8a, 0xdf, 0xde, 0xcf, 0xa5, 0x3f, 0xf6, 0xea, 0xf4, 0xc0, 0x17, 0x5e, 0x9d, 0x1e, - 0xf8, 0xe1, 0xa7, 0xa7, 0x07, 0x5e, 0xfe, 0xc3, 0x99, 0x81, 0xc2, 0x4e, 0x58, 0xbd, 0xaf, 0xf6, - 0x9c, 0x4d, 0x13, 0x79, 0x7d, 0x8f, 0x06, 0xa2, 0x55, 0xe9, 0x85, 0x38, 0x55, 0x4e, 0x1c, 0xa0, - 0x4e, 0x85, 0x0f, 0x50, 0x9f, 0xc3, 0xf5, 0xfa, 0x25, 0xdd, 0xb8, 0x4a, 0x7b, 0xd5, 0xb3, 0xc1, - 0x47, 0x23, 0x30, 0xd5, 0x32, 0x6d, 0xf2, 0x0c, 0xa3, 0xd3, 0xf3, 0xd7, 0x1c, 0x24, 0x8a, 0x22, - 0x71, 0xc9, 0xc0, 0x90, 0x8d, 0x2b, 0x86, 0x5e, 0x65, 0x23, 0x3d, 0xaa, 0x88, 0x22, 0x51, 0x5b, - 0x57, 0x75, 0xc3, 0xe6, 0x77, 0xee, 0x59, 0xa1, 0xf0, 0x09, 0x69, 0x7f, 0xf9, 0xc2, 0x88, 0x68, - 0x49, 0xa8, 0xf9, 0x68, 0xcf, 0x23, 0xe5, 0x1d, 0xa2, 0xa5, 0xab, 0x44, 0xe0, 0x58, 0xb9, 0x5f, - 0xab, 0xfc, 0x62, 0x04, 0xa6, 0xc3, 0x56, 0x21, 0x69, 0x9b, 0xed, 0xa8, 0x0d, 0xb3, 0x93, 0x59, - 0xce, 0x43, 0x72, 0x5d, 0xe0, 0xec, 0xdb, 0x2e, 0x37, 0xf6, 0x69, 0x97, 0x51, 0xb7, 0x29, 0x61, - 0x98, 0x33, 0x7d, 0x1a, 0xc6, 0xd5, 0xe3, 0x40, 0x96, 0xf9, 0x5c, 0x0c, 0x4e, 0xd0, 0x47, 0x59, - 0x56, 0x43, 0xd3, 0x9d, 0xd3, 0x15, 0x6b, 0xcf, 0x74, 0x68, 0xe2, 0x66, 0x6c, 0x71, 0xbb, 0x8c, - 0x7b, 0xd5, 0xb3, 0xac, 0xba, 0xc3, 0xc8, 0xd9, 0x82, 0xf8, 0x2a, 0xa1, 0x23, 0x16, 0x71, 0x0c, - 0x47, 0xad, 0x73, 0x4b, 0xb1, 0x02, 0x81, 0xb2, 0x87, 0x5c, 0x11, 0x06, 0xd5, 0xc4, 0x1b, 0xae, - 0x3a, 0x56, 0xb7, 0xd8, 0x7d, 0xf8, 0x28, 0x1d, 0x50, 0x09, 0x02, 0xa0, 0x57, 0xdf, 0x27, 0x21, - 0xae, 0x36, 0xd9, 0x55, 0x8e, 0x28, 0x19, 0x69, 0xb4, 0x20, 0x5f, 0x82, 0x21, 0x7e, 0xa0, 0x8c, - 0xd2, 0x10, 0xdd, 0xc1, 0x7b, 0xb4, 0x9d, 0x94, 0x42, 0x7e, 0xa2, 0x59, 0x88, 0x53, 0xe1, 0xf9, - 0x04, 0x92, 0x99, 0x6d, 0x91, 0x7e, 0x96, 0x0a, 0xa9, 0x30, 0x34, 0xf9, 0x19, 0x48, 0x14, 0x8d, - 0x86, 0xa6, 0x1b, 0x41, 0x6e, 0x49, 0xc6, 0x8d, 0xca, 0x6c, 0x36, 0x79, 0xbe, 0xa1, 0xb0, 0x02, - 0x3a, 0x0c, 0x83, 0xec, 0x7d, 0x04, 0xbf, 0x8e, 0xc2, 0x4b, 0xf2, 0x1c, 0x0c, 0x51, 0xde, 0x2b, - 0x26, 0x42, 0xfc, 0x65, 0x1d, 0x7f, 0x88, 0x41, 0x53, 0x53, 0xce, 0x3e, 0xe2, 0x09, 0x8b, 0x20, - 0x56, 0x55, 0x1d, 0x95, 0xeb, 0x4d, 0x7f, 0xcb, 0x6f, 0x81, 0x04, 0x67, 0x62, 0xa3, 0x33, 0x10, - 0x35, 0x4c, 0x9b, 0x5f, 0x28, 0xc9, 0x76, 0x52, 0x65, 0xc5, 0x2c, 0xc4, 0x48, 0xa6, 0xa2, 0x10, - 0xe4, 0x82, 0xd2, 0x31, 0xa8, 0x3e, 0xe9, 0x0b, 0xaa, 0xbe, 0x2e, 0xf7, 0xfd, 0x64, 0x5d, 0xda, - 0xe2, 0x0e, 0xae, 0xb3, 0x7c, 0x3a, 0x02, 0x53, 0xbe, 0xda, 0x2b, 0xd8, 0xb2, 0x35, 0x43, 0xe7, - 0xf3, 0x39, 0xf3, 0x16, 0xe4, 0x13, 0x92, 0xd7, 0x77, 0x70, 0x97, 0x37, 0x43, 0x34, 0x6f, 0x9a, - 0x28, 0x0b, 0x09, 0x5a, 0xae, 0x18, 0xcc, 0x5f, 0x62, 0x8a, 0x5b, 0x26, 0x75, 0xb6, 0xb1, 0xe5, - 0x5c, 0x55, 0x2d, 0xf7, 0x09, 0xa1, 0x28, 0xcb, 0x4f, 0x41, 0x72, 0xce, 0xd0, 0x6d, 0xac, 0xdb, - 0x4d, 0x3a, 0x06, 0x37, 0xeb, 0x46, 0x65, 0x87, 0x73, 0x60, 0x05, 0x62, 0x70, 0xd5, 0x34, 0x29, - 0x65, 0x4c, 0x21, 0x3f, 0x59, 0x6e, 0x58, 0x58, 0xeb, 0x68, 0xa2, 0xa7, 0xf6, 0x6f, 0x22, 0xae, - 0xa4, 0x6b, 0xa3, 0xff, 0x25, 0xc1, 0xf1, 0xd6, 0x01, 0xb5, 0x83, 0xf7, 0xec, 0xfd, 0x8e, 0xa7, - 0xe7, 0x21, 0xb9, 0x4a, 0xdf, 0xf1, 0x5f, 0xc2, 0x7b, 0x28, 0x0b, 0x43, 0xb8, 0x7a, 0xe6, 0xec, - 0xd9, 0x47, 0x9f, 0x62, 0xde, 0x7e, 0x71, 0x40, 0x11, 0x00, 0x34, 0x05, 0x49, 0x1b, 0x57, 0xcc, - 0x33, 0x67, 0xcf, 0xed, 0x3c, 0xca, 0xdc, 0x8b, 0x64, 0x40, 0x2e, 0x28, 0x97, 0x20, 0x5a, 0xbf, - 0xfe, 0xe9, 0x69, 0xa9, 0x10, 0x87, 0xa8, 0xdd, 0x6c, 0xdc, 0x51, 0x1f, 0x79, 0x25, 0x0e, 0x33, - 0x7e, 0x4a, 0x1a, 0xa9, 0xdc, 0xac, 0x84, 0xdb, 0x20, 0xed, 0xb3, 0x01, 0xc5, 0xe8, 0x90, 0xcc, - 0x76, 0xb5, 0xa4, 0xfc, 0xeb, 0x12, 0xa4, 0xdc, 0x54, 0x69, 0x0d, 0x3b, 0xe8, 0xbc, 0x3f, 0xff, - 0xe1, 0xc3, 0xe6, 0xd8, 0x6c, 0xb8, 0x2d, 0x2f, 0xa5, 0x53, 0x7c, 0xe8, 0xe8, 0x09, 0xea, 0x88, - 0xa6, 0x61, 0xf3, 0x67, 0x65, 0x3d, 0x48, 0x5d, 0x64, 0xf4, 0x10, 0x20, 0x1a, 0xe1, 0xca, 0x57, - 0x0c, 0x47, 0xd3, 0x6b, 0x65, 0xd3, 0xb8, 0xca, 0x1f, 0xeb, 0x46, 0x95, 0x34, 0xad, 0xb9, 0x4c, - 0x2b, 0x56, 0x09, 0x9c, 0x08, 0x9d, 0x74, 0xb9, 0x04, 0xd3, 0x3b, 0x12, 0x04, 0x44, 0x11, 0x9d, - 0x87, 0x21, 0xb3, 0xb9, 0x59, 0x16, 0x11, 0x63, 0xf8, 0xcc, 0xf1, 0x76, 0xe3, 0x5f, 0xf8, 0x07, - 0x8f, 0x00, 0x83, 0x66, 0x73, 0x93, 0x78, 0xcb, 0x5d, 0x90, 0x6a, 0x23, 0xcc, 0xf0, 0x15, 0x4f, - 0x0e, 0xfa, 0xf9, 0x08, 0xae, 0x41, 0xd9, 0xb4, 0x34, 0xc3, 0xd2, 0x9c, 0x3d, 0x9a, 0xbf, 0x46, - 0x95, 0xb4, 0xa8, 0x58, 0xe5, 0x70, 0x79, 0x07, 0xc6, 0xd6, 0xe8, 0xfa, 0xd6, 0x93, 0xfc, 0xac, - 0x27, 0x9f, 0xd4, 0x5b, 0xbe, 0x8e, 0x92, 0x45, 0x5a, 0x24, 0x2b, 0x3c, 0xdb, 0xd1, 0x3b, 0x9f, - 0xd8, 0xbf, 0x77, 0x06, 0x33, 0xc4, 0x3f, 0x39, 0x1a, 0x18, 0x9c, 0xcc, 0x39, 0xfd, 0xe1, 0xab, - 0x5f, 0xc7, 0xec, 0x95, 0x4d, 0x64, 0xbb, 0x4f, 0xaa, 0xd9, 0x1e, 0x61, 0x34, 0xdb, 0x73, 0x08, - 0xc9, 0x4f, 0xc1, 0xc8, 0xaa, 0x6a, 0x39, 0x6b, 0xd8, 0xb9, 0x88, 0xd5, 0x2a, 0xb6, 0x82, 0xb3, - 0xee, 0x88, 0x98, 0x75, 0x11, 0xc4, 0xe8, 0xd4, 0xca, 0x66, 0x1d, 0xfa, 0x5b, 0xde, 0x86, 0x18, - 0xbd, 0x19, 0xea, 0xce, 0xc8, 0x9c, 0x82, 0xcd, 0xc8, 0x24, 0x96, 0xee, 0x39, 0xd8, 0x16, 0xe9, - 0x2d, 0x2d, 0xa0, 0xc7, 0xc5, 0xbc, 0x1a, 0xed, 0x3e, 0xaf, 0x72, 0x47, 0xe4, 0xb3, 0x6b, 0x1d, - 0x86, 0x0a, 0x24, 0x14, 0x2f, 0x14, 0x5d, 0x41, 0x24, 0x4f, 0x10, 0xb4, 0x04, 0x63, 0xa6, 0x6a, - 0x39, 0xf4, 0x49, 0xcc, 0x36, 0xd5, 0x82, 0xfb, 0xfa, 0x74, 0xeb, 0xc8, 0x0b, 0x28, 0xcb, 0x5b, - 0x19, 0x31, 0xfd, 0x40, 0xf9, 0x8f, 0x63, 0x30, 0xc8, 0x8d, 0xf1, 0x66, 0x18, 0xe2, 0x66, 0xe5, - 0xde, 0x79, 0x62, 0xb6, 0x75, 0x62, 0x9a, 0x75, 0x27, 0x10, 0xce, 0x4f, 0xd0, 0xa0, 0xfb, 0x20, - 0x51, 0xd9, 0x56, 0x35, 0xbd, 0xac, 0x55, 0xc5, 0x56, 0xc3, 0x6b, 0x37, 0xa7, 0x87, 0xe6, 0x08, - 0x6c, 0xa1, 0xa8, 0x0c, 0xd1, 0xca, 0x85, 0x2a, 0xc9, 0x04, 0xb6, 0xb1, 0x56, 0xdb, 0x76, 0xf8, - 0x08, 0xe3, 0x25, 0xf4, 0x24, 0xc4, 0x88, 0x43, 0xf0, 0x07, 0x93, 0xd9, 0x96, 0x0d, 0x1f, 0x37, - 0xd9, 0x2b, 0x24, 0x48, 0xc3, 0x1f, 0xfe, 0xce, 0xb4, 0xa4, 0x50, 0x0a, 0x34, 0x07, 0x23, 0x75, - 0xd5, 0x76, 0xca, 0x74, 0x06, 0x23, 0xcd, 0xc7, 0xf9, 0x7a, 0xbb, 0xc5, 0x20, 0xdc, 0xb0, 0x5c, - 0xf4, 0x61, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xd2, 0x94, 0x49, 0xc5, 0x68, 0x34, 0x34, 0x87, - 0xe5, 0x56, 0x83, 0xd4, 0xee, 0xa3, 0x04, 0x3e, 0x47, 0xc1, 0x34, 0xc3, 0x3a, 0x06, 0x49, 0xfa, - 0x44, 0x8b, 0xa2, 0xb0, 0xeb, 0xc8, 0x09, 0x02, 0xa0, 0x95, 0xf7, 0xc3, 0x98, 0x17, 0x1f, 0x19, - 0x4a, 0x82, 0x71, 0xf1, 0xc0, 0x14, 0xf1, 0x11, 0x98, 0xd4, 0xf1, 0x2e, 0xbd, 0x20, 0x1d, 0xc0, - 0x4e, 0x52, 0x6c, 0x44, 0xea, 0x2e, 0x07, 0x29, 0xee, 0x85, 0xd1, 0x8a, 0x30, 0x3e, 0xc3, 0x05, - 0x8a, 0x3b, 0xe2, 0x42, 0x29, 0xda, 0x51, 0x48, 0xa8, 0xa6, 0xc9, 0x10, 0x86, 0x79, 0x7c, 0x34, - 0x4d, 0x5a, 0x75, 0x0a, 0xc6, 0xa9, 0x8e, 0x16, 0xb6, 0x9b, 0x75, 0x87, 0x33, 0x49, 0x51, 0x9c, - 0x31, 0x52, 0xa1, 0x30, 0x38, 0xc5, 0xbd, 0x1b, 0x46, 0xf0, 0x15, 0xad, 0x8a, 0xf5, 0x0a, 0x66, - 0x78, 0x23, 0x14, 0x2f, 0x25, 0x80, 0x14, 0xe9, 0x01, 0x70, 0xe3, 0x5e, 0x59, 0xc4, 0xe4, 0x51, - 0xc6, 0x4f, 0xc0, 0xf3, 0x0c, 0x2c, 0x67, 0x20, 0x56, 0x54, 0x1d, 0x95, 0x24, 0x18, 0xce, 0x2e, - 0x9b, 0x68, 0x52, 0x0a, 0xf9, 0x29, 0xbf, 0x1e, 0x81, 0xd8, 0x65, 0xc3, 0xc1, 0xe8, 0x31, 0x5f, - 0x02, 0x38, 0xda, 0xce, 0x9f, 0xd7, 0xb4, 0x9a, 0x8e, 0xab, 0x4b, 0x76, 0xcd, 0xf7, 0x3d, 0x05, - 0xcf, 0x9d, 0x22, 0x01, 0x77, 0x9a, 0x84, 0xb8, 0x65, 0x34, 0xf5, 0xaa, 0xb8, 0xc9, 0x4b, 0x0b, - 0xa8, 0x04, 0x09, 0xd7, 0x4b, 0x62, 0xbd, 0xbc, 0x64, 0x8c, 0x78, 0x09, 0xf1, 0x61, 0x0e, 0x50, - 0x86, 0x36, 0xb9, 0xb3, 0x14, 0x20, 0xe9, 0x06, 0x2f, 0xee, 0x6d, 0xfd, 0x39, 0xac, 0x47, 0x46, - 0x26, 0x13, 0xb7, 0xef, 0x5d, 0xe3, 0x31, 0x8f, 0x4b, 0xbb, 0x15, 0xdc, 0x7a, 0x01, 0xb7, 0xe2, - 0xdf, 0x76, 0x18, 0xa2, 0x7a, 0x79, 0x6e, 0xc5, 0xbe, 0xef, 0x70, 0x1c, 0x92, 0xb6, 0x56, 0xd3, - 0x55, 0xa7, 0x69, 0x61, 0xee, 0x79, 0x1e, 0x40, 0xfe, 0xaa, 0x04, 0x83, 0xcc, 0x93, 0x7d, 0x76, - 0x93, 0xda, 0xdb, 0x2d, 0xd2, 0xc9, 0x6e, 0xd1, 0x83, 0xdb, 0x2d, 0x0f, 0xe0, 0x0a, 0x63, 0xf3, - 0x27, 0xf7, 0x6d, 0x32, 0x06, 0x26, 0xe2, 0x9a, 0x56, 0xe3, 0x03, 0xd5, 0x47, 0x24, 0xff, 0x3b, - 0x89, 0x24, 0xb1, 0xbc, 0x1e, 0xe5, 0x61, 0x44, 0xc8, 0x55, 0xde, 0xaa, 0xab, 0x35, 0xee, 0x3b, - 0x27, 0x3a, 0x0a, 0x77, 0xa1, 0xae, 0xd6, 0x94, 0x61, 0x2e, 0x0f, 0x29, 0xb4, 0xef, 0x87, 0x48, - 0x87, 0x7e, 0x08, 0x74, 0x7c, 0xf4, 0x60, 0x1d, 0x1f, 0xe8, 0xa2, 0x58, 0xb8, 0x8b, 0xbe, 0x14, - 0xa1, 0x8b, 0x19, 0xd3, 0xb0, 0xd5, 0xfa, 0x4f, 0x62, 0x44, 0x1c, 0x83, 0xa4, 0x69, 0xd4, 0xcb, - 0xac, 0x86, 0xdd, 0x70, 0x4f, 0x98, 0x46, 0x5d, 0x69, 0xe9, 0xf6, 0xf8, 0x6d, 0x1a, 0x2e, 0x83, - 0xb7, 0xc1, 0x6a, 0x43, 0x61, 0xab, 0x59, 0x90, 0x62, 0xa6, 0xe0, 0x73, 0xd9, 0x23, 0xc4, 0x06, - 0x74, 0x72, 0x94, 0x5a, 0xe7, 0x5e, 0x26, 0x36, 0xc3, 0x54, 0x38, 0x1e, 0xa1, 0x60, 0xa1, 0xbf, - 0xdd, 0x2a, 0xd8, 0xef, 0x96, 0x0a, 0xc7, 0x93, 0xff, 0x86, 0x04, 0xb0, 0x48, 0x2c, 0x4b, 0xf5, - 0x25, 0xb3, 0x90, 0x4d, 0x45, 0x28, 0x07, 0x5a, 0x9e, 0xea, 0xd4, 0x69, 0xbc, 0xfd, 0x94, 0xed, - 0x97, 0x7b, 0x0e, 0x46, 0x3c, 0x67, 0xb4, 0xb1, 0x10, 0x66, 0xaa, 0x4b, 0x56, 0xbd, 0x86, 0x1d, - 0x25, 0x75, 0xc5, 0x57, 0x92, 0xff, 0xa9, 0x04, 0x49, 0x2a, 0xd3, 0x12, 0x76, 0xd4, 0x40, 0x1f, - 0x4a, 0x07, 0xef, 0xc3, 0x13, 0x00, 0x8c, 0x8d, 0xad, 0x5d, 0xc3, 0xdc, 0xb3, 0x92, 0x14, 0xb2, - 0xa6, 0x5d, 0xc3, 0xe8, 0x9c, 0x6b, 0xf0, 0x68, 0x77, 0x83, 0x8b, 0xac, 0x9b, 0x9b, 0xfd, 0x08, - 0x0c, 0xd1, 0x4f, 0x54, 0xed, 0xda, 0x3c, 0x91, 0x1e, 0xd4, 0x9b, 0x8d, 0xf5, 0x5d, 0x5b, 0x7e, - 0x11, 0x86, 0xd6, 0x77, 0xd9, 0xde, 0xc8, 0x31, 0x48, 0x5a, 0x86, 0xc1, 0xe7, 0x64, 0x96, 0x0b, - 0x25, 0x08, 0x80, 0x4e, 0x41, 0x62, 0x3f, 0x20, 0xe2, 0xed, 0x07, 0x78, 0x1b, 0x1a, 0xd1, 0xbe, - 0x36, 0x34, 0x4e, 0xfd, 0x1b, 0x09, 0x86, 0x7d, 0xf1, 0x01, 0x3d, 0x0a, 0x87, 0x0a, 0x8b, 0x2b, - 0x73, 0x97, 0xca, 0x0b, 0xc5, 0xf2, 0x85, 0xc5, 0xfc, 0xbc, 0xf7, 0x86, 0x2b, 0x7b, 0xf8, 0xfa, - 0x8d, 0x19, 0xe4, 0xc3, 0xdd, 0xd0, 0xe9, 0x8e, 0x12, 0x3a, 0x0d, 0x93, 0x41, 0x92, 0x7c, 0x61, - 0xad, 0xb4, 0xbc, 0x9e, 0x96, 0xb2, 0x87, 0xae, 0xdf, 0x98, 0x19, 0xf7, 0x51, 0xe4, 0x37, 0x6d, - 0xac, 0x3b, 0xad, 0x04, 0x73, 0x2b, 0x4b, 0x4b, 0x0b, 0xeb, 0xe9, 0x48, 0x0b, 0x01, 0x0f, 0xd8, - 0x0f, 0xc0, 0x78, 0x90, 0x60, 0x79, 0x61, 0x31, 0x1d, 0xcd, 0xa2, 0xeb, 0x37, 0x66, 0x46, 0x7d, - 0xd8, 0xcb, 0x5a, 0x3d, 0x9b, 0xf8, 0xe0, 0x67, 0xa6, 0x06, 0x7e, 0xe5, 0x97, 0xa7, 0x24, 0xa2, - 0xd9, 0x48, 0x20, 0x46, 0xa0, 0x87, 0xe0, 0xc8, 0xda, 0xc2, 0xfc, 0x72, 0xa9, 0x58, 0x5e, 0x5a, - 0x9b, 0x17, 0x7b, 0xd0, 0x42, 0xbb, 0xb1, 0xeb, 0x37, 0x66, 0x86, 0xb9, 0x4a, 0x9d, 0xb0, 0x57, - 0x95, 0xd2, 0xe5, 0x95, 0xf5, 0x52, 0x5a, 0x62, 0xd8, 0xab, 0x16, 0xbe, 0x62, 0x38, 0xec, 0x1b, - 0x76, 0x8f, 0xc0, 0xd1, 0x36, 0xd8, 0xae, 0x62, 0xe3, 0xd7, 0x6f, 0xcc, 0x8c, 0xac, 0x5a, 0x98, - 0x8d, 0x1f, 0x4a, 0x31, 0x0b, 0x99, 0x56, 0x8a, 0x95, 0xd5, 0x95, 0xb5, 0xfc, 0x62, 0x7a, 0x26, - 0x9b, 0xbe, 0x7e, 0x63, 0x26, 0x25, 0x82, 0x21, 0xdd, 0xe8, 0x77, 0x35, 0xbb, 0x93, 0x2b, 0x9e, - 0x4f, 0xce, 0xc2, 0x3d, 0x1d, 0xce, 0x98, 0xc4, 0xe9, 0xc4, 0x81, 0x4e, 0x99, 0x3a, 0xee, 0xb3, - 0x67, 0x7b, 0x6c, 0x3f, 0xf7, 0x5e, 0x3a, 0x1d, 0xfc, 0x04, 0x2b, 0xdb, 0x75, 0x71, 0x27, 0x7f, - 0x48, 0x82, 0xd1, 0x8b, 0x9a, 0xed, 0x18, 0x96, 0x56, 0x51, 0xeb, 0xf4, 0xe5, 0xd6, 0xb9, 0x7e, - 0x63, 0x6b, 0x68, 0xa8, 0x3f, 0x0d, 0x83, 0x57, 0xd4, 0x3a, 0x0b, 0x6a, 0x51, 0xfa, 0xa1, 0x99, - 0x0e, 0x47, 0x3e, 0x6e, 0x68, 0x13, 0x0c, 0x18, 0x99, 0xfc, 0x6b, 0x11, 0x18, 0xa3, 0x83, 0xc1, - 0x66, 0x9f, 0x20, 0x23, 0x6b, 0xac, 0x02, 0xc4, 0x2c, 0xd5, 0xe1, 0x9b, 0x86, 0x85, 0x59, 0x7e, - 0xfa, 0x78, 0x5f, 0x1f, 0x67, 0x69, 0x45, 0x5c, 0x51, 0x28, 0x2d, 0x7a, 0x07, 0x24, 0x1a, 0xea, - 0x6e, 0x99, 0xf2, 0x61, 0x2b, 0x97, 0xfc, 0xfe, 0xf8, 0xdc, 0xba, 0x39, 0x3d, 0xb6, 0xa7, 0x36, - 0xea, 0x39, 0x59, 0xf0, 0x91, 0x95, 0xa1, 0x86, 0xba, 0x4b, 0x44, 0x44, 0x26, 0x8c, 0x11, 0x68, - 0x65, 0x5b, 0xd5, 0x6b, 0x98, 0x35, 0x42, 0xb7, 0x40, 0x0b, 0x17, 0xf7, 0xdd, 0xc8, 0x61, 0xaf, - 0x11, 0x1f, 0x3b, 0x59, 0x19, 0x69, 0xa8, 0xbb, 0x73, 0x14, 0x40, 0x5a, 0xcc, 0x25, 0x3e, 0xf6, - 0xea, 0xf4, 0x00, 0x3d, 0xd1, 0xfd, 0xb6, 0x04, 0xe0, 0x59, 0x0c, 0xbd, 0x03, 0xd2, 0x15, 0xb7, - 0x44, 0x69, 0xc5, 0xd9, 0xe4, 0xfd, 0x9d, 0xfa, 0x22, 0x64, 0x6f, 0x36, 0x37, 0x7f, 0xeb, 0xe6, - 0xb4, 0xa4, 0x8c, 0x55, 0x42, 0x5d, 0xf1, 0x76, 0x18, 0x6e, 0x9a, 0x55, 0xd5, 0xc1, 0x65, 0xba, - 0x8e, 0x8b, 0xf4, 0x9c, 0xe7, 0xa7, 0x08, 0xaf, 0x5b, 0x37, 0xa7, 0x11, 0x53, 0xcb, 0x47, 0x2c, - 0xd3, 0xd9, 0x1f, 0x18, 0x84, 0x10, 0xf8, 0x74, 0xfa, 0x86, 0x04, 0xc3, 0x45, 0xdf, 0x9d, 0xca, - 0x0c, 0x0c, 0x35, 0x0c, 0x5d, 0xdb, 0xe1, 0xfe, 0x98, 0x54, 0x44, 0x11, 0x65, 0x21, 0xc1, 0x1e, - 0xb3, 0x3a, 0x7b, 0x62, 0x2b, 0x54, 0x94, 0x09, 0xd5, 0x55, 0xbc, 0x69, 0x6b, 0xa2, 0x37, 0x14, - 0x51, 0x44, 0x17, 0x20, 0x6d, 0xe3, 0x4a, 0xd3, 0xd2, 0x9c, 0xbd, 0x72, 0xc5, 0xd0, 0x1d, 0xb5, - 0xe2, 0xb0, 0x67, 0x91, 0x85, 0x63, 0xb7, 0x6e, 0x4e, 0x1f, 0x61, 0xb2, 0x86, 0x31, 0x64, 0x65, - 0x4c, 0x80, 0xe6, 0x18, 0x84, 0xb4, 0x50, 0xc5, 0x8e, 0xaa, 0xd5, 0xed, 0x0c, 0xbb, 0x9c, 0x20, - 0x8a, 0x3e, 0x5d, 0x3e, 0x3f, 0xe4, 0xdf, 0xd8, 0xba, 0x00, 0x69, 0xc3, 0xc4, 0x56, 0x20, 0x11, - 0x95, 0xc2, 0x2d, 0x87, 0x31, 0x64, 0x65, 0x4c, 0x80, 0x44, 0x92, 0xea, 0x90, 0x6e, 0x16, 0x0b, - 0x45, 0xb3, 0xb9, 0xe9, 0xed, 0x87, 0x4d, 0xb6, 0xf4, 0x46, 0x5e, 0xdf, 0x2b, 0x3c, 0xe6, 0x71, - 0x0f, 0xd3, 0xc9, 0xdf, 0xfc, 0xf2, 0xc3, 0x93, 0xdc, 0x35, 0xbc, 0xfd, 0xa9, 0x4b, 0x78, 0x8f, - 0x74, 0x3f, 0x47, 0x5d, 0xa5, 0x98, 0x24, 0xed, 0x7c, 0x51, 0xd5, 0xea, 0xe2, 0x79, 0xbf, 0xc2, - 0x4b, 0x28, 0x07, 0x83, 0xb6, 0xa3, 0x3a, 0x4d, 0x9b, 0x9f, 0xf4, 0xca, 0x9d, 0x5c, 0xad, 0x60, - 0xe8, 0xd5, 0x35, 0x8a, 0xa9, 0x70, 0x0a, 0x74, 0x01, 0x06, 0xf9, 0x11, 0x7a, 0x7c, 0xdf, 0xe3, - 0x9b, 0xde, 0x95, 0x60, 0xd4, 0xc4, 0x22, 0x55, 0x5c, 0xc7, 0x35, 0x96, 0x56, 0x6d, 0xab, 0x64, - 0xf5, 0x41, 0xbf, 0xbd, 0x57, 0x58, 0xd8, 0xf7, 0x20, 0xe4, 0x96, 0x0a, 0xf3, 0x93, 0x95, 0x31, - 0x17, 0xb4, 0x46, 0x21, 0xe8, 0x52, 0xe0, 0xf2, 0x2f, 0xff, 0x40, 0xe5, 0xdd, 0x9d, 0xd4, 0xf7, - 0xf9, 0xb4, 0xd8, 0x9f, 0xf0, 0x5f, 0x1d, 0xbe, 0x00, 0xe9, 0xa6, 0xbe, 0x69, 0xe8, 0xf4, 0x0d, - 0x2e, 0xcf, 0xef, 0xc9, 0xfa, 0x2e, 0xea, 0x77, 0x8e, 0x30, 0x86, 0xac, 0x8c, 0xb9, 0xa0, 0x8b, - 0x6c, 0x15, 0x50, 0x85, 0x51, 0x0f, 0x8b, 0x0e, 0xd4, 0x64, 0xcf, 0x81, 0x7a, 0x17, 0x1f, 0xa8, - 0x87, 0xc2, 0xad, 0x78, 0x63, 0x75, 0xc4, 0x05, 0x12, 0x32, 0x74, 0x11, 0xc0, 0x0b, 0x0f, 0x74, - 0x9f, 0x62, 0xb8, 0x73, 0xc7, 0x7b, 0x31, 0x46, 0xac, 0xf7, 0x3c, 0x5a, 0xf4, 0x2e, 0x98, 0x68, - 0x68, 0x7a, 0xd9, 0xc6, 0xf5, 0xad, 0x32, 0x37, 0x30, 0x61, 0x49, 0x3f, 0xa1, 0x54, 0x58, 0xdc, - 0x9f, 0x3f, 0xdc, 0xba, 0x39, 0x9d, 0xe5, 0x21, 0xb4, 0x95, 0xa5, 0xac, 0x8c, 0x37, 0x34, 0x7d, - 0x0d, 0xd7, 0xb7, 0x8a, 0x2e, 0x2c, 0x97, 0xfa, 0xe0, 0xab, 0xd3, 0x03, 0x7c, 0xb8, 0x0e, 0xc8, - 0xe7, 0xe8, 0xde, 0x39, 0x1f, 0x66, 0xd8, 0x26, 0x6b, 0x12, 0x55, 0x14, 0xf8, 0x55, 0x03, 0x0f, - 0xc0, 0x86, 0xf9, 0xcb, 0x7f, 0x38, 0x23, 0xc9, 0x9f, 0x97, 0x60, 0xb0, 0x78, 0x79, 0x55, 0xd5, - 0x2c, 0xb4, 0x00, 0xe3, 0x9e, 0xe7, 0x04, 0x07, 0xf9, 0xf1, 0x5b, 0x37, 0xa7, 0x33, 0x61, 0xe7, - 0x72, 0x47, 0xb9, 0xe7, 0xc0, 0x62, 0x98, 0x2f, 0x74, 0x5a, 0xb8, 0x06, 0x58, 0xb5, 0xa0, 0xc8, - 0xad, 0xcb, 0xda, 0x90, 0x9a, 0x25, 0x18, 0x62, 0xd2, 0xda, 0x28, 0x07, 0x71, 0x93, 0xfc, 0xe0, - 0x07, 0x03, 0x53, 0x1d, 0x9d, 0x97, 0xe2, 0xbb, 0x1b, 0x99, 0x84, 0x44, 0xfe, 0x48, 0x04, 0xa0, - 0x78, 0xf9, 0xf2, 0xba, 0xa5, 0x99, 0x75, 0xec, 0xdc, 0x4e, 0xcd, 0xd7, 0xe1, 0x90, 0x6f, 0x95, - 0x64, 0x55, 0x42, 0xda, 0xcf, 0xdc, 0xba, 0x39, 0x7d, 0x3c, 0xac, 0xbd, 0x0f, 0x4d, 0x56, 0x26, - 0xbc, 0xf5, 0x92, 0x55, 0x69, 0xcb, 0xb5, 0x6a, 0x3b, 0x2e, 0xd7, 0x68, 0x67, 0xae, 0x3e, 0x34, - 0x3f, 0xd7, 0xa2, 0xed, 0xb4, 0x37, 0xed, 0x1a, 0x0c, 0x7b, 0x26, 0xb1, 0x51, 0x11, 0x12, 0x0e, - 0xff, 0xcd, 0x2d, 0x2c, 0x77, 0xb6, 0xb0, 0x20, 0xe3, 0x56, 0x76, 0x29, 0xe5, 0x3f, 0x93, 0x00, - 0x3c, 0x9f, 0xfd, 0xd9, 0x74, 0x31, 0x12, 0xca, 0x79, 0xe0, 0x8d, 0x1e, 0x28, 0x55, 0xe3, 0xd4, - 0x21, 0x7b, 0xfe, 0x7c, 0x04, 0x26, 0x36, 0x44, 0xe4, 0xf9, 0x99, 0xb7, 0xc1, 0x2a, 0x0c, 0x61, - 0xdd, 0xb1, 0x34, 0x6a, 0x04, 0xd2, 0xdb, 0x8f, 0x74, 0xea, 0xed, 0x36, 0x3a, 0xd1, 0x8f, 0x48, - 0x89, 0x4d, 0x77, 0xce, 0x26, 0x64, 0x8d, 0xdf, 0x88, 0x42, 0xa6, 0x13, 0x25, 0x9a, 0x83, 0xb1, - 0x8a, 0x85, 0xd9, 0xc5, 0x2b, 0xff, 0xce, 0x5f, 0x21, 0xeb, 0x65, 0x96, 0x21, 0x04, 0x59, 0x19, - 0x15, 0x10, 0x3e, 0x7b, 0xd4, 0x80, 0xa4, 0x7d, 0xc4, 0xed, 0xe8, 0xfd, 0xad, 0xfe, 0xf2, 0x3c, - 0x99, 0x4f, 0x1f, 0xa2, 0x91, 0x20, 0x03, 0x36, 0x7f, 0x8c, 0x7a, 0x50, 0x3a, 0x81, 0xbc, 0x04, - 0x63, 0x9a, 0xae, 0x39, 0x9a, 0x5a, 0x2f, 0x6f, 0xaa, 0x75, 0x55, 0xaf, 0x1c, 0x24, 0x6b, 0x66, - 0x21, 0x9f, 0x37, 0x1b, 0x62, 0x27, 0x2b, 0xa3, 0x1c, 0x52, 0x60, 0x00, 0x74, 0x11, 0x86, 0x44, - 0x53, 0xb1, 0x03, 0x65, 0x1b, 0x82, 0x1c, 0x8d, 0x42, 0x84, 0x6f, 0x98, 0xc5, 0x94, 0x88, 0x56, - 0x45, 0x47, 0x60, 0x88, 0xd8, 0xd4, 0xa8, 0x57, 0xd9, 0x97, 0x19, 0x95, 0x41, 0x43, 0xbf, 0x68, - 0xd4, 0xab, 0xbe, 0x4c, 0xf0, 0x17, 0xa2, 0x30, 0xae, 0xe0, 0xea, 0xff, 0xeb, 0xb3, 0xfd, 0xf5, - 0xd9, 0x12, 0x00, 0x8b, 0x0b, 0x24, 0x12, 0x1f, 0xa0, 0xdb, 0x48, 0x64, 0x49, 0x32, 0x0e, 0x45, - 0xdb, 0xf1, 0xf5, 0xc7, 0xcd, 0x08, 0xa4, 0xfc, 0xfd, 0xf1, 0x17, 0x74, 0xfa, 0x42, 0x0b, 0x5e, - 0xc8, 0x8a, 0xf1, 0x6f, 0xf4, 0x76, 0x08, 0x59, 0x2d, 0xde, 0xdb, 0x3d, 0x56, 0xfd, 0xf7, 0x08, - 0x0c, 0xae, 0xaa, 0x96, 0xda, 0xb0, 0x51, 0xa5, 0x25, 0x25, 0x15, 0xfb, 0x94, 0x2d, 0x5f, 0x62, - 0xe7, 0xdb, 0x22, 0x3d, 0x32, 0xd2, 0x8f, 0xb5, 0xc9, 0x48, 0xdf, 0x0a, 0xa3, 0x64, 0xdd, 0xec, - 0xbb, 0xeb, 0x40, 0xac, 0x3d, 0x52, 0x38, 0xea, 0x71, 0x09, 0xd6, 0xb3, 0x65, 0xf5, 0x65, 0xff, - 0x65, 0x87, 0x61, 0x82, 0xe1, 0x45, 0x70, 0x42, 0x7e, 0xd8, 0x5b, 0xbf, 0xfa, 0x2a, 0x65, 0x05, - 0x1a, 0xea, 0x6e, 0x89, 0x15, 0xd0, 0x22, 0xa0, 0x6d, 0x77, 0x0b, 0xa5, 0xec, 0x99, 0x93, 0xd0, - 0x9f, 0xb8, 0x75, 0x73, 0xfa, 0x28, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0x71, 0x0f, 0x28, 0xb8, 0x3d, - 0x0e, 0x40, 0xf4, 0x2a, 0xb3, 0xbb, 0xde, 0x6c, 0x5d, 0x74, 0xe8, 0xd6, 0xcd, 0xe9, 0x71, 0xc6, - 0xc5, 0xab, 0x93, 0x95, 0x24, 0x29, 0x14, 0xc9, 0x6f, 0x9f, 0x67, 0x7f, 0x46, 0x02, 0xe4, 0xcd, - 0x0d, 0x0a, 0xb6, 0x4d, 0xb2, 0x90, 0x23, 0x19, 0xbb, 0x2f, 0xbd, 0x96, 0xba, 0x67, 0xec, 0x1e, - 0xbd, 0xc8, 0xd8, 0x7d, 0x23, 0xe5, 0x29, 0x2f, 0x8e, 0x46, 0x7a, 0x5d, 0x7c, 0xe6, 0x2e, 0xc2, - 0xf1, 0x5d, 0x29, 0x07, 0xe4, 0x7f, 0x2e, 0xc1, 0xd1, 0x16, 0x8f, 0x72, 0x85, 0xfd, 0xff, 0x00, - 0x59, 0xbe, 0x4a, 0xfe, 0xc1, 0x45, 0x26, 0xf4, 0xbe, 0x1d, 0x74, 0xdc, 0x6a, 0x89, 0xbb, 0xb7, - 0x6d, 0x2a, 0xe0, 0x37, 0xeb, 0xff, 0x89, 0x04, 0x93, 0xfe, 0xe6, 0x5d, 0x45, 0x96, 0x21, 0xe5, - 0x6f, 0x9d, 0xab, 0x70, 0x4f, 0x3f, 0x2a, 0x70, 0xe9, 0x03, 0xf4, 0xe8, 0x59, 0x6f, 0xb8, 0xb2, - 0x4d, 0xb6, 0x47, 0xfb, 0xb6, 0x86, 0x90, 0x29, 0x3c, 0x6c, 0x63, 0xb4, 0x3f, 0xfe, 0xb7, 0x04, - 0xb1, 0x55, 0xc3, 0xa8, 0x23, 0x03, 0xc6, 0x75, 0xc3, 0x29, 0x13, 0xcf, 0xc2, 0x55, 0xff, 0x05, - 0xf7, 0x64, 0x61, 0x6e, 0x7f, 0x46, 0xfa, 0xfe, 0xcd, 0xe9, 0x56, 0x56, 0xca, 0x98, 0x6e, 0x38, - 0x05, 0x0a, 0xe1, 0x77, 0xdc, 0xdf, 0x05, 0x23, 0xc1, 0xc6, 0x58, 0x94, 0x7c, 0x6e, 0xdf, 0x8d, - 0x05, 0xd9, 0xdc, 0xba, 0x39, 0x3d, 0xe9, 0x8d, 0x18, 0x17, 0x2c, 0x2b, 0xa9, 0x4d, 0x5f, 0xeb, - 0xec, 0x1e, 0xd8, 0x0f, 0x5f, 0x9d, 0x96, 0x4e, 0x7d, 0x45, 0x02, 0xf0, 0xb6, 0x28, 0xd0, 0x43, - 0x70, 0xa4, 0xb0, 0xb2, 0x5c, 0x2c, 0xaf, 0xad, 0xe7, 0xd7, 0x37, 0xd6, 0x82, 0x97, 0xc1, 0xc5, - 0x3e, 0xba, 0x6d, 0xe2, 0x8a, 0xb6, 0xa5, 0xe1, 0x2a, 0xba, 0x0f, 0x26, 0x83, 0xd8, 0xa4, 0x54, - 0x2a, 0xa6, 0xa5, 0x6c, 0xea, 0xfa, 0x8d, 0x99, 0x04, 0x4b, 0xda, 0x70, 0x15, 0x9d, 0x84, 0x43, - 0xad, 0x78, 0x0b, 0xcb, 0xf3, 0xe9, 0x48, 0x76, 0xe4, 0xfa, 0x8d, 0x99, 0xa4, 0x9b, 0xdd, 0x21, - 0x19, 0x90, 0x1f, 0x93, 0xf3, 0x8b, 0x66, 0xe1, 0xfa, 0x8d, 0x99, 0x41, 0x66, 0xc0, 0x6c, 0xec, - 0x83, 0x9f, 0x99, 0x1a, 0xb8, 0xed, 0x57, 0xc6, 0xff, 0x74, 0xa8, 0xe3, 0xf6, 0x78, 0x0d, 0xeb, - 0xd8, 0xd6, 0xec, 0x03, 0x6d, 0x8f, 0xf7, 0xb5, 0xe5, 0x2e, 0xff, 0x5e, 0x1c, 0x52, 0xf3, 0xac, - 0x15, 0xd2, 0x11, 0x18, 0xbd, 0x09, 0x06, 0x4d, 0x3a, 0x8d, 0xb8, 0xe7, 0x6d, 0x1d, 0x1c, 0x9e, - 0x4d, 0x36, 0xee, 0xa5, 0x2f, 0x36, 0xf5, 0xd8, 0xfc, 0xd6, 0x07, 0xbb, 0x8c, 0xe6, 0x5d, 0xaf, - 0x4a, 0xed, 0x6b, 0x63, 0x88, 0xe5, 0x2c, 0x7c, 0x0f, 0x26, 0xcc, 0x4f, 0x66, 0x17, 0x48, 0xd6, - 0x09, 0x84, 0x5d, 0x23, 0x7b, 0xbf, 0x04, 0x87, 0x28, 0x96, 0x37, 0x11, 0x53, 0x4c, 0xb1, 0x2a, - 0x38, 0xd5, 0x49, 0x85, 0x45, 0xd5, 0xf6, 0x2e, 0x85, 0xb0, 0x8b, 0x5f, 0xf7, 0xf0, 0x89, 0xf0, - 0xb8, 0xaf, 0xf1, 0x30, 0x5b, 0x59, 0x99, 0xa8, 0xb7, 0x50, 0xda, 0x68, 0x3e, 0x70, 0xf3, 0x2f, - 0xb6, 0xbf, 0x3d, 0x79, 0xff, 0x2d, 0xc0, 0x67, 0x60, 0xd8, 0x8b, 0x25, 0x36, 0xff, 0x07, 0x31, - 0xfd, 0xcf, 0x1d, 0x7e, 0x62, 0xf4, 0x01, 0x09, 0x0e, 0x79, 0xb3, 0xb9, 0x9f, 0x2d, 0xfb, 0x47, - 0x3a, 0x0f, 0xee, 0x63, 0xc5, 0x14, 0x36, 0x4e, 0x5b, 0xbe, 0xb2, 0x32, 0xd9, 0x6c, 0x25, 0x25, - 0x6b, 0xb5, 0x11, 0x7f, 0x64, 0xb5, 0x33, 0xe2, 0x5b, 0x91, 0xfd, 0x87, 0xe6, 0x20, 0x03, 0xf6, - 0xcf, 0x3d, 0x4c, 0xc3, 0x72, 0x70, 0x95, 0xee, 0xdc, 0x25, 0x14, 0xb7, 0x2c, 0x2f, 0x03, 0x6a, - 0xed, 0xdc, 0xf0, 0x4d, 0x47, 0xef, 0x21, 0x0b, 0x9a, 0x84, 0xb8, 0xff, 0x2e, 0x20, 0x2b, 0xe4, - 0x12, 0x1f, 0xe4, 0xd3, 0xe7, 0x6d, 0x1f, 0xf3, 0xdf, 0x89, 0xc0, 0x29, 0xff, 0x39, 0xd2, 0x4b, - 0x4d, 0x6c, 0xed, 0xb9, 0x43, 0xd4, 0x54, 0x6b, 0x9a, 0xee, 0x7f, 0x2e, 0x71, 0xd4, 0x3f, 0xe1, - 0x53, 0x5c, 0x61, 0x27, 0xf9, 0x83, 0x12, 0x0c, 0xaf, 0xaa, 0x35, 0xac, 0xe0, 0x97, 0x9a, 0xd8, - 0x76, 0xda, 0x5c, 0x47, 0x3f, 0x0c, 0x83, 0xc6, 0xd6, 0x96, 0x38, 0xfc, 0x8e, 0x29, 0xbc, 0x44, - 0x74, 0xae, 0x6b, 0x0d, 0x8d, 0xdd, 0x1b, 0x8b, 0x29, 0xac, 0x80, 0xa6, 0x61, 0xb8, 0x62, 0x34, - 0x75, 0x3e, 0xe4, 0x32, 0x31, 0xf1, 0x51, 0x96, 0xa6, 0xce, 0x86, 0x1c, 0x31, 0xa2, 0x85, 0xaf, - 0x60, 0xcb, 0x66, 0x9f, 0xa1, 0x4c, 0x28, 0xa2, 0x28, 0x3f, 0x0d, 0x29, 0x26, 0x09, 0x9f, 0x8c, - 0x8f, 0x42, 0x82, 0x5e, 0xc9, 0xf2, 0xe4, 0x19, 0x22, 0xe5, 0x4b, 0xec, 0x52, 0x3b, 0xe3, 0xcf, - 0x44, 0x62, 0x85, 0x42, 0xa1, 0xa3, 0x95, 0x4f, 0xf6, 0x8e, 0x1a, 0xcc, 0x86, 0xae, 0x85, 0x7f, - 0x2b, 0x0e, 0x87, 0xf8, 0x29, 0x9f, 0x6a, 0x6a, 0xa7, 0xb7, 0x1d, 0x47, 0x3c, 0xb2, 0x00, 0x9e, - 0x05, 0xab, 0xa6, 0x26, 0xef, 0x41, 0xec, 0xa2, 0xe3, 0x98, 0xe8, 0x14, 0xc4, 0xad, 0x66, 0x1d, - 0x8b, 0x5d, 0x23, 0x77, 0x5f, 0x5f, 0x35, 0xb5, 0x59, 0x82, 0xa0, 0x34, 0xeb, 0x58, 0x61, 0x28, - 0xa8, 0x04, 0xd3, 0x5b, 0xcd, 0x7a, 0x7d, 0xaf, 0x5c, 0xc5, 0xf4, 0xff, 0x6a, 0xb9, 0xff, 0x99, - 0x02, 0xef, 0x9a, 0xaa, 0xf8, 0xbe, 0x25, 0x31, 0xcc, 0x71, 0x8a, 0x56, 0xa4, 0x58, 0xe2, 0xbf, - 0x52, 0x94, 0x04, 0x8e, 0xfc, 0x07, 0x11, 0x48, 0x08, 0xd6, 0xf4, 0x96, 0x39, 0xae, 0xe3, 0x8a, - 0x63, 0x88, 0x53, 0x17, 0xb7, 0x8c, 0x10, 0x44, 0x6b, 0xbc, 0xf3, 0x92, 0x17, 0x07, 0x14, 0x52, - 0x20, 0x30, 0xf7, 0xee, 0x3f, 0x81, 0x99, 0x4d, 0xd2, 0x9f, 0x31, 0xd3, 0x10, 0xab, 0xb6, 0x8b, - 0x03, 0x0a, 0x2d, 0xa1, 0x0c, 0x0c, 0x92, 0x41, 0xe3, 0xb0, 0xde, 0x22, 0x70, 0x5e, 0x46, 0x87, - 0x21, 0x6e, 0xaa, 0x4e, 0x85, 0x5d, 0xcb, 0x23, 0x15, 0xac, 0x88, 0x9e, 0x80, 0x41, 0xf6, 0x7c, - 0x3b, 0xfc, 0x4f, 0x6b, 0x88, 0x31, 0xd8, 0x77, 0xf2, 0x88, 0xdc, 0xab, 0xaa, 0xe3, 0x60, 0x4b, - 0x27, 0x0c, 0x19, 0x3a, 0x42, 0x10, 0xdb, 0x34, 0xaa, 0x7b, 0xfc, 0x1f, 0xe9, 0xd0, 0xdf, 0xfc, - 0x3f, 0x77, 0x50, 0x7f, 0x28, 0xd3, 0x4a, 0xf6, 0xff, 0xc3, 0x52, 0x02, 0x58, 0x20, 0x48, 0x25, - 0x98, 0x50, 0xab, 0x55, 0x8d, 0xfd, 0x4f, 0x9b, 0xf2, 0xa6, 0x46, 0x83, 0x87, 0x4d, 0xff, 0x3b, - 0x5c, 0xa7, 0xbe, 0x40, 0x1e, 0x41, 0x81, 0xe3, 0x17, 0x92, 0x30, 0x64, 0x32, 0xa1, 0xe4, 0xf3, - 0x30, 0xde, 0x22, 0x29, 0x91, 0x6f, 0x47, 0xd3, 0xab, 0xe2, 0x41, 0x04, 0xf9, 0x4d, 0x60, 0xf4, - 0xcb, 0x96, 0xec, 0x3c, 0x8b, 0xfe, 0x2e, 0xbc, 0xb7, 0xf3, 0xbb, 0x99, 0x51, 0xdf, 0xbb, 0x19, - 0xd5, 0xd4, 0x0a, 0x49, 0xca, 0x9f, 0xbf, 0x96, 0xc9, 0xb7, 0xbe, 0x96, 0xa9, 0x61, 0x5d, 0x4c, - 0xcc, 0xa4, 0x4a, 0x35, 0x35, 0x9b, 0xba, 0xa3, 0xf7, 0xa5, 0x4d, 0xfb, 0xbc, 0xef, 0x37, 0x7d, - 0x3c, 0x13, 0x9b, 0xcf, 0xaf, 0x2e, 0xb8, 0x7e, 0xfc, 0xb5, 0x08, 0x1c, 0xf7, 0xf9, 0xb1, 0x0f, - 0xb9, 0xd5, 0x9d, 0xb3, 0xed, 0x3d, 0xbe, 0x8f, 0x47, 0xcc, 0x97, 0x20, 0x46, 0xf0, 0x51, 0x8f, - 0xff, 0xab, 0x91, 0xf9, 0xc2, 0x37, 0xff, 0xb1, 0x1c, 0x3c, 0xf9, 0x0a, 0xf4, 0x0a, 0x65, 0x52, - 0xf8, 0x40, 0xff, 0xf6, 0x4b, 0x7b, 0x1f, 0x19, 0xb5, 0x6f, 0x9f, 0x19, 0xc3, 0x36, 0xfc, 0xde, - 0xd9, 0x8e, 0x8f, 0x5c, 0x59, 0x30, 0xed, 0x9e, 0x5f, 0xed, 0x23, 0x52, 0x77, 0x7a, 0x43, 0xd0, - 0xad, 0x07, 0xfb, 0xcc, 0xd4, 0x76, 0xe1, 0xf0, 0xb3, 0xa4, 0x6d, 0x6f, 0x05, 0x2d, 0x42, 0xfe, - 0x61, 0xf7, 0x44, 0x50, 0xe2, 0xff, 0x9c, 0x4f, 0x9c, 0xf6, 0x81, 0x27, 0x1f, 0x5f, 0x3b, 0xde, - 0x37, 0xdb, 0x71, 0x2a, 0x99, 0xf5, 0x4d, 0x23, 0x8a, 0x8f, 0x52, 0xfe, 0x55, 0x09, 0x8e, 0xb4, - 0x34, 0xcd, 0x63, 0xfc, 0x7c, 0x9b, 0xe7, 0x0e, 0x07, 0x4a, 0x7a, 0xe6, 0xdb, 0x08, 0x7b, 0x7f, - 0x4f, 0x61, 0x99, 0x14, 0x01, 0x69, 0xdf, 0x02, 0x87, 0x82, 0xc2, 0x0a, 0x33, 0xdd, 0x0b, 0xa3, - 0xc1, 0x5d, 0x65, 0x6e, 0xae, 0x91, 0xc0, 0xbe, 0xb2, 0x5c, 0x0e, 0xdb, 0xd9, 0xd5, 0xb5, 0x04, - 0x49, 0x17, 0x95, 0x67, 0xc7, 0x7d, 0xab, 0xea, 0x51, 0xca, 0x1f, 0x91, 0x60, 0x26, 0xd8, 0x82, - 0x2f, 0x4f, 0xda, 0x9f, 0xb0, 0xb7, 0xad, 0x8b, 0x5f, 0x97, 0xe0, 0xae, 0x2e, 0x32, 0x71, 0x03, - 0x5c, 0x83, 0x49, 0xdf, 0x26, 0x81, 0x08, 0xe1, 0xa2, 0xdb, 0x4f, 0xf5, 0xce, 0x50, 0xdd, 0x35, - 0xf1, 0x31, 0x62, 0x94, 0xcf, 0x7d, 0x67, 0x7a, 0xa2, 0xb5, 0xce, 0x56, 0x26, 0x5a, 0x17, 0xf6, - 0xb7, 0xd1, 0x3f, 0x5e, 0x91, 0xe0, 0x81, 0xa0, 0xaa, 0x6d, 0x52, 0xdd, 0x9f, 0x56, 0x3f, 0xfc, - 0x5b, 0x09, 0x4e, 0xf5, 0x23, 0x1c, 0xef, 0x90, 0x4d, 0x98, 0xf0, 0x92, 0xf0, 0x70, 0x7f, 0xec, - 0x2b, 0xb5, 0x67, 0x5e, 0x8a, 0x5c, 0x6e, 0x77, 0xc0, 0xf0, 0x26, 0x1f, 0x58, 0xfe, 0x2e, 0x77, - 0x8d, 0x1c, 0xdc, 0xe8, 0x15, 0x46, 0x0e, 0x6c, 0xf5, 0xb6, 0xe9, 0x8b, 0x48, 0x9b, 0xbe, 0xf0, - 0xb2, 0x76, 0xf9, 0x0a, 0x8f, 0x5b, 0x6d, 0xb6, 0xe7, 0xde, 0x0e, 0x13, 0x6d, 0x5c, 0x99, 0x8f, - 0xea, 0x7d, 0x78, 0xb2, 0x82, 0x5a, 0x9d, 0x55, 0xde, 0x83, 0x69, 0xda, 0x6e, 0x1b, 0x43, 0xdf, - 0x69, 0x95, 0x1b, 0x3c, 0xb6, 0xb4, 0x6d, 0x9a, 0xeb, 0xbe, 0x00, 0x83, 0xac, 0x9f, 0xb9, 0xba, - 0x07, 0x70, 0x14, 0xce, 0x40, 0xfe, 0x84, 0x88, 0x65, 0x45, 0x21, 0x76, 0xfb, 0x31, 0xd4, 0x8f, - 0xae, 0xb7, 0x69, 0x0c, 0xf9, 0x8c, 0xf1, 0x6d, 0x11, 0xd5, 0xda, 0x4b, 0xc7, 0xcd, 0x51, 0xb9, - 0x6d, 0x51, 0x8d, 0xd9, 0xe6, 0xce, 0x86, 0xaf, 0x5f, 0x16, 0xe1, 0xcb, 0xd5, 0xa9, 0x47, 0xf8, - 0xfa, 0xe9, 0x98, 0xde, 0x0d, 0x64, 0x3d, 0xc4, 0xfc, 0xf3, 0x18, 0xc8, 0x7e, 0x28, 0xc1, 0x51, - 0xaa, 0x9b, 0x7f, 0x8f, 0x62, 0xbf, 0x26, 0x7f, 0x08, 0x90, 0x6d, 0x55, 0xca, 0x6d, 0x47, 0x77, - 0xda, 0xb6, 0x2a, 0x97, 0x03, 0xf3, 0xcb, 0x43, 0x80, 0xaa, 0x81, 0x9d, 0x28, 0x8a, 0xcd, 0x6e, - 0xda, 0xa5, 0xab, 0xbe, 0x8d, 0x8e, 0x36, 0xdd, 0x19, 0xbb, 0x0d, 0xdd, 0xf9, 0x2d, 0x09, 0xb2, - 0xed, 0x54, 0xe6, 0xdd, 0xa7, 0xc1, 0xe1, 0xc0, 0xf9, 0x41, 0xb8, 0x07, 0x1f, 0xea, 0x67, 0x97, - 0x27, 0x34, 0x8c, 0x0e, 0x59, 0xf8, 0x4e, 0xe7, 0x01, 0xd3, 0x41, 0x0f, 0x6d, 0xcd, 0xac, 0x7f, - 0x6a, 0xc3, 0xe7, 0xcb, 0x2d, 0x71, 0xf5, 0xcf, 0x45, 0xee, 0xbd, 0x0b, 0x53, 0x1d, 0xa4, 0xbe, - 0xd3, 0xf3, 0xde, 0x76, 0xc7, 0xce, 0xbc, 0xdd, 0xe9, 0xfb, 0xe3, 0x7c, 0x24, 0x04, 0x6f, 0x71, - 0xfb, 0xd6, 0x62, 0xed, 0x9e, 0x81, 0xc9, 0x6f, 0x83, 0x63, 0x6d, 0xa9, 0xb8, 0x6c, 0x39, 0x88, - 0x6d, 0x6b, 0xb6, 0xc3, 0xc5, 0xba, 0xaf, 0x93, 0x58, 0x21, 0x6a, 0x4a, 0x23, 0x23, 0x48, 0x53, - 0xd6, 0xab, 0x86, 0x51, 0xe7, 0x62, 0xc8, 0x97, 0x60, 0xdc, 0x07, 0xe3, 0x8d, 0x9c, 0x83, 0x98, - 0x69, 0xf0, 0x4f, 0x1c, 0x0c, 0x9f, 0x39, 0xde, 0x71, 0x63, 0xdf, 0x30, 0xea, 0x5c, 0x6d, 0x8a, - 0x2f, 0x4f, 0x02, 0x62, 0xcc, 0xe8, 0x1e, 0xbf, 0x68, 0x62, 0x0d, 0x26, 0x02, 0x50, 0xde, 0xc8, - 0x1b, 0x3a, 0x3f, 0x38, 0xf3, 0xfd, 0x43, 0x10, 0xa7, 0x5c, 0xd1, 0xc7, 0xa5, 0xc0, 0x37, 0x88, - 0x66, 0x3b, 0xb1, 0x69, 0xbf, 0x26, 0xce, 0x9e, 0xee, 0x1b, 0x9f, 0xe7, 0x6c, 0xa7, 0xde, 0xfb, - 0xaf, 0xbe, 0xf7, 0xd1, 0xc8, 0x3d, 0x48, 0x3e, 0xdd, 0x61, 0x35, 0xee, 0x1b, 0x2f, 0x9f, 0x0d, - 0xbc, 0x9f, 0x7f, 0xb8, 0xbf, 0xa6, 0x84, 0x64, 0xb3, 0xfd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, - 0xce, 0xa2, 0xc7, 0x7a, 0x0b, 0x76, 0xfa, 0x9d, 0xc1, 0x41, 0xf3, 0x6e, 0xf4, 0x7b, 0x12, 0x4c, - 0xb6, 0x5b, 0xd2, 0xa1, 0x27, 0xfb, 0x93, 0xa2, 0x35, 0xa5, 0xc8, 0x3e, 0x75, 0x00, 0x4a, 0xae, - 0xca, 0x3c, 0x55, 0x25, 0x8f, 0x9e, 0x3e, 0x80, 0x2a, 0xa7, 0xfd, 0x5b, 0xff, 0xff, 0x53, 0x82, - 0x13, 0x5d, 0x57, 0x48, 0x28, 0xdf, 0x9f, 0x94, 0x5d, 0x72, 0xa7, 0x6c, 0xe1, 0x8d, 0xb0, 0xe0, - 0x1a, 0x3f, 0x4b, 0x35, 0xbe, 0x84, 0x16, 0x0e, 0xa2, 0x71, 0xdb, 0xf3, 0x15, 0xf4, 0xdb, 0xc1, - 0xdb, 0x89, 0xdd, 0xdd, 0xa9, 0x65, 0xe1, 0xd1, 0x63, 0x60, 0xb4, 0x26, 0xb5, 0xf2, 0xf3, 0x54, - 0x05, 0x05, 0xad, 0xbe, 0xc1, 0x4e, 0x3b, 0xfd, 0xce, 0x60, 0xe0, 0x7f, 0x37, 0xfa, 0x1f, 0x52, - 0xfb, 0xcb, 0x86, 0x4f, 0x74, 0x15, 0xb1, 0xf3, 0xa2, 0x2a, 0xfb, 0xe4, 0xfe, 0x09, 0xb9, 0x92, - 0x0d, 0xaa, 0x64, 0x0d, 0xe1, 0xdb, 0xad, 0x64, 0xdb, 0x4e, 0x44, 0xdf, 0x90, 0x60, 0xb2, 0xdd, - 0x9a, 0xa4, 0xc7, 0xb0, 0xec, 0xb2, 0xc8, 0xea, 0x31, 0x2c, 0xbb, 0x2d, 0x80, 0xe4, 0x37, 0x51, - 0xe5, 0xcf, 0xa1, 0xc7, 0x3b, 0x29, 0xdf, 0xb5, 0x17, 0xc9, 0x58, 0xec, 0x9a, 0xe4, 0xf7, 0x18, - 0x8b, 0xfd, 0xac, 0x63, 0x7a, 0x8c, 0xc5, 0xbe, 0xd6, 0x18, 0xbd, 0xc7, 0xa2, 0xab, 0x59, 0x9f, - 0xdd, 0x68, 0xa3, 0xaf, 0x49, 0x30, 0x12, 0xc8, 0x88, 0xd1, 0xa3, 0x5d, 0x05, 0x6d, 0xb7, 0x60, - 0xc8, 0x9e, 0xd9, 0x0f, 0x09, 0xd7, 0x65, 0x81, 0xea, 0x32, 0x87, 0xf2, 0x07, 0xd1, 0x25, 0x78, - 0x8c, 0xfa, 0x2d, 0x09, 0x26, 0xda, 0x64, 0x99, 0x3d, 0x46, 0x61, 0xe7, 0xa4, 0x39, 0xfb, 0xe4, - 0xfe, 0x09, 0xb9, 0x56, 0x17, 0xa8, 0x56, 0x6f, 0x45, 0x6f, 0x39, 0x88, 0x56, 0xbe, 0xf9, 0xf9, - 0xa6, 0x77, 0x25, 0xcb, 0xd7, 0x0e, 0x3a, 0xb7, 0x4f, 0xc1, 0x84, 0x42, 0x4f, 0xec, 0x9b, 0x8e, - 0xeb, 0xf3, 0x1c, 0xd5, 0xe7, 0x59, 0xb4, 0xf2, 0xc6, 0xf4, 0x69, 0x9d, 0xd6, 0xbf, 0xd4, 0xfa, - 0x8a, 0xb0, 0xbb, 0x17, 0xb5, 0x4d, 0x56, 0xb3, 0x8f, 0xed, 0x8b, 0x86, 0x2b, 0xf5, 0x24, 0x55, - 0xea, 0x0c, 0x7a, 0xa4, 0x93, 0x52, 0xbe, 0x7b, 0x77, 0x9a, 0xbe, 0x65, 0x9c, 0x7e, 0x27, 0x4b, - 0x81, 0xdf, 0x8d, 0xde, 0x23, 0xee, 0x3c, 0x9d, 0xec, 0xda, 0xae, 0x2f, 0x8f, 0xcd, 0x3e, 0xd0, - 0x07, 0x26, 0x97, 0xeb, 0x1e, 0x2a, 0xd7, 0x14, 0x3a, 0xde, 0x49, 0x2e, 0x92, 0xcb, 0xa2, 0x0f, - 0x49, 0xee, 0x35, 0xc9, 0x53, 0xdd, 0x79, 0xfb, 0x93, 0xdd, 0xec, 0x83, 0x7d, 0xe1, 0x72, 0x49, - 0xee, 0xa3, 0x92, 0xcc, 0xa0, 0xa9, 0x8e, 0x92, 0xb0, 0xd4, 0xf7, 0x76, 0x5f, 0x2a, 0xb8, 0x7e, - 0x04, 0xa6, 0x3b, 0xb4, 0xe8, 0xec, 0xf6, 0x38, 0xe3, 0xea, 0xf2, 0x98, 0xb6, 0xe7, 0x63, 0xd9, - 0xdb, 0xfd, 0x11, 0xd8, 0x3e, 0x0f, 0xc4, 0x7e, 0x27, 0x06, 0x68, 0xc9, 0xae, 0xcd, 0x59, 0x98, - 0xfd, 0x43, 0x4a, 0x3e, 0xca, 0x43, 0xaf, 0xc4, 0xa4, 0x37, 0xf4, 0x4a, 0x6c, 0x29, 0xf0, 0xee, - 0x2a, 0xb2, 0xbf, 0xb7, 0x9d, 0x7d, 0x3f, 0xbe, 0x8a, 0xfe, 0x44, 0x1e, 0x5f, 0xb5, 0xbf, 0x72, - 0x1d, 0xbb, 0x7d, 0x8f, 0x38, 0xe2, 0x07, 0x7d, 0xc8, 0xc2, 0xdf, 0x54, 0x0e, 0x76, 0x79, 0x53, - 0x99, 0xe9, 0xf8, 0x70, 0x92, 0x53, 0xa3, 0xb3, 0xe2, 0x93, 0xa8, 0x43, 0xfd, 0x5d, 0x92, 0xe5, - 0xdf, 0x4c, 0xf5, 0xb6, 0x10, 0x8e, 0x43, 0xb6, 0xd5, 0x9d, 0xdc, 0x41, 0xfd, 0xd1, 0x28, 0xa4, - 0x97, 0xec, 0x5a, 0xa9, 0xaa, 0x39, 0x77, 0xc8, 0xd7, 0x9e, 0xee, 0xfc, 0x30, 0x06, 0xdd, 0xba, - 0x39, 0x3d, 0xca, 0x6c, 0xda, 0xc5, 0x92, 0x0d, 0x18, 0x0b, 0x3d, 0x47, 0xe6, 0x9e, 0x55, 0x3c, - 0xc8, 0xab, 0xe8, 0x10, 0x2b, 0x99, 0x3e, 0x4f, 0xf0, 0xf9, 0x37, 0xda, 0x6d, 0xef, 0xcc, 0xcc, - 0xa1, 0x2e, 0xde, 0xc9, 0x57, 0x84, 0x5e, 0x9f, 0x65, 0x21, 0x13, 0xee, 0x14, 0xb7, 0xc7, 0xfe, - 0x58, 0x82, 0xe1, 0x25, 0x5b, 0xa4, 0x82, 0xf8, 0x67, 0xf4, 0x0d, 0xd3, 0x13, 0xee, 0xf7, 0xc4, - 0xa3, 0xfd, 0xf9, 0xad, 0xf8, 0xc6, 0xb8, 0x67, 0x84, 0x43, 0x30, 0xe1, 0xd3, 0xd3, 0xd5, 0xff, - 0x77, 0x23, 0x34, 0x3e, 0x16, 0x70, 0x4d, 0xd3, 0xdd, 0x2c, 0x12, 0xff, 0x45, 0x7d, 0x78, 0xe1, - 0xd9, 0x39, 0x76, 0x50, 0x3b, 0xef, 0xd0, 0x00, 0x11, 0xb2, 0xa7, 0xbb, 0xf1, 0xb5, 0xd4, 0xfa, - 0x2c, 0x48, 0xda, 0xc7, 0xa7, 0x79, 0x42, 0x8f, 0x7f, 0xe4, 0xd7, 0x25, 0x18, 0x59, 0xb2, 0x6b, - 0x1b, 0x7a, 0xf5, 0xff, 0x7a, 0xff, 0xdd, 0x82, 0x43, 0x01, 0x4d, 0xef, 0x90, 0x49, 0xcf, 0xbc, - 0x12, 0x83, 0xe8, 0x92, 0x5d, 0x43, 0x2f, 0xc1, 0x58, 0x38, 0x69, 0xe8, 0x98, 0x0b, 0xb6, 0xce, - 0x08, 0x9d, 0xd7, 0x6b, 0x9d, 0x67, 0x0f, 0xb4, 0x03, 0x23, 0xc1, 0x99, 0xe3, 0x64, 0x17, 0x26, - 0x01, 0xcc, 0xec, 0x23, 0xfd, 0x62, 0xba, 0x8d, 0xbd, 0x03, 0x12, 0x6e, 0xd0, 0xbb, 0xbb, 0x0b, - 0xb5, 0x40, 0xea, 0x9c, 0xdd, 0xb6, 0x09, 0x2b, 0xc4, 0x7a, 0xe1, 0x90, 0xd2, 0xcd, 0x7a, 0x21, - 0xdc, 0xae, 0xd6, 0xeb, 0x34, 0xb4, 0x36, 0x01, 0x7c, 0xe3, 0xe0, 0xde, 0x2e, 0x1c, 0x3c, 0xb4, - 0xec, 0xc3, 0x7d, 0xa1, 0xb9, 0x87, 0x4e, 0xb7, 0x39, 0x19, 0xff, 0x3f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0xdf, 0x03, 0x9e, 0x0e, 0x06, 0x98, 0x00, 0x00, + // 9880 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x5c, 0xd7, + 0x75, 0x18, 0xde, 0x7e, 0x00, 0xbb, 0x07, 0x0b, 0x60, 0x71, 0x01, 0x92, 0xcb, 0x25, 0x09, 0x40, + 0x4f, 0x5f, 0x14, 0x25, 0x81, 0x12, 0x25, 0x52, 0xd2, 0x32, 0xb6, 0xbc, 0x8b, 0x5d, 0x82, 0x2b, + 0xe2, 0x4b, 0x0f, 0x20, 0x25, 0xcb, 0x4e, 0x77, 0x1e, 0x76, 0x2f, 0x16, 0x4f, 0xd8, 0x7d, 0xef, + 0xe9, 0xbd, 0xb7, 0x24, 0x20, 0xdb, 0x1d, 0xf9, 0xa3, 0xae, 0xad, 0x4c, 0x5b, 0xbb, 0xee, 0x34, + 0xb6, 0x6c, 0xba, 0x72, 0x9c, 0xd6, 0xa9, 0x93, 0x36, 0x76, 0xec, 0xba, 0x4d, 0x3f, 0xa6, 0x76, + 0x67, 0xd2, 0xd8, 0x6e, 0x93, 0xb1, 0xdb, 0x4c, 0xeb, 0x66, 0x5c, 0x3a, 0x95, 0x3d, 0xa9, 0xea, + 0xba, 0x8d, 0xc3, 0xba, 0x6d, 0x3a, 0x9e, 0x4e, 0x3b, 0xf7, 0xeb, 0x7d, 0xed, 0x27, 0x20, 0xd2, + 0x76, 0x9a, 0xfe, 0xc2, 0xde, 0x73, 0xcf, 0x39, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, 0xe7, 0xdc, 0xaf, + 0x07, 0xf8, 0xfc, 0x79, 0x98, 0xab, 0x1b, 0x46, 0xbd, 0x81, 0x4f, 0x9b, 0x96, 0xe1, 0x18, 0x9b, + 0xad, 0xad, 0xd3, 0x35, 0x6c, 0x57, 0x2d, 0xcd, 0x74, 0x0c, 0x6b, 0x9e, 0xc2, 0xd0, 0x04, 0xc3, + 0x98, 0x17, 0x18, 0xf2, 0x32, 0x4c, 0x5e, 0xd0, 0x1a, 0xb8, 0xe8, 0x22, 0xae, 0x63, 0x07, 0x3d, + 0x0e, 0xb1, 0x2d, 0xad, 0x81, 0x33, 0xd2, 0x5c, 0xf4, 0xe4, 0xe8, 0x99, 0xbb, 0xe6, 0x43, 0x44, + 0xf3, 0x41, 0x8a, 0x35, 0x02, 0x56, 0x28, 0x85, 0xfc, 0xbd, 0x18, 0x4c, 0x75, 0xa8, 0x45, 0x08, + 0x62, 0xba, 0xda, 0x24, 0x1c, 0xa5, 0x93, 0x49, 0x85, 0xfe, 0x46, 0x19, 0x18, 0x31, 0xd5, 0xea, + 0x8e, 0x5a, 0xc7, 0x99, 0x08, 0x05, 0x8b, 0x22, 0x9a, 0x01, 0xa8, 0x61, 0x13, 0xeb, 0x35, 0xac, + 0x57, 0xf7, 0x32, 0xd1, 0xb9, 0xe8, 0xc9, 0xa4, 0xe2, 0x83, 0xa0, 0xfb, 0x61, 0xd2, 0x6c, 0x6d, + 0x36, 0xb4, 0x6a, 0xc5, 0x87, 0x06, 0x73, 0xd1, 0x93, 0x71, 0x25, 0xcd, 0x2a, 0x8a, 0x1e, 0xf2, + 0xbd, 0x30, 0x71, 0x0d, 0xab, 0x3b, 0x7e, 0xd4, 0x51, 0x8a, 0x3a, 0x4e, 0xc0, 0x3e, 0xc4, 0x05, + 0x48, 0x35, 0xb1, 0x6d, 0xab, 0x75, 0x5c, 0x71, 0xf6, 0x4c, 0x9c, 0x89, 0xd1, 0xde, 0xcf, 0xb5, + 0xf5, 0x3e, 0xdc, 0xf3, 0x51, 0x4e, 0xb5, 0xb1, 0x67, 0x62, 0x94, 0x87, 0x24, 0xd6, 0x5b, 0x4d, + 0xc6, 0x21, 0xde, 0x45, 0x7f, 0x25, 0xbd, 0xd5, 0x0c, 0x73, 0x49, 0x10, 0x32, 0xce, 0x62, 0xc4, + 0xc6, 0xd6, 0x55, 0xad, 0x8a, 0x33, 0xc3, 0x94, 0xc1, 0xbd, 0x6d, 0x0c, 0xd6, 0x59, 0x7d, 0x98, + 0x87, 0xa0, 0x43, 0x0b, 0x90, 0xc4, 0xbb, 0x0e, 0xd6, 0x6d, 0xcd, 0xd0, 0x33, 0x23, 0x94, 0xc9, + 0xdd, 0x1d, 0x46, 0x11, 0x37, 0x6a, 0x61, 0x16, 0x1e, 0x1d, 0x3a, 0x07, 0x23, 0x86, 0xe9, 0x68, + 0x86, 0x6e, 0x67, 0x12, 0x73, 0xd2, 0xc9, 0xd1, 0x33, 0xc7, 0x3b, 0x1a, 0xc2, 0x2a, 0xc3, 0x51, + 0x04, 0x32, 0x2a, 0x43, 0xda, 0x36, 0x5a, 0x56, 0x15, 0x57, 0xaa, 0x46, 0x0d, 0x57, 0x34, 0x7d, + 0xcb, 0xc8, 0x24, 0x29, 0x83, 0xd9, 0xf6, 0x8e, 0x50, 0xc4, 0x05, 0xa3, 0x86, 0xcb, 0xfa, 0x96, + 0xa1, 0x8c, 0xdb, 0x81, 0x32, 0x3a, 0x0c, 0xc3, 0xf6, 0x9e, 0xee, 0xa8, 0xbb, 0x99, 0x14, 0xb5, + 0x10, 0x5e, 0x92, 0x7f, 0x73, 0x18, 0x26, 0x06, 0x31, 0xb1, 0xf3, 0x10, 0xdf, 0x22, 0xbd, 0xcc, + 0x44, 0xf6, 0xa3, 0x03, 0x46, 0x13, 0x54, 0xe2, 0xf0, 0x01, 0x95, 0x98, 0x87, 0x51, 0x1d, 0xdb, + 0x0e, 0xae, 0x31, 0x8b, 0x88, 0x0e, 0x68, 0x53, 0xc0, 0x88, 0xda, 0x4d, 0x2a, 0x76, 0x20, 0x93, + 0x7a, 0x16, 0x26, 0x5c, 0x91, 0x2a, 0x96, 0xaa, 0xd7, 0x85, 0x6d, 0x9e, 0xee, 0x27, 0xc9, 0x7c, + 0x49, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc7, 0x81, 0x32, 0x2a, 0x02, 0x18, 0x3a, 0x36, 0xb6, 0x2a, + 0x35, 0x5c, 0x6d, 0x64, 0x12, 0x5d, 0xb4, 0xb4, 0x4a, 0x50, 0xda, 0xb4, 0x64, 0x30, 0x68, 0xb5, + 0x81, 0x9e, 0xf0, 0x4c, 0x6d, 0xa4, 0x8b, 0xa5, 0x2c, 0xb3, 0x49, 0xd6, 0x66, 0x6d, 0x97, 0x61, + 0xdc, 0xc2, 0xc4, 0xee, 0x71, 0x8d, 0xf7, 0x2c, 0x49, 0x85, 0x98, 0xef, 0xdb, 0x33, 0x85, 0x93, + 0xb1, 0x8e, 0x8d, 0x59, 0xfe, 0x22, 0xba, 0x13, 0x5c, 0x40, 0x85, 0x9a, 0x15, 0x50, 0x2f, 0x94, + 0x12, 0xc0, 0x15, 0xb5, 0x89, 0xb3, 0x2f, 0xc2, 0x78, 0x50, 0x3d, 0x68, 0x1a, 0xe2, 0xb6, 0xa3, + 0x5a, 0x0e, 0xb5, 0xc2, 0xb8, 0xc2, 0x0a, 0x28, 0x0d, 0x51, 0xac, 0xd7, 0xa8, 0x97, 0x8b, 0x2b, + 0xe4, 0x27, 0x7a, 0x8b, 0xd7, 0xe1, 0x28, 0xed, 0xf0, 0x3d, 0xed, 0x23, 0x1a, 0xe0, 0x1c, 0xee, + 0x77, 0xf6, 0x31, 0x18, 0x0b, 0x74, 0x60, 0xd0, 0xa6, 0xe5, 0x77, 0xc2, 0xa1, 0x8e, 0xac, 0xd1, + 0xb3, 0x30, 0xdd, 0xd2, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, 0x62, 0xb1, 0xac, 0xa9, 0xcc, 0x7f, + 0x1c, 0xe9, 0x62, 0x73, 0x97, 0xfd, 0xd8, 0x8c, 0x8b, 0x32, 0xd5, 0x6a, 0x07, 0x9e, 0x4a, 0x26, + 0x5e, 0x1f, 0x49, 0xbf, 0xf4, 0xd2, 0x4b, 0x2f, 0x45, 0xe4, 0xaf, 0x0c, 0xc3, 0x74, 0xa7, 0x39, + 0xd3, 0x71, 0xfa, 0x1e, 0x86, 0x61, 0xbd, 0xd5, 0xdc, 0xc4, 0x16, 0x55, 0x52, 0x5c, 0xe1, 0x25, + 0x94, 0x87, 0x78, 0x43, 0xdd, 0xc4, 0x8d, 0x4c, 0x6c, 0x4e, 0x3a, 0x39, 0x7e, 0xe6, 0xfe, 0x81, + 0x66, 0xe5, 0xfc, 0x12, 0x21, 0x51, 0x18, 0x25, 0x7a, 0x33, 0xc4, 0xb8, 0x8b, 0x26, 0x1c, 0x4e, + 0x0d, 0xc6, 0x81, 0xcc, 0x25, 0x85, 0xd2, 0xa1, 0x63, 0x90, 0x24, 0x7f, 0x99, 0x6d, 0x0c, 0x53, + 0x99, 0x13, 0x04, 0x40, 0xec, 0x02, 0x65, 0x21, 0x41, 0xa7, 0x49, 0x0d, 0x8b, 0xd0, 0xe6, 0x96, + 0x89, 0x61, 0xd5, 0xf0, 0x96, 0xda, 0x6a, 0x38, 0x95, 0xab, 0x6a, 0xa3, 0x85, 0xa9, 0xc1, 0x27, + 0x95, 0x14, 0x07, 0x5e, 0x21, 0x30, 0x34, 0x0b, 0xa3, 0x6c, 0x56, 0x69, 0x7a, 0x0d, 0xef, 0x52, + 0xef, 0x19, 0x57, 0xd8, 0x44, 0x2b, 0x13, 0x08, 0x69, 0xfe, 0x79, 0xdb, 0xd0, 0x85, 0x69, 0xd2, + 0x26, 0x08, 0x80, 0x36, 0xff, 0x58, 0xd8, 0x71, 0x9f, 0xe8, 0xdc, 0xbd, 0xb6, 0xb9, 0x74, 0x2f, + 0x4c, 0x50, 0x8c, 0x47, 0xf8, 0xd0, 0xab, 0x8d, 0xcc, 0xe4, 0x9c, 0x74, 0x32, 0xa1, 0x8c, 0x33, + 0xf0, 0x2a, 0x87, 0xca, 0x5f, 0x8a, 0x40, 0x8c, 0x3a, 0x96, 0x09, 0x18, 0xdd, 0x78, 0xeb, 0x5a, + 0xa9, 0x52, 0x5c, 0xbd, 0x5c, 0x58, 0x2a, 0xa5, 0x25, 0x34, 0x0e, 0x40, 0x01, 0x17, 0x96, 0x56, + 0xf3, 0x1b, 0xe9, 0x88, 0x5b, 0x2e, 0xaf, 0x6c, 0x9c, 0x7b, 0x34, 0x1d, 0x75, 0x09, 0x2e, 0x33, + 0x40, 0xcc, 0x8f, 0xf0, 0xc8, 0x99, 0x74, 0x1c, 0xa5, 0x21, 0xc5, 0x18, 0x94, 0x9f, 0x2d, 0x15, + 0xcf, 0x3d, 0x9a, 0x1e, 0x0e, 0x42, 0x1e, 0x39, 0x93, 0x1e, 0x41, 0x63, 0x90, 0xa4, 0x90, 0xc2, + 0xea, 0xea, 0x52, 0x3a, 0xe1, 0xf2, 0x5c, 0xdf, 0x50, 0xca, 0x2b, 0x8b, 0xe9, 0xa4, 0xcb, 0x73, + 0x51, 0x59, 0xbd, 0xbc, 0x96, 0x06, 0x97, 0xc3, 0x72, 0x69, 0x7d, 0x3d, 0xbf, 0x58, 0x4a, 0x8f, + 0xba, 0x18, 0x85, 0xb7, 0x6e, 0x94, 0xd6, 0xd3, 0xa9, 0x80, 0x58, 0x8f, 0x9c, 0x49, 0x8f, 0xb9, + 0x4d, 0x94, 0x56, 0x2e, 0x2f, 0xa7, 0xc7, 0xd1, 0x24, 0x8c, 0xb1, 0x26, 0x84, 0x10, 0x13, 0x21, + 0xd0, 0xb9, 0x47, 0xd3, 0x69, 0x4f, 0x10, 0xc6, 0x65, 0x32, 0x00, 0x38, 0xf7, 0x68, 0x1a, 0xc9, + 0x0b, 0x10, 0xa7, 0x66, 0x88, 0x10, 0x8c, 0x2f, 0xe5, 0x0b, 0xa5, 0xa5, 0xca, 0xea, 0xda, 0x46, + 0x79, 0x75, 0x25, 0xbf, 0x94, 0x96, 0x3c, 0x98, 0x52, 0x7a, 0xfa, 0x72, 0x59, 0x29, 0x15, 0xd3, + 0x11, 0x3f, 0x6c, 0xad, 0x94, 0xdf, 0x28, 0x15, 0xd3, 0x51, 0xb9, 0x0a, 0xd3, 0x9d, 0x1c, 0x6a, + 0xc7, 0x29, 0xe4, 0xb3, 0x85, 0x48, 0x17, 0x5b, 0xa0, 0xbc, 0xc2, 0xb6, 0x20, 0x7f, 0x37, 0x02, + 0x53, 0x1d, 0x82, 0x4a, 0xc7, 0x46, 0x9e, 0x84, 0x38, 0xb3, 0x65, 0x16, 0x66, 0xef, 0xeb, 0x18, + 0x9d, 0xa8, 0x65, 0xb7, 0x85, 0x5a, 0x4a, 0xe7, 0x4f, 0x35, 0xa2, 0x5d, 0x52, 0x0d, 0xc2, 0xa2, + 0xcd, 0x60, 0x7f, 0xbe, 0xcd, 0xf9, 0xb3, 0xf8, 0x78, 0x6e, 0x90, 0xf8, 0x48, 0x61, 0xfb, 0x0b, + 0x02, 0xf1, 0x0e, 0x41, 0xe0, 0x3c, 0x4c, 0xb6, 0x31, 0x1a, 0xd8, 0x19, 0xbf, 0x57, 0x82, 0x4c, + 0x37, 0xe5, 0xf4, 0x71, 0x89, 0x91, 0x80, 0x4b, 0x3c, 0x1f, 0xd6, 0xe0, 0x1d, 0xdd, 0x07, 0xa1, + 0x6d, 0xac, 0x3f, 0x23, 0xc1, 0xe1, 0xce, 0x29, 0x65, 0x47, 0x19, 0xde, 0x0c, 0xc3, 0x4d, 0xec, + 0x6c, 0x1b, 0x22, 0xad, 0xba, 0xa7, 0x43, 0xb0, 0x26, 0xd5, 0xe1, 0xc1, 0xe6, 0x54, 0xfe, 0x68, + 0x1f, 0xed, 0x96, 0x17, 0x32, 0x69, 0xda, 0x24, 0xfd, 0x60, 0x04, 0x0e, 0x75, 0x64, 0xde, 0x51, + 0xd0, 0x13, 0x00, 0x9a, 0x6e, 0xb6, 0x1c, 0x96, 0x3a, 0x31, 0x4f, 0x9c, 0xa4, 0x10, 0xea, 0xbc, + 0x88, 0x97, 0x6d, 0x39, 0x6e, 0x7d, 0x94, 0xd6, 0x03, 0x03, 0x51, 0x84, 0xc7, 0x3d, 0x41, 0x63, + 0x54, 0xd0, 0x99, 0x2e, 0x3d, 0x6d, 0x33, 0xcc, 0x87, 0x20, 0x5d, 0x6d, 0x68, 0x58, 0x77, 0x2a, + 0xb6, 0x63, 0x61, 0xb5, 0xa9, 0xe9, 0x75, 0x1a, 0x6a, 0x12, 0xb9, 0xf8, 0x96, 0xda, 0xb0, 0xb1, + 0x32, 0xc1, 0xaa, 0xd7, 0x45, 0x2d, 0xa1, 0xa0, 0x06, 0x64, 0xf9, 0x28, 0x86, 0x03, 0x14, 0xac, + 0xda, 0xa5, 0x90, 0x3f, 0x9c, 0x84, 0x51, 0x5f, 0x02, 0x8e, 0xee, 0x80, 0xd4, 0xf3, 0xea, 0x55, + 0xb5, 0x22, 0x16, 0x55, 0x4c, 0x13, 0xa3, 0x04, 0xb6, 0xc6, 0x17, 0x56, 0x0f, 0xc1, 0x34, 0x45, + 0x31, 0x5a, 0x0e, 0xb6, 0x2a, 0xd5, 0x86, 0x6a, 0xdb, 0x54, 0x69, 0x09, 0x8a, 0x8a, 0x48, 0xdd, + 0x2a, 0xa9, 0x5a, 0x10, 0x35, 0xe8, 0x2c, 0x4c, 0x51, 0x8a, 0x66, 0xab, 0xe1, 0x68, 0x66, 0x03, + 0x57, 0xc8, 0x32, 0xcf, 0xa6, 0x21, 0xc7, 0x95, 0x6c, 0x92, 0x60, 0x2c, 0x73, 0x04, 0x22, 0x91, + 0x8d, 0x8a, 0x70, 0x82, 0x92, 0xd5, 0xb1, 0x8e, 0x2d, 0xd5, 0xc1, 0x15, 0xfc, 0x42, 0x4b, 0x6d, + 0xd8, 0x15, 0x55, 0xaf, 0x55, 0xb6, 0x55, 0x7b, 0x3b, 0x33, 0x4d, 0x18, 0x14, 0x22, 0x19, 0x49, + 0x39, 0x4a, 0x10, 0x17, 0x39, 0x5e, 0x89, 0xa2, 0xe5, 0xf5, 0xda, 0x45, 0xd5, 0xde, 0x46, 0x39, + 0x38, 0x4c, 0xb9, 0xd8, 0x8e, 0xa5, 0xe9, 0xf5, 0x4a, 0x75, 0x1b, 0x57, 0x77, 0x2a, 0x2d, 0x67, + 0xeb, 0xf1, 0xcc, 0x31, 0x7f, 0xfb, 0x54, 0xc2, 0x75, 0x8a, 0xb3, 0x40, 0x50, 0x2e, 0x3b, 0x5b, + 0x8f, 0xa3, 0x75, 0x48, 0x91, 0xc1, 0x68, 0x6a, 0x2f, 0xe2, 0xca, 0x96, 0x61, 0xd1, 0x18, 0x3a, + 0xde, 0xc1, 0x35, 0xf9, 0x34, 0x38, 0xbf, 0xca, 0x09, 0x96, 0x8d, 0x1a, 0xce, 0xc5, 0xd7, 0xd7, + 0x4a, 0xa5, 0xa2, 0x32, 0x2a, 0xb8, 0x5c, 0x30, 0x2c, 0x62, 0x50, 0x75, 0xc3, 0x55, 0xf0, 0x28, + 0x33, 0xa8, 0xba, 0x21, 0xd4, 0x7b, 0x16, 0xa6, 0xaa, 0x55, 0xd6, 0x67, 0xad, 0x5a, 0xe1, 0x8b, + 0x31, 0x3b, 0x93, 0x0e, 0x28, 0xab, 0x5a, 0x5d, 0x64, 0x08, 0xdc, 0xc6, 0x6d, 0xf4, 0x04, 0x1c, + 0xf2, 0x94, 0xe5, 0x27, 0x9c, 0x6c, 0xeb, 0x65, 0x98, 0xf4, 0x2c, 0x4c, 0x99, 0x7b, 0xed, 0x84, + 0x28, 0xd0, 0xa2, 0xb9, 0x17, 0x26, 0x7b, 0x0c, 0xa6, 0xcd, 0x6d, 0xb3, 0x9d, 0xee, 0x94, 0x9f, + 0x0e, 0x99, 0xdb, 0x66, 0x98, 0xf0, 0x6e, 0xba, 0x32, 0xb7, 0x70, 0x55, 0x75, 0x70, 0x2d, 0x73, + 0xc4, 0x8f, 0xee, 0xab, 0x40, 0xf3, 0x90, 0xae, 0x56, 0x2b, 0x58, 0x57, 0x37, 0x1b, 0xb8, 0xa2, + 0x5a, 0x58, 0x57, 0xed, 0xcc, 0x2c, 0x45, 0x8e, 0x39, 0x56, 0x0b, 0x2b, 0xe3, 0xd5, 0x6a, 0x89, + 0x56, 0xe6, 0x69, 0x1d, 0x3a, 0x05, 0x93, 0xc6, 0xe6, 0xf3, 0x55, 0x66, 0x91, 0x15, 0xd3, 0xc2, + 0x5b, 0xda, 0x6e, 0xe6, 0x2e, 0xaa, 0xde, 0x09, 0x52, 0x41, 0xed, 0x71, 0x8d, 0x82, 0xd1, 0x7d, + 0x90, 0xae, 0xda, 0xdb, 0xaa, 0x65, 0x52, 0x97, 0x6c, 0x9b, 0x6a, 0x15, 0x67, 0xee, 0x66, 0xa8, + 0x0c, 0xbe, 0x22, 0xc0, 0x64, 0x46, 0xd8, 0xd7, 0xb4, 0x2d, 0x47, 0x70, 0xbc, 0x97, 0xcd, 0x08, + 0x0a, 0xe3, 0xdc, 0x4e, 0x42, 0x9a, 0x68, 0x22, 0xd0, 0xf0, 0x49, 0x8a, 0x36, 0x6e, 0x6e, 0x9b, + 0xfe, 0x76, 0xef, 0x84, 0x31, 0x82, 0xe9, 0x35, 0x7a, 0x1f, 0x4b, 0xdc, 0xcc, 0x6d, 0x5f, 0x8b, + 0x8f, 0xc2, 0x61, 0x82, 0xd4, 0xc4, 0x8e, 0x5a, 0x53, 0x1d, 0xd5, 0x87, 0xfd, 0x00, 0xc5, 0x26, + 0x6a, 0x5f, 0xe6, 0x95, 0x01, 0x39, 0xad, 0xd6, 0xe6, 0x9e, 0x6b, 0x58, 0x0f, 0x32, 0x39, 0x09, + 0x4c, 0x98, 0xd6, 0x6d, 0x4b, 0xce, 0xe5, 0x1c, 0xa4, 0xfc, 0x76, 0x8f, 0x92, 0xc0, 0x2c, 0x3f, + 0x2d, 0x91, 0x24, 0x68, 0x61, 0xb5, 0x48, 0xd2, 0x97, 0xe7, 0x4a, 0xe9, 0x08, 0x49, 0xa3, 0x96, + 0xca, 0x1b, 0xa5, 0x8a, 0x72, 0x79, 0x65, 0xa3, 0xbc, 0x5c, 0x4a, 0x47, 0x7d, 0x89, 0xfd, 0x53, + 0xb1, 0xc4, 0x3d, 0xe9, 0x7b, 0xe5, 0x6f, 0x46, 0x60, 0x3c, 0xb8, 0x52, 0x43, 0x3f, 0x07, 0x47, + 0xc4, 0xb6, 0x8a, 0x8d, 0x9d, 0xca, 0x35, 0xcd, 0xa2, 0x13, 0xb2, 0xa9, 0xb2, 0xe0, 0xe8, 0xda, + 0xcf, 0x34, 0xc7, 0x5a, 0xc7, 0xce, 0x33, 0x9a, 0x45, 0xa6, 0x5b, 0x53, 0x75, 0xd0, 0x12, 0xcc, + 0xea, 0x46, 0xc5, 0x76, 0x54, 0xbd, 0xa6, 0x5a, 0xb5, 0x8a, 0xb7, 0xa1, 0x55, 0x51, 0xab, 0x55, + 0x6c, 0xdb, 0x06, 0x0b, 0x84, 0x2e, 0x97, 0xe3, 0xba, 0xb1, 0xce, 0x91, 0xbd, 0x08, 0x91, 0xe7, + 0xa8, 0x21, 0xf3, 0x8d, 0x76, 0x33, 0xdf, 0x63, 0x90, 0x6c, 0xaa, 0x66, 0x05, 0xeb, 0x8e, 0xb5, + 0x47, 0xf3, 0xf3, 0x84, 0x92, 0x68, 0xaa, 0x66, 0x89, 0x94, 0x7f, 0x22, 0xcb, 0xa4, 0xa7, 0x62, + 0x89, 0x44, 0x3a, 0xf9, 0x54, 0x2c, 0x91, 0x4c, 0x83, 0xfc, 0x5a, 0x14, 0x52, 0xfe, 0x7c, 0x9d, + 0x2c, 0x7f, 0xaa, 0x34, 0x62, 0x49, 0xd4, 0xa7, 0xdd, 0xd9, 0x33, 0xbb, 0x9f, 0x5f, 0x20, 0xa1, + 0x2c, 0x37, 0xcc, 0x92, 0x63, 0x85, 0x51, 0x92, 0x34, 0x82, 0x18, 0x1b, 0x66, 0xc9, 0x48, 0x42, + 0xe1, 0x25, 0xb4, 0x08, 0xc3, 0xcf, 0xdb, 0x94, 0xf7, 0x30, 0xe5, 0x7d, 0x57, 0x6f, 0xde, 0x4f, + 0xad, 0x53, 0xe6, 0xc9, 0xa7, 0xd6, 0x2b, 0x2b, 0xab, 0xca, 0x72, 0x7e, 0x49, 0xe1, 0xe4, 0xe8, + 0x28, 0xc4, 0x1a, 0xea, 0x8b, 0x7b, 0xc1, 0xa0, 0x47, 0x41, 0x83, 0x0e, 0xc2, 0x51, 0x88, 0x5d, + 0xc3, 0xea, 0x4e, 0x30, 0xd4, 0x50, 0xd0, 0x6d, 0x9c, 0x0c, 0xa7, 0x21, 0x4e, 0xf5, 0x85, 0x00, + 0xb8, 0xc6, 0xd2, 0x43, 0x28, 0x01, 0xb1, 0x85, 0x55, 0x85, 0x4c, 0x88, 0x34, 0xa4, 0x18, 0xb4, + 0xb2, 0x56, 0x2e, 0x2d, 0x94, 0xd2, 0x11, 0xf9, 0x2c, 0x0c, 0x33, 0x25, 0x90, 0xc9, 0xe2, 0xaa, + 0x21, 0x3d, 0xc4, 0x8b, 0x9c, 0x87, 0x24, 0x6a, 0x2f, 0x2f, 0x17, 0x4a, 0x4a, 0x3a, 0x12, 0x1c, + 0xea, 0x58, 0x3a, 0x2e, 0xdb, 0x90, 0xf2, 0xe7, 0xe1, 0x3f, 0x99, 0xc5, 0xf8, 0x97, 0x25, 0x18, + 0xf5, 0xe5, 0xd5, 0x24, 0x21, 0x52, 0x1b, 0x0d, 0xe3, 0x5a, 0x45, 0x6d, 0x68, 0xaa, 0xcd, 0x4d, + 0x03, 0x28, 0x28, 0x4f, 0x20, 0x83, 0x0e, 0xdd, 0x4f, 0x68, 0x8a, 0xc4, 0xd3, 0xc3, 0xf2, 0x27, + 0x25, 0x48, 0x87, 0x13, 0xdb, 0x90, 0x98, 0xd2, 0x4f, 0x53, 0x4c, 0xf9, 0x13, 0x12, 0x8c, 0x07, + 0xb3, 0xd9, 0x90, 0x78, 0x77, 0xfc, 0x54, 0xc5, 0xfb, 0x83, 0x08, 0x8c, 0x05, 0x72, 0xd8, 0x41, + 0xa5, 0x7b, 0x01, 0x26, 0xb5, 0x1a, 0x6e, 0x9a, 0x86, 0x83, 0xf5, 0xea, 0x5e, 0xa5, 0x81, 0xaf, + 0xe2, 0x46, 0x46, 0xa6, 0x4e, 0xe3, 0x74, 0xef, 0x2c, 0x79, 0xbe, 0xec, 0xd1, 0x2d, 0x11, 0xb2, + 0xdc, 0x54, 0xb9, 0x58, 0x5a, 0x5e, 0x5b, 0xdd, 0x28, 0xad, 0x2c, 0xbc, 0xb5, 0x72, 0x79, 0xe5, + 0xd2, 0xca, 0xea, 0x33, 0x2b, 0x4a, 0x5a, 0x0b, 0xa1, 0xdd, 0xc6, 0x69, 0xbf, 0x06, 0xe9, 0xb0, + 0x50, 0xe8, 0x08, 0x74, 0x12, 0x2b, 0x3d, 0x84, 0xa6, 0x60, 0x62, 0x65, 0xb5, 0xb2, 0x5e, 0x2e, + 0x96, 0x2a, 0xa5, 0x0b, 0x17, 0x4a, 0x0b, 0x1b, 0xeb, 0x6c, 0xdf, 0xc3, 0xc5, 0xde, 0x08, 0x4c, + 0x70, 0xf9, 0x95, 0x28, 0x4c, 0x75, 0x90, 0x04, 0xe5, 0xf9, 0x8a, 0x85, 0x2d, 0xa2, 0x1e, 0x1c, + 0x44, 0xfa, 0x79, 0x92, 0x33, 0xac, 0xa9, 0x96, 0xc3, 0x17, 0x38, 0xf7, 0x01, 0xd1, 0x92, 0xee, + 0x68, 0x5b, 0x1a, 0xb6, 0xf8, 0x7e, 0x12, 0x5b, 0xc6, 0x4c, 0x78, 0x70, 0xb6, 0xa5, 0xf4, 0x00, + 0x20, 0xd3, 0xb0, 0x35, 0x47, 0xbb, 0x8a, 0x2b, 0x9a, 0x2e, 0x36, 0x9f, 0xc8, 0xb2, 0x26, 0xa6, + 0xa4, 0x45, 0x4d, 0x59, 0x77, 0x5c, 0x6c, 0x1d, 0xd7, 0xd5, 0x10, 0x36, 0x71, 0xe6, 0x51, 0x25, + 0x2d, 0x6a, 0x5c, 0xec, 0x3b, 0x20, 0x55, 0x33, 0x5a, 0x24, 0xd7, 0x63, 0x78, 0x24, 0x76, 0x48, + 0xca, 0x28, 0x83, 0xb9, 0x28, 0x3c, 0x8b, 0xf7, 0x76, 0xbd, 0x52, 0xca, 0x28, 0x83, 0x31, 0x94, + 0x7b, 0x61, 0x42, 0xad, 0xd7, 0x2d, 0xc2, 0x5c, 0x30, 0x62, 0xeb, 0x92, 0x71, 0x17, 0x4c, 0x11, + 0xb3, 0x4f, 0x41, 0x42, 0xe8, 0x81, 0x84, 0x6a, 0xa2, 0x89, 0x8a, 0xc9, 0x16, 0xdb, 0x91, 0x93, + 0x49, 0x25, 0xa1, 0x8b, 0xca, 0x3b, 0x20, 0xa5, 0xd9, 0x15, 0x6f, 0x13, 0x3f, 0x32, 0x17, 0x39, + 0x99, 0x50, 0x46, 0x35, 0xdb, 0xdd, 0x00, 0x95, 0x3f, 0x13, 0x81, 0xf1, 0xe0, 0x21, 0x04, 0x2a, + 0x42, 0xa2, 0x61, 0x54, 0x55, 0x6a, 0x5a, 0xec, 0x04, 0xec, 0x64, 0x9f, 0x73, 0x8b, 0xf9, 0x25, + 0x8e, 0xaf, 0xb8, 0x94, 0xd9, 0xdf, 0x95, 0x20, 0x21, 0xc0, 0xe8, 0x30, 0xc4, 0x4c, 0xd5, 0xd9, + 0xa6, 0xec, 0xe2, 0x85, 0x48, 0x5a, 0x52, 0x68, 0x99, 0xc0, 0x6d, 0x53, 0xd5, 0xa9, 0x09, 0x70, + 0x38, 0x29, 0x93, 0x71, 0x6d, 0x60, 0xb5, 0x46, 0x17, 0x3d, 0x46, 0xb3, 0x89, 0x75, 0xc7, 0x16, + 0xe3, 0xca, 0xe1, 0x0b, 0x1c, 0x8c, 0xee, 0x87, 0x49, 0xc7, 0x52, 0xb5, 0x46, 0x00, 0x37, 0x46, + 0x71, 0xd3, 0xa2, 0xc2, 0x45, 0xce, 0xc1, 0x51, 0xc1, 0xb7, 0x86, 0x1d, 0xb5, 0xba, 0x8d, 0x6b, + 0x1e, 0xd1, 0x30, 0xdd, 0xdc, 0x38, 0xc2, 0x11, 0x8a, 0xbc, 0x5e, 0xd0, 0xca, 0xdf, 0x94, 0x60, + 0x52, 0x2c, 0xd3, 0x6a, 0xae, 0xb2, 0x96, 0x01, 0x54, 0x5d, 0x37, 0x1c, 0xbf, 0xba, 0xda, 0x4d, + 0xb9, 0x8d, 0x6e, 0x3e, 0xef, 0x12, 0x29, 0x3e, 0x06, 0xd9, 0x26, 0x80, 0x57, 0xd3, 0x55, 0x6d, + 0xb3, 0x30, 0xca, 0x4f, 0x98, 0xe8, 0x31, 0x25, 0x5b, 0xd8, 0x03, 0x03, 0x91, 0xf5, 0x1c, 0x9a, + 0x86, 0xf8, 0x26, 0xae, 0x6b, 0x3a, 0xdf, 0x37, 0x66, 0x05, 0xb1, 0xfd, 0x12, 0x73, 0xb7, 0x5f, + 0x0a, 0x7f, 0x1e, 0xa6, 0xaa, 0x46, 0x33, 0x2c, 0x6e, 0x21, 0x1d, 0xda, 0x5c, 0xb0, 0x2f, 0x4a, + 0xcf, 0x3d, 0xc8, 0x91, 0xea, 0x46, 0x43, 0xd5, 0xeb, 0xf3, 0x86, 0x55, 0xf7, 0x8e, 0x59, 0x49, + 0xc6, 0x63, 0xfb, 0x0e, 0x5b, 0xcd, 0xcd, 0x3f, 0x91, 0xa4, 0x5f, 0x8a, 0x44, 0x17, 0xd7, 0x0a, + 0x9f, 0x8d, 0x64, 0x17, 0x19, 0xe1, 0x9a, 0x50, 0x86, 0x82, 0xb7, 0x1a, 0xb8, 0x4a, 0x3a, 0x08, + 0xdf, 0xbf, 0x1f, 0xa6, 0xeb, 0x46, 0xdd, 0xa0, 0x9c, 0x4e, 0x93, 0x5f, 0xfc, 0x9c, 0x36, 0xe9, + 0x42, 0xb3, 0x7d, 0x0f, 0x75, 0x73, 0x2b, 0x30, 0xc5, 0x91, 0x2b, 0xf4, 0xa0, 0x88, 0x2d, 0x63, + 0x50, 0xcf, 0x3d, 0xb4, 0xcc, 0xe7, 0xbf, 0x47, 0xc3, 0xb7, 0x32, 0xc9, 0x49, 0x49, 0x1d, 0x5b, + 0xe9, 0xe4, 0x14, 0x38, 0x14, 0xe0, 0xc7, 0x26, 0x29, 0xb6, 0xfa, 0x70, 0xfc, 0x2d, 0xce, 0x71, + 0xca, 0xc7, 0x71, 0x9d, 0x93, 0xe6, 0x16, 0x60, 0x6c, 0x3f, 0xbc, 0xfe, 0x39, 0xe7, 0x95, 0xc2, + 0x7e, 0x26, 0x8b, 0x30, 0x41, 0x99, 0x54, 0x5b, 0xb6, 0x63, 0x34, 0xa9, 0x07, 0xec, 0xcd, 0xe6, + 0xb7, 0xbf, 0xc7, 0x66, 0xcd, 0x38, 0x21, 0x5b, 0x70, 0xa9, 0x72, 0x39, 0xa0, 0x67, 0x63, 0x35, + 0x5c, 0x6d, 0xf4, 0xe1, 0xf0, 0x55, 0x2e, 0x88, 0x8b, 0x9f, 0xbb, 0x02, 0xd3, 0xe4, 0x37, 0x75, + 0x50, 0x7e, 0x49, 0xfa, 0x6f, 0xb8, 0x65, 0xbe, 0xf9, 0x5e, 0x36, 0x31, 0xa7, 0x5c, 0x06, 0x3e, + 0x99, 0x7c, 0xa3, 0x58, 0xc7, 0x8e, 0x83, 0x2d, 0xbb, 0xa2, 0x36, 0x3a, 0x89, 0xe7, 0xdb, 0xb1, + 0xc8, 0x7c, 0xec, 0x07, 0xc1, 0x51, 0x5c, 0x64, 0x94, 0xf9, 0x46, 0x23, 0x77, 0x19, 0x8e, 0x74, + 0xb0, 0x8a, 0x01, 0x78, 0xbe, 0xc2, 0x79, 0x4e, 0xb7, 0x59, 0x06, 0x61, 0xbb, 0x06, 0x02, 0xee, + 0x8e, 0xe5, 0x00, 0x3c, 0x3f, 0xce, 0x79, 0x22, 0x4e, 0x2b, 0x86, 0x94, 0x70, 0x7c, 0x0a, 0x26, + 0xaf, 0x62, 0x6b, 0xd3, 0xb0, 0xf9, 0x2e, 0xd1, 0x00, 0xec, 0x3e, 0xc1, 0xd9, 0x4d, 0x70, 0x42, + 0xba, 0x6d, 0x44, 0x78, 0x3d, 0x01, 0x89, 0x2d, 0xb5, 0x8a, 0x07, 0x60, 0x71, 0x9d, 0xb3, 0x18, + 0x21, 0xf8, 0x84, 0x34, 0x0f, 0xa9, 0xba, 0xc1, 0x63, 0x54, 0x7f, 0xf2, 0x4f, 0x72, 0xf2, 0x51, + 0x41, 0xc3, 0x59, 0x98, 0x86, 0xd9, 0x6a, 0x90, 0x00, 0xd6, 0x9f, 0xc5, 0xdf, 0x10, 0x2c, 0x04, + 0x0d, 0x67, 0xb1, 0x0f, 0xb5, 0xbe, 0x2a, 0x58, 0xd8, 0x3e, 0x7d, 0x3e, 0x09, 0xa3, 0x86, 0xde, + 0xd8, 0x33, 0xf4, 0x41, 0x84, 0xf8, 0x14, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xc9, 0x41, + 0x07, 0xe2, 0x6f, 0xfe, 0x40, 0x4c, 0x0f, 0x31, 0x02, 0x8b, 0x30, 0x21, 0x1c, 0x94, 0x66, 0xe8, + 0x03, 0xb0, 0xf8, 0x5b, 0x9c, 0xc5, 0xb8, 0x8f, 0x8c, 0x77, 0xc3, 0xc1, 0xb6, 0x53, 0xc7, 0x83, + 0x30, 0xf9, 0x8c, 0xe8, 0x06, 0x27, 0xe1, 0xaa, 0xdc, 0xc4, 0x7a, 0x75, 0x7b, 0x30, 0x0e, 0xbf, + 0x22, 0x54, 0x29, 0x68, 0x08, 0x8b, 0x05, 0x18, 0x6b, 0xaa, 0x96, 0xbd, 0xad, 0x36, 0x06, 0x1a, + 0x8e, 0xbf, 0xcd, 0x79, 0xa4, 0x5c, 0x22, 0xae, 0x91, 0x96, 0xbe, 0x1f, 0x36, 0x9f, 0x15, 0x1a, + 0xf1, 0x91, 0xf1, 0xa9, 0x67, 0x3b, 0x74, 0x4b, 0x6d, 0x3f, 0xdc, 0x7e, 0x55, 0x4c, 0x3d, 0x46, + 0xbb, 0xec, 0xe7, 0x78, 0x1e, 0x92, 0xb6, 0xf6, 0xe2, 0x40, 0x6c, 0x7e, 0x4d, 0x8c, 0x34, 0x25, + 0x20, 0xc4, 0x6f, 0x85, 0xa3, 0x1d, 0xc3, 0xc4, 0x00, 0xcc, 0xfe, 0x0e, 0x67, 0x76, 0xb8, 0x43, + 0xa8, 0xe0, 0x2e, 0x61, 0xbf, 0x2c, 0xff, 0xae, 0x70, 0x09, 0x38, 0xc4, 0x6b, 0x8d, 0xac, 0x1a, + 0x6c, 0x75, 0x6b, 0x7f, 0x5a, 0xfb, 0x75, 0xa1, 0x35, 0x46, 0x1b, 0xd0, 0xda, 0x06, 0x1c, 0xe6, + 0x1c, 0xf7, 0x37, 0xae, 0x9f, 0x13, 0x8e, 0x95, 0x51, 0x5f, 0x0e, 0x8e, 0xee, 0xdb, 0x20, 0xeb, + 0xaa, 0x53, 0xa4, 0xa7, 0x76, 0xa5, 0xa9, 0x9a, 0x03, 0x70, 0xfe, 0x3c, 0xe7, 0x2c, 0x3c, 0xbe, + 0x9b, 0xdf, 0xda, 0xcb, 0xaa, 0x49, 0x98, 0x3f, 0x0b, 0x19, 0xc1, 0xbc, 0xa5, 0x5b, 0xb8, 0x6a, + 0xd4, 0x75, 0xed, 0x45, 0x5c, 0x1b, 0x80, 0xf5, 0x6f, 0x84, 0x86, 0xea, 0xb2, 0x8f, 0x9c, 0x70, + 0x2e, 0x43, 0xda, 0xcd, 0x55, 0x2a, 0x5a, 0xd3, 0x34, 0x2c, 0xa7, 0x0f, 0xc7, 0x2f, 0x88, 0x91, + 0x72, 0xe9, 0xca, 0x94, 0x2c, 0x57, 0x02, 0x76, 0xce, 0x3c, 0xa8, 0x49, 0x7e, 0x91, 0x33, 0x1a, + 0xf3, 0xa8, 0xb8, 0xe3, 0xa8, 0x1a, 0x4d, 0x53, 0xb5, 0x06, 0xf1, 0x7f, 0x7f, 0x4f, 0x38, 0x0e, + 0x4e, 0xc2, 0x1d, 0x07, 0xc9, 0xe8, 0x48, 0xb4, 0x1f, 0x80, 0xc3, 0x97, 0x84, 0xe3, 0x10, 0x34, + 0x9c, 0x85, 0x48, 0x18, 0x06, 0x60, 0xf1, 0xf7, 0x05, 0x0b, 0x41, 0x43, 0x58, 0x3c, 0xed, 0x05, + 0x5a, 0x0b, 0xd7, 0x35, 0xdb, 0xb1, 0x58, 0x52, 0xdc, 0x9b, 0xd5, 0x3f, 0xf8, 0x41, 0x30, 0x09, + 0x53, 0x7c, 0xa4, 0xc4, 0x13, 0xf1, 0x4d, 0x56, 0xba, 0x66, 0xea, 0x2f, 0xd8, 0x6f, 0x0a, 0x4f, + 0xe4, 0x23, 0x23, 0xb2, 0xf9, 0x32, 0x44, 0xa2, 0xf6, 0x2a, 0x59, 0x29, 0x0c, 0xc0, 0xee, 0x1f, + 0x86, 0x84, 0x5b, 0x17, 0xb4, 0x84, 0xa7, 0x2f, 0xff, 0x69, 0xe9, 0x3b, 0x78, 0x6f, 0x20, 0xeb, + 0xfc, 0x47, 0xa1, 0xfc, 0xe7, 0x32, 0xa3, 0x64, 0x3e, 0x64, 0x22, 0x94, 0x4f, 0xa1, 0x7e, 0xb7, + 0x8a, 0x32, 0xef, 0xfe, 0x11, 0xef, 0x6f, 0x30, 0x9d, 0xca, 0x2d, 0x11, 0x23, 0x0f, 0x26, 0x3d, + 0xfd, 0x99, 0xbd, 0xf7, 0x47, 0xae, 0x9d, 0x07, 0x72, 0x9e, 0xdc, 0x05, 0x18, 0x0b, 0x24, 0x3c, + 0xfd, 0x59, 0xbd, 0x8f, 0xb3, 0x4a, 0xf9, 0xf3, 0x9d, 0xdc, 0x59, 0x88, 0x91, 0xe4, 0xa5, 0x3f, + 0xf9, 0x5f, 0xe0, 0xe4, 0x14, 0x3d, 0xf7, 0x26, 0x48, 0x88, 0xa4, 0xa5, 0x3f, 0xe9, 0xfb, 0x39, + 0xa9, 0x4b, 0x42, 0xc8, 0x45, 0xc2, 0xd2, 0x9f, 0xfc, 0x2f, 0x0a, 0x72, 0x41, 0x42, 0xc8, 0x07, + 0x57, 0xe1, 0x97, 0x7f, 0x21, 0xc6, 0x83, 0x8e, 0xd0, 0xdd, 0x79, 0x18, 0xe1, 0x99, 0x4a, 0x7f, + 0xea, 0x0f, 0xf2, 0xc6, 0x05, 0x45, 0xee, 0x31, 0x88, 0x0f, 0xa8, 0xf0, 0xbf, 0xc4, 0x49, 0x19, + 0x7e, 0x6e, 0x01, 0x46, 0x7d, 0xd9, 0x49, 0x7f, 0xf2, 0xbf, 0xcc, 0xc9, 0xfd, 0x54, 0x44, 0x74, + 0x9e, 0x9d, 0xf4, 0x67, 0xf0, 0x57, 0x84, 0xe8, 0x9c, 0x82, 0xa8, 0x4d, 0x24, 0x26, 0xfd, 0xa9, + 0x3f, 0x24, 0xb4, 0x2e, 0x48, 0x72, 0x4f, 0x42, 0xd2, 0x0d, 0x36, 0xfd, 0xe9, 0x3f, 0xcc, 0xe9, + 0x3d, 0x1a, 0xa2, 0x01, 0x5f, 0xb0, 0xeb, 0xcf, 0xe2, 0xaf, 0x0a, 0x0d, 0xf8, 0xa8, 0xc8, 0x34, + 0x0a, 0x27, 0x30, 0xfd, 0x39, 0x7d, 0x44, 0x4c, 0xa3, 0x50, 0xfe, 0x42, 0x46, 0x93, 0xfa, 0xfc, + 0xfe, 0x2c, 0xfe, 0x9a, 0x18, 0x4d, 0x8a, 0x4f, 0xc4, 0x08, 0x67, 0x04, 0xfd, 0x79, 0xfc, 0xa2, + 0x10, 0x23, 0x94, 0x10, 0xe4, 0xd6, 0x00, 0xb5, 0x67, 0x03, 0xfd, 0xf9, 0x7d, 0x94, 0xf3, 0x9b, + 0x6c, 0x4b, 0x06, 0x72, 0xcf, 0xc0, 0xe1, 0xce, 0x99, 0x40, 0x7f, 0xae, 0x1f, 0xfb, 0x51, 0x68, + 0xed, 0xe6, 0x4f, 0x04, 0x72, 0x1b, 0x5e, 0x48, 0xf1, 0x67, 0x01, 0xfd, 0xd9, 0xbe, 0xf2, 0xa3, + 0xa0, 0xe3, 0xf6, 0x27, 0x01, 0xb9, 0x3c, 0x80, 0x17, 0x80, 0xfb, 0xf3, 0xfa, 0x04, 0xe7, 0xe5, + 0x23, 0x22, 0x53, 0x83, 0xc7, 0xdf, 0xfe, 0xf4, 0xd7, 0xc5, 0xd4, 0xe0, 0x14, 0x64, 0x6a, 0x88, + 0xd0, 0xdb, 0x9f, 0xfa, 0x93, 0x62, 0x6a, 0x08, 0x12, 0x62, 0xd9, 0xbe, 0xe8, 0xd6, 0x9f, 0xc3, + 0xa7, 0x84, 0x65, 0xfb, 0xa8, 0x72, 0x2b, 0x30, 0xd9, 0x16, 0x10, 0xfb, 0xb3, 0xfa, 0x25, 0xce, + 0x2a, 0x1d, 0x8e, 0x87, 0xfe, 0xe0, 0xc5, 0x83, 0x61, 0x7f, 0x6e, 0x9f, 0x0e, 0x05, 0x2f, 0x1e, + 0x0b, 0x73, 0xe7, 0x21, 0xa1, 0xb7, 0x1a, 0x0d, 0x32, 0x79, 0x50, 0xef, 0x9b, 0x80, 0x99, 0xff, + 0xf4, 0x63, 0xae, 0x1d, 0x41, 0x90, 0x3b, 0x0b, 0x71, 0xdc, 0xdc, 0xc4, 0xb5, 0x7e, 0x94, 0xdf, + 0xff, 0xb1, 0x70, 0x98, 0x04, 0x3b, 0xf7, 0x24, 0x00, 0xdb, 0x1a, 0xa1, 0x87, 0x81, 0x7d, 0x68, + 0xff, 0xf3, 0x8f, 0xf9, 0xd5, 0x1b, 0x8f, 0xc4, 0x63, 0xc0, 0x2e, 0xf2, 0xf4, 0x66, 0xf0, 0x83, + 0x20, 0x03, 0x3a, 0x22, 0x4f, 0xc0, 0xc8, 0xf3, 0xb6, 0xa1, 0x3b, 0x6a, 0xbd, 0x1f, 0xf5, 0x7f, + 0xe1, 0xd4, 0x02, 0x9f, 0x28, 0xac, 0x69, 0x58, 0xd8, 0x51, 0xeb, 0x76, 0x3f, 0xda, 0xff, 0xca, + 0x69, 0x5d, 0x02, 0x42, 0x5c, 0x55, 0x6d, 0x67, 0x90, 0x7e, 0xff, 0x91, 0x20, 0x16, 0x04, 0x44, + 0x68, 0xf2, 0x7b, 0x07, 0xef, 0xf5, 0xa3, 0xfd, 0xa1, 0x10, 0x9a, 0xe3, 0xe7, 0xde, 0x04, 0x49, + 0xf2, 0x93, 0xdd, 0xa7, 0xeb, 0x43, 0xfc, 0xc7, 0x9c, 0xd8, 0xa3, 0x20, 0x2d, 0xdb, 0x4e, 0xcd, + 0xd1, 0xfa, 0x2b, 0xfb, 0x26, 0x1f, 0x69, 0x81, 0x9f, 0xcb, 0xc3, 0xa8, 0xed, 0xd4, 0x6a, 0x2d, + 0x9e, 0x9f, 0xf6, 0x21, 0xff, 0x6f, 0x3f, 0x76, 0xb7, 0x2c, 0x5c, 0x1a, 0x32, 0xda, 0xd7, 0x76, + 0x1c, 0xd3, 0xa0, 0x07, 0x1e, 0xfd, 0x38, 0xfc, 0x88, 0x73, 0xf0, 0x91, 0xe4, 0x16, 0x20, 0x45, + 0xfa, 0x62, 0x61, 0x13, 0xd3, 0xd3, 0xa9, 0x3e, 0x2c, 0xfe, 0x3b, 0x57, 0x40, 0x80, 0xa8, 0xf0, + 0xf3, 0x5f, 0x7d, 0x6d, 0x46, 0xfa, 0xc6, 0x6b, 0x33, 0xd2, 0x1f, 0xbc, 0x36, 0x23, 0x7d, 0xe8, + 0xbb, 0x33, 0x43, 0xdf, 0xf8, 0xee, 0xcc, 0xd0, 0xb7, 0xbe, 0x3b, 0x33, 0xd4, 0x79, 0x97, 0x18, + 0x16, 0x8d, 0x45, 0x83, 0xed, 0x0f, 0x3f, 0x27, 0xd7, 0x35, 0x67, 0xbb, 0xb5, 0x39, 0x5f, 0x35, + 0x9a, 0x74, 0x1b, 0xd7, 0xdb, 0xad, 0x75, 0x17, 0x39, 0xf0, 0x9e, 0x28, 0x1c, 0xad, 0x1a, 0x76, + 0xd3, 0xb0, 0x2b, 0x6c, 0xbf, 0x97, 0x15, 0xf8, 0x8e, 0x6f, 0xca, 0x5f, 0x35, 0xc0, 0xa6, 0xef, + 0x45, 0x18, 0xa7, 0x5d, 0xa7, 0xdb, 0x5d, 0xd4, 0xda, 0xfa, 0x3a, 0x88, 0xaf, 0xfd, 0x9b, 0x38, + 0xed, 0xf5, 0x98, 0x4b, 0x48, 0x4f, 0xef, 0x37, 0x60, 0x5a, 0x6b, 0x9a, 0x0d, 0x4c, 0xb7, 0xf9, + 0x2b, 0x6e, 0x5d, 0x7f, 0x7e, 0x5f, 0xe7, 0xfc, 0xa6, 0x3c, 0xf2, 0xb2, 0xa0, 0xce, 0x2d, 0xc1, + 0xa4, 0x5a, 0xad, 0x62, 0x33, 0xc0, 0xb2, 0xcf, 0xb0, 0x08, 0x01, 0xd3, 0x9c, 0xd2, 0xe5, 0x56, + 0x78, 0xb2, 0xdb, 0xd0, 0x3c, 0x77, 0xb7, 0x4f, 0xf3, 0x16, 0xae, 0x63, 0xfd, 0x41, 0x1d, 0x3b, + 0xd7, 0x0c, 0x6b, 0x87, 0xab, 0xf7, 0x41, 0xd6, 0xd4, 0x30, 0xbb, 0xc1, 0x0c, 0xef, 0x8b, 0xc2, + 0x0c, 0xab, 0x38, 0xbd, 0xa9, 0xda, 0xf8, 0xf4, 0xd5, 0x87, 0x37, 0xb1, 0xa3, 0x3e, 0x7c, 0xba, + 0x6a, 0x68, 0x3a, 0x1f, 0x89, 0x29, 0x3e, 0x2e, 0xa4, 0x7e, 0x9e, 0xd7, 0x67, 0x3b, 0x6e, 0xd3, + 0xcb, 0x8b, 0x10, 0x5b, 0x30, 0x34, 0x1d, 0x4d, 0x43, 0xbc, 0x86, 0x75, 0xa3, 0xc9, 0xef, 0xdc, + 0xb1, 0x02, 0xba, 0x13, 0x86, 0xd5, 0xa6, 0xd1, 0xd2, 0x1d, 0x76, 0x42, 0x51, 0x18, 0xfd, 0xea, + 0x8d, 0xd9, 0xa1, 0xdf, 0xbf, 0x31, 0x1b, 0x2d, 0xeb, 0x8e, 0xc2, 0xab, 0x72, 0xb1, 0xd7, 0x5f, + 0x9d, 0x95, 0xe4, 0xa7, 0x60, 0xa4, 0x88, 0xab, 0x07, 0xe1, 0x55, 0xc4, 0xd5, 0x10, 0xaf, 0xfb, + 0x20, 0x51, 0xd6, 0x1d, 0x76, 0x2b, 0xf2, 0x04, 0x44, 0x35, 0x9d, 0x5d, 0xb4, 0x09, 0xb5, 0x4f, + 0xe0, 0x04, 0xb5, 0x88, 0xab, 0x2e, 0x6a, 0x0d, 0x57, 0xc3, 0xa8, 0x84, 0x3d, 0x81, 0x17, 0x8a, + 0xdf, 0xfa, 0x0f, 0x33, 0x43, 0x2f, 0xbd, 0x36, 0x33, 0xd4, 0x75, 0x24, 0xfc, 0x73, 0x80, 0xab, + 0x98, 0x0f, 0x81, 0x5d, 0xdb, 0x61, 0x67, 0x24, 0xee, 0x30, 0xfc, 0xce, 0x30, 0xc8, 0x1c, 0xc7, + 0x76, 0xd4, 0x1d, 0x4d, 0xaf, 0xbb, 0x23, 0xa1, 0xb6, 0x9c, 0xed, 0x17, 0xf9, 0x50, 0x1c, 0xe6, + 0x43, 0xc1, 0x71, 0x7a, 0x8f, 0x46, 0xb6, 0xfb, 0xec, 0xca, 0xf6, 0x19, 0x73, 0xf9, 0x5f, 0x46, + 0x01, 0xad, 0x3b, 0xea, 0x0e, 0xce, 0xb7, 0x9c, 0x6d, 0xc3, 0xd2, 0x5e, 0x64, 0xbe, 0x0c, 0x03, + 0x34, 0xd5, 0xdd, 0x8a, 0x63, 0xec, 0x60, 0xdd, 0xa6, 0xaa, 0x19, 0x3d, 0x73, 0x74, 0xbe, 0x83, + 0x7d, 0xcc, 0x93, 0xa1, 0x2b, 0xdc, 0xff, 0xd9, 0xef, 0xcc, 0xde, 0xdb, 0x5f, 0x0b, 0x14, 0x99, + 0x24, 0xd7, 0xbb, 0x1b, 0x94, 0x31, 0xba, 0x02, 0xec, 0x92, 0x45, 0xa5, 0xa1, 0xd9, 0x0e, 0xbf, + 0xa7, 0x7d, 0x76, 0xbe, 0x73, 0xdf, 0xe7, 0xdb, 0xc5, 0x9c, 0xbf, 0xa2, 0x36, 0xb4, 0x9a, 0xea, + 0x18, 0x96, 0x7d, 0x71, 0x48, 0x49, 0x52, 0x56, 0x4b, 0x9a, 0xed, 0xa0, 0x0d, 0x48, 0xd6, 0xb0, + 0xbe, 0xc7, 0xd8, 0x46, 0xdf, 0x18, 0xdb, 0x04, 0xe1, 0x44, 0xb9, 0x3e, 0x0b, 0x48, 0xf5, 0xe3, + 0x89, 0x87, 0x49, 0xec, 0x7e, 0x65, 0x17, 0xf6, 0x01, 0xce, 0xf4, 0x1d, 0xc5, 0xa4, 0x1a, 0x06, + 0x65, 0xef, 0x01, 0xf0, 0xda, 0x44, 0x19, 0x18, 0x51, 0x6b, 0x35, 0x0b, 0xdb, 0x36, 0x3d, 0x00, + 0x4c, 0x2a, 0xa2, 0x98, 0x9b, 0xfc, 0x57, 0x5f, 0x7c, 0x70, 0x2c, 0xc0, 0xb1, 0x90, 0x02, 0xb8, + 0xea, 0x92, 0x9e, 0xfa, 0xa4, 0x04, 0x93, 0x6d, 0x2d, 0x22, 0x19, 0x66, 0xf2, 0x97, 0x37, 0x2e, + 0xae, 0x2a, 0xe5, 0xe7, 0xf2, 0x1b, 0xe5, 0xd5, 0x95, 0x0a, 0xbb, 0xf2, 0xbf, 0xb2, 0xbe, 0x56, + 0x5a, 0x28, 0x5f, 0x28, 0x97, 0x8a, 0xe9, 0x21, 0x34, 0x0b, 0xc7, 0x3a, 0xe0, 0x14, 0x4b, 0x4b, + 0xa5, 0xc5, 0xfc, 0x46, 0x29, 0x2d, 0xa1, 0x3b, 0xe0, 0x44, 0x47, 0x26, 0x2e, 0x4a, 0xa4, 0x0b, + 0x8a, 0x52, 0x72, 0x51, 0xa2, 0x85, 0x0b, 0x5d, 0x67, 0xd1, 0x03, 0x3d, 0xed, 0x67, 0xd7, 0x9d, + 0x2e, 0xc1, 0xf9, 0xf4, 0xee, 0x08, 0x1c, 0x0d, 0x87, 0x0c, 0x55, 0xdf, 0xeb, 0xf2, 0xea, 0xb3, + 0x8b, 0x37, 0xbb, 0x08, 0xd1, 0xbc, 0xbe, 0x87, 0x8e, 0xb2, 0x7c, 0xba, 0xd2, 0xb2, 0x1a, 0xdc, + 0x07, 0x8d, 0x90, 0xf2, 0x65, 0xab, 0x41, 0x7c, 0x93, 0xb8, 0xe8, 0x2f, 0x9d, 0x4c, 0xf1, 0xdb, + 0xfb, 0xb9, 0xf4, 0x47, 0x5f, 0x9d, 0x1d, 0xfa, 0xdc, 0xab, 0xb3, 0x43, 0x3f, 0xfc, 0xd4, 0xec, + 0xd0, 0x4b, 0xdf, 0x9e, 0x1b, 0x2a, 0xec, 0x84, 0xbb, 0xf7, 0xe5, 0xbe, 0xd1, 0x34, 0x91, 0xd7, + 0xf7, 0xa8, 0x23, 0x5a, 0x93, 0x9e, 0x8b, 0xd3, 0xce, 0x89, 0x03, 0xd4, 0x99, 0xf0, 0x01, 0xea, + 0x33, 0xb8, 0xd1, 0xb8, 0xa4, 0x1b, 0xd7, 0xe8, 0xa8, 0x7a, 0x3a, 0xf8, 0x48, 0x04, 0x66, 0xda, + 0xc2, 0x26, 0xcf, 0x30, 0xba, 0x3d, 0x7f, 0xcd, 0x41, 0xa2, 0x28, 0x12, 0x97, 0x0c, 0x8c, 0xd8, + 0xb8, 0x6a, 0xe8, 0x35, 0x36, 0xd3, 0xa3, 0x8a, 0x28, 0x92, 0x6e, 0xeb, 0xaa, 0x6e, 0xd8, 0xfc, + 0xce, 0x3d, 0x2b, 0x14, 0x3e, 0x2e, 0xed, 0x2f, 0x5f, 0x18, 0x13, 0x2d, 0x89, 0x6e, 0x3e, 0xdc, + 0xf7, 0x48, 0x79, 0x87, 0xf4, 0xd2, 0xed, 0x44, 0xe0, 0x58, 0x79, 0x50, 0xad, 0xfc, 0x62, 0x04, + 0x66, 0xc3, 0x5a, 0x21, 0x69, 0x9b, 0xed, 0xa8, 0x4d, 0xb3, 0x9b, 0x5a, 0xce, 0x43, 0x72, 0x43, + 0xe0, 0xec, 0x5b, 0x2f, 0xd7, 0xf7, 0xa9, 0x97, 0x71, 0xb7, 0x29, 0xa1, 0x98, 0x33, 0x03, 0x2a, + 0xc6, 0xed, 0xc7, 0x81, 0x34, 0xf3, 0xd9, 0x18, 0x9c, 0xa0, 0x8f, 0xb2, 0xac, 0xa6, 0xa6, 0x3b, + 0xa7, 0xab, 0xd6, 0x9e, 0xe9, 0xd0, 0xc4, 0xcd, 0xd8, 0xe2, 0x7a, 0x99, 0xf4, 0xaa, 0xe7, 0x59, + 0x75, 0x97, 0x99, 0xb3, 0x05, 0xf1, 0x35, 0x42, 0x47, 0x34, 0xe2, 0x18, 0x8e, 0xda, 0xe0, 0x9a, + 0x62, 0x05, 0x02, 0x65, 0x0f, 0xb9, 0x22, 0x0c, 0xaa, 0x89, 0x37, 0x5c, 0x0d, 0xac, 0x6e, 0xb1, + 0xfb, 0xf0, 0x51, 0x3a, 0xa1, 0x12, 0x04, 0x40, 0xaf, 0xbe, 0x4f, 0x43, 0x5c, 0x6d, 0xb1, 0xab, + 0x1c, 0x51, 0x32, 0xd3, 0x68, 0x41, 0xbe, 0x04, 0x23, 0xfc, 0x40, 0x19, 0xa5, 0x21, 0xba, 0x83, + 0xf7, 0x68, 0x3b, 0x29, 0x85, 0xfc, 0x44, 0xf3, 0x10, 0xa7, 0xc2, 0xf3, 0x00, 0x92, 0x99, 0x6f, + 0x93, 0x7e, 0x9e, 0x0a, 0xa9, 0x30, 0x34, 0xf9, 0x29, 0x48, 0x14, 0x8d, 0xa6, 0xa6, 0x1b, 0x41, + 0x6e, 0x49, 0xc6, 0x8d, 0xca, 0x6c, 0xb6, 0x78, 0xbe, 0xa1, 0xb0, 0x02, 0x3a, 0x0c, 0xc3, 0xec, + 0x7d, 0x04, 0xbf, 0x8e, 0xc2, 0x4b, 0xf2, 0x02, 0x8c, 0x50, 0xde, 0xab, 0x26, 0x42, 0xfc, 0x65, + 0x1d, 0x7f, 0x88, 0x41, 0x53, 0x53, 0xce, 0x3e, 0xe2, 0x09, 0x8b, 0x20, 0x56, 0x53, 0x1d, 0x95, + 0xf7, 0x9b, 0xfe, 0x96, 0xdf, 0x0c, 0x09, 0xce, 0xc4, 0x46, 0x67, 0x20, 0x6a, 0x98, 0x36, 0xbf, + 0x50, 0x92, 0xed, 0xd6, 0x95, 0x55, 0xb3, 0x10, 0x23, 0x99, 0x8a, 0x42, 0x90, 0x0b, 0x4a, 0x57, + 0xa7, 0xfa, 0xb8, 0xcf, 0xa9, 0xfa, 0x86, 0xdc, 0xf7, 0x93, 0x0d, 0x69, 0x9b, 0x39, 0xb8, 0xc6, + 0xf2, 0xa9, 0x08, 0xcc, 0xf8, 0x6a, 0xaf, 0x62, 0xcb, 0xd6, 0x0c, 0x9d, 0xc7, 0x73, 0x66, 0x2d, + 0xc8, 0x27, 0x24, 0xaf, 0xef, 0x62, 0x2e, 0x6f, 0x82, 0x68, 0xde, 0x34, 0x51, 0x16, 0x12, 0xb4, + 0x5c, 0x35, 0x98, 0xbd, 0xc4, 0x14, 0xb7, 0x4c, 0xea, 0x6c, 0x63, 0xcb, 0xb9, 0xa6, 0x5a, 0xee, + 0x13, 0x42, 0x51, 0x96, 0x9f, 0x80, 0xe4, 0x82, 0xa1, 0xdb, 0x58, 0xb7, 0x5b, 0x74, 0x0e, 0x6e, + 0x36, 0x8c, 0xea, 0x0e, 0xe7, 0xc0, 0x0a, 0x44, 0xe1, 0xaa, 0x69, 0x52, 0xca, 0x98, 0x42, 0x7e, + 0xb2, 0xdc, 0xb0, 0xb0, 0xde, 0x55, 0x45, 0x4f, 0xec, 0x5f, 0x45, 0xbc, 0x93, 0xae, 0x8e, 0xfe, + 0xb7, 0x04, 0xc7, 0xdb, 0x27, 0xd4, 0x0e, 0xde, 0xb3, 0xf7, 0x3b, 0x9f, 0x9e, 0x85, 0xe4, 0x1a, + 0x7d, 0xc7, 0x7f, 0x09, 0xef, 0xa1, 0x2c, 0x8c, 0xe0, 0xda, 0x99, 0xb3, 0x67, 0x1f, 0x7e, 0x82, + 0x59, 0xfb, 0xc5, 0x21, 0x45, 0x00, 0xd0, 0x0c, 0x24, 0x6d, 0x5c, 0x35, 0xcf, 0x9c, 0x3d, 0xb7, + 0xf3, 0x30, 0x33, 0x2f, 0x92, 0x01, 0xb9, 0xa0, 0x5c, 0x82, 0xf4, 0xfa, 0xf5, 0x4f, 0xcd, 0x4a, + 0x85, 0x38, 0x44, 0xed, 0x56, 0xf3, 0xb6, 0xda, 0xc8, 0x2b, 0x71, 0x98, 0xf3, 0x53, 0x52, 0x4f, + 0xe5, 0x66, 0x25, 0x5c, 0x07, 0x69, 0x9f, 0x0e, 0x28, 0x46, 0x97, 0x64, 0xb6, 0xa7, 0x26, 0xe5, + 0xdf, 0x90, 0x20, 0xe5, 0xa6, 0x4a, 0xeb, 0xd8, 0x41, 0xe7, 0xfd, 0xf9, 0x0f, 0x9f, 0x36, 0xc7, + 0xe6, 0xc3, 0x6d, 0x79, 0x29, 0x9d, 0xe2, 0x43, 0x47, 0x8f, 0x51, 0x43, 0x34, 0x0d, 0x9b, 0x3f, + 0x2b, 0xeb, 0x43, 0xea, 0x22, 0xa3, 0x07, 0x00, 0x51, 0x0f, 0x57, 0xb9, 0x6a, 0x38, 0x9a, 0x5e, + 0xaf, 0x98, 0xc6, 0x35, 0xfe, 0x58, 0x37, 0xaa, 0xa4, 0x69, 0xcd, 0x15, 0x5a, 0xb1, 0x46, 0xe0, + 0x44, 0xe8, 0xa4, 0xcb, 0x25, 0x98, 0xde, 0x11, 0x27, 0x20, 0x8a, 0xe8, 0x3c, 0x8c, 0x98, 0xad, + 0xcd, 0x8a, 0xf0, 0x18, 0xa3, 0x67, 0x8e, 0x77, 0x9a, 0xff, 0xc2, 0x3e, 0xb8, 0x07, 0x18, 0x36, + 0x5b, 0x9b, 0xc4, 0x5a, 0xee, 0x80, 0x54, 0x07, 0x61, 0x46, 0xaf, 0x7a, 0x72, 0xd0, 0xcf, 0x47, + 0xf0, 0x1e, 0x54, 0x4c, 0x4b, 0x33, 0x2c, 0xcd, 0xd9, 0xa3, 0xf9, 0x6b, 0x54, 0x49, 0x8b, 0x8a, + 0x35, 0x0e, 0x97, 0x77, 0x60, 0x62, 0x9d, 0xae, 0x6f, 0x3d, 0xc9, 0xcf, 0x7a, 0xf2, 0x49, 0xfd, + 0xe5, 0xeb, 0x2a, 0x59, 0xa4, 0x4d, 0xb2, 0xc2, 0xd3, 0x5d, 0xad, 0xf3, 0xb1, 0xfd, 0x5b, 0x67, + 0x30, 0x43, 0xfc, 0xa3, 0xa3, 0x81, 0xc9, 0xc9, 0x8c, 0xd3, 0xef, 0xbe, 0x06, 0x35, 0xcc, 0x7e, + 0xd9, 0x44, 0xb6, 0x77, 0x50, 0xcd, 0xf6, 0x71, 0xa3, 0xd9, 0xbe, 0x53, 0x48, 0x7e, 0x02, 0xc6, + 0xd6, 0x54, 0xcb, 0x59, 0xc7, 0xce, 0x45, 0xac, 0xd6, 0xb0, 0x15, 0x8c, 0xba, 0x63, 0x22, 0xea, + 0x22, 0x88, 0xd1, 0xd0, 0xca, 0xa2, 0x0e, 0xfd, 0x2d, 0x6f, 0x43, 0x8c, 0xde, 0x0c, 0x75, 0x23, + 0x32, 0xa7, 0x60, 0x11, 0x99, 0xf8, 0xd2, 0x3d, 0x07, 0xdb, 0x22, 0xbd, 0xa5, 0x05, 0xf4, 0xa8, + 0x88, 0xab, 0xd1, 0xde, 0x71, 0x95, 0x1b, 0x22, 0x8f, 0xae, 0x0d, 0x18, 0x29, 0x10, 0x57, 0x5c, + 0x2e, 0xba, 0x82, 0x48, 0x9e, 0x20, 0x68, 0x19, 0x26, 0x4c, 0xd5, 0x72, 0xe8, 0x93, 0x98, 0x6d, + 0xda, 0x0b, 0x6e, 0xeb, 0xb3, 0xed, 0x33, 0x2f, 0xd0, 0x59, 0xde, 0xca, 0x98, 0xe9, 0x07, 0xca, + 0x7f, 0x18, 0x83, 0x61, 0xae, 0x8c, 0x37, 0xc1, 0x08, 0x57, 0x2b, 0xb7, 0xce, 0x13, 0xf3, 0xed, + 0x81, 0x69, 0xde, 0x0d, 0x20, 0x9c, 0x9f, 0xa0, 0x41, 0xf7, 0x40, 0xa2, 0xba, 0xad, 0x6a, 0x7a, + 0x45, 0xab, 0x89, 0xad, 0x86, 0xd7, 0x6e, 0xcc, 0x8e, 0x2c, 0x10, 0x58, 0xb9, 0xa8, 0x8c, 0xd0, + 0xca, 0x72, 0x8d, 0x64, 0x02, 0xdb, 0x58, 0xab, 0x6f, 0x3b, 0x7c, 0x86, 0xf1, 0x12, 0x7a, 0x1c, + 0x62, 0xc4, 0x20, 0xf8, 0x83, 0xc9, 0x6c, 0xdb, 0x86, 0x8f, 0x9b, 0xec, 0x15, 0x12, 0xa4, 0xe1, + 0x0f, 0x7d, 0x67, 0x56, 0x52, 0x28, 0x05, 0x5a, 0x80, 0xb1, 0x86, 0x6a, 0x3b, 0x15, 0x1a, 0xc1, + 0x48, 0xf3, 0x71, 0xbe, 0xde, 0x6e, 0x53, 0x08, 0x57, 0x2c, 0x17, 0x7d, 0x94, 0x50, 0x31, 0x50, + 0x0d, 0x9d, 0x84, 0x34, 0x65, 0x52, 0x35, 0x9a, 0x4d, 0xcd, 0x61, 0xb9, 0xd5, 0x30, 0xd5, 0xfb, + 0x38, 0x81, 0x2f, 0x50, 0x30, 0xcd, 0xb0, 0x8e, 0x41, 0x92, 0x3e, 0xd1, 0xa2, 0x28, 0xec, 0x3a, + 0x72, 0x82, 0x00, 0x68, 0xe5, 0xbd, 0x30, 0xe1, 0xf9, 0x47, 0x86, 0x92, 0x60, 0x5c, 0x3c, 0x30, + 0x45, 0x7c, 0x08, 0xa6, 0x75, 0xbc, 0x4b, 0x2f, 0x48, 0x07, 0xb0, 0x93, 0x14, 0x1b, 0x91, 0xba, + 0x2b, 0x41, 0x8a, 0xbb, 0x61, 0xbc, 0x2a, 0x94, 0xcf, 0x70, 0x81, 0xe2, 0x8e, 0xb9, 0x50, 0x8a, + 0x76, 0x14, 0x12, 0xaa, 0x69, 0x32, 0x84, 0x51, 0xee, 0x1f, 0x4d, 0x93, 0x56, 0x9d, 0x82, 0x49, + 0xda, 0x47, 0x0b, 0xdb, 0xad, 0x86, 0xc3, 0x99, 0xa4, 0x28, 0xce, 0x04, 0xa9, 0x50, 0x18, 0x9c, + 0xe2, 0xde, 0x09, 0x63, 0xf8, 0xaa, 0x56, 0xc3, 0x7a, 0x15, 0x33, 0xbc, 0x31, 0x8a, 0x97, 0x12, + 0x40, 0x8a, 0x74, 0x1f, 0xb8, 0x7e, 0xaf, 0x22, 0x7c, 0xf2, 0x38, 0xe3, 0x27, 0xe0, 0x79, 0x06, + 0x96, 0x33, 0x10, 0x2b, 0xaa, 0x8e, 0x4a, 0x12, 0x0c, 0x67, 0x97, 0x05, 0x9a, 0x94, 0x42, 0x7e, + 0xca, 0xaf, 0x47, 0x20, 0x76, 0xc5, 0x70, 0x30, 0x7a, 0xc4, 0x97, 0x00, 0x8e, 0x77, 0xb2, 0xe7, + 0x75, 0xad, 0xae, 0xe3, 0xda, 0xb2, 0x5d, 0xf7, 0x7d, 0x4f, 0xc1, 0x33, 0xa7, 0x48, 0xc0, 0x9c, + 0xa6, 0x21, 0x6e, 0x19, 0x2d, 0xbd, 0x26, 0x6e, 0xf2, 0xd2, 0x02, 0x2a, 0x41, 0xc2, 0xb5, 0x92, + 0x58, 0x3f, 0x2b, 0x99, 0x20, 0x56, 0x42, 0x6c, 0x98, 0x03, 0x94, 0x91, 0x4d, 0x6e, 0x2c, 0x05, + 0x48, 0xba, 0xce, 0x8b, 0x5b, 0xdb, 0x60, 0x06, 0xeb, 0x91, 0x91, 0x60, 0xe2, 0x8e, 0xbd, 0xab, + 0x3c, 0x66, 0x71, 0x69, 0xb7, 0x82, 0x6b, 0x2f, 0x60, 0x56, 0xfc, 0xdb, 0x0e, 0x23, 0xb4, 0x5f, + 0x9e, 0x59, 0xb1, 0xef, 0x3b, 0x1c, 0x87, 0xa4, 0xad, 0xd5, 0x75, 0xd5, 0x69, 0x59, 0x98, 0x5b, + 0x9e, 0x07, 0x90, 0xbf, 0x2c, 0xc1, 0x30, 0xb3, 0x64, 0x9f, 0xde, 0xa4, 0xce, 0x7a, 0x8b, 0x74, + 0xd3, 0x5b, 0xf4, 0xe0, 0x7a, 0xcb, 0x03, 0xb8, 0xc2, 0xd8, 0xfc, 0xc9, 0x7d, 0x87, 0x8c, 0x81, + 0x89, 0xb8, 0xae, 0xd5, 0xf9, 0x44, 0xf5, 0x11, 0xc9, 0xff, 0x5e, 0x22, 0x49, 0x2c, 0xaf, 0x47, + 0x79, 0x18, 0x13, 0x72, 0x55, 0xb6, 0x1a, 0x6a, 0x9d, 0xdb, 0xce, 0x89, 0xae, 0xc2, 0x5d, 0x68, + 0xa8, 0x75, 0x65, 0x94, 0xcb, 0x43, 0x0a, 0x9d, 0xc7, 0x21, 0xd2, 0x65, 0x1c, 0x02, 0x03, 0x1f, + 0x3d, 0xd8, 0xc0, 0x07, 0x86, 0x28, 0x16, 0x1e, 0xa2, 0x2f, 0x44, 0xe8, 0x62, 0xc6, 0x34, 0x6c, + 0xb5, 0xf1, 0x93, 0x98, 0x11, 0xc7, 0x20, 0x69, 0x1a, 0x8d, 0x0a, 0xab, 0x61, 0x37, 0xdc, 0x13, + 0xa6, 0xd1, 0x50, 0xda, 0x86, 0x3d, 0x7e, 0x8b, 0xa6, 0xcb, 0xf0, 0x2d, 0xd0, 0xda, 0x48, 0x58, + 0x6b, 0x16, 0xa4, 0x98, 0x2a, 0x78, 0x2c, 0x7b, 0x88, 0xe8, 0x80, 0x06, 0x47, 0xa9, 0x3d, 0xf6, + 0x32, 0xb1, 0x19, 0xa6, 0xc2, 0xf1, 0x08, 0x05, 0x73, 0xfd, 0x9d, 0x56, 0xc1, 0x7e, 0xb3, 0x54, + 0x38, 0x9e, 0xfc, 0xd7, 0x25, 0x80, 0x25, 0xa2, 0x59, 0xda, 0x5f, 0x12, 0x85, 0x6c, 0x2a, 0x42, + 0x25, 0xd0, 0xf2, 0x4c, 0xb7, 0x41, 0xe3, 0xed, 0xa7, 0x6c, 0xbf, 0xdc, 0x0b, 0x30, 0xe6, 0x19, + 0xa3, 0x8d, 0x85, 0x30, 0x33, 0x3d, 0xb2, 0xea, 0x75, 0xec, 0x28, 0xa9, 0xab, 0xbe, 0x92, 0xfc, + 0xcf, 0x24, 0x48, 0x52, 0x99, 0x96, 0xb1, 0xa3, 0x06, 0xc6, 0x50, 0x3a, 0xf8, 0x18, 0x9e, 0x00, + 0x60, 0x6c, 0x6c, 0xed, 0x45, 0xcc, 0x2d, 0x2b, 0x49, 0x21, 0xeb, 0xda, 0x8b, 0x18, 0x9d, 0x73, + 0x15, 0x1e, 0xed, 0xad, 0x70, 0x91, 0x75, 0x73, 0xb5, 0x1f, 0x81, 0x11, 0xfa, 0x89, 0xaa, 0x5d, + 0x9b, 0x27, 0xd2, 0xc3, 0x7a, 0xab, 0xb9, 0xb1, 0x6b, 0xcb, 0xcf, 0xc3, 0xc8, 0xc6, 0x2e, 0xdb, + 0x1b, 0x39, 0x06, 0x49, 0xcb, 0x30, 0x78, 0x4c, 0x66, 0xb9, 0x50, 0x82, 0x00, 0x68, 0x08, 0x12, + 0xfb, 0x01, 0x11, 0x6f, 0x3f, 0xc0, 0xdb, 0xd0, 0x88, 0x0e, 0xb4, 0xa1, 0x71, 0xea, 0xdf, 0x4a, + 0x30, 0xea, 0xf3, 0x0f, 0xe8, 0x61, 0x38, 0x54, 0x58, 0x5a, 0x5d, 0xb8, 0x54, 0x29, 0x17, 0x2b, + 0x17, 0x96, 0xf2, 0x8b, 0xde, 0x1b, 0xae, 0xec, 0xe1, 0x97, 0xaf, 0xcf, 0x21, 0x1f, 0xee, 0x65, + 0x9d, 0xee, 0x28, 0xa1, 0xd3, 0x30, 0x1d, 0x24, 0xc9, 0x17, 0xd6, 0x4b, 0x2b, 0x1b, 0x69, 0x29, + 0x7b, 0xe8, 0xe5, 0xeb, 0x73, 0x93, 0x3e, 0x8a, 0xfc, 0xa6, 0x8d, 0x75, 0xa7, 0x9d, 0x60, 0x61, + 0x75, 0x79, 0xb9, 0xbc, 0x91, 0x8e, 0xb4, 0x11, 0x70, 0x87, 0x7d, 0x1f, 0x4c, 0x06, 0x09, 0x56, + 0xca, 0x4b, 0xe9, 0x68, 0x16, 0xbd, 0x7c, 0x7d, 0x6e, 0xdc, 0x87, 0xbd, 0xa2, 0x35, 0xb2, 0x89, + 0x0f, 0x7c, 0x7a, 0x66, 0xe8, 0x57, 0x7e, 0x79, 0x46, 0x22, 0x3d, 0x1b, 0x0b, 0xf8, 0x08, 0xf4, + 0x00, 0x1c, 0x59, 0x2f, 0x2f, 0xae, 0x94, 0x8a, 0x95, 0xe5, 0xf5, 0x45, 0xb1, 0x07, 0x2d, 0x7a, + 0x37, 0xf1, 0xf2, 0xf5, 0xb9, 0x51, 0xde, 0xa5, 0x6e, 0xd8, 0x6b, 0x4a, 0xe9, 0xca, 0xea, 0x46, + 0x29, 0x2d, 0x31, 0xec, 0x35, 0x0b, 0x5f, 0x35, 0x1c, 0xf6, 0x0d, 0xbb, 0x87, 0xe0, 0x68, 0x07, + 0x6c, 0xb7, 0x63, 0x93, 0x2f, 0x5f, 0x9f, 0x1b, 0x5b, 0xb3, 0x30, 0x9b, 0x3f, 0x94, 0x62, 0x1e, + 0x32, 0xed, 0x14, 0xab, 0x6b, 0xab, 0xeb, 0xf9, 0xa5, 0xf4, 0x5c, 0x36, 0xfd, 0xf2, 0xf5, 0xb9, + 0x94, 0x70, 0x86, 0x74, 0xa3, 0xdf, 0xed, 0xd9, 0xed, 0x5c, 0xf1, 0xfc, 0x93, 0xd3, 0x70, 0x57, + 0x97, 0x33, 0x26, 0x71, 0x3a, 0x71, 0xa0, 0x53, 0xa6, 0xae, 0xfb, 0xec, 0xd9, 0x3e, 0xdb, 0xcf, + 0xfd, 0x97, 0x4e, 0x07, 0x3f, 0xc1, 0xca, 0xf6, 0x5c, 0xdc, 0xc9, 0x1f, 0x94, 0x60, 0xfc, 0xa2, + 0x66, 0x3b, 0x86, 0xa5, 0x55, 0xd5, 0x06, 0x7d, 0xb9, 0x75, 0x6e, 0x50, 0xdf, 0x1a, 0x9a, 0xea, + 0x4f, 0xc2, 0xf0, 0x55, 0xb5, 0xc1, 0x9c, 0x5a, 0x94, 0x7e, 0x68, 0xa6, 0xcb, 0x91, 0x8f, 0xeb, + 0xda, 0x04, 0x03, 0x46, 0x26, 0xff, 0x7a, 0x04, 0x26, 0xe8, 0x64, 0xb0, 0xd9, 0x27, 0xc8, 0xc8, + 0x1a, 0xab, 0x00, 0x31, 0x4b, 0x75, 0xf8, 0xa6, 0x61, 0x61, 0x9e, 0x9f, 0x3e, 0xde, 0x33, 0xc0, + 0x59, 0x5a, 0x11, 0x57, 0x15, 0x4a, 0x8b, 0xde, 0x0e, 0x89, 0xa6, 0xba, 0x5b, 0xa1, 0x7c, 0xd8, + 0xca, 0x25, 0xbf, 0x3f, 0x3e, 0x37, 0x6f, 0xcc, 0x4e, 0xec, 0xa9, 0xcd, 0x46, 0x4e, 0x16, 0x7c, + 0x64, 0x65, 0xa4, 0xa9, 0xee, 0x12, 0x11, 0x91, 0x09, 0x13, 0x04, 0x5a, 0xdd, 0x56, 0xf5, 0x3a, + 0x66, 0x8d, 0xd0, 0x2d, 0xd0, 0xc2, 0xc5, 0x7d, 0x37, 0x72, 0xd8, 0x6b, 0xc4, 0xc7, 0x4e, 0x56, + 0xc6, 0x9a, 0xea, 0xee, 0x02, 0x05, 0x90, 0x16, 0x73, 0x89, 0x8f, 0xbe, 0x3a, 0x3b, 0x44, 0x4f, + 0x74, 0xbf, 0x29, 0x01, 0x78, 0x1a, 0x43, 0x6f, 0x87, 0x74, 0xd5, 0x2d, 0x51, 0x5a, 0x71, 0x36, + 0x79, 0x6f, 0xb7, 0xb1, 0x08, 0xe9, 0x9b, 0xc5, 0xe6, 0x6f, 0xdc, 0x98, 0x95, 0x94, 0x89, 0x6a, + 0x68, 0x28, 0xde, 0x06, 0xa3, 0x2d, 0xb3, 0xa6, 0x3a, 0xb8, 0x42, 0xd7, 0x71, 0x91, 0xbe, 0x71, + 0x7e, 0x86, 0xf0, 0xba, 0x79, 0x63, 0x16, 0xb1, 0x6e, 0xf9, 0x88, 0x65, 0x1a, 0xfd, 0x81, 0x41, + 0x08, 0x81, 0xaf, 0x4f, 0x5f, 0x93, 0x60, 0xb4, 0xe8, 0xbb, 0x53, 0x99, 0x81, 0x91, 0xa6, 0xa1, + 0x6b, 0x3b, 0xdc, 0x1e, 0x93, 0x8a, 0x28, 0xa2, 0x2c, 0x24, 0xd8, 0x63, 0x56, 0x67, 0x4f, 0x6c, + 0x85, 0x8a, 0x32, 0xa1, 0xba, 0x86, 0x37, 0x6d, 0x4d, 0x8c, 0x86, 0x22, 0x8a, 0xe8, 0x02, 0xa4, + 0x6d, 0x5c, 0x6d, 0x59, 0x9a, 0xb3, 0x57, 0xa9, 0x1a, 0xba, 0xa3, 0x56, 0x1d, 0xf6, 0x2c, 0xb2, + 0x70, 0xec, 0xe6, 0x8d, 0xd9, 0x23, 0x4c, 0xd6, 0x30, 0x86, 0xac, 0x4c, 0x08, 0xd0, 0x02, 0x83, + 0x90, 0x16, 0x6a, 0xd8, 0x51, 0xb5, 0x86, 0x9d, 0x61, 0x97, 0x13, 0x44, 0xd1, 0xd7, 0x97, 0x6f, + 0x8d, 0xf8, 0x37, 0xb6, 0x2e, 0x40, 0xda, 0x30, 0xb1, 0x15, 0x48, 0x44, 0xa5, 0x70, 0xcb, 0x61, + 0x0c, 0x59, 0x99, 0x10, 0x20, 0x91, 0xa4, 0x3a, 0x64, 0x98, 0xc5, 0x42, 0xd1, 0x6c, 0x6d, 0x7a, + 0xfb, 0x61, 0xd3, 0x6d, 0xa3, 0x91, 0xd7, 0xf7, 0x0a, 0x8f, 0x78, 0xdc, 0xc3, 0x74, 0xf2, 0xd7, + 0xbf, 0xf8, 0xe0, 0x34, 0x37, 0x0d, 0x6f, 0x7f, 0xea, 0x12, 0xde, 0x23, 0xc3, 0xcf, 0x51, 0xd7, + 0x28, 0x26, 0x49, 0x3b, 0x9f, 0x57, 0xb5, 0x86, 0x78, 0xde, 0xaf, 0xf0, 0x12, 0xca, 0xc1, 0xb0, + 0xed, 0xa8, 0x4e, 0xcb, 0xe6, 0x27, 0xbd, 0x72, 0x37, 0x53, 0x2b, 0x18, 0x7a, 0x6d, 0x9d, 0x62, + 0x2a, 0x9c, 0x02, 0x5d, 0x80, 0x61, 0x7e, 0x84, 0x1e, 0xdf, 0xf7, 0xfc, 0xa6, 0x77, 0x25, 0x18, + 0x35, 0xd1, 0x48, 0x0d, 0x37, 0x70, 0x9d, 0xa5, 0x55, 0xdb, 0x2a, 0x59, 0x7d, 0xd0, 0x6f, 0xef, + 0x15, 0xca, 0xfb, 0x9e, 0x84, 0x5c, 0x53, 0x61, 0x7e, 0xb2, 0x32, 0xe1, 0x82, 0xd6, 0x29, 0x04, + 0x5d, 0x0a, 0x5c, 0xfe, 0xe5, 0x1f, 0xa8, 0xbc, 0xb3, 0x5b, 0xf7, 0x7d, 0x36, 0x2d, 0xf6, 0x27, + 0xfc, 0x57, 0x87, 0x2f, 0x40, 0xba, 0xa5, 0x6f, 0x1a, 0x3a, 0x7d, 0x83, 0xcb, 0xf3, 0x7b, 0xb2, + 0xbe, 0x8b, 0xfa, 0x8d, 0x23, 0x8c, 0x21, 0x2b, 0x13, 0x2e, 0xe8, 0x22, 0x5b, 0x05, 0xd4, 0x60, + 0xdc, 0xc3, 0xa2, 0x13, 0x35, 0xd9, 0x77, 0xa2, 0xde, 0xc1, 0x27, 0xea, 0xa1, 0x70, 0x2b, 0xde, + 0x5c, 0x1d, 0x73, 0x81, 0x84, 0x0c, 0x5d, 0x04, 0xf0, 0xdc, 0x03, 0xdd, 0xa7, 0x18, 0xed, 0x3e, + 0xf0, 0x9e, 0x8f, 0x11, 0xeb, 0x3d, 0x8f, 0x16, 0xbd, 0x13, 0xa6, 0x9a, 0x9a, 0x5e, 0xb1, 0x71, + 0x63, 0xab, 0xc2, 0x15, 0x4c, 0x58, 0xd2, 0x4f, 0x28, 0x15, 0x96, 0xf6, 0x67, 0x0f, 0x37, 0x6f, + 0xcc, 0x66, 0xb9, 0x0b, 0x6d, 0x67, 0x29, 0x2b, 0x93, 0x4d, 0x4d, 0x5f, 0xc7, 0x8d, 0xad, 0xa2, + 0x0b, 0x43, 0xa7, 0x60, 0xd2, 0xeb, 0xad, 0xa1, 0x57, 0xb6, 0x8d, 0x46, 0x8d, 0xee, 0x98, 0x24, + 0x7c, 0x9a, 0x5d, 0xd5, 0x2f, 0x1a, 0x8d, 0x5a, 0x2e, 0xf5, 0x81, 0x57, 0x67, 0x87, 0xf8, 0xd4, + 0x1e, 0x92, 0xcf, 0xd1, 0x7d, 0x76, 0x3e, 0x25, 0xb1, 0x4d, 0xd6, 0x2f, 0xaa, 0x28, 0xf0, 0x6b, + 0x09, 0x1e, 0x80, 0xb9, 0x84, 0x97, 0xbe, 0x3d, 0x27, 0xc9, 0xbf, 0x26, 0xc1, 0x70, 0xf1, 0xca, + 0x9a, 0xaa, 0x59, 0xa8, 0x0c, 0x93, 0x9e, 0x95, 0x05, 0x1d, 0xc2, 0xf1, 0x9b, 0x37, 0x66, 0x33, + 0x61, 0x43, 0x74, 0x3d, 0x82, 0x67, 0xec, 0xc2, 0x25, 0x94, 0xbb, 0x2d, 0x72, 0x03, 0xac, 0xda, + 0x50, 0xe4, 0xf6, 0x25, 0x70, 0xa8, 0x9b, 0x25, 0x18, 0x61, 0xd2, 0xda, 0x28, 0x07, 0x71, 0x93, + 0xfc, 0xe0, 0x87, 0x08, 0x33, 0x5d, 0x0d, 0x9d, 0xe2, 0xbb, 0x9b, 0x9e, 0x84, 0x44, 0xfe, 0x70, + 0x04, 0xa0, 0x78, 0xe5, 0xca, 0x86, 0xa5, 0x99, 0x0d, 0xec, 0xdc, 0xca, 0x9e, 0x6f, 0xc0, 0x21, + 0xdf, 0x8a, 0xca, 0xaa, 0x86, 0x7a, 0x3f, 0x77, 0xf3, 0xc6, 0xec, 0xf1, 0x70, 0xef, 0x7d, 0x68, + 0xb2, 0x32, 0xe5, 0xad, 0xad, 0xac, 0x6a, 0x47, 0xae, 0x35, 0xdb, 0x71, 0xb9, 0x46, 0xbb, 0x73, + 0xf5, 0xa1, 0xf9, 0xb9, 0x16, 0x6d, 0xa7, 0xb3, 0x6a, 0xd7, 0x61, 0xd4, 0x53, 0x89, 0x8d, 0x8a, + 0x90, 0x70, 0xf8, 0x6f, 0xae, 0x61, 0xb9, 0xbb, 0x86, 0x05, 0x19, 0xd7, 0xb2, 0x4b, 0x29, 0xff, + 0x89, 0x04, 0xe0, 0xb3, 0xef, 0x9f, 0x49, 0x13, 0x23, 0x6e, 0x9f, 0x3b, 0xe9, 0xe8, 0x81, 0xd2, + 0x3a, 0x4e, 0x1d, 0xd2, 0xe7, 0x2f, 0x44, 0x60, 0xea, 0xb2, 0x98, 0xb3, 0x3f, 0xf3, 0x3a, 0x58, + 0x83, 0x11, 0xac, 0x3b, 0x96, 0x46, 0x95, 0x40, 0x46, 0xfb, 0xa1, 0x6e, 0xa3, 0xdd, 0xa1, 0x4f, + 0xf4, 0x83, 0x53, 0x62, 0x83, 0x9e, 0xb3, 0x09, 0x69, 0xe3, 0x46, 0x14, 0x32, 0xdd, 0x28, 0xd1, + 0x02, 0x4c, 0x54, 0x2d, 0xcc, 0x2e, 0x69, 0xf9, 0x77, 0x09, 0x0b, 0x59, 0x2f, 0x0b, 0x0d, 0x21, + 0xc8, 0xca, 0xb8, 0x80, 0xf0, 0x48, 0x53, 0x07, 0x92, 0x22, 0x12, 0xb3, 0xa3, 0x77, 0xbd, 0x06, + 0xcb, 0x09, 0x65, 0x1e, 0x6a, 0x44, 0x23, 0x41, 0x06, 0x2c, 0xd6, 0x8c, 0x7b, 0x50, 0x1a, 0x6c, + 0x5e, 0x80, 0x09, 0x4d, 0xd7, 0x1c, 0x4d, 0x6d, 0x54, 0x36, 0xd5, 0x86, 0xaa, 0x57, 0x0f, 0x92, + 0x61, 0xb3, 0xf0, 0xc0, 0x9b, 0x0d, 0xb1, 0x93, 0x95, 0x71, 0x0e, 0x29, 0x30, 0x00, 0xba, 0x08, + 0x23, 0xa2, 0xa9, 0xd8, 0x81, 0x32, 0x13, 0x41, 0x8e, 0xee, 0x80, 0x94, 0x17, 0x61, 0xf8, 0x36, + 0x5b, 0x4c, 0x19, 0x75, 0x61, 0xe5, 0x5a, 0xe7, 0x20, 0x34, 0xdc, 0x39, 0x08, 0x79, 0xb9, 0xe5, + 0xb7, 0xa3, 0x30, 0xa9, 0xe0, 0xda, 0xff, 0x1f, 0xd9, 0xfd, 0x8d, 0xec, 0x32, 0x00, 0xf3, 0x1e, + 0xc4, 0x5f, 0x1f, 0x60, 0x70, 0x89, 0xff, 0x49, 0x32, 0x0e, 0x45, 0xdb, 0xb9, 0x7d, 0xc3, 0x7b, + 0x23, 0x02, 0x29, 0xff, 0xf0, 0xfe, 0x19, 0x8d, 0x99, 0xa8, 0xec, 0xf9, 0xc9, 0x18, 0xff, 0x88, + 0x70, 0x17, 0x3f, 0xd9, 0x36, 0x19, 0x7a, 0x3b, 0xc8, 0xff, 0x11, 0x81, 0xe1, 0x35, 0xd5, 0x52, + 0x9b, 0x36, 0xaa, 0xb6, 0xe5, 0xcc, 0x62, 0x23, 0xb5, 0xed, 0x53, 0xf1, 0x7c, 0xdf, 0xa6, 0x4f, + 0xca, 0xfc, 0xd1, 0x0e, 0x29, 0xf3, 0x5b, 0x60, 0x9c, 0x2c, 0xec, 0x7d, 0x97, 0x31, 0x88, 0xb6, + 0xc7, 0x0a, 0x47, 0x3d, 0x2e, 0xc1, 0x7a, 0xb6, 0xee, 0xbf, 0xe2, 0xbf, 0x8d, 0x31, 0x4a, 0x30, + 0xbc, 0xb0, 0x41, 0xc8, 0x0f, 0x7b, 0x0b, 0x6c, 0x5f, 0xa5, 0xac, 0x40, 0x53, 0xdd, 0x2d, 0xb1, + 0x02, 0x5a, 0x02, 0xb4, 0xed, 0xee, 0xf1, 0x54, 0x3c, 0x75, 0x12, 0xfa, 0x13, 0x37, 0x6f, 0xcc, + 0x1e, 0x65, 0xf4, 0xed, 0x38, 0xb2, 0x32, 0xe9, 0x01, 0x05, 0xb7, 0x47, 0x01, 0x48, 0xbf, 0x2a, + 0xec, 0x32, 0x3a, 0x5b, 0xb8, 0x1d, 0xba, 0x79, 0x63, 0x76, 0x92, 0x71, 0xf1, 0xea, 0x64, 0x25, + 0x49, 0x0a, 0x45, 0xf2, 0xdb, 0x67, 0xd9, 0x9f, 0x96, 0x00, 0x79, 0x01, 0x49, 0xc1, 0xb6, 0x49, + 0x56, 0x9a, 0x64, 0x49, 0xe1, 0xcb, 0xff, 0xa5, 0xde, 0x4b, 0x0a, 0x8f, 0x5e, 0x2c, 0x29, 0x7c, + 0x33, 0xe5, 0x09, 0xcf, 0x79, 0x47, 0xfa, 0xdd, 0xcc, 0xe6, 0x26, 0xc2, 0xf1, 0x5d, 0x29, 0x87, + 0xe4, 0x7f, 0x21, 0xc1, 0xd1, 0x36, 0x8b, 0x72, 0x85, 0xfd, 0x73, 0x80, 0x2c, 0x5f, 0x25, 0xff, + 0x22, 0x24, 0x13, 0x7a, 0xdf, 0x06, 0x3a, 0x69, 0xb5, 0xb9, 0xf1, 0x5b, 0x16, 0x7f, 0xf8, 0xd5, + 0xff, 0x7f, 0x2a, 0xc1, 0xb4, 0xbf, 0x79, 0xb7, 0x23, 0x2b, 0x90, 0xf2, 0xb7, 0xce, 0xbb, 0x70, + 0xd7, 0x20, 0x5d, 0xe0, 0xd2, 0x07, 0xe8, 0xd1, 0xd3, 0xde, 0x74, 0x65, 0xbb, 0x80, 0x0f, 0x0f, + 0xac, 0x0d, 0x21, 0x53, 0x78, 0xda, 0xc6, 0xe8, 0x78, 0xfc, 0x1f, 0x09, 0x62, 0x6b, 0x86, 0xd1, + 0x40, 0x06, 0x4c, 0xea, 0x86, 0x53, 0x21, 0x96, 0x85, 0x6b, 0xfe, 0x1b, 0xf8, 0xc9, 0xc2, 0xc2, + 0xfe, 0x94, 0xf4, 0xfd, 0x1b, 0xb3, 0xed, 0xac, 0x94, 0x09, 0xdd, 0x70, 0x0a, 0x14, 0xc2, 0x2f, + 0xe1, 0xbf, 0x13, 0xc6, 0x82, 0x8d, 0x31, 0x2f, 0xf9, 0xcc, 0xbe, 0x1b, 0x0b, 0xb2, 0xb9, 0x79, + 0x63, 0x76, 0xda, 0x9b, 0x31, 0x2e, 0x58, 0x56, 0x52, 0x9b, 0xbe, 0xd6, 0xd9, 0x45, 0xb5, 0x1f, + 0xbe, 0x3a, 0x2b, 0x9d, 0xfa, 0x92, 0x04, 0xe0, 0xed, 0xa1, 0xa0, 0x07, 0xe0, 0x48, 0x61, 0x75, + 0xa5, 0x58, 0x59, 0xdf, 0xc8, 0x6f, 0x5c, 0x5e, 0x0f, 0xde, 0x56, 0x17, 0x1b, 0xfd, 0xb6, 0x89, + 0xab, 0xda, 0x96, 0x86, 0x6b, 0xe8, 0x1e, 0x98, 0x0e, 0x62, 0x93, 0x52, 0xa9, 0x98, 0x96, 0xb2, + 0xa9, 0x97, 0xaf, 0xcf, 0x25, 0x58, 0xa6, 0x88, 0x6b, 0xe8, 0x24, 0x1c, 0x6a, 0xc7, 0x2b, 0xaf, + 0x2c, 0xa6, 0x23, 0xd9, 0xb1, 0x97, 0xaf, 0xcf, 0x25, 0xdd, 0x94, 0x12, 0xc9, 0x80, 0xfc, 0x98, + 0x9c, 0x5f, 0x34, 0x0b, 0x2f, 0x5f, 0x9f, 0x1b, 0x66, 0x0a, 0xcc, 0xc6, 0x3e, 0xf0, 0xe9, 0x99, + 0xa1, 0x5b, 0x7e, 0xa7, 0xfd, 0x8f, 0x47, 0xba, 0xee, 0xdf, 0xd7, 0xb1, 0x8e, 0x6d, 0xcd, 0x3e, + 0xd0, 0xfe, 0xfd, 0x40, 0x67, 0x02, 0xf2, 0xef, 0xc5, 0x21, 0xb5, 0xc8, 0x5a, 0x21, 0x03, 0x81, + 0xd1, 0xcf, 0xc1, 0xb0, 0x49, 0xc3, 0x88, 0x7b, 0x20, 0xd8, 0xc5, 0xe0, 0x59, 0xb0, 0x71, 0x6f, + 0xa5, 0xb1, 0xd0, 0x63, 0xf3, 0x6b, 0x29, 0xec, 0xb6, 0x9c, 0x77, 0xff, 0x2b, 0xb5, 0xaf, 0x9d, + 0x2b, 0x96, 0x02, 0xf1, 0x4d, 0xa2, 0x30, 0x3f, 0x99, 0xdd, 0x70, 0xd9, 0x20, 0x10, 0x76, 0xcf, + 0xed, 0x7d, 0x12, 0x1c, 0xa2, 0x58, 0x5e, 0x20, 0xa6, 0x98, 0x62, 0x29, 0x72, 0xaa, 0x5b, 0x17, + 0x96, 0x54, 0xdb, 0xbb, 0xb5, 0xc2, 0x6e, 0xa6, 0xdd, 0xc5, 0x03, 0xe1, 0x71, 0x5f, 0xe3, 0x61, + 0xb6, 0xb2, 0x32, 0xd5, 0x68, 0xa3, 0xb4, 0xd1, 0x62, 0xe0, 0x6a, 0x62, 0x6c, 0x7f, 0x87, 0x06, + 0xfe, 0x6b, 0x8a, 0x4f, 0xc1, 0xa8, 0xe7, 0x4b, 0x6c, 0xfe, 0x1f, 0x6c, 0x06, 0x8f, 0x1d, 0x7e, + 0x62, 0xf4, 0x7e, 0x09, 0x0e, 0x79, 0xd1, 0xdc, 0xcf, 0x96, 0xfd, 0xa7, 0x9f, 0xfb, 0xf7, 0xb1, + 0x4c, 0x0b, 0x2b, 0xa7, 0x23, 0x5f, 0x59, 0x99, 0x6e, 0xb5, 0x93, 0x92, 0x05, 0xe2, 0x98, 0xdf, + 0xb3, 0xda, 0x19, 0xf1, 0x31, 0xcb, 0xc1, 0x5d, 0x73, 0x90, 0x01, 0xfb, 0xef, 0x23, 0xa6, 0x61, + 0x39, 0xb8, 0x46, 0xb7, 0x16, 0x13, 0x8a, 0x5b, 0x96, 0x57, 0x00, 0xb5, 0x0f, 0x6e, 0xf8, 0x2a, + 0xa6, 0xf7, 0xd2, 0x06, 0x4d, 0x43, 0xdc, 0x7f, 0x59, 0x91, 0x15, 0x72, 0x89, 0x0f, 0xf0, 0xf0, + 0x79, 0xcb, 0xe7, 0xfc, 0x77, 0x22, 0x70, 0xca, 0x7f, 0xd0, 0xf5, 0x42, 0x0b, 0x5b, 0x7b, 0xee, + 0x14, 0x35, 0xd5, 0xba, 0xa6, 0xfb, 0xdf, 0x73, 0x1c, 0xf5, 0x07, 0x7c, 0x8a, 0x2b, 0xf4, 0x24, + 0x7f, 0x40, 0x82, 0xd1, 0x35, 0xb5, 0x8e, 0x15, 0xfc, 0x42, 0x0b, 0xdb, 0x4e, 0x87, 0xfb, 0xf2, + 0x87, 0x61, 0xd8, 0xd8, 0xda, 0x12, 0xa7, 0xf3, 0x31, 0x85, 0x97, 0x48, 0x9f, 0x1b, 0x5a, 0x53, + 0x63, 0x17, 0xdb, 0x62, 0x0a, 0x2b, 0xa0, 0x59, 0x18, 0xad, 0x1a, 0x2d, 0x9d, 0x4f, 0xb9, 0x4c, + 0x4c, 0x7c, 0x35, 0xa6, 0xa5, 0xb3, 0x29, 0x47, 0x94, 0x68, 0xe1, 0xab, 0xd8, 0xb2, 0xd9, 0x77, + 0x32, 0x13, 0x8a, 0x28, 0xca, 0x4f, 0x42, 0x8a, 0x49, 0xc2, 0x83, 0xf1, 0x51, 0x48, 0xd0, 0x3b, + 0x63, 0x9e, 0x3c, 0x23, 0xa4, 0x7c, 0x89, 0xdd, 0xba, 0x67, 0xfc, 0x99, 0x48, 0xac, 0x50, 0x28, + 0x74, 0xd5, 0xf2, 0xc9, 0xfe, 0x5e, 0x83, 0xe9, 0xd0, 0xd5, 0xf0, 0x6f, 0xc5, 0xe1, 0x10, 0x3f, + 0x86, 0x54, 0x4d, 0xed, 0xf4, 0xb6, 0xe3, 0x88, 0x57, 0x20, 0xc0, 0xb3, 0x60, 0xd5, 0xd4, 0xe4, + 0x3d, 0x88, 0x5d, 0x74, 0x1c, 0x13, 0x9d, 0x82, 0xb8, 0xd5, 0x6a, 0x60, 0xb1, 0x55, 0xe5, 0x1e, + 0x3c, 0xa8, 0xa6, 0x36, 0x4f, 0x10, 0x94, 0x56, 0x03, 0x2b, 0x0c, 0x05, 0x95, 0x60, 0x76, 0xab, + 0xd5, 0x68, 0xec, 0x55, 0x6a, 0x98, 0xfe, 0xe3, 0x2f, 0xf7, 0x5f, 0x67, 0xe0, 0x5d, 0x53, 0x15, + 0x1f, 0xe0, 0x24, 0x8a, 0x39, 0x4e, 0xd1, 0x8a, 0x14, 0x4b, 0xfc, 0xdb, 0x8c, 0x92, 0xc0, 0x91, + 0x7f, 0x3f, 0x02, 0x09, 0xc1, 0x9a, 0x5e, 0x83, 0xc7, 0x0d, 0x5c, 0x75, 0x0c, 0x71, 0x2c, 0xe4, + 0x96, 0x11, 0x82, 0x68, 0x9d, 0x0f, 0x5e, 0xf2, 0xe2, 0x90, 0x42, 0x0a, 0x04, 0xe6, 0x3e, 0x4e, + 0x20, 0x30, 0xb3, 0x45, 0xc6, 0x33, 0x66, 0x1a, 0x62, 0x11, 0x78, 0x71, 0x48, 0xa1, 0x25, 0x94, + 0x81, 0x61, 0x32, 0x69, 0x1c, 0x36, 0x5a, 0x04, 0xce, 0xcb, 0xe8, 0x30, 0xc4, 0x4d, 0xd5, 0xa9, + 0xb2, 0x7b, 0x83, 0xa4, 0x82, 0x15, 0xd1, 0x63, 0x30, 0xcc, 0xde, 0x97, 0x87, 0xff, 0xab, 0x0e, + 0x51, 0x06, 0xfb, 0x90, 0x1f, 0x91, 0x7b, 0x4d, 0x75, 0x1c, 0x6c, 0xe9, 0x84, 0x21, 0x43, 0x47, + 0x08, 0x62, 0x9b, 0x46, 0x6d, 0x8f, 0xff, 0xa7, 0x1f, 0xfa, 0x9b, 0xff, 0x6b, 0x11, 0x6a, 0x0f, + 0x15, 0x5a, 0xc9, 0xfe, 0xc1, 0x59, 0x4a, 0x00, 0x0b, 0x04, 0xa9, 0x04, 0x53, 0x6a, 0xad, 0xa6, + 0xb1, 0x7f, 0xba, 0x53, 0xd9, 0xd4, 0xa8, 0xf3, 0xb0, 0xe9, 0xbf, 0xaf, 0xeb, 0x36, 0x16, 0xc8, + 0x23, 0x28, 0x70, 0xfc, 0x42, 0x12, 0x46, 0x4c, 0x26, 0x94, 0x7c, 0x1e, 0x26, 0xdb, 0x24, 0x25, + 0xf2, 0xed, 0x68, 0x7a, 0x4d, 0xbc, 0xd8, 0x20, 0xbf, 0x09, 0x8c, 0x7e, 0x7a, 0x93, 0x1d, 0xb8, + 0xd1, 0xdf, 0x85, 0xf7, 0x74, 0x7f, 0xd8, 0x33, 0xee, 0x7b, 0xd8, 0xa3, 0x9a, 0x5a, 0x21, 0x49, + 0xf9, 0xf3, 0xe7, 0x3c, 0xf9, 0xf6, 0xe7, 0x3c, 0x75, 0xac, 0x8b, 0xc0, 0x4c, 0xaa, 0x54, 0x53, + 0xb3, 0xa9, 0x39, 0x7a, 0x9f, 0x02, 0xb5, 0xcf, 0xfb, 0x7e, 0xd3, 0xd7, 0x3d, 0xb1, 0xc5, 0xfc, + 0x5a, 0xd9, 0xb5, 0xe3, 0xaf, 0x44, 0xe0, 0xb8, 0xcf, 0x8e, 0x7d, 0xc8, 0xed, 0xe6, 0x9c, 0xed, + 0x6c, 0xf1, 0x03, 0xbc, 0xb2, 0xbe, 0x04, 0x31, 0x82, 0x8f, 0xfa, 0xfc, 0xe3, 0x8f, 0xcc, 0xe7, + 0xbe, 0xfe, 0x8f, 0xe5, 0xe0, 0xd1, 0x5c, 0x60, 0x54, 0x28, 0x93, 0xc2, 0xfb, 0x07, 0xd7, 0x5f, + 0xda, 0xfb, 0x0a, 0xaa, 0x7d, 0xeb, 0xd4, 0x18, 0xd6, 0xe1, 0xf7, 0xce, 0x76, 0x7d, 0x85, 0xcb, + 0x9c, 0x69, 0xef, 0xfc, 0x6a, 0x1f, 0x9e, 0xba, 0xdb, 0x23, 0x87, 0x5e, 0x23, 0x38, 0x60, 0xa6, + 0xb6, 0x0b, 0x87, 0x9f, 0x26, 0x6d, 0x7b, 0x2b, 0x68, 0xe1, 0xf2, 0x0f, 0xbb, 0x47, 0x96, 0x12, + 0xff, 0xef, 0x81, 0xe2, 0x38, 0x12, 0x3c, 0xf9, 0xf8, 0xda, 0xf1, 0x9e, 0xf9, 0xae, 0xa1, 0x64, + 0xde, 0x17, 0x46, 0x14, 0x1f, 0xa5, 0xfc, 0xab, 0x12, 0x1c, 0x69, 0x6b, 0x9a, 0xfb, 0xf8, 0xc5, + 0x0e, 0xef, 0x31, 0x0e, 0x94, 0xf4, 0x2c, 0x76, 0x10, 0xf6, 0xde, 0xbe, 0xc2, 0x32, 0x29, 0x02, + 0xd2, 0xbe, 0x19, 0x0e, 0x05, 0x85, 0x15, 0x6a, 0xba, 0x1b, 0xc6, 0x83, 0x5b, 0xd9, 0x5c, 0x5d, + 0x63, 0x81, 0xcd, 0x6c, 0xb9, 0x12, 0xd6, 0xb3, 0xdb, 0xd7, 0x12, 0x24, 0x5d, 0x54, 0x9e, 0x1d, + 0x0f, 0xdc, 0x55, 0x8f, 0x52, 0xfe, 0xb0, 0x04, 0x73, 0xc1, 0x16, 0x7c, 0x79, 0xd2, 0xfe, 0x84, + 0xbd, 0x65, 0x43, 0xfc, 0xba, 0x04, 0x77, 0xf4, 0x90, 0x89, 0x2b, 0xe0, 0x45, 0x98, 0xf6, 0x6d, + 0x12, 0x08, 0x17, 0x2e, 0x86, 0xfd, 0x54, 0xff, 0x0c, 0xd5, 0x5d, 0x13, 0x1f, 0x23, 0x4a, 0xf9, + 0xec, 0x77, 0x66, 0xa7, 0xda, 0xeb, 0x6c, 0x65, 0xaa, 0x7d, 0x61, 0x7f, 0x0b, 0xed, 0xe3, 0x15, + 0x09, 0xee, 0x0b, 0x76, 0xb5, 0x43, 0xaa, 0xfb, 0xd3, 0x1a, 0x87, 0x7f, 0x27, 0xc1, 0xa9, 0x41, + 0x84, 0xe3, 0x03, 0xb2, 0x09, 0x53, 0x5e, 0x12, 0x1e, 0x1e, 0x8f, 0x7d, 0xa5, 0xf6, 0xcc, 0x4a, + 0x91, 0xcb, 0xed, 0x36, 0x28, 0xde, 0xe4, 0x13, 0xcb, 0x3f, 0xe4, 0xae, 0x92, 0x83, 0x1b, 0xbd, + 0x42, 0xc9, 0x81, 0xad, 0xde, 0x0e, 0x63, 0x11, 0xe9, 0x30, 0x16, 0x5e, 0xd6, 0x2e, 0x5f, 0xe5, + 0x7e, 0xab, 0xc3, 0xf6, 0xdc, 0xdb, 0x60, 0xaa, 0x83, 0x29, 0xf3, 0x59, 0xbd, 0x0f, 0x4b, 0x56, + 0x50, 0xbb, 0xb1, 0xca, 0x7b, 0x30, 0x4b, 0xdb, 0xed, 0xa0, 0xe8, 0xdb, 0xdd, 0xe5, 0x26, 0xf7, + 0x2d, 0x1d, 0x9b, 0xe6, 0x7d, 0x2f, 0xc3, 0x30, 0x1b, 0x67, 0xde, 0xdd, 0x03, 0x18, 0x0a, 0x67, + 0x20, 0x7f, 0x5c, 0xf8, 0xb2, 0xa2, 0x10, 0xbb, 0xf3, 0x1c, 0x1a, 0xa4, 0xaf, 0xb7, 0x68, 0x0e, + 0xf9, 0x94, 0xf1, 0x4d, 0xe1, 0xd5, 0x3a, 0x4b, 0xc7, 0xd5, 0x51, 0xbd, 0x65, 0x5e, 0x8d, 0xe9, + 0xe6, 0xf6, 0xba, 0xaf, 0x5f, 0x16, 0xee, 0xcb, 0xed, 0x53, 0x1f, 0xf7, 0xf5, 0xd3, 0x51, 0xbd, + 0xeb, 0xc8, 0xfa, 0x88, 0xf9, 0xa7, 0xd1, 0x91, 0xfd, 0x50, 0x82, 0xa3, 0xb4, 0x6f, 0xfe, 0x3d, + 0x8a, 0xfd, 0xaa, 0xfc, 0x01, 0x40, 0xb6, 0x55, 0xad, 0x74, 0x9c, 0xdd, 0x69, 0xdb, 0xaa, 0x5e, + 0x09, 0xc4, 0x97, 0x07, 0x00, 0xd5, 0x02, 0x3b, 0x51, 0x14, 0x9b, 0x5d, 0x05, 0x4c, 0xd7, 0x7c, + 0x1b, 0x1d, 0x1d, 0x86, 0x33, 0x76, 0x0b, 0x86, 0xf3, 0x1b, 0x12, 0x64, 0x3b, 0x75, 0x99, 0x0f, + 0x9f, 0x06, 0x87, 0x03, 0xe7, 0x07, 0xe1, 0x11, 0x7c, 0x60, 0x90, 0x5d, 0x9e, 0xd0, 0x34, 0x3a, + 0x64, 0xe1, 0xdb, 0x9d, 0x07, 0xcc, 0x06, 0x2d, 0xb4, 0x3d, 0xb3, 0xfe, 0xa9, 0x4d, 0x9f, 0x2f, + 0xb6, 0xf9, 0xd5, 0x3f, 0x15, 0xb9, 0xf7, 0x2e, 0xcc, 0x74, 0x91, 0xfa, 0x76, 0xc7, 0xbd, 0xed, + 0xae, 0x83, 0x79, 0xab, 0xd3, 0xf7, 0x47, 0xf9, 0x4c, 0x08, 0x5e, 0x33, 0xf7, 0xad, 0xc5, 0x3a, + 0xbd, 0x53, 0x93, 0xdf, 0x0a, 0xc7, 0x3a, 0x52, 0x71, 0xd9, 0x72, 0x10, 0xdb, 0xd6, 0x6c, 0x87, + 0x8b, 0x75, 0x4f, 0x37, 0xb1, 0x42, 0xd4, 0x94, 0x46, 0x46, 0x90, 0xa6, 0xac, 0xd7, 0x0c, 0xa3, + 0xc1, 0xc5, 0x90, 0x2f, 0xc1, 0xa4, 0x0f, 0xc6, 0x1b, 0x39, 0x07, 0x31, 0xd3, 0xe0, 0xdf, 0x60, + 0x18, 0x3d, 0x73, 0xbc, 0xeb, 0xc6, 0xbe, 0x61, 0x34, 0x78, 0xb7, 0x29, 0xbe, 0x3c, 0x0d, 0x88, + 0x31, 0xa3, 0x7b, 0xfc, 0xa2, 0x89, 0x75, 0x98, 0x0a, 0x40, 0x79, 0x23, 0x6f, 0xe8, 0xfc, 0xe0, + 0xcc, 0xf7, 0x0f, 0x41, 0x9c, 0x72, 0x45, 0x1f, 0x93, 0x02, 0x1f, 0x49, 0x9a, 0xef, 0xc6, 0xa6, + 0xf3, 0x9a, 0x38, 0x7b, 0x7a, 0x60, 0x7c, 0x9e, 0xb3, 0x9d, 0x7a, 0xcf, 0xbf, 0xfe, 0xde, 0x47, + 0x22, 0x77, 0x21, 0xf9, 0x74, 0x97, 0xd5, 0xb8, 0x6f, 0xbe, 0x7c, 0x26, 0xf0, 0xc0, 0xff, 0xc1, + 0xc1, 0x9a, 0x12, 0x92, 0xcd, 0x0f, 0x8a, 0xce, 0x05, 0x3b, 0x4f, 0x05, 0x3b, 0x8b, 0x1e, 0xe9, + 0x2f, 0xd8, 0xe9, 0x77, 0x04, 0x27, 0xcd, 0xbb, 0xd0, 0xef, 0x49, 0x30, 0xdd, 0x69, 0x49, 0x87, + 0x1e, 0x1f, 0x4c, 0x8a, 0xf6, 0x94, 0x22, 0xfb, 0xc4, 0x01, 0x28, 0x79, 0x57, 0x16, 0x69, 0x57, + 0xf2, 0xe8, 0xc9, 0x03, 0x74, 0xe5, 0xb4, 0x7f, 0xeb, 0xff, 0x7f, 0x49, 0x70, 0xa2, 0xe7, 0x0a, + 0x09, 0xe5, 0x07, 0x93, 0xb2, 0x47, 0xee, 0x94, 0x2d, 0xbc, 0x11, 0x16, 0xbc, 0xc7, 0x4f, 0xd3, + 0x1e, 0x5f, 0x42, 0xe5, 0x83, 0xf4, 0xb8, 0xe3, 0xf9, 0x0a, 0xfa, 0xed, 0xe0, 0x95, 0xc8, 0xde, + 0xe6, 0xd4, 0xb6, 0xf0, 0xe8, 0x33, 0x31, 0xda, 0x93, 0x5a, 0xf9, 0x59, 0xda, 0x05, 0x05, 0xad, + 0xbd, 0xc1, 0x41, 0x3b, 0xfd, 0x8e, 0xa0, 0xe3, 0x7f, 0x17, 0xfa, 0x9f, 0x52, 0xe7, 0x1b, 0x8e, + 0x8f, 0xf5, 0x14, 0xb1, 0xfb, 0xa2, 0x2a, 0xfb, 0xf8, 0xfe, 0x09, 0x79, 0x27, 0x9b, 0xb4, 0x93, + 0x75, 0x84, 0x6f, 0x75, 0x27, 0x3b, 0x0e, 0x22, 0xfa, 0x9a, 0x04, 0xd3, 0x9d, 0xd6, 0x24, 0x7d, + 0xa6, 0x65, 0x8f, 0x45, 0x56, 0x9f, 0x69, 0xd9, 0x6b, 0x01, 0x24, 0xff, 0x1c, 0xed, 0xfc, 0x39, + 0xf4, 0x68, 0xb7, 0xce, 0xf7, 0x1c, 0x45, 0x32, 0x17, 0x7b, 0x26, 0xf9, 0x7d, 0xe6, 0xe2, 0x20, + 0xeb, 0x98, 0x3e, 0x73, 0x71, 0xa0, 0x35, 0x46, 0xff, 0xb9, 0xe8, 0xf6, 0x6c, 0xc0, 0x61, 0xb4, + 0xd1, 0x57, 0x24, 0x18, 0x0b, 0x64, 0xc4, 0xe8, 0xe1, 0x9e, 0x82, 0x76, 0x5a, 0x30, 0x64, 0xcf, + 0xec, 0x87, 0x84, 0xf7, 0xa5, 0x4c, 0xfb, 0xb2, 0x80, 0xf2, 0x07, 0xe9, 0x4b, 0xf0, 0x18, 0xf5, + 0x1b, 0x12, 0x4c, 0x75, 0xc8, 0x32, 0xfb, 0xcc, 0xc2, 0xee, 0x49, 0x73, 0xf6, 0xf1, 0xfd, 0x13, + 0xf2, 0x5e, 0x5d, 0xa0, 0xbd, 0x7a, 0x0b, 0x7a, 0xf3, 0x41, 0x7a, 0xe5, 0x8b, 0xcf, 0x37, 0xbc, + 0x2b, 0x59, 0xbe, 0x76, 0xd0, 0xb9, 0x7d, 0x0a, 0x26, 0x3a, 0xf4, 0xd8, 0xbe, 0xe9, 0x78, 0x7f, + 0x9e, 0xa1, 0xfd, 0x79, 0x1a, 0xad, 0xbe, 0xb1, 0xfe, 0xb4, 0x87, 0xf5, 0x2f, 0xb4, 0x3f, 0x73, + 0xec, 0x6d, 0x45, 0x1d, 0x93, 0xd5, 0xec, 0x23, 0xfb, 0xa2, 0xe1, 0x9d, 0x7a, 0x9c, 0x76, 0xea, + 0x0c, 0x7a, 0xa8, 0x5b, 0xa7, 0x7c, 0xf7, 0xee, 0x34, 0x7d, 0xcb, 0x38, 0xfd, 0x0e, 0x96, 0x02, + 0xbf, 0x0b, 0xbd, 0x5b, 0xdc, 0x79, 0x3a, 0xd9, 0xb3, 0x5d, 0x5f, 0x1e, 0x9b, 0xbd, 0x6f, 0x00, + 0x4c, 0x2e, 0xd7, 0x5d, 0x54, 0xae, 0x19, 0x74, 0xbc, 0x9b, 0x5c, 0x24, 0x97, 0x45, 0x1f, 0x94, + 0xdc, 0x6b, 0x92, 0xa7, 0x7a, 0xf3, 0xf6, 0x27, 0xbb, 0xd9, 0xfb, 0x07, 0xc2, 0xe5, 0x92, 0xdc, + 0x43, 0x25, 0x99, 0x43, 0x33, 0x5d, 0x25, 0x61, 0xa9, 0xef, 0xad, 0xbe, 0x54, 0xf0, 0xf2, 0x11, + 0x98, 0xed, 0xd2, 0xa2, 0xb3, 0xdb, 0xe7, 0x8c, 0xab, 0xc7, 0x6b, 0xdf, 0xbe, 0xaf, 0x79, 0x6f, + 0xf5, 0x57, 0x6a, 0x07, 0x3c, 0x10, 0xfb, 0x9d, 0x18, 0xa0, 0x65, 0xbb, 0xbe, 0x60, 0x61, 0xf6, + 0x1f, 0x33, 0xf9, 0x2c, 0x0f, 0x3d, 0x63, 0x93, 0xde, 0xd0, 0x33, 0xb6, 0xe5, 0xc0, 0xc3, 0xb0, + 0xc8, 0xfe, 0x1e, 0x9f, 0x0e, 0xfc, 0x3a, 0x2c, 0xfa, 0x93, 0x79, 0x1d, 0xd6, 0xf1, 0xca, 0x75, + 0xec, 0xd6, 0xbd, 0x1c, 0x89, 0x1f, 0xf4, 0xf5, 0x0c, 0x7f, 0xf4, 0x39, 0xdc, 0xe3, 0xd1, 0x67, + 0xa6, 0xeb, 0xcb, 0x4e, 0x4e, 0x8d, 0xce, 0x8a, 0x6f, 0xb6, 0x8e, 0x0c, 0x76, 0x49, 0x96, 0x7f, + 0xd4, 0xd5, 0xdb, 0x42, 0x38, 0x0e, 0xd9, 0x76, 0x73, 0x72, 0x27, 0xf5, 0x47, 0xa2, 0x90, 0x5e, + 0xb6, 0xeb, 0xa5, 0x9a, 0xe6, 0xdc, 0x26, 0x5b, 0x7b, 0xb2, 0xfb, 0x6b, 0x1c, 0x74, 0xf3, 0xc6, + 0xec, 0x38, 0xd3, 0x69, 0x0f, 0x4d, 0x36, 0x61, 0x22, 0xf4, 0x5e, 0x9a, 0x5b, 0x56, 0xf1, 0x20, + 0xcf, 0xb6, 0x43, 0xac, 0x64, 0xfa, 0xda, 0xc1, 0x67, 0xdf, 0x68, 0xb7, 0xb3, 0x31, 0x33, 0x83, + 0xba, 0x78, 0x1b, 0x0d, 0xd9, 0x37, 0x66, 0x59, 0xc8, 0x84, 0x07, 0xc5, 0x1d, 0xb1, 0x3f, 0x94, + 0x60, 0x74, 0xd9, 0x16, 0xa9, 0x20, 0xfe, 0x19, 0x7d, 0x38, 0xf5, 0x98, 0xfb, 0xc1, 0xf3, 0xe8, + 0x60, 0x76, 0x2b, 0x3e, 0x82, 0xee, 0x29, 0xe1, 0x10, 0x4c, 0xf9, 0xfa, 0xe9, 0xf6, 0xff, 0x77, + 0x23, 0xd4, 0x3f, 0x16, 0x70, 0x5d, 0xd3, 0xdd, 0x2c, 0x12, 0xff, 0x59, 0x7d, 0x78, 0xe1, 0xe9, + 0x39, 0x76, 0x50, 0x3d, 0xef, 0x50, 0x07, 0x11, 0xd2, 0xa7, 0xbb, 0xf1, 0xb5, 0xdc, 0xfe, 0xca, + 0x48, 0xda, 0xc7, 0xb7, 0x83, 0x42, 0x6f, 0x89, 0xe4, 0xd7, 0x25, 0x18, 0x5b, 0xb6, 0xeb, 0x97, + 0xf5, 0xda, 0xff, 0xf3, 0xf6, 0xbb, 0x05, 0x87, 0x02, 0x3d, 0xbd, 0x4d, 0x2a, 0x3d, 0xf3, 0x4a, + 0x0c, 0xa2, 0xcb, 0x76, 0x1d, 0xbd, 0x00, 0x13, 0xe1, 0xa4, 0xa1, 0x6b, 0x2e, 0xd8, 0x1e, 0x11, + 0xba, 0xaf, 0xd7, 0xba, 0x47, 0x0f, 0xb4, 0x03, 0x63, 0xc1, 0xc8, 0x71, 0xb2, 0x07, 0x93, 0x00, + 0x66, 0xf6, 0xa1, 0x41, 0x31, 0xdd, 0xc6, 0xde, 0x0e, 0x09, 0xd7, 0xe9, 0xdd, 0xd9, 0x83, 0x5a, + 0x20, 0x75, 0xcf, 0x6e, 0x3b, 0xb8, 0x15, 0xa2, 0xbd, 0xb0, 0x4b, 0xe9, 0xa5, 0xbd, 0x10, 0x6e, + 0x4f, 0xed, 0x75, 0x9b, 0x5a, 0x9b, 0x00, 0xbe, 0x79, 0x70, 0x77, 0x0f, 0x0e, 0x1e, 0x5a, 0xf6, + 0xc1, 0x81, 0xd0, 0xdc, 0x43, 0xa7, 0x5b, 0x9c, 0x8c, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb0, 0xeb, 0x2a, 0x5a, 0xa7, 0x98, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2037,10 +2059,10 @@ func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { if !this.Balance.Equal(that1.Balance) { return false } - if this.Id != that1.Id { + if this.UnbondingId != that1.UnbondingId { return false } - if this.OnHold != that1.OnHold { + if this.UnbondingOnHold != that1.UnbondingOnHold { return false } return true @@ -2076,6 +2098,12 @@ func (this *RedelegationEntry) Equal(that interface{}) bool { if !this.SharesDst.Equal(that1.SharesDst) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHold != that1.UnbondingOnHold { + return false + } return true } func (this *Params) Equal(that interface{}) bool { @@ -2387,6 +2415,16 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.UnbondingOnHold { + i-- + if m.UnbondingOnHold { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } { size := m.MinSelfDelegation.Size() i -= size @@ -2792,9 +2830,9 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l - if m.OnHold { + if m.UnbondingOnHold { i-- - if m.OnHold { + if m.UnbondingOnHold { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -2802,8 +2840,8 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error i-- dAtA[i] = 0x30 } - if m.Id != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.Id)) + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) i-- dAtA[i] = 0x28 } @@ -2863,6 +2901,21 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.UnbondingOnHold { + i-- + if m.UnbondingOnHold { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.SharesDst.Size() i -= size @@ -3306,6 +3359,9 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.MinSelfDelegation.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingOnHold { + n += 2 + } return n } @@ -3449,10 +3505,10 @@ func (m *UnbondingDelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.Balance.Size() n += 1 + l + sovStaking(uint64(l)) - if m.Id != 0 { - n += 1 + sovStaking(uint64(m.Id)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) } - if m.OnHold { + if m.UnbondingOnHold { n += 2 } return n @@ -3473,6 +3529,12 @@ func (m *RedelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.SharesDst.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHold { + n += 2 + } return n } @@ -4558,6 +4620,26 @@ func (m *Validator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHold", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingOnHold = bool(v != 0) default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5536,9 +5618,9 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) } - m.Id = 0 + m.UnbondingId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowStaking @@ -5548,14 +5630,14 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Id |= uint64(b&0x7F) << shift + m.UnbondingId |= uint64(b&0x7F) << shift if b < 0x80 { break } } case 6: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OnHold", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHold", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -5572,7 +5654,7 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { break } } - m.OnHold = bool(v != 0) + m.UnbondingOnHold = bool(v != 0) default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5743,6 +5825,45 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHold", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingOnHold = bool(v != 0) default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index ed394acf4969..8dd718c5a5f9 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -177,6 +177,11 @@ func (v Validator) IsUnbonding() bool { return v.GetStatus() == Unbonding } +// IsMature - is the current validator ready to unbond their coins +func (v Validator) IsMature(currentTime time.Time, currentHeight int64) bool { + return v.UnbondingHeight < currentHeight && v.UnbondingTime.Before(currentTime) +} + // constant used in flags to indicate that description field should not be updated const DoNotModifyDesc = "[do-not-modify]"