go-chassis Go Chassis
Copyright 2019-present, tianxiaoliang

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

================================================================
The Apache 2.0 License
================================================================

The following components are provided under the  Apache 2.0 License  (https://opensource.org/licenses/Apache-2.0). See project link for details.

github.com/apache/thrift/lib/go/thrift                                         
github.com/matttproud/golang_protobuf_extensions/pbutil                        
github.com/opentracing-contrib/go-observer                                     
github.com/prometheus/client_golang/prometheus/promhttp                       
github.com/prometheus/client_model/go                                         
github.com/prometheus/common                                                  
github.com/prometheus/procfs/xfs
k8s.io/apimachinery/pkg/util/sets

================================================================
The ISC License
================================================================

The following components are provided under the  ISC License  (https://opensource.org/licenses/ISC). See project link for details.

github.com/davecgh/go-spew/spew

================================================================
The MIT License
================================================================

The following components are provided under the  MIT License  (http://www.opensource.org/licenses/mit-license.php). See project link for details.

github.com/beorn7/perks/quantile
github.com/cactus/go-statsd-client
github.com/cenkalti/backoff
github.com/DataDog/datadog-go
github.com/eapache/go-resiliency/breaker
github.com/eapache/go-xerial-snappy
github.com/eapache/queue
github.com/emicklei/go-restful/log
github.com/emicklei/go-restful-swagger12
github.com/klauspost/cpuid
github.com/onsi/ginkgo
github.com/onsi/gomega
github.com/opentracing/opentracing-go
github.com/openzipkin/zipkin-go-opentracing
github.com/patrickmn/go-cache
github.com/reactivex/rxgo
github.com/smartystreets/assertions
github.com/smartystreets/goconvey
github.com/spf13/cast
github.com/valyala/fasthttp
go.uber.org/ratelimit

================================================================
The BSD Licenses
================================================================

The following components are provided under the BSD Licenses (http://www.opensource.org/licenses/bsd-license.php). See project link for details.

golang.org/x/net/context
github.com/rcrowley/go-metrics
github.com/klauspost/crc32
github.com/klauspost/compress
github.com/gorilla/websocket
github.com/golang/snappy
github.com/golang/protobuf/proto
github.com/gogo/protobuf/proto
github.com/fsnotify/fsnotify
github.com/shirou/gopsutil

================================================================
Notice for gopkg.in/yaml.v2:

The following files were ported to Go from C files of libyaml, and thus
are still covered by their original copyright and license:

    apic.go
    emitterc.go
    parserc.go
    readerc.go
    scannerc.go
    writerc.go
    yamlh.go
    yamlprivateh.go

Copyright (c) 2006 Kirill Simonov

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

==========================================
For core/loadbalance/default.go,third_party/forked/go-micro,
core/loadbalance/default_test.go(Forked from github.com/micro/go-micro)

   Copyright 2015 Asim Aslam.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

==========================================
For metrics/prometheusmetrics.go,metrics/prometheusmetrics_test.go(Forked from github.com/deathowl/go-metrics-prometheus)

   Copyright 2016 Csergő Bálint github.com/deathowl

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

==========================================
For vendor/github.com/go-chassis/paas-lager/third_party/forked/cloudfoundry/lager(Forked from github.com/cloudfoundry/lager)

Copyright (c) 2015-Present CloudFoundry.org Foundation, Inc. All Rights Reserved.

This project contains software that is Copyright (c) 2014-2015 Pivotal Software, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

This project may include a number of subcomponents with separate
copyright notices and license terms. Your use of these subcomponents
is subject to the terms and conditions of each subcomponent's license,
as noted in the LICENSE file.


==========================================
For third_party/forked/afex/hystrix-go,vendor/github.com/go-chassis/cse-collector/cse_collector.go(Forked from github.com/afex/hystrix-go/hystrix)
The MIT License (MIT)

Copyright (c) 2013 keith

==========================================
For vendor/github.com/go-chassis/auth/third_party/forked/datastream/aws(Forked from github.com/datastream/aws)

Copyright (c) 2014, Xianjie
All rights reserved.

==========================================
For core/provider/default_provider.go(Forked from github.com/golang/go)

Copyright 2009 The Go Authors. All rights reserved.