Repository: lightningnetwork/lnd
Pull request #3665 (2019-11-01 13:12:01)

cnct: add resolver constructors
This PR makes the instantiation of resolvers stricter and thereby opens up the path to also add initialization logic to a resolver.

Spin off of #3644

joostjager: Now the resolvers are really ready to get their reports initialized in their (new or decode) constructors

Patch:
diff --git a/autopilot/graph.go b/autopilot/graph.go
index f02d0a8e6..413aaf137 100644
--- a/autopilot/graph.go
+++ b/autopilot/graph.go
@@ -157,9 +157,8 @@ func (d *databaseChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
 							IP: bytes.Repeat([]byte("a"), 16),
 						},
 					},
-					Features: lnwire.NewFeatureVector(
-						nil, lnwire.Features,
-					),
+					Features: lnwire.NewFeatureVector(nil,
+						lnwire.GlobalFeatures),
 					AuthSigBytes: testSig.Serialize(),
 				}
 				graphNode.AddPubKey(pub)
@@ -184,9 +183,7 @@ func (d *databaseChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
 					IP: bytes.Repeat([]byte("a"), 16),
 				},
 			},
-			Features: lnwire.NewFeatureVector(
-				nil, lnwire.Features,
-			),
+			Features:     lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures),
 			AuthSigBytes: testSig.Serialize(),
 		}
 		dbNode.AddPubKey(nodeKey)
@@ -290,9 +287,7 @@ func (d *databaseChannelGraph) addRandNode() (*btcec.PublicKey, error) {
 				IP: bytes.Repeat([]byte("a"), 16),
 			},
 		},
-		Features: lnwire.NewFeatureVector(
-			nil, lnwire.Features,
-		),
+		Features:     lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures),
 		AuthSigBytes: testSig.Serialize(),
 	}
 	dbNode.AddPubKey(nodeKey)
diff --git a/channeldb/graph.go b/channeldb/graph.go
index 275d6858b..46ba13111 100644
--- a/channeldb/graph.go
+++ b/channeldb/graph.go
@@ -3506,7 +3506,7 @@ func deserializeLightningNode(r io.Reader) (LightningNode, error) {
 		return LightningNode{}, err
 	}
 
-	fv := lnwire.NewFeatureVector(nil, lnwire.Features)
+	fv := lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures)
 	err = fv.Decode(r)
 	if err != nil {
 		return LightningNode{}, err
diff --git a/channeldb/migration_01_to_11/graph.go b/channeldb/migration_01_to_11/graph.go
index a782b9c45..8e8f4a4a1 100644
--- a/channeldb/migration_01_to_11/graph.go
+++ b/channeldb/migration_01_to_11/graph.go
@@ -744,7 +744,7 @@ func deserializeLightningNode(r io.Reader) (LightningNode, error) {
 		return LightningNode{}, err
 	}
 
-	fv := lnwire.NewFeatureVector(nil, nil)
+	fv := lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures)
 	err = fv.Decode(r)
 	if err != nil {
 		return LightningNode{}, err
diff --git a/contractcourt/briefcase.go b/contractcourt/briefcase.go
index 989786f1a..22adcbdc1 100644
--- a/contractcourt/briefcase.go
+++ b/contractcourt/briefcase.go
@@ -440,7 +440,7 @@ func (b *boltArbitratorLog) CommitState(s ArbitratorState) error {
 //
 // NOTE: Part of the ContractResolver interface.
 func (b *boltArbitratorLog) FetchUnresolvedContracts() ([]ContractResolver, error) {
-	resKit := ResolverKit{
+	resolverCfg := ResolverConfig{
 		ChannelArbitratorConfig: b.cfg,
 		Checkpoint:              b.checkpointContract,
 	}
@@ -469,56 +469,38 @@ func (b *boltArbitratorLog) FetchUnresolvedContracts() ([]ContractResolver, erro
 
 			switch resType {
 			case resolverTimeout:
-				timeoutRes := &htlcTimeoutResolver{}
-				if err := timeoutRes.Decode(resReader); err != nil {
-					return err
-				}
-				timeoutRes.AttachResolverKit(resKit)
-
-				res = timeoutRes
+				res, err = newTimeoutResolverFromReader(
+					resReader, resolverCfg,
+				)
 
 			case resolverSuccess:
-				successRes := &htlcSuccessResolver{}
-				if err := successRes.Decode(resReader); err != nil {
-					return err
-				}
-
-				res = successRes
+				res, err = newSuccessResolverFromReader(
+					resReader, resolverCfg,
+				)
 
 			case resolverOutgoingContest:
-				outContestRes := &htlcOutgoingContestResolver{
-					htlcTimeoutResolver: htlcTimeoutResolver{},
-				}
-				if err := outContestRes.Decode(resReader); err != nil {
-					return err
-				}
-
-				res = outContestRes
+				res, err = newOutgoingContestResolverFromReader(
+					resReader, resolverCfg,
+				)
 
 			case resolverIncomingContest:
-				inContestRes := &htlcIncomingContestResolver{
-					htlcSuccessResolver: htlcSuccessResolver{},
-				}
-				if err := inContestRes.Decode(resReader); err != nil {
-					return err
-				}
-
-				res = inContestRes
+				res, err = newIncomingContestResolverFromReader(
+					resReader, resolverCfg,
+				)
 
 			case resolverUnilateralSweep:
-				sweepRes := &commitSweepResolver{}
-				if err := sweepRes.Decode(resReader); err != nil {
-					return err
-				}
-
-				res = sweepRes
+				res, err = newCommitSweepResolverFromReader(
+					resReader, resolverCfg,
+				)
 
 			default:
 				return fmt.Errorf("unknown resolver type: %v", resType)
 			}
 
-			resKit.Quit = make(chan struct{})
-			res.AttachResolverKit(resKit)
+			if err != nil {
+				return err
+			}
+
 			contracts = append(contracts, res)
 			return nil
 		})
diff --git a/contractcourt/channel_arbitrator.go b/contractcourt/channel_arbitrator.go
index 3bd669027..66730ed11 100644
--- a/contractcourt/channel_arbitrator.go
+++ b/contractcourt/channel_arbitrator.go
@@ -1685,7 +1685,7 @@ func (c *ChannelArbitrator) prepContractResolutions(
 
 	// We'll create the resolver kit that we'll be cloning for each
 	// resolver so they each can do their duty.
-	resKit := ResolverKit{
+	resolverCfg := ResolverConfig{
 		ChannelArbitratorConfig: c.cfg,
 		Checkpoint: func(res ContractResolver) error {
 			return c.log.InsertUnresolvedContracts(res)
@@ -1733,14 +1733,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
 					continue
 				}
 
-				resKit.Quit = make(chan struct{})
-				resolver := &htlcSuccessResolver{
-					htlcResolution:  resolution,
-					broadcastHeight: height,
-					payHash:         htlc.RHash,
-					htlcAmt:         htlc.Amt,
-					ResolverKit:     resKit,
-				}
+				resolver := newSuccessResolver(
+					resolution, height,
+					htlc.RHash, htlc.Amt, resolverCfg,
+				)
 				htlcResolvers = append(htlcResolvers, resolver)
 			}
 
@@ -1761,14 +1757,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
 					continue
 				}
 
-				resKit.Quit = make(chan struct{})
-				resolver := &htlcTimeoutResolver{
-					htlcResolution:  resolution,
-					broadcastHeight: height,
-					htlcIndex:       htlc.HtlcIndex,
-					htlcAmt:         htlc.Amt,
-					ResolverKit:     resKit,
-				}
+				resolver := newTimeoutResolver(
+					resolution, height, htlc.HtlcIndex,
+					htlc.Amt, resolverCfg,
+				)
 				htlcResolvers = append(htlcResolvers, resolver)
 			}
 
@@ -1798,18 +1790,11 @@ func (c *ChannelArbitrator) prepContractResolutions(
 					ChanID: c.cfg.ShortChanID,
 				}
 
-				resKit.Quit = make(chan struct{})
-				resolver := &htlcIncomingContestResolver{
-					htlcExpiry: htlc.RefundTimeout,
-					circuitKey: circuitKey,
-					htlcSuccessResolver: htlcSuccessResolver{
-						htlcResolution:  resolution,
-						broadcastHeight: height,
-						payHash:         htlc.RHash,
-						htlcAmt:         htlc.Amt,
-						ResolverKit:     resKit,
-					},
-				}
+				resolver := newIncomingContestResolver(
+					htlc.RefundTimeout, circuitKey,
+					resolution, height, htlc.RHash,
+					htlc.Amt, resolverCfg,
+				)
 				htlcResolvers = append(htlcResolvers, resolver)
 			}
 
@@ -1831,16 +1816,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
 					continue
 				}
 
-				resKit.Quit = make(chan struct{})
-				resolver := &htlcOutgoingContestResolver{
-					htlcTimeoutResolver: htlcTimeoutResolver{
-						htlcResolution:  resolution,
-						broadcastHeight: height,
-						htlcIndex:       htlc.HtlcIndex,
-						htlcAmt:         htlc.Amt,
-						ResolverKit:     resKit,
-					},
-				}
+				resolver := newOutgoingContestResolver(
+					resolution, height, htlc.HtlcIndex,
+					htlc.Amt, resolverCfg,
+				)
 				htlcResolvers = append(htlcResolvers, resolver)
 			}
 		}
@@ -1850,14 +1829,10 @@ func (c *ChannelArbitrator) prepContractResolutions(
 	// a resolver to sweep our commitment output (but only if it wasn't
 	// trimmed).
 	if contractResolutions.CommitResolution != nil {
-		resKit.Quit = make(chan struct{})
-		resolver := &commitSweepResolver{
-			commitResolution: *contractResolutions.CommitResolution,
-			broadcastHeight:  height,
-			chanPoint:        c.cfg.ChanPoint,
-			ResolverKit:      resKit,
-		}
-
+		resolver := newCommitSweepResolver(
+			*contractResolutions.CommitResolution,
+			height, c.cfg.ChanPoint, resolverCfg,
+		)
 		htlcResolvers = append(htlcResolvers, resolver)
 	}
 
diff --git a/contractcourt/commit_sweep_resolver.go b/contractcourt/commit_sweep_resolver.go
index 4e5712728..3b7f3b855 100644
--- a/contractcourt/commit_sweep_resolver.go
+++ b/contractcourt/commit_sweep_resolver.go
@@ -36,7 +36,20 @@ type commitSweepResolver struct {
 	// chanPoint is the channel point of the original contract.
 	chanPoint wire.OutPoint
 
-	ResolverKit
+	contractResolverKit
+}
+
+// newCommitSweepResolver instantiates a new direct commit output resolver.
+func newCommitSweepResolver(res lnwallet.CommitOutputResolution,
+	broadcastHeight uint32,
+	chanPoint wire.OutPoint, resCfg ResolverConfig) *commitSweepResolver {
+
+	return &commitSweepResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+		commitResolution:    res,
+		broadcastHeight:     broadcastHeight,
+		chanPoint:           chanPoint,
+	}
 }
 
 // ResolverKey returns an identifier which should be globally unique for this
@@ -80,7 +93,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
 			return nil, errResolverShuttingDown
 		}
 
-	case <-c.Quit:
+	case <-c.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -138,7 +151,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
 
 			log.Infof("ChannelPoint(%v) commit tx is fully resolved by "+
 				"sweep tx: %v", c.chanPoint, sweepResult.Tx.TxHash())
-		case <-c.Quit:
+		case <-c.quit:
 			return nil, errResolverShuttingDown
 		}
 
@@ -180,7 +193,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
 			log.Errorf("unable to Checkpoint: %v", err)
 			return nil, err
 		}
-	case <-c.Quit:
+	case <-c.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -206,7 +219,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
 		log.Infof("ChannelPoint(%v) commit tx is fully resolved, at height: %v",
 			c.chanPoint, confInfo.BlockHeight)
 
-	case <-c.Quit:
+	case <-c.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -221,7 +234,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) {
 //
 // NOTE: Part of the ContractResolver interface.
 func (c *commitSweepResolver) Stop() {
-	close(c.Quit)
+	close(c.quit)
 }
 
 // IsResolved returns true if the stored state in the resolve is fully
@@ -262,44 +275,40 @@ func (c *commitSweepResolver) Encode(w io.Writer) error {
 	return nil
 }
 
-// Decode attempts to decode an encoded ContractResolver from the passed Reader
-// instance, returning an active ContractResolver instance.
-//
-// NOTE: Part of the ContractResolver interface.
-func (c *commitSweepResolver) Decode(r io.Reader) error {
+// newCommitSweepResolverFromReader attempts to decode an encoded
+// ContractResolver from the passed Reader instance, returning an active
+// ContractResolver instance.
+func newCommitSweepResolverFromReader(r io.Reader, resCfg ResolverConfig) (
+	*commitSweepResolver, error) {
+
+	c := &commitSweepResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+	}
+
 	if err := decodeCommitResolution(r, &c.commitResolution); err != nil {
-		return err
+		return nil, err
 	}
 
 	if err := binary.Read(r, endian, &c.resolved); err != nil {
-		return err
+		return nil, err
 	}
 	if err := binary.Read(r, endian, &c.broadcastHeight); err != nil {
-		return err
+		return nil, err
 	}
 	_, err := io.ReadFull(r, c.chanPoint.Hash[:])
 	if err != nil {
-		return err
+		return nil, err
 	}
 	err = binary.Read(r, endian, &c.chanPoint.Index)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	// Previously a sweep tx was deserialized at this point. Refactoring
 	// removed this, but keep in mind that this data may still be present in
 	// the database.
 
-	return nil
-}
-
-// AttachResolverKit should be called once a resolved is successfully decoded
-// from its stored format. This struct delivers a generic tool kit that
-// resolvers need to complete their duty.
-//
-// NOTE: Part of the ContractResolver interface.
-func (c *commitSweepResolver) AttachResolverKit(r ResolverKit) {
-	c.ResolverKit = r
+	return c, nil
 }
 
 // A compile time assertion to ensure commitSweepResolver meets the
diff --git a/contractcourt/contract_resolvers.go b/contractcourt/contract_resolvers.go
index b39a04d4a..7248bba05 100644
--- a/contractcourt/contract_resolvers.go
+++ b/contractcourt/contract_resolvers.go
@@ -46,16 +46,6 @@ type ContractResolver interface {
 	// passed Writer.
 	Encode(w io.Writer) error
 
-	// Decode attempts to decode an encoded ContractResolver from the
-	// passed Reader instance, returning an active ContractResolver
-	// instance.
-	Decode(r io.Reader) error
-
-	// AttachResolverKit should be called once a resolved is successfully
-	// decoded from its stored format. This struct delivers a generic tool
-	// kit that resolvers need to complete their duty.
-	AttachResolverKit(ResolverKit)
-
 	// Stop signals the resolver to cancel any current resolution
 	// processes, and suspend.
 	Stop()
@@ -69,10 +59,9 @@ type reportingContractResolver interface {
 	report() *ContractReport
 }
 
-// ResolverKit is meant to be used as a mix-in struct to be embedded within a
-// given ContractResolver implementation. It contains all the items that a
-// resolver requires to carry out its duties.
-type ResolverKit struct {
+// ResolverConfig contains the externally supplied configuration items that are
+// required by a ContractResolver implementation.
+type ResolverConfig struct {
 	// ChannelArbitratorConfig contains all the interfaces and closures
 	// required for the resolver to interact with outside sub-systems.
 	ChannelArbitratorConfig
@@ -81,8 +70,23 @@ type ResolverKit struct {
 	// should write the state of the resolver to persistent storage, and
 	// return a non-nil error upon success.
 	Checkpoint func(ContractResolver) error
+}
+
+// contractResolverKit is meant to be used as a mix-in struct to be embedded within a
+// given ContractResolver implementation. It contains all the common items that
+// a resolver requires to carry out its duties.
+type contractResolverKit struct {
+	ResolverConfig
+
+	quit chan struct{}
+}
 
-	Quit chan struct{}
+// newContractResolverKit instantiates the mix-in struct.
+func newContractResolverKit(cfg ResolverConfig) *contractResolverKit {
+	return &contractResolverKit{
+		ResolverConfig: cfg,
+		quit:           make(chan struct{}),
+	}
 }
 
 var (
diff --git a/contractcourt/htlc_success_resolver.go b/contractcourt/htlc_success_resolver.go
index d1c8716cb..73bf5c5bc 100644
--- a/contractcourt/htlc_success_resolver.go
+++ b/contractcourt/htlc_success_resolver.go
@@ -52,7 +52,22 @@ type htlcSuccessResolver struct {
 	// account any fees that may have to be paid if it goes on chain.
 	htlcAmt lnwire.MilliSatoshi
 
-	ResolverKit
+	contractResolverKit
+}
+
+// newSuccessResolver instanties a new htlc success resolver.
+func newSuccessResolver(res lnwallet.IncomingHtlcResolution,
+	broadcastHeight uint32, payHash lntypes.Hash,
+	htlcAmt lnwire.MilliSatoshi,
+	resCfg ResolverConfig) *htlcSuccessResolver {
+
+	return &htlcSuccessResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+		htlcResolution:      res,
+		broadcastHeight:     broadcastHeight,
+		payHash:             payHash,
+		htlcAmt:             htlcAmt,
+	}
 }
 
 // ResolverKey returns an identifier which should be globally unique for this
@@ -173,7 +188,7 @@ func (h *htlcSuccessResolver) Resolve() (ContractResolver, error) {
 				return nil, errResolverShuttingDown
 			}
 
-		case <-h.Quit:
+		case <-h.quit:
 			return nil, errResolverShuttingDown
 		}
 
@@ -238,7 +253,7 @@ func (h *htlcSuccessResolver) Resolve() (ContractResolver, error) {
 			return nil, errResolverShuttingDown
 		}
 
-	case <-h.Quit:
+	case <-h.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -251,7 +266,7 @@ func (h *htlcSuccessResolver) Resolve() (ContractResolver, error) {
 //
 // NOTE: Part of the ContractResolver interface.
 func (h *htlcSuccessResolver) Stop() {
-	close(h.Quit)
+	close(h.quit)
 }
 
 // IsResolved returns true if the stored state in the resolve is fully
@@ -290,41 +305,37 @@ func (h *htlcSuccessResolver) Encode(w io.Writer) error {
 	return nil
 }
 
-// Decode attempts to decode an encoded ContractResolver from the passed Reader
-// instance, returning an active ContractResolver instance.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcSuccessResolver) Decode(r io.Reader) error {
+// newSuccessResolverFromReader attempts to decode an encoded ContractResolver
+// from the passed Reader instance, returning an active ContractResolver
+// instance.
+func newSuccessResolverFromReader(r io.Reader, resCfg ResolverConfig) (
+	*htlcSuccessResolver, error) {
+
+	h := &htlcSuccessResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+	}
+
 	// First we'll decode our inner HTLC resolution.
 	if err := decodeIncomingResolution(r, &h.htlcResolution); err != nil {
-		return err
+		return nil, err
 	}
 
 	// Next, we'll read all the fields that are specified to the contract
 	// resolver.
 	if err := binary.Read(r, endian, &h.outputIncubating); err != nil {
-		return err
+		return nil, err
 	}
 	if err := binary.Read(r, endian, &h.resolved); err != nil {
-		return err
+		return nil, err
 	}
 	if err := binary.Read(r, endian, &h.broadcastHeight); err != nil {
-		return err
+		return nil, err
 	}
 	if _, err := io.ReadFull(r, h.payHash[:]); err != nil {
-		return err
+		return nil, err
 	}
 
-	return nil
-}
-
-// AttachResolverKit should be called once a resolved is successfully decoded
-// from its stored format. This struct delivers a generic tool kit that
-// resolvers need to complete their duty.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcSuccessResolver) AttachResolverKit(r ResolverKit) {
-	h.ResolverKit = r
+	return h, nil
 }
 
 // A compile time assertion to ensure htlcSuccessResolver meets the
diff --git a/contractcourt/htlc_timeout_resolver.go b/contractcourt/htlc_timeout_resolver.go
index 9d1c92d72..248cfa36b 100644
--- a/contractcourt/htlc_timeout_resolver.go
+++ b/contractcourt/htlc_timeout_resolver.go
@@ -48,7 +48,22 @@ type htlcTimeoutResolver struct {
 	// account any fees that may have to be paid if it goes on chain.
 	htlcAmt lnwire.MilliSatoshi
 
-	ResolverKit
+	contractResolverKit
+}
+
+// newTimeoutResolver instantiates a new timeout htlc resolver.
+func newTimeoutResolver(res lnwallet.OutgoingHtlcResolution,
+	broadcastHeight uint32, htlcIndex uint64,
+	htlcAmt lnwire.MilliSatoshi,
+	resCfg ResolverConfig) *htlcTimeoutResolver {
+
+	return &htlcTimeoutResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+		htlcResolution:      res,
+		broadcastHeight:     broadcastHeight,
+		htlcIndex:           htlcIndex,
+		htlcAmt:             htlcAmt,
+	}
 }
 
 // ResolverKey returns an identifier which should be globally unique for this
@@ -274,7 +289,7 @@ func (h *htlcTimeoutResolver) Resolve() (ContractResolver, error) {
 				return errResolverShuttingDown
 			}
 
-		case <-h.Quit:
+		case <-h.quit:
 			return errResolverShuttingDown
 		}
 
@@ -312,7 +327,7 @@ func (h *htlcTimeoutResolver) Resolve() (ContractResolver, error) {
 			return nil, errResolverShuttingDown
 		}
 
-	case <-h.Quit:
+	case <-h.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -365,7 +380,7 @@ func (h *htlcTimeoutResolver) Resolve() (ContractResolver, error) {
 //
 // NOTE: Part of the ContractResolver interface.
 func (h *htlcTimeoutResolver) Stop() {
-	close(h.Quit)
+	close(h.quit)
 }
 
 // IsResolved returns true if the stored state in the resolve is fully
@@ -406,43 +421,39 @@ func (h *htlcTimeoutResolver) Encode(w io.Writer) error {
 	return nil
 }
 
-// Decode attempts to decode an encoded ContractResolver from the passed Reader
-// instance, returning an active ContractResolver instance.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcTimeoutResolver) Decode(r io.Reader) error {
+// newTimeoutResolverFromReader attempts to decode an encoded ContractResolver
+// from the passed Reader instance, returning an active ContractResolver
+// instance.
+func newTimeoutResolverFromReader(r io.Reader, resCfg ResolverConfig) (
+	*htlcTimeoutResolver, error) {
+
+	h := &htlcTimeoutResolver{
+		contractResolverKit: *newContractResolverKit(resCfg),
+	}
+
 	// First, we'll read out all the mandatory fields of the
 	// OutgoingHtlcResolution that we store.
 	if err := decodeOutgoingResolution(r, &h.htlcResolution); err != nil {
-		return err
+		return nil, err
 	}
 
 	// With those fields read, we can now read back the fields that are
 	// specific to the resolver itself.
 	if err := binary.Read(r, endian, &h.outputIncubating); err != nil {
-		return err
+		return nil, err
 	}
 	if err := binary.Read(r, endian, &h.resolved); err != nil {
-		return err
+		return nil, err
 	}
 	if err := binary.Read(r, endian, &h.broadcastHeight); err != nil {
-		return err
+		return nil, err
 	}
 
 	if err := binary.Read(r, endian, &h.htlcIndex); err != nil {
-		return err
+		return nil, err
 	}
 
-	return nil
-}
-
-// AttachResolverKit should be called once a resolved is successfully decoded
-// from its stored format. This struct delivers a generic tool kit that
-// resolvers need to complete their duty.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcTimeoutResolver) AttachResolverKit(r ResolverKit) {
-	h.ResolverKit = r
+	return h, nil
 }
 
 // A compile time assertion to ensure htlcTimeoutResolver meets the
diff --git a/discovery/gossiper.go b/discovery/gossiper.go
index 8c9ed6e59..5e8e02159 100644
--- a/discovery/gossiper.go
+++ b/discovery/gossiper.go
@@ -1459,7 +1459,9 @@ func (d *AuthenticatedGossiper) addNode(msg *lnwire.NodeAnnouncement) error {
 	}
 
 	timestamp := time.Unix(int64(msg.Timestamp), 0)
-	features := lnwire.NewFeatureVector(msg.Features, lnwire.Features)
+	features := lnwire.NewFeatureVector(
+		msg.Features, lnwire.GlobalFeatures,
+	)
 	node := &channeldb.LightningNode{
 		HaveNodeAnnouncement: true,
 		LastUpdate:           timestamp,
diff --git a/docker/README.md b/docker/README.md
index 1dc79dbbb..474188c50 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -63,12 +63,8 @@ bitcoin into.
 # Init bitcoin network env variable:
 $ export NETWORK="simnet" 
 
-# Create persistent volumes for alice and bob.
-docker volume create simnet_lnd_alice
-docker volume create simnet_lnd_bob
-
 # Run the "Alice" container and log into it:
-$ docker-compose run -d --name alice --volume simnet_lnd_alice:/root/.lnd lnd_btc
+$ docker-compose run -d --name alice lnd_btc
 $ docker exec -i -t alice bash
 
 # Generate a new backward compatible nested p2sh address for Alice:
@@ -94,7 +90,7 @@ Connect `Bob` node to `Alice` node.
 
 ```bash
 # Run "Bob" node and log into it:
-$ docker-compose run -d --name bob --volume simnet_lnd_bob:/root/.lnd lnd_btc
+$ docker-compose run -d --name bob lnd_btc
 $ docker exec -i -t bob bash
 
 # Get the identity pubkey of "Bob" node:
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 8794f688d..fc0971b19 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -9,8 +9,8 @@ services:
       build:
         context: btcd/
       volumes:
-        - shared:/rpc
-        - bitcoin:/data
+            - shared:/rpc
+            - bitcoin:/data
       environment:
         - RPCUSER
         - RPCPASS
@@ -41,8 +41,8 @@ services:
       build:
         context: ltcd/
       volumes:
-        - shared:/rpc
-        - litecoin:/data
+            - shared:/rpc
+            - litecoin:/data
       environment:
         - RPCUSER
         - RPCPASS
@@ -76,8 +76,7 @@ services:
           - CHAIN
           - DEBUG
         volumes:
-          - shared:/rpc
-          - lnd:/root/.lnd
+            - shared:/rpc
         entrypoint: ["./start-lnd.sh"]
 
     lnd_ltc:
@@ -103,11 +102,6 @@ volumes:
   bitcoin:
     driver: local
 
-  # lnd volume is used for persisting lnd application data and chain state
-  # during container lifecycle.
-  lnd:
-    driver: local
-
   # litecoin volume is needed for maintaining blockchain persistence
   # during ltcd container recreation.
   litecoin:
diff --git a/docker/lnd/start-lnd.sh b/docker/lnd/start-lnd.sh
index 1fb8502ff..d65c145dc 100755
--- a/docker/lnd/start-lnd.sh
+++ b/docker/lnd/start-lnd.sh
@@ -51,6 +51,7 @@ fi
 
 exec lnd \
     --noseedbackup \
+    --logdir="/data" \
     "--$CHAIN.active" \
     "--$CHAIN.$NETWORK" \
     "--$CHAIN.node"="btcd" \
diff --git a/feature/default_sets.go b/feature/default_sets.go
deleted file mode 100644
index fe69226c3..000000000
--- a/feature/default_sets.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package feature
-
-import "github.com/lightningnetwork/lnd/lnwire"
-
-// setDesc describes which feature bits should be advertised in which feature
-// sets.
-type setDesc map[lnwire.FeatureBit]map[Set]struct{}
-
-// defaultSetDesc are the default set descriptors for generating feature
-// vectors. Each set is annotated with the corresponding identifier from BOLT 9
-// indicating where it should be advertised.
-var defaultSetDesc = setDesc{
-	lnwire.DataLossProtectRequired: {
-		SetInit:    {}, // I
-		SetNodeAnn: {}, // N
-	},
-	lnwire.GossipQueriesOptional: {
-		SetInit:    {}, // I
-		SetNodeAnn: {}, // N
-	},
-	lnwire.TLVOnionPayloadOptional: {
-		SetInit:         {}, // I
-		SetNodeAnn:      {}, // N
-		SetInvoice:      {}, // 9
-		SetLegacyGlobal: {},
-	},
-	lnwire.StaticRemoteKeyOptional: {
-		SetInit:         {}, // I
-		SetNodeAnn:      {}, // N
-		SetLegacyGlobal: {},
-	},
-}
diff --git a/feature/manager.go b/feature/manager.go
deleted file mode 100644
index f201cad1b..000000000
--- a/feature/manager.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package feature
-
-import (
-	"fmt"
-
-	"github.com/lightningnetwork/lnd/lnwire"
-)
-
-// Config houses any runtime modifications to the default set descriptors. For
-// our purposes, this typically means disabling certain features to test legacy
-// protocol interoperability or functionality.
-type Config struct {
-	// NoTLVOnion unsets any optional or required TLVOnionPaylod bits from
-	// all feature sets.
-	NoTLVOnion bool
-
-	// NoStaticRemoteKey unsets any optional or required StaticRemoteKey
-	// bits from all feature sets.
-	NoStaticRemoteKey bool
-}
-
-// Manager is responsible for generating feature vectors for different requested
-// feature sets.
-type Manager struct {
-	// fsets is a static map of feature set to raw feature vectors. Requests
-	// are fulfilled by cloning these interal feature vectors.
-	fsets map[Set]*lnwire.RawFeatureVector
-}
-
-// NewManager creates a new feature Manager, applying any custom modifications
-// to its feature sets before returning.
-func NewManager(cfg Config) (*Manager, error) {
-	return newManager(cfg, defaultSetDesc)
-}
-
-// newManager creates a new feeature Manager, applying any custom modifications
-// to its feature sets before returning. This method accepts the setDesc as its
-// own parameter so that it can be unit tested.
-func newManager(cfg Config, desc setDesc) (*Manager, error) {
-	// First build the default feature vector for all known sets.
-	fsets := make(map[Set]*lnwire.RawFeatureVector)
-	for bit, sets := range desc {
-		for set := range sets {
-			// Fetch the feature vector for this set, allocating a
-			// new one if it doesn't exist.
-			fv, ok := fsets[set]
-			if !ok {
-				fv = lnwire.NewRawFeatureVector()
-			}
-
-			// Set the configured bit on the feature vector,
-			// ensuring that we don't set two feature bits for the
-			// same pair.
-			err := fv.SafeSet(bit)
-			if err != nil {
-				return nil, fmt.Errorf("unable to set "+
-					"%v in %v: %v", bit, set, err)
-			}
-
-			// Write the updated feature vector under its set.
-			fsets[set] = fv
-		}
-	}
-
-	// Now, remove any features as directed by the config.
-	for _, fv := range fsets {
-		if cfg.NoTLVOnion {
-			fv.Unset(lnwire.TLVOnionPayloadOptional)
-			fv.Unset(lnwire.TLVOnionPayloadRequired)
-		}
-		if cfg.NoStaticRemoteKey {
-			fv.Unset(lnwire.StaticRemoteKeyOptional)
-			fv.Unset(lnwire.StaticRemoteKeyRequired)
-		}
-	}
-
-	return &Manager{
-		fsets: fsets,
-	}, nil
-}
-
-// GetRaw returns a raw feature vector for the passed set. If no set is known,
-// an empty raw feature vector is returned.
-func (m *Manager) GetRaw(set Set) *lnwire.RawFeatureVector {
-	if fv, ok := m.fsets[set]; ok {
-		return fv.Clone()
-	}
-
-	return lnwire.NewRawFeatureVector()
-}
-
-// Get returns a feature vector for the passed set. If no set is known, an empty
-// feature vector is returned.
-func (m *Manager) Get(set Set) *lnwire.FeatureVector {
-	raw := m.GetRaw(set)
-	return lnwire.NewFeatureVector(raw, lnwire.Features)
-}
diff --git a/feature/set.go b/feature/set.go
deleted file mode 100644
index 2ac2ce52c..000000000
--- a/feature/set.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package feature
-
-// Set is an enum identifying various feature sets, which separates the single
-// feature namespace into distinct categories depending what context a feature
-// vector is being used.
-type Set uint8
-
-const (
-	// SetInit identifies features that should be sent in an Init message to
-	// a remote peer.
-	SetInit Set = iota
-
-	// SetLegacyGlobal identifies features that should be set in the legacy
-	// GlobalFeatures field of an Init message, which maintains backwards
-	// compatibility with nodes that haven't implemented flat features.
-	SetLegacyGlobal
-
-	// SetNodeAnn identifies features that should be advertised on node
-	// announcements.
-	SetNodeAnn
-
-	// SetInvoice identifies features that should be advertised on invoices
-	// generated by the daemon.
-	SetInvoice
-)
-
-// String returns a human-readable description of a Set.
-func (s Set) String() string {
-	switch s {
-	case SetInit:
-		return "SetInit"
-	case SetLegacyGlobal:
-		return "SetLegacyGlobal"
-	case SetNodeAnn:
-		return "SetNodeAnn"
-	case SetInvoice:
-		return "SetInvoice"
-	default:
-		return "SetUnknown"
-	}
-}
diff --git a/fundingmanager.go b/fundingmanager.go
index ca7959d0c..f33ce498f 100644
--- a/fundingmanager.go
+++ b/fundingmanager.go
@@ -1205,10 +1205,10 @@ func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
 	// negotiated the new tweakless commitment format. This is only the
 	// case if *both* us and the remote peer are signaling the proper
 	// feature bit.
-	localTweakless := fmsg.peer.LocalFeatures().HasFeature(
+	localTweakless := fmsg.peer.LocalGlobalFeatures().HasFeature(
 		lnwire.StaticRemoteKeyOptional,
 	)
-	remoteTweakless := fmsg.peer.RemoteFeatures().HasFeature(
+	remoteTweakless := fmsg.peer.RemoteGlobalFeatures().HasFeature(
 		lnwire.StaticRemoteKeyOptional,
 	)
 	tweaklessCommitment := localTweakless && remoteTweakless
@@ -2780,10 +2780,10 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) {
 	// negotiated the new tweakless commitment format. This is only the
 	// case if *both* us and the remote peer are signaling the proper
 	// feature bit.
-	localTweakless := msg.peer.LocalFeatures().HasFeature(
+	localTweakless := msg.peer.LocalGlobalFeatures().HasFeature(
 		lnwire.StaticRemoteKeyOptional,
 	)
-	remoteTweakless := msg.peer.RemoteFeatures().HasFeature(
+	remoteTweakless := msg.peer.RemoteGlobalFeatures().HasFeature(
 		lnwire.StaticRemoteKeyOptional,
 	)
 	tweaklessCommitment := localTweakless && remoteTweakless
diff --git a/htlcswitch/link.go b/htlcswitch/link.go
index 83a9c70ef..4da9c0db6 100644
--- a/htlcswitch/link.go
+++ b/htlcswitch/link.go
@@ -291,6 +291,15 @@ type channelLink struct {
 	// sure we don't process any more updates.
 	failed bool
 
+	// batchCounter is the number of updates which we received from remote
+	// side, but not include in commitment transaction yet and plus the
+	// current number of settles that have been sent, but not yet committed
+	// to the commitment.
+	//
+	// TODO(andrew.shvv) remove after we add additional BatchNumber()
+	// method in state machine.
+	batchCounter uint32
+
 	// keystoneBatch represents a volatile list of keystones that must be
 	// written before attempting to sign the next commitment txn. These
 	// represent all the HTLC's forwarded to the link from the switch. Once
@@ -344,6 +353,14 @@ type channelLink struct {
 	// sub-systems with the latest set of active HTLC's on our channel.
 	htlcUpdates chan *contractcourt.ContractUpdate
 
+	// logCommitTimer is a timer which is sent upon if we go an interval
+	// without receiving/sending a commitment update. It's role is to
+	// ensure both chains converge to identical state in a timely manner.
+	//
+	// TODO(roasbeef): timer should be >> then RTT
+	logCommitTimer *time.Timer
+	logCommitTick  <-chan time.Time
+
 	// updateFeeTimer is the timer responsible for updating the link's
 	// commitment fee every time it fires.
 	updateFeeTimer *time.Timer
@@ -389,12 +406,13 @@ func NewChannelLink(cfg ChannelLinkConfig,
 		channel:     channel,
 		shortChanID: channel.ShortChanID(),
 		// TODO(roasbeef): just do reserve here?
-		overflowQueue: newPacketQueue(input.MaxHTLCNumber / 2),
-		htlcUpdates:   make(chan *contractcourt.ContractUpdate),
-		hodlMap:       make(map[channeldb.CircuitKey]hodlHtlc),
-		hodlQueue:     queue.NewConcurrentQueue(10),
-		log:           build.NewPrefixLog(logPrefix, log),
-		quit:          make(chan struct{}),
+		logCommitTimer: time.NewTimer(300 * time.Millisecond),
+		overflowQueue:  newPacketQueue(input.MaxHTLCNumber / 2),
+		htlcUpdates:    make(chan *contractcourt.ContractUpdate),
+		hodlMap:        make(map[channeldb.CircuitKey]hodlHtlc),
+		hodlQueue:      queue.NewConcurrentQueue(10),
+		log:            build.NewPrefixLog(logPrefix, log),
+		quit:           make(chan struct{}),
 	}
 }
 
@@ -724,15 +742,19 @@ func (l *channelLink) resolveFwdPkgs() error {
 
 	l.log.Debugf("loaded %d fwd pks", len(fwdPkgs))
 
+	var needUpdate bool
 	for _, fwdPkg := range fwdPkgs {
-		if err := l.resolveFwdPkg(fwdPkg); err != nil {
+		hasUpdate, err := l.resolveFwdPkg(fwdPkg)
+		if err != nil {
 			return err
 		}
+
+		needUpdate = needUpdate || hasUpdate
 	}
 
 	// If any of our reprocessing steps require an update to the commitment
 	// txn, we initiate a state transition to capture all relevant changes.
-	if l.channel.PendingLocalUpdateCount() > 0 {
+	if needUpdate {
 		return l.updateCommitTx()
 	}
 
@@ -742,7 +764,7 @@ func (l *channelLink) resolveFwdPkgs() error {
 // resolveFwdPkg interprets the FwdState of the provided package, either
 // reprocesses any outstanding htlcs in the package, or performs garbage
 // collection on the package.
-func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error {
+func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) (bool, error) {
 	// Remove any completed packages to clear up space.
 	if fwdPkg.State == channeldb.FwdStateCompleted {
 		l.log.Debugf("removing completed fwd pkg for height=%d",
@@ -752,7 +774,7 @@ func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error {
 		if err != nil {
 			l.log.Errorf("unable to remove fwd pkg for height=%d: "+
 				"%v", fwdPkg.Height, err)
-			return err
+			return false, err
 		}
 	}
 
@@ -771,7 +793,7 @@ func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error {
 		if err != nil {
 			l.log.Errorf("unable to process remote log updates: %v",
 				err)
-			return err
+			return false, err
 		}
 		l.processRemoteSettleFails(fwdPkg, settleFails)
 	}
@@ -780,6 +802,7 @@ func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error {
 	// downstream logic is able to filter out any duplicates, but we must
 	// shove the entire, original set of adds down the pipeline so that the
 	// batch of adds presented to the sphinx router does not ever change.
+	var needUpdate bool
 	if !fwdPkg.AckFilter.IsFull() {
 		adds, err := lnwallet.PayDescsFromRemoteLogUpdates(
 			fwdPkg.Source, fwdPkg.Height, fwdPkg.Adds,
@@ -787,20 +810,20 @@ func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error {
 		if err != nil {
 			l.log.Errorf("unable to process remote log updates: %v",
 				err)
-			return err
+			return false, err
 		}
-		l.processRemoteAdds(fwdPkg, adds)
+		needUpdate = l.processRemoteAdds(fwdPkg, adds)
 
 		// If the link failed during processing the adds, we must
 		// return to ensure we won't attempted to update the state
 		// further.
 		if l.failed {
-			return fmt.Errorf("link failed while " +
+			return false, fmt.Errorf("link failed while " +
 				"processing remote adds")
 		}
 	}
 
-	return nil
+	return needUpdate, nil
 }
 
 // fwdPkgGarbager periodically reads all forwarding packages from disk and
@@ -1005,14 +1028,11 @@ out:
 			break out
 		}
 
-		// If the previous event resulted in a non-empty batch, resume
-		// the batch ticker so that it can be cleared. Otherwise pause
-		// the ticker to prevent waking up the htlcManager while the
-		// batch is empty.
-		if l.channel.PendingLocalUpdateCount() > 0 {
+		// If the previous event resulted in a non-empty
+		// batch, reinstate the batch ticker so that it can be
+		// cleared.
+		if l.batchCounter > 0 {
 			l.cfg.BatchTicker.Resume()
-		} else {
-			l.cfg.BatchTicker.Pause()
 		}
 
 		select {
@@ -1078,11 +1098,35 @@ out:
 
 			break out
 
+		case <-l.logCommitTick:
+			// If we haven't sent or received a new commitment
+			// update in some time, check to see if we have any
+			// pending updates we need to commit due to our
+			// commitment chains being desynchronized.
+			if l.channel.FullySynced() {
+				continue
+			}
+
+			if err := l.updateCommitTx(); err != nil {
+				l.fail(LinkFailureError{code: ErrInternalError},
+					"unable to update commitment: %v", err)
+				break out
+			}
+
 		case <-l.cfg.BatchTicker.Ticks():
-			// Attempt to extend the remote commitment chain
-			// including all the currently pending entries. If the
-			// send was unsuccessful, then abandon the update,
-			// waiting for the revocation window to open up.
+			// If the current batch is empty, then we have no work
+			// here. We also disable the batch ticker from waking up
+			// the htlcManager while the batch is empty.
+			if l.batchCounter == 0 {
+				l.cfg.BatchTicker.Pause()
+				continue
+			}
+
+			// Otherwise, attempt to extend the remote commitment
+			// chain including all the currently pending entries.
+			// If the send was unsuccessful, then abandon the
+			// update, waiting for the revocation window to open
+			// up.
 			if err := l.updateCommitTx(); err != nil {
 				l.fail(LinkFailureError{code: ErrInternalError},
 					"unable to update commitment: %v", err)
@@ -1112,9 +1156,9 @@ out:
 			if ok && l.overflowQueue.Length() != 0 {
 				l.log.Infof("downstream htlc add update with "+
 					"payment hash(%x) have been added to "+
-					"reprocessing queue, pend_updates=%v",
+					"reprocessing queue, batch_size=%v",
 					htlc.PaymentHash[:],
-					l.channel.PendingLocalUpdateCount())
+					l.batchCounter)
 
 				l.overflowQueue.AddPkt(pkt)
 				continue
@@ -1192,6 +1236,8 @@ loop:
 func (l *channelLink) processHodlEvent(hodlEvent invoices.HodlEvent,
 	htlc hodlHtlc) error {
 
+	l.batchCounter++
+
 	circuitKey := hodlEvent.CircuitKey
 
 	// Determine required action for the resolution.
@@ -1261,9 +1307,9 @@ func (l *channelLink) handleDownStreamPkt(pkt *htlcPacket, isReProcess bool) {
 			case lnwallet.ErrMaxHTLCNumber:
 				l.log.Infof("downstream htlc add update with "+
 					"payment hash(%x) have been added to "+
-					"reprocessing queue, pend_updates: %v",
+					"reprocessing queue, batch: %v",
 					htlc.PaymentHash[:],
-					l.channel.PendingLocalUpdateCount())
+					l.batchCounter)
 
 				l.overflowQueue.AddPkt(pkt)
 				return
@@ -1340,9 +1386,8 @@ func (l *channelLink) handleDownStreamPkt(pkt *htlcPacket, isReProcess bool) {
 		}
 
 		l.log.Tracef("received downstream htlc: payment_hash=%x, "+
-			"local_log_index=%v, pend_updates=%v",
-			htlc.PaymentHash[:], index,
-			l.channel.PendingLocalUpdateCount())
+			"local_log_index=%v, batch_size=%v",
+			htlc.PaymentHash[:], index, l.batchCounter+1)
 
 		pkt.outgoingChanID = l.ShortChanID()
 		pkt.outgoingHTLCID = index
@@ -1473,11 +1518,11 @@ func (l *channelLink) handleDownStreamPkt(pkt *htlcPacket, isReProcess bool) {
 		isSettle = true
 	}
 
+	l.batchCounter++
+
 	// If this newly added update exceeds the min batch size for adds, or
 	// this is a settle request, then initiate an update.
-	if l.channel.PendingLocalUpdateCount() >= uint64(l.cfg.BatchSize) ||
-		isSettle {
-
+	if l.batchCounter >= l.cfg.BatchSize || isSettle {
 		if err := l.updateCommitTx(); err != nil {
 			l.fail(LinkFailureError{code: ErrInternalError},
 				"unable to update commitment: %v", err)
@@ -1745,10 +1790,25 @@ func (l *channelLink) handleUpstreamMsg(msg lnwire.Message) {
 			return
 		}
 
+		// As we've just received a commitment signature, we'll
+		// re-start the log commit timer to wake up the main processing
+		// loop to check if we need to send a commitment signature as
+		// we owe one.
+		//
+		// TODO(roasbeef): instead after revocation?
+		if !l.logCommitTimer.Stop() {
+			select {
+			case <-l.logCommitTimer.C:
+			default:
+			}
+		}
+		l.logCommitTimer.Reset(300 * time.Millisecond)
+		l.logCommitTick = l.logCommitTimer.C
+
 		// If both commitment chains are fully synced from our PoV,
 		// then we don't need to reply with a signature as both sides
 		// already have a commitment with the latest accepted.
-		if !l.channel.OweCommitment(true) {
+		if l.channel.FullySynced() {
 			return
 		}
 
@@ -1813,7 +1873,7 @@ func (l *channelLink) handleUpstreamMsg(msg lnwire.Message) {
 		}
 
 		l.processRemoteSettleFails(fwdPkg, settleFails)
-		l.processRemoteAdds(fwdPkg, adds)
+		needUpdate := l.processRemoteAdds(fwdPkg, adds)
 
 		// If the link failed during processing the adds, we must
 		// return to ensure we won't attempted to update the state
@@ -1822,14 +1882,7 @@ func (l *channelLink) handleUpstreamMsg(msg lnwire.Message) {
 			return
 		}
 
-		// The revocation window opened up. If there are pending local
-		// updates, try to update the commit tx. Pending updates could
-		// already have been present because of a previously failed
-		// update to the commit tx or freshly added in by
-		// processRemoteAdds. Also in case there are no local updates,
-		// but there are still remote updates that are not in the remote
-		// commit tx yet, send out an update.
-		if l.channel.OweCommitment(true) {
+		if needUpdate {
 			if err := l.updateCommitTx(); err != nil {
 				l.fail(LinkFailureError{code: ErrInternalError},
 					"unable to update commitment: %v", err)
@@ -1943,9 +1996,8 @@ func (l *channelLink) updateCommitTx() error {
 	theirCommitSig, htlcSigs, pendingHTLCs, err := l.channel.SignNextCommitment()
 	if err == lnwallet.ErrNoWindow {
 		l.log.Tracef("revocation window exhausted, unable to send: "+
-			"%v, pend_updates=%v, dangling_closes%v",
-			l.channel.PendingLocalUpdateCount(),
-			newLogClosure(func() string {
+			"%v, dangling_opens=%v, dangling_closes%v",
+			l.batchCounter, newLogClosure(func() string {
 				return spew.Sdump(l.openedCircuits)
 			}),
 			newLogClosure(func() string {
@@ -1980,6 +2032,21 @@ func (l *channelLink) updateCommitTx() error {
 	}
 	l.cfg.Peer.SendMessage(false, commitSig)
 
+	// We've just initiated a state transition, attempt to stop the
+	// logCommitTimer. If the timer already ticked, then we'll consume the
+	// value, dropping
+	if l.logCommitTimer != nil && !l.logCommitTimer.Stop() {
+		select {
+		case <-l.logCommitTimer.C:
+		default:
+		}
+	}
+	l.logCommitTick = nil
+
+	// Finally, clear our the current batch, so we can accurately make
+	// further batch flushing decisions.
+	l.batchCounter = 0
+
 	return nil
 }
 
@@ -2465,7 +2532,7 @@ func (l *channelLink) processRemoteSettleFails(fwdPkg *channeldb.FwdPkg,
 // whether we are reprocessing as a result of a failure or restart. Adds that
 // have already been acknowledged in the forwarding package will be ignored.
 func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
-	lockedInHtlcs []*lnwallet.PaymentDescriptor) {
+	lockedInHtlcs []*lnwallet.PaymentDescriptor) bool {
 
 	l.log.Tracef("processing %d remote adds for height %d",
 		len(lockedInHtlcs), fwdPkg.Height)
@@ -2504,10 +2571,13 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 	if sphinxErr != nil {
 		l.fail(LinkFailureError{code: ErrInternalError},
 			"unable to decode hop iterators: %v", sphinxErr)
-		return
+		return false
 	}
 
-	var switchPackets []*htlcPacket
+	var (
+		needUpdate    bool
+		switchPackets []*htlcPacket
+	)
 
 	for i, pd := range lockedInHtlcs {
 		idx := uint16(i)
@@ -2544,6 +2614,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 			// sender.
 			l.sendMalformedHTLCError(pd.HtlcIndex, failureCode,
 				onionBlob[:], pd.SourceRef)
+			needUpdate = true
 
 			l.log.Errorf("unable to decode onion hop "+
 				"iterator: %v", failureCode)
@@ -2562,6 +2633,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 			l.sendMalformedHTLCError(
 				pd.HtlcIndex, failureCode, onionBlob[:], pd.SourceRef,
 			)
+			needUpdate = true
 
 			l.log.Errorf("unable to decode onion "+
 				"obfuscator: %v", failureCode)
@@ -2592,6 +2664,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 				lnwire.NewInvalidOnionPayload(failedType, 0),
 				obfuscator, pd.SourceRef,
 			)
+			needUpdate = true
 
 			l.log.Errorf("unable to decode forwarding "+
 				"instructions: %v", err)
@@ -2602,7 +2675,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 
 		switch fwdInfo.NextHop {
 		case hop.Exit:
-			err := l.processExitHop(
+			updated, err := l.processExitHop(
 				pd, obfuscator, fwdInfo, heightNow, pld,
 			)
 			if err != nil {
@@ -2610,7 +2683,10 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 					err.Error(),
 				)
 
-				return
+				return false
+			}
+			if updated {
+				needUpdate = true
 			}
 
 		// There are additional channels left within this route. So
@@ -2705,6 +2781,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 				l.sendHTLCError(
 					pd.HtlcIndex, failure, obfuscator, pd.SourceRef,
 				)
+				needUpdate = true
 				continue
 			}
 
@@ -2744,12 +2821,12 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 		if err != nil {
 			l.fail(LinkFailureError{code: ErrInternalError},
 				"unable to set fwd filter: %v", err)
-			return
+			return false
 		}
 	}
 
 	if len(switchPackets) == 0 {
-		return
+		return needUpdate
 	}
 
 	l.log.Debugf("forwarding %d packets to switch", len(switchPackets))
@@ -2760,13 +2837,15 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
 	// opened circuits, which violates assumptions made by the circuit
 	// trimming.
 	l.forwardBatch(switchPackets...)
+
+	return needUpdate
 }
 
 // processExitHop handles an htlc for which this link is the exit hop. It
 // returns a boolean indicating whether the commitment tx needs an update.
 func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 	obfuscator hop.ErrorEncrypter, fwdInfo hop.ForwardingInfo,
-	heightNow uint32, payload invoices.Payload) error {
+	heightNow uint32, payload invoices.Payload) (bool, error) {
 
 	// If hodl.ExitSettle is requested, we will not validate the final hop's
 	// ADD, nor will we settle the corresponding invoice or respond with the
@@ -2774,7 +2853,7 @@ func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 	if l.cfg.HodlMask.Active(hodl.ExitSettle) {
 		l.log.Warnf(hodl.ExitSettle.Warning())
 
-		return nil
+		return false, nil
 	}
 
 	// As we're the exit hop, we'll double check the hop-payload included in
@@ -2789,7 +2868,7 @@ func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 		failure := lnwire.NewFinalIncorrectHtlcAmount(pd.Amount)
 		l.sendHTLCError(pd.HtlcIndex, failure, obfuscator, pd.SourceRef)
 
-		return nil
+		return true, nil
 	}
 
 	// We'll also ensure that our time-lock value has been computed
@@ -2802,7 +2881,7 @@ func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 		failure := lnwire.NewFinalIncorrectCltvExpiry(pd.Timeout)
 		l.sendHTLCError(pd.HtlcIndex, failure, obfuscator, pd.SourceRef)
 
-		return nil
+		return true, nil
 	}
 
 	// Notify the invoiceRegistry of the exit hop htlc. If we crash right
@@ -2827,14 +2906,14 @@ func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 		failure := lnwire.NewFailIncorrectDetails(pd.Amount, heightNow)
 		l.sendHTLCError(pd.HtlcIndex, failure, obfuscator, pd.SourceRef)
 
-		return nil
+		return true, nil
 
 	// No error.
 	case nil:
 
 	// Pass error to caller.
 	default:
-		return err
+		return false, err
 	}
 
 	// Create a hodlHtlc struct and decide either resolved now or later.
@@ -2847,11 +2926,15 @@ func (l *channelLink) processExitHop(pd *lnwallet.PaymentDescriptor,
 		// Save payment descriptor for future reference.
 		l.hodlMap[circuitKey] = htlc
 
-		return nil
+		return false, nil
 	}
 
 	// Process the received resolution.
-	return l.processHodlEvent(*event, htlc)
+	err = l.processHodlEvent(*event, htlc)
+	if err != nil {
+		return false, err
+	}
+	return true, nil
 }
 
 // settleHTLC settles the HTLC on the channel.
diff --git a/htlcswitch/mock.go b/htlcswitch/mock.go
index c63aa1713..3dc1160df 100644
--- a/htlcswitch/mock.go
+++ b/htlcswitch/mock.go
@@ -607,11 +607,11 @@ func (s *mockServer) WipeChannel(*wire.OutPoint) error {
 	return nil
 }
 
-func (s *mockServer) LocalFeatures() *lnwire.FeatureVector {
+func (s *mockServer) LocalGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
 
-func (s *mockServer) RemoteFeatures() *lnwire.FeatureVector {
+func (s *mockServer) RemoteGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
 
diff --git a/lnpeer/peer.go b/lnpeer/peer.go
index 53f571314..e21e27968 100644
--- a/lnpeer/peer.go
+++ b/lnpeer/peer.go
@@ -47,14 +47,15 @@ type Peer interface {
 	// implementation exits.
 	QuitSignal() <-chan struct{}
 
-	// LocalFeatures returns the set of features that has been advertised by
-	// the us to the remote peer. This allows sub-systems that use this
+	// LocalGlobalFeatures returns the set of global features that has been
+	// advertised by the local peer. This allows sub-systems that use this
 	// interface to gate their behavior off the set of negotiated feature
 	// bits.
-	LocalFeatures() *lnwire.FeatureVector
+	LocalGlobalFeatures() *lnwire.FeatureVector
 
-	// RemoteFeatures returns the set of features that has been advertised
-	// by the remote peer. This allows sub-systems that use this interface
-	// to gate their behavior off the set of negotiated feature bits.
-	RemoteFeatures() *lnwire.FeatureVector
+	// RemoteGlobalFeatures returns the set of global features that has
+	// been advertised by the remote peer. This allows sub-systems that use
+	// this interface to gate their behavior off the set of negotiated
+	// feature bits.
+	RemoteGlobalFeatures() *lnwire.FeatureVector
 }
diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go
index 918aba9c4..2dbed936e 100644
--- a/lnrpc/rpc.pb.go
+++ b/lnrpc/rpc.pb.go
@@ -254,13 +254,11 @@ func (Payment_PaymentStatus) EnumDescriptor() ([]byte, []int) {
 type GenSeedRequest struct {
 	//*
 	//aezeed_passphrase is an optional user provided passphrase that will be used
-	//to encrypt the generated aezeed cipher seed. When using REST, this field
-	//must be encoded as base64.
+	//to encrypt the generated aezeed cipher seed.
 	AezeedPassphrase []byte `protobuf:"bytes,1,opt,name=aezeed_passphrase,json=aezeedPassphrase,proto3" json:"aezeed_passphrase,omitempty"`
 	//*
 	//seed_entropy is an optional 16-bytes generated via CSPRNG. If not
 	//specified, then a fresh set of randomness will be used to create the seed.
-	//When using REST, this field must be encoded as base64.
 	SeedEntropy          []byte   `protobuf:"bytes,2,opt,name=seed_entropy,json=seedEntropy,proto3" json:"seed_entropy,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -366,8 +364,7 @@ type InitWalletRequest struct {
 	//*
 	//wallet_password is the passphrase that should be used to encrypt the
 	//wallet. This MUST be at least 8 chars in length. After creation, this
-	//password is required to unlock the daemon. When using REST, this field
-	//must be encoded as base64.
+	//password is required to unlock the daemon.
 	WalletPassword []byte `protobuf:"bytes,1,opt,name=wallet_password,json=walletPassword,proto3" json:"wallet_password,omitempty"`
 	//*
 	//cipher_seed_mnemonic is a 24-word mnemonic that encodes a prior aezeed
@@ -376,8 +373,7 @@ type InitWalletRequest struct {
 	CipherSeedMnemonic []string `protobuf:"bytes,2,rep,name=cipher_seed_mnemonic,json=cipherSeedMnemonic,proto3" json:"cipher_seed_mnemonic,omitempty"`
 	//*
 	//aezeed_passphrase is an optional user provided passphrase that will be used
-	//to encrypt the generated aezeed cipher seed. When using REST, this field
-	//must be encoded as base64.
+	//to encrypt the generated aezeed cipher seed.
 	AezeedPassphrase []byte `protobuf:"bytes,3,opt,name=aezeed_passphrase,json=aezeedPassphrase,proto3" json:"aezeed_passphrase,omitempty"`
 	//*
 	//recovery_window is an optional argument specifying the address lookahead
@@ -494,7 +490,7 @@ type UnlockWalletRequest struct {
 	//*
 	//wallet_password should be the current valid passphrase for the daemon. This
 	//will be required to decrypt on-disk material that the daemon requires to
-	//function properly. When using REST, this field must be encoded as base64.
+	//function properly.
 	WalletPassword []byte `protobuf:"bytes,1,opt,name=wallet_password,json=walletPassword,proto3" json:"wallet_password,omitempty"`
 	//*
 	//recovery_window is an optional argument specifying the address lookahead
@@ -596,11 +592,11 @@ var xxx_messageInfo_UnlockWalletResponse proto.InternalMessageInfo
 type ChangePasswordRequest struct {
 	//*
 	//current_password should be the current valid passphrase used to unlock the
-	//daemon. When using REST, this field must be encoded as base64.
+	//daemon.
 	CurrentPassword []byte `protobuf:"bytes,1,opt,name=current_password,json=currentPassword,proto3" json:"current_password,omitempty"`
 	//*
 	//new_password should be the new passphrase that will be needed to unlock the
-	//daemon. When using REST, this field must be encoded as base64.
+	//daemon.
 	NewPassword          []byte   `protobuf:"bytes,2,opt,name=new_password,json=newPassword,proto3" json:"new_password,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -1026,26 +1022,18 @@ func (*FeeLimit) XXX_OneofWrappers() []interface{} {
 }
 
 type SendRequest struct {
-	//*
-	//The identity pubkey of the payment recipient. When using REST, this field
-	//must be encoded as base64.
+	/// The identity pubkey of the payment recipient
 	Dest []byte `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"`
-	//*
-	//The hex-encoded identity pubkey of the payment recipient. Deprecated now
-	//that the REST gateway supports base64 encoding of bytes fields.
-	DestString string `protobuf:"bytes,2,opt,name=dest_string,json=destString,proto3" json:"dest_string,omitempty"` // Deprecated: Do not use.
+	/// The hex-encoded identity pubkey of the payment recipient
+	DestString string `protobuf:"bytes,2,opt,name=dest_string,json=destString,proto3" json:"dest_string,omitempty"`
 	/// Number of satoshis to send.
 	Amt int64 `protobuf:"varint,3,opt,name=amt,proto3" json:"amt,omitempty"`
-	//*
-	//The hash to use within the payment's HTLC. When using REST, this field
-	//must be encoded as base64.
+	/// The hash to use within the payment's HTLC
 	PaymentHash []byte `protobuf:"bytes,4,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"`
+	/// The hex-encoded hash to use within the payment's HTLC
+	PaymentHashString string `protobuf:"bytes,5,opt,name=payment_hash_string,json=paymentHashString,proto3" json:"payment_hash_string,omitempty"`
 	//*
-	//The hex-encoded hash to use within the payment's HTLC. Deprecated now
-	//that the REST gateway supports base64 encoding of bytes fields.
-	PaymentHashString string `protobuf:"bytes,5,opt,name=payment_hash_string,json=paymentHashString,proto3" json:"payment_hash_string,omitempty"` // Deprecated: Do not use.
-	//*
-	//A bare-bones invoice for a payment within the Lightning Network. With the
+	//A bare-bones invoice for a payment within the Lightning Network.  With the
 	//details of the invoice, the sender has all the data necessary to send a
 	//payment to the recipient.
 	PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request,json=paymentRequest,proto3" json:"payment_request,omitempty"`
@@ -1071,8 +1059,7 @@ type SendRequest struct {
 	//*
 	//An optional field that can be used to pass an arbitrary set of TLV records
 	//to a peer which understands the new records. This can be used to pass
-	//application specific data during the payment attempt. When using REST, the
-	//values must be encoded as base64.
+	//application specific data during the payment attempt.
 	DestTlv              map[uint64][]byte `protobuf:"bytes,11,rep,name=dest_tlv,json=destTlv,proto3" json:"dest_tlv,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
@@ -1111,7 +1098,6 @@ func (m *SendRequest) GetDest() []byte {
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *SendRequest) GetDestString() string {
 	if m != nil {
 		return m.DestString
@@ -1133,7 +1119,6 @@ func (m *SendRequest) GetPaymentHash() []byte {
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *SendRequest) GetPaymentHashString() string {
 	if m != nil {
 		return m.PaymentHashString
@@ -1247,14 +1232,10 @@ func (m *SendResponse) GetPaymentHash() []byte {
 }
 
 type SendToRouteRequest struct {
-	//*
-	//The payment hash to use for the HTLC. When using REST, this field must be
-	//encoded as base64.
+	/// The payment hash to use for the HTLC.
 	PaymentHash []byte `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"`
-	//*
-	//An optional hex-encoded payment hash to be used for the HTLC. Deprecated now
-	//that the REST gateway supports base64 encoding of bytes fields.
-	PaymentHashString string `protobuf:"bytes,2,opt,name=payment_hash_string,json=paymentHashString,proto3" json:"payment_hash_string,omitempty"` // Deprecated: Do not use.
+	/// An optional hex-encoded payment hash to be used for the HTLC.
+	PaymentHashString string `protobuf:"bytes,2,opt,name=payment_hash_string,json=paymentHashString,proto3" json:"payment_hash_string,omitempty"`
 	/// Route that should be used to attempt to complete the payment.
 	Route                *Route   `protobuf:"bytes,4,opt,name=route,proto3" json:"route,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1294,7 +1275,6 @@ func (m *SendToRouteRequest) GetPaymentHash() []byte {
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *SendToRouteRequest) GetPaymentHashString() string {
 	if m != nil {
 		return m.PaymentHashString
@@ -2189,9 +2169,7 @@ func (m *NewAddressResponse) GetAddress() string {
 }
 
 type SignMessageRequest struct {
-	//*
-	//The message to be signed. When using REST, this field must be encoded as
-	//base64.
+	/// The message to be signed
 	Msg                  []byte   `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -2271,9 +2249,7 @@ func (m *SignMessageResponse) GetSignature() string {
 }
 
 type VerifyMessageRequest struct {
-	//*
-	//The message over which the signature is to be verified. When using REST,
-	//this field must be encoded as base64.
+	/// The message over which the signature is to be verified
 	Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
 	/// The signature to be verified over the given message
 	Signature            string   `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"`
@@ -2374,7 +2350,7 @@ type ConnectPeerRequest struct {
 	/// Lightning address of the peer, in the format `<pubkey>@host`
 	Addr *LightningAddress `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
 	//* If set, the daemon will attempt to persistently connect to the target
-	// peer. Otherwise, the call will be synchronous.
+	// peer.  Otherwise, the call will be synchronous.
 	Perm                 bool     `protobuf:"varint,2,opt,name=perm,proto3" json:"perm,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -3983,14 +3959,10 @@ func (m *PendingUpdate) GetOutputIndex() uint32 {
 }
 
 type OpenChannelRequest struct {
-	//*
-	//The pubkey of the node to open a channel with. When using REST, this field
-	//must be encoded as base64.
+	/// The pubkey of the node to open a channel with
 	NodePubkey []byte `protobuf:"bytes,2,opt,name=node_pubkey,proto3" json:"node_pubkey,omitempty"`
-	//*
-	//The hex encoded pubkey of the node to open a channel with. Deprecated now
-	//that the REST gateway supports base64 encoding of bytes fields.
-	NodePubkeyString string `protobuf:"bytes,3,opt,name=node_pubkey_string,proto3" json:"node_pubkey_string,omitempty"` // Deprecated: Do not use.
+	/// The hex encoded pubkey of the node to open a channel with
+	NodePubkeyString string `protobuf:"bytes,3,opt,name=node_pubkey_string,proto3" json:"node_pubkey_string,omitempty"`
 	/// The number of satoshis the wallet should commit to the channel
 	LocalFundingAmount int64 `protobuf:"varint,4,opt,name=local_funding_amount,proto3" json:"local_funding_amount,omitempty"`
 	/// The number of satoshis to push to the remote side as part of the initial commitment state
@@ -4046,7 +4018,6 @@ func (m *OpenChannelRequest) GetNodePubkey() []byte {
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *OpenChannelRequest) GetNodePubkeyString() string {
 	if m != nil {
 		return m.NodePubkeyString
@@ -5107,8 +5078,7 @@ type QueryRoutesRequest struct {
 	//send the payment.
 	FeeLimit *FeeLimit `protobuf:"bytes,5,opt,name=fee_limit,json=feeLimit,proto3" json:"fee_limit,omitempty"`
 	//*
-	//A list of nodes to ignore during path finding. When using REST, these fields
-	//must be encoded as base64.
+	//A list of nodes to ignore during path finding.
 	IgnoredNodes [][]byte `protobuf:"bytes,6,rep,name=ignored_nodes,json=ignoredNodes,proto3" json:"ignored_nodes,omitempty"`
 	//*
 	//Deprecated. A list of edges to ignore during path finding.
@@ -5231,13 +5201,9 @@ func (m *QueryRoutesRequest) GetCltvLimit() uint32 {
 }
 
 type NodePair struct {
-	//*
-	//The sending node of the pair. When using REST, this field must be encoded as
-	//base64.
+	/// The sending node of the pair.
 	From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
-	//*
-	//The receiving node of the pair. When using REST, this field must be encoded
-	//as base64.
+	/// The receiving node of the pair.
 	To                   []byte   `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -5582,13 +5548,13 @@ func (m *MPPRecord) GetTotalAmtMsat() int64 {
 //carry the initial payment amount after fees are accounted for.
 type Route struct {
 	//*
-	//The cumulative (final) time lock across the entire route. This is the CLTV
+	//The cumulative (final) time lock across the entire route.  This is the CLTV
 	//value that should be extended to the first hop in the route. All other hops
 	//will decrement the time-lock as advertised, leaving enough time for all
 	//hops to wait for or present the payment preimage to complete the payment.
 	TotalTimeLock uint32 `protobuf:"varint,1,opt,name=total_time_lock,proto3" json:"total_time_lock,omitempty"`
 	//*
-	//The sum of the fees paid at each hop within the final route. In the case
+	//The sum of the fees paid at each hop within the final route.  In the case
 	//of a one-hop payment, this value will be zero as we don't need to pay a fee
 	//to ourselves.
 	TotalFees int64 `protobuf:"varint,2,opt,name=total_fees,proto3" json:"total_fees,omitempty"` // Deprecated: Do not use.
@@ -6906,12 +6872,9 @@ type Invoice struct {
 	Receipt []byte `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,omitempty"` // Deprecated: Do not use.
 	//*
 	//The hex-encoded preimage (32 byte) which will allow settling an incoming
-	//HTLC payable to this preimage. When using REST, this field must be encoded
-	//as base64.
+	//HTLC payable to this preimage
 	RPreimage []byte `protobuf:"bytes,3,opt,name=r_preimage,proto3" json:"r_preimage,omitempty"`
-	//*
-	//The hash of the preimage. When using REST, this field must be encoded as
-	//base64.
+	/// The hash of the preimage
 	RHash []byte `protobuf:"bytes,4,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
 	/// The value of this invoice in satoshis
 	Value int64 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"`
@@ -6922,15 +6885,14 @@ type Invoice struct {
 	/// When this invoice was settled
 	SettleDate int64 `protobuf:"varint,8,opt,name=settle_date,proto3" json:"settle_date,omitempty"`
 	//*
-	//A bare-bones invoice for a payment within the Lightning Network. With the
+	//A bare-bones invoice for a payment within the Lightning Network.  With the
 	//details of the invoice, the sender has all the data necessary to send a
 	//payment to the recipient.
 	PaymentRequest string `protobuf:"bytes,9,opt,name=payment_request,proto3" json:"payment_request,omitempty"`
 	//*
 	//Hash (SHA-256) of a description of the payment. Used if the description of
 	//payment (memo) is too long to naturally fit within the description field
-	//of an encoded payment request. When using REST, this field must be encoded
-	//as base64.
+	//of an encoded payment request.
 	DescriptionHash []byte `protobuf:"bytes,10,opt,name=description_hash,proto3" json:"description_hash,omitempty"`
 	/// Payment request expiry time in seconds. Default is 3600 (1 hour).
 	Expiry int64 `protobuf:"varint,11,opt,name=expiry,proto3" json:"expiry,omitempty"`
@@ -7273,7 +7235,7 @@ func (m *InvoiceHTLC) GetState() InvoiceHTLCState {
 type AddInvoiceResponse struct {
 	RHash []byte `protobuf:"bytes,1,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
 	//*
-	//A bare-bones invoice for a payment within the Lightning Network. With the
+	//A bare-bones invoice for a payment within the Lightning Network.  With the
 	//details of the invoice, the sender has all the data necessary to send a
 	//payment to the recipient.
 	PaymentRequest string `protobuf:"bytes,2,opt,name=payment_request,proto3" json:"payment_request,omitempty"`
@@ -7338,12 +7300,8 @@ type PaymentHash struct {
 	//*
 	//The hex-encoded payment hash of the invoice to be looked up. The passed
 	//payment hash must be exactly 32 bytes, otherwise an error is returned.
-	//Deprecated now that the REST gateway supports base64 encoding of bytes
-	//fields.
-	RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str,proto3" json:"r_hash_str,omitempty"` // Deprecated: Do not use.
-	//*
-	//The payment hash of the invoice to be looked up. When using REST, this field
-	//must be encoded as base64.
+	RHashStr string `protobuf:"bytes,1,opt,name=r_hash_str,proto3" json:"r_hash_str,omitempty"`
+	/// The payment hash of the invoice to be looked up.
 	RHash                []byte   `protobuf:"bytes,2,opt,name=r_hash,proto3" json:"r_hash,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -7375,7 +7333,6 @@ func (m *PaymentHash) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_PaymentHash proto.InternalMessageInfo
 
-// Deprecated: Do not use.
 func (m *PaymentHash) GetRHashStr() string {
 	if m != nil {
 		return m.RHashStr
@@ -8762,8 +8719,7 @@ type ChannelBackup struct {
 	//*
 	//Is an encrypted single-chan backup. this can be passed to
 	//RestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in
-	//order to trigger the recovery protocol. When using REST, this field must be
-	//encoded as base64.
+	//order to trigger the recovery protocol.
 	ChanBackup           []byte   `protobuf:"bytes,2,opt,name=chan_backup,proto3" json:"chan_backup,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -8816,8 +8772,7 @@ type MultiChanBackup struct {
 	//*
 	//A single encrypted blob containing all the static channel backups of the
 	//channel listed above. This can be stored as a single file or blob, and
-	//safely be replaced with any prior/future versions. When using REST, this
-	//field must be encoded as base64.
+	//safely be replaced with any prior/future versions.
 	MultiChanBackup      []byte   `protobuf:"bytes,2,opt,name=multi_chan_backup,proto3" json:"multi_chan_backup,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -9446,550 +9401,550 @@ func init() {
 func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
 
 var fileDescriptor_77a6da22d6a3feb1 = []byte{
-	// 8685 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5d, 0x6c, 0x24, 0x59,
-	0x96, 0x17, 0x5e, 0xf9, 0x65, 0x67, 0x9e, 0x4c, 0xdb, 0xe9, 0x6b, 0x97, 0x9d, 0x95, 0x5d, 0x5d,
-	0xed, 0x8e, 0xa9, 0xed, 0xaa, 0xa9, 0xe9, 0x71, 0x55, 0x7b, 0x66, 0xfa, 0x5f, 0xdb, 0xf5, 0x5f,
-	0x16, 0x7f, 0x55, 0xb9, 0xa6, 0x5d, 0x2e, 0x4f, 0xb8, 0x6a, 0x8a, 0x99, 0xd9, 0x55, 0x4e, 0x38,
-	0xf3, 0xda, 0x8e, 0xa9, 0xcc, 0x88, 0x9c, 0x88, 0x48, 0xbb, 0x3c, 0x4d, 0x23, 0x81, 0x10, 0x42,
-	0xbc, 0xa0, 0x01, 0x21, 0x01, 0x02, 0xad, 0x34, 0x8b, 0xc4, 0x2e, 0x3c, 0xc0, 0x0b, 0x12, 0xa0,
-	0x95, 0x78, 0xe0, 0x01, 0x09, 0x09, 0xf1, 0xc0, 0x03, 0x12, 0x0f, 0x8c, 0x10, 0x48, 0x68, 0xc5,
-	0x1b, 0xd2, 0xbe, 0xa3, 0x73, 0xee, 0x47, 0xdc, 0x1b, 0x11, 0x59, 0xae, 0x9e, 0x19, 0x78, 0x72,
-	0xde, 0xdf, 0xbd, 0x71, 0x3f, 0xcf, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xbd, 0x86, 0x46, 0x34, 0xee,
-	0xaf, 0x8f, 0xa3, 0x30, 0x09, 0x59, 0x6d, 0x18, 0x44, 0xe3, 0x7e, 0xf7, 0xe6, 0x69, 0x18, 0x9e,
-	0x0e, 0xf9, 0x7d, 0x6f, 0xec, 0xdf, 0xf7, 0x82, 0x20, 0x4c, 0xbc, 0xc4, 0x0f, 0x83, 0x58, 0x14,
-	0x72, 0x7e, 0x0c, 0xf3, 0x4f, 0x78, 0x70, 0xc4, 0xf9, 0xc0, 0xe5, 0x3f, 0x9d, 0xf0, 0x38, 0x61,
-	0xdf, 0x80, 0x45, 0x8f, 0xff, 0x8c, 0xf3, 0x41, 0x6f, 0xec, 0xc5, 0xf1, 0xf8, 0x2c, 0xf2, 0x62,
-	0xde, 0x29, 0xad, 0x95, 0xee, 0xb6, 0xdc, 0xb6, 0xc8, 0x38, 0xd4, 0x38, 0xfb, 0x10, 0x5a, 0x31,
-	0x16, 0xe5, 0x41, 0x12, 0x85, 0xe3, 0xcb, 0x4e, 0x99, 0xca, 0x35, 0x11, 0xdb, 0x15, 0x90, 0x33,
-	0x84, 0x05, 0xdd, 0x42, 0x3c, 0x0e, 0x83, 0x98, 0xb3, 0x07, 0xb0, 0xdc, 0xf7, 0xc7, 0x67, 0x3c,
-	0xea, 0xd1, 0xc7, 0xa3, 0x80, 0x8f, 0xc2, 0xc0, 0xef, 0x77, 0x4a, 0x6b, 0x95, 0xbb, 0x0d, 0x97,
-	0x89, 0x3c, 0xfc, 0xe2, 0x99, 0xcc, 0x61, 0x77, 0x60, 0x81, 0x07, 0x02, 0xe7, 0x03, 0xfa, 0x4a,
-	0x36, 0x35, 0x9f, 0xc2, 0xf8, 0x81, 0xf3, 0xd7, 0xcb, 0xb0, 0xf8, 0x34, 0xf0, 0x93, 0x57, 0xde,
-	0x70, 0xc8, 0x13, 0x35, 0xa6, 0x3b, 0xb0, 0x70, 0x41, 0x00, 0x8d, 0xe9, 0x22, 0x8c, 0x06, 0x72,
-	0x44, 0xf3, 0x02, 0x3e, 0x94, 0xe8, 0xd4, 0x9e, 0x95, 0xa7, 0xf6, 0xac, 0x70, 0xba, 0x2a, 0x53,
-	0xa6, 0xeb, 0x0e, 0x2c, 0x44, 0xbc, 0x1f, 0x9e, 0xf3, 0xe8, 0xb2, 0x77, 0xe1, 0x07, 0x83, 0xf0,
-	0xa2, 0x53, 0x5d, 0x2b, 0xdd, 0xad, 0xb9, 0xf3, 0x0a, 0x7e, 0x45, 0x28, 0xdb, 0x82, 0x85, 0xfe,
-	0x99, 0x17, 0x04, 0x7c, 0xd8, 0x3b, 0xf6, 0xfa, 0xaf, 0x27, 0xe3, 0xb8, 0x53, 0x5b, 0x2b, 0xdd,
-	0x6d, 0x6e, 0xdc, 0x58, 0xa7, 0x55, 0x5d, 0xdf, 0x3e, 0xf3, 0x82, 0x2d, 0xca, 0x39, 0x0a, 0xbc,
-	0x71, 0x7c, 0x16, 0x26, 0xee, 0xbc, 0xfc, 0x42, 0xc0, 0xb1, 0xb3, 0x0c, 0xcc, 0x9c, 0x09, 0x31,
-	0xf7, 0xce, 0x3f, 0x2d, 0xc1, 0xd2, 0xcb, 0x60, 0x18, 0xf6, 0x5f, 0xff, 0x8a, 0x53, 0x54, 0x30,
-	0x86, 0xf2, 0xbb, 0x8e, 0xa1, 0xf2, 0x55, 0xc7, 0xb0, 0x02, 0xcb, 0x76, 0x67, 0xe5, 0x28, 0x38,
-	0x5c, 0xc7, 0xaf, 0x4f, 0xb9, 0xea, 0x96, 0x1a, 0xc6, 0xd7, 0xa1, 0xdd, 0x9f, 0x44, 0x11, 0x0f,
-	0x72, 0xe3, 0x58, 0x90, 0xb8, 0x1e, 0xc8, 0x87, 0xd0, 0x0a, 0xf8, 0x45, 0x5a, 0x4c, 0xd2, 0x6e,
-	0xc0, 0x2f, 0x54, 0x11, 0xa7, 0x03, 0x2b, 0xd9, 0x66, 0x64, 0x07, 0xfe, 0x5b, 0x09, 0xaa, 0x2f,
-	0x93, 0x37, 0x21, 0x5b, 0x87, 0x6a, 0x72, 0x39, 0x16, 0x1c, 0x32, 0xbf, 0xc1, 0xe4, 0xd0, 0x36,
-	0x07, 0x83, 0x88, 0xc7, 0xf1, 0x8b, 0xcb, 0x31, 0x77, 0x5b, 0x9e, 0x48, 0xf4, 0xb0, 0x1c, 0xeb,
-	0xc0, 0xac, 0x4c, 0x53, 0x83, 0x0d, 0x57, 0x25, 0xd9, 0x2d, 0x00, 0x6f, 0x14, 0x4e, 0x82, 0xa4,
-	0x17, 0x7b, 0x09, 0x4d, 0x55, 0xc5, 0x35, 0x10, 0x76, 0x13, 0x1a, 0xe3, 0xd7, 0xbd, 0xb8, 0x1f,
-	0xf9, 0xe3, 0x84, 0xc8, 0xa6, 0xe1, 0xa6, 0x00, 0xfb, 0x06, 0xd4, 0xc3, 0x49, 0x32, 0x0e, 0xfd,
-	0x20, 0x91, 0xa4, 0xb2, 0x20, 0xfb, 0xf2, 0x7c, 0x92, 0x1c, 0x22, 0xec, 0xea, 0x02, 0xec, 0x36,
-	0xcc, 0xf5, 0xc3, 0xe0, 0xc4, 0x8f, 0x46, 0x42, 0x18, 0x74, 0x66, 0xa8, 0x35, 0x1b, 0x74, 0xfe,
-	0x55, 0x19, 0x9a, 0x2f, 0x22, 0x2f, 0x88, 0xbd, 0x3e, 0x02, 0xd8, 0xf5, 0xe4, 0x4d, 0xef, 0xcc,
-	0x8b, 0xcf, 0x68, 0xb4, 0x0d, 0x57, 0x25, 0xd9, 0x0a, 0xcc, 0x88, 0x8e, 0xd2, 0x98, 0x2a, 0xae,
-	0x4c, 0xb1, 0x8f, 0x61, 0x31, 0x98, 0x8c, 0x7a, 0x76, 0x5b, 0x15, 0xa2, 0x96, 0x7c, 0x06, 0x4e,
-	0xc0, 0x31, 0xae, 0xb5, 0x68, 0x42, 0x8c, 0xd0, 0x40, 0x98, 0x03, 0x2d, 0x99, 0xe2, 0xfe, 0xe9,
-	0x99, 0x18, 0x66, 0xcd, 0xb5, 0x30, 0xac, 0x23, 0xf1, 0x47, 0xbc, 0x17, 0x27, 0xde, 0x68, 0x2c,
-	0x87, 0x65, 0x20, 0x94, 0x1f, 0x26, 0xde, 0xb0, 0x77, 0xc2, 0x79, 0xdc, 0x99, 0x95, 0xf9, 0x1a,
-	0x61, 0x1f, 0xc1, 0xfc, 0x80, 0xc7, 0x49, 0x4f, 0x2e, 0x0a, 0x8f, 0x3b, 0x75, 0x62, 0xfd, 0x0c,
-	0x8a, 0xf5, 0x44, 0xde, 0x45, 0x0f, 0x27, 0x80, 0xbf, 0xe9, 0x34, 0x44, 0x5f, 0x53, 0x04, 0x29,
-	0xe7, 0x09, 0x4f, 0x8c, 0xd9, 0x8b, 0x25, 0x85, 0x3a, 0xfb, 0xc0, 0x0c, 0x78, 0x87, 0x27, 0x9e,
-	0x3f, 0x8c, 0xd9, 0xa7, 0xd0, 0x4a, 0x8c, 0xc2, 0x24, 0x0a, 0x9b, 0x9a, 0x9c, 0x8c, 0x0f, 0x5c,
-	0xab, 0x9c, 0xf3, 0x04, 0xea, 0x8f, 0x39, 0xdf, 0xf7, 0x47, 0x7e, 0xc2, 0x56, 0xa0, 0x76, 0xe2,
-	0xbf, 0xe1, 0x82, 0xe0, 0x2b, 0x7b, 0xd7, 0x5c, 0x91, 0x64, 0x5d, 0x98, 0x1d, 0xf3, 0xa8, 0xcf,
-	0xd5, 0xf2, 0xec, 0x5d, 0x73, 0x15, 0xb0, 0x35, 0x0b, 0xb5, 0x21, 0x7e, 0xec, 0xfc, 0x59, 0x05,
-	0x9a, 0x47, 0x3c, 0xd0, 0x8c, 0xc4, 0xa0, 0x8a, 0x43, 0x96, 0xcc, 0x43, 0xbf, 0xd9, 0xd7, 0xa0,
-	0x49, 0xd3, 0x10, 0x27, 0x91, 0x1f, 0x9c, 0x0a, 0xfa, 0xdd, 0x2a, 0x77, 0x4a, 0x2e, 0x20, 0x7c,
-	0x44, 0x28, 0x6b, 0x43, 0xc5, 0x1b, 0x29, 0xfa, 0xc5, 0x9f, 0xc8, 0x68, 0x63, 0xef, 0x72, 0x84,
-	0x3c, 0xa9, 0x57, 0xb6, 0xe5, 0x36, 0x25, 0xb6, 0x87, 0x4b, 0xbb, 0x01, 0x4b, 0x66, 0x11, 0xd5,
-	0x42, 0x4d, 0xb7, 0xb0, 0x68, 0x94, 0x96, 0x0d, 0xdd, 0x81, 0x05, 0xf5, 0x4d, 0x24, 0x3a, 0x4d,
-	0xeb, 0xdd, 0x70, 0xe7, 0x25, 0xac, 0x86, 0x72, 0x17, 0xda, 0x27, 0x7e, 0xe0, 0x0d, 0x7b, 0xfd,
-	0x61, 0x72, 0xde, 0x1b, 0xf0, 0x61, 0xe2, 0xd1, 0xca, 0xd7, 0xdc, 0x79, 0xc2, 0xb7, 0x87, 0xc9,
-	0xf9, 0x0e, 0xa2, 0xec, 0x63, 0x68, 0x9c, 0x70, 0xde, 0xa3, 0x19, 0xe9, 0xd4, 0x2d, 0x2e, 0x52,
-	0xb3, 0xec, 0xd6, 0x4f, 0xd4, 0x7c, 0x7f, 0x0c, 0xed, 0x70, 0x92, 0x9c, 0x86, 0x7e, 0x70, 0xda,
-	0x43, 0xb9, 0xd5, 0xf3, 0x07, 0x44, 0x09, 0xd5, 0xad, 0xf2, 0x83, 0x92, 0x3b, 0xaf, 0xf2, 0x50,
-	0x82, 0x3c, 0x1d, 0xb0, 0xf7, 0x01, 0xa8, 0x7d, 0x51, 0x39, 0xac, 0x95, 0xee, 0xce, 0xb9, 0x0d,
-	0x44, 0x44, 0x65, 0x9f, 0x41, 0x9d, 0xe6, 0x36, 0x19, 0x9e, 0x77, 0x9a, 0xb4, 0xf8, 0x1f, 0xc8,
-	0x96, 0x8d, 0x55, 0x59, 0xdf, 0xe1, 0x71, 0xf2, 0x62, 0x78, 0x8e, 0x7b, 0xeb, 0xa5, 0x3b, 0x3b,
-	0x10, 0xa9, 0xee, 0x67, 0xd0, 0x32, 0x33, 0x70, 0x09, 0x5e, 0xf3, 0x4b, 0x5a, 0xba, 0xaa, 0x8b,
-	0x3f, 0xd9, 0x32, 0xd4, 0xce, 0xbd, 0xe1, 0x84, 0x4b, 0x21, 0x27, 0x12, 0x9f, 0x95, 0x1f, 0x96,
-	0x9c, 0x7f, 0x59, 0x82, 0x96, 0x68, 0x41, 0x6e, 0xce, 0xb7, 0x61, 0x4e, 0x4d, 0x2b, 0x8f, 0xa2,
-	0x30, 0x92, 0xbc, 0x6e, 0x83, 0xec, 0x1e, 0xb4, 0x15, 0x30, 0x8e, 0xb8, 0x3f, 0xf2, 0x4e, 0x55,
-	0xdd, 0x39, 0x9c, 0x6d, 0xa4, 0x35, 0x46, 0xe1, 0x24, 0xe1, 0x72, 0x1b, 0x68, 0xc9, 0xf1, 0xb9,
-	0x88, 0xb9, 0x76, 0x11, 0xe4, 0xf5, 0x02, 0x9a, 0xb1, 0x30, 0xe7, 0xef, 0x94, 0x80, 0x61, 0xd7,
-	0x5f, 0x84, 0xa2, 0x0a, 0xb9, 0xdc, 0x59, 0x72, 0x2b, 0xbd, 0x33, 0xb9, 0x95, 0xdf, 0x46, 0x6e,
-	0x0e, 0xd4, 0x44, 0xef, 0xab, 0x05, 0xbd, 0x17, 0x59, 0xdf, 0xad, 0xd6, 0x2b, 0xed, 0xaa, 0xf3,
-	0x5f, 0x2a, 0xb0, 0xbc, 0x2d, 0xf6, 0xb1, 0xcd, 0x7e, 0x9f, 0x8f, 0x35, 0x21, 0x7e, 0x00, 0xcd,
-	0x20, 0x1c, 0xf0, 0xde, 0x78, 0x72, 0xac, 0xd6, 0xa7, 0xe5, 0x02, 0x42, 0x87, 0x84, 0x10, 0x8d,
-	0x9c, 0x79, 0x7e, 0x20, 0x3a, 0x2e, 0xe6, 0xb3, 0x41, 0x08, 0x75, 0xfb, 0x23, 0x58, 0x18, 0xf3,
-	0x60, 0x60, 0xd2, 0x9b, 0xd0, 0x34, 0xe6, 0x24, 0x2c, 0x49, 0xed, 0x03, 0x68, 0x9e, 0x4c, 0x44,
-	0x39, 0x64, 0xc5, 0x2a, 0xd1, 0x01, 0x48, 0x68, 0x73, 0x94, 0xb0, 0x1b, 0x50, 0x1f, 0x4f, 0xe2,
-	0x33, 0xca, 0xad, 0x51, 0xee, 0x2c, 0xa6, 0x31, 0xeb, 0x7d, 0x80, 0xc1, 0x24, 0x4e, 0x24, 0x99,
-	0xce, 0x50, 0x66, 0x03, 0x11, 0x41, 0xa6, 0xdf, 0x84, 0xa5, 0x91, 0xf7, 0xa6, 0x47, 0xf4, 0xd3,
-	0xf3, 0x83, 0xde, 0xc9, 0x90, 0x44, 0xf1, 0x2c, 0x95, 0x6b, 0x8f, 0xbc, 0x37, 0xdf, 0xc7, 0x9c,
-	0xa7, 0xc1, 0x63, 0xc2, 0x91, 0x47, 0x95, 0x0e, 0x10, 0xf1, 0x98, 0x47, 0xe7, 0x9c, 0xd8, 0xaa,
-	0xaa, 0x37, 0x7a, 0x57, 0xa0, 0xd8, 0xa3, 0x11, 0x8e, 0x3b, 0x19, 0xf6, 0x05, 0x0f, 0xb9, 0xb3,
-	0x23, 0x3f, 0xd8, 0x4b, 0x86, 0x7d, 0x76, 0x13, 0x00, 0x99, 0x72, 0xcc, 0xa3, 0xde, 0xeb, 0x0b,
-	0x62, 0x9c, 0x2a, 0x31, 0xe1, 0x21, 0x8f, 0x3e, 0xbf, 0x60, 0xef, 0x41, 0xa3, 0x1f, 0x13, 0x57,
-	0x7b, 0x97, 0x9d, 0x26, 0x71, 0x55, 0xbd, 0x1f, 0x23, 0x3f, 0x7b, 0x97, 0xec, 0x63, 0x60, 0xd8,
-	0x5b, 0x8f, 0x56, 0x81, 0x0f, 0xa8, 0xfa, 0xb8, 0xd3, 0xa2, 0x52, 0xd8, 0xd9, 0x4d, 0x99, 0x81,
-	0xed, 0xc4, 0xec, 0x6b, 0x30, 0xa7, 0x3a, 0x7b, 0x32, 0xf4, 0x4e, 0xe3, 0xce, 0x1c, 0x15, 0x6c,
-	0x49, 0xf0, 0x31, 0x62, 0xce, 0x2b, 0xa1, 0x79, 0x18, 0x6b, 0x2b, 0xf9, 0x06, 0xf7, 0x40, 0x42,
-	0x68, 0x5d, 0xeb, 0xae, 0x4c, 0x15, 0x2d, 0x5a, 0xb9, 0x60, 0xd1, 0x9c, 0x5f, 0x94, 0xa0, 0x25,
-	0x6b, 0xa6, 0xed, 0x9a, 0x3d, 0x00, 0xa6, 0x56, 0x31, 0x79, 0xe3, 0x0f, 0x7a, 0xc7, 0x97, 0x09,
-	0x8f, 0x05, 0xd1, 0xec, 0x5d, 0x73, 0x0b, 0xf2, 0x50, 0x20, 0x59, 0x68, 0x9c, 0x44, 0x82, 0xa6,
-	0xf7, 0xae, 0xb9, 0xb9, 0x1c, 0x64, 0x31, 0x54, 0x08, 0x26, 0x49, 0xcf, 0x0f, 0x06, 0xfc, 0x0d,
-	0x91, 0xd2, 0x9c, 0x6b, 0x61, 0x5b, 0xf3, 0xd0, 0x32, 0xbf, 0x73, 0x7e, 0x02, 0x75, 0xa5, 0x4e,
-	0xd0, 0x56, 0x9a, 0xe9, 0x97, 0x6b, 0x20, 0xac, 0x0b, 0x75, 0xbb, 0x17, 0x6e, 0xfd, 0xab, 0xb4,
-	0xed, 0xfc, 0x39, 0x68, 0xef, 0x23, 0x11, 0x05, 0x48, 0xb4, 0x52, 0x47, 0x5a, 0x81, 0x19, 0x83,
-	0x79, 0x1a, 0xae, 0x4c, 0xe1, 0x6e, 0x75, 0x16, 0xc6, 0x89, 0x6c, 0x87, 0x7e, 0x3b, 0xff, 0xae,
-	0x04, 0x6c, 0x37, 0x4e, 0xfc, 0x91, 0x97, 0xf0, 0xc7, 0x5c, 0x8b, 0x87, 0xe7, 0xd0, 0xc2, 0xda,
-	0x5e, 0x84, 0x9b, 0x42, 0x63, 0x11, 0x3b, 0xed, 0x37, 0x24, 0x3b, 0xe7, 0x3f, 0x58, 0x37, 0x4b,
-	0x0b, 0xc1, 0x6b, 0x55, 0x80, 0xdc, 0x96, 0x78, 0xd1, 0x29, 0x4f, 0x48, 0x9d, 0x91, 0xca, 0x30,
-	0x08, 0x68, 0x3b, 0x0c, 0x4e, 0xba, 0xbf, 0x0b, 0x8b, 0xb9, 0x3a, 0x4c, 0x19, 0xdd, 0x28, 0x90,
-	0xd1, 0x15, 0x53, 0x46, 0xf7, 0x61, 0xc9, 0xea, 0x97, 0xa4, 0xb8, 0x0e, 0xcc, 0x22, 0x63, 0xa0,
-	0xb6, 0x48, 0x3b, 0xbe, 0xab, 0x92, 0x6c, 0x03, 0x96, 0x4f, 0x38, 0x8f, 0xbc, 0x84, 0x92, 0xc4,
-	0x3a, 0xb8, 0x26, 0xb2, 0xe6, 0xc2, 0x3c, 0xe7, 0xbf, 0x97, 0x60, 0x01, 0xa5, 0xe9, 0x33, 0x2f,
-	0xb8, 0x54, 0x73, 0xb5, 0x5f, 0x38, 0x57, 0x77, 0x8d, 0x8d, 0xc9, 0x28, 0xfd, 0x55, 0x27, 0xaa,
-	0x92, 0x9d, 0x28, 0xb6, 0x06, 0x2d, 0xab, 0xbb, 0x35, 0xa1, 0x9e, 0xc5, 0x5e, 0x72, 0xc8, 0xa3,
-	0xad, 0xcb, 0x84, 0xff, 0xfa, 0x53, 0xf9, 0x11, 0xb4, 0xd3, 0x6e, 0xcb, 0x79, 0x64, 0x50, 0x45,
-	0xc2, 0x94, 0x15, 0xd0, 0x6f, 0xe7, 0x1f, 0x94, 0x44, 0xc1, 0xed, 0xd0, 0xd7, 0xaa, 0x1b, 0x16,
-	0x44, 0x0d, 0x50, 0x15, 0xc4, 0xdf, 0x53, 0x55, 0xdf, 0x5f, 0x7f, 0xb0, 0x28, 0x13, 0x63, 0x1e,
-	0x0c, 0x7a, 0xde, 0x70, 0x48, 0x82, 0xb8, 0xee, 0xce, 0x62, 0x7a, 0x73, 0x38, 0x74, 0xee, 0xc0,
-	0xa2, 0xd1, 0xbb, 0xb7, 0x8c, 0xe3, 0x00, 0xd8, 0xbe, 0x1f, 0x27, 0x2f, 0x83, 0x78, 0x6c, 0x68,
-	0x44, 0xef, 0x41, 0x03, 0xa5, 0x2d, 0xf6, 0x4c, 0x70, 0x6e, 0xcd, 0x45, 0xf1, 0x8b, 0xfd, 0x8a,
-	0x29, 0xd3, 0x7b, 0x23, 0x33, 0xcb, 0x32, 0xd3, 0x7b, 0x43, 0x99, 0xce, 0x43, 0x58, 0xb2, 0xea,
-	0x93, 0x4d, 0x7f, 0x08, 0xb5, 0x49, 0xf2, 0x26, 0x54, 0x7a, 0x6b, 0x53, 0x52, 0x08, 0x5a, 0x48,
-	0xae, 0xc8, 0x71, 0x1e, 0xc1, 0xe2, 0x01, 0xbf, 0x90, 0x8c, 0xac, 0x3a, 0xf2, 0xd1, 0x95, 0xd6,
-	0x13, 0xe5, 0x3b, 0xeb, 0xc0, 0xcc, 0x8f, 0x53, 0x06, 0x50, 0xb6, 0x54, 0xc9, 0xb2, 0xa5, 0x9c,
-	0x8f, 0x80, 0x1d, 0xf9, 0xa7, 0xc1, 0x33, 0x1e, 0xc7, 0xde, 0xa9, 0x66, 0xfd, 0x36, 0x54, 0x46,
-	0xf1, 0xa9, 0x14, 0x55, 0xf8, 0xd3, 0xf9, 0x16, 0x2c, 0x59, 0xe5, 0x64, 0xc5, 0x37, 0xa1, 0x11,
-	0xfb, 0xa7, 0x81, 0x97, 0x4c, 0x22, 0x2e, 0xab, 0x4e, 0x01, 0xe7, 0x31, 0x2c, 0x7f, 0x9f, 0x47,
-	0xfe, 0xc9, 0xe5, 0x55, 0xd5, 0xdb, 0xf5, 0x94, 0xb3, 0xf5, 0xec, 0xc2, 0xf5, 0x4c, 0x3d, 0xb2,
-	0x79, 0x41, 0xbe, 0x72, 0x25, 0xeb, 0xae, 0x48, 0x18, 0xb2, 0xaf, 0x6c, 0xca, 0x3e, 0xe7, 0x25,
-	0xb0, 0xed, 0x30, 0x08, 0x78, 0x3f, 0x39, 0xe4, 0x3c, 0x4a, 0xdd, 0x38, 0x29, 0xad, 0x36, 0x37,
-	0x56, 0xe5, 0xcc, 0x66, 0x05, 0xaa, 0x24, 0x62, 0x06, 0xd5, 0x31, 0x8f, 0x46, 0x54, 0x71, 0xdd,
-	0xa5, 0xdf, 0xce, 0x75, 0x58, 0xb2, 0xaa, 0x95, 0x86, 0xef, 0x27, 0x70, 0x7d, 0xc7, 0x8f, 0xfb,
-	0xf9, 0x06, 0x3b, 0x30, 0x3b, 0x9e, 0x1c, 0xf7, 0x52, 0x4e, 0x54, 0x49, 0xb4, 0x85, 0xb2, 0x9f,
-	0xc8, 0xca, 0xfe, 0x5a, 0x09, 0xaa, 0x7b, 0x2f, 0xf6, 0xb7, 0x71, 0xaf, 0xf0, 0x83, 0x7e, 0x38,
-	0x42, 0x2d, 0x4c, 0x0c, 0x5a, 0xa7, 0xa7, 0x72, 0xd8, 0x4d, 0x68, 0x90, 0xf2, 0x86, 0xe6, 0x9f,
-	0xd4, 0x83, 0x52, 0x00, 0x4d, 0x4f, 0xfe, 0x66, 0xec, 0x47, 0x64, 0x5b, 0x2a, 0x8b, 0xb1, 0x4a,
-	0xdb, 0x4c, 0x3e, 0xc3, 0xf9, 0xc5, 0x2c, 0xcc, 0xca, 0xcd, 0x57, 0x6c, 0xe4, 0x89, 0x7f, 0xce,
-	0xd3, 0x8d, 0x1c, 0x53, 0xa8, 0x18, 0x47, 0x7c, 0x14, 0x26, 0x5a, 0x7f, 0x13, 0xcb, 0x60, 0x83,
-	0x64, 0x5a, 0x4b, 0x25, 0x42, 0x18, 0xe3, 0x15, 0x51, 0xca, 0x02, 0xd9, 0x4d, 0x98, 0x55, 0xca,
-	0x40, 0x55, 0x5b, 0x0c, 0x0a, 0xc2, 0xd9, 0xe8, 0x7b, 0x63, 0xaf, 0xef, 0x27, 0x97, 0x52, 0x2c,
-	0xe8, 0x34, 0xd6, 0x3f, 0x0c, 0xfb, 0xde, 0xb0, 0x77, 0xec, 0x0d, 0xbd, 0xa0, 0xcf, 0x95, 0xe9,
-	0x6e, 0x81, 0x68, 0xc6, 0xca, 0x6e, 0xa9, 0x62, 0xc2, 0xd4, 0xcd, 0xa0, 0xb8, 0x87, 0xf7, 0xc3,
-	0xd1, 0xc8, 0x4f, 0xd0, 0xfa, 0x25, 0xd5, 0xac, 0xe2, 0x1a, 0x88, 0x70, 0x14, 0x50, 0xea, 0x42,
-	0xcc, 0x60, 0x43, 0x39, 0x0a, 0x0c, 0x10, 0x6b, 0xc9, 0x68, 0x68, 0x15, 0xd7, 0x40, 0x70, 0x2d,
-	0x26, 0x41, 0xcc, 0x93, 0x64, 0xc8, 0x07, 0xba, 0x43, 0x4d, 0x2a, 0x96, 0xcf, 0x60, 0x0f, 0x60,
-	0x49, 0x18, 0xe4, 0xb1, 0x97, 0x84, 0xf1, 0x99, 0x1f, 0xf7, 0x62, 0x34, 0x5d, 0x5b, 0x54, 0xbe,
-	0x28, 0x8b, 0x3d, 0x84, 0xd5, 0x0c, 0x1c, 0xf1, 0x3e, 0xf7, 0xcf, 0xf9, 0x80, 0x54, 0xb8, 0x8a,
-	0x3b, 0x2d, 0x9b, 0xad, 0x41, 0x33, 0x98, 0x8c, 0x7a, 0x93, 0xf1, 0xc0, 0x43, 0x25, 0x66, 0x9e,
-	0x94, 0x4b, 0x13, 0x62, 0x9f, 0x80, 0xd2, 0xd3, 0xa4, 0xf6, 0xb8, 0x60, 0x49, 0x38, 0xa4, 0x5e,
-	0xd7, 0x2e, 0x81, 0x84, 0x99, 0xaa, 0xa4, 0x6d, 0x69, 0xe8, 0x29, 0x80, 0xf8, 0x24, 0xf2, 0xcf,
-	0xbd, 0x84, 0x77, 0x16, 0x85, 0x50, 0x97, 0x49, 0xfc, 0xce, 0x0f, 0xfc, 0xc4, 0xf7, 0x92, 0x30,
-	0xea, 0x30, 0xca, 0x4b, 0x01, 0x9c, 0x44, 0xa2, 0x8f, 0x38, 0xf1, 0x92, 0x49, 0x2c, 0x35, 0xd4,
-	0x25, 0x22, 0xae, 0x7c, 0x06, 0xfb, 0x14, 0x56, 0x04, 0x45, 0x50, 0x96, 0xd4, 0xbd, 0x49, 0x55,
-	0x58, 0xa6, 0x19, 0x99, 0x92, 0x8b, 0x53, 0x29, 0x49, 0x24, 0xf7, 0xe1, 0x75, 0x31, 0x95, 0x53,
-	0xb2, 0xb1, 0x7f, 0xd8, 0x03, 0xbf, 0xdf, 0x93, 0x25, 0x90, 0x45, 0x56, 0x68, 0x14, 0xf9, 0x0c,
-	0x24, 0xf1, 0xa1, 0x7f, 0xc2, 0x13, 0x7f, 0xc4, 0x3b, 0xab, 0x82, 0xc4, 0x55, 0x1a, 0x19, 0x70,
-	0x32, 0xa6, 0x9c, 0x8e, 0x60, 0x78, 0x91, 0x72, 0xfe, 0xa0, 0x24, 0x36, 0x1f, 0xc9, 0xa8, 0xb1,
-	0x61, 0x56, 0x09, 0x16, 0xed, 0x85, 0xc1, 0xf0, 0x52, 0x72, 0x2d, 0x08, 0xe8, 0x79, 0x30, 0xbc,
-	0x44, 0xc5, 0xde, 0x0f, 0xcc, 0x22, 0x42, 0xce, 0xb5, 0x14, 0x48, 0x85, 0x3e, 0x80, 0xe6, 0x78,
-	0x72, 0x3c, 0xf4, 0xfb, 0xa2, 0x48, 0x45, 0xd4, 0x22, 0x20, 0x2a, 0x80, 0x76, 0xa5, 0x58, 0x29,
-	0x51, 0xa2, 0x4a, 0x25, 0x9a, 0x12, 0xc3, 0x22, 0xce, 0x16, 0x2c, 0xdb, 0x1d, 0x94, 0x02, 0xfd,
-	0x1e, 0xd4, 0x25, 0xff, 0xc7, 0xd2, 0xb8, 0x9f, 0x37, 0x7c, 0xa0, 0x68, 0x06, 0xe9, 0x7c, 0xe7,
-	0x5f, 0x57, 0x61, 0x49, 0xa2, 0xdb, 0xc3, 0x30, 0xe6, 0x47, 0x93, 0xd1, 0xc8, 0x8b, 0x0a, 0x04,
-	0x4b, 0xe9, 0x0a, 0xc1, 0x52, 0xce, 0x0b, 0x96, 0x5b, 0x96, 0x7d, 0x29, 0x24, 0x93, 0x81, 0xb0,
-	0xbb, 0xb0, 0xd0, 0x1f, 0x86, 0xb1, 0x50, 0xf7, 0x4d, 0x37, 0x5c, 0x16, 0xce, 0x0b, 0xc3, 0x5a,
-	0x91, 0x30, 0x34, 0x05, 0xd9, 0x4c, 0x46, 0x90, 0x39, 0xd0, 0xc2, 0x4a, 0xb9, 0x92, 0xcd, 0xb3,
-	0xd2, 0xd8, 0x32, 0x30, 0xec, 0x4f, 0x56, 0x6c, 0x08, 0x19, 0xb5, 0x50, 0x24, 0x34, 0xfc, 0x11,
-	0x27, 0xd9, 0x6f, 0x94, 0x6e, 0x48, 0xa1, 0x91, 0xcf, 0x62, 0x8f, 0x01, 0x44, 0x5b, 0xa4, 0x80,
-	0x00, 0x29, 0x20, 0x1f, 0xd9, 0xab, 0x62, 0xce, 0xff, 0x3a, 0x26, 0x26, 0x11, 0x27, 0xa5, 0xc4,
-	0xf8, 0xd2, 0xf9, 0x1b, 0x25, 0x68, 0x1a, 0x79, 0xec, 0x3a, 0x2c, 0x6e, 0x3f, 0x7f, 0x7e, 0xb8,
-	0xeb, 0x6e, 0xbe, 0x78, 0xfa, 0xfd, 0xdd, 0xde, 0xf6, 0xfe, 0xf3, 0xa3, 0xdd, 0xf6, 0x35, 0x84,
-	0xf7, 0x9f, 0x6f, 0x6f, 0xee, 0xf7, 0x1e, 0x3f, 0x77, 0xb7, 0x15, 0x5c, 0x62, 0x2b, 0xc0, 0xdc,
-	0xdd, 0x67, 0xcf, 0x5f, 0xec, 0x5a, 0x78, 0x99, 0xb5, 0xa1, 0xb5, 0xe5, 0xee, 0x6e, 0x6e, 0xef,
-	0x49, 0xa4, 0xc2, 0x96, 0xa1, 0xfd, 0xf8, 0xe5, 0xc1, 0xce, 0xd3, 0x83, 0x27, 0xbd, 0xed, 0xcd,
-	0x83, 0xed, 0xdd, 0xfd, 0xdd, 0x9d, 0x76, 0x95, 0xcd, 0x41, 0x63, 0x73, 0x6b, 0xf3, 0x60, 0xe7,
-	0xf9, 0xc1, 0xee, 0x4e, 0xbb, 0xe6, 0xfc, 0xd7, 0x12, 0x5c, 0xa7, 0x5e, 0x0f, 0xb2, 0x4c, 0xb2,
-	0x06, 0xcd, 0x7e, 0x18, 0x8e, 0x51, 0xf1, 0x4f, 0xb7, 0x36, 0x13, 0x42, 0x06, 0x10, 0x42, 0xe1,
-	0x24, 0x8c, 0xfa, 0x5c, 0xf2, 0x08, 0x10, 0xf4, 0x18, 0x11, 0x64, 0x00, 0xb9, 0xbc, 0xa2, 0x84,
-	0x60, 0x91, 0xa6, 0xc0, 0x44, 0x91, 0x15, 0x98, 0x39, 0x8e, 0xb8, 0xd7, 0x3f, 0x93, 0xdc, 0x21,
-	0x53, 0xec, 0xeb, 0xa9, 0x65, 0xda, 0xc7, 0xd9, 0x1f, 0xf2, 0x01, 0x51, 0x4c, 0xdd, 0x5d, 0x90,
-	0xf8, 0xb6, 0x84, 0x51, 0x0a, 0x7a, 0xc7, 0x5e, 0x30, 0x08, 0x03, 0x3e, 0x90, 0x6a, 0x6f, 0x0a,
-	0x38, 0x87, 0xb0, 0x92, 0x1d, 0x9f, 0xe4, 0xb1, 0x4f, 0x0d, 0x1e, 0x13, 0x5a, 0x68, 0x77, 0xfa,
-	0x6a, 0x1a, 0xfc, 0xf6, 0xcb, 0x32, 0x54, 0x51, 0x29, 0x99, 0xae, 0xc0, 0x98, 0x7a, 0x66, 0x25,
-	0xe7, 0xb3, 0x27, 0x63, 0x57, 0x6c, 0x51, 0xd2, 0xd1, 0x92, 0x22, 0x69, 0x7e, 0xc4, 0xfb, 0xe7,
-	0xd2, 0xd5, 0x62, 0x20, 0xc8, 0x20, 0x68, 0x04, 0xd0, 0xd7, 0x92, 0x41, 0x54, 0x5a, 0xe5, 0xd1,
-	0x97, 0xb3, 0x69, 0x1e, 0x7d, 0xd7, 0x81, 0x59, 0x3f, 0x38, 0x0e, 0x27, 0xc1, 0x80, 0x18, 0xa2,
-	0xee, 0xaa, 0x24, 0x9d, 0x12, 0x10, 0xa3, 0xa2, 0xfc, 0x14, 0xe4, 0x9f, 0x02, 0x6c, 0x03, 0x1a,
-	0xf1, 0x65, 0xd0, 0x37, 0x69, 0x7e, 0x59, 0xce, 0x12, 0xce, 0xc1, 0xfa, 0xd1, 0x65, 0xd0, 0x27,
-	0x0a, 0x4f, 0x8b, 0x39, 0xbf, 0x0b, 0x75, 0x05, 0x23, 0x59, 0xbe, 0x3c, 0xf8, 0xfc, 0xe0, 0xf9,
-	0xab, 0x83, 0xde, 0xd1, 0x0f, 0x0e, 0xb6, 0xdb, 0xd7, 0xd8, 0x02, 0x34, 0x37, 0xb7, 0x89, 0xd2,
-	0x09, 0x28, 0x61, 0x91, 0xc3, 0xcd, 0xa3, 0x23, 0x8d, 0x94, 0x1d, 0x86, 0x86, 0x7c, 0x4c, 0x9a,
-	0x9f, 0xf6, 0x82, 0x7f, 0x0a, 0x8b, 0x06, 0x96, 0x5a, 0x11, 0x63, 0x04, 0x32, 0x56, 0x04, 0xa9,
-	0x8c, 0x22, 0xc7, 0x69, 0xc3, 0xfc, 0x13, 0x9e, 0x3c, 0x0d, 0x4e, 0x42, 0x55, 0xd3, 0xff, 0xac,
-	0xc2, 0x82, 0x86, 0x64, 0x45, 0x77, 0x61, 0xc1, 0x1f, 0xf0, 0x20, 0xf1, 0x93, 0xcb, 0x9e, 0xe5,
-	0x2f, 0xc8, 0xc2, 0xa8, 0x6a, 0x7b, 0x43, 0xdf, 0x53, 0x87, 0x31, 0x22, 0x81, 0xf6, 0x33, 0xea,
-	0x00, 0xa6, 0xdf, 0x86, 0xe8, 0x4a, 0xb8, 0x29, 0x0a, 0xf3, 0x50, 0x02, 0x21, 0x2e, 0xb7, 0x19,
-	0xfd, 0x89, 0x50, 0x39, 0x8b, 0xb2, 0x70, 0xa9, 0x44, 0x4d, 0x38, 0xe4, 0x9a, 0xd0, 0x13, 0x34,
-	0x90, 0x3b, 0xed, 0x98, 0x11, 0xf2, 0x31, 0x7b, 0xda, 0x61, 0x9c, 0x98, 0xd4, 0x73, 0x27, 0x26,
-	0x28, 0x3f, 0x2f, 0x83, 0x3e, 0x1f, 0xf4, 0x92, 0xb0, 0x47, 0x72, 0x9e, 0x48, 0xa2, 0xee, 0x66,
-	0x61, 0xdc, 0x37, 0x12, 0x1e, 0x27, 0x01, 0x17, 0xae, 0xe9, 0x3a, 0x79, 0x41, 0x15, 0x84, 0xf6,
-	0xc1, 0x24, 0xf2, 0xe3, 0x4e, 0x8b, 0xce, 0x42, 0xe8, 0x37, 0xfb, 0x36, 0x5c, 0x3f, 0xe6, 0x71,
-	0xd2, 0x3b, 0xe3, 0xde, 0x80, 0x47, 0x44, 0x5e, 0xe2, 0xd0, 0x45, 0xa8, 0x5c, 0xc5, 0x99, 0x48,
-	0xb8, 0xe7, 0x3c, 0x8a, 0xfd, 0x30, 0x20, 0x65, 0xab, 0xe1, 0xaa, 0x24, 0xd6, 0x87, 0x83, 0xd7,
-	0x1b, 0xb5, 0x9e, 0xc1, 0x05, 0x1a, 0x78, 0x71, 0x26, 0xbb, 0x0d, 0x33, 0x34, 0x80, 0xb8, 0xd3,
-	0x26, 0x9a, 0x69, 0xa5, 0x3c, 0xef, 0x07, 0xae, 0xcc, 0xc3, 0x55, 0xee, 0x87, 0xc3, 0x30, 0x22,
-	0x8d, 0xab, 0xe1, 0x8a, 0x84, 0x3d, 0x3b, 0xa7, 0x91, 0x37, 0x3e, 0x93, 0x5a, 0x57, 0x16, 0xfe,
-	0x6e, 0xb5, 0xde, 0x6c, 0xb7, 0x9c, 0xff, 0x0f, 0x6a, 0x54, 0x2d, 0x55, 0x47, 0x93, 0x59, 0x92,
-	0xd5, 0x11, 0xda, 0x81, 0xd9, 0x80, 0x27, 0x17, 0x61, 0xf4, 0x5a, 0x9d, 0xec, 0xc9, 0xa4, 0xf3,
-	0x33, 0xb2, 0xd0, 0xf4, 0x49, 0xd7, 0x4b, 0x52, 0x2d, 0xd1, 0xce, 0x16, 0x4b, 0x15, 0x9f, 0x79,
-	0xd2, 0x68, 0xac, 0x13, 0x70, 0x74, 0xe6, 0xa1, 0xac, 0xb5, 0x56, 0x5f, 0xd8, 0xe1, 0x4d, 0xc2,
-	0xf6, 0xc4, 0xe2, 0xdf, 0x86, 0x79, 0x75, 0x86, 0x16, 0xf7, 0x86, 0xfc, 0x24, 0x51, 0x5e, 0xb4,
-	0x60, 0x32, 0x22, 0x63, 0x7d, 0x9f, 0x9f, 0x24, 0xce, 0x01, 0x2c, 0x4a, 0xf9, 0xf7, 0x7c, 0xcc,
-	0x55, 0xd3, 0xbf, 0x5d, 0xa4, 0x4b, 0x34, 0x37, 0x96, 0x6c, 0x81, 0x29, 0x4e, 0x0d, 0xed, 0x92,
-	0x8e, 0x0b, 0xcc, 0x94, 0xa7, 0xb2, 0x42, 0xb9, 0x99, 0x2b, 0x3f, 0xa1, 0x1c, 0x8e, 0x85, 0xe1,
-	0xfc, 0xc4, 0x93, 0x7e, 0x5f, 0x9d, 0x7c, 0xd6, 0x5d, 0x95, 0x74, 0xfe, 0xa8, 0x04, 0x4b, 0x54,
-	0x9b, 0xd2, 0x86, 0xe4, 0x9e, 0xf5, 0xf0, 0x2b, 0x74, 0x53, 0x79, 0x69, 0x85, 0x6f, 0x72, 0x19,
-	0x6a, 0xe6, 0x2e, 0x26, 0x12, 0x5f, 0xdd, 0x27, 0x53, 0xcd, 0xfa, 0x64, 0x9c, 0xbf, 0x5b, 0x82,
-	0x45, 0xb1, 0x91, 0x90, 0xb6, 0x2d, 0x87, 0xff, 0xff, 0xc3, 0x9c, 0xd0, 0x08, 0xa4, 0x54, 0x90,
-	0x1d, 0x4d, 0x45, 0x2b, 0xa1, 0xa2, 0xf0, 0xde, 0x35, 0xd7, 0x2e, 0xcc, 0x1e, 0x91, 0x56, 0x16,
-	0xf4, 0x08, 0x2d, 0x38, 0x23, 0xb7, 0xe7, 0x7a, 0xef, 0x9a, 0x6b, 0x14, 0xdf, 0xaa, 0xa3, 0xb2,
-	0x8c, 0xb8, 0xf3, 0x04, 0xe6, 0xac, 0x86, 0x2c, 0x7f, 0x50, 0x4b, 0xf8, 0x83, 0x72, 0x8e, 0xd7,
-	0x72, 0x81, 0xe3, 0xf5, 0x5f, 0x54, 0x80, 0x21, 0xb1, 0x64, 0x56, 0x63, 0xcd, 0x3e, 0xbd, 0x50,
-	0xc7, 0xe5, 0x29, 0xc4, 0x36, 0x80, 0x19, 0x49, 0x75, 0xaa, 0x52, 0xd1, 0xa7, 0x2a, 0x05, 0xb9,
-	0x28, 0x6a, 0xa5, 0xd6, 0xa1, 0x4f, 0x2c, 0xc8, 0xd6, 0x17, 0x53, 0x5f, 0x98, 0x87, 0x3b, 0x23,
-	0x1d, 0x5f, 0xa0, 0x55, 0x22, 0xed, 0x63, 0x95, 0xce, 0xae, 0xf1, 0xcc, 0x95, 0x6b, 0x3c, 0x9b,
-	0xf3, 0xbb, 0x19, 0x16, 0x5a, 0xdd, 0xb6, 0xd0, 0x6e, 0xc3, 0x9c, 0x3a, 0xa5, 0xe8, 0x8d, 0xb0,
-	0x75, 0x69, 0x0e, 0x5b, 0x20, 0xbb, 0x07, 0x6d, 0x65, 0x24, 0x69, 0x33, 0x50, 0x9c, 0xf7, 0xe5,
-	0x70, 0xdc, 0x03, 0x52, 0x4f, 0x5c, 0x93, 0x3a, 0x9b, 0x02, 0x64, 0x53, 0x21, 0x95, 0xf4, 0x26,
-	0x81, 0x3c, 0x2a, 0xe7, 0x03, 0x32, 0x84, 0xd1, 0xa6, 0xca, 0x66, 0x38, 0x7f, 0xab, 0x04, 0x6d,
-	0x5c, 0x37, 0x8b, 0x34, 0x3f, 0x03, 0xe2, 0x8c, 0x77, 0xa4, 0x4c, 0xab, 0x2c, 0x7b, 0x08, 0x0d,
-	0x4a, 0x87, 0x63, 0x1e, 0x48, 0xba, 0xec, 0xd8, 0x74, 0x99, 0xca, 0x94, 0xbd, 0x6b, 0x6e, 0x5a,
-	0xd8, 0xa0, 0xca, 0xff, 0x58, 0x82, 0xa6, 0x6c, 0xe5, 0x57, 0xf6, 0xf4, 0x74, 0x8d, 0xd8, 0x06,
-	0xa1, 0x80, 0xa5, 0xa1, 0x0c, 0x77, 0x61, 0x61, 0xe4, 0x25, 0x93, 0x08, 0xf7, 0x74, 0xcb, 0xcb,
-	0x93, 0x85, 0x71, 0x83, 0x26, 0xf1, 0x19, 0xf7, 0x12, 0x7f, 0xd8, 0x53, 0xb9, 0x32, 0x8a, 0xa0,
-	0x28, 0x0b, 0xa5, 0x48, 0x9c, 0x78, 0xa7, 0x5c, 0xee, 0xbd, 0x22, 0xe1, 0x74, 0x60, 0xe5, 0x30,
-	0x3d, 0xb9, 0x31, 0x74, 0x6c, 0xe7, 0x9f, 0xcd, 0xc1, 0x6a, 0x2e, 0x4b, 0xc7, 0x3c, 0x49, 0xd7,
-	0xc5, 0xd0, 0x1f, 0x1d, 0x87, 0xda, 0x40, 0x29, 0x99, 0x5e, 0x0d, 0x2b, 0x8b, 0x9d, 0xc2, 0x75,
-	0xa5, 0x64, 0xe0, 0x9c, 0xa6, 0x1b, 0x62, 0x99, 0x76, 0xba, 0x4f, 0xec, 0x25, 0xcc, 0x36, 0xa8,
-	0x70, 0x93, 0x91, 0x8b, 0xeb, 0x63, 0x67, 0xd0, 0xd1, 0xda, 0x8c, 0x14, 0xd8, 0x86, 0xc6, 0x83,
-	0x6d, 0x7d, 0x7c, 0x45, 0x5b, 0x96, 0x4a, 0xee, 0x4e, 0xad, 0x8d, 0x5d, 0xc2, 0x2d, 0x95, 0x47,
-	0x12, 0x39, 0xdf, 0x5e, 0xf5, 0x9d, 0xc6, 0x46, 0xc6, 0x86, 0xdd, 0xe8, 0x15, 0x15, 0xb3, 0x9f,
-	0xc0, 0xca, 0x85, 0xe7, 0x27, 0xaa, 0x5b, 0x86, 0x7e, 0x51, 0xa3, 0x26, 0x37, 0xae, 0x68, 0xf2,
-	0x95, 0xf8, 0xd8, 0xda, 0xa6, 0xa6, 0xd4, 0xd8, 0xfd, 0x93, 0x32, 0xcc, 0xdb, 0xf5, 0x20, 0x99,
-	0x4a, 0xde, 0x57, 0x32, 0x50, 0x69, 0xa4, 0x19, 0x38, 0x6f, 0xe7, 0x97, 0x8b, 0xec, 0x7c, 0xd3,
-	0xb2, 0xae, 0x5c, 0xe5, 0x22, 0xac, 0xbe, 0x9b, 0x8b, 0xb0, 0x56, 0xe8, 0x22, 0x9c, 0xee, 0x49,
-	0x9a, 0xf9, 0x55, 0x3d, 0x49, 0xb3, 0x6f, 0xf5, 0x24, 0x75, 0xff, 0xac, 0x04, 0x2c, 0x4f, 0xbd,
-	0xec, 0x89, 0x70, 0x6d, 0x04, 0x7c, 0x28, 0x85, 0xd8, 0x37, 0xdf, 0x8d, 0x03, 0xd4, 0x6a, 0xa9,
-	0xaf, 0x91, 0x15, 0xcd, 0xc0, 0x23, 0x53, 0xc5, 0x9a, 0x73, 0x8b, 0xb2, 0x32, 0x6e, 0xd2, 0xea,
-	0xd5, 0x6e, 0xd2, 0xda, 0xd5, 0x6e, 0xd2, 0x99, 0xac, 0x9b, 0xb4, 0xfb, 0x57, 0x4b, 0xb0, 0x54,
-	0x40, 0x66, 0xbf, 0xb9, 0x81, 0x23, 0x61, 0x58, 0xd2, 0xa7, 0x2c, 0x09, 0xc3, 0x04, 0xbb, 0x7f,
-	0x11, 0xe6, 0x2c, 0xd6, 0xfa, 0xcd, 0xb5, 0x9f, 0xd5, 0x12, 0x05, 0x65, 0x5b, 0x58, 0xf7, 0x7f,
-	0x95, 0x81, 0xe5, 0xd9, 0xfb, 0xff, 0x69, 0x1f, 0xf2, 0xf3, 0x54, 0x29, 0x98, 0xa7, 0xff, 0xab,
-	0x3b, 0xcf, 0xc7, 0xb0, 0x28, 0xa3, 0x29, 0x0d, 0x67, 0x96, 0xa0, 0x98, 0x7c, 0x06, 0xea, 0xc9,
-	0xb6, 0x8f, 0xba, 0x6e, 0x45, 0x8f, 0x19, 0xdb, 0x6f, 0xc6, 0x55, 0xed, 0x74, 0xa1, 0x23, 0x67,
-	0x68, 0xf7, 0x9c, 0x07, 0xc9, 0xd1, 0xe4, 0x58, 0x84, 0x13, 0xfa, 0x61, 0x40, 0x6a, 0xa0, 0x99,
-	0x29, 0x15, 0x8a, 0x6f, 0x43, 0xcb, 0xdc, 0x3e, 0xe4, 0x72, 0x64, 0xfc, 0x99, 0xa8, 0x4a, 0x98,
-	0xa5, 0xd8, 0x0e, 0xcc, 0x93, 0x90, 0x1c, 0xe8, 0xef, 0xca, 0xf4, 0xdd, 0x5b, 0x7c, 0x34, 0x7b,
-	0xd7, 0xdc, 0xcc, 0x37, 0xec, 0x77, 0x60, 0xde, 0x36, 0x00, 0xa5, 0x56, 0x52, 0x64, 0x11, 0xe0,
-	0xe7, 0x76, 0x61, 0xb6, 0x09, 0xed, 0xac, 0x05, 0x29, 0xa3, 0x79, 0xa6, 0x54, 0x90, 0x2b, 0xce,
-	0x1e, 0xca, 0x03, 0xcb, 0x1a, 0xf9, 0x4e, 0x6e, 0xdb, 0x9f, 0x19, 0xd3, 0xb4, 0x2e, 0xfe, 0x18,
-	0x47, 0x98, 0xbf, 0x07, 0x90, 0x62, 0xac, 0x0d, 0xad, 0xe7, 0x87, 0xbb, 0x07, 0xbd, 0xed, 0xbd,
-	0xcd, 0x83, 0x83, 0xdd, 0xfd, 0xf6, 0x35, 0xc6, 0x60, 0x9e, 0x5c, 0x7d, 0x3b, 0x1a, 0x2b, 0x21,
-	0x26, 0x9d, 0x2b, 0x0a, 0x2b, 0xb3, 0x65, 0x68, 0x3f, 0x3d, 0xc8, 0xa0, 0x95, 0xad, 0x86, 0xe6,
-	0x0f, 0x67, 0x05, 0x96, 0x45, 0xb4, 0xec, 0x96, 0x20, 0x0f, 0xa5, 0x9d, 0xfc, 0xc3, 0x12, 0x5c,
-	0xcf, 0x64, 0xa4, 0x21, 0x5f, 0x42, 0x01, 0xb1, 0xb5, 0x12, 0x1b, 0xa4, 0x03, 0x08, 0xa5, 0x6b,
-	0x66, 0x24, 0x48, 0x3e, 0x03, 0x69, 0xde, 0xd0, 0x4d, 0x33, 0x9c, 0x54, 0x94, 0xe5, 0xac, 0xea,
-	0xc8, 0x9a, 0x4c, 0xc7, 0x4f, 0x44, 0x14, 0xae, 0x99, 0x91, 0x1e, 0x00, 0xdb, 0x5d, 0x56, 0x49,
-	0x34, 0x2b, 0x2c, 0x65, 0xc7, 0xee, 0x6f, 0x61, 0x9e, 0xf3, 0x4f, 0x2a, 0xc0, 0xbe, 0x37, 0xe1,
-	0xd1, 0x25, 0xc5, 0x74, 0x69, 0xcf, 0xe9, 0x6a, 0xd6, 0x2f, 0x38, 0x33, 0x9e, 0x1c, 0x7f, 0xce,
-	0x2f, 0x55, 0xa4, 0x63, 0x39, 0x8d, 0x74, 0x2c, 0x8a, 0x34, 0xac, 0x5e, 0x1d, 0x69, 0x58, 0xbb,
-	0x2a, 0xd2, 0xf0, 0x6b, 0x30, 0xe7, 0x9f, 0x06, 0x21, 0xf2, 0x3c, 0xea, 0x09, 0x71, 0x67, 0x66,
-	0xad, 0x82, 0xf6, 0xb5, 0x04, 0x0f, 0x10, 0x63, 0x8f, 0xd2, 0x42, 0x7c, 0x70, 0x4a, 0xd1, 0xad,
-	0xa6, 0x14, 0xd8, 0x1d, 0x9c, 0xf2, 0xfd, 0xb0, 0xef, 0x25, 0x61, 0x44, 0xc6, 0x98, 0xfa, 0x18,
-	0xf1, 0x98, 0xdd, 0x86, 0xf9, 0x38, 0x9c, 0xa0, 0xe6, 0xa4, 0xc6, 0x2a, 0xbc, 0x49, 0x2d, 0x81,
-	0x1e, 0x8a, 0x11, 0xaf, 0xc3, 0xd2, 0x24, 0xe6, 0xbd, 0x91, 0x1f, 0xc7, 0xb8, 0x3b, 0xf6, 0xc3,
-	0x20, 0x89, 0xc2, 0xa1, 0xf4, 0x29, 0x2d, 0x4e, 0x62, 0xfe, 0x4c, 0xe4, 0x6c, 0x8b, 0x0c, 0xf6,
-	0xed, 0xb4, 0x4b, 0x63, 0xcf, 0x8f, 0xe2, 0x0e, 0x50, 0x97, 0xd4, 0x48, 0xb1, 0xdf, 0x87, 0x9e,
-	0x1f, 0xe9, 0xbe, 0x60, 0x22, 0xce, 0x44, 0x4a, 0x36, 0x33, 0x91, 0x92, 0x32, 0xc8, 0x6e, 0x1d,
-	0xea, 0xea, 0x73, 0x34, 0x74, 0x4f, 0xa2, 0x70, 0xa4, 0x0c, 0x5d, 0xfc, 0xcd, 0xe6, 0xa1, 0x9c,
-	0x84, 0xd2, 0x48, 0x2d, 0x27, 0xa1, 0xf3, 0xfb, 0xd0, 0x34, 0x66, 0x80, 0x7d, 0x28, 0x6c, 0x6e,
-	0x54, 0xa8, 0xa4, 0x85, 0x2c, 0x8e, 0x4a, 0x1a, 0x12, 0x7d, 0x3a, 0x60, 0xdf, 0x80, 0xc5, 0x81,
-	0x1f, 0x71, 0x0a, 0xb4, 0xed, 0x45, 0xfc, 0x9c, 0x47, 0xb1, 0xf2, 0x27, 0xb4, 0x75, 0x86, 0x2b,
-	0x70, 0xa7, 0x07, 0x4b, 0x16, 0xe9, 0x68, 0xce, 0x9a, 0xa1, 0xc8, 0x40, 0xe5, 0xd2, 0xb4, 0xa3,
-	0x06, 0x65, 0x1e, 0xee, 0x49, 0xd2, 0x15, 0xd2, 0x1b, 0x47, 0xe1, 0x31, 0x35, 0x52, 0x72, 0x2d,
-	0xcc, 0xf9, 0x65, 0x19, 0x2a, 0x7b, 0xe1, 0xd8, 0x3c, 0xe0, 0x29, 0xe5, 0x0f, 0x78, 0xa4, 0xf2,
-	0xd8, 0xd3, 0xba, 0xa1, 0xdc, 0xe1, 0x2d, 0x90, 0xdd, 0x83, 0x79, 0x6f, 0x94, 0xf4, 0x92, 0x10,
-	0x95, 0xe5, 0x0b, 0x2f, 0x12, 0x61, 0x84, 0x15, 0x22, 0x8b, 0x4c, 0x0e, 0x5b, 0x86, 0x8a, 0xd6,
-	0x79, 0xa8, 0x00, 0x26, 0xd1, 0x52, 0xa3, 0x43, 0xf4, 0x4b, 0xe9, 0xb7, 0x94, 0x29, 0xe4, 0x7a,
-	0xfb, 0x7b, 0x61, 0x26, 0x8b, 0x9d, 0xab, 0x28, 0x0b, 0x15, 0x59, 0x64, 0x84, 0x51, 0xaa, 0x17,
-	0xea, 0xb4, 0xe9, 0x91, 0xaf, 0xdb, 0x1e, 0xf9, 0x35, 0x68, 0x26, 0xc3, 0xf3, 0xde, 0xd8, 0xbb,
-	0x1c, 0x86, 0xde, 0x40, 0x12, 0xa0, 0x09, 0xb1, 0x07, 0x00, 0xa3, 0xf1, 0xb8, 0x87, 0x9b, 0x65,
-	0x34, 0x20, 0xf3, 0xbb, 0xb9, 0xd1, 0x96, 0xb3, 0xff, 0xec, 0xf0, 0xd0, 0x25, 0xdc, 0x35, 0xca,
-	0x38, 0xaf, 0xa0, 0xa1, 0x33, 0xcc, 0xf8, 0x53, 0x0a, 0xa3, 0x68, 0xda, 0xf1, 0xa7, 0x14, 0x35,
-	0xf1, 0x11, 0xcc, 0x0b, 0x09, 0x89, 0xe3, 0xa2, 0x01, 0x88, 0xa3, 0xef, 0x0c, 0xea, 0xfc, 0x69,
-	0x09, 0x6a, 0xb4, 0xe0, 0xa8, 0x32, 0x88, 0x3c, 0x7d, 0x20, 0x45, 0x8b, 0x38, 0xe7, 0x66, 0x61,
-	0xe6, 0x58, 0x71, 0xea, 0x65, 0x3d, 0xfb, 0x66, 0xac, 0xfa, 0x1a, 0x34, 0x74, 0x4b, 0xc6, 0x0a,
-	0xa6, 0x20, 0xbb, 0x05, 0xd5, 0xb3, 0x70, 0xac, 0xac, 0x2a, 0x50, 0x67, 0xd6, 0xe1, 0xd8, 0x25,
-	0x3c, 0xed, 0x0f, 0xd6, 0x27, 0x86, 0x20, 0x34, 0xd7, 0x2c, 0x5c, 0x30, 0xd6, 0x99, 0xc2, 0xb1,
-	0xbe, 0x84, 0x05, 0x64, 0x4b, 0xc3, 0x41, 0x3f, 0x5d, 0x7e, 0x7e, 0x1d, 0xb7, 0xe3, 0xfe, 0x70,
-	0x32, 0xe0, 0xa6, 0x6d, 0x4b, 0x0e, 0x58, 0x89, 0x2b, 0xad, 0xce, 0xf9, 0xe7, 0x25, 0xc1, 0xee,
-	0x58, 0x2f, 0xbb, 0x0b, 0x55, 0x94, 0x82, 0x19, 0x57, 0x86, 0x0e, 0x6d, 0xc1, 0x72, 0x2e, 0x95,
-	0xc0, 0x55, 0x24, 0x17, 0xa9, 0x59, 0xbb, 0x70, 0x90, 0xa6, 0x86, 0xa1, 0x1e, 0x59, 0xc6, 0x9e,
-	0xca, 0xa0, 0x6c, 0xdd, 0x38, 0x5f, 0xaa, 0x5a, 0x92, 0x55, 0xed, 0xfe, 0x83, 0x53, 0x6e, 0x9c,
-	0x2b, 0xfd, 0x71, 0x09, 0xe6, 0xac, 0x3e, 0x21, 0xd1, 0x0e, 0xbd, 0x38, 0x91, 0xa1, 0x05, 0x72,
-	0xe5, 0x4d, 0xc8, 0x24, 0xf8, 0xb2, 0x4d, 0xf0, 0xfa, 0x9c, 0xa2, 0x62, 0x9e, 0x53, 0x3c, 0x80,
-	0x46, 0x7a, 0x51, 0xc1, 0xee, 0x14, 0xb6, 0xa8, 0x82, 0x7c, 0xd2, 0x42, 0xa9, 0x27, 0xbc, 0x66,
-	0x78, 0xc2, 0x9d, 0x47, 0xd0, 0x34, 0xca, 0x9b, 0x9e, 0xec, 0x92, 0xe5, 0xc9, 0xd6, 0x11, 0x70,
-	0xe5, 0x34, 0x02, 0xce, 0xf9, 0x79, 0x19, 0xe6, 0x90, 0xbc, 0xfd, 0xe0, 0xf4, 0x30, 0x1c, 0xfa,
-	0xfd, 0x4b, 0x22, 0x2b, 0x45, 0xc9, 0x72, 0x17, 0x54, 0x64, 0x6e, 0xc3, 0xc8, 0xfd, 0x3a, 0xec,
-	0x57, 0x88, 0x2a, 0x9d, 0x46, 0x59, 0x86, 0x92, 0xe0, 0xd8, 0x8b, 0xa5, 0x78, 0x90, 0x5a, 0xb8,
-	0x05, 0xa2, 0xc4, 0x41, 0x80, 0xe2, 0x19, 0x47, 0xfe, 0x70, 0xe8, 0x8b, 0xb2, 0xc2, 0x46, 0x2b,
-	0xca, 0xc2, 0x36, 0x07, 0x7e, 0xec, 0x1d, 0xa7, 0x67, 0x90, 0x3a, 0x4d, 0x0e, 0x3e, 0xef, 0x8d,
-	0xe1, 0xe0, 0x13, 0x01, 0xd0, 0x36, 0x98, 0x5d, 0xc8, 0xd9, 0xdc, 0x42, 0x3a, 0xff, 0xb6, 0x0c,
-	0x4d, 0x83, 0x2c, 0x90, 0x9d, 0x0b, 0xb7, 0x1b, 0x03, 0x95, 0x87, 0xf3, 0x81, 0x65, 0xf5, 0x1b,
-	0x08, 0xbb, 0x6d, 0xb7, 0x4a, 0xce, 0x7e, 0x62, 0x78, 0x8b, 0x84, 0x6e, 0x42, 0x03, 0x49, 0xff,
-	0x13, 0x72, 0x31, 0xc8, 0x5b, 0x42, 0x1a, 0x50, 0xb9, 0x1b, 0x94, 0x5b, 0x4b, 0x73, 0x09, 0x78,
-	0xeb, 0x71, 0xfd, 0x43, 0x68, 0xc9, 0x6a, 0x68, 0x8d, 0x69, 0xd0, 0x29, 0xf3, 0x59, 0xeb, 0xef,
-	0x5a, 0x25, 0xd5, 0x97, 0x1b, 0xea, 0xcb, 0xfa, 0x55, 0x5f, 0xaa, 0x92, 0xce, 0x13, 0x1d, 0x09,
-	0xf1, 0x24, 0xf2, 0xc6, 0x67, 0x4a, 0xa0, 0x3c, 0x80, 0x25, 0x25, 0x37, 0x26, 0x81, 0x17, 0x04,
-	0xe1, 0x24, 0xe8, 0x73, 0x15, 0x2c, 0x57, 0x94, 0xe5, 0x0c, 0x74, 0x68, 0x35, 0x55, 0xc4, 0xee,
-	0x41, 0x4d, 0xe8, 0x51, 0x62, 0x57, 0x2e, 0x16, 0x21, 0xa2, 0x08, 0xbb, 0x0b, 0x35, 0xa1, 0x4e,
-	0x95, 0xa7, 0x32, 0xbd, 0x28, 0xe0, 0xac, 0xc3, 0x02, 0xc5, 0x72, 0x1b, 0xb2, 0xef, 0xbd, 0xa2,
-	0xdd, 0x7a, 0xa6, 0x2f, 0x22, 0xbe, 0x97, 0x81, 0x1d, 0x08, 0xbe, 0x32, 0xcf, 0x33, 0xff, 0xb4,
-	0x02, 0x4d, 0x03, 0x46, 0xf9, 0x44, 0x87, 0x50, 0xbd, 0x81, 0xef, 0x8d, 0x78, 0xc2, 0x23, 0xc9,
-	0x4b, 0x19, 0x14, 0xcb, 0x79, 0xe7, 0xa7, 0xbd, 0x70, 0x92, 0xf4, 0x06, 0xfc, 0x34, 0xe2, 0x5c,
-	0xaa, 0x11, 0x19, 0x14, 0xcb, 0x21, 0x35, 0x1b, 0xe5, 0xc4, 0xb1, 0x51, 0x06, 0x55, 0xa7, 0x93,
-	0x62, 0x9e, 0xaa, 0xe9, 0xe9, 0xa4, 0x98, 0x95, 0xac, 0x64, 0xad, 0x15, 0x48, 0xd6, 0x4f, 0x61,
-	0x45, 0xc8, 0x50, 0x29, 0x3d, 0x7a, 0x19, 0xe2, 0x9a, 0x92, 0xcb, 0xee, 0x41, 0x1b, 0xfb, 0xac,
-	0x58, 0x23, 0xf6, 0x7f, 0x26, 0x78, 0xac, 0xe4, 0xe6, 0x70, 0x2c, 0x4b, 0xee, 0x72, 0xb3, 0xac,
-	0x08, 0x11, 0xc9, 0xe1, 0x54, 0xd6, 0x7b, 0x63, 0x97, 0x6d, 0xc8, 0xb2, 0x19, 0x9c, 0x3d, 0x84,
-	0xd5, 0x11, 0x1f, 0xf8, 0x9e, 0x5d, 0x45, 0x2f, 0xdd, 0xe4, 0xa7, 0x65, 0x63, 0x2b, 0x38, 0x0b,
-	0x3f, 0x0b, 0x47, 0xc7, 0xbe, 0xd8, 0xd8, 0x84, 0x63, 0xbf, 0xea, 0xe6, 0x70, 0x67, 0x0e, 0x9a,
-	0x47, 0x49, 0x38, 0x56, 0x4b, 0x3f, 0x0f, 0x2d, 0x91, 0x94, 0xe1, 0x91, 0xef, 0xc1, 0x0d, 0xa2,
-	0xd7, 0x17, 0xe1, 0x38, 0x1c, 0x86, 0xa7, 0x97, 0x96, 0x79, 0xfe, 0x1f, 0x4a, 0xb0, 0x64, 0xe5,
-	0xa6, 0xf6, 0x39, 0xf9, 0x12, 0x55, 0x4c, 0x9b, 0x20, 0xf1, 0x45, 0x63, 0x5b, 0x10, 0x05, 0xc5,
-	0xd1, 0xcd, 0x4b, 0x19, 0xe6, 0xb6, 0x99, 0x5e, 0xd4, 0x50, 0x1f, 0x0a, 0x7a, 0xef, 0xe4, 0xe9,
-	0x5d, 0x7e, 0xaf, 0xae, 0x70, 0xa8, 0x2a, 0x7e, 0x47, 0x06, 0xf4, 0x0c, 0xe4, 0xa0, 0x2b, 0x76,
-	0x10, 0x86, 0xe9, 0xce, 0x51, 0x3d, 0xe8, 0x6b, 0x30, 0x76, 0x7e, 0x51, 0x02, 0x48, 0x7b, 0x47,
-	0x61, 0x20, 0x7a, 0x6b, 0x13, 0x17, 0x83, 0x8d, 0x6d, 0xec, 0x43, 0x68, 0xe9, 0x93, 0xfc, 0x74,
-	0xb7, 0x6c, 0x2a, 0x0c, 0xb5, 0x8b, 0x3b, 0xb0, 0x70, 0x3a, 0x0c, 0x8f, 0x49, 0x8b, 0xa1, 0x78,
-	0xdb, 0x58, 0x06, 0x89, 0xce, 0x0b, 0xf8, 0xb1, 0x44, 0xd3, 0xad, 0xb5, 0x6a, 0x6e, 0xad, 0xc5,
-	0x1b, 0xe5, 0xcf, 0xcb, 0xfa, 0x38, 0x35, 0x9d, 0x89, 0xb7, 0x72, 0x39, 0xdb, 0xc8, 0x89, 0xf5,
-	0x29, 0x27, 0x98, 0x64, 0x7a, 0x1c, 0x5e, 0xe9, 0xdd, 0x7d, 0x04, 0xf3, 0x91, 0x90, 0x99, 0x4a,
-	0xa0, 0x56, 0xdf, 0x22, 0x50, 0xe7, 0x22, 0x6b, 0x67, 0xfe, 0x3a, 0xb4, 0xbd, 0xc1, 0x39, 0x8f,
-	0x12, 0x9f, 0xbc, 0x5d, 0xa4, 0x46, 0x89, 0x01, 0x2e, 0x18, 0x38, 0x69, 0x2b, 0x77, 0x60, 0x41,
-	0x86, 0xec, 0xea, 0x92, 0xf2, 0x7a, 0x5d, 0x0a, 0x63, 0x41, 0xe7, 0x1f, 0xab, 0xd3, 0x5b, 0x7b,
-	0x75, 0xdf, 0x3e, 0x2b, 0xe6, 0x08, 0xcb, 0x99, 0x11, 0x7e, 0x4d, 0x9e, 0xa6, 0x0e, 0x94, 0x5b,
-	0xad, 0x62, 0x84, 0x86, 0x0d, 0xe4, 0xe9, 0xb7, 0x3d, 0xad, 0xd5, 0x77, 0x99, 0x56, 0xe7, 0x3f,
-	0x97, 0x60, 0x76, 0x2f, 0x1c, 0xef, 0xe1, 0x14, 0xa3, 0x8e, 0x83, 0x6c, 0xa2, 0xe3, 0xe5, 0x55,
-	0xf2, 0x8a, 0x10, 0xba, 0x42, 0xad, 0x64, 0x2e, 0xab, 0x95, 0xfc, 0x79, 0x78, 0x8f, 0x1c, 0xbb,
-	0x51, 0x38, 0x0e, 0x23, 0x64, 0x57, 0x6f, 0x28, 0x54, 0x90, 0x30, 0x48, 0xce, 0x94, 0x38, 0x7d,
-	0x5b, 0x11, 0xf2, 0xb6, 0xa0, 0x11, 0x2c, 0x0c, 0x2b, 0xa9, 0x45, 0x09, 0x29, 0x9b, 0xcf, 0x70,
-	0x7e, 0x1b, 0x1a, 0x64, 0x61, 0xd0, 0xd0, 0x3e, 0x86, 0xc6, 0x59, 0x38, 0xee, 0x9d, 0xf9, 0x41,
-	0xa2, 0xd8, 0x7f, 0x3e, 0x55, 0xfd, 0xf7, 0x68, 0x52, 0x74, 0x01, 0xe7, 0xdf, 0xcc, 0xc0, 0xec,
-	0xd3, 0xe0, 0x3c, 0xf4, 0xfb, 0x74, 0x62, 0x3c, 0xe2, 0xa3, 0x50, 0xdd, 0x20, 0xc0, 0xdf, 0x38,
-	0x1d, 0x14, 0x2e, 0x3b, 0x16, 0xc4, 0xdb, 0x12, 0x91, 0x21, 0x12, 0xa2, 0x7b, 0xb0, 0xe9, 0x0d,
-	0x40, 0xc1, 0x60, 0x06, 0x82, 0x86, 0x62, 0x64, 0xde, 0xe0, 0x93, 0xa9, 0xf4, 0x86, 0x46, 0xcd,
-	0xb8, 0xa1, 0x81, 0x6d, 0xc9, 0xc0, 0x3e, 0x11, 0xf9, 0x25, 0xda, 0x92, 0x10, 0x19, 0xb7, 0x11,
-	0x17, 0x8e, 0x79, 0xad, 0x78, 0xa1, 0x71, 0x6b, 0x82, 0xa8, 0x9c, 0x89, 0x0f, 0x44, 0x19, 0xb1,
-	0x19, 0x98, 0x10, 0xaa, 0xa7, 0xd9, 0x8b, 0xa3, 0xe2, 0x02, 0x6f, 0x16, 0x46, 0x59, 0x3e, 0xe0,
-	0x5a, 0xe4, 0x8a, 0x71, 0x80, 0xb8, 0xe5, 0x98, 0xc5, 0x0d, 0x93, 0x58, 0x44, 0x36, 0x2b, 0x93,
-	0x18, 0x09, 0xc6, 0x1b, 0x0e, 0x8f, 0xbd, 0xfe, 0x6b, 0x61, 0x4a, 0xb6, 0xc4, 0x79, 0x8e, 0x05,
-	0x52, 0x78, 0x5e, 0xba, 0xaa, 0x14, 0x43, 0x53, 0x75, 0x4d, 0x88, 0x6d, 0x40, 0x93, 0xdc, 0x05,
-	0x72, 0x5d, 0xe7, 0x69, 0x5d, 0xdb, 0xa6, 0x3f, 0x81, 0x56, 0xd6, 0x2c, 0x64, 0x9e, 0x64, 0x2f,
-	0xe4, 0x62, 0x8d, 0xbd, 0xc1, 0x40, 0x06, 0x01, 0xb4, 0xc5, 0x2d, 0x3f, 0x0d, 0x90, 0x43, 0x42,
-	0x4c, 0x98, 0x28, 0xb0, 0x48, 0x05, 0x2c, 0x8c, 0xdd, 0x82, 0x3a, 0x5a, 0x7d, 0x63, 0xcf, 0x1f,
-	0x50, 0xd8, 0x8c, 0x30, 0x3e, 0x35, 0x86, 0x75, 0xa8, 0xdf, 0xb4, 0x6d, 0x2e, 0xd1, 0xac, 0x58,
-	0x18, 0xce, 0x8d, 0x4e, 0x8f, 0xd2, 0xe0, 0x64, 0x1b, 0x64, 0x9f, 0xd0, 0x31, 0x6c, 0xc2, 0x29,
-	0x02, 0x79, 0x7e, 0xe3, 0x3d, 0x39, 0x66, 0x49, 0xb4, 0xea, 0xef, 0x11, 0x16, 0x71, 0x45, 0x49,
-	0x54, 0xda, 0x84, 0x27, 0x7c, 0xc5, 0x52, 0xda, 0x64, 0x51, 0xf2, 0x84, 0x8b, 0x02, 0xce, 0x26,
-	0xb4, 0xcc, 0x0a, 0x58, 0x1d, 0xaa, 0xcf, 0x0f, 0x77, 0x0f, 0xda, 0xd7, 0x58, 0x13, 0x66, 0x8f,
-	0x76, 0x5f, 0xbc, 0xd8, 0xdf, 0xdd, 0x69, 0x97, 0x58, 0x0b, 0xea, 0x3a, 0xea, 0xb2, 0x8c, 0xa9,
-	0xcd, 0xed, 0xed, 0xdd, 0xc3, 0x17, 0xbb, 0x3b, 0xed, 0x8a, 0xf3, 0x47, 0x65, 0x68, 0x1a, 0x35,
-	0x5f, 0xe1, 0xa2, 0xb9, 0x05, 0x40, 0x96, 0x44, 0x1a, 0x7f, 0x51, 0x75, 0x0d, 0x04, 0x25, 0xa3,
-	0xb6, 0xb1, 0x2b, 0xe2, 0xb2, 0xa3, 0x4a, 0xd3, 0x7c, 0xd1, 0xad, 0x42, 0xf3, 0xc0, 0xa1, 0xe6,
-	0xda, 0x20, 0xd2, 0x92, 0x04, 0x28, 0x08, 0x50, 0x70, 0x98, 0x09, 0xe1, 0xda, 0x44, 0x3c, 0x0e,
-	0x87, 0xe7, 0x5c, 0x14, 0x11, 0xfa, 0x98, 0x85, 0x61, 0x5b, 0x52, 0xc4, 0x18, 0x01, 0xba, 0x35,
-	0xd7, 0x06, 0xd9, 0x37, 0xd5, 0xda, 0xd4, 0x69, 0x6d, 0x56, 0xf3, 0x13, 0x6d, 0xae, 0x8b, 0x93,
-	0x00, 0xdb, 0x1c, 0x0c, 0x64, 0xae, 0x79, 0x75, 0x32, 0x32, 0xef, 0xea, 0x2a, 0x21, 0x51, 0xc0,
-	0xa8, 0xe5, 0x62, 0x46, 0x7d, 0x2b, 0x39, 0x3b, 0x4f, 0xa1, 0x79, 0x68, 0xdc, 0xfe, 0x75, 0x50,
-	0x66, 0xa9, 0x7b, 0xbf, 0x42, 0xd6, 0x09, 0xdf, 0x4a, 0x8a, 0x1a, 0x5d, 0x2a, 0x9b, 0x5d, 0x72,
-	0xfe, 0x51, 0x49, 0x5c, 0xa8, 0xd2, 0x43, 0x10, 0xed, 0x3b, 0xd0, 0xd2, 0x2e, 0xe5, 0x34, 0x06,
-	0xdd, 0xc2, 0xb0, 0x0c, 0x75, 0xa7, 0x17, 0x9e, 0x9c, 0xc4, 0x5c, 0x45, 0x8b, 0x5a, 0x98, 0x52,
-	0x1e, 0x51, 0x1d, 0xf5, 0x45, 0x0b, 0xb1, 0x8c, 0x1a, 0xcd, 0xe1, 0x48, 0x28, 0xd2, 0x2b, 0xa9,
-	0xe2, 0x64, 0x75, 0x5a, 0x87, 0xca, 0x67, 0x67, 0xfa, 0x1e, 0xd4, 0x75, 0xbd, 0xf6, 0xce, 0xa0,
-	0x4a, 0xea, 0x7c, 0xdc, 0x81, 0xc8, 0xb0, 0xb4, 0x3a, 0x2d, 0xe8, 0x35, 0x9f, 0xc1, 0xd6, 0x81,
-	0x9d, 0xf8, 0x51, 0xb6, 0xb8, 0x20, 0xe0, 0x82, 0x1c, 0xe7, 0x15, 0x2c, 0x29, 0xbe, 0x33, 0xb4,
-	0x5a, 0x7b, 0x21, 0x4b, 0x57, 0xc9, 0xa5, 0x72, 0x5e, 0x2e, 0x39, 0xbf, 0xac, 0xc0, 0xac, 0x5c,
-	0xed, 0xdc, 0x2d, 0x72, 0xb1, 0xaf, 0x59, 0x18, 0xeb, 0x58, 0x77, 0x05, 0x89, 0x10, 0xe4, 0x6e,
-	0x94, 0xdb, 0x6f, 0x2a, 0x45, 0xfb, 0x0d, 0x83, 0xea, 0xd8, 0x4b, 0xce, 0xc8, 0xfd, 0xd2, 0x70,
-	0xe9, 0xb7, 0x72, 0x9a, 0xd6, 0x6c, 0xa7, 0x69, 0xd1, 0x9d, 0x79, 0xa1, 0x52, 0xe5, 0xef, 0xcc,
-	0xdf, 0x84, 0x86, 0xb8, 0x63, 0x9d, 0xfa, 0x45, 0x53, 0x00, 0x65, 0x88, 0x48, 0x90, 0x94, 0x90,
-	0xd7, 0x76, 0x52, 0xe4, 0x2b, 0xec, 0x70, 0xdf, 0x86, 0x19, 0x71, 0x6f, 0x44, 0x46, 0x03, 0xdf,
-	0x54, 0x67, 0x86, 0xa2, 0x9c, 0xfa, 0x2b, 0x42, 0x8a, 0x5c, 0x59, 0xd6, 0xbc, 0x79, 0xda, 0xb4,
-	0x6f, 0x9e, 0x9a, 0xee, 0xdc, 0x96, 0xed, 0xce, 0x75, 0x1e, 0xc3, 0x9c, 0x55, 0x1d, 0x4a, 0x58,
-	0x19, 0x4d, 0xdc, 0xbe, 0xc6, 0xe6, 0xa0, 0xf1, 0xf4, 0xa0, 0xf7, 0x78, 0xff, 0xe9, 0x93, 0xbd,
-	0x17, 0xed, 0x12, 0x26, 0x8f, 0x5e, 0x6e, 0x6f, 0xef, 0xee, 0xee, 0x90, 0xc4, 0x05, 0x98, 0x79,
-	0xbc, 0xf9, 0x74, 0x9f, 0xe4, 0xed, 0x8e, 0xa0, 0x6d, 0x59, 0x97, 0x3e, 0xa7, 0xf9, 0x26, 0x30,
-	0x65, 0xfb, 0x53, 0x44, 0xd1, 0x78, 0xc8, 0x13, 0x15, 0xe8, 0xbe, 0x28, 0x73, 0x9e, 0xea, 0x0c,
-	0x75, 0x57, 0x23, 0xad, 0x25, 0x65, 0x11, 0x39, 0x49, 0x59, 0x16, 0x91, 0x45, 0x5d, 0x9d, 0xef,
-	0x74, 0xa1, 0xb3, 0xc3, 0xb1, 0xb6, 0xcd, 0xe1, 0x30, 0xd3, 0x1d, 0x34, 0xde, 0x0a, 0xf2, 0xa4,
-	0x65, 0xf7, 0x3d, 0xb8, 0xbe, 0x29, 0x62, 0xda, 0x7f, 0x53, 0x21, 0x8f, 0x4e, 0x07, 0x56, 0xb2,
-	0x55, 0xca, 0xc6, 0x1e, 0xc3, 0xe2, 0x0e, 0x3f, 0x9e, 0x9c, 0xee, 0xf3, 0xf3, 0xb4, 0x21, 0x06,
-	0xd5, 0xf8, 0x2c, 0xbc, 0x90, 0xf3, 0x43, 0xbf, 0xd9, 0xfb, 0x00, 0x43, 0x2c, 0xd3, 0x8b, 0xc7,
-	0xbc, 0xaf, 0xee, 0x2b, 0x12, 0x72, 0x34, 0xe6, 0x7d, 0xe7, 0x53, 0x60, 0x66, 0x3d, 0x72, 0xbe,
-	0x50, 0xdf, 0x9a, 0x1c, 0xf7, 0xe2, 0xcb, 0x38, 0xe1, 0x23, 0x75, 0x11, 0xd3, 0x84, 0x9c, 0x3b,
-	0xd0, 0x3a, 0xf4, 0x2e, 0x5d, 0xfe, 0x53, 0xf9, 0x92, 0xc2, 0x2a, 0xcc, 0x8e, 0xbd, 0x4b, 0x24,
-	0x41, 0xed, 0x10, 0xa6, 0x6c, 0xe7, 0x7f, 0x97, 0x61, 0x46, 0x94, 0xc4, 0x5a, 0x07, 0x3c, 0x4e,
-	0xfc, 0x80, 0x38, 0x4d, 0xd5, 0x6a, 0x40, 0x39, 0xde, 0x2e, 0x17, 0xf0, 0xb6, 0xf4, 0x52, 0xa8,
-	0x7b, 0x5f, 0x92, 0x81, 0x2d, 0x0c, 0x39, 0x2d, 0x8d, 0x5d, 0x16, 0x6e, 0xc3, 0x14, 0xc8, 0x1c,
-	0x74, 0xa4, 0x5a, 0x9d, 0xe8, 0x9f, 0x12, 0x5b, 0x92, 0x8d, 0x4d, 0xa8, 0x50, 0x77, 0x9c, 0x15,
-	0xdc, 0x9e, 0xd3, 0x1d, 0x73, 0x3a, 0x62, 0xfd, 0x1d, 0x74, 0x44, 0xe1, 0xba, 0x78, 0x9b, 0x8e,
-	0x08, 0xef, 0xa0, 0x23, 0x3a, 0x0c, 0xda, 0x74, 0xa9, 0x1c, 0xad, 0x10, 0x45, 0xbb, 0x7f, 0xaf,
-	0x04, 0x6d, 0x49, 0x45, 0x3a, 0x4f, 0x1d, 0x99, 0xbd, 0xed, 0xf6, 0xd1, 0x6d, 0x98, 0x23, 0x1b,
-	0x48, 0x8b, 0x00, 0x79, 0xfc, 0x64, 0x81, 0x38, 0x0e, 0x15, 0xf5, 0x32, 0xf2, 0x87, 0x72, 0x51,
-	0x4c, 0x48, 0x49, 0x91, 0xc8, 0x93, 0x31, 0xb8, 0x25, 0x57, 0xa7, 0x9d, 0x3f, 0x29, 0xc1, 0xa2,
-	0xd1, 0x61, 0x49, 0x85, 0x8f, 0xa0, 0xa5, 0xdf, 0x6e, 0xe0, 0x7a, 0x73, 0x5b, 0xb5, 0xd9, 0x26,
-	0xfd, 0xcc, 0x2a, 0x4c, 0x8b, 0xe9, 0x5d, 0x52, 0x07, 0xe3, 0xc9, 0x48, 0xee, 0x2a, 0x26, 0x84,
-	0x84, 0x74, 0xc1, 0xf9, 0x6b, 0x5d, 0x44, 0xec, 0x6b, 0x16, 0x46, 0xbe, 0x63, 0xb4, 0xdd, 0x74,
-	0xa1, 0xaa, 0xf4, 0x1d, 0x9b, 0xa0, 0xf3, 0x97, 0xcb, 0xb0, 0x24, 0x8c, 0x71, 0xe9, 0x04, 0xd1,
-	0xd7, 0x67, 0x67, 0x84, 0x5f, 0x42, 0x70, 0xe4, 0xde, 0x35, 0x57, 0xa6, 0xd9, 0x77, 0xde, 0xd1,
-	0x81, 0xa0, 0x03, 0x83, 0xa7, 0xac, 0x45, 0xa5, 0x68, 0x2d, 0xde, 0x32, 0xd3, 0x45, 0x6e, 0xfc,
-	0x5a, 0xb1, 0x1b, 0xff, 0x9d, 0xdc, 0xe6, 0x5b, 0xb3, 0x50, 0x8b, 0xfb, 0xe1, 0x98, 0x3b, 0x2b,
-	0xb0, 0x6c, 0x4f, 0x81, 0x14, 0x54, 0xbf, 0x28, 0x41, 0xe7, 0xb1, 0x38, 0x1c, 0xf4, 0x83, 0xd3,
-	0x3d, 0x3f, 0x4e, 0xc2, 0x48, 0xbf, 0x45, 0x70, 0x0b, 0x20, 0x4e, 0xbc, 0x48, 0x2a, 0xb5, 0x42,
-	0x35, 0x30, 0x10, 0x1c, 0x09, 0x0f, 0x06, 0x22, 0x57, 0xac, 0xa0, 0x4e, 0xe7, 0x54, 0x2f, 0xe9,
-	0x50, 0xb0, 0x14, 0x98, 0x8f, 0x44, 0x38, 0x3d, 0x76, 0x99, 0x9f, 0x93, 0xf4, 0x17, 0x56, 0x7a,
-	0x06, 0x75, 0xfe, 0xa0, 0x0c, 0x0b, 0x69, 0x27, 0x29, 0xe4, 0xc3, 0x96, 0x21, 0x52, 0x6b, 0x49,
-	0x65, 0x88, 0x74, 0xfe, 0xf7, 0x7c, 0x54, 0x63, 0x0c, 0x9f, 0x82, 0x81, 0xb2, 0xdb, 0xd0, 0x54,
-	0xa9, 0x70, 0x92, 0x18, 0x97, 0x82, 0x4d, 0x58, 0x04, 0xc8, 0xa2, 0x22, 0x25, 0x95, 0x42, 0x99,
-	0xa2, 0x0b, 0x4a, 0xa3, 0x84, 0xbe, 0x14, 0x33, 0xaf, 0x92, 0xac, 0x2d, 0x34, 0x11, 0xf1, 0x3e,
-	0x0b, 0x69, 0x21, 0xe6, 0x0e, 0x5d, 0xd7, 0x8f, 0xa9, 0x68, 0xce, 0x14, 0x35, 0xa6, 0xd1, 0xcd,
-	0x55, 0xd7, 0x84, 0x94, 0x55, 0x17, 0x4e, 0x8c, 0x13, 0xcf, 0xaa, 0x6b, 0x61, 0xce, 0xdf, 0x2c,
-	0xc1, 0x8d, 0x82, 0x65, 0x94, 0x9c, 0xba, 0x03, 0x8b, 0x27, 0x3a, 0x53, 0x4d, 0xb5, 0x60, 0xd7,
-	0x15, 0x15, 0x01, 0x61, 0x4f, 0xaf, 0x9b, 0xff, 0x40, 0x2b, 0xa7, 0x62, 0xf1, 0xac, 0x60, 0xf6,
-	0x7c, 0x86, 0x73, 0x08, 0xdd, 0xdd, 0x37, 0xc8, 0xf8, 0xdb, 0xe6, 0xf3, 0x72, 0x8a, 0xb2, 0x36,
-	0x72, 0x82, 0xed, 0x6a, 0x57, 0xd2, 0x09, 0xcc, 0x59, 0x75, 0xb1, 0x6f, 0xbd, 0x6b, 0x25, 0x26,
-	0x8f, 0xae, 0xc9, 0x55, 0x17, 0xef, 0xe3, 0xa9, 0x90, 0x7a, 0x03, 0x72, 0xce, 0x61, 0xe1, 0xd9,
-	0x64, 0x98, 0xf8, 0xe9, 0x5b, 0x79, 0xec, 0x3b, 0xf2, 0x23, 0xaa, 0x42, 0x4d, 0x5d, 0x61, 0x53,
-	0x66, 0x39, 0x9c, 0xb1, 0x11, 0xd6, 0xd4, 0xcb, 0xb7, 0x98, 0xcf, 0x70, 0x6e, 0xc0, 0x6a, 0xda,
-	0xa4, 0x98, 0x3b, 0xb5, 0x39, 0xfc, 0x61, 0x49, 0xc4, 0x85, 0xd9, 0x4f, 0xf7, 0xb1, 0x27, 0xb0,
-	0x14, 0xfb, 0xc1, 0xe9, 0x90, 0x9b, 0xf5, 0xc4, 0x72, 0x26, 0xae, 0xdb, 0xdd, 0x93, 0xcf, 0xfb,
-	0xb9, 0x45, 0x5f, 0x20, 0x81, 0x14, 0x77, 0x34, 0x25, 0x90, 0xcc, 0x94, 0x14, 0x0d, 0xe0, 0xbb,
-	0x30, 0x6f, 0x37, 0xc6, 0x1e, 0xca, 0x48, 0xf8, 0xb4, 0x67, 0xe6, 0xd9, 0x8f, 0x4d, 0x19, 0x56,
-	0x49, 0xe7, 0xe7, 0x25, 0xe8, 0xb8, 0x1c, 0xc9, 0x98, 0x1b, 0x8d, 0x4a, 0xea, 0x79, 0x94, 0xab,
-	0x76, 0xfa, 0x80, 0x75, 0x84, 0xbd, 0x1a, 0xeb, 0xfa, 0xd4, 0x45, 0xd9, 0xbb, 0x56, 0x30, 0xaa,
-	0xad, 0x3a, 0xcc, 0xc8, 0xf1, 0xad, 0xc2, 0x75, 0xd9, 0x25, 0xd5, 0x9d, 0xf4, 0xd0, 0xc0, 0x6a,
-	0xd4, 0x3a, 0x34, 0xe8, 0x42, 0x47, 0x3c, 0x39, 0x61, 0x8e, 0x43, 0x7e, 0xb8, 0x03, 0xec, 0x99,
-	0xd7, 0xf7, 0xa2, 0x30, 0x0c, 0x0e, 0x79, 0x24, 0x63, 0x7c, 0x48, 0x01, 0x22, 0x9f, 0xba, 0xd2,
-	0xd5, 0x44, 0x4a, 0xbd, 0x92, 0x10, 0x06, 0xea, 0x35, 0x0a, 0x91, 0x72, 0x5c, 0x58, 0xda, 0xf2,
-	0x5e, 0x73, 0x55, 0x53, 0x3a, 0x4b, 0xcd, 0xb1, 0xae, 0x54, 0xcd, 0xbd, 0xba, 0xe4, 0x92, 0x6f,
-	0xd6, 0x35, 0x4b, 0x3b, 0x1b, 0xb0, 0x6c, 0xd7, 0x29, 0x45, 0x49, 0x17, 0xea, 0x23, 0x89, 0xc9,
-	0xde, 0xe9, 0xf4, 0xbd, 0x2f, 0xa1, 0x69, 0x3c, 0x23, 0xc2, 0x56, 0x61, 0xe9, 0xd5, 0xd3, 0x17,
-	0x07, 0xbb, 0x47, 0x47, 0xbd, 0xc3, 0x97, 0x5b, 0x9f, 0xef, 0xfe, 0xa0, 0xb7, 0xb7, 0x79, 0xb4,
-	0xd7, 0xbe, 0xc6, 0x56, 0x80, 0x1d, 0xec, 0x1e, 0xbd, 0xd8, 0xdd, 0xb1, 0xf0, 0x12, 0xbb, 0x05,
-	0xdd, 0x97, 0x07, 0x2f, 0x8f, 0x76, 0x77, 0x7a, 0x45, 0xdf, 0x95, 0xd9, 0xfb, 0x70, 0x43, 0xe6,
-	0x17, 0x7c, 0x5e, 0xb9, 0xf7, 0x08, 0xda, 0x59, 0x1f, 0x88, 0xe5, 0x35, 0x7a, 0x9b, 0x7b, 0x69,
-	0xe3, 0xe7, 0x15, 0x98, 0x17, 0x91, 0x7a, 0xe2, 0xf1, 0x4b, 0x1e, 0xb1, 0x67, 0x30, 0x2b, 0x5f,
-	0x51, 0x65, 0x8a, 0xb4, 0xec, 0x77, 0x5b, 0xbb, 0x2b, 0x59, 0x58, 0x2e, 0xeb, 0xd2, 0x5f, 0xf9,
-	0x4f, 0xff, 0xe3, 0x6f, 0x97, 0xe7, 0x58, 0xf3, 0xfe, 0xf9, 0x27, 0xf7, 0x4f, 0x79, 0x10, 0x63,
-	0x1d, 0xbf, 0x07, 0x90, 0xbe, 0x0d, 0xca, 0x3a, 0xda, 0x07, 0x90, 0x79, 0x38, 0xb5, 0x7b, 0xa3,
-	0x20, 0x47, 0xd6, 0x7b, 0x83, 0xea, 0x5d, 0x72, 0xe6, 0xb1, 0x5e, 0x3f, 0xf0, 0x13, 0xf1, 0x4e,
-	0xe8, 0x67, 0xa5, 0x7b, 0x6c, 0x00, 0x2d, 0xf3, 0xd5, 0x4e, 0xa6, 0xce, 0x80, 0x0a, 0xde, 0x1d,
-	0xed, 0xbe, 0x57, 0x98, 0xa7, 0x68, 0x99, 0xda, 0xb8, 0xee, 0xb4, 0xb1, 0x8d, 0x09, 0x95, 0x48,
-	0x5b, 0x19, 0x0a, 0x0e, 0x4f, 0x1f, 0xe7, 0x64, 0x37, 0x0d, 0xa6, 0xcb, 0x3d, 0x0d, 0xda, 0x7d,
-	0x7f, 0x4a, 0xae, 0x6c, 0xeb, 0x7d, 0x6a, 0x6b, 0xd5, 0x61, 0xd8, 0x56, 0x9f, 0xca, 0xa8, 0xa7,
-	0x41, 0x3f, 0x2b, 0xdd, 0xdb, 0xf8, 0xf7, 0x77, 0xa0, 0xa1, 0xcf, 0x87, 0xd9, 0x4f, 0x60, 0xce,
-	0x0a, 0xa5, 0x64, 0x6a, 0x18, 0x45, 0x91, 0x97, 0xdd, 0x9b, 0xc5, 0x99, 0xb2, 0xe1, 0x5b, 0xd4,
-	0x70, 0x87, 0xad, 0x60, 0xc3, 0x32, 0x16, 0xf1, 0x3e, 0x05, 0x05, 0x8b, 0x7b, 0x85, 0xaf, 0x0d,
-	0x49, 0x26, 0x1a, 0xbb, 0x99, 0x15, 0x2e, 0x56, 0x6b, 0xef, 0x4f, 0xc9, 0x95, 0xcd, 0xdd, 0xa4,
-	0xe6, 0x56, 0xd8, 0xb2, 0xd9, 0x9c, 0x3e, 0xb3, 0xe5, 0x74, 0x99, 0xd6, 0x7c, 0xb7, 0x92, 0xbd,
-	0xaf, 0x09, 0xab, 0xe8, 0x3d, 0x4b, 0x4d, 0x22, 0xf9, 0x47, 0x2d, 0x9d, 0x0e, 0x35, 0xc5, 0x18,
-	0x2d, 0x9f, 0xf9, 0x6c, 0x25, 0x3b, 0x86, 0xa6, 0xf1, 0xa2, 0x15, 0xbb, 0x31, 0xf5, 0xf5, 0xad,
-	0x6e, 0xb7, 0x28, 0xab, 0x68, 0x28, 0x66, 0xfd, 0xf7, 0x51, 0xd1, 0xf9, 0x11, 0x34, 0xf4, 0x1b,
-	0x49, 0x6c, 0xd5, 0x78, 0xb3, 0xca, 0x7c, 0xd3, 0xa9, 0xdb, 0xc9, 0x67, 0x14, 0x11, 0x9f, 0x59,
-	0x3b, 0x12, 0xdf, 0x2b, 0x68, 0x1a, 0xef, 0x20, 0xe9, 0x01, 0xe4, 0xdf, 0x5a, 0xd2, 0x03, 0x28,
-	0x78, 0x36, 0xc9, 0x59, 0xa4, 0x26, 0x9a, 0xac, 0x41, 0xf4, 0x9d, 0xbc, 0x09, 0x63, 0xb6, 0x0f,
-	0xd7, 0xa5, 0xc4, 0x3e, 0xe6, 0x5f, 0x65, 0x19, 0x0a, 0x9e, 0x0a, 0x7d, 0x50, 0x62, 0x8f, 0xa0,
-	0xae, 0x9e, 0xbb, 0x62, 0x2b, 0xc5, 0xcf, 0x76, 0x75, 0x57, 0x73, 0xb8, 0x14, 0xaf, 0x3f, 0x00,
-	0x48, 0x1f, 0x5d, 0xd2, 0x42, 0x22, 0xf7, 0x88, 0x93, 0xa6, 0x80, 0xfc, 0x0b, 0x4d, 0xce, 0x0a,
-	0x0d, 0xb0, 0xcd, 0x48, 0x48, 0x04, 0xfc, 0x42, 0xdd, 0x9b, 0xff, 0x31, 0x34, 0x8d, 0x77, 0x97,
-	0xf4, 0xf4, 0xe5, 0xdf, 0x6c, 0xd2, 0xd3, 0x57, 0xf0, 0x4c, 0x93, 0xd3, 0xa5, 0xda, 0x97, 0x9d,
-	0x05, 0xac, 0x3d, 0xf6, 0x4f, 0x83, 0x91, 0x28, 0x80, 0x0b, 0x74, 0x06, 0x73, 0xd6, 0xe3, 0x4a,
-	0x9a, 0x43, 0x8b, 0x9e, 0x6e, 0xd2, 0x1c, 0x5a, 0xf8, 0x1e, 0x93, 0xa2, 0x33, 0x67, 0x11, 0xdb,
-	0x39, 0xa7, 0x22, 0x46, 0x4b, 0x3f, 0x84, 0xa6, 0xf1, 0x50, 0x92, 0x1e, 0x4b, 0xfe, 0x4d, 0x26,
-	0x3d, 0x96, 0xa2, 0x77, 0x95, 0x96, 0xa9, 0x8d, 0x79, 0x87, 0x48, 0x81, 0x6e, 0x80, 0x63, 0xdd,
-	0x3f, 0x81, 0x79, 0xfb, 0xe9, 0x24, 0xcd, 0xfb, 0x85, 0x8f, 0x30, 0x69, 0xde, 0x9f, 0xf2, 0xde,
-	0x92, 0x24, 0xe9, 0x7b, 0x4b, 0xba, 0x91, 0xfb, 0x5f, 0xc8, 0x08, 0xb3, 0x2f, 0xd9, 0xf7, 0x50,
-	0xc0, 0xc9, 0x2b, 0xf9, 0x6c, 0xd5, 0xa0, 0x5a, 0xf3, 0xe2, 0xbe, 0xe6, 0x97, 0xdc, 0xed, 0x7d,
-	0x9b, 0x98, 0xc5, 0x1d, 0x76, 0xda, 0xb5, 0xe8, 0x6a, 0xbe, 0xb1, 0x6b, 0x99, 0xb7, 0xf7, 0x8d,
-	0x5d, 0xcb, 0xba, 0xc1, 0x9f, 0xdd, 0xb5, 0x12, 0x1f, 0xeb, 0x08, 0x60, 0x21, 0x73, 0xdd, 0x43,
-	0x73, 0x45, 0xf1, 0x8d, 0xbc, 0xee, 0xad, 0xb7, 0xdf, 0x12, 0xb1, 0x25, 0x88, 0x12, 0x82, 0xf7,
-	0xd5, 0xfd, 0xc7, 0xdf, 0x87, 0x96, 0xf9, 0x9c, 0x0b, 0x33, 0x59, 0x39, 0xdb, 0xd2, 0x7b, 0x85,
-	0x79, 0xf6, 0xe2, 0xb2, 0x96, 0xd9, 0x0c, 0xfb, 0x3e, 0xac, 0x68, 0x56, 0x37, 0x6f, 0x10, 0xc4,
-	0xec, 0x83, 0x82, 0x7b, 0x05, 0xa6, 0x1e, 0xd7, 0xbd, 0x31, 0xf5, 0xe2, 0xc1, 0x83, 0x12, 0x12,
-	0x8d, 0xfd, 0x46, 0x46, 0xba, 0x61, 0x14, 0x3d, 0x0d, 0x92, 0x6e, 0x18, 0x85, 0x0f, 0x6b, 0x28,
-	0xa2, 0x61, 0x4b, 0xd6, 0x1c, 0x89, 0xc3, 0x78, 0xf6, 0x43, 0x58, 0x30, 0xee, 0x68, 0x1d, 0x5d,
-	0x06, 0x7d, 0xcd, 0x00, 0xf9, 0x2b, 0xc4, 0xdd, 0x22, 0x2b, 0xc5, 0x59, 0xa5, 0xfa, 0x17, 0x1d,
-	0x6b, 0x72, 0x90, 0xf8, 0xb7, 0xa1, 0x69, 0xde, 0xff, 0x7a, 0x4b, 0xbd, 0xab, 0x46, 0x96, 0x79,
-	0xfb, 0xf5, 0x41, 0x89, 0x1d, 0x8a, 0xa0, 0x2c, 0xfd, 0x5e, 0x67, 0x18, 0x65, 0xb7, 0x4f, 0xfb,
-	0x1d, 0x4f, 0xbd, 0x90, 0x45, 0x2f, 0xb8, 0xde, 0x2d, 0x3d, 0x28, 0xb1, 0xbf, 0x5f, 0x82, 0x96,
-	0x75, 0x3f, 0xcb, 0x0a, 0x71, 0xc9, 0xf4, 0xac, 0x63, 0xe6, 0x99, 0x5d, 0x73, 0x5c, 0x1a, 0xf6,
-	0xfe, 0xbd, 0xef, 0x5a, 0xd3, 0xfa, 0x85, 0xe5, 0x50, 0x5b, 0xcf, 0x3e, 0xda, 0xf9, 0x65, 0xb6,
-	0x80, 0x79, 0x71, 0xfb, 0xcb, 0x07, 0x25, 0xf6, 0xc7, 0x25, 0x98, 0xb7, 0xdd, 0xc0, 0x7a, 0xb8,
-	0x85, 0x0e, 0x67, 0xbd, 0xf8, 0x53, 0x7c, 0xc7, 0x3f, 0xa4, 0x5e, 0xbe, 0xb8, 0xe7, 0x5a, 0xbd,
-	0x94, 0xef, 0xb1, 0xfc, 0x7a, 0xbd, 0x65, 0x9f, 0x89, 0x17, 0xa7, 0xd5, 0x61, 0x0d, 0xcb, 0xbf,
-	0x77, 0xac, 0x09, 0xc6, 0x7c, 0xa1, 0x98, 0x16, 0xe1, 0xc7, 0xe2, 0xb1, 0x4a, 0x75, 0x9e, 0x80,
-	0x74, 0xf7, 0xae, 0xdf, 0x3b, 0xb7, 0x69, 0x4c, 0xb7, 0x9c, 0x1b, 0xd6, 0x98, 0xb2, 0x3b, 0xfc,
-	0xa6, 0xe8, 0x9d, 0x7c, 0x5c, 0x38, 0xdd, 0xa2, 0x72, 0x0f, 0x0e, 0x4f, 0xef, 0xe4, 0x48, 0x74,
-	0x52, 0x16, 0xb7, 0x98, 0xe3, 0x1d, 0xab, 0x71, 0xee, 0x51, 0x5f, 0x6f, 0x3b, 0x1f, 0x4c, 0xed,
-	0xeb, 0x7d, 0x72, 0xe6, 0x62, 0x8f, 0x0f, 0x01, 0xd2, 0xc3, 0x55, 0x96, 0x39, 0xd8, 0xd3, 0x22,
-	0x23, 0x7f, 0xfe, 0x6a, 0x73, 0xa0, 0x3a, 0xff, 0xc3, 0x1a, 0x7f, 0x24, 0x04, 0xe0, 0x53, 0x75,
-	0x24, 0x68, 0xaa, 0x39, 0xf6, 0x09, 0xa8, 0xa5, 0xe6, 0x64, 0xeb, 0xb7, 0xc4, 0x9f, 0x3e, 0x5f,
-	0x7c, 0x09, 0x73, 0xfb, 0x61, 0xf8, 0x7a, 0x32, 0xd6, 0xd1, 0x27, 0xf6, 0x39, 0xcb, 0x9e, 0x17,
-	0x9f, 0x75, 0x33, 0xa3, 0x70, 0xd6, 0xa8, 0xaa, 0x2e, 0xeb, 0x18, 0x55, 0xdd, 0xff, 0x22, 0x3d,
-	0xb8, 0xfd, 0x92, 0x79, 0xb0, 0xa8, 0xa5, 0xaa, 0xee, 0x78, 0xd7, 0xae, 0xc6, 0x92, 0xa5, 0xd9,
-	0x26, 0x2c, 0x7d, 0x5c, 0xf5, 0xf6, 0x7e, 0xac, 0xea, 0x24, 0x99, 0xd2, 0xda, 0xe1, 0x7d, 0xba,
-	0x7d, 0x42, 0x87, 0x15, 0x4b, 0x69, 0xc7, 0xf5, 0x29, 0x47, 0x77, 0xce, 0x02, 0xed, 0x9d, 0x66,
-	0xec, 0x5d, 0x46, 0xfc, 0xa7, 0xf7, 0xbf, 0x90, 0xc7, 0x20, 0x5f, 0xaa, 0x9d, 0x46, 0x9d, 0x13,
-	0x59, 0x3b, 0x4d, 0xe6, 0x60, 0xc9, 0xda, 0x69, 0x72, 0x07, 0x4b, 0xd6, 0x54, 0xab, 0x73, 0x2a,
-	0x36, 0x84, 0xc5, 0xdc, 0x59, 0x94, 0xde, 0x64, 0xa6, 0x9d, 0x60, 0x75, 0xd7, 0xa6, 0x17, 0xb0,
-	0x5b, 0xbb, 0x67, 0xb7, 0x76, 0x04, 0x73, 0x3b, 0x5c, 0x4c, 0x96, 0x08, 0xb7, 0xcd, 0x5c, 0xf2,
-	0x33, 0x83, 0x79, 0xb3, 0x5b, 0x02, 0xe5, 0xd9, 0xaa, 0x04, 0xc5, 0xb9, 0xb2, 0x1f, 0x41, 0xf3,
-	0x09, 0x4f, 0x54, 0x7c, 0xad, 0x56, 0x66, 0x33, 0x01, 0xb7, 0xdd, 0x82, 0xf0, 0x5c, 0x9b, 0x66,
-	0xa8, 0xb6, 0xfb, 0x7c, 0x70, 0xca, 0x85, 0x70, 0xea, 0xf9, 0x83, 0x2f, 0xd9, 0x5f, 0xa0, 0xca,
-	0xf5, 0x05, 0x83, 0x15, 0x23, 0x58, 0xd2, 0xac, 0x7c, 0x21, 0x83, 0x17, 0xd5, 0x1c, 0x84, 0x03,
-	0x6e, 0x28, 0x55, 0x01, 0x34, 0x8d, 0x7b, 0x41, 0x9a, 0x81, 0xf2, 0xd7, 0xcc, 0x34, 0x03, 0x15,
-	0x5c, 0x23, 0x72, 0xee, 0x52, 0x3b, 0x0e, 0x5b, 0x4b, 0xdb, 0x11, 0x57, 0x87, 0xd2, 0x96, 0xee,
-	0x7f, 0xe1, 0x8d, 0x92, 0x2f, 0xd9, 0x2b, 0x7a, 0x1f, 0xc9, 0x8c, 0x1f, 0x4e, 0xb5, 0xf3, 0x6c,
-	0xa8, 0xb1, 0x9e, 0x2c, 0x23, 0xcb, 0xd6, 0xd8, 0x45, 0x53, 0xa4, 0x7b, 0x7d, 0x07, 0xe0, 0x28,
-	0x09, 0xc7, 0x3b, 0x1e, 0x1f, 0x85, 0x41, 0x2a, 0x6b, 0xd3, 0xe8, 0xd5, 0x54, 0x7e, 0x19, 0x21,
-	0xac, 0xec, 0x95, 0x61, 0xce, 0x58, 0x21, 0xd8, 0x8a, 0xb8, 0xa6, 0x06, 0xb8, 0xea, 0x09, 0x29,
-	0x08, 0x72, 0x7d, 0x50, 0x62, 0x9b, 0x00, 0xe9, 0x61, 0xa4, 0x36, 0x4e, 0x72, 0xe7, 0x9c, 0x5a,
-	0xec, 0x15, 0x9c, 0x5c, 0x1e, 0x42, 0x23, 0x3d, 0xdd, 0x5a, 0x4d, 0x6f, 0xdf, 0x59, 0x67, 0x61,
-	0x7a, 0x07, 0xcf, 0x9d, 0x39, 0x39, 0x6d, 0x9a, 0x2a, 0x60, 0x75, 0x9c, 0x2a, 0x3a, 0x48, 0xf2,
-	0x61, 0x49, 0x74, 0x50, 0x2b, 0x38, 0x14, 0x75, 0xa9, 0x46, 0x52, 0x70, 0xee, 0xa3, 0xb9, 0xb9,
-	0xf0, 0x40, 0xc4, 0xf2, 0xb1, 0x20, 0xb5, 0x8a, 0x88, 0x4f, 0x14, 0xcd, 0x23, 0x58, 0xcc, 0xf9,
-	0xd8, 0x35, 0x4b, 0x4f, 0x3b, 0x44, 0xd1, 0x2c, 0x3d, 0xd5, 0x3d, 0xef, 0x5c, 0xa7, 0x26, 0x17,
-	0x1c, 0x20, 0x9b, 0xea, 0xc2, 0x4f, 0xfa, 0x67, 0xd8, 0xdc, 0x1f, 0x96, 0x60, 0xa9, 0xc0, 0x85,
-	0xce, 0x3e, 0x54, 0xe6, 0xf9, 0x54, 0xf7, 0x7a, 0xb7, 0xd0, 0xc3, 0xea, 0x1c, 0x51, 0x3b, 0xcf,
-	0xd8, 0xe7, 0xd6, 0xc6, 0x26, 0x9c, 0x9b, 0x92, 0x33, 0xdf, 0xaa, 0x54, 0x14, 0x6a, 0x14, 0x3f,
-	0x85, 0x55, 0xd1, 0x91, 0xcd, 0xe1, 0x30, 0xe3, 0xfd, 0xbd, 0x95, 0xfb, 0xa7, 0x33, 0x96, 0x57,
-	0xbb, 0x3b, 0xfd, 0x9f, 0xd2, 0x4c, 0x51, 0x80, 0x45, 0x57, 0xd9, 0x04, 0xda, 0x59, 0x8f, 0x2a,
-	0x9b, 0x5e, 0x57, 0xf7, 0x03, 0xcb, 0xd0, 0x2c, 0xf0, 0xc2, 0xfe, 0x16, 0x35, 0xf6, 0x81, 0xd3,
-	0x2d, 0x9a, 0x17, 0x61, 0x7b, 0xe2, 0x7a, 0xfc, 0x25, 0xed, 0xfe, 0xcd, 0x8c, 0x53, 0x35, 0x30,
-	0xcd, 0x5f, 0xad, 0x4d, 0xdd, 0x62, 0xef, 0xf1, 0x47, 0xd4, 0xfc, 0x9a, 0xf3, 0x5e, 0x51, 0xf3,
-	0x91, 0xf8, 0x44, 0x18, 0xbd, 0xab, 0x59, 0xbe, 0x56, 0x3d, 0x58, 0x2b, 0x5a, 0xef, 0xa9, 0xd6,
-	0x4b, 0x66, 0xae, 0xaf, 0x91, 0x6e, 0xd7, 0x32, 0xdd, 0xbd, 0x9a, 0x7d, 0x0a, 0xfc, 0xca, 0x9a,
-	0x7d, 0x8a, 0xfc, 0xc3, 0xb6, 0x5e, 0xa3, 0x3c, 0xc3, 0x9f, 0x95, 0xee, 0x6d, 0xdd, 0xf9, 0xe1,
-	0x6f, 0x9d, 0xfa, 0xc9, 0xd9, 0xe4, 0x78, 0xbd, 0x1f, 0x8e, 0xee, 0x0f, 0x95, 0x5b, 0x4f, 0xde,
-	0x44, 0xb8, 0x3f, 0x0c, 0x06, 0xf7, 0xa9, 0xda, 0xe3, 0x19, 0xfa, 0x2f, 0x59, 0xdf, 0xfa, 0x3f,
-	0x01, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x46, 0xb5, 0x44, 0x57, 0x6b, 0x00, 0x00,
+	// 8678 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x24, 0x49,
+	0xb6, 0x56, 0xd7, 0x9f, 0x5d, 0x75, 0xaa, 0x6c, 0x97, 0xc3, 0x6e, 0xbb, 0xba, 0xa6, 0xa7, 0xc7,
+	0x93, 0xdb, 0x77, 0xba, 0xb7, 0x77, 0xd6, 0xdd, 0xe3, 0xdd, 0x1d, 0xe6, 0x4e, 0x73, 0xb9, 0xf8,
+	0xaf, 0xdb, 0xbd, 0xe3, 0x76, 0x7b, 0xd3, 0xdd, 0xdb, 0xec, 0xee, 0xbd, 0xaa, 0x4d, 0x57, 0x85,
+	0xed, 0xdc, 0xae, 0xca, 0xac, 0xcd, 0xcc, 0xb2, 0xdb, 0x3b, 0x0c, 0x12, 0x08, 0x21, 0xc4, 0x0b,
+	0x1a, 0x78, 0x01, 0x04, 0xba, 0xd2, 0x5e, 0x24, 0xee, 0x85, 0x07, 0xe0, 0x01, 0x09, 0xd0, 0x95,
+	0x78, 0xe0, 0x01, 0x09, 0x09, 0xf1, 0xc0, 0x03, 0x12, 0x0f, 0xac, 0x10, 0x48, 0x68, 0x85, 0x78,
+	0x41, 0xe2, 0x1d, 0x9d, 0x13, 0x3f, 0x19, 0x91, 0x99, 0xd5, 0xee, 0xd9, 0x5d, 0xee, 0x93, 0x2b,
+	0xbe, 0x88, 0x8c, 0xdf, 0x73, 0x4e, 0x9c, 0x73, 0xe2, 0x44, 0x18, 0x1a, 0xd1, 0xb8, 0xbf, 0x3e,
+	0x8e, 0xc2, 0x24, 0x64, 0xb5, 0x61, 0x10, 0x8d, 0xfb, 0xdd, 0x9b, 0xa7, 0x61, 0x78, 0x3a, 0xe4,
+	0xf7, 0xbd, 0xb1, 0x7f, 0xdf, 0x0b, 0x82, 0x30, 0xf1, 0x12, 0x3f, 0x0c, 0x62, 0x51, 0xc8, 0xf9,
+	0x31, 0xcc, 0x3f, 0xe6, 0xc1, 0x11, 0xe7, 0x03, 0x97, 0xff, 0x74, 0xc2, 0xe3, 0x84, 0x7d, 0x03,
+	0x16, 0x3d, 0xfe, 0x33, 0xce, 0x07, 0xbd, 0xb1, 0x17, 0xc7, 0xe3, 0xb3, 0xc8, 0x8b, 0x79, 0xa7,
+	0xb4, 0x56, 0xba, 0xdb, 0x72, 0xdb, 0x22, 0xe3, 0x50, 0xe3, 0xec, 0x7d, 0x68, 0xc5, 0x58, 0x94,
+	0x07, 0x49, 0x14, 0x8e, 0x2f, 0x3b, 0x65, 0x2a, 0xd7, 0x44, 0x6c, 0x57, 0x40, 0xce, 0x10, 0x16,
+	0x74, 0x0b, 0xf1, 0x38, 0x0c, 0x62, 0xce, 0x1e, 0xc0, 0x72, 0xdf, 0x1f, 0x9f, 0xf1, 0xa8, 0x47,
+	0x1f, 0x8f, 0x02, 0x3e, 0x0a, 0x03, 0xbf, 0xdf, 0x29, 0xad, 0x55, 0xee, 0x36, 0x5c, 0x26, 0xf2,
+	0xf0, 0x8b, 0xa7, 0x32, 0x87, 0xdd, 0x81, 0x05, 0x1e, 0x08, 0x9c, 0x0f, 0xe8, 0x2b, 0xd9, 0xd4,
+	0x7c, 0x0a, 0xe3, 0x07, 0xce, 0x5f, 0x2f, 0xc3, 0xe2, 0x93, 0xc0, 0x4f, 0x5e, 0x7a, 0xc3, 0x21,
+	0x4f, 0xd4, 0x98, 0xee, 0xc0, 0xc2, 0x05, 0x01, 0x34, 0xa6, 0x8b, 0x30, 0x1a, 0xc8, 0x11, 0xcd,
+	0x0b, 0xf8, 0x50, 0xa2, 0x53, 0x7b, 0x56, 0x9e, 0xda, 0xb3, 0xc2, 0xe9, 0xaa, 0x4c, 0x99, 0xae,
+	0x3b, 0xb0, 0x10, 0xf1, 0x7e, 0x78, 0xce, 0xa3, 0xcb, 0xde, 0x85, 0x1f, 0x0c, 0xc2, 0x8b, 0x4e,
+	0x75, 0xad, 0x74, 0xb7, 0xe6, 0xce, 0x2b, 0xf8, 0x25, 0xa1, 0x6c, 0x0b, 0x16, 0xfa, 0x67, 0x5e,
+	0x10, 0xf0, 0x61, 0xef, 0xd8, 0xeb, 0xbf, 0x9a, 0x8c, 0xe3, 0x4e, 0x6d, 0xad, 0x74, 0xb7, 0xb9,
+	0x71, 0x63, 0x9d, 0x56, 0x75, 0x7d, 0xfb, 0xcc, 0x0b, 0xb6, 0x28, 0xe7, 0x28, 0xf0, 0xc6, 0xf1,
+	0x59, 0x98, 0xb8, 0xf3, 0xf2, 0x0b, 0x01, 0xc7, 0xce, 0x32, 0x30, 0x73, 0x26, 0xc4, 0xdc, 0x3b,
+	0xff, 0xa4, 0x04, 0x4b, 0x2f, 0x82, 0x61, 0xd8, 0x7f, 0xf5, 0x2b, 0x4e, 0x51, 0xc1, 0x18, 0xca,
+	0x6f, 0x3b, 0x86, 0xca, 0x57, 0x1d, 0xc3, 0x0a, 0x2c, 0xdb, 0x9d, 0x95, 0xa3, 0xe0, 0x70, 0x1d,
+	0xbf, 0x3e, 0xe5, 0xaa, 0x5b, 0x6a, 0x18, 0x5f, 0x87, 0x76, 0x7f, 0x12, 0x45, 0x3c, 0xc8, 0x8d,
+	0x63, 0x41, 0xe2, 0x7a, 0x20, 0xef, 0x43, 0x2b, 0xe0, 0x17, 0x69, 0x31, 0x49, 0xbb, 0x01, 0xbf,
+	0x50, 0x45, 0x9c, 0x0e, 0xac, 0x64, 0x9b, 0x91, 0x1d, 0xf8, 0x6f, 0x25, 0xa8, 0xbe, 0x48, 0x5e,
+	0x87, 0x6c, 0x1d, 0xaa, 0xc9, 0xe5, 0x58, 0x70, 0xc8, 0xfc, 0x06, 0x93, 0x43, 0xdb, 0x1c, 0x0c,
+	0x22, 0x1e, 0xc7, 0xcf, 0x2f, 0xc7, 0xdc, 0x6d, 0x79, 0x22, 0xd1, 0xc3, 0x72, 0xac, 0x03, 0xb3,
+	0x32, 0x4d, 0x0d, 0x36, 0x5c, 0x95, 0x64, 0xb7, 0x00, 0xbc, 0x51, 0x38, 0x09, 0x92, 0x5e, 0xec,
+	0x25, 0x34, 0x55, 0x15, 0xd7, 0x40, 0xd8, 0x4d, 0x68, 0x8c, 0x5f, 0xf5, 0xe2, 0x7e, 0xe4, 0x8f,
+	0x13, 0x22, 0x9b, 0x86, 0x9b, 0x02, 0xec, 0x1b, 0x50, 0x0f, 0x27, 0xc9, 0x38, 0xf4, 0x83, 0x44,
+	0x92, 0xca, 0x82, 0xec, 0xcb, 0xb3, 0x49, 0x72, 0x88, 0xb0, 0xab, 0x0b, 0xb0, 0xdb, 0x30, 0xd7,
+	0x0f, 0x83, 0x13, 0x3f, 0x1a, 0x09, 0x61, 0xd0, 0x99, 0xa1, 0xd6, 0x6c, 0xd0, 0xf9, 0x57, 0x65,
+	0x68, 0x3e, 0x8f, 0xbc, 0x20, 0xf6, 0xfa, 0x08, 0x60, 0xd7, 0x93, 0xd7, 0xbd, 0x33, 0x2f, 0x3e,
+	0xa3, 0xd1, 0x36, 0x5c, 0x95, 0x64, 0x2b, 0x30, 0x23, 0x3a, 0x4a, 0x63, 0xaa, 0xb8, 0x32, 0xc5,
+	0x3e, 0x84, 0xc5, 0x60, 0x32, 0xea, 0xd9, 0x6d, 0x55, 0x88, 0x5a, 0xf2, 0x19, 0x38, 0x01, 0xc7,
+	0xb8, 0xd6, 0xa2, 0x09, 0x31, 0x42, 0x03, 0x61, 0x0e, 0xb4, 0x64, 0x8a, 0xfb, 0xa7, 0x67, 0x62,
+	0x98, 0x35, 0xd7, 0xc2, 0xb0, 0x8e, 0xc4, 0x1f, 0xf1, 0x5e, 0x9c, 0x78, 0xa3, 0xb1, 0x1c, 0x96,
+	0x81, 0x50, 0x7e, 0x98, 0x78, 0xc3, 0xde, 0x09, 0xe7, 0x71, 0x67, 0x56, 0xe6, 0x6b, 0x84, 0x7d,
+	0x00, 0xf3, 0x03, 0x1e, 0x27, 0x3d, 0xb9, 0x28, 0x3c, 0xee, 0xd4, 0x89, 0xf5, 0x33, 0x28, 0xd6,
+	0x13, 0x79, 0x17, 0x3d, 0x9c, 0x00, 0xfe, 0xba, 0xd3, 0x10, 0x7d, 0x4d, 0x11, 0xa4, 0x9c, 0xc7,
+	0x3c, 0x31, 0x66, 0x2f, 0x96, 0x14, 0xea, 0xec, 0x03, 0x33, 0xe0, 0x1d, 0x9e, 0x78, 0xfe, 0x30,
+	0x66, 0x1f, 0x43, 0x2b, 0x31, 0x0a, 0x93, 0x28, 0x6c, 0x6a, 0x72, 0x32, 0x3e, 0x70, 0xad, 0x72,
+	0xce, 0x63, 0xa8, 0x3f, 0xe2, 0x7c, 0xdf, 0x1f, 0xf9, 0x09, 0x5b, 0x81, 0xda, 0x89, 0xff, 0x9a,
+	0x0b, 0x82, 0xaf, 0xec, 0x5d, 0x73, 0x45, 0x92, 0x75, 0x61, 0x76, 0xcc, 0xa3, 0x3e, 0x57, 0xcb,
+	0xb3, 0x77, 0xcd, 0x55, 0xc0, 0xd6, 0x2c, 0xd4, 0x86, 0xf8, 0xb1, 0xf3, 0xbf, 0x2b, 0xd0, 0x3c,
+	0xe2, 0x81, 0x66, 0x24, 0x06, 0x55, 0x1c, 0xb2, 0x64, 0x1e, 0xfa, 0xcd, 0xde, 0x83, 0x26, 0x4d,
+	0x43, 0x9c, 0x44, 0x7e, 0x70, 0x2a, 0xe9, 0x17, 0x10, 0x3a, 0x22, 0x84, 0xb5, 0xa1, 0xe2, 0x8d,
+	0x14, 0xed, 0xe2, 0x4f, 0x64, 0xb2, 0xb1, 0x77, 0x39, 0x42, 0x7e, 0xd4, 0xab, 0xda, 0x72, 0x9b,
+	0x12, 0xdb, 0xc3, 0x65, 0x5d, 0x87, 0x25, 0xb3, 0x88, 0xaa, 0xbd, 0x46, 0xb5, 0x2f, 0x1a, 0x25,
+	0x65, 0x23, 0x77, 0x60, 0x41, 0x95, 0x8f, 0x44, 0x67, 0x69, 0x9d, 0x1b, 0xee, 0xbc, 0x84, 0xd5,
+	0x10, 0xee, 0x42, 0xfb, 0xc4, 0x0f, 0xbc, 0x61, 0xaf, 0x3f, 0x4c, 0xce, 0x7b, 0x03, 0x3e, 0x4c,
+	0x3c, 0x5a, 0xf1, 0x9a, 0x3b, 0x4f, 0xf8, 0xf6, 0x30, 0x39, 0xdf, 0x41, 0x94, 0x7d, 0x08, 0x8d,
+	0x13, 0xce, 0x7b, 0x34, 0x13, 0x9d, 0xba, 0xc5, 0x3d, 0x6a, 0x76, 0xdd, 0xfa, 0x89, 0x9a, 0xe7,
+	0x0f, 0xa1, 0x1d, 0x4e, 0x92, 0xd3, 0xd0, 0x0f, 0x4e, 0x7b, 0x28, 0xaf, 0x7a, 0xfe, 0x80, 0x28,
+	0xa0, 0xba, 0x55, 0x7e, 0x50, 0x72, 0xe7, 0x55, 0x1e, 0x4a, 0x8e, 0x27, 0x03, 0xf6, 0x2e, 0x00,
+	0xb5, 0x2f, 0x2a, 0x87, 0xb5, 0xd2, 0xdd, 0x39, 0xb7, 0x81, 0x88, 0xa8, 0xec, 0x53, 0xa8, 0xd3,
+	0x9c, 0x26, 0xc3, 0xf3, 0x4e, 0x93, 0x16, 0xfd, 0x3d, 0xd9, 0xb2, 0xb1, 0x1a, 0xeb, 0x3b, 0x3c,
+	0x4e, 0x9e, 0x0f, 0xcf, 0x71, 0x4f, 0xbd, 0x74, 0x67, 0x07, 0x22, 0xd5, 0xfd, 0x14, 0x5a, 0x66,
+	0x06, 0x4e, 0xff, 0x2b, 0x7e, 0x49, 0x4b, 0x56, 0x75, 0xf1, 0x27, 0x5b, 0x86, 0xda, 0xb9, 0x37,
+	0x9c, 0x70, 0x29, 0xdc, 0x44, 0xe2, 0xd3, 0xf2, 0x27, 0x25, 0xe7, 0x5f, 0x96, 0xa0, 0x25, 0x5a,
+	0x90, 0x9b, 0xf2, 0x6d, 0x98, 0x53, 0xd3, 0xca, 0xa3, 0x28, 0x8c, 0x24, 0x8f, 0xdb, 0x20, 0xbb,
+	0x07, 0x6d, 0x05, 0x8c, 0x23, 0xee, 0x8f, 0xbc, 0x53, 0x55, 0x77, 0x0e, 0x67, 0x1b, 0x69, 0x8d,
+	0x51, 0x38, 0x49, 0xb8, 0x14, 0xff, 0x2d, 0x39, 0x3e, 0x17, 0x31, 0xd7, 0x2e, 0x82, 0x3c, 0x5e,
+	0x40, 0x2f, 0x16, 0xe6, 0x7c, 0x59, 0x02, 0x86, 0x5d, 0x7f, 0x1e, 0x8a, 0x2a, 0xe4, 0x72, 0x67,
+	0x49, 0xad, 0xf4, 0xd6, 0xa4, 0x56, 0x9e, 0x46, 0x6a, 0x0e, 0xd4, 0x44, 0xcf, 0xab, 0x05, 0x3d,
+	0x17, 0x59, 0xdf, 0xad, 0xd6, 0x2b, 0xed, 0xaa, 0xf3, 0x5f, 0x2a, 0xb0, 0xbc, 0x2d, 0xf6, 0xae,
+	0xcd, 0x7e, 0x9f, 0x8f, 0x35, 0x11, 0xbe, 0x07, 0xcd, 0x20, 0x1c, 0xf0, 0xde, 0x78, 0x72, 0xac,
+	0xd6, 0xa6, 0xe5, 0x02, 0x42, 0x87, 0x84, 0x10, 0x7d, 0x9c, 0x79, 0x7e, 0x20, 0x3a, 0x2d, 0xe6,
+	0xb2, 0x41, 0x08, 0x75, 0xf9, 0x03, 0x58, 0x18, 0xf3, 0x60, 0x60, 0xd2, 0x9a, 0xd0, 0x2e, 0xe6,
+	0x24, 0x2c, 0xc9, 0xec, 0x3d, 0x68, 0x9e, 0x4c, 0x44, 0x39, 0x64, 0xc1, 0x2a, 0xd1, 0x00, 0x48,
+	0x68, 0x73, 0x94, 0xb0, 0x1b, 0x50, 0x1f, 0x4f, 0xe2, 0x33, 0xca, 0xad, 0x51, 0xee, 0x2c, 0xa6,
+	0x31, 0xeb, 0x5d, 0x80, 0xc1, 0x24, 0x4e, 0x24, 0x89, 0xce, 0x50, 0x66, 0x03, 0x11, 0x41, 0xa2,
+	0xdf, 0x84, 0xa5, 0x91, 0xf7, 0xba, 0x47, 0xb4, 0xd3, 0xf3, 0x83, 0xde, 0xc9, 0x90, 0xc4, 0xef,
+	0x2c, 0x95, 0x6b, 0x8f, 0xbc, 0xd7, 0xdf, 0xc7, 0x9c, 0x27, 0xc1, 0x23, 0xc2, 0x91, 0x3f, 0xd5,
+	0xbe, 0x1f, 0xf1, 0x98, 0x47, 0xe7, 0x9c, 0x58, 0xaa, 0xaa, 0x37, 0x77, 0x57, 0xa0, 0xd8, 0xa3,
+	0x11, 0x8e, 0x3b, 0x19, 0xf6, 0x05, 0xff, 0xb8, 0xb3, 0x23, 0x3f, 0xd8, 0x4b, 0x86, 0x7d, 0x76,
+	0x13, 0x00, 0x19, 0x72, 0xcc, 0xa3, 0xde, 0xab, 0x0b, 0x62, 0x9a, 0x2a, 0x31, 0xe0, 0x21, 0x8f,
+	0x3e, 0xbb, 0x60, 0xef, 0x40, 0xa3, 0x1f, 0x13, 0x47, 0x7b, 0x97, 0x9d, 0x26, 0x71, 0x54, 0xbd,
+	0x1f, 0x23, 0x2f, 0x7b, 0x97, 0xec, 0x43, 0x60, 0xd8, 0x5b, 0x8f, 0x56, 0x81, 0x0f, 0xa8, 0xfa,
+	0xb8, 0xd3, 0xa2, 0x52, 0xd8, 0xd9, 0x4d, 0x99, 0x81, 0xed, 0xc4, 0xec, 0x6b, 0x30, 0xa7, 0x3a,
+	0x7b, 0x32, 0xf4, 0x4e, 0xe3, 0xce, 0x1c, 0x15, 0x6c, 0x49, 0xf0, 0x11, 0x62, 0xce, 0x4b, 0xa1,
+	0x6d, 0x18, 0x6b, 0x2b, 0x79, 0x06, 0xf7, 0x3d, 0x42, 0x68, 0x5d, 0xeb, 0xae, 0x4c, 0x15, 0x2d,
+	0x5a, 0xb9, 0x60, 0xd1, 0x9c, 0x9f, 0x97, 0xa0, 0x25, 0x6b, 0xa6, 0x2d, 0x9a, 0x3d, 0x00, 0xa6,
+	0x56, 0x31, 0x79, 0xed, 0x0f, 0x7a, 0xc7, 0x97, 0x09, 0x8f, 0x05, 0xd1, 0xec, 0x5d, 0x73, 0x0b,
+	0xf2, 0x50, 0x18, 0x59, 0x68, 0x9c, 0x44, 0x82, 0x9e, 0xf7, 0xae, 0xb9, 0xb9, 0x1c, 0x64, 0x2f,
+	0x54, 0x02, 0x26, 0x49, 0xcf, 0x0f, 0x06, 0xfc, 0x35, 0x91, 0xd2, 0x9c, 0x6b, 0x61, 0x5b, 0xf3,
+	0xd0, 0x32, 0xbf, 0x73, 0x7e, 0x02, 0x75, 0xa5, 0x42, 0xd0, 0xf6, 0x99, 0xe9, 0x97, 0x6b, 0x20,
+	0xac, 0x0b, 0x75, 0xbb, 0x17, 0x6e, 0xfd, 0xab, 0xb4, 0xed, 0xfc, 0x39, 0x68, 0xef, 0x23, 0x11,
+	0x05, 0x48, 0xb4, 0x52, 0x2f, 0x5a, 0x81, 0x19, 0x83, 0x79, 0x1a, 0xae, 0x4c, 0xe1, 0x0e, 0x75,
+	0x16, 0xc6, 0x89, 0x6c, 0x87, 0x7e, 0x3b, 0xff, 0xae, 0x04, 0x6c, 0x37, 0x4e, 0xfc, 0x91, 0x97,
+	0xf0, 0x47, 0x5c, 0x8b, 0x86, 0x67, 0xd0, 0xc2, 0xda, 0x9e, 0x87, 0x9b, 0x42, 0x4b, 0x11, 0xbb,
+	0xeb, 0x37, 0x24, 0x3b, 0xe7, 0x3f, 0x58, 0x37, 0x4b, 0x0b, 0xa1, 0x6b, 0x55, 0x80, 0xdc, 0x96,
+	0x78, 0xd1, 0x29, 0x4f, 0x48, 0x85, 0x91, 0x0a, 0x30, 0x08, 0x68, 0x3b, 0x0c, 0x4e, 0xba, 0xbf,
+	0x0b, 0x8b, 0xb9, 0x3a, 0x4c, 0xf9, 0xdc, 0x28, 0x90, 0xcf, 0x15, 0x53, 0x3e, 0xf7, 0x61, 0xc9,
+	0xea, 0x97, 0xa4, 0xb8, 0x0e, 0xcc, 0x22, 0x63, 0xa0, 0x86, 0x48, 0xbb, 0xbc, 0xab, 0x92, 0x6c,
+	0x03, 0x96, 0x4f, 0x38, 0x8f, 0xbc, 0x84, 0x92, 0xc4, 0x3a, 0xb8, 0x26, 0xb2, 0xe6, 0xc2, 0x3c,
+	0xe7, 0xbf, 0x97, 0x60, 0x01, 0x25, 0xe9, 0x53, 0x2f, 0xb8, 0x54, 0x73, 0xb5, 0x5f, 0x38, 0x57,
+	0x77, 0x8d, 0x4d, 0xc9, 0x28, 0xfd, 0x55, 0x27, 0xaa, 0x92, 0x9d, 0x28, 0xb6, 0x06, 0x2d, 0xab,
+	0xbb, 0x35, 0xa1, 0x92, 0xc5, 0x5e, 0x72, 0xc8, 0xa3, 0xad, 0xcb, 0x84, 0xff, 0xfa, 0x53, 0xf9,
+	0x01, 0xb4, 0xd3, 0x6e, 0xcb, 0x79, 0x64, 0x50, 0x45, 0xc2, 0x94, 0x15, 0xd0, 0x6f, 0xe7, 0xef,
+	0x97, 0x44, 0xc1, 0xed, 0xd0, 0xd7, 0xea, 0x1a, 0x16, 0x44, 0xad, 0x4f, 0x15, 0xc4, 0xdf, 0x53,
+	0xd5, 0xdd, 0x5f, 0x7f, 0xb0, 0x28, 0x13, 0x63, 0x1e, 0x0c, 0x7a, 0xde, 0x70, 0x48, 0x82, 0xb8,
+	0xee, 0xce, 0x62, 0x7a, 0x73, 0x38, 0x74, 0xee, 0xc0, 0xa2, 0xd1, 0xbb, 0x37, 0x8c, 0xe3, 0x00,
+	0xd8, 0xbe, 0x1f, 0x27, 0x2f, 0x82, 0x78, 0x6c, 0x68, 0x43, 0xef, 0x40, 0x03, 0xa5, 0x2d, 0xf6,
+	0x4c, 0x70, 0x6e, 0xcd, 0x45, 0xf1, 0x8b, 0xfd, 0x8a, 0x29, 0xd3, 0x7b, 0x2d, 0x33, 0xcb, 0x32,
+	0xd3, 0x7b, 0x4d, 0x99, 0xce, 0x27, 0xb0, 0x64, 0xd5, 0x27, 0x9b, 0x7e, 0x1f, 0x6a, 0x93, 0xe4,
+	0x75, 0xa8, 0x74, 0xd5, 0xa6, 0xa4, 0x10, 0xb4, 0x8a, 0x5c, 0x91, 0xe3, 0x3c, 0x84, 0xc5, 0x03,
+	0x7e, 0x21, 0x19, 0x59, 0x75, 0xe4, 0x83, 0x2b, 0x2d, 0x26, 0xca, 0x77, 0xd6, 0x81, 0x99, 0x1f,
+	0xa7, 0x0c, 0xa0, 0xec, 0xa7, 0x92, 0x65, 0x3f, 0x39, 0x1f, 0x00, 0x3b, 0xf2, 0x4f, 0x83, 0xa7,
+	0x3c, 0x8e, 0xbd, 0x53, 0xcd, 0xfa, 0x6d, 0xa8, 0x8c, 0xe2, 0x53, 0x29, 0xaa, 0xf0, 0xa7, 0xf3,
+	0x2d, 0x58, 0xb2, 0xca, 0xc9, 0x8a, 0x6f, 0x42, 0x23, 0xf6, 0x4f, 0x03, 0x2f, 0x99, 0x44, 0x5c,
+	0x56, 0x9d, 0x02, 0xce, 0x23, 0x58, 0xfe, 0x3e, 0x8f, 0xfc, 0x93, 0xcb, 0xab, 0xaa, 0xb7, 0xeb,
+	0x29, 0x67, 0xeb, 0xd9, 0x85, 0xeb, 0x99, 0x7a, 0x64, 0xf3, 0x82, 0x7c, 0xe5, 0x4a, 0xd6, 0x5d,
+	0x91, 0x30, 0x64, 0x5f, 0xd9, 0x94, 0x7d, 0xce, 0x0b, 0x60, 0xdb, 0x61, 0x10, 0xf0, 0x7e, 0x72,
+	0xc8, 0x79, 0x94, 0xba, 0x6e, 0x52, 0x5a, 0x6d, 0x6e, 0xac, 0xca, 0x99, 0xcd, 0x0a, 0x54, 0x49,
+	0xc4, 0x0c, 0xaa, 0x63, 0x1e, 0x8d, 0xa8, 0xe2, 0xba, 0x4b, 0xbf, 0x9d, 0xeb, 0xb0, 0x64, 0x55,
+	0x2b, 0x8d, 0xdd, 0x8f, 0xe0, 0xfa, 0x8e, 0x1f, 0xf7, 0xf3, 0x0d, 0x76, 0x60, 0x76, 0x3c, 0x39,
+	0xee, 0xa5, 0x9c, 0xa8, 0x92, 0x68, 0xff, 0x64, 0x3f, 0x91, 0x95, 0xfd, 0xb5, 0x12, 0x54, 0xf7,
+	0x9e, 0xef, 0x6f, 0xe3, 0x5e, 0xe1, 0x07, 0xfd, 0x70, 0x84, 0x1a, 0x98, 0x18, 0xb4, 0x4e, 0x4f,
+	0xe5, 0xb0, 0x9b, 0xd0, 0x20, 0xc5, 0x0d, 0x4d, 0x3e, 0xa9, 0x07, 0xa5, 0x00, 0x9a, 0x9b, 0xfc,
+	0xf5, 0xd8, 0x8f, 0xc8, 0x9e, 0x54, 0x56, 0x62, 0x95, 0xb6, 0x99, 0x7c, 0x86, 0xf3, 0xf3, 0x59,
+	0x98, 0x95, 0x9b, 0xaf, 0xd8, 0xc8, 0x13, 0xff, 0x9c, 0xa7, 0x1b, 0x39, 0xa6, 0x50, 0x29, 0x8e,
+	0xf8, 0x28, 0x4c, 0xb4, 0xfe, 0x26, 0x96, 0xc1, 0x06, 0xc9, 0x9c, 0x96, 0x4a, 0x84, 0x30, 0xc0,
+	0x2b, 0xa2, 0x94, 0x05, 0xb2, 0x9b, 0x30, 0xab, 0x94, 0x81, 0xaa, 0xb6, 0x16, 0x14, 0x84, 0xb3,
+	0xd1, 0xf7, 0xc6, 0x5e, 0xdf, 0x4f, 0x2e, 0xa5, 0x58, 0xd0, 0x69, 0xac, 0x7f, 0x18, 0xf6, 0xbd,
+	0x61, 0xef, 0xd8, 0x1b, 0x7a, 0x41, 0x9f, 0x2b, 0x73, 0xdd, 0x02, 0xd1, 0x74, 0x95, 0xdd, 0x52,
+	0xc5, 0x84, 0x79, 0x9b, 0x41, 0x71, 0x0f, 0xef, 0x87, 0xa3, 0x91, 0x9f, 0xa0, 0xc5, 0x4b, 0xaa,
+	0x59, 0xc5, 0x35, 0x10, 0xe1, 0x1c, 0xa0, 0xd4, 0x85, 0x98, 0xc1, 0x86, 0x72, 0x0e, 0x18, 0x20,
+	0xd6, 0x92, 0xd1, 0xd0, 0x2a, 0xae, 0x81, 0xe0, 0x5a, 0x4c, 0x82, 0x98, 0x27, 0xc9, 0x90, 0x0f,
+	0x74, 0x87, 0x9a, 0x54, 0x2c, 0x9f, 0xc1, 0x1e, 0xc0, 0x92, 0x30, 0xc2, 0x63, 0x2f, 0x09, 0xe3,
+	0x33, 0x3f, 0xee, 0xc5, 0x68, 0xae, 0xb6, 0xa8, 0x7c, 0x51, 0x16, 0xfb, 0x04, 0x56, 0x33, 0x70,
+	0xc4, 0xfb, 0xdc, 0x3f, 0xe7, 0x03, 0x52, 0xe1, 0x2a, 0xee, 0xb4, 0x6c, 0xb6, 0x06, 0xcd, 0x60,
+	0x32, 0xea, 0x4d, 0xc6, 0x03, 0x0f, 0x95, 0x98, 0x79, 0x52, 0x2e, 0x4d, 0x88, 0x7d, 0x04, 0x4a,
+	0x4f, 0x93, 0xda, 0xe3, 0x82, 0x25, 0xe1, 0x90, 0x7a, 0x5d, 0xbb, 0x04, 0x12, 0x66, 0xaa, 0x92,
+	0xb6, 0xa5, 0x91, 0xa7, 0x00, 0xe2, 0x93, 0xc8, 0x3f, 0xf7, 0x12, 0xde, 0x59, 0x14, 0x42, 0x5d,
+	0x26, 0xf1, 0x3b, 0x3f, 0xf0, 0x13, 0xdf, 0x4b, 0xc2, 0xa8, 0xc3, 0x28, 0x2f, 0x05, 0x70, 0x12,
+	0x89, 0x3e, 0xe2, 0xc4, 0x4b, 0x26, 0xb1, 0xd4, 0x50, 0x97, 0x84, 0xb5, 0x92, 0xcb, 0x60, 0x1f,
+	0xc3, 0x8a, 0xa0, 0x08, 0xca, 0x92, 0xba, 0x37, 0xa9, 0x0a, 0xcb, 0x34, 0x23, 0x53, 0x72, 0x71,
+	0x2a, 0x25, 0x89, 0xe4, 0x3e, 0xbc, 0x2e, 0xa6, 0x72, 0x4a, 0x36, 0xf6, 0x0f, 0x7b, 0xe0, 0xf7,
+	0x7b, 0xb2, 0x04, 0xb2, 0xc8, 0x0a, 0x8d, 0x22, 0x9f, 0x81, 0x24, 0x3e, 0xf4, 0x4f, 0x78, 0xe2,
+	0x8f, 0x78, 0x67, 0x55, 0x90, 0xb8, 0x4a, 0x23, 0x03, 0x4e, 0xc6, 0x94, 0xd3, 0x11, 0x0c, 0x2f,
+	0x52, 0xce, 0x1f, 0x94, 0xc4, 0xe6, 0x23, 0x19, 0x35, 0x36, 0xcc, 0x2a, 0xc1, 0xa2, 0xbd, 0x30,
+	0x18, 0x5e, 0x4a, 0xae, 0x05, 0x01, 0x3d, 0x0b, 0x86, 0x97, 0xa8, 0xd8, 0xfb, 0x81, 0x59, 0x44,
+	0xc8, 0xb9, 0x96, 0x02, 0xa9, 0xd0, 0x7b, 0xd0, 0x1c, 0x4f, 0x8e, 0x87, 0x7e, 0x5f, 0x14, 0xa9,
+	0x88, 0x5a, 0x04, 0x44, 0x05, 0xd0, 0xa6, 0x14, 0x2b, 0x25, 0x4a, 0x54, 0xa9, 0x44, 0x53, 0x62,
+	0x58, 0xc4, 0xd9, 0x82, 0x65, 0xbb, 0x83, 0x52, 0xa0, 0xdf, 0x83, 0xba, 0xe4, 0xff, 0x58, 0x1a,
+	0xf6, 0xf3, 0x86, 0xdf, 0x13, 0xcd, 0x20, 0x9d, 0xef, 0xfc, 0xeb, 0x2a, 0x2c, 0x49, 0x74, 0x7b,
+	0x18, 0xc6, 0xfc, 0x68, 0x32, 0x1a, 0x79, 0x51, 0x81, 0x60, 0x29, 0x5d, 0x21, 0x58, 0xca, 0x79,
+	0xc1, 0x72, 0xcb, 0xb2, 0x2f, 0x85, 0x64, 0x32, 0x10, 0x76, 0x17, 0x16, 0xfa, 0xc3, 0x30, 0x16,
+	0xea, 0xbe, 0xe9, 0x7a, 0xcb, 0xc2, 0x79, 0x61, 0x58, 0x2b, 0x12, 0x86, 0xa6, 0x20, 0x9b, 0xc9,
+	0x08, 0x32, 0x07, 0x5a, 0x58, 0x29, 0x57, 0xb2, 0x79, 0x56, 0x1a, 0x5b, 0x06, 0x86, 0xfd, 0xc9,
+	0x8a, 0x0d, 0x21, 0xa3, 0x16, 0x8a, 0x84, 0x86, 0x3f, 0xe2, 0x24, 0xfb, 0x8d, 0xd2, 0x0d, 0x29,
+	0x34, 0xf2, 0x59, 0xec, 0x11, 0x80, 0x68, 0x8b, 0x14, 0x10, 0x20, 0x05, 0xe4, 0x03, 0x7b, 0x55,
+	0xcc, 0xf9, 0x5f, 0xc7, 0xc4, 0x24, 0xe2, 0xa4, 0x94, 0x18, 0x5f, 0x3a, 0x7f, 0xa3, 0x04, 0x4d,
+	0x23, 0x8f, 0x5d, 0x87, 0xc5, 0xed, 0x67, 0xcf, 0x0e, 0x77, 0xdd, 0xcd, 0xe7, 0x4f, 0xbe, 0xbf,
+	0xdb, 0xdb, 0xde, 0x7f, 0x76, 0xb4, 0xdb, 0xbe, 0x86, 0xf0, 0xfe, 0xb3, 0xed, 0xcd, 0xfd, 0xde,
+	0xa3, 0x67, 0xee, 0xb6, 0x82, 0x4b, 0x6c, 0x05, 0x98, 0xbb, 0xfb, 0xf4, 0xd9, 0xf3, 0x5d, 0x0b,
+	0x2f, 0xb3, 0x36, 0xb4, 0xb6, 0xdc, 0xdd, 0xcd, 0xed, 0x3d, 0x89, 0x54, 0xd8, 0x32, 0xb4, 0x1f,
+	0xbd, 0x38, 0xd8, 0x79, 0x72, 0xf0, 0xb8, 0xb7, 0xbd, 0x79, 0xb0, 0xbd, 0xbb, 0xbf, 0xbb, 0xd3,
+	0xae, 0xb2, 0x39, 0x68, 0x6c, 0x6e, 0x6d, 0x1e, 0xec, 0x3c, 0x3b, 0xd8, 0xdd, 0x69, 0xd7, 0x9c,
+	0xff, 0x5a, 0x82, 0xeb, 0xd4, 0xeb, 0x41, 0x96, 0x49, 0xd6, 0xa0, 0xd9, 0x0f, 0xc3, 0x31, 0x2a,
+	0xfe, 0xe9, 0xd6, 0x66, 0x42, 0xc8, 0x00, 0x42, 0x28, 0x9c, 0x84, 0x51, 0x9f, 0x4b, 0x1e, 0x01,
+	0x82, 0x1e, 0x21, 0x82, 0x0c, 0x20, 0x97, 0x57, 0x94, 0x10, 0x2c, 0xd2, 0x14, 0x98, 0x28, 0xb2,
+	0x02, 0x33, 0xc7, 0x11, 0xf7, 0xfa, 0x67, 0x92, 0x3b, 0x64, 0x8a, 0x7d, 0x3d, 0xb5, 0x4c, 0xfb,
+	0x38, 0xfb, 0x43, 0x3e, 0x20, 0x8a, 0xa9, 0xbb, 0x0b, 0x12, 0xdf, 0x96, 0x30, 0x4a, 0x41, 0xef,
+	0xd8, 0x0b, 0x06, 0x61, 0xc0, 0x07, 0x52, 0xed, 0x4d, 0x01, 0xe7, 0x10, 0x56, 0xb2, 0xe3, 0x93,
+	0x3c, 0xf6, 0xb1, 0xc1, 0x63, 0x42, 0x0b, 0xed, 0x4e, 0x5f, 0x4d, 0x83, 0xdf, 0x7e, 0x51, 0x86,
+	0x2a, 0x2a, 0x25, 0xd3, 0x15, 0x18, 0x53, 0xcf, 0xac, 0xe4, 0xfc, 0xf4, 0x64, 0xec, 0x8a, 0x2d,
+	0x4a, 0x3a, 0x5a, 0x52, 0x24, 0xcd, 0x8f, 0x78, 0xff, 0x5c, 0xba, 0x5a, 0x0c, 0x04, 0x19, 0x04,
+	0x8d, 0x00, 0xfa, 0x5a, 0x32, 0x88, 0x4a, 0xab, 0x3c, 0xfa, 0x72, 0x36, 0xcd, 0xa3, 0xef, 0x3a,
+	0x30, 0xeb, 0x07, 0xc7, 0xe1, 0x24, 0x18, 0x10, 0x43, 0xd4, 0x5d, 0x95, 0xa4, 0x93, 0x01, 0x62,
+	0x54, 0x94, 0x9f, 0x82, 0xfc, 0x53, 0x80, 0x6d, 0x40, 0x23, 0xbe, 0x0c, 0xfa, 0x26, 0xcd, 0x2f,
+	0xcb, 0x59, 0xc2, 0x39, 0x58, 0x3f, 0xba, 0x0c, 0xfa, 0x44, 0xe1, 0x69, 0x31, 0xe7, 0x77, 0xa1,
+	0xae, 0x60, 0x24, 0xcb, 0x17, 0x07, 0x9f, 0x1d, 0x3c, 0x7b, 0x79, 0xd0, 0x3b, 0xfa, 0xc1, 0xc1,
+	0x76, 0xfb, 0x1a, 0x5b, 0x80, 0xe6, 0xe6, 0x36, 0x51, 0x3a, 0x01, 0x25, 0x2c, 0x72, 0xb8, 0x79,
+	0x74, 0xa4, 0x91, 0xb2, 0xc3, 0xd0, 0x90, 0x8f, 0x49, 0xf3, 0xd3, 0x9e, 0xef, 0x8f, 0x61, 0xd1,
+	0xc0, 0x52, 0x2b, 0x62, 0x8c, 0x40, 0xc6, 0x8a, 0x20, 0x95, 0x51, 0xe4, 0x38, 0x6d, 0x98, 0x7f,
+	0xcc, 0x93, 0x27, 0xc1, 0x49, 0xa8, 0x6a, 0xfa, 0x9f, 0x55, 0x58, 0xd0, 0x90, 0xac, 0xe8, 0x2e,
+	0x2c, 0xf8, 0x03, 0x1e, 0x24, 0x7e, 0x72, 0xd9, 0xb3, 0xfc, 0x05, 0x59, 0x18, 0x55, 0x6d, 0x6f,
+	0xe8, 0x7b, 0xea, 0x00, 0x46, 0x24, 0xd0, 0x7e, 0x46, 0x1d, 0xc0, 0xf4, 0xdb, 0x10, 0x5d, 0x09,
+	0x37, 0x45, 0x61, 0x1e, 0x4a, 0x20, 0xc4, 0xe5, 0x36, 0xa3, 0x3f, 0x11, 0x2a, 0x67, 0x51, 0x16,
+	0x2e, 0x95, 0xa8, 0x09, 0x87, 0x5c, 0x13, 0x7a, 0x82, 0x06, 0x72, 0x27, 0x1c, 0x33, 0x42, 0x3e,
+	0x66, 0x4f, 0x38, 0x8c, 0x53, 0x92, 0x7a, 0xee, 0x94, 0x04, 0xe5, 0xe7, 0x65, 0xd0, 0xe7, 0x83,
+	0x5e, 0x12, 0xf6, 0x48, 0xce, 0x13, 0x49, 0xd4, 0xdd, 0x2c, 0x8c, 0xfb, 0x46, 0xc2, 0xe3, 0x24,
+	0xe0, 0xc2, 0x2d, 0x5d, 0xdf, 0x2a, 0x77, 0x4a, 0xae, 0x82, 0xd0, 0x3e, 0x98, 0x44, 0x7e, 0xdc,
+	0x69, 0xd1, 0xf9, 0x07, 0xfd, 0x66, 0xdf, 0x86, 0xeb, 0xc7, 0x3c, 0x4e, 0x7a, 0x67, 0xdc, 0x1b,
+	0xf0, 0x88, 0xc8, 0x4b, 0x1c, 0xb4, 0x08, 0x95, 0xab, 0x38, 0x13, 0x09, 0xf7, 0x9c, 0x47, 0xb1,
+	0x1f, 0x06, 0xa4, 0x6c, 0x35, 0x5c, 0x95, 0xc4, 0xfa, 0x70, 0xf0, 0x7a, 0xa3, 0xd6, 0x33, 0xb8,
+	0x40, 0x03, 0x2f, 0xce, 0x64, 0xb7, 0x61, 0x86, 0x06, 0x10, 0x77, 0xda, 0x44, 0x33, 0xad, 0x94,
+	0xe7, 0xfd, 0xc0, 0x95, 0x79, 0xb8, 0xca, 0xfd, 0x70, 0x18, 0x46, 0xa4, 0x71, 0x35, 0x5c, 0x91,
+	0xb0, 0x67, 0xe7, 0x34, 0xf2, 0xc6, 0x67, 0x52, 0xeb, 0xca, 0xc2, 0xdf, 0xad, 0xd6, 0x9b, 0xed,
+	0x96, 0xf3, 0x67, 0xa0, 0x46, 0xd5, 0x52, 0x75, 0x34, 0x99, 0x25, 0x59, 0x1d, 0xa1, 0x1d, 0x98,
+	0x0d, 0x78, 0x72, 0x11, 0x46, 0xaf, 0xd4, 0x69, 0x9e, 0x4c, 0x3a, 0x3f, 0x23, 0x0b, 0x4d, 0x9f,
+	0x6e, 0xbd, 0x20, 0xd5, 0x12, 0xed, 0x6c, 0xb1, 0x54, 0xf1, 0x99, 0x27, 0x8d, 0xc6, 0x3a, 0x01,
+	0x47, 0x67, 0x1e, 0xca, 0x5a, 0x6b, 0xf5, 0x85, 0x1d, 0xde, 0x24, 0x6c, 0x4f, 0x2c, 0xfe, 0x6d,
+	0x98, 0x57, 0xe7, 0x66, 0x71, 0x6f, 0xc8, 0x4f, 0x12, 0xe5, 0x45, 0x0b, 0x26, 0x23, 0x32, 0xd6,
+	0xf7, 0xf9, 0x49, 0xe2, 0x1c, 0xc0, 0xa2, 0x94, 0x7f, 0xcf, 0xc6, 0x5c, 0x35, 0xfd, 0xdb, 0x45,
+	0xba, 0x44, 0x73, 0x63, 0xc9, 0x16, 0x98, 0xe2, 0xa4, 0xd0, 0x2e, 0xe9, 0xb8, 0xc0, 0x4c, 0x79,
+	0x2a, 0x2b, 0x94, 0x9b, 0xb9, 0xf2, 0x13, 0xca, 0xe1, 0x58, 0x18, 0xce, 0x4f, 0x3c, 0xe9, 0xf7,
+	0xd5, 0x69, 0x67, 0xdd, 0x55, 0x49, 0xe7, 0x8f, 0x4a, 0xb0, 0x44, 0xb5, 0x29, 0x6d, 0x48, 0xee,
+	0x59, 0x9f, 0x7c, 0x85, 0x6e, 0x2a, 0x2f, 0xad, 0xf0, 0x4d, 0x2e, 0x43, 0xcd, 0xdc, 0xc5, 0x44,
+	0xe2, 0xab, 0xfb, 0x64, 0xaa, 0x59, 0x9f, 0x8c, 0xf3, 0x77, 0x4a, 0xb0, 0x28, 0x36, 0x12, 0xd2,
+	0xb6, 0xe5, 0xf0, 0xff, 0x2c, 0xcc, 0x09, 0x8d, 0x40, 0x4a, 0x05, 0xd9, 0xd1, 0x54, 0xb4, 0x12,
+	0x2a, 0x0a, 0xef, 0x5d, 0x73, 0xed, 0xc2, 0xec, 0x21, 0x69, 0x65, 0x41, 0x8f, 0xd0, 0x82, 0x73,
+	0x71, 0x7b, 0xae, 0xf7, 0xae, 0xb9, 0x46, 0xf1, 0xad, 0x3a, 0x2a, 0xcb, 0x88, 0x3b, 0x8f, 0x61,
+	0xce, 0x6a, 0xc8, 0xf2, 0x07, 0xb5, 0x84, 0x3f, 0x28, 0xe7, 0x78, 0x2d, 0x17, 0x38, 0x5e, 0xff,
+	0x79, 0x05, 0x18, 0x12, 0x4b, 0x66, 0x35, 0xd6, 0xec, 0xd3, 0x0b, 0x75, 0x44, 0x9e, 0x42, 0x6c,
+	0x1d, 0x98, 0x91, 0x54, 0x27, 0x2a, 0x62, 0xcb, 0x2c, 0xc8, 0x41, 0x31, 0x2b, 0x35, 0x0e, 0x7d,
+	0x5a, 0x41, 0x76, 0xbe, 0x98, 0xf6, 0xc2, 0x3c, 0xdc, 0x15, 0xe9, 0xe8, 0x02, 0x2d, 0x12, 0x69,
+	0x1b, 0xab, 0x74, 0x76, 0x7d, 0x67, 0xae, 0x5c, 0xdf, 0xd9, 0x9c, 0xcf, 0xcd, 0xb0, 0xce, 0xea,
+	0xb6, 0x75, 0x76, 0x1b, 0xe6, 0xd4, 0x09, 0x45, 0x6f, 0x84, 0xad, 0x4b, 0x53, 0xd8, 0x02, 0xd9,
+	0x3d, 0x68, 0x2b, 0x03, 0x49, 0x9b, 0x80, 0xe2, 0x9c, 0x2f, 0x87, 0xa3, 0xfc, 0x4f, 0xbd, 0x70,
+	0x4d, 0xea, 0x6c, 0x0a, 0x90, 0x3d, 0x85, 0x14, 0xd2, 0x9b, 0x04, 0xf2, 0x68, 0x9c, 0x0f, 0xc8,
+	0x08, 0x46, 0x7b, 0x2a, 0x9b, 0xe1, 0xfc, 0xad, 0x12, 0xb4, 0x71, 0xcd, 0x2c, 0xb2, 0xfc, 0x14,
+	0x88, 0x2b, 0xde, 0x92, 0x2a, 0xad, 0xb2, 0xec, 0x13, 0x68, 0x50, 0x3a, 0x1c, 0xf3, 0x40, 0xd2,
+	0x64, 0xc7, 0xa6, 0xc9, 0x54, 0x9e, 0xec, 0x5d, 0x73, 0xd3, 0xc2, 0x06, 0x45, 0xfe, 0xc7, 0x12,
+	0x34, 0x65, 0x2b, 0xbf, 0xb2, 0x97, 0xa7, 0x6b, 0xc4, 0x32, 0x08, 0x4a, 0x4a, 0x43, 0x17, 0xee,
+	0xc2, 0xc2, 0xc8, 0x4b, 0x26, 0x11, 0xee, 0xe7, 0x96, 0x87, 0x27, 0x0b, 0xe3, 0xe6, 0x4c, 0xa2,
+	0x33, 0xee, 0x25, 0xfe, 0xb0, 0xa7, 0x72, 0x65, 0xd4, 0x40, 0x51, 0x16, 0x4a, 0x90, 0x38, 0xf1,
+	0x4e, 0xb9, 0xdc, 0x77, 0x45, 0xc2, 0xe9, 0xc0, 0xca, 0x61, 0x7a, 0x6a, 0x63, 0xe8, 0xd7, 0xce,
+	0x3f, 0x9d, 0x83, 0xd5, 0x5c, 0x96, 0x8e, 0x71, 0x92, 0x6e, 0x8b, 0xa1, 0x3f, 0x3a, 0x0e, 0xb5,
+	0x71, 0x52, 0x32, 0x3d, 0x1a, 0x56, 0x16, 0x3b, 0x85, 0xeb, 0x4a, 0xc1, 0xc0, 0x39, 0x4d, 0x37,
+	0xc3, 0x32, 0xed, 0x72, 0x1f, 0xd9, 0x4b, 0x98, 0x6d, 0x50, 0xe1, 0x26, 0x13, 0x17, 0xd7, 0xc7,
+	0xce, 0xa0, 0xa3, 0x35, 0x19, 0x29, 0xac, 0x0d, 0x6d, 0x07, 0xdb, 0xfa, 0xf0, 0x8a, 0xb6, 0x2c,
+	0x75, 0xdc, 0x9d, 0x5a, 0x1b, 0xbb, 0x84, 0x5b, 0x2a, 0x8f, 0xa4, 0x71, 0xbe, 0xbd, 0xea, 0x5b,
+	0x8d, 0x8d, 0x0c, 0x0d, 0xbb, 0xd1, 0x2b, 0x2a, 0x66, 0x3f, 0x81, 0x95, 0x0b, 0xcf, 0x4f, 0x54,
+	0xb7, 0x0c, 0xdd, 0xa2, 0x46, 0x4d, 0x6e, 0x5c, 0xd1, 0xe4, 0x4b, 0xf1, 0xb1, 0xb5, 0x45, 0x4d,
+	0xa9, 0xb1, 0xfb, 0x27, 0x65, 0x98, 0xb7, 0xeb, 0x41, 0x32, 0x95, 0xbc, 0xaf, 0x64, 0xa0, 0xd2,
+	0x46, 0x33, 0x70, 0xde, 0xc6, 0x2f, 0x17, 0xd9, 0xf8, 0xa6, 0x55, 0x5d, 0xb9, 0xca, 0x3d, 0x58,
+	0x7d, 0x3b, 0xf7, 0x60, 0xad, 0xd0, 0x3d, 0x38, 0xdd, 0x8b, 0x34, 0xf3, 0xab, 0x7a, 0x91, 0x66,
+	0xdf, 0xe8, 0x45, 0xea, 0xfe, 0xdf, 0x12, 0xb0, 0x3c, 0xf5, 0xb2, 0xc7, 0xc2, 0xad, 0x11, 0xf0,
+	0xa1, 0x14, 0x62, 0xdf, 0x7c, 0x3b, 0x0e, 0x50, 0xab, 0xa5, 0xbe, 0x46, 0x56, 0x34, 0x03, 0x8d,
+	0x4c, 0xf5, 0x6a, 0xce, 0x2d, 0xca, 0xca, 0xb8, 0x48, 0xab, 0x57, 0xbb, 0x48, 0x6b, 0x57, 0xbb,
+	0x48, 0x67, 0xb2, 0x2e, 0xd2, 0xee, 0x5f, 0x2d, 0xc1, 0x52, 0x01, 0x99, 0xfd, 0xe6, 0x06, 0x8e,
+	0x84, 0x61, 0x49, 0x9f, 0xb2, 0x24, 0x0c, 0x13, 0xec, 0xfe, 0x45, 0x98, 0xb3, 0x58, 0xeb, 0x37,
+	0xd7, 0x7e, 0x56, 0x43, 0x14, 0x94, 0x6d, 0x61, 0xdd, 0xff, 0x55, 0x06, 0x96, 0x67, 0xef, 0x3f,
+	0xd5, 0x3e, 0xe4, 0xe7, 0xa9, 0x52, 0x30, 0x4f, 0xff, 0x5f, 0x77, 0x9e, 0x0f, 0x61, 0x51, 0x46,
+	0x4f, 0x1a, 0x8e, 0x2c, 0x41, 0x31, 0xf9, 0x0c, 0xd4, 0x91, 0x6d, 0xff, 0x74, 0xdd, 0x8a, 0x16,
+	0x33, 0xb6, 0xdf, 0x8c, 0x9b, 0xda, 0xe9, 0x42, 0x47, 0xce, 0xd0, 0xee, 0x39, 0x0f, 0x92, 0xa3,
+	0xc9, 0xb1, 0x08, 0x1f, 0xf4, 0xc3, 0xc0, 0xf9, 0x17, 0x15, 0xad, 0xe6, 0x53, 0xa6, 0x54, 0x28,
+	0xbe, 0x0d, 0x2d, 0x73, 0xfb, 0x90, 0xcb, 0x91, 0xf1, 0x65, 0xa2, 0x2a, 0x61, 0x96, 0x62, 0x3b,
+	0x30, 0x4f, 0x42, 0x72, 0xa0, 0xbf, 0x2b, 0xd3, 0x77, 0x6f, 0xf0, 0xcf, 0xec, 0x5d, 0x73, 0x33,
+	0xdf, 0xb0, 0xdf, 0x81, 0x79, 0xdb, 0xf8, 0x93, 0x5a, 0x49, 0x91, 0x35, 0x80, 0x9f, 0xdb, 0x85,
+	0xd9, 0x26, 0xb4, 0xb3, 0xd6, 0xa3, 0x8c, 0xe4, 0x99, 0x52, 0x41, 0xae, 0x38, 0xfb, 0x44, 0x1e,
+	0x56, 0xd6, 0xc8, 0x6f, 0x72, 0xdb, 0xfe, 0xcc, 0x98, 0xa6, 0x75, 0xf1, 0xc7, 0x38, 0xbe, 0xfc,
+	0x3d, 0x80, 0x14, 0x63, 0x6d, 0x68, 0x3d, 0x3b, 0xdc, 0x3d, 0xe8, 0x6d, 0xef, 0x6d, 0x1e, 0x1c,
+	0xec, 0xee, 0xb7, 0xaf, 0x31, 0x06, 0xf3, 0xe4, 0xe6, 0xdb, 0xd1, 0x58, 0x09, 0x31, 0xe9, 0x58,
+	0x51, 0x58, 0x99, 0x2d, 0x43, 0xfb, 0xc9, 0x41, 0x06, 0xad, 0x6c, 0x35, 0x34, 0x7f, 0x38, 0x2b,
+	0xb0, 0x2c, 0xa2, 0x63, 0xb7, 0x04, 0x79, 0x28, 0xed, 0xe4, 0x1f, 0x94, 0xe0, 0x7a, 0x26, 0x23,
+	0x0d, 0xf5, 0x12, 0x0a, 0x88, 0xad, 0x95, 0xd8, 0x20, 0x1d, 0x3e, 0x28, 0x5d, 0x33, 0x23, 0x41,
+	0xf2, 0x19, 0x48, 0xf3, 0x86, 0x6e, 0x9a, 0xe1, 0xa4, 0xa2, 0x2c, 0x67, 0x55, 0x47, 0xd5, 0x64,
+	0x3a, 0x7e, 0x22, 0xa2, 0x6e, 0xcd, 0x8c, 0xf4, 0xf0, 0xd7, 0xee, 0xb2, 0x4a, 0xa2, 0x59, 0x61,
+	0x29, 0x3b, 0x76, 0x7f, 0x0b, 0xf3, 0x9c, 0x7f, 0x5c, 0x01, 0xf6, 0xbd, 0x09, 0x8f, 0x2e, 0x29,
+	0x9e, 0x4b, 0x7b, 0x4d, 0x57, 0xb3, 0x3e, 0xc1, 0x99, 0xf1, 0xe4, 0xf8, 0x33, 0x7e, 0xa9, 0xa2,
+	0x1b, 0xcb, 0x69, 0x74, 0x63, 0x51, 0x84, 0x61, 0xf5, 0xea, 0x08, 0xc3, 0xda, 0x55, 0x11, 0x86,
+	0x5f, 0x83, 0x39, 0xff, 0x34, 0x08, 0x91, 0xe7, 0x51, 0x4f, 0x88, 0x3b, 0x33, 0x6b, 0x15, 0xb4,
+	0xad, 0x25, 0x78, 0x80, 0x18, 0x7b, 0x98, 0x16, 0xe2, 0x83, 0x53, 0x8a, 0x66, 0x35, 0xa5, 0xc0,
+	0xee, 0xe0, 0x94, 0xef, 0x87, 0x7d, 0x2f, 0x09, 0x23, 0x72, 0xec, 0xa8, 0x8f, 0x11, 0x8f, 0xd9,
+	0x6d, 0x98, 0x8f, 0xc3, 0x09, 0x6a, 0x4e, 0x6a, 0xac, 0xc2, 0x93, 0xd4, 0x12, 0xe8, 0xa1, 0x18,
+	0xf1, 0x3a, 0x2c, 0x4d, 0x62, 0xde, 0x1b, 0xf9, 0x71, 0x8c, 0xbb, 0x63, 0x3f, 0x0c, 0x92, 0x28,
+	0x1c, 0x4a, 0x7f, 0xd2, 0xe2, 0x24, 0xe6, 0x4f, 0x45, 0xce, 0xb6, 0xc8, 0x60, 0xdf, 0x4e, 0xbb,
+	0x34, 0xf6, 0xfc, 0x28, 0xee, 0x00, 0x75, 0x49, 0x8d, 0x14, 0xfb, 0x7d, 0xe8, 0xf9, 0x91, 0xee,
+	0x0b, 0x26, 0xe2, 0x4c, 0x84, 0x64, 0x33, 0x13, 0x21, 0x29, 0x03, 0xec, 0xd6, 0xa1, 0xae, 0x3e,
+	0x47, 0x23, 0xf7, 0x24, 0x0a, 0x47, 0xca, 0xc8, 0xc5, 0xdf, 0x6c, 0x1e, 0xca, 0x49, 0x28, 0x0d,
+	0xd4, 0x72, 0x12, 0x3a, 0xbf, 0x0f, 0x4d, 0x63, 0x06, 0xd8, 0xfb, 0xc2, 0xde, 0x46, 0x85, 0x4a,
+	0x5a, 0xc7, 0xe2, 0x98, 0xa4, 0x21, 0xd1, 0x27, 0x03, 0xf6, 0x0d, 0x58, 0x1c, 0xf8, 0x11, 0xa7,
+	0xc0, 0xda, 0x5e, 0xc4, 0xcf, 0x79, 0x14, 0x2b, 0x5f, 0x42, 0x5b, 0x67, 0xb8, 0x02, 0x77, 0x7a,
+	0xb0, 0x64, 0x91, 0x8e, 0xe6, 0xac, 0x19, 0x8a, 0x0a, 0x54, 0xee, 0x4c, 0x3b, 0x62, 0x50, 0xe6,
+	0xe1, 0x9e, 0x24, 0xdd, 0x20, 0xbd, 0x71, 0x14, 0x1e, 0x53, 0x23, 0x25, 0xd7, 0xc2, 0x9c, 0x5f,
+	0x94, 0xa1, 0xb2, 0x17, 0x8e, 0xcd, 0xc3, 0x9d, 0x52, 0xfe, 0x70, 0x47, 0x2a, 0x8f, 0x3d, 0xad,
+	0x1b, 0xca, 0x1d, 0xde, 0x02, 0xd9, 0x3d, 0x98, 0xf7, 0x46, 0x49, 0x2f, 0x09, 0x51, 0x59, 0xbe,
+	0xf0, 0x22, 0x11, 0x42, 0x58, 0x21, 0xb2, 0xc8, 0xe4, 0xb0, 0x65, 0xa8, 0x68, 0x9d, 0x87, 0x0a,
+	0x60, 0x12, 0x2d, 0x35, 0x3a, 0x40, 0xbf, 0x94, 0x3e, 0x4b, 0x99, 0x42, 0xae, 0xb7, 0xbf, 0x17,
+	0x66, 0xb2, 0xd8, 0xb9, 0x8a, 0xb2, 0x50, 0x91, 0x45, 0x46, 0x18, 0xa5, 0x7a, 0xa1, 0x4e, 0x9b,
+	0xde, 0xf8, 0xba, 0xed, 0x8d, 0x5f, 0x83, 0x66, 0x32, 0x3c, 0xef, 0x8d, 0xbd, 0xcb, 0x61, 0xe8,
+	0x0d, 0x24, 0x01, 0x9a, 0x10, 0x7b, 0x00, 0x30, 0x1a, 0x8f, 0x7b, 0xb8, 0x59, 0x46, 0x03, 0x32,
+	0xbf, 0x9b, 0x1b, 0x6d, 0x39, 0xfb, 0x4f, 0x0f, 0x0f, 0x5d, 0xc2, 0x5d, 0xa3, 0x8c, 0xf3, 0x12,
+	0x1a, 0x3a, 0xc3, 0x8c, 0x3b, 0xa5, 0x10, 0x8a, 0xa6, 0x1d, 0x77, 0x4a, 0x11, 0x13, 0x1f, 0xc0,
+	0xbc, 0x90, 0x90, 0x38, 0x2e, 0x1a, 0x80, 0x38, 0xf6, 0xce, 0xa0, 0xce, 0x2f, 0x4b, 0x50, 0xa3,
+	0x05, 0x47, 0x95, 0x41, 0xe4, 0xe9, 0xc3, 0x28, 0x5a, 0xc4, 0x39, 0x37, 0x0b, 0x33, 0xc7, 0x8a,
+	0x4b, 0x2f, 0xeb, 0xd9, 0x37, 0x63, 0xd3, 0xd7, 0xa0, 0xa1, 0x5b, 0x32, 0x56, 0x30, 0x05, 0xd9,
+	0x2d, 0xa8, 0x9e, 0x85, 0x63, 0x65, 0x55, 0x81, 0x3a, 0xaf, 0x0e, 0xc7, 0x2e, 0xe1, 0x69, 0x7f,
+	0xb0, 0x3e, 0x31, 0x04, 0xa1, 0xb9, 0x66, 0xe1, 0x82, 0xb1, 0xce, 0x14, 0x8e, 0xf5, 0x05, 0x2c,
+	0x20, 0x5b, 0x1a, 0xce, 0xf9, 0xe9, 0xf2, 0xf3, 0xeb, 0xb8, 0x1d, 0xf7, 0x87, 0x93, 0x01, 0x37,
+	0x6d, 0x5b, 0x72, 0xbe, 0x4a, 0x5c, 0x69, 0x75, 0xce, 0x3f, 0x2b, 0x09, 0x76, 0xc7, 0x7a, 0xd9,
+	0x5d, 0xa8, 0xa2, 0x14, 0xcc, 0xb8, 0x32, 0x74, 0x58, 0x0b, 0x96, 0x73, 0xa9, 0x04, 0xae, 0x22,
+	0xb9, 0x47, 0xcd, 0xda, 0x85, 0x73, 0x34, 0x35, 0x0c, 0xf5, 0xc8, 0x32, 0xf6, 0x54, 0x06, 0x65,
+	0xeb, 0xc6, 0xd9, 0x52, 0xd5, 0x92, 0xac, 0x6a, 0xf7, 0x1f, 0x9c, 0x72, 0xe3, 0x4c, 0xe9, 0x8f,
+	0x4b, 0x30, 0x67, 0xf5, 0x09, 0x89, 0x76, 0xe8, 0xc5, 0x89, 0x0c, 0x2b, 0x90, 0x2b, 0x6f, 0x42,
+	0x26, 0xc1, 0x97, 0x6d, 0x82, 0xd7, 0x67, 0x14, 0x15, 0xf3, 0x8c, 0xe2, 0x01, 0x34, 0xd2, 0x8b,
+	0x09, 0x76, 0xa7, 0xb0, 0x45, 0x15, 0xe0, 0x93, 0x16, 0x4a, 0xbd, 0xe0, 0x35, 0xc3, 0x0b, 0xee,
+	0x3c, 0x84, 0xa6, 0x51, 0xde, 0xf4, 0x62, 0x97, 0x2c, 0x2f, 0xb6, 0x8e, 0x7e, 0x2b, 0xa7, 0xd1,
+	0x6f, 0xce, 0x97, 0x65, 0x98, 0x43, 0xf2, 0xf6, 0x83, 0xd3, 0xc3, 0x70, 0xe8, 0xf7, 0x2f, 0x89,
+	0xac, 0x14, 0x25, 0xcb, 0x5d, 0x50, 0x91, 0xb9, 0x0d, 0x23, 0xf7, 0xeb, 0x90, 0x5f, 0x21, 0xaa,
+	0x74, 0x1a, 0x65, 0x19, 0x4a, 0x82, 0x63, 0x2f, 0x96, 0xe2, 0x41, 0x6a, 0xe1, 0x16, 0x88, 0x12,
+	0x07, 0x01, 0x8a, 0x65, 0x1c, 0xf9, 0xc3, 0xa1, 0x2f, 0xca, 0x0a, 0x1b, 0xad, 0x28, 0x0b, 0xdb,
+	0x1c, 0xf8, 0xb1, 0x77, 0x9c, 0x9e, 0x3f, 0xea, 0x34, 0x39, 0xf8, 0xbc, 0xd7, 0x86, 0x83, 0x4f,
+	0x04, 0x3f, 0xdb, 0x60, 0x76, 0x21, 0x67, 0x73, 0x0b, 0xe9, 0xfc, 0xdb, 0x32, 0x34, 0x0d, 0xb2,
+	0x40, 0x76, 0x2e, 0xdc, 0x6e, 0x0c, 0x54, 0x1e, 0xcc, 0x07, 0x96, 0xd5, 0x6f, 0x20, 0xec, 0xb6,
+	0xdd, 0x2a, 0x39, 0xfa, 0x89, 0xe1, 0x2d, 0x12, 0xba, 0x09, 0x0d, 0x24, 0xfd, 0x8f, 0xc8, 0xc5,
+	0x20, 0x6f, 0x05, 0x69, 0x40, 0xe5, 0x6e, 0x50, 0x6e, 0x2d, 0xcd, 0x25, 0xe0, 0x8d, 0x47, 0xf5,
+	0x9f, 0x40, 0x4b, 0x56, 0x43, 0x6b, 0x4c, 0x83, 0x4e, 0x99, 0xcf, 0x5a, 0x7f, 0xd7, 0x2a, 0xa9,
+	0xbe, 0xdc, 0x50, 0x5f, 0xd6, 0xaf, 0xfa, 0x52, 0x95, 0x74, 0x1e, 0xeb, 0x28, 0x88, 0xc7, 0x91,
+	0x37, 0x3e, 0x53, 0x02, 0xe5, 0x01, 0x2c, 0x29, 0xb9, 0x31, 0x09, 0xbc, 0x20, 0x08, 0x27, 0x41,
+	0x9f, 0xab, 0x40, 0xb9, 0xa2, 0x2c, 0x67, 0xa0, 0xc3, 0xaa, 0xa9, 0x22, 0x76, 0x0f, 0x6a, 0x42,
+	0x8f, 0x12, 0xbb, 0x72, 0xb1, 0x08, 0x11, 0x45, 0xd8, 0x5d, 0xa8, 0x09, 0x75, 0xaa, 0x3c, 0x95,
+	0xe9, 0x45, 0x01, 0x67, 0x1d, 0x16, 0x28, 0x8e, 0xdb, 0x90, 0x7d, 0xef, 0x14, 0xed, 0xd6, 0x33,
+	0x7d, 0x11, 0xed, 0xbd, 0x0c, 0xec, 0x40, 0xf0, 0x95, 0x79, 0x96, 0xf9, 0xcb, 0x0a, 0x34, 0x0d,
+	0x18, 0xe5, 0x13, 0x1d, 0x40, 0xf5, 0x06, 0xbe, 0x37, 0xe2, 0x09, 0x8f, 0x24, 0x2f, 0x65, 0x50,
+	0x2c, 0xe7, 0x9d, 0x9f, 0xf6, 0xc2, 0x49, 0xd2, 0x1b, 0xf0, 0xd3, 0x88, 0x73, 0xa9, 0x46, 0x64,
+	0x50, 0x2c, 0x87, 0xd4, 0x6c, 0x94, 0x13, 0x47, 0x46, 0x19, 0x54, 0x9d, 0x4c, 0x8a, 0x79, 0xaa,
+	0xa6, 0x27, 0x93, 0x62, 0x56, 0xb2, 0x92, 0xb5, 0x56, 0x20, 0x59, 0x3f, 0x86, 0x15, 0x21, 0x43,
+	0xa5, 0xf4, 0xe8, 0x65, 0x88, 0x6b, 0x4a, 0x2e, 0xbb, 0x07, 0x6d, 0xec, 0xb3, 0x62, 0x8d, 0xd8,
+	0xff, 0x99, 0xe0, 0xb1, 0x92, 0x9b, 0xc3, 0xb1, 0x2c, 0xb9, 0xcb, 0xcd, 0xb2, 0x22, 0x3c, 0x24,
+	0x87, 0x53, 0x59, 0xef, 0xb5, 0x5d, 0xb6, 0x21, 0xcb, 0x66, 0x70, 0xf6, 0x09, 0xac, 0x8e, 0xf8,
+	0xc0, 0xf7, 0xec, 0x2a, 0x7a, 0xe9, 0x26, 0x3f, 0x2d, 0x1b, 0x5b, 0xc1, 0x59, 0xf8, 0x59, 0x38,
+	0x3a, 0xf6, 0xc5, 0xc6, 0x26, 0x1c, 0xfb, 0x55, 0x37, 0x87, 0x3b, 0x73, 0xd0, 0x3c, 0x4a, 0xc2,
+	0xb1, 0x5a, 0xfa, 0x79, 0x68, 0x89, 0xa4, 0x0c, 0x8d, 0x7c, 0x07, 0x6e, 0x10, 0xbd, 0x3e, 0x0f,
+	0xc7, 0xe1, 0x30, 0x3c, 0xbd, 0xb4, 0xcc, 0xf3, 0xff, 0x50, 0x82, 0x25, 0x2b, 0x37, 0xb5, 0xcf,
+	0xc9, 0x97, 0xa8, 0xe2, 0xd9, 0x04, 0x89, 0x2f, 0x1a, 0xdb, 0x82, 0x28, 0x28, 0x8e, 0x6d, 0x5e,
+	0xc8, 0x10, 0xb7, 0xcd, 0xf4, 0x92, 0x86, 0xfa, 0x50, 0xd0, 0x7b, 0x27, 0x4f, 0xef, 0xf2, 0x7b,
+	0x75, 0x7d, 0x43, 0x55, 0xf1, 0x3b, 0x32, 0x98, 0x67, 0x20, 0x07, 0x5d, 0xb1, 0x03, 0x30, 0x4c,
+	0x77, 0x8e, 0xea, 0x41, 0x5f, 0x83, 0xb1, 0xf3, 0xf3, 0x12, 0x40, 0xda, 0x3b, 0x0a, 0x01, 0xd1,
+	0x5b, 0x9b, 0xb8, 0x08, 0x6c, 0x6c, 0x63, 0xef, 0x43, 0x4b, 0x9f, 0xe2, 0xa7, 0xbb, 0x65, 0x53,
+	0x61, 0xa8, 0x5d, 0xdc, 0x81, 0x85, 0xd3, 0x61, 0x78, 0x4c, 0x5a, 0x0c, 0xc5, 0xda, 0xc6, 0x32,
+	0x40, 0x74, 0x5e, 0xc0, 0x8f, 0x24, 0x9a, 0x6e, 0xad, 0x55, 0x73, 0x6b, 0x2d, 0xde, 0x28, 0xbf,
+	0x2c, 0xeb, 0xa3, 0xd4, 0x74, 0x26, 0xde, 0xc8, 0xe5, 0x6c, 0x23, 0x27, 0xd6, 0xa7, 0x9c, 0x5e,
+	0x92, 0xe9, 0x71, 0x78, 0xa5, 0x77, 0xf7, 0x21, 0xcc, 0x47, 0x42, 0x66, 0x2a, 0x81, 0x5a, 0x7d,
+	0x83, 0x40, 0x9d, 0x8b, 0xac, 0x9d, 0xf9, 0xeb, 0xd0, 0xf6, 0x06, 0xe7, 0x3c, 0x4a, 0x7c, 0xf2,
+	0x76, 0x91, 0x1a, 0x25, 0x06, 0xb8, 0x60, 0xe0, 0xa4, 0xad, 0xdc, 0x81, 0x05, 0x19, 0xae, 0xab,
+	0x4b, 0xca, 0x6b, 0x75, 0x29, 0x8c, 0x05, 0x9d, 0x7f, 0xa4, 0x4e, 0x6e, 0xed, 0xd5, 0x7d, 0xf3,
+	0xac, 0x98, 0x23, 0x2c, 0x67, 0x46, 0xf8, 0x35, 0x79, 0x92, 0x3a, 0x50, 0x6e, 0xb5, 0x8a, 0x11,
+	0x16, 0x36, 0x90, 0x27, 0xdf, 0xf6, 0xb4, 0x56, 0xdf, 0x66, 0x5a, 0x9d, 0xff, 0x5c, 0x82, 0xd9,
+	0xbd, 0x70, 0xbc, 0x87, 0x53, 0x8c, 0x3a, 0x0e, 0xb2, 0x89, 0x8e, 0x95, 0x57, 0xc9, 0x2b, 0xc2,
+	0xe7, 0x0a, 0xb5, 0x92, 0xb9, 0xac, 0x56, 0xf2, 0xe7, 0xe1, 0x1d, 0x72, 0xec, 0x46, 0xe1, 0x38,
+	0x8c, 0x90, 0x5d, 0xbd, 0xa1, 0x50, 0x41, 0xc2, 0x20, 0x39, 0x53, 0xe2, 0xf4, 0x4d, 0x45, 0xc8,
+	0xdb, 0x82, 0x46, 0xb0, 0x30, 0xac, 0xa4, 0x16, 0x25, 0xa4, 0x6c, 0x3e, 0xc3, 0xf9, 0x6d, 0x68,
+	0x90, 0x85, 0x41, 0x43, 0xfb, 0x10, 0x1a, 0x67, 0xe1, 0xb8, 0x77, 0xe6, 0x07, 0x89, 0x62, 0xff,
+	0xf9, 0x54, 0xf5, 0xdf, 0xa3, 0x49, 0xd1, 0x05, 0x9c, 0x7f, 0x33, 0x03, 0xb3, 0x4f, 0x82, 0xf3,
+	0xd0, 0xef, 0xd3, 0x69, 0xf1, 0x88, 0x8f, 0x42, 0x75, 0x7b, 0x00, 0x7f, 0xe3, 0x74, 0x50, 0xa8,
+	0xec, 0x58, 0x10, 0x6f, 0x4b, 0x44, 0x85, 0x48, 0x88, 0xee, 0xbd, 0xa6, 0x37, 0xff, 0x04, 0x83,
+	0x19, 0x08, 0x1a, 0x8a, 0x91, 0x79, 0x73, 0x4f, 0xa6, 0xd2, 0xdb, 0x19, 0x35, 0xe3, 0x76, 0x06,
+	0xb6, 0x25, 0x83, 0xfa, 0x44, 0xd4, 0x97, 0x68, 0x4b, 0x42, 0x64, 0xdc, 0x46, 0x5c, 0x38, 0xe6,
+	0xb5, 0xe2, 0x85, 0xc6, 0xad, 0x09, 0xa2, 0x72, 0x26, 0x3e, 0x10, 0x65, 0xc4, 0x66, 0x60, 0x42,
+	0xa8, 0x9e, 0x66, 0x2f, 0x8c, 0x8a, 0x0b, 0xbb, 0x59, 0x18, 0x65, 0xf9, 0x80, 0x6b, 0x91, 0x2b,
+	0xc6, 0x01, 0xe2, 0x76, 0x63, 0x16, 0x37, 0x4c, 0x62, 0x11, 0xd5, 0xac, 0x4c, 0x62, 0x24, 0x18,
+	0x6f, 0x38, 0x3c, 0xf6, 0xfa, 0xaf, 0x84, 0x29, 0xd9, 0x12, 0xe7, 0x39, 0x16, 0x48, 0xa1, 0x79,
+	0xe9, 0xaa, 0x52, 0xfc, 0x4c, 0xd5, 0x35, 0x21, 0xb6, 0x01, 0x4d, 0x72, 0x17, 0xc8, 0x75, 0x9d,
+	0xa7, 0x75, 0x6d, 0x9b, 0xfe, 0x04, 0x5a, 0x59, 0xb3, 0x90, 0x79, 0x92, 0xbd, 0x90, 0x8b, 0x33,
+	0xf6, 0x06, 0x03, 0x19, 0x00, 0xd0, 0x16, 0x37, 0xfc, 0x34, 0x40, 0x0e, 0x09, 0x31, 0x61, 0xa2,
+	0xc0, 0x22, 0x15, 0xb0, 0x30, 0x76, 0x0b, 0xea, 0x68, 0xf5, 0x8d, 0x3d, 0x7f, 0x40, 0x21, 0x33,
+	0xc2, 0xf8, 0xd4, 0x18, 0xd6, 0xa1, 0x7e, 0xd3, 0xb6, 0xb9, 0x44, 0xb3, 0x62, 0x61, 0x38, 0x37,
+	0x3a, 0x3d, 0x4a, 0x03, 0x93, 0x6d, 0x90, 0x7d, 0x44, 0xc7, 0xb0, 0x09, 0xa7, 0xe8, 0xe3, 0xf9,
+	0x8d, 0x77, 0xe4, 0x98, 0x25, 0xd1, 0xaa, 0xbf, 0x47, 0x58, 0xc4, 0x15, 0x25, 0x51, 0x69, 0x13,
+	0x9e, 0xf0, 0x15, 0x4b, 0x69, 0x93, 0x45, 0xc9, 0x13, 0x2e, 0x0a, 0x38, 0x9b, 0xd0, 0x32, 0x2b,
+	0x60, 0x75, 0xa8, 0x3e, 0x3b, 0xdc, 0x3d, 0x68, 0x5f, 0x63, 0x4d, 0x98, 0x3d, 0xda, 0x7d, 0xfe,
+	0x7c, 0x7f, 0x77, 0xa7, 0x5d, 0x62, 0x2d, 0xa8, 0xeb, 0x88, 0xcb, 0x32, 0xa6, 0x36, 0xb7, 0xb7,
+	0x77, 0x0f, 0x9f, 0xef, 0xee, 0xb4, 0x2b, 0xce, 0x1f, 0x95, 0xa1, 0x69, 0xd4, 0x7c, 0x85, 0x8b,
+	0xe6, 0x16, 0x00, 0x59, 0x12, 0x69, 0xec, 0x45, 0xd5, 0x35, 0x10, 0x94, 0x8c, 0xda, 0xc6, 0xae,
+	0x88, 0x8b, 0x8e, 0x2a, 0x4d, 0xf3, 0x45, 0x37, 0x0a, 0xcd, 0x03, 0x87, 0x9a, 0x6b, 0x83, 0x48,
+	0x4b, 0x12, 0xa0, 0x00, 0x40, 0xc1, 0x61, 0x26, 0x84, 0x6b, 0x13, 0xf1, 0x38, 0x1c, 0x9e, 0x73,
+	0x51, 0x44, 0xe8, 0x63, 0x16, 0x86, 0x6d, 0x49, 0x11, 0x63, 0x04, 0xe7, 0xd6, 0x5c, 0x1b, 0x64,
+	0xdf, 0x54, 0x6b, 0x53, 0xa7, 0xb5, 0x59, 0xcd, 0x4f, 0xb4, 0xb9, 0x2e, 0x4e, 0x02, 0x6c, 0x73,
+	0x30, 0x90, 0xb9, 0xe6, 0xb5, 0xc9, 0xc8, 0xbc, 0xa3, 0xab, 0x84, 0x44, 0x01, 0xa3, 0x96, 0x8b,
+	0x19, 0xf5, 0x8d, 0xe4, 0xec, 0xec, 0x42, 0xf3, 0xd0, 0xb8, 0xf5, 0x4b, 0x32, 0x4b, 0xdd, 0xf7,
+	0x95, 0xb2, 0xce, 0x40, 0x8c, 0xee, 0x94, 0xcd, 0xee, 0x38, 0xff, 0xb0, 0x24, 0x2e, 0x52, 0xe9,
+	0xee, 0x8b, 0xb6, 0x1d, 0x68, 0x69, 0x77, 0x72, 0x1a, 0x7b, 0x6e, 0x61, 0x58, 0x86, 0xba, 0xd2,
+	0x0b, 0x4f, 0x4e, 0x62, 0xae, 0xa2, 0x44, 0x2d, 0x4c, 0x29, 0x8e, 0xa8, 0x8a, 0xfa, 0xa2, 0x85,
+	0x58, 0x46, 0x8b, 0xe6, 0x70, 0x24, 0x12, 0xe9, 0x91, 0x54, 0xf1, 0xb1, 0x3a, 0xad, 0x43, 0xe4,
+	0xb3, 0xb3, 0x7c, 0x0f, 0xea, 0xba, 0x5e, 0x7b, 0x57, 0x50, 0x25, 0x75, 0x3e, 0xee, 0x3e, 0x64,
+	0x54, 0x5a, 0x9d, 0x16, 0xb4, 0x9a, 0xcf, 0x60, 0xeb, 0xc0, 0x4e, 0xfc, 0x28, 0x5b, 0x5c, 0x10,
+	0x6f, 0x41, 0x8e, 0xf3, 0x12, 0x96, 0x14, 0xcf, 0x19, 0x1a, 0xad, 0xbd, 0x88, 0xa5, 0xab, 0x64,
+	0x52, 0x39, 0x2f, 0x93, 0x9c, 0x5f, 0x54, 0x60, 0x56, 0xae, 0x74, 0xee, 0xe6, 0xb8, 0x58, 0x67,
+	0x0b, 0x63, 0x1d, 0xeb, 0x8e, 0x20, 0x09, 0x30, 0xb9, 0x13, 0xe5, 0xf6, 0x9a, 0x4a, 0xd1, 0x5e,
+	0xc3, 0xa0, 0x3a, 0xf6, 0x92, 0x33, 0x72, 0xbd, 0x34, 0x5c, 0xfa, 0xad, 0x1c, 0xa6, 0x35, 0xdb,
+	0x61, 0x5a, 0x74, 0x4f, 0x5e, 0xa8, 0x53, 0xf9, 0x7b, 0xf2, 0x37, 0xa1, 0x21, 0xee, 0x56, 0xa7,
+	0x3e, 0xd1, 0x14, 0x40, 0xea, 0x15, 0x09, 0x92, 0x10, 0xf2, 0xba, 0x4e, 0x8a, 0x7c, 0x85, 0xdd,
+	0xed, 0xdb, 0x30, 0x23, 0xee, 0x8b, 0xc8, 0x28, 0xe0, 0x9b, 0xea, 0xbc, 0x50, 0x94, 0x53, 0x7f,
+	0x45, 0x38, 0x91, 0x2b, 0xcb, 0x9a, 0x37, 0x4e, 0x9b, 0xf6, 0x8d, 0x53, 0xd3, 0x95, 0xdb, 0xb2,
+	0x5d, 0xb9, 0xce, 0x23, 0x98, 0xb3, 0xaa, 0x43, 0xe9, 0x2a, 0xa3, 0x88, 0xdb, 0xd7, 0xd8, 0x1c,
+	0x34, 0x9e, 0x1c, 0xf4, 0x1e, 0xed, 0x3f, 0x79, 0xbc, 0xf7, 0xbc, 0x5d, 0xc2, 0xe4, 0xd1, 0x8b,
+	0xed, 0xed, 0xdd, 0xdd, 0x1d, 0x92, 0xb6, 0x00, 0x33, 0x8f, 0x36, 0x9f, 0xec, 0x93, 0xac, 0xdd,
+	0x11, 0xb4, 0x2d, 0xeb, 0xd2, 0x67, 0x34, 0xdf, 0x04, 0xa6, 0xec, 0x7e, 0x8a, 0x26, 0x1a, 0x0f,
+	0x79, 0xa2, 0x02, 0xdc, 0x17, 0x65, 0xce, 0x13, 0x9d, 0xa1, 0xee, 0x68, 0xa4, 0xb5, 0xa4, 0x2c,
+	0x22, 0x27, 0x29, 0xcb, 0x22, 0xb2, 0xa8, 0xab, 0xf3, 0x9d, 0x2e, 0x74, 0x76, 0x38, 0xd6, 0xb6,
+	0x39, 0x1c, 0x66, 0xba, 0x83, 0x86, 0x5b, 0x41, 0x9e, 0xb4, 0xea, 0xbe, 0x07, 0xd7, 0x37, 0x45,
+	0x2c, 0xfb, 0x6f, 0x2a, 0xd4, 0xd1, 0xe9, 0xc0, 0x4a, 0xb6, 0x4a, 0xd9, 0xd8, 0x23, 0x58, 0xdc,
+	0xe1, 0xc7, 0x93, 0xd3, 0x7d, 0x7e, 0x9e, 0x36, 0xc4, 0xa0, 0x1a, 0x9f, 0x85, 0x17, 0x72, 0x7e,
+	0xe8, 0x37, 0x7b, 0x17, 0x60, 0x88, 0x65, 0x7a, 0xf1, 0x98, 0xf7, 0xd5, 0x3d, 0x45, 0x42, 0x8e,
+	0xc6, 0xbc, 0xef, 0x7c, 0x0c, 0xcc, 0xac, 0x47, 0xce, 0x17, 0xea, 0x5a, 0x93, 0xe3, 0x5e, 0x7c,
+	0x19, 0x27, 0x7c, 0xa4, 0x2e, 0x60, 0x9a, 0x90, 0x73, 0x07, 0x5a, 0x87, 0xde, 0xa5, 0xcb, 0x7f,
+	0x2a, 0x5f, 0x50, 0x58, 0x85, 0xd9, 0xb1, 0x77, 0x89, 0x24, 0xa8, 0x9d, 0xc1, 0x94, 0xed, 0xfc,
+	0x9f, 0x32, 0xcc, 0x88, 0x92, 0x58, 0xeb, 0x80, 0xc7, 0x89, 0x1f, 0x10, 0xa7, 0xa9, 0x5a, 0x0d,
+	0x28, 0xc7, 0xdb, 0xe5, 0x02, 0xde, 0x96, 0x1e, 0x0a, 0x75, 0xdf, 0x4b, 0x32, 0xb0, 0x85, 0x21,
+	0xa7, 0xa5, 0x31, 0xcb, 0xc2, 0x65, 0x98, 0x02, 0x99, 0x43, 0x8e, 0x54, 0xa3, 0x13, 0xfd, 0x53,
+	0x62, 0x4b, 0xb2, 0xb1, 0x09, 0x15, 0xea, 0x8d, 0xb3, 0x82, 0xdb, 0x73, 0x7a, 0x63, 0x4e, 0x3f,
+	0xac, 0xbf, 0x85, 0x7e, 0x28, 0xdc, 0x16, 0x6f, 0xd2, 0x0f, 0xe1, 0x2d, 0xf4, 0x43, 0x87, 0x41,
+	0x9b, 0x2e, 0x93, 0xa3, 0x05, 0xa2, 0x68, 0xf7, 0xef, 0x96, 0xa0, 0x2d, 0xa9, 0x48, 0xe7, 0xa9,
+	0xe3, 0xb2, 0x37, 0xdd, 0x3a, 0xba, 0x0d, 0x73, 0x64, 0xff, 0x68, 0x11, 0x20, 0x8f, 0x9e, 0x2c,
+	0x10, 0xc7, 0xa1, 0x22, 0x5e, 0x46, 0xfe, 0x50, 0x2e, 0x8a, 0x09, 0x29, 0x29, 0x12, 0x79, 0x32,
+	0xf6, 0xb6, 0xe4, 0xea, 0xb4, 0xf3, 0x27, 0x25, 0x58, 0x34, 0x3a, 0x2c, 0xa9, 0xf0, 0x21, 0xb4,
+	0xf4, 0x9b, 0x0d, 0x5c, 0x6f, 0x6e, 0xab, 0x36, 0xdb, 0xa4, 0x9f, 0x59, 0x85, 0x69, 0x31, 0xbd,
+	0x4b, 0xea, 0x60, 0x3c, 0x19, 0xc9, 0x5d, 0xc5, 0x84, 0x90, 0x90, 0x2e, 0x38, 0x7f, 0xa5, 0x8b,
+	0x88, 0x7d, 0xcd, 0xc2, 0xc8, 0x6f, 0x8c, 0x76, 0x9b, 0x2e, 0x54, 0x95, 0x7e, 0x63, 0x13, 0x74,
+	0xfe, 0x72, 0x19, 0x96, 0x84, 0x21, 0x2e, 0x1d, 0x20, 0xfa, 0xda, 0xec, 0x8c, 0xf0, 0x49, 0x08,
+	0x8e, 0xdc, 0xbb, 0xe6, 0xca, 0x34, 0xfb, 0xce, 0x5b, 0x3a, 0x0f, 0x74, 0x40, 0xf0, 0x94, 0xb5,
+	0xa8, 0x14, 0xad, 0xc5, 0x1b, 0x66, 0xba, 0xc8, 0x85, 0x5f, 0x2b, 0x76, 0xe1, 0xbf, 0x95, 0xcb,
+	0x7c, 0x6b, 0x16, 0x6a, 0x71, 0x3f, 0x1c, 0x73, 0x67, 0x05, 0x96, 0xed, 0x29, 0x90, 0x82, 0xea,
+	0xe7, 0x25, 0xe8, 0x3c, 0x12, 0x07, 0x83, 0x7e, 0x70, 0xba, 0xe7, 0xc7, 0x49, 0x18, 0xe9, 0x37,
+	0x08, 0x6e, 0x01, 0xc4, 0x89, 0x17, 0x49, 0x85, 0x56, 0xa8, 0x06, 0x06, 0x82, 0x23, 0xe1, 0xc1,
+	0x40, 0xe4, 0x8a, 0x15, 0xd4, 0xe9, 0x9c, 0xea, 0x25, 0x9d, 0x09, 0x96, 0x02, 0xf3, 0x81, 0x08,
+	0xa3, 0xc7, 0x2e, 0xf3, 0x73, 0x92, 0xfe, 0xc2, 0x42, 0xcf, 0xa0, 0xce, 0x1f, 0x94, 0x61, 0x21,
+	0xed, 0x24, 0x85, 0x7b, 0xd8, 0x32, 0x44, 0x6a, 0x2d, 0xa9, 0x0c, 0x91, 0x8e, 0xff, 0x9e, 0x8f,
+	0x6a, 0x8c, 0xe1, 0x4f, 0x30, 0x50, 0x76, 0x1b, 0x9a, 0x2a, 0x15, 0x4e, 0x12, 0xe3, 0x32, 0xb0,
+	0x09, 0x8b, 0xe0, 0x58, 0x54, 0xa4, 0xa4, 0x52, 0x28, 0x53, 0x74, 0x31, 0x69, 0x94, 0xd0, 0x97,
+	0x62, 0xe6, 0x55, 0x92, 0xb5, 0x85, 0x26, 0x22, 0xde, 0x65, 0x21, 0x2d, 0xc4, 0xdc, 0xa1, 0xeb,
+	0xfa, 0x11, 0x15, 0xcd, 0x99, 0xa2, 0xc6, 0x34, 0xb2, 0xb9, 0xea, 0x9a, 0x90, 0xb2, 0xe8, 0xc2,
+	0x89, 0x71, 0xda, 0x59, 0x75, 0x2d, 0xcc, 0xf9, 0x9b, 0x25, 0xb8, 0x51, 0xb0, 0x8c, 0x92, 0x53,
+	0x77, 0x60, 0xf1, 0x44, 0x67, 0xaa, 0xa9, 0x16, 0xec, 0xba, 0xa2, 0xa2, 0x1f, 0xec, 0xe9, 0x75,
+	0xf3, 0x1f, 0x68, 0xe5, 0x54, 0x2c, 0x9e, 0x15, 0xc4, 0x9e, 0xcf, 0x70, 0x0e, 0xa1, 0xbb, 0xfb,
+	0x1a, 0x19, 0x7f, 0xdb, 0x7c, 0x4a, 0x4e, 0x51, 0xd6, 0x46, 0x4e, 0xb0, 0x5d, 0xed, 0x46, 0x3a,
+	0x81, 0x39, 0xab, 0x2e, 0xf6, 0xad, 0xb7, 0xad, 0xc4, 0xe4, 0xd1, 0x35, 0xb9, 0xea, 0xe2, 0x2d,
+	0x3c, 0x15, 0x4a, 0x6f, 0x40, 0xce, 0x39, 0x2c, 0x3c, 0x9d, 0x0c, 0x13, 0x3f, 0x7d, 0x17, 0x8f,
+	0x7d, 0x47, 0x7e, 0x44, 0x55, 0xa8, 0xa9, 0x2b, 0x6c, 0xca, 0x2c, 0x87, 0x33, 0x36, 0xc2, 0x9a,
+	0x7a, 0xf9, 0x16, 0xf3, 0x19, 0xce, 0x0d, 0x58, 0x4d, 0x9b, 0x14, 0x73, 0xa7, 0x36, 0x87, 0x3f,
+	0x2c, 0x89, 0x98, 0x30, 0xfb, 0x99, 0x3e, 0xf6, 0x18, 0x96, 0x62, 0x3f, 0x38, 0x1d, 0x72, 0xb3,
+	0x9e, 0x58, 0xce, 0xc4, 0x75, 0xbb, 0x7b, 0xf2, 0x29, 0x3f, 0xb7, 0xe8, 0x0b, 0x24, 0x90, 0xe2,
+	0x8e, 0xa6, 0x04, 0x92, 0x99, 0x92, 0xa2, 0x01, 0x7c, 0x17, 0xe6, 0xed, 0xc6, 0xd8, 0x27, 0x32,
+	0x0a, 0x3e, 0xed, 0x99, 0x79, 0xee, 0x63, 0x53, 0x86, 0x55, 0xd2, 0xf9, 0xb2, 0x04, 0x1d, 0x97,
+	0x23, 0x19, 0x73, 0xa3, 0x51, 0x49, 0x3d, 0x0f, 0x73, 0xd5, 0x4e, 0x1f, 0xb0, 0x8e, 0xae, 0x57,
+	0x63, 0x5d, 0x9f, 0xba, 0x28, 0x7b, 0xd7, 0x0a, 0x46, 0xb5, 0x55, 0x87, 0x19, 0x39, 0xbe, 0x55,
+	0xb8, 0x2e, 0xbb, 0xa4, 0xba, 0x93, 0x1e, 0x18, 0x58, 0x8d, 0x5a, 0x07, 0x06, 0x5d, 0xe8, 0x88,
+	0xa7, 0x26, 0xcc, 0x71, 0xc8, 0x0f, 0x77, 0x80, 0x3d, 0xf5, 0xfa, 0x5e, 0x14, 0x86, 0xc1, 0x21,
+	0x8f, 0x64, 0x7c, 0x0f, 0x29, 0x40, 0xe4, 0x4f, 0x57, 0xba, 0x9a, 0x48, 0xa9, 0xd7, 0x11, 0xc2,
+	0x40, 0xbd, 0x42, 0x21, 0x52, 0x8e, 0x0b, 0x4b, 0x5b, 0xde, 0x2b, 0xae, 0x6a, 0x4a, 0x67, 0xa9,
+	0x39, 0xd6, 0x95, 0xaa, 0xb9, 0x57, 0x97, 0x5b, 0xf2, 0xcd, 0xba, 0x66, 0x69, 0x67, 0x03, 0x96,
+	0xed, 0x3a, 0xa5, 0x28, 0xe9, 0x42, 0x7d, 0x24, 0x31, 0xd9, 0x3b, 0x9d, 0xbe, 0xf7, 0x05, 0x34,
+	0x8d, 0xe7, 0x43, 0xd8, 0x2a, 0x2c, 0xbd, 0x7c, 0xf2, 0xfc, 0x60, 0xf7, 0xe8, 0xa8, 0x77, 0xf8,
+	0x62, 0xeb, 0xb3, 0xdd, 0x1f, 0xf4, 0xf6, 0x36, 0x8f, 0xf6, 0xda, 0xd7, 0xd8, 0x0a, 0xb0, 0x83,
+	0xdd, 0xa3, 0xe7, 0xbb, 0x3b, 0x16, 0x5e, 0x62, 0xb7, 0xa0, 0xfb, 0xe2, 0xe0, 0xc5, 0xd1, 0xee,
+	0x4e, 0xaf, 0xe8, 0xbb, 0x32, 0x7b, 0x17, 0x6e, 0xc8, 0xfc, 0x82, 0xcf, 0x2b, 0xf7, 0x1e, 0x42,
+	0x3b, 0xeb, 0xff, 0xb0, 0x3c, 0x46, 0x6f, 0x72, 0x2d, 0x6d, 0x7c, 0x59, 0x81, 0x79, 0x11, 0xa5,
+	0x27, 0x1e, 0xba, 0xe4, 0x11, 0x7b, 0x0a, 0xb3, 0xf2, 0xc5, 0x54, 0xa6, 0x48, 0xcb, 0x7e, 0xa3,
+	0xb5, 0xbb, 0x92, 0x85, 0xe5, 0xb2, 0x2e, 0xfd, 0x95, 0xff, 0xf4, 0x3f, 0xfe, 0x76, 0x79, 0x8e,
+	0x35, 0xef, 0x9f, 0x7f, 0x74, 0xff, 0x94, 0x07, 0x31, 0xd6, 0xf1, 0x7b, 0x00, 0xe9, 0x3b, 0xa0,
+	0xac, 0xa3, 0x7d, 0x00, 0x99, 0x47, 0x52, 0xbb, 0x37, 0x0a, 0x72, 0x64, 0xbd, 0x37, 0xa8, 0xde,
+	0x25, 0x67, 0x1e, 0xeb, 0xf5, 0x03, 0x3f, 0x11, 0x6f, 0x82, 0x7e, 0x5a, 0xba, 0xc7, 0x06, 0xd0,
+	0x32, 0x5f, 0xe8, 0x64, 0xea, 0xfc, 0xa7, 0xe0, 0x8d, 0xd1, 0xee, 0x3b, 0x85, 0x79, 0x8a, 0x96,
+	0xa9, 0x8d, 0xeb, 0x4e, 0x1b, 0xdb, 0x98, 0x50, 0x89, 0xb4, 0x95, 0xa1, 0xe0, 0xf0, 0xf4, 0x21,
+	0x4e, 0x76, 0xd3, 0x60, 0xba, 0xdc, 0x33, 0xa0, 0xdd, 0x77, 0xa7, 0xe4, 0xca, 0xb6, 0xde, 0xa5,
+	0xb6, 0x56, 0x1d, 0x86, 0x6d, 0xf5, 0xa9, 0x8c, 0x7a, 0x06, 0xf4, 0xd3, 0xd2, 0xbd, 0x8d, 0x7f,
+	0x7f, 0x07, 0x1a, 0xfa, 0x6c, 0x98, 0xfd, 0x04, 0xe6, 0xac, 0x30, 0x4a, 0xa6, 0x86, 0x51, 0x14,
+	0x75, 0xd9, 0xbd, 0x59, 0x9c, 0x29, 0x1b, 0xbe, 0x45, 0x0d, 0x77, 0xd8, 0x0a, 0x36, 0x2c, 0xe3,
+	0x10, 0xef, 0x53, 0x40, 0xb0, 0xb8, 0x4f, 0xf8, 0xca, 0x90, 0x64, 0xa2, 0xb1, 0x9b, 0x59, 0xe1,
+	0x62, 0xb5, 0xf6, 0xee, 0x94, 0x5c, 0xd9, 0xdc, 0x4d, 0x6a, 0x6e, 0x85, 0x2d, 0x9b, 0xcd, 0xe9,
+	0xf3, 0x5a, 0x4e, 0x97, 0x68, 0xcd, 0x37, 0x2a, 0xd9, 0xbb, 0x9a, 0xb0, 0x8a, 0xde, 0xae, 0xd4,
+	0x24, 0x92, 0x7f, 0xc0, 0xd2, 0xe9, 0x50, 0x53, 0x8c, 0xd1, 0xf2, 0x99, 0x4f, 0x54, 0xb2, 0x63,
+	0x68, 0x1a, 0x2f, 0x59, 0xb1, 0x1b, 0x53, 0x5f, 0xdd, 0xea, 0x76, 0x8b, 0xb2, 0x8a, 0x86, 0x62,
+	0xd6, 0x7f, 0x1f, 0x15, 0x9d, 0x1f, 0x41, 0x43, 0xbf, 0x8d, 0xc4, 0x56, 0x8d, 0xb7, 0xaa, 0xcc,
+	0xb7, 0x9c, 0xba, 0x9d, 0x7c, 0x46, 0x11, 0xf1, 0x99, 0xb5, 0x23, 0xf1, 0xbd, 0x84, 0xa6, 0xf1,
+	0xfe, 0x91, 0x1e, 0x40, 0xfe, 0x8d, 0x25, 0x3d, 0x80, 0x82, 0xe7, 0x92, 0x9c, 0x45, 0x6a, 0xa2,
+	0xc9, 0x1a, 0x44, 0xdf, 0xc9, 0xeb, 0x30, 0x66, 0xfb, 0x70, 0x5d, 0x4a, 0xec, 0x63, 0xfe, 0x55,
+	0x96, 0xa1, 0xe0, 0x59, 0xd0, 0x07, 0x25, 0xf6, 0x10, 0xea, 0xea, 0x99, 0x2b, 0xb6, 0x52, 0xfc,
+	0x5c, 0x57, 0x77, 0x35, 0x87, 0x4b, 0xf1, 0xfa, 0x03, 0x80, 0xf4, 0xb1, 0x25, 0x2d, 0x24, 0x72,
+	0x8f, 0x37, 0x69, 0x0a, 0xc8, 0xbf, 0xcc, 0xe4, 0xac, 0xd0, 0x00, 0xdb, 0x8c, 0x84, 0x44, 0xc0,
+	0x2f, 0xd4, 0x7d, 0xf9, 0x1f, 0x43, 0xd3, 0x78, 0x6f, 0x49, 0x4f, 0x5f, 0xfe, 0xad, 0x26, 0x3d,
+	0x7d, 0x05, 0xcf, 0x33, 0x39, 0x5d, 0xaa, 0x7d, 0xd9, 0x59, 0xc0, 0xda, 0x63, 0xff, 0x34, 0x18,
+	0x89, 0x02, 0xb8, 0x40, 0x67, 0x30, 0x67, 0x3d, 0xaa, 0xa4, 0x39, 0xb4, 0xe8, 0xc9, 0x26, 0xcd,
+	0xa1, 0x85, 0xef, 0x30, 0x29, 0x3a, 0x73, 0x16, 0xb1, 0x9d, 0x73, 0x2a, 0x62, 0xb4, 0xf4, 0x43,
+	0x68, 0x1a, 0x0f, 0x24, 0xe9, 0xb1, 0xe4, 0xdf, 0x62, 0xd2, 0x63, 0x29, 0x7a, 0x4f, 0x69, 0x99,
+	0xda, 0x98, 0x77, 0x88, 0x14, 0xe8, 0xe6, 0x37, 0xd6, 0xfd, 0x13, 0x98, 0xb7, 0x9f, 0x4c, 0xd2,
+	0xbc, 0x5f, 0xf8, 0xf8, 0x92, 0xe6, 0xfd, 0x29, 0xef, 0x2c, 0x49, 0x92, 0xbe, 0xb7, 0xa4, 0x1b,
+	0xb9, 0xff, 0xb9, 0x8c, 0x2e, 0xfb, 0x82, 0x7d, 0x0f, 0x05, 0x9c, 0xbc, 0x8a, 0xcf, 0x56, 0x0d,
+	0xaa, 0x35, 0x2f, 0xec, 0x6b, 0x7e, 0xc9, 0xdd, 0xda, 0xb7, 0x89, 0x59, 0xdc, 0x5d, 0xa7, 0x5d,
+	0x8b, 0xae, 0xe4, 0x1b, 0xbb, 0x96, 0x79, 0x6b, 0xdf, 0xd8, 0xb5, 0xac, 0x9b, 0xfb, 0xd9, 0x5d,
+	0x2b, 0xf1, 0xb1, 0x8e, 0x00, 0x16, 0x32, 0x57, 0x3d, 0x34, 0x57, 0x14, 0xdf, 0xc6, 0xeb, 0xde,
+	0x7a, 0xf3, 0x0d, 0x11, 0x5b, 0x82, 0x28, 0x21, 0x78, 0x5f, 0xdd, 0x7d, 0xfc, 0x7d, 0x68, 0x99,
+	0xcf, 0xb8, 0x30, 0x93, 0x95, 0xb3, 0x2d, 0xbd, 0x53, 0x98, 0x67, 0x2f, 0x2e, 0x6b, 0x99, 0xcd,
+	0xb0, 0xef, 0xc3, 0x8a, 0x66, 0x75, 0xf3, 0xf6, 0x40, 0xcc, 0xde, 0x2b, 0xb8, 0x53, 0x60, 0xea,
+	0x71, 0xdd, 0x1b, 0x53, 0x2f, 0x1d, 0x3c, 0x28, 0x21, 0xd1, 0xd8, 0x6f, 0x63, 0xa4, 0x1b, 0x46,
+	0xd1, 0x93, 0x20, 0xe9, 0x86, 0x51, 0xf8, 0xa0, 0x86, 0x22, 0x1a, 0xb6, 0x64, 0xcd, 0x91, 0x38,
+	0x88, 0x67, 0x3f, 0x84, 0x05, 0xe3, 0x7e, 0xd6, 0xd1, 0x65, 0xd0, 0xd7, 0x0c, 0x90, 0xbf, 0x3a,
+	0xdc, 0x2d, 0xb2, 0x52, 0x9c, 0x55, 0xaa, 0x7f, 0xd1, 0xb1, 0x26, 0x07, 0x89, 0x7f, 0x1b, 0x9a,
+	0xe6, 0xdd, 0xaf, 0x37, 0xd4, 0xbb, 0x6a, 0x64, 0x99, 0x37, 0x5f, 0x1f, 0x94, 0xd8, 0xa1, 0x08,
+	0xc8, 0xd2, 0xef, 0x74, 0x86, 0x51, 0x76, 0xfb, 0xb4, 0xdf, 0xef, 0xd4, 0x0b, 0x59, 0xf4, 0x72,
+	0xeb, 0xdd, 0xd2, 0x83, 0x12, 0xfb, 0x7b, 0x25, 0x68, 0x59, 0x77, 0xb3, 0xac, 0xf0, 0x96, 0x4c,
+	0xcf, 0x3a, 0x66, 0x9e, 0xd9, 0x35, 0xc7, 0xa5, 0x61, 0xef, 0xdf, 0xfb, 0xae, 0x35, 0xad, 0x9f,
+	0x5b, 0x0e, 0xb5, 0xf5, 0xec, 0x63, 0x9d, 0x5f, 0x64, 0x0b, 0x98, 0x17, 0xb6, 0xbf, 0x78, 0x50,
+	0x62, 0x7f, 0x5c, 0x82, 0x79, 0xdb, 0x0d, 0xac, 0x87, 0x5b, 0xe8, 0x70, 0xd6, 0x8b, 0x3f, 0xc5,
+	0x77, 0xfc, 0x43, 0xea, 0xe5, 0xf3, 0x7b, 0xae, 0xd5, 0x4b, 0xf9, 0x0e, 0xcb, 0xaf, 0xd7, 0x5b,
+	0xf6, 0xa9, 0x78, 0x5d, 0x5a, 0x1d, 0xd6, 0xb0, 0xfc, 0x1b, 0xc7, 0x9a, 0x60, 0xcc, 0x57, 0x89,
+	0x69, 0x11, 0x7e, 0x2c, 0x1e, 0xa9, 0x54, 0xe7, 0x09, 0x48, 0x77, 0x6f, 0xfb, 0xbd, 0x73, 0x9b,
+	0xc6, 0x74, 0xcb, 0xb9, 0x61, 0x8d, 0x29, 0xbb, 0xc3, 0x6f, 0x8a, 0xde, 0xc9, 0x07, 0x85, 0xd3,
+	0x2d, 0x2a, 0xf7, 0xc8, 0xf0, 0xf4, 0x4e, 0x8e, 0x44, 0x27, 0x65, 0x71, 0x8b, 0x39, 0xde, 0xb2,
+	0x1a, 0xe7, 0x1e, 0xf5, 0xf5, 0xb6, 0xf3, 0xde, 0xd4, 0xbe, 0xde, 0x27, 0x67, 0x2e, 0xf6, 0xf8,
+	0x10, 0x20, 0x3d, 0x58, 0x65, 0x99, 0x83, 0x3d, 0x2d, 0x32, 0xf2, 0x67, 0xaf, 0x36, 0x07, 0xaa,
+	0xf3, 0x3f, 0xac, 0xf1, 0x47, 0x42, 0x00, 0x3e, 0x51, 0x47, 0x82, 0xa6, 0x9a, 0x63, 0x9f, 0x80,
+	0x5a, 0x6a, 0x4e, 0xb6, 0x7e, 0x4b, 0xfc, 0xe9, 0xf3, 0xc5, 0x17, 0x30, 0xb7, 0x1f, 0x86, 0xaf,
+	0x26, 0x63, 0x1d, 0x79, 0x62, 0x9f, 0xb3, 0xec, 0x79, 0xf1, 0x59, 0x37, 0x33, 0x0a, 0x67, 0x8d,
+	0xaa, 0xea, 0xb2, 0x8e, 0x51, 0xd5, 0xfd, 0xcf, 0xd3, 0x83, 0xdb, 0x2f, 0x98, 0x07, 0x8b, 0x5a,
+	0xaa, 0xea, 0x8e, 0x77, 0xed, 0x6a, 0x2c, 0x59, 0x9a, 0x6d, 0xc2, 0xd2, 0xc7, 0x55, 0x6f, 0xef,
+	0xc7, 0xaa, 0x4e, 0x92, 0x29, 0xad, 0x1d, 0xde, 0xa7, 0x9b, 0x27, 0x74, 0x58, 0xb1, 0x94, 0x76,
+	0x5c, 0x9f, 0x72, 0x74, 0xe7, 0x2c, 0xd0, 0xde, 0x69, 0xc6, 0xde, 0x65, 0xc4, 0x7f, 0x7a, 0xff,
+	0x73, 0x79, 0x0c, 0xf2, 0x85, 0xda, 0x69, 0xd4, 0x39, 0x91, 0xb5, 0xd3, 0x64, 0x0e, 0x96, 0xac,
+	0x9d, 0x26, 0x77, 0xb0, 0x64, 0x4d, 0xb5, 0x3a, 0xa7, 0x62, 0x43, 0x58, 0xcc, 0x9d, 0x45, 0xe9,
+	0x4d, 0x66, 0xda, 0x09, 0x56, 0x77, 0x6d, 0x7a, 0x01, 0xbb, 0xb5, 0x7b, 0x76, 0x6b, 0x47, 0x30,
+	0xb7, 0xc3, 0xc5, 0x64, 0x89, 0x50, 0xdb, 0xcc, 0x05, 0x3f, 0x33, 0x90, 0x37, 0xbb, 0x25, 0x50,
+	0x9e, 0xad, 0x4a, 0x50, 0x8c, 0x2b, 0xfb, 0x11, 0x34, 0x1f, 0xf3, 0x44, 0xc5, 0xd6, 0x6a, 0x65,
+	0x36, 0x13, 0x6c, 0xdb, 0x2d, 0x08, 0xcd, 0xb5, 0x69, 0x86, 0x6a, 0xbb, 0xcf, 0x07, 0xa7, 0x5c,
+	0x08, 0xa7, 0x9e, 0x3f, 0xf8, 0x82, 0xfd, 0x05, 0xaa, 0x5c, 0x5f, 0x2e, 0x58, 0x31, 0x02, 0x25,
+	0xcd, 0xca, 0x17, 0x32, 0x78, 0x51, 0xcd, 0x41, 0x38, 0xe0, 0x86, 0x52, 0x15, 0x40, 0xd3, 0xb8,
+	0x13, 0xa4, 0x19, 0x28, 0x7f, 0xc5, 0x4c, 0x33, 0x50, 0xc1, 0x15, 0x22, 0xe7, 0x2e, 0xb5, 0xe3,
+	0xb0, 0xb5, 0xb4, 0x1d, 0x71, 0x6d, 0x28, 0x6d, 0xe9, 0xfe, 0xe7, 0xde, 0x28, 0xf9, 0x82, 0xbd,
+	0xa4, 0x77, 0x91, 0xcc, 0xd8, 0xe1, 0x54, 0x3b, 0xcf, 0x86, 0x19, 0xeb, 0xc9, 0x32, 0xb2, 0x6c,
+	0x8d, 0x5d, 0x34, 0x45, 0xba, 0xd7, 0x77, 0x00, 0x8e, 0x92, 0x70, 0xbc, 0xe3, 0xf1, 0x51, 0x18,
+	0xa4, 0xb2, 0x36, 0x8d, 0x5c, 0x4d, 0xe5, 0x97, 0x11, 0xbe, 0xca, 0x5e, 0x1a, 0xe6, 0x8c, 0x15,
+	0x7e, 0xad, 0x88, 0x6b, 0x6a, 0x70, 0xab, 0x9e, 0x90, 0x82, 0x00, 0xd7, 0x07, 0x25, 0xb6, 0x09,
+	0x90, 0x1e, 0x46, 0x6a, 0xe3, 0x24, 0x77, 0xce, 0xa9, 0xc5, 0x5e, 0xc1, 0xc9, 0xe5, 0x21, 0x34,
+	0xd2, 0xd3, 0xad, 0xd5, 0xf4, 0xe6, 0x9d, 0x75, 0x16, 0xa6, 0x77, 0xf0, 0xdc, 0x99, 0x93, 0xd3,
+	0xa6, 0xa9, 0x02, 0x56, 0xc7, 0xa9, 0xa2, 0x83, 0x24, 0x1f, 0x96, 0x44, 0x07, 0xb5, 0x82, 0x43,
+	0x11, 0x97, 0x6a, 0x24, 0x05, 0xe7, 0x3e, 0x9a, 0x9b, 0x0b, 0x0f, 0x44, 0x2c, 0x1f, 0x0b, 0x52,
+	0xab, 0x88, 0xf6, 0x44, 0xd1, 0x3c, 0x82, 0xc5, 0x9c, 0x8f, 0x5d, 0xb3, 0xf4, 0xb4, 0x43, 0x14,
+	0xcd, 0xd2, 0x53, 0xdd, 0xf3, 0xce, 0x75, 0x6a, 0x72, 0xc1, 0x01, 0xb2, 0xa9, 0x2e, 0xfc, 0xa4,
+	0x7f, 0x86, 0xcd, 0xfd, 0x61, 0x09, 0x96, 0x0a, 0x5c, 0xe8, 0xec, 0x7d, 0x65, 0x9e, 0x4f, 0x75,
+	0xaf, 0x77, 0x0b, 0x3d, 0xac, 0xce, 0x11, 0xb5, 0xf3, 0x94, 0x7d, 0x66, 0x6d, 0x6c, 0xc2, 0xb9,
+	0x29, 0x39, 0xf3, 0x8d, 0x4a, 0x45, 0xa1, 0x46, 0xf1, 0x53, 0x58, 0x15, 0x1d, 0xd9, 0x1c, 0x0e,
+	0x33, 0xde, 0xdf, 0x5b, 0xb9, 0x7f, 0x30, 0x63, 0x79, 0xb5, 0xbb, 0xd3, 0xff, 0x01, 0xcd, 0x14,
+	0x05, 0x58, 0x74, 0x95, 0x4d, 0xa0, 0x9d, 0xf5, 0xa8, 0xb2, 0xe9, 0x75, 0x75, 0xdf, 0xb3, 0x0c,
+	0xcd, 0x02, 0x2f, 0xec, 0x6f, 0x51, 0x63, 0xef, 0x39, 0xdd, 0xa2, 0x79, 0x11, 0xb6, 0x27, 0xae,
+	0xc7, 0x5f, 0xd2, 0xee, 0xdf, 0xcc, 0x38, 0x55, 0x03, 0xd3, 0xfc, 0xd5, 0xda, 0xd4, 0x2d, 0xf6,
+	0x1e, 0x7f, 0x40, 0xcd, 0xaf, 0x39, 0xef, 0x14, 0x35, 0x1f, 0x89, 0x4f, 0x84, 0xd1, 0xbb, 0x9a,
+	0xe5, 0x6b, 0xd5, 0x83, 0xb5, 0xa2, 0xf5, 0x9e, 0x6a, 0xbd, 0x64, 0xe6, 0xfa, 0x1a, 0xe9, 0x76,
+	0x2d, 0xd3, 0xdd, 0xab, 0xd9, 0xa7, 0xc0, 0xaf, 0xac, 0xd9, 0xa7, 0xc8, 0x3f, 0x6c, 0xeb, 0x35,
+	0xca, 0x33, 0xfc, 0x69, 0xe9, 0xde, 0xd6, 0x9d, 0x1f, 0xfe, 0xd6, 0xa9, 0x9f, 0x9c, 0x4d, 0x8e,
+	0xd7, 0xfb, 0xe1, 0xe8, 0xfe, 0x50, 0xb9, 0xf5, 0xe4, 0x2d, 0x84, 0xfb, 0xc3, 0x60, 0x70, 0x9f,
+	0xaa, 0x3d, 0x9e, 0xa1, 0xff, 0x88, 0xf5, 0xad, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x95, 0x82,
+	0x58, 0xe9, 0x43, 0x6b, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -10395,9 +10350,9 @@ type LightningClient interface {
 	//notifying the client of newly added/settled invoices. The caller can
 	//optionally specify the add_index and/or the settle_index. If the add_index
 	//is specified, then we'll first start by sending add invoice events for all
-	//invoices with an add_index greater than the specified value. If the
+	//invoices with an add_index greater than the specified value.  If the
 	//settle_index is specified, the next, we'll send out all settle events for
-	//invoices with a settle_index greater than the specified value. One or both
+	//invoices with a settle_index greater than the specified value.  One or both
 	//of these fields can be set. If no fields are set, then we'll only send out
 	//the latest add/settle events.
 	SubscribeInvoices(ctx context.Context, in *InvoiceSubscription, opts ...grpc.CallOption) (Lightning_SubscribeInvoicesClient, error)
@@ -10416,7 +10371,7 @@ type LightningClient interface {
 	//DescribeGraph returns a description of the latest graph state from the
 	//point of view of the node. The graph information is partitioned into two
 	//components: all the nodes/vertexes, and all the edges that connect the
-	//vertexes themselves. As this is a directed graph, the edges also contain
+	//vertexes themselves.  As this is a directed graph, the edges also contain
 	//the node directional specific routing policy which includes: the time lock
 	//delta, fee information, etc.
 	DescribeGraph(ctx context.Context, in *ChannelGraphRequest, opts ...grpc.CallOption) (*ChannelGraph, error)
@@ -10475,7 +10430,7 @@ type LightningClient interface {
 	//
 	//A list of forwarding events are returned. The size of each forwarding event
 	//is 40 bytes, and the max message size able to be returned in gRPC is 4 MiB.
-	//As a result each message can only contain 50k entries. Each response has
+	//As a result each message can only contain 50k entries.  Each response has
 	//the index offset of the last entry. The index offset can be provided to the
 	//request to allow the caller to skip a series of records.
 	ForwardingHistory(ctx context.Context, in *ForwardingHistoryRequest, opts ...grpc.CallOption) (*ForwardingHistoryResponse, error)
@@ -11398,9 +11353,9 @@ type LightningServer interface {
 	//notifying the client of newly added/settled invoices. The caller can
 	//optionally specify the add_index and/or the settle_index. If the add_index
 	//is specified, then we'll first start by sending add invoice events for all
-	//invoices with an add_index greater than the specified value. If the
+	//invoices with an add_index greater than the specified value.  If the
 	//settle_index is specified, the next, we'll send out all settle events for
-	//invoices with a settle_index greater than the specified value. One or both
+	//invoices with a settle_index greater than the specified value.  One or both
 	//of these fields can be set. If no fields are set, then we'll only send out
 	//the latest add/settle events.
 	SubscribeInvoices(*InvoiceSubscription, Lightning_SubscribeInvoicesServer) error
@@ -11419,7 +11374,7 @@ type LightningServer interface {
 	//DescribeGraph returns a description of the latest graph state from the
 	//point of view of the node. The graph information is partitioned into two
 	//components: all the nodes/vertexes, and all the edges that connect the
-	//vertexes themselves. As this is a directed graph, the edges also contain
+	//vertexes themselves.  As this is a directed graph, the edges also contain
 	//the node directional specific routing policy which includes: the time lock
 	//delta, fee information, etc.
 	DescribeGraph(context.Context, *ChannelGraphRequest) (*ChannelGraph, error)
@@ -11478,7 +11433,7 @@ type LightningServer interface {
 	//
 	//A list of forwarding events are returned. The size of each forwarding event
 	//is 40 bytes, and the max message size able to be returned in gRPC is 4 MiB.
-	//As a result each message can only contain 50k entries. Each response has
+	//As a result each message can only contain 50k entries.  Each response has
 	//the index offset of the last entry. The index offset can be provided to the
 	//request to allow the caller to skip a series of records.
 	ForwardingHistory(context.Context, *ForwardingHistoryRequest) (*ForwardingHistoryResponse, error)
diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto
index a025d800f..e0240da52 100644
--- a/lnrpc/rpc.proto
+++ b/lnrpc/rpc.proto
@@ -94,15 +94,13 @@ service WalletUnlocker {
 message GenSeedRequest {
     /**
     aezeed_passphrase is an optional user provided passphrase that will be used
-    to encrypt the generated aezeed cipher seed. When using REST, this field
-    must be encoded as base64.
+    to encrypt the generated aezeed cipher seed.
     */
     bytes aezeed_passphrase = 1;
 
     /**
     seed_entropy is an optional 16-bytes generated via CSPRNG. If not
     specified, then a fresh set of randomness will be used to create the seed.
-    When using REST, this field must be encoded as base64.
     */
     bytes seed_entropy = 2;
 }
@@ -127,8 +125,7 @@ message InitWalletRequest {
     /**
     wallet_password is the passphrase that should be used to encrypt the
     wallet. This MUST be at least 8 chars in length. After creation, this
-    password is required to unlock the daemon. When using REST, this field
-    must be encoded as base64.
+    password is required to unlock the daemon.
     */
     bytes wallet_password = 1;
 
@@ -141,8 +138,7 @@ message InitWalletRequest {
 
     /**
     aezeed_passphrase is an optional user provided passphrase that will be used
-    to encrypt the generated aezeed cipher seed. When using REST, this field
-    must be encoded as base64.
+    to encrypt the generated aezeed cipher seed.
     */
     bytes aezeed_passphrase = 3;
 
@@ -172,7 +168,7 @@ message UnlockWalletRequest {
     /**
     wallet_password should be the current valid passphrase for the daemon. This
     will be required to decrypt on-disk material that the daemon requires to
-    function properly. When using REST, this field must be encoded as base64.
+    function properly.
     */
     bytes wallet_password = 1;
 
@@ -200,13 +196,13 @@ message UnlockWalletResponse {}
 message ChangePasswordRequest {
     /**
     current_password should be the current valid passphrase used to unlock the
-    daemon. When using REST, this field must be encoded as base64.
+    daemon.
     */
     bytes current_password = 1;
 
     /**
     new_password should be the new passphrase that will be needed to unlock the
-    daemon. When using REST, this field must be encoded as base64.
+    daemon.
     */
     bytes new_password = 2;
 }
@@ -554,9 +550,9 @@ service Lightning {
     notifying the client of newly added/settled invoices. The caller can
     optionally specify the add_index and/or the settle_index. If the add_index
     is specified, then we'll first start by sending add invoice events for all
-    invoices with an add_index greater than the specified value. If the
+    invoices with an add_index greater than the specified value.  If the
     settle_index is specified, the next, we'll send out all settle events for
-    invoices with a settle_index greater than the specified value. One or both
+    invoices with a settle_index greater than the specified value.  One or both
     of these fields can be set. If no fields are set, then we'll only send out
     the latest add/settle events.
     */
@@ -599,7 +595,7 @@ service Lightning {
     DescribeGraph returns a description of the latest graph state from the
     point of view of the node. The graph information is partitioned into two
     components: all the nodes/vertexes, and all the edges that connect the
-    vertexes themselves. As this is a directed graph, the edges also contain
+    vertexes themselves.  As this is a directed graph, the edges also contain
     the node directional specific routing policy which includes: the time lock
     delta, fee information, etc.
     */
@@ -707,7 +703,7 @@ service Lightning {
 
     A list of forwarding events are returned. The size of each forwarding event
     is 40 bytes, and the max message size able to be returned in gRPC is 4 MiB.
-    As a result each message can only contain 50k entries. Each response has
+    As a result each message can only contain 50k entries.  Each response has
     the index offset of the last entry. The index offset can be provided to the
     request to allow the caller to skip a series of records.
     */
@@ -861,35 +857,23 @@ message FeeLimit {
 }
 
 message SendRequest {
-    /**
-    The identity pubkey of the payment recipient. When using REST, this field
-    must be encoded as base64.
-    */
+    /// The identity pubkey of the payment recipient
     bytes dest = 1;
 
-    /**
-    The hex-encoded identity pubkey of the payment recipient. Deprecated now
-    that the REST gateway supports base64 encoding of bytes fields.
-    */
-    string dest_string = 2 [deprecated = true];
+    /// The hex-encoded identity pubkey of the payment recipient
+    string dest_string = 2;
 
     /// Number of satoshis to send.
     int64 amt = 3;
 
-    /**
-    The hash to use within the payment's HTLC. When using REST, this field
-    must be encoded as base64.
-    */
+    /// The hash to use within the payment's HTLC
     bytes payment_hash = 4;
 
-    /**
-    The hex-encoded hash to use within the payment's HTLC. Deprecated now
-    that the REST gateway supports base64 encoding of bytes fields.
-    */
-    string payment_hash_string = 5 [deprecated = true];
+    /// The hex-encoded hash to use within the payment's HTLC
+    string payment_hash_string = 5;
 
     /**
-    A bare-bones invoice for a payment within the Lightning Network. With the
+    A bare-bones invoice for a payment within the Lightning Network.  With the
     details of the invoice, the sender has all the data necessary to send a
     payment to the recipient.
     */
@@ -925,8 +909,7 @@ message SendRequest {
     /** 
     An optional field that can be used to pass an arbitrary set of TLV records
     to a peer which understands the new records. This can be used to pass
-    application specific data during the payment attempt. When using REST, the
-    values must be encoded as base64.
+    application specific data during the payment attempt.
     */
     map<uint64, bytes> dest_tlv = 11;
 }
@@ -939,17 +922,11 @@ message SendResponse {
 }
 
 message SendToRouteRequest {
-    /**
-    The payment hash to use for the HTLC. When using REST, this field must be
-    encoded as base64.
-    */
+    /// The payment hash to use for the HTLC.
     bytes payment_hash = 1;
 
-    /**
-    An optional hex-encoded payment hash to be used for the HTLC. Deprecated now
-    that the REST gateway supports base64 encoding of bytes fields.
-    */
-    string payment_hash_string = 2 [deprecated = true];
+    /// An optional hex-encoded payment hash to be used for the HTLC.
+    string payment_hash_string = 2;
 
     reserved 3;
 
@@ -1011,16 +988,10 @@ message ChannelAcceptResponse {
 
 message ChannelPoint {
     oneof funding_txid {
-        /**
-        Txid of the funding transaction. When using REST, this field must be
-        encoded as base64.
-        */
+        /// Txid of the funding transaction
         bytes funding_txid_bytes = 1 [json_name = "funding_txid_bytes"];
 
-        /**
-        Hex-encoded string representing the byte-reversed hash of the funding
-        transaction.
-        */
+        /// Hex-encoded string representing the funding transaction
         string funding_txid_str = 2 [json_name = "funding_txid_str"];
     }
 
@@ -1138,10 +1109,7 @@ message NewAddressResponse {
 }
 
 message SignMessageRequest {
-    /**
-    The message to be signed. When using REST, this field must be encoded as
-    base64.
-    */
+    /// The message to be signed
     bytes msg = 1 [ json_name = "msg" ];
 }
 message SignMessageResponse {
@@ -1150,10 +1118,7 @@ message SignMessageResponse {
 }
 
 message VerifyMessageRequest {
-    /**
-    The message over which the signature is to be verified. When using REST,
-    this field must be encoded as base64.
-    */
+    /// The message over which the signature is to be verified
     bytes msg = 1 [ json_name = "msg" ];
 
     /// The signature to be verified over the given message
@@ -1172,7 +1137,7 @@ message ConnectPeerRequest {
     LightningAddress addr = 1;
 
     /** If set, the daemon will attempt to persistently connect to the target
-     * peer. Otherwise, the call will be synchronous. */
+     * peer.  Otherwise, the call will be synchronous. */
     bool perm = 2;
 }
 message ConnectPeerResponse {
@@ -1541,17 +1506,11 @@ message PendingUpdate {
 }
 
 message OpenChannelRequest {
-    /**
-    The pubkey of the node to open a channel with. When using REST, this field
-    must be encoded as base64.
-    */
+    /// The pubkey of the node to open a channel with
     bytes node_pubkey = 2 [json_name = "node_pubkey"];
 
-    /**
-    The hex encoded pubkey of the node to open a channel with. Deprecated now
-    that the REST gateway supports base64 encoding of bytes fields.
-    */
-    string node_pubkey_string = 3 [json_name = "node_pubkey_string", deprecated = true];
+    /// The hex encoded pubkey of the node to open a channel with
+    string node_pubkey_string = 3 [json_name = "node_pubkey_string"];
 
     /// The number of satoshis the wallet should commit to the channel
     int64 local_funding_amount = 4 [json_name = "local_funding_amount"];
@@ -1783,8 +1742,7 @@ message QueryRoutesRequest {
     FeeLimit fee_limit = 5;
 
     /**
-    A list of nodes to ignore during path finding. When using REST, these fields
-    must be encoded as base64.
+    A list of nodes to ignore during path finding.
     */
     repeated bytes ignored_nodes = 6;
 
@@ -1819,16 +1777,10 @@ message QueryRoutesRequest {
 }
 
 message NodePair {
-    /**
-    The sending node of the pair. When using REST, this field must be encoded as
-    base64.
-    */
+    /// The sending node of the pair.
     bytes from = 1;
 
-    /**
-    The receiving node of the pair. When using REST, this field must be encoded
-    as base64.
-    */
+    /// The receiving node of the pair.
     bytes to = 2;
 }
 
@@ -1922,7 +1874,7 @@ carry the initial payment amount after fees are accounted for.
 message Route {
 
     /**
-    The cumulative (final) time lock across the entire route. This is the CLTV
+    The cumulative (final) time lock across the entire route.  This is the CLTV
     value that should be extended to the first hop in the route. All other hops
     will decrement the time-lock as advertised, leaving enough time for all
     hops to wait for or present the payment preimage to complete the payment.
@@ -1930,7 +1882,7 @@ message Route {
     uint32 total_time_lock = 1 [json_name = "total_time_lock"];
 
     /**
-    The sum of the fees paid at each hop within the final route. In the case
+    The sum of the fees paid at each hop within the final route.  In the case
     of a one-hop payment, this value will be zero as we don't need to pay a fee
     to ourselves.
     */
@@ -2186,15 +2138,11 @@ message Invoice {
 
     /**
     The hex-encoded preimage (32 byte) which will allow settling an incoming
-    HTLC payable to this preimage. When using REST, this field must be encoded
-    as base64.
+    HTLC payable to this preimage
     */
     bytes r_preimage = 3 [json_name = "r_preimage"];
 
-    /**
-    The hash of the preimage. When using REST, this field must be encoded as
-    base64.
-    */
+    /// The hash of the preimage
     bytes r_hash = 4 [json_name = "r_hash"];
 
     /// The value of this invoice in satoshis
@@ -2210,7 +2158,7 @@ message Invoice {
     int64 settle_date = 8 [json_name = "settle_date"];
 
     /**
-    A bare-bones invoice for a payment within the Lightning Network. With the
+    A bare-bones invoice for a payment within the Lightning Network.  With the
     details of the invoice, the sender has all the data necessary to send a
     payment to the recipient.
     */
@@ -2219,8 +2167,7 @@ message Invoice {
     /**
     Hash (SHA-256) of a description of the payment. Used if the description of
     payment (memo) is too long to naturally fit within the description field
-    of an encoded payment request. When using REST, this field must be encoded
-    as base64.
+    of an encoded payment request.
     */
     bytes description_hash = 10 [json_name = "description_hash"];
 
@@ -2334,7 +2281,7 @@ message AddInvoiceResponse {
     bytes r_hash = 1 [json_name = "r_hash"];
 
     /**
-    A bare-bones invoice for a payment within the Lightning Network. With the
+    A bare-bones invoice for a payment within the Lightning Network.  With the
     details of the invoice, the sender has all the data necessary to send a
     payment to the recipient.
     */
@@ -2352,15 +2299,10 @@ message PaymentHash {
     /**
     The hex-encoded payment hash of the invoice to be looked up. The passed
     payment hash must be exactly 32 bytes, otherwise an error is returned.
-    Deprecated now that the REST gateway supports base64 encoding of bytes
-    fields.
     */
-    string r_hash_str = 1 [json_name = "r_hash_str", deprecated = true];
+    string r_hash_str = 1 [json_name = "r_hash_str"];
 
-    /**
-    The payment hash of the invoice to be looked up. When using REST, this field
-    must be encoded as base64.
-    */
+    /// The payment hash of the invoice to be looked up.
     bytes r_hash = 2 [json_name = "r_hash"];
 }
 
@@ -2640,8 +2582,7 @@ message ChannelBackup {
     /**
     Is an encrypted single-chan backup. this can be passed to
     RestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in
-    order to trigger the recovery protocol. When using REST, this field must be
-    encoded as base64.
+    order to trigger the recovery protocol.
     */
     bytes chan_backup = 2 [ json_name = "chan_backup" ];
 }
@@ -2655,8 +2596,7 @@ message MultiChanBackup {
     /**
     A single encrypted blob containing all the static channel backups of the
     channel listed above. This can be stored as a single file or blob, and
-    safely be replaced with any prior/future versions. When using REST, this
-    field must be encoded as base64.
+    safely be replaced with any prior/future versions.
     */
     bytes multi_chan_backup = 2 [ json_name = "multi_chan_backup" ];
 }
@@ -2685,15 +2625,8 @@ message ChannelBackups {
 
 message RestoreChanBackupRequest {
     oneof backup {
-        /**
-        The channels to restore as a list of channel/backup pairs.
-        */
         ChannelBackups chan_backups = 1 [ json_name = "chan_backups" ];
 
-        /**
-        The channels to restore in the packed multi backup format. When using
-        REST, this field must be encoded as base64.
-        */
         bytes multi_chan_backup = 2 [ json_name = "multi_chan_backup" ];
     }
 }
diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json
index 9d4518f12..a366b9c89 100644
--- a/lnrpc/rpc.swagger.json
+++ b/lnrpc/rpc.swagger.json
@@ -163,7 +163,7 @@
         "parameters": [
           {
             "name": "channel_point.funding_txid_str",
-            "description": "*\nHex-encoded string representing the byte-reversed hash of the funding\ntransaction.",
+            "description": "/ Hex-encoded string representing the funding transaction",
             "in": "path",
             "required": true,
             "type": "string"
@@ -178,7 +178,7 @@
           },
           {
             "name": "channel_point.funding_txid_bytes",
-            "description": "*\nTxid of the funding transaction. When using REST, this field must be\nencoded as base64.",
+            "description": "/ Txid of the funding transaction.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -276,7 +276,7 @@
         "parameters": [
           {
             "name": "chan_point.funding_txid_str",
-            "description": "*\nHex-encoded string representing the byte-reversed hash of the funding\ntransaction.",
+            "description": "/ Hex-encoded string representing the funding transaction",
             "in": "path",
             "required": true,
             "type": "string"
@@ -291,7 +291,7 @@
           },
           {
             "name": "chan_point.funding_txid_bytes",
-            "description": "*\nTxid of the funding transaction. When using REST, this field must be\nencoded as base64.",
+            "description": "/ Txid of the funding transaction.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -450,7 +450,7 @@
         "parameters": [
           {
             "name": "channel_point.funding_txid_str",
-            "description": "*\nHex-encoded string representing the byte-reversed hash of the funding\ntransaction.",
+            "description": "/ Hex-encoded string representing the funding transaction",
             "in": "path",
             "required": true,
             "type": "string"
@@ -465,7 +465,7 @@
           },
           {
             "name": "channel_point.funding_txid_bytes",
-            "description": "*\nTxid of the funding transaction. When using REST, this field must be\nencoded as base64.",
+            "description": "/ Txid of the funding transaction.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -561,7 +561,7 @@
         "parameters": [
           {
             "name": "aezeed_passphrase",
-            "description": "*\naezeed_passphrase is an optional user provided passphrase that will be used\nto encrypt the generated aezeed cipher seed. When using REST, this field\nmust be encoded as base64.",
+            "description": "*\naezeed_passphrase is an optional user provided passphrase that will be used\nto encrypt the generated aezeed cipher seed.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -569,7 +569,7 @@
           },
           {
             "name": "seed_entropy",
-            "description": "*\nseed_entropy is an optional 16-bytes generated via CSPRNG. If not\nspecified, then a fresh set of randomness will be used to create the seed.\nWhen using REST, this field must be encoded as base64.",
+            "description": "*\nseed_entropy is an optional 16-bytes generated via CSPRNG. If not\nspecified, then a fresh set of randomness will be used to create the seed.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -600,7 +600,7 @@
     },
     "/v1/graph": {
       "get": {
-        "summary": "* lncli: `describegraph`\nDescribeGraph returns a description of the latest graph state from the\npoint of view of the node. The graph information is partitioned into two\ncomponents: all the nodes/vertexes, and all the edges that connect the\nvertexes themselves. As this is a directed graph, the edges also contain\nthe node directional specific routing policy which includes: the time lock\ndelta, fee information, etc.",
+        "summary": "* lncli: `describegraph`\nDescribeGraph returns a description of the latest graph state from the\npoint of view of the node. The graph information is partitioned into two\ncomponents: all the nodes/vertexes, and all the edges that connect the\nvertexes themselves.  As this is a directed graph, the edges also contain\nthe node directional specific routing policy which includes: the time lock\ndelta, fee information, etc.",
         "operationId": "DescribeGraph",
         "responses": {
           "200": {
@@ -757,7 +757,7 @@
           },
           {
             "name": "ignored_nodes",
-            "description": "*\nA list of nodes to ignore during path finding. When using REST, these fields\nmust be encoded as base64.",
+            "description": "*\nA list of nodes to ignore during path finding.",
             "in": "query",
             "required": false,
             "type": "array",
@@ -839,14 +839,14 @@
         "parameters": [
           {
             "name": "r_hash_str",
-            "description": "*\nThe hex-encoded payment hash of the invoice to be looked up. The passed\npayment hash must be exactly 32 bytes, otherwise an error is returned.\nDeprecated now that the REST gateway supports base64 encoding of bytes\nfields.",
+            "description": "*\nThe hex-encoded payment hash of the invoice to be looked up. The passed\npayment hash must be exactly 32 bytes, otherwise an error is returned.",
             "in": "path",
             "required": true,
             "type": "string"
           },
           {
             "name": "r_hash",
-            "description": "*\nThe payment hash of the invoice to be looked up. When using REST, this field\nmust be encoded as base64.",
+            "description": "/ The payment hash of the invoice to be looked up.",
             "in": "query",
             "required": false,
             "type": "string",
@@ -936,7 +936,7 @@
     },
     "/v1/invoices/subscribe": {
       "get": {
-        "summary": "*\nSubscribeInvoices returns a uni-directional stream (server -\u003e client) for\nnotifying the client of newly added/settled invoices. The caller can\noptionally specify the add_index and/or the settle_index. If the add_index\nis specified, then we'll first start by sending add invoice events for all\ninvoices with an add_index greater than the specified value. If the\nsettle_index is specified, the next, we'll send out all settle events for\ninvoices with a settle_index greater than the specified value. One or both\nof these fields can be set. If no fields are set, then we'll only send out\nthe latest add/settle events.",
+        "summary": "*\nSubscribeInvoices returns a uni-directional stream (server -\u003e client) for\nnotifying the client of newly added/settled invoices. The caller can\noptionally specify the add_index and/or the settle_index. If the add_index\nis specified, then we'll first start by sending add invoice events for all\ninvoices with an add_index greater than the specified value.  If the\nsettle_index is specified, the next, we'll send out all settle events for\ninvoices with a settle_index greater than the specified value.  One or both\nof these fields can be set. If no fields are set, then we'll only send out\nthe latest add/settle events.",
         "operationId": "SubscribeInvoices",
         "responses": {
           "200": {
@@ -1195,7 +1195,7 @@
     "/v1/switch": {
       "post": {
         "summary": "* lncli: `fwdinghistory`\nForwardingHistory allows the caller to query the htlcswitch for a record of\nall HTLCs forwarded within the target time range, and integer offset\nwithin that time range. If no time-range is specified, then the first chunk\nof the past 24 hrs of forwarding history are returned.",
-        "description": "A list of forwarding events are returned. The size of each forwarding event\nis 40 bytes, and the max message size able to be returned in gRPC is 4 MiB.\nAs a result each message can only contain 50k entries. Each response has\nthe index offset of the last entry. The index offset can be provided to the\nrequest to allow the caller to skip a series of records.",
+        "description": "A list of forwarding events are returned. The size of each forwarding event\nis 40 bytes, and the max message size able to be returned in gRPC is 4 MiB.\nAs a result each message can only contain 50k entries.  Each response has\nthe index offset of the last entry. The index offset can be provided to the\nrequest to allow the caller to skip a series of records.",
         "operationId": "ForwardingHistory",
         "responses": {
           "200": {
@@ -1572,7 +1572,7 @@
         },
         "payment_request": {
           "type": "string",
-          "description": "*\nA bare-bones invoice for a payment within the Lightning Network. With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
+          "description": "*\nA bare-bones invoice for a payment within the Lightning Network.  With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
         },
         "add_index": {
           "type": "string",
@@ -1646,12 +1646,12 @@
         "current_password": {
           "type": "string",
           "format": "byte",
-          "description": "*\ncurrent_password should be the current valid passphrase used to unlock the\ndaemon. When using REST, this field must be encoded as base64."
+          "description": "*\ncurrent_password should be the current valid passphrase used to unlock the\ndaemon."
         },
         "new_password": {
           "type": "string",
           "format": "byte",
-          "description": "*\nnew_password should be the new passphrase that will be needed to unlock the\ndaemon. When using REST, this field must be encoded as base64."
+          "description": "*\nnew_password should be the new passphrase that will be needed to unlock the\ndaemon."
         }
       }
     },
@@ -1862,7 +1862,7 @@
         "chan_backup": {
           "type": "string",
           "format": "byte",
-          "description": "*\nIs an encrypted single-chan backup. this can be passed to\nRestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in\norder to trigger the recovery protocol. When using REST, this field must be\nencoded as base64."
+          "description": "*\nIs an encrypted single-chan backup. this can be passed to\nRestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in\norder to trigger the recovery protocol."
         }
       }
     },
@@ -2094,11 +2094,11 @@
         "funding_txid_bytes": {
           "type": "string",
           "format": "byte",
-          "description": "*\nTxid of the funding transaction. When using REST, this field must be\nencoded as base64."
+          "title": "/ Txid of the funding transaction"
         },
         "funding_txid_str": {
           "type": "string",
-          "description": "*\nHex-encoded string representing the byte-reversed hash of the funding\ntransaction."
+          "title": "/ Hex-encoded string representing the funding transaction"
         },
         "output_index": {
           "type": "integer",
@@ -2160,7 +2160,7 @@
         "perm": {
           "type": "boolean",
           "format": "boolean",
-          "description": "* If set, the daemon will attempt to persistently connect to the target\npeer. Otherwise, the call will be synchronous."
+          "description": "* If set, the daemon will attempt to persistently connect to the target\npeer.  Otherwise, the call will be synchronous."
         }
       }
     },
@@ -2572,7 +2572,7 @@
         "wallet_password": {
           "type": "string",
           "format": "byte",
-          "description": "*\nwallet_password is the passphrase that should be used to encrypt the\nwallet. This MUST be at least 8 chars in length. After creation, this\npassword is required to unlock the daemon. When using REST, this field\nmust be encoded as base64."
+          "description": "*\nwallet_password is the passphrase that should be used to encrypt the\nwallet. This MUST be at least 8 chars in length. After creation, this\npassword is required to unlock the daemon."
         },
         "cipher_seed_mnemonic": {
           "type": "array",
@@ -2584,7 +2584,7 @@
         "aezeed_passphrase": {
           "type": "string",
           "format": "byte",
-          "description": "*\naezeed_passphrase is an optional user provided passphrase that will be used\nto encrypt the generated aezeed cipher seed. When using REST, this field\nmust be encoded as base64."
+          "description": "*\naezeed_passphrase is an optional user provided passphrase that will be used\nto encrypt the generated aezeed cipher seed."
         },
         "recovery_window": {
           "type": "integer",
@@ -2615,12 +2615,12 @@
         "r_preimage": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe hex-encoded preimage (32 byte) which will allow settling an incoming\nHTLC payable to this preimage. When using REST, this field must be encoded\nas base64."
+          "title": "*\nThe hex-encoded preimage (32 byte) which will allow settling an incoming\nHTLC payable to this preimage"
         },
         "r_hash": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe hash of the preimage. When using REST, this field must be encoded as\nbase64."
+          "title": "/ The hash of the preimage"
         },
         "value": {
           "type": "string",
@@ -2644,12 +2644,12 @@
         },
         "payment_request": {
           "type": "string",
-          "description": "*\nA bare-bones invoice for a payment within the Lightning Network. With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
+          "description": "*\nA bare-bones invoice for a payment within the Lightning Network.  With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
         },
         "description_hash": {
           "type": "string",
           "format": "byte",
-          "description": "*\nHash (SHA-256) of a description of the payment. Used if the description of\npayment (memo) is too long to naturally fit within the description field\nof an encoded payment request. When using REST, this field must be encoded\nas base64."
+          "description": "*\nHash (SHA-256) of a description of the payment. Used if the description of\npayment (memo) is too long to naturally fit within the description field\nof an encoded payment request."
         },
         "expiry": {
           "type": "string",
@@ -2918,7 +2918,7 @@
         "multi_chan_backup": {
           "type": "string",
           "format": "byte",
-          "description": "*\nA single encrypted blob containing all the static channel backups of the\nchannel listed above. This can be stored as a single file or blob, and\nsafely be replaced with any prior/future versions. When using REST, this\nfield must be encoded as base64."
+          "description": "*\nA single encrypted blob containing all the static channel backups of the\nchannel listed above. This can be stored as a single file or blob, and\nsafely be replaced with any prior/future versions."
         }
       }
     },
@@ -3024,12 +3024,12 @@
         "from": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe sending node of the pair. When using REST, this field must be encoded as\nbase64."
+          "description": "/ The sending node of the pair."
         },
         "to": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe receiving node of the pair. When using REST, this field must be encoded\nas base64."
+          "description": "/ The receiving node of the pair."
         }
       }
     },
@@ -3063,11 +3063,11 @@
         "node_pubkey": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe pubkey of the node to open a channel with. When using REST, this field\nmust be encoded as base64."
+          "title": "/ The pubkey of the node to open a channel with"
         },
         "node_pubkey_string": {
           "type": "string",
-          "description": "*\nThe hex encoded pubkey of the node to open a channel with. Deprecated now\nthat the REST gateway supports base64 encoding of bytes fields."
+          "title": "/ The hex encoded pubkey of the node to open a channel with"
         },
         "local_funding_amount": {
           "type": "string",
@@ -3444,13 +3444,11 @@
       "type": "object",
       "properties": {
         "chan_backups": {
-          "$ref": "#/definitions/lnrpcChannelBackups",
-          "description": "*\nThe channels to restore as a list of channel/backup pairs."
+          "$ref": "#/definitions/lnrpcChannelBackups"
         },
         "multi_chan_backup": {
           "type": "string",
-          "format": "byte",
-          "description": "*\nThe channels to restore in the packed multi backup format. When using\nREST, this field must be encoded as base64."
+          "format": "byte"
         }
       }
     },
@@ -3460,12 +3458,12 @@
         "total_time_lock": {
           "type": "integer",
           "format": "int64",
-          "description": "*\nThe cumulative (final) time lock across the entire route. This is the CLTV\nvalue that should be extended to the first hop in the route. All other hops\nwill decrement the time-lock as advertised, leaving enough time for all\nhops to wait for or present the payment preimage to complete the payment."
+          "description": "*\nThe cumulative (final) time lock across the entire route.  This is the CLTV\nvalue that should be extended to the first hop in the route. All other hops\nwill decrement the time-lock as advertised, leaving enough time for all\nhops to wait for or present the payment preimage to complete the payment."
         },
         "total_fees": {
           "type": "string",
           "format": "int64",
-          "description": "*\nThe sum of the fees paid at each hop within the final route. In the case\nof a one-hop payment, this value will be zero as we don't need to pay a fee\nto ourselves."
+          "description": "*\nThe sum of the fees paid at each hop within the final route.  In the case\nof a one-hop payment, this value will be zero as we don't need to pay a fee\nto ourselves."
         },
         "total_amt": {
           "type": "string",
@@ -3590,11 +3588,11 @@
         "dest": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe identity pubkey of the payment recipient. When using REST, this field\nmust be encoded as base64."
+          "title": "/ The identity pubkey of the payment recipient"
         },
         "dest_string": {
           "type": "string",
-          "description": "*\nThe hex-encoded identity pubkey of the payment recipient. Deprecated now\nthat the REST gateway supports base64 encoding of bytes fields."
+          "title": "/ The hex-encoded identity pubkey of the payment recipient"
         },
         "amt": {
           "type": "string",
@@ -3604,15 +3602,15 @@
         "payment_hash": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe hash to use within the payment's HTLC. When using REST, this field\nmust be encoded as base64."
+          "title": "/ The hash to use within the payment's HTLC"
         },
         "payment_hash_string": {
           "type": "string",
-          "description": "*\nThe hex-encoded hash to use within the payment's HTLC. Deprecated now\nthat the REST gateway supports base64 encoding of bytes fields."
+          "title": "/ The hex-encoded hash to use within the payment's HTLC"
         },
         "payment_request": {
           "type": "string",
-          "description": "*\nA bare-bones invoice for a payment within the Lightning Network. With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
+          "description": "*\nA bare-bones invoice for a payment within the Lightning Network.  With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient."
         },
         "final_cltv_delta": {
           "type": "integer",
@@ -3639,7 +3637,7 @@
             "type": "string",
             "format": "byte"
           },
-          "description": "* \nAn optional field that can be used to pass an arbitrary set of TLV records\nto a peer which understands the new records. This can be used to pass\napplication specific data during the payment attempt. When using REST, the\nvalues must be encoded as base64."
+          "description": "* \nAn optional field that can be used to pass an arbitrary set of TLV records\nto a peer which understands the new records. This can be used to pass\napplication specific data during the payment attempt."
         }
       }
     },
@@ -3668,11 +3666,11 @@
         "payment_hash": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe payment hash to use for the HTLC. When using REST, this field must be\nencoded as base64."
+          "description": "/ The payment hash to use for the HTLC."
         },
         "payment_hash_string": {
           "type": "string",
-          "description": "*\nAn optional hex-encoded payment hash to be used for the HTLC. Deprecated now\nthat the REST gateway supports base64 encoding of bytes fields."
+          "description": "/ An optional hex-encoded payment hash to be used for the HTLC."
         },
         "route": {
           "$ref": "#/definitions/lnrpcRoute",
@@ -3686,7 +3684,7 @@
         "msg": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe message to be signed. When using REST, this field must be encoded as\nbase64."
+          "title": "/ The message to be signed"
         }
       }
     },
@@ -3769,7 +3767,7 @@
         "wallet_password": {
           "type": "string",
           "format": "byte",
-          "description": "*\nwallet_password should be the current valid passphrase for the daemon. This\nwill be required to decrypt on-disk material that the daemon requires to\nfunction properly. When using REST, this field must be encoded as base64."
+          "description": "*\nwallet_password should be the current valid passphrase for the daemon. This\nwill be required to decrypt on-disk material that the daemon requires to\nfunction properly."
         },
         "recovery_window": {
           "type": "integer",
@@ -3825,7 +3823,7 @@
         "msg": {
           "type": "string",
           "format": "byte",
-          "description": "*\nThe message over which the signature is to be verified. When using REST,\nthis field must be encoded as base64."
+          "title": "/ The message over which the signature is to be verified"
         },
         "signature": {
           "type": "string",
diff --git a/lnwallet/channel.go b/lnwallet/channel.go
index 57f6b3704..ddd8cd41f 100644
--- a/lnwallet/channel.go
+++ b/lnwallet/channel.go
@@ -3233,14 +3233,6 @@ func (lc *LightningChannel) SignNextCommitment() (lnwire.Sig, []lnwire.Sig, []ch
 	lc.Lock()
 	defer lc.Unlock()
 
-	// Check for empty commit sig. This should never happen, but we don't
-	// dare to fail hard here. We assume peers can deal with the empty sig
-	// and continue channel operation. We log an error so that the bug
-	// causing this can be tracked down.
-	if !lc.oweCommitment(true) {
-		lc.log.Errorf("sending empty commit sig")
-	}
-
 	var (
 		sig      lnwire.Sig
 		htlcSigs []lnwire.Sig
@@ -3535,7 +3527,7 @@ func (lc *LightningChannel) ProcessChanSyncMsg(
 		// but died before the signature was sent. We re-transmit our
 		// revocation, but also initiate a state transition to re-sync
 		// them.
-		if lc.OweCommitment(true) {
+		if !lc.FullySynced() {
 			commitSig, htlcSigs, _, err := lc.SignNextCommitment()
 			switch {
 
@@ -3995,18 +3987,6 @@ func (lc *LightningChannel) ReceiveNewCommitment(commitSig lnwire.Sig,
 	lc.Lock()
 	defer lc.Unlock()
 
-	// Check for empty commit sig. Because of a previously existing bug, it
-	// is possible that we receive an empty commit sig from nodes running an
-	// older version. This is a relaxation of the spec, but it is still
-	// possible to handle it. To not break any channels with those older
-	// nodes, we just log the event. This check is also not totally
-	// reliable, because it could be that we've sent out a new sig, but the
-	// remote hasn't received it yet. We could then falsely assume that they
-	// should add our updates to their remote commitment tx.
-	if !lc.oweCommitment(false) {
-		lc.log.Warnf("empty commit sig message received")
-	}
-
 	// Determine the last update on the local log that has been locked in.
 	localACKedIndex := lc.remoteCommitChain.tail().ourMessageIndex
 	localHtlcIndex := lc.remoteCommitChain.tail().ourHtlcIndex
@@ -4160,80 +4140,24 @@ func (lc *LightningChannel) ReceiveNewCommitment(commitSig lnwire.Sig,
 	return nil
 }
 
-// OweCommitment returns a boolean value reflecting whether we need to send
-// out a commitment signature because there are outstanding local updates and/or
-// updates in the local commit tx that aren't reflected in the remote commit tx
-// yet.
-func (lc *LightningChannel) OweCommitment(local bool) bool {
+// FullySynced returns a boolean value reflecting if both commitment chains
+// (remote+local) are fully in sync. Both commitment chains are fully in sync
+// if the tip of each chain includes the latest committed changes from both
+// sides.
+func (lc *LightningChannel) FullySynced() bool {
 	lc.RLock()
 	defer lc.RUnlock()
 
-	return lc.oweCommitment(local)
-}
-
-// oweCommitment is the internal version of OweCommitment. This function expects
-// to be executed with a lock held.
-func (lc *LightningChannel) oweCommitment(local bool) bool {
-	var (
-		remoteUpdatesPending, localUpdatesPending bool
-
-		lastLocalCommit  = lc.localCommitChain.tip()
-		lastRemoteCommit = lc.remoteCommitChain.tip()
-
-		perspective string
-	)
-
-	if local {
-		perspective = "local"
-
-		// There are local updates pending if our local update log is
-		// not in sync with our remote commitment tx.
-		localUpdatesPending = lc.localUpdateLog.logIndex !=
-			lastRemoteCommit.ourMessageIndex
-
-		// There are remote updates pending if their remote commitment
-		// tx (our local commitment tx) contains updates that we don't
-		// have added to our remote commitment tx yet.
-		remoteUpdatesPending = lastLocalCommit.theirMessageIndex !=
-			lastRemoteCommit.theirMessageIndex
-
-	} else {
-		perspective = "remote"
-
-		// There are local updates pending (local updates from the
-		// perspective of the remote party) if the remote party has
-		// updates to their remote tx pending for which they haven't
-		// signed yet.
-		localUpdatesPending = lc.remoteUpdateLog.logIndex !=
-			lastLocalCommit.theirMessageIndex
-
-		// There are remote updates pending (remote updates from the
-		// perspective of the remote party) if we have updates on our
-		// remote commitment tx that they haven't added to theirs yet.
-		remoteUpdatesPending = lastRemoteCommit.ourMessageIndex !=
-			lastLocalCommit.ourMessageIndex
-	}
-
-	// If any of the conditions above is true, we owe a commitment
-	// signature.
-	oweCommitment := localUpdatesPending || remoteUpdatesPending
-
-	lc.log.Tracef("%v owes commit: %v (local updates: %v, "+
-		"remote updates %v)", perspective, oweCommitment,
-		localUpdatesPending, remoteUpdatesPending)
-
-	return oweCommitment
-}
+	lastLocalCommit := lc.localCommitChain.tip()
+	lastRemoteCommit := lc.remoteCommitChain.tip()
 
-// PendingLocalUpdateCount returns the number of local updates that still need
-// to be applied to the remote commitment tx.
-func (lc *LightningChannel) PendingLocalUpdateCount() uint64 {
-	lc.RLock()
-	defer lc.RUnlock()
+	localUpdatesSynced := (lastLocalCommit.ourMessageIndex ==
+		lastRemoteCommit.ourMessageIndex)
 
-	lastRemoteCommit := lc.remoteCommitChain.tip()
+	remoteUpdatesSynced := (lastLocalCommit.theirMessageIndex ==
+		lastRemoteCommit.theirMessageIndex)
 
-	return lc.localUpdateLog.logIndex - lastRemoteCommit.ourMessageIndex
+	return localUpdatesSynced && remoteUpdatesSynced
 }
 
 // RevokeCurrentCommitment revokes the next lowest unrevoked commitment
diff --git a/lnwallet/wallet.go b/lnwallet/wallet.go
index 342579e90..c3c2020df 100644
--- a/lnwallet/wallet.go
+++ b/lnwallet/wallet.go
@@ -346,8 +346,6 @@ func (l *LightningWallet) Shutdown() error {
 func (l *LightningWallet) LockedOutpoints() []*wire.OutPoint {
 	outPoints := make([]*wire.OutPoint, 0, len(l.lockedOutPoints))
 	for outPoint := range l.lockedOutPoints {
-		outPoint := outPoint
-
 		outPoints = append(outPoints, &outPoint)
 	}
 
diff --git a/lnwire/features.go b/lnwire/features.go
index 7700e2d5d..9a34a6373 100644
--- a/lnwire/features.go
+++ b/lnwire/features.go
@@ -2,17 +2,10 @@ package lnwire
 
 import (
 	"encoding/binary"
-	"errors"
 	"fmt"
 	"io"
 )
 
-var (
-	// ErrFeaturePairExists signals an error in feature vector construction
-	// where the opposing bit in a feature pair has already been set.
-	ErrFeaturePairExists = errors.New("feature pair exists")
-)
-
 // FeatureBit represents a feature that can be enabled in either a local or
 // global feature vector at a specific bit position. Feature bits follow the
 // "it's OK to be odd" rule, where features at even bit positions must be known
@@ -85,15 +78,24 @@ const (
 	maxAllowedSize = 32764
 )
 
-// Features is a mapping of known feature bits to a descriptive name. All known
-// feature bits must be assigned a name in this mapping, and feature bit pairs
-// must be assigned together for correct behavior.
-var Features = map[FeatureBit]string{
+// LocalFeatures is a mapping of known connection-local feature bits to a
+// descriptive name. All known local feature bits must be assigned a name in
+// this mapping. Local features are those which are only sent to the peer and
+// not advertised to the entire network. A full description of these feature
+// bits is provided in the BOLT-09 specification.
+var LocalFeatures = map[FeatureBit]string{
 	DataLossProtectRequired: "data-loss-protect",
 	DataLossProtectOptional: "data-loss-protect",
 	InitialRoutingSync:      "initial-routing-sync",
 	GossipQueriesRequired:   "gossip-queries",
 	GossipQueriesOptional:   "gossip-queries",
+}
+
+// GlobalFeatures is a mapping of known global feature bits to a descriptive
+// name. All known global feature bits must be assigned a name in this mapping.
+// Global features are those which are advertised to the entire network. A full
+// description of these feature bits is provided in the BOLT-09 specification.
+var GlobalFeatures = map[FeatureBit]string{
 	TLVOnionPayloadRequired: "tlv-onion",
 	TLVOnionPayloadOptional: "tlv-onion",
 	StaticRemoteKeyOptional: "static-remote-key",
@@ -119,26 +121,6 @@ func NewRawFeatureVector(bits ...FeatureBit) *RawFeatureVector {
 	return fv
 }
 
-// Merges sets all feature bits in other on the receiver's feature vector.
-func (fv *RawFeatureVector) Merge(other *RawFeatureVector) error {
-	for bit := range other.features {
-		err := fv.SafeSet(bit)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// Clone makes a copy of a feature vector.
-func (fv *RawFeatureVector) Clone() *RawFeatureVector {
-	newFeatures := NewRawFeatureVector()
-	for bit := range fv.features {
-		newFeatures.Set(bit)
-	}
-	return newFeatures
-}
-
 // IsSet returns whether a particular feature bit is enabled in the vector.
 func (fv *RawFeatureVector) IsSet(feature FeatureBit) bool {
 	return fv.features[feature]
@@ -149,20 +131,6 @@ func (fv *RawFeatureVector) Set(feature FeatureBit) {
 	fv.features[feature] = true
 }
 
-// SafeSet sets the chosen feature bit in the feature vector, but returns an
-// error if the opposing feature bit is already set. This ensures both that we
-// are creating properly structured feature vectors, and in some cases, that
-// peers are sending properly encoded ones, i.e. it can't be both optional and
-// required.
-func (fv *RawFeatureVector) SafeSet(feature FeatureBit) error {
-	if _, ok := fv.features[feature^1]; ok {
-		return ErrFeaturePairExists
-	}
-
-	fv.Set(feature)
-	return nil
-}
-
 // Unset marks a feature as disabled in the vector.
 func (fv *RawFeatureVector) Unset(feature FeatureBit) {
 	delete(fv.features, feature)
diff --git a/lnwire/init_message.go b/lnwire/init_message.go
index 0236a71f8..f64f9f8ca 100644
--- a/lnwire/init_message.go
+++ b/lnwire/init_message.go
@@ -7,26 +7,20 @@ import "io"
 // diagnosis where features are incompatible. Each node MUST wait to receive
 // init before sending any other messages.
 type Init struct {
-	// GlobalFeatures is a legacy feature vector used for backwards
-	// compatibility with older nodes. Any features defined here should be
-	// merged with those presented in Features.
+	// GlobalFeatures is feature vector which affects HTLCs and thus are
+	// also advertised to other nodes.
 	GlobalFeatures *RawFeatureVector
 
-	// Features is a feature vector containing a the features supported by
-	// the remote node.
-	//
-	// NOTE: Older nodes may place some features in GlobalFeatures, but all
-	// new features are to be added in Features. When handling an Init
-	// message, any GlobalFeatures should be merged into the unified
-	// Features field.
-	Features *RawFeatureVector
+	// LocalFeatures is feature vector which only affect the protocol
+	// between two nodes.
+	LocalFeatures *RawFeatureVector
 }
 
 // NewInitMessage creates new instance of init message object.
-func NewInitMessage(gf *RawFeatureVector, f *RawFeatureVector) *Init {
+func NewInitMessage(gf *RawFeatureVector, lf *RawFeatureVector) *Init {
 	return &Init{
 		GlobalFeatures: gf,
-		Features:       f,
+		LocalFeatures:  lf,
 	}
 }
 
@@ -41,7 +35,7 @@ var _ Message = (*Init)(nil)
 func (msg *Init) Decode(r io.Reader, pver uint32) error {
 	return ReadElements(r,
 		&msg.GlobalFeatures,
-		&msg.Features,
+		&msg.LocalFeatures,
 	)
 }
 
@@ -52,7 +46,7 @@ func (msg *Init) Decode(r io.Reader, pver uint32) error {
 func (msg *Init) Encode(w io.Writer, pver uint32) error {
 	return WriteElements(w,
 		msg.GlobalFeatures,
-		msg.Features,
+		msg.LocalFeatures,
 	)
 }
 
diff --git a/peer.go b/peer.go
index a007701b7..ade90b41b 100644
--- a/peer.go
+++ b/peer.go
@@ -190,24 +190,21 @@ type peer struct {
 
 	server *server
 
-	// features is the set of features that we advertised to the remote
-	// node.
-	features *lnwire.FeatureVector
-
-	// legacyFeatures is the set of features that we advertised to the remote
-	// node for backwards compatibility. Nodes that have not implemented
-	// flat featurs will still be able to read our feature bits from the
-	// legacy global field, but we will also advertise everything in the
-	// default features field.
-	legacyFeatures *lnwire.FeatureVector
+	// localFeatures is the set of local features that we advertised to the
+	// remote node.
+	localFeatures *lnwire.RawFeatureVector
 
 	// outgoingCltvRejectDelta defines the number of blocks before expiry of
 	// an htlc where we don't offer an htlc anymore.
 	outgoingCltvRejectDelta uint32
 
-	// remoteFeatures is the feature vector received from the peer during
-	// the connection handshake.
-	remoteFeatures *lnwire.FeatureVector
+	// remoteLocalFeatures is the local feature vector received from the
+	// peer during the connection handshake.
+	remoteLocalFeatures *lnwire.FeatureVector
+
+	// remoteGlobalFeatures is the global feature vector received from the
+	// peer during the connection handshake.
+	remoteGlobalFeatures *lnwire.FeatureVector
 
 	// failedChannels is a set that tracks channels we consider `failed`.
 	// This is a temporary measure until we have implemented real failure
@@ -237,7 +234,7 @@ var _ lnpeer.Peer = (*peer)(nil)
 // pointer to the main server.
 func newPeer(conn net.Conn, connReq *connmgr.ConnReq, server *server,
 	addr *lnwire.NetAddress, inbound bool,
-	features, legacyFeatures *lnwire.FeatureVector,
+	localFeatures *lnwire.RawFeatureVector,
 	chanActiveTimeout time.Duration,
 	outgoingCltvRejectDelta uint32) (
 	*peer, error) {
@@ -255,8 +252,7 @@ func newPeer(conn net.Conn, connReq *connmgr.ConnReq, server *server,
 
 		server: server,
 
-		features:       features,
-		legacyFeatures: legacyFeatures,
+		localFeatures: localFeatures,
 
 		outgoingCltvRejectDelta: outgoingCltvRejectDelta,
 
@@ -403,7 +399,7 @@ func (p *peer) initGossipSync() {
 
 	// If the remote peer knows of the new gossip queries feature, then
 	// we'll create a new gossipSyncer in the AuthenticatedGossiper for it.
-	case p.remoteFeatures.HasFeature(lnwire.GossipQueriesOptional):
+	case p.remoteLocalFeatures.HasFeature(lnwire.GossipQueriesOptional):
 		srvrLog.Infof("Negotiated chan series queries with %x",
 			p.pubKeyBytes[:])
 
@@ -2391,63 +2387,62 @@ func (p *peer) WipeChannel(chanPoint *wire.OutPoint) error {
 // handleInitMsg handles the incoming init message which contains global and
 // local features vectors. If feature vectors are incompatible then disconnect.
 func (p *peer) handleInitMsg(msg *lnwire.Init) error {
-	// First, merge any features from the legacy global features field into
-	// those presented in the local features fields.
-	err := msg.Features.Merge(msg.GlobalFeatures)
-	if err != nil {
-		return fmt.Errorf("unable to merge legacy global featues: %v",
-			err)
-	}
-
-	// Then, finalize the remote feature vector providing the flatteneed
-	// feature bit namespace.
-	p.remoteFeatures = lnwire.NewFeatureVector(
-		msg.Features, lnwire.Features,
+	p.remoteLocalFeatures = lnwire.NewFeatureVector(
+		msg.LocalFeatures, lnwire.LocalFeatures,
+	)
+	p.remoteGlobalFeatures = lnwire.NewFeatureVector(
+		msg.GlobalFeatures, lnwire.GlobalFeatures,
 	)
 
 	// Now that we have their features loaded, we'll ensure that they
 	// didn't set any required bits that we don't know of.
-	unknownFeatures := p.remoteFeatures.UnknownRequiredFeatures()
-	if len(unknownFeatures) > 0 {
-		err := fmt.Errorf("peer set unknown feature bits: %v",
-			unknownFeatures)
+	unknownLocalFeatures := p.remoteLocalFeatures.UnknownRequiredFeatures()
+	if len(unknownLocalFeatures) > 0 {
+		err := fmt.Errorf("Peer set unknown local feature bits: %v",
+			unknownLocalFeatures)
+		return err
+	}
+	unknownGlobalFeatures := p.remoteGlobalFeatures.UnknownRequiredFeatures()
+	if len(unknownGlobalFeatures) > 0 {
+		err := fmt.Errorf("Peer set unknown global feature bits: %v",
+			unknownGlobalFeatures)
 		return err
 	}
 
 	// Now that we know we understand their requirements, we'll check to
 	// see if they don't support anything that we deem to be mandatory.
 	switch {
-	case !p.remoteFeatures.HasFeature(lnwire.DataLossProtectRequired):
+	case !p.remoteLocalFeatures.HasFeature(lnwire.DataLossProtectRequired):
 		return fmt.Errorf("data loss protection required")
 	}
 
 	return nil
 }
 
-// LocalFeatures returns the set of global features that has been advertised by
-// the local node. This allows sub-systems that use this interface to gate their
-// behavior off the set of negotiated feature bits.
+// LocalGlobalFeatures returns the set of global features that has been
+// advertised by the local node. This allows sub-systems that use this
+// interface to gate their behavior off the set of negotiated feature bits.
 //
 // NOTE: Part of the lnpeer.Peer interface.
-func (p *peer) LocalFeatures() *lnwire.FeatureVector {
-	return p.features
+func (p *peer) LocalGlobalFeatures() *lnwire.FeatureVector {
+	return p.server.globalFeatures
 }
 
-// RemoteFeatures returns the set of global features that has been advertised by
-// the remote node. This allows sub-systems that use this interface to gate
-// their behavior off the set of negotiated feature bits.
+// RemoteGlobalFeatures returns the set of global features that has been
+// advertised by the remote node. This allows sub-systems that use this
+// interface to gate their behavior off the set of negotiated feature bits.
 //
 // NOTE: Part of the lnpeer.Peer interface.
-func (p *peer) RemoteFeatures() *lnwire.FeatureVector {
-	return p.remoteFeatures
+func (p *peer) RemoteGlobalFeatures() *lnwire.FeatureVector {
+	return p.remoteGlobalFeatures
 }
 
 // sendInitMsg sends init message to remote peer which contains our currently
 // supported local and global features.
 func (p *peer) sendInitMsg() error {
 	msg := lnwire.NewInitMessage(
-		p.legacyFeatures.RawFeatureVector,
-		p.features.RawFeatureVector,
+		p.server.globalFeatures.RawFeatureVector,
+		p.localFeatures,
 	)
 
 	return p.writeMessage(msg)
diff --git a/routing/missioncontrol.go b/routing/missioncontrol.go
index 2d5deb508..cebac51c4 100644
--- a/routing/missioncontrol.go
+++ b/routing/missioncontrol.go
@@ -118,9 +118,6 @@ type MissionControlConfig struct {
 	// probability completely and only base the probability on historical
 	// results, unless there are none available.
 	AprioriWeight float64
-
-	// SelfNode is our own pubkey.
-	SelfNode route.Vertex
 }
 
 // TimedPairResult describes a timestamped pair result.
@@ -264,11 +261,6 @@ func (m *MissionControl) GetProbability(fromNode, toNode route.Vertex,
 	now := m.now()
 	results := m.lastPairResult[fromNode]
 
-	// Use a distinct probability estimation function for local channels.
-	if fromNode == m.cfg.SelfNode {
-		return m.estimator.getLocalPairProbability(now, results, toNode)
-	}
-
 	return m.estimator.getPairProbability(now, results, toNode, amt)
 }
 
diff --git a/routing/probability_estimator.go b/routing/probability_estimator.go
index 1e60608cb..991a77562 100644
--- a/routing/probability_estimator.go
+++ b/routing/probability_estimator.go
@@ -116,43 +116,13 @@ func (p *probabilityEstimator) getPairProbability(
 	now time.Time, results NodeResults,
 	toNode route.Vertex, amt lnwire.MilliSatoshi) float64 {
 
-	nodeProbability := p.getNodeProbability(now, results, amt)
-
-	return p.calculateProbability(
-		now, results, nodeProbability, toNode, amt,
-	)
-}
-
-// getLocalPairProbability estimates the probability of successfully traversing
-// our own local channels to toNode.
-func (p *probabilityEstimator) getLocalPairProbability(
-	now time.Time, results NodeResults, toNode route.Vertex) float64 {
-
-	// For local channels that have never been tried before, we assume them
-	// to be successful. We have accurate balance and online status
-	// information on our own channels, so when we select them in a route it
-	// is close to certain that those channels will work.
-	nodeProbability := p.prevSuccessProbability
-
-	return p.calculateProbability(
-		now, results, nodeProbability, toNode, lnwire.MaxMilliSatoshi,
-	)
-}
-
-// calculateProbability estimates the probability of successfully traversing to
-// toNode based on historical payment outcomes and a fall-back node probability.
-func (p *probabilityEstimator) calculateProbability(
-	now time.Time, results NodeResults,
-	nodeProbability float64, toNode route.Vertex,
-	amt lnwire.MilliSatoshi) float64 {
-
 	// Retrieve the last pair outcome.
 	lastPairResult, ok := results[toNode]
 
 	// If there is no history for this pair, return the node probability
 	// that is a probability estimate for untried channel.
 	if !ok {
-		return nodeProbability
+		return p.getNodeProbability(now, results, amt)
 	}
 
 	// For successes, we have a fixed (high) probability. Those pairs
@@ -161,6 +131,8 @@ func (p *probabilityEstimator) calculateProbability(
 		return p.prevSuccessProbability
 	}
 
+	nodeProbability := p.getNodeProbability(now, results, amt)
+
 	// Take into account a minimum penalize amount. For balance errors, a
 	// failure may be reported with such a minimum to prevent too aggressive
 	// penalization. If the current amount is smaller than the amount that
diff --git a/server.go b/server.go
index 7047721c1..b8872e9ef 100644
--- a/server.go
+++ b/server.go
@@ -35,7 +35,6 @@ import (
 	"github.com/lightningnetwork/lnd/channelnotifier"
 	"github.com/lightningnetwork/lnd/contractcourt"
 	"github.com/lightningnetwork/lnd/discovery"
-	"github.com/lightningnetwork/lnd/feature"
 	"github.com/lightningnetwork/lnd/htlcswitch"
 	"github.com/lightningnetwork/lnd/htlcswitch/hop"
 	"github.com/lightningnetwork/lnd/input"
@@ -233,9 +232,9 @@ type server struct {
 
 	readPool *pool.Read
 
-	// featureMgr dispatches feature vectors for various contexts within the
-	// daemon.
-	featureMgr *feature.Manager
+	// globalFeatures feature vector which affects HTLCs and thus are also
+	// advertised to other nodes.
+	globalFeatures *lnwire.FeatureVector
 
 	// currentNodeAnn is the node announcement that has been broadcast to
 	// the network upon startup, if the attributes of the node (us) has
@@ -370,14 +369,6 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB,
 		readBufferPool, cfg.Workers.Read, pool.DefaultWorkerTimeout,
 	)
 
-	featureMgr, err := feature.NewManager(feature.Config{
-		NoTLVOnion:        cfg.LegacyProtocol.LegacyOnion(),
-		NoStaticRemoteKey: cfg.LegacyProtocol.LegacyCommitment(),
-	})
-	if err != nil {
-		return nil, err
-	}
-
 	s := &server{
 		chanDB:         chanDB,
 		cc:             cc,
@@ -414,8 +405,10 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB,
 		peerConnectedListeners:    make(map[string][]chan<- lnpeer.Peer),
 		peerDisconnectedListeners: make(map[string][]chan<- struct{}),
 
-		featureMgr: featureMgr,
-		quit:       make(chan struct{}),
+		globalFeatures: lnwire.NewFeatureVector(
+			globalFeatures, lnwire.GlobalFeatures,
+		),
+		quit: make(chan struct{}),
 	}
 
 	s.witnessBeacon = &preimageBeacon{
@@ -601,7 +594,7 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB,
 		LastUpdate:           time.Now(),
 		Addresses:            selfAddrs,
 		Alias:                nodeAlias.String(),
-		Features:             s.featureMgr.Get(feature.SetNodeAnn),
+		Features:             s.globalFeatures,
 		Color:                color,
 	}
 	copy(selfNode.PubKeyBytes[:], privKey.PubKey().SerializeCompressed())
@@ -679,7 +672,6 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB,
 			PenaltyHalfLife:       routingConfig.PenaltyHalfLife,
 			MaxMcHistory:          routingConfig.MaxMcHistory,
 			AprioriWeight:         routingConfig.AprioriWeight,
-			SelfNode:              selfNode.PubKeyBytes,
 		},
 	)
 	if err != nil {
@@ -1972,7 +1964,7 @@ func (s *server) initTorController() error {
 		Addresses:            newNodeAnn.Addresses,
 		Alias:                newNodeAnn.Alias.String(),
 		Features: lnwire.NewFeatureVector(
-			newNodeAnn.Features, lnwire.Features,
+			newNodeAnn.Features, lnwire.GlobalFeatures,
 		),
 		Color:        newNodeAnn.RGBColor,
 		AuthSigBytes: newNodeAnn.Signature.ToSignatureBytes(),
@@ -2735,10 +2727,14 @@ func (s *server) peerConnected(conn net.Conn, connReq *connmgr.ConnReq,
 		ChainNet:    activeNetParams.Net,
 	}
 
-	// With the brontide connection established, we'll now craft the feature
-	// vectors to advertise to the remote node.
-	initFeatures := s.featureMgr.Get(feature.SetInit)
-	legacyFeatures := s.featureMgr.Get(feature.SetLegacyGlobal)
+	// With the brontide connection established, we'll now craft the local
+	// feature vector to advertise to the remote node.
+	localFeatures := lnwire.NewRawFeatureVector()
+
+	// We'll signal that we understand the data loss protection feature,
+	// and also that we support the new gossip query features.
+	localFeatures.Set(lnwire.DataLossProtectRequired)
+	localFeatures.Set(lnwire.GossipQueriesOptional)
 
 	// Now that we've established a connection, create a peer, and it to the
 	// set of currently active peers. Configure the peer with the incoming
@@ -2747,8 +2743,8 @@ func (s *server) peerConnected(conn net.Conn, connReq *connmgr.ConnReq,
 	// htlcs, an extra block is added to prevent the channel from being
 	// closed when the htlc is outstanding and a new block comes in.
 	p, err := newPeer(
-		conn, connReq, s, peerAddr, inbound, initFeatures,
-		legacyFeatures, cfg.ChanEnableTimeout,
+		conn, connReq, s, peerAddr, inbound, localFeatures,
+		cfg.ChanEnableTimeout,
 		defaultOutgoingCltvRejectDelta,
 	)
 	if err != nil {


Test patch:
diff --git a/channeldb/graph_test.go b/channeldb/graph_test.go
index 0768e8293..de8774a98 100644
--- a/channeldb/graph_test.go
+++ b/channeldb/graph_test.go
@@ -36,7 +36,7 @@ var (
 	_, _ = testSig.R.SetString("63724406601629180062774974542967536251589935445068131219452686511677818569431", 10)
 	_, _ = testSig.S.SetString("18801056069249825825291287104931333862866033135609736119018462340006816851118", 10)
 
-	testFeatures = lnwire.NewFeatureVector(nil, lnwire.Features)
+	testFeatures = lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures)
 )
 
 func createLightningNode(db *DB, priv *btcec.PrivateKey) (*LightningNode, error) {
diff --git a/channeldb/migration_01_to_11/graph_test.go b/channeldb/migration_01_to_11/graph_test.go
index dc21fccfd..a65f00463 100644
--- a/channeldb/migration_01_to_11/graph_test.go
+++ b/channeldb/migration_01_to_11/graph_test.go
@@ -25,7 +25,7 @@ var (
 	_, _ = testSig.R.SetString("63724406601629180062774974542967536251589935445068131219452686511677818569431", 10)
 	_, _ = testSig.S.SetString("18801056069249825825291287104931333862866033135609736119018462340006816851118", 10)
 
-	testFeatures = lnwire.NewFeatureVector(nil, nil)
+	testFeatures = lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures)
 )
 
 func createLightningNode(db *DB, priv *btcec.PrivateKey) (*LightningNode, error) {
diff --git a/contractcourt/htlc_incoming_contest_resolver.go b/contractcourt/htlc_incoming_contest_resolver.go
index 2f3348e6e..5a40369cb 100644
--- a/contractcourt/htlc_incoming_contest_resolver.go
+++ b/contractcourt/htlc_incoming_contest_resolver.go
@@ -5,11 +5,12 @@ import (
 	"errors"
 	"io"
 
+	"github.com/btcsuite/btcutil"
 	"github.com/lightningnetwork/lnd/channeldb"
 	"github.com/lightningnetwork/lnd/invoices"
-
-	"github.com/btcsuite/btcutil"
 	"github.com/lightningnetwork/lnd/lntypes"
+	"github.com/lightningnetwork/lnd/lnwallet"
+	"github.com/lightningnetwork/lnd/lnwire"
 )
 
 // htlcIncomingContestResolver is a ContractResolver that's able to resolve an
@@ -34,6 +35,24 @@ type htlcIncomingContestResolver struct {
 	htlcSuccessResolver
 }
 
+// newIncomingContestResolver instantiates a new incoming htlc contest resolver.
+func newIncomingContestResolver(htlcExpiry uint32,
+	circuitKey channeldb.CircuitKey, res lnwallet.IncomingHtlcResolution,
+	broadcastHeight uint32, payHash lntypes.Hash,
+	htlcAmt lnwire.MilliSatoshi,
+	resCfg ResolverConfig) *htlcIncomingContestResolver {
+
+	success := newSuccessResolver(
+		res, broadcastHeight, payHash, htlcAmt, resCfg,
+	)
+
+	return &htlcIncomingContestResolver{
+		htlcExpiry:          htlcExpiry,
+		circuitKey:          circuitKey,
+		htlcSuccessResolver: *success,
+	}
+}
+
 // Resolve attempts to resolve this contract. As we don't yet know of the
 // preimage for the contract, we'll wait for one of two things to happen:
 //
@@ -68,7 +87,7 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) {
 			return nil, errResolverShuttingDown
 		}
 		currentHeight = newBlock.Height
-	case <-h.Quit:
+	case <-h.quit:
 		return nil, errResolverShuttingDown
 	}
 
@@ -239,7 +258,7 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) {
 				return nil, h.Checkpoint(h)
 			}
 
-		case <-h.Quit:
+		case <-h.quit:
 			return nil, errResolverShuttingDown
 		}
 	}
@@ -271,7 +290,7 @@ func (h *htlcIncomingContestResolver) report() *ContractReport {
 //
 // NOTE: Part of the ContractResolver interface.
 func (h *htlcIncomingContestResolver) Stop() {
-	close(h.Quit)
+	close(h.quit)
 }
 
 // IsResolved returns true if the stored state in the resolve is fully
@@ -296,27 +315,27 @@ func (h *htlcIncomingContestResolver) Encode(w io.Writer) error {
 	return h.htlcSuccessResolver.Encode(w)
 }
 
-// Decode attempts to decode an encoded ContractResolver from the passed Reader
-// instance, returning an active ContractResolver instance.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcIncomingContestResolver) Decode(r io.Reader) error {
+// newIncomingContestResolverFromReader attempts to decode an encoded ContractResolver
+// from the passed Reader instance, returning an active ContractResolver
+// instance.
+func newIncomingContestResolverFromReader(r io.Reader, resCfg ResolverConfig) (
+	*htlcIncomingContestResolver, error) {
+
+	h := &htlcIncomingContestResolver{}
+
 	// We'll first read the one field unique to this resolver.
 	if err := binary.Read(r, endian, &h.htlcExpiry); err != nil {
-		return err
+		return nil, err
 	}
 
 	// Then we'll decode our internal resolver.
-	return h.htlcSuccessResolver.Decode(r)
-}
+	successResolver, err := newSuccessResolverFromReader(r, resCfg)
+	if err != nil {
+		return nil, err
+	}
+	h.htlcSuccessResolver = *successResolver
 
-// AttachResolverKit should be called once a resolved is successfully decoded
-// from its stored format. This struct delivers a generic tool kit that
-// resolvers need to complete their duty.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcIncomingContestResolver) AttachResolverKit(r ResolverKit) {
-	h.ResolverKit = r
+	return h, nil
 }
 
 // A compile time assertion to ensure htlcIncomingContestResolver meets the
diff --git a/contractcourt/htlc_incoming_resolver_test.go b/contractcourt/htlc_incoming_resolver_test.go
index 43d01817b..1f28f0a50 100644
--- a/contractcourt/htlc_incoming_resolver_test.go
+++ b/contractcourt/htlc_incoming_resolver_test.go
@@ -199,17 +199,18 @@ func newIncomingResolverTestContext(t *testing.T) *incomingResolverTestContext {
 		},
 	}
 
+	cfg := ResolverConfig{
+		ChannelArbitratorConfig: chainCfg,
+		Checkpoint: func(_ ContractResolver) error {
+			checkPointChan <- struct{}{}
+			return nil
+		},
+	}
 	resolver := &htlcIncomingContestResolver{
 		htlcSuccessResolver: htlcSuccessResolver{
-			ResolverKit: ResolverKit{
-				ChannelArbitratorConfig: chainCfg,
-				Checkpoint: func(_ ContractResolver) error {
-					checkPointChan <- struct{}{}
-					return nil
-				},
-			},
-			htlcResolution: lnwallet.IncomingHtlcResolution{},
-			payHash:        testResHash,
+			contractResolverKit: *newContractResolverKit(cfg),
+			htlcResolution:      lnwallet.IncomingHtlcResolution{},
+			payHash:             testResHash,
 		},
 		htlcExpiry: testHtlcExpiry,
 	}
diff --git a/contractcourt/htlc_outgoing_contest_resolver.go b/contractcourt/htlc_outgoing_contest_resolver.go
index 789558a67..7388b45a8 100644
--- a/contractcourt/htlc_outgoing_contest_resolver.go
+++ b/contractcourt/htlc_outgoing_contest_resolver.go
@@ -5,6 +5,8 @@ import (
 	"io"
 
 	"github.com/btcsuite/btcutil"
+	"github.com/lightningnetwork/lnd/lnwallet"
+	"github.com/lightningnetwork/lnd/lnwire"
 )
 
 // htlcOutgoingContestResolver is a ContractResolver that's able to resolve an
@@ -18,6 +20,21 @@ type htlcOutgoingContestResolver struct {
 	htlcTimeoutResolver
 }
 
+// newOutgoingContestResolver instantiates a new outgoing contested htlc
+// resolver.
+func newOutgoingContestResolver(res lnwallet.OutgoingHtlcResolution,
+	broadcastHeight uint32, htlcIndex uint64, htlcAmt lnwire.MilliSatoshi,
+	resCfg ResolverConfig) *htlcOutgoingContestResolver {
+
+	timeout := newTimeoutResolver(
+		res, broadcastHeight, htlcIndex, htlcAmt, resCfg,
+	)
+
+	return &htlcOutgoingContestResolver{
+		htlcTimeoutResolver: *timeout,
+	}
+}
+
 // Resolve commences the resolution of this contract. As this contract hasn't
 // yet timed out, we'll wait for one of two things to happen
 //
@@ -130,7 +147,7 @@ func (h *htlcOutgoingContestResolver) Resolve() (ContractResolver, error) {
 			// claimed.
 			return h.claimCleanUp(commitSpend)
 
-		case <-h.Quit:
+		case <-h.quit:
 			return nil, fmt.Errorf("resolver canceled")
 		}
 	}
@@ -162,7 +179,7 @@ func (h *htlcOutgoingContestResolver) report() *ContractReport {
 //
 // NOTE: Part of the ContractResolver interface.
 func (h *htlcOutgoingContestResolver) Stop() {
-	close(h.Quit)
+	close(h.quit)
 }
 
 // IsResolved returns true if the stored state in the resolve is fully
@@ -181,21 +198,19 @@ func (h *htlcOutgoingContestResolver) Encode(w io.Writer) error {
 	return h.htlcTimeoutResolver.Encode(w)
 }
 
-// Decode attempts to decode an encoded ContractResolver from the passed Reader
-// instance, returning an active ContractResolver instance.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcOutgoingContestResolver) Decode(r io.Reader) error {
-	return h.htlcTimeoutResolver.Decode(r)
-}
+// newOutgoingContestResolverFromReader attempts to decode an encoded ContractResolver
+// from the passed Reader instance, returning an active ContractResolver
+// instance.
+func newOutgoingContestResolverFromReader(r io.Reader, resCfg ResolverConfig) (
+	*htlcOutgoingContestResolver, error) {
 
-// AttachResolverKit should be called once a resolved is successfully decoded
-// from its stored format. This struct delivers a generic tool kit that
-// resolvers need to complete their duty.
-//
-// NOTE: Part of the ContractResolver interface.
-func (h *htlcOutgoingContestResolver) AttachResolverKit(r ResolverKit) {
-	h.ResolverKit = r
+	h := &htlcOutgoingContestResolver{}
+	timeoutResolver, err := newTimeoutResolverFromReader(r, resCfg)
+	if err != nil {
+		return nil, err
+	}
+	h.htlcTimeoutResolver = *timeoutResolver
+	return h, nil
 }
 
 // A compile time assertion to ensure htlcOutgoingContestResolver meets the
diff --git a/contractcourt/htlc_outgoing_contest_resolver_test.go b/contractcourt/htlc_outgoing_contest_resolver_test.go
index 244b438d3..1f7dbed13 100644
--- a/contractcourt/htlc_outgoing_contest_resolver_test.go
+++ b/contractcourt/htlc_outgoing_contest_resolver_test.go
@@ -122,16 +122,18 @@ func newOutgoingResolverTestContext(t *testing.T) *outgoingResolverTestContext {
 		},
 	}
 
+	cfg := ResolverConfig{
+		ChannelArbitratorConfig: chainCfg,
+		Checkpoint: func(_ ContractResolver) error {
+			checkPointChan <- struct{}{}
+			return nil
+		},
+	}
+
 	resolver := &htlcOutgoingContestResolver{
 		htlcTimeoutResolver: htlcTimeoutResolver{
-			ResolverKit: ResolverKit{
-				ChannelArbitratorConfig: chainCfg,
-				Checkpoint: func(_ ContractResolver) error {
-					checkPointChan <- struct{}{}
-					return nil
-				},
-			},
-			htlcResolution: outgoingRes,
+			contractResolverKit: *newContractResolverKit(cfg),
+			htlcResolution:      outgoingRes,
 		},
 	}
 
diff --git a/contractcourt/htlc_timeout_resolver_test.go b/contractcourt/htlc_timeout_resolver_test.go
index 7dcf025ad..981cefc41 100644
--- a/contractcourt/htlc_timeout_resolver_test.go
+++ b/contractcourt/htlc_timeout_resolver_test.go
@@ -237,15 +237,18 @@ func TestHtlcTimeoutResolver(t *testing.T) {
 			},
 		}
 
-		resolver := &htlcTimeoutResolver{
-			ResolverKit: ResolverKit{
-				ChannelArbitratorConfig: chainCfg,
-				Checkpoint: func(_ ContractResolver) error {
-					checkPointChan <- struct{}{}
-					return nil
-				},
+		cfg := ResolverConfig{
+			ChannelArbitratorConfig: chainCfg,
+			Checkpoint: func(_ ContractResolver) error {
+				checkPointChan <- struct{}{}
+				return nil
 			},
 		}
+		resolver := &htlcTimeoutResolver{
+			contractResolverKit: *newContractResolverKit(
+				cfg,
+			),
+		}
 		resolver.htlcResolution.SweepSignDesc = *fakeSignDesc
 
 		// If the test case needs the remote commitment to be
diff --git a/discovery/mock_test.go b/discovery/mock_test.go
index f3f707d50..57fc319a5 100644
--- a/discovery/mock_test.go
+++ b/discovery/mock_test.go
@@ -56,10 +56,10 @@ func (p *mockPeer) Address() net.Addr { return nil }
 func (p *mockPeer) QuitSignal() <-chan struct{} {
 	return p.quit
 }
-func (p *mockPeer) LocalFeatures() *lnwire.FeatureVector {
+func (p *mockPeer) LocalGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
-func (p *mockPeer) RemoteFeatures() *lnwire.FeatureVector {
+func (p *mockPeer) RemoteGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
 
diff --git a/feature/manager_internal_test.go b/feature/manager_internal_test.go
deleted file mode 100644
index 9c97bd052..000000000
--- a/feature/manager_internal_test.go
+++ /dev/null
@@ -1,128 +0,0 @@
-package feature
-
-import (
-	"reflect"
-	"testing"
-
-	"github.com/lightningnetwork/lnd/lnwire"
-)
-
-type managerTest struct {
-	name string
-	cfg  Config
-}
-
-const unknownFeature lnwire.FeatureBit = 30
-
-var testSetDesc = setDesc{
-	lnwire.DataLossProtectRequired: {
-		SetNodeAnn: {}, // I
-	},
-	lnwire.TLVOnionPayloadOptional: {
-		SetInit:    {}, // I
-		SetNodeAnn: {}, // N
-	},
-	lnwire.StaticRemoteKeyOptional: {
-		SetInit:    {}, // I
-		SetNodeAnn: {}, // N
-	},
-}
-
-var managerTests = []managerTest{
-	{
-		name: "default",
-		cfg:  Config{},
-	},
-	{
-		name: "no tlv",
-		cfg: Config{
-			NoTLVOnion: true,
-		},
-	},
-	{
-		name: "no static remote key",
-		cfg: Config{
-			NoStaticRemoteKey: true,
-		},
-	},
-	{
-		name: "no tlv or static remote key",
-		cfg: Config{
-			NoTLVOnion:        true,
-			NoStaticRemoteKey: true,
-		},
-	},
-}
-
-// TestManager asserts basic initialazation and operation of a feature manager,
-// including that the proper features are removed in response to config changes.
-func TestManager(t *testing.T) {
-	for _, test := range managerTests {
-		test := test
-		t.Run(test.name, func(t *testing.T) {
-			testManager(t, test)
-		})
-	}
-}
-
-func testManager(t *testing.T, test managerTest) {
-	m, err := newManager(test.cfg, testSetDesc)
-	if err != nil {
-		t.Fatalf("unable to create feature manager: %v", err)
-	}
-
-	sets := []Set{
-		SetInit,
-		SetLegacyGlobal,
-		SetNodeAnn,
-		SetInvoice,
-	}
-
-	for _, set := range sets {
-		raw := m.GetRaw(set)
-		fv := m.Get(set)
-
-		fv2 := lnwire.NewFeatureVector(raw, lnwire.Features)
-
-		if !reflect.DeepEqual(fv, fv2) {
-			t.Fatalf("mismatch Get vs GetRaw, raw: %v vs fv: %v",
-				fv2, fv)
-		}
-
-		assertUnset := func(bit lnwire.FeatureBit) {
-			hasBit := fv.HasFeature(bit) || fv.HasFeature(bit^1)
-			if hasBit {
-				t.Fatalf("bit %v or %v is set", bit, bit^1)
-			}
-		}
-
-		// Assert that the manager properly unset the configured feature
-		// bits from all sets.
-		if test.cfg.NoTLVOnion {
-			assertUnset(lnwire.TLVOnionPayloadOptional)
-		}
-		if test.cfg.NoStaticRemoteKey {
-			assertUnset(lnwire.StaticRemoteKeyOptional)
-		}
-
-		assertUnset(unknownFeature)
-	}
-
-	// Do same basic sanity checks on features that are always present.
-	nodeFeatures := m.Get(SetNodeAnn)
-
-	assertSet := func(bit lnwire.FeatureBit) {
-		has := nodeFeatures.HasFeature(bit)
-		if !has {
-			t.Fatalf("node features don't advertised %v", bit)
-		}
-	}
-
-	assertSet(lnwire.DataLossProtectOptional)
-	if !test.cfg.NoTLVOnion {
-		assertSet(lnwire.TLVOnionPayloadRequired)
-	}
-	if !test.cfg.NoStaticRemoteKey {
-		assertSet(lnwire.StaticRemoteKeyOptional)
-	}
-}
diff --git a/fundingmanager_test.go b/fundingmanager_test.go
index 09bbe6605..024339d90 100644
--- a/fundingmanager_test.go
+++ b/fundingmanager_test.go
@@ -184,11 +184,11 @@ func (n *testNode) QuitSignal() <-chan struct{} {
 	return n.shutdownChannel
 }
 
-func (n *testNode) LocalFeatures() *lnwire.FeatureVector {
+func (n *testNode) LocalGlobalFeatures() *lnwire.FeatureVector {
 	return lnwire.NewFeatureVector(nil, nil)
 }
 
-func (n *testNode) RemoteFeatures() *lnwire.FeatureVector {
+func (n *testNode) RemoteGlobalFeatures() *lnwire.FeatureVector {
 	return lnwire.NewFeatureVector(nil, nil)
 }
 
diff --git a/htlcswitch/link_isolated_test.go b/htlcswitch/link_isolated_test.go
index f108853f1..8f059d748 100644
--- a/htlcswitch/link_isolated_test.go
+++ b/htlcswitch/link_isolated_test.go
@@ -139,21 +139,6 @@ func (l *linkTestContext) receiveRevAndAckAliceToBob() {
 func (l *linkTestContext) receiveCommitSigAliceToBob(expHtlcs int) {
 	l.t.Helper()
 
-	comSig := l.receiveCommitSigAlice(expHtlcs)
-
-	err := l.bobChannel.ReceiveNewCommitment(
-		comSig.CommitSig, comSig.HtlcSigs,
-	)
-	if err != nil {
-		l.t.Fatalf("bob failed receiving commitment: %v", err)
-	}
-}
-
-// receiveCommitSigAlice waits for Alice to send a CommitSig, signing expHtlcs
-// numbers of HTLCs.
-func (l *linkTestContext) receiveCommitSigAlice(expHtlcs int) *lnwire.CommitSig {
-	l.t.Helper()
-
 	var msg lnwire.Message
 	select {
 	case msg = <-l.aliceMsgs:
@@ -170,8 +155,11 @@ func (l *linkTestContext) receiveCommitSigAlice(expHtlcs int) *lnwire.CommitSig
 		l.t.Fatalf("expected %d htlc sigs, got %d", expHtlcs,
 			len(comSig.HtlcSigs))
 	}
-
-	return comSig
+	err := l.bobChannel.ReceiveNewCommitment(comSig.CommitSig,
+		comSig.HtlcSigs)
+	if err != nil {
+		l.t.Fatalf("bob failed receiving commitment: %v", err)
+	}
 }
 
 // sendRevAndAckBobToAlice make Bob revoke his current commitment, then hand
@@ -254,15 +242,3 @@ func (l *linkTestContext) receiveFailAliceToBob() {
 		l.t.Fatalf("unable to apply received fail htlc: %v", err)
 	}
 }
-
-// assertNoMsgFromAlice asserts that Alice hasn't sent a message. Before
-// calling, make sure that Alice has had the opportunity to send the message.
-func (l *linkTestContext) assertNoMsgFromAlice(timeout time.Duration) {
-	l.t.Helper()
-
-	select {
-	case msg := <-l.aliceMsgs:
-		l.t.Fatalf("unexpected message from Alice: %v", msg)
-	case <-time.After(timeout):
-	}
-}
diff --git a/htlcswitch/link_test.go b/htlcswitch/link_test.go
index 2ad917067..93eb37635 100644
--- a/htlcswitch/link_test.go
+++ b/htlcswitch/link_test.go
@@ -1653,10 +1653,10 @@ func (m *mockPeer) IdentityKey() *btcec.PublicKey {
 func (m *mockPeer) Address() net.Addr {
 	return nil
 }
-func (m *mockPeer) LocalFeatures() *lnwire.FeatureVector {
+func (m *mockPeer) LocalGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
-func (m *mockPeer) RemoteFeatures() *lnwire.FeatureVector {
+func (m *mockPeer) RemoteGlobalFeatures() *lnwire.FeatureVector {
 	return nil
 }
 
@@ -4620,91 +4620,6 @@ func TestChannelLinkWaitForRevocation(t *testing.T) {
 	assertNoMsgFromAlice()
 }
 
-// TestChannelLinkNoEmptySig asserts that no empty commit sig message is sent
-// when the commitment txes are out of sync.
-func TestChannelLinkNoEmptySig(t *testing.T) {
-	t.Parallel()
-
-	const chanAmt = btcutil.SatoshiPerBitcoin * 5
-	const chanReserve = btcutil.SatoshiPerBitcoin * 1
-	aliceLink, bobChannel, batchTicker, start, cleanUp, _, err :=
-		newSingleLinkTestHarness(chanAmt, chanReserve)
-	if err != nil {
-		t.Fatalf("unable to create link: %v", err)
-	}
-	defer cleanUp()
-
-	if err := start(); err != nil {
-		t.Fatalf("unable to start test harness: %v", err)
-	}
-	defer aliceLink.Stop()
-
-	var (
-		coreLink  = aliceLink.(*channelLink)
-		aliceMsgs = coreLink.cfg.Peer.(*mockPeer).sentMsgs
-	)
-
-	ctx := linkTestContext{
-		t:          t,
-		aliceLink:  aliceLink,
-		aliceMsgs:  aliceMsgs,
-		bobChannel: bobChannel,
-	}
-
-	// Send htlc 1 from Alice to Bob.
-	htlc1, _ := generateHtlcAndInvoice(t, 0)
-	ctx.sendHtlcAliceToBob(0, htlc1)
-	ctx.receiveHtlcAliceToBob()
-
-	// Tick the batch ticker to trigger a commitsig from Alice->Bob.
-	select {
-	case batchTicker <- time.Now():
-	case <-time.After(5 * time.Second):
-		t.Fatalf("could not force commit sig")
-	}
-
-	// Receive a CommitSig from Alice covering the Add from above.
-	ctx.receiveCommitSigAliceToBob(1)
-
-	// Bob revokes previous commitment tx.
-	ctx.sendRevAndAckBobToAlice()
-
-	// Alice sends htlc 2 to Bob.
-	htlc2, _ := generateHtlcAndInvoice(t, 0)
-	ctx.sendHtlcAliceToBob(1, htlc2)
-	ctx.receiveHtlcAliceToBob()
-
-	// Tick the batch ticker to trigger a commitsig from Alice->Bob.
-	select {
-	case batchTicker <- time.Now():
-	case <-time.After(5 * time.Second):
-		t.Fatalf("could not force commit sig")
-	}
-
-	// Get the commit sig from Alice, but don't send it to Bob yet.
-	commitSigAlice := ctx.receiveCommitSigAlice(2)
-
-	// Bob adds htlc 1 to its remote commit tx.
-	ctx.sendCommitSigBobToAlice(1)
-
-	// Now send Bob the signature from Alice covering both htlcs.
-	err = bobChannel.ReceiveNewCommitment(
-		commitSigAlice.CommitSig, commitSigAlice.HtlcSigs,
-	)
-	if err != nil {
-		t.Fatalf("bob failed receiving commitment: %v", err)
-	}
-
-	// Both Alice and Bob revoke their previous commitment txes.
-	ctx.receiveRevAndAckAliceToBob()
-	ctx.sendRevAndAckBobToAlice()
-
-	// The commit txes are not in sync, but it is Bob's turn to send a new
-	// signature. We don't expect Alice to send out any message. This check
-	// allows some time for the log commit ticker to trigger for Alice.
-	ctx.assertNoMsgFromAlice(time.Second)
-}
-
 // TestChannelLinkBatchPreimageWrite asserts that a link will batch preimage
 // writes when just as it receives a CommitSig to lock in any Settles, and also
 // if the link is aware of any uncommitted preimages if the link is stopped,
@@ -5902,95 +5817,6 @@ func TestChannelLinkHoldInvoiceRestart(t *testing.T) {
 	}
 }
 
-// TestChannelLinkRevocationWindowRegular asserts that htlcs paying to a regular
-// invoice are settled even if the revocation window gets exhausted.
-func TestChannelLinkRevocationWindowRegular(t *testing.T) {
-	t.Parallel()
-
-	const (
-		chanAmt = btcutil.SatoshiPerBitcoin * 5
-	)
-
-	// We'll start by creating a new link with our chanAmt (5 BTC). We will
-	// only be testing Alice's behavior, so the reference to Bob's channel
-	// state is unnecessary.
-	aliceLink, bobChannel, _, start, cleanUp, _, err :=
-		newSingleLinkTestHarness(chanAmt, 0)
-	if err != nil {
-		t.Fatalf("unable to create link: %v", err)
-	}
-	defer cleanUp()
-
-	if err := start(); err != nil {
-		t.Fatalf("unable to start test harness: %v", err)
-	}
-	defer aliceLink.Stop()
-
-	var (
-		coreLink  = aliceLink.(*channelLink)
-		registry  = coreLink.cfg.Registry.(*mockInvoiceRegistry)
-		aliceMsgs = coreLink.cfg.Peer.(*mockPeer).sentMsgs
-	)
-
-	ctx := linkTestContext{
-		t:          t,
-		aliceLink:  aliceLink,
-		aliceMsgs:  aliceMsgs,
-		bobChannel: bobChannel,
-	}
-
-	registry.settleChan = make(chan lntypes.Hash)
-
-	htlc1, invoice1 := generateHtlcAndInvoice(t, 0)
-	htlc2, invoice2 := generateHtlcAndInvoice(t, 1)
-
-	// We must add the invoice to the registry, such that Alice
-	// expects this payment.
-	err = registry.AddInvoice(*invoice1, htlc1.PaymentHash)
-	if err != nil {
-		t.Fatalf("unable to add invoice to registry: %v", err)
-	}
-	err = registry.AddInvoice(*invoice2, htlc2.PaymentHash)
-	if err != nil {
-		t.Fatalf("unable to add invoice to registry: %v", err)
-	}
-
-	// Lock in htlc 1 on both sides.
-	ctx.sendHtlcBobToAlice(htlc1)
-	ctx.sendCommitSigBobToAlice(1)
-	ctx.receiveRevAndAckAliceToBob()
-	ctx.receiveCommitSigAliceToBob(1)
-	ctx.sendRevAndAckBobToAlice()
-
-	// We expect a call to the invoice registry to notify the arrival of the
-	// htlc.
-	select {
-	case <-registry.settleChan:
-	case <-time.After(5 * time.Second):
-		t.Fatal("expected invoice to be settled")
-	}
-
-	// Expect alice to send a settle and commitsig message to bob. Bob does
-	// not yet send the revocation.
-	ctx.receiveSettleAliceToBob()
-	ctx.receiveCommitSigAliceToBob(0)
-
-	// Pay invoice 2.
-	ctx.sendHtlcBobToAlice(htlc2)
-	ctx.sendCommitSigBobToAlice(2)
-	ctx.receiveRevAndAckAliceToBob()
-
-	// At this point, Alice cannot send a new commit sig to bob because the
-	// revocation window is exhausted.
-
-	// Bob sends revocation and signs commit with htlc1 settled.
-	ctx.sendRevAndAckBobToAlice()
-
-	// After the revocation, it is again possible for Alice to send a commit
-	// sig with htlc2.
-	ctx.receiveCommitSigAliceToBob(1)
-}
-
 // TestChannelLinkRevocationWindowHodl asserts that htlcs paying to a hodl
 // invoice are settled even if the revocation window gets exhausted.
 func TestChannelLinkRevocationWindowHodl(t *testing.T) {
@@ -6136,77 +5962,6 @@ func TestChannelLinkRevocationWindowHodl(t *testing.T) {
 	}
 }
 
-// TestChannelLinkReceiveEmptySig tests the response of the link to receiving an
-// empty commit sig. This should be tolerated, but we shouldn't send out an
-// empty sig ourselves.
-func TestChannelLinkReceiveEmptySig(t *testing.T) {
-	t.Parallel()
-
-	const chanAmt = btcutil.SatoshiPerBitcoin * 5
-	const chanReserve = btcutil.SatoshiPerBitcoin * 1
-	aliceLink, bobChannel, batchTicker, start, cleanUp, _, err :=
-		newSingleLinkTestHarness(chanAmt, chanReserve)
-	if err != nil {
-		t.Fatalf("unable to create link: %v", err)
-	}
-	defer cleanUp()
-
-	if err := start(); err != nil {
-		t.Fatalf("unable to start test harness: %v", err)
-	}
-
-	var (
-		coreLink  = aliceLink.(*channelLink)
-		aliceMsgs = coreLink.cfg.Peer.(*mockPeer).sentMsgs
-	)
-
-	ctx := linkTestContext{
-		t:          t,
-		aliceLink:  aliceLink,
-		aliceMsgs:  aliceMsgs,
-		bobChannel: bobChannel,
-	}
-
-	htlc, _ := generateHtlcAndInvoice(t, 0)
-
-	// First, send an Add from Alice to Bob.
-	ctx.sendHtlcAliceToBob(0, htlc)
-	ctx.receiveHtlcAliceToBob()
-
-	// Tick the batch ticker to trigger a commitsig from Alice->Bob.
-	select {
-	case batchTicker <- time.Now():
-	case <-time.After(5 * time.Second):
-		t.Fatalf("could not force commit sig")
-	}
-
-	// Make Bob send a CommitSig. Since Bob hasn't received Alice's sig, he
-	// cannot add the htlc to his remote tx yet. The commit sig that we
-	// force Bob to send will be empty. Note that this normally does not
-	// happen, because the link (which is not present for Bob in this test)
-	// check whether Bob actually owes a sig first.
-	ctx.sendCommitSigBobToAlice(0)
-
-	// Receive a CommitSig from Alice covering the htlc from above.
-	ctx.receiveCommitSigAliceToBob(1)
-
-	// Wait for RevokeAndAck Alice->Bob. Even though Bob sent an empty
-	// commit sig, Alice still needs to revoke the previous commitment tx.
-	ctx.receiveRevAndAckAliceToBob()
-
-	// Send RevokeAndAck Bob->Alice to ack the added htlc.
-	ctx.sendRevAndAckBobToAlice()
-
-	// We received an empty commit sig, we accepted it, but there is nothing
-	// new to sign for us.
-
-	// No other messages are expected.
-	ctx.assertNoMsgFromAlice(time.Second)
-
-	// Stop the link
-	aliceLink.Stop()
-}
-
 // assertFailureCode asserts that an error is of type ForwardingError and that
 // the failure code is as expected.
 func assertFailureCode(t *testing.T, err error, code lnwire.FailCode) {
diff --git a/routing/missioncontrol_test.go b/routing/missioncontrol_test.go
index f7b2f33a0..bbef69c94 100644
--- a/routing/missioncontrol_test.go
+++ b/routing/missioncontrol_test.go
@@ -13,7 +13,7 @@ import (
 
 var (
 	mcTestRoute = &route.Route{
-		SourcePubKey: mcTestSelf,
+		SourcePubKey: route.Vertex{10},
 		Hops: []*route.Hop{
 			{
 				ChannelID:     1,
@@ -30,7 +30,6 @@ var (
 	}
 
 	mcTestTime  = time.Date(2018, time.January, 9, 14, 00, 00, 0, time.UTC)
-	mcTestSelf  = route.Vertex{10}
 	mcTestNode1 = mcTestRoute.Hops[0].PubKeyBytes
 	mcTestNode2 = mcTestRoute.Hops[1].PubKeyBytes
 
@@ -81,7 +80,6 @@ func (ctx *mcTestContext) restartMc() {
 			PenaltyHalfLife:       testPenaltyHalfLife,
 			AprioriHopProbability: testAprioriHopProbability,
 			AprioriWeight:         testAprioriWeight,
-			SelfNode:              mcTestSelf,
 		},
 	)
 	if err != nil {
@@ -100,6 +98,7 @@ func (ctx *mcTestContext) cleanup() {
 
 // Assert that mission control returns a probability for an edge.
 func (ctx *mcTestContext) expectP(amt lnwire.MilliSatoshi, expected float64) {
+
 	ctx.t.Helper()
 
 	p := ctx.mc.GetProbability(mcTestNode1, mcTestNode2, amt)
@@ -139,13 +138,6 @@ func TestMissionControl(t *testing.T) {
 
 	testTime := time.Date(2018, time.January, 9, 14, 00, 00, 0, time.UTC)
 
-	// For local channels, we expect a higher probability than our a prior
-	// test probability.
-	selfP := ctx.mc.GetProbability(mcTestSelf, mcTestNode1, 100)
-	if selfP != prevSuccessProbability {
-		t.Fatalf("expected prev success prob for untried local chans")
-	}
-
 	// Initial probability is expected to be the a priori.
 	ctx.expectP(1000, testAprioriHopProbability)
 
diff --git a/routing/notifications_test.go b/routing/notifications_test.go
index 2371a4e1c..a18f5c90c 100644
--- a/routing/notifications_test.go
+++ b/routing/notifications_test.go
@@ -28,7 +28,7 @@ var (
 		Port: 9000}
 	testAddrs = []net.Addr{testAddr}
 
-	testFeatures = lnwire.NewFeatureVector(nil, lnwire.Features)
+	testFeatures = lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures)
 
 	testHash = [32]byte{
 		0xb7, 0x94, 0x38, 0x5f, 0x2d, 0x1e, 0xf7, 0xab,