// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Apache Software Foundation (ASF) licenses this file to you 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.

// Code generated by go-bindata. DO NOT EDIT.
// sources:
// cr/oap.yaml (942B)
// cr/ui.yaml (935B)
// graphqls/healthcheck/healthcheck.graphql (870B)
// graphqls/metadata/AllServices.graphql (911B)
// graphqls/metadata/Instances.graphql (1.069kB)
// graphqls/metadata/SearchEndpoints.graphql (975B)
// graphqls/metadata/SearchService.graphql (930B)
// graphqls/metadata/ServerTimeInfo.graphql (883B)
// graphqls/metrics/HeatMap.graphql (1.067kB)
// graphqls/metrics/LabeledMetricsValues.graphql (1.095kB)
// graphqls/metrics/ListMetrics.graphql (923B)
// graphqls/metrics/MetricsValue.graphql (943B)
// graphqls/metrics/MetricsValues.graphql (1.05kB)
// graphqls/metrics/SortMetrics.graphql (969B)
// graphqls/trace/Trace.graphql (1.486kB)
// graphqls/trace/Traces.graphql (1.077kB)
// templates/dashboard/global.yml (3.001kB)

package assets

import (
	"crypto/sha256"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
	"time"
)

type asset struct {
	bytes  []byte
	info   os.FileInfo
	digest [sha256.Size]byte
}

type bindataFileInfo struct {
	name    string
	size    int64
	mode    os.FileMode
	modTime time.Time
}

func (fi bindataFileInfo) Name() string {
	return fi.name
}
func (fi bindataFileInfo) Size() int64 {
	return fi.size
}
func (fi bindataFileInfo) Mode() os.FileMode {
	return fi.mode
}
func (fi bindataFileInfo) ModTime() time.Time {
	return fi.modTime
}
func (fi bindataFileInfo) IsDir() bool {
	return false
}
func (fi bindataFileInfo) Sys() interface{} {
	return nil
}

var _crOapYaml = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

apiVersion: operator.skywalking.apache.org/v1alpha1
kind: OAPServer
metadata:
  name: skywalking
spec:
  version: 8.3.0
  instances: 1
 `)

func crOapYamlBytes() ([]byte, error) {
	return _crOapYaml, nil
}

func crOapYaml() (*asset, error) {
	bytes, err := crOapYamlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "cr/oap.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb1, 0xd1, 0x17, 0xf7, 0xde, 0x69, 0x4c, 0x3, 0xab, 0x7a, 0x1f, 0x98, 0x8e, 0x9e, 0x5e, 0xa8, 0x60, 0x5e, 0xe4, 0xe8, 0x79, 0xac, 0x65, 0x2f, 0x73, 0x5b, 0xb1, 0xc1, 0xf5, 0x9a, 0x14, 0x80}}
	return a, nil
}

var _crUiYaml = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

apiVersion: operator.skywalking.apache.org/v1alpha1
kind: UI
metadata:
  name: skywalking
spec:
  version: 8.3.0
  instances: 1
 `)

func crUiYamlBytes() ([]byte, error) {
	return _crUiYaml, nil
}

func crUiYaml() (*asset, error) {
	bytes, err := crUiYamlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "cr/ui.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0x65, 0xbc, 0x6, 0xf6, 0x0, 0x70, 0x4d, 0xcc, 0x9f, 0x9e, 0xea, 0x1b, 0x5d, 0xee, 0xcd, 0x95, 0x5b, 0xf2, 0xdf, 0xe7, 0x76, 0xb4, 0x36, 0x96, 0x98, 0x2, 0xa1, 0x8e, 0x2f, 0x27, 0x60}}
	return a, nil
}

var _graphqlsHealthcheckHealthcheckGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query {
    checkHealth {
        score
        details
    }
}
`)

func graphqlsHealthcheckHealthcheckGraphqlBytes() ([]byte, error) {
	return _graphqlsHealthcheckHealthcheckGraphql, nil
}

func graphqlsHealthcheckHealthcheckGraphql() (*asset, error) {
	bytes, err := graphqlsHealthcheckHealthcheckGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/healthcheck/healthcheck.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x71, 0x53, 0x13, 0xd0, 0x51, 0xd7, 0x12, 0xd1, 0xed, 0xd9, 0x34, 0x17, 0xef, 0x22, 0xf8, 0xa0, 0xa2, 0x35, 0x57, 0xb, 0x54, 0x6d, 0x5a, 0xb1, 0x8f, 0xbd, 0xb3, 0x40, 0x34, 0xc2, 0x2d}}
	return a, nil
}

var _graphqlsMetadataAllservicesGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($duration: Duration!) {
    result: getAllServices(duration: $duration) {
        id name
    }
}
`)

func graphqlsMetadataAllservicesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataAllservicesGraphql, nil
}

func graphqlsMetadataAllservicesGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataAllservicesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/AllServices.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa1, 0xe0, 0xdf, 0xca, 0xb7, 0xa1, 0xbb, 0x88, 0x28, 0x9b, 0x49, 0x2a, 0x19, 0x51, 0xfc, 0xec, 0xab, 0x17, 0x36, 0xb6, 0x33, 0x17, 0x87, 0xd1, 0xd1, 0x98, 0xd, 0x5, 0xc5, 0x82, 0x82, 0xed}}
	return a, nil
}

var _graphqlsMetadataInstancesGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.


query ($serviceId: ID!, $duration: Duration!) {
    result: getServiceInstances(duration: $duration, serviceId: $serviceId) {
        id
        name
        language
        instanceUUID
        attributes {
            name
            value
        }
    }
}
`)

func graphqlsMetadataInstancesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataInstancesGraphql, nil
}

func graphqlsMetadataInstancesGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataInstancesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/Instances.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x98, 0xdb, 0x11, 0xad, 0x8f, 0x96, 0x8c, 0xf0, 0xf, 0x63, 0x2e, 0x35, 0x83, 0xe5, 0xb9, 0x81, 0xe8, 0x79, 0x98, 0x5d, 0xb, 0xec, 0xc7, 0xdf, 0x67, 0x7b, 0x6e, 0x3f, 0xe3, 0x4, 0x80, 0x9e}}
	return a, nil
}

var _graphqlsMetadataSearchendpointsGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($keyword: String!, $serviceId: ID!, $limit: Int!) {
    result: searchEndpoint(keyword: $keyword, serviceId: $serviceId, limit: $limit) {
        id name
    }
}
`)

func graphqlsMetadataSearchendpointsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataSearchendpointsGraphql, nil
}

func graphqlsMetadataSearchendpointsGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataSearchendpointsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/SearchEndpoints.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdb, 0x8b, 0xad, 0xa0, 0x77, 0x43, 0x29, 0x8e, 0x6a, 0x7d, 0x1a, 0x68, 0x73, 0x66, 0x26, 0xe2, 0x66, 0xe3, 0xe3, 0xde, 0xca, 0xb5, 0x7, 0x8e, 0xf8, 0xd2, 0x62, 0x9a, 0x91, 0x3a, 0xab, 0xc9}}
	return a, nil
}

var _graphqlsMetadataSearchserviceGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query searchService($serviceCode: String!) {
    result: searchService(serviceCode: $serviceCode) {
        id name
    }
}
`)

func graphqlsMetadataSearchserviceGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataSearchserviceGraphql, nil
}

func graphqlsMetadataSearchserviceGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataSearchserviceGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/SearchService.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x2b, 0x8e, 0x55, 0x40, 0xf3, 0x8e, 0x89, 0x6f, 0x60, 0xff, 0x64, 0x51, 0xe5, 0xe5, 0x63, 0xc4, 0xe2, 0x78, 0x91, 0x39, 0xb6, 0x59, 0x3f, 0x31, 0xb5, 0xe4, 0x47, 0xbc, 0xa6, 0xd6, 0xd2}}
	return a, nil
}

var _graphqlsMetadataServertimeinfoGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query {
    result: getTimeInfo {
        timezone, currentTimestamp
    }
}
`)

func graphqlsMetadataServertimeinfoGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataServertimeinfoGraphql, nil
}

func graphqlsMetadataServertimeinfoGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataServertimeinfoGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/ServerTimeInfo.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0xa2, 0xfb, 0x31, 0x64, 0x77, 0xd0, 0x20, 0xc1, 0x6b, 0xac, 0x8e, 0x2e, 0x8b, 0xf7, 0x89, 0x4b, 0x7b, 0xe8, 0xbb, 0x7e, 0x90, 0x76, 0x35, 0xc8, 0xb1, 0x5e, 0xad, 0x9a, 0xd2, 0x2c, 0x1c}}
	return a, nil
}

var _graphqlsMetricsHeatmapGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readHeatMap(condition: $condition, duration: $duration) {
        values {
            id
            values
        }
        buckets {
            min
            max
        }
    }
}
`)

func graphqlsMetricsHeatmapGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsHeatmapGraphql, nil
}

func graphqlsMetricsHeatmapGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsHeatmapGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/HeatMap.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4f, 0x41, 0x5d, 0xdd, 0xfa, 0x49, 0x96, 0x85, 0xc8, 0x61, 0x79, 0x12, 0xcb, 0xa3, 0x4d, 0x45, 0x66, 0x7f, 0x9f, 0x2c, 0x4c, 0xbd, 0xb3, 0xf3, 0xe8, 0x58, 0x3, 0xec, 0x1f, 0x4e, 0x5b, 0xde}}
	return a, nil
}

var _graphqlsMetricsLabeledmetricsvaluesGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition: MetricsCondition!, $labels: [String!]!, $duration: Duration!) {
    result: readLabeledMetricsValues(condition: $condition, labels: $labels, duration: $duration) {
        label
        values {
            values {
                value
            }
        }
    }
}
`)

func graphqlsMetricsLabeledmetricsvaluesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsLabeledmetricsvaluesGraphql, nil
}

func graphqlsMetricsLabeledmetricsvaluesGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsLabeledmetricsvaluesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/LabeledMetricsValues.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xca, 0xe6, 0xdb, 0x5e, 0x7d, 0x34, 0x8c, 0x8c, 0x33, 0x2d, 0xe9, 0xe3, 0x40, 0xd8, 0x5c, 0xfc, 0xe, 0x76, 0x53, 0x31, 0xac, 0x4e, 0xb4, 0x60, 0x93, 0x4b, 0xca, 0x8a, 0x1a, 0xa7, 0xc1}}
	return a, nil
}

var _graphqlsMetricsListmetricsGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($regex: String!) {
    result: listMetrics(regex: $regex) {
        name
        type
        catalog
    }
}
`)

func graphqlsMetricsListmetricsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsListmetricsGraphql, nil
}

func graphqlsMetricsListmetricsGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsListmetricsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/ListMetrics.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0x1c, 0x96, 0x32, 0x29, 0x80, 0x57, 0x43, 0x83, 0xc2, 0xd3, 0xd8, 0x48, 0xaf, 0x14, 0x43, 0xd, 0xc6, 0x67, 0x3a, 0x83, 0x66, 0xf, 0xaa, 0x6b, 0xd5, 0xff, 0x85, 0x1, 0x2f, 0x49, 0xdf}}
	return a, nil
}

var _graphqlsMetricsMetricsvalueGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readMetricsValue(condition: $condition, duration: $duration)
}
`)

func graphqlsMetricsMetricsvalueGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsMetricsvalueGraphql, nil
}

func graphqlsMetricsMetricsvalueGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsMetricsvalueGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/MetricsValue.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5, 0xe, 0xee, 0xbc, 0xfa, 0xbe, 0x4, 0x85, 0xb9, 0x48, 0x6a, 0xda, 0x12, 0x14, 0x77, 0xe4, 0x6d, 0x34, 0x83, 0x79, 0x28, 0x30, 0x7e, 0xf, 0xe3, 0xa5, 0xe5, 0xd8, 0x11, 0x51, 0xa2, 0xfe}}
	return a, nil
}

var _graphqlsMetricsMetricsvaluesGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readMetricsValues(condition: $condition, duration: $duration) {
        label
        values {
            values {
                value
            }
        }
    }
}
`)

func graphqlsMetricsMetricsvaluesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsMetricsvaluesGraphql, nil
}

func graphqlsMetricsMetricsvaluesGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsMetricsvaluesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/MetricsValues.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xc9, 0x71, 0xb6, 0xab, 0x2, 0x23, 0x2f, 0x1b, 0x73, 0xe1, 0xd1, 0x6d, 0xa1, 0x5e, 0xb4, 0xb1, 0xc4, 0x6e, 0xdb, 0x22, 0x7b, 0x68, 0x49, 0x76, 0x1b, 0x8, 0x64, 0xae, 0x15, 0x70, 0xbd}}
	return a, nil
}

var _graphqlsMetricsSortmetricsGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition:TopNCondition!, $duration: Duration!) {
    result: sortMetrics(condition: $condition, duration: $duration) {
        name
        value
    }
}
`)

func graphqlsMetricsSortmetricsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsSortmetricsGraphql, nil
}

func graphqlsMetricsSortmetricsGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsSortmetricsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/SortMetrics.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0xfc, 0xe0, 0x9, 0x92, 0xe3, 0xe5, 0x24, 0x29, 0x7c, 0x4c, 0x8e, 0xe6, 0x2d, 0x54, 0xb0, 0x34, 0xcd, 0x2a, 0x82, 0xd, 0x4e, 0xa9, 0xed, 0x51, 0x64, 0x77, 0x52, 0xbf, 0x48, 0x6f, 0x7a}}
	return a, nil
}

var _graphqlsTraceTraceGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($traceId: ID!) {
    result: queryTrace(traceId: $traceId) {
        spans {
            traceId
            segmentId
            spanId
            parentSpanId
            refs {
                traceId
                parentSegmentId
                parentSpanId
                type
            }
            serviceCode
            startTime
            endTime
            endpointName
            type
            peer
            component
            isError
            layer
            tags {
                key value
            }
            logs {
                time data {
                    key value
                }
            }
        }
    }
}
`)

func graphqlsTraceTraceGraphqlBytes() ([]byte, error) {
	return _graphqlsTraceTraceGraphql, nil
}

func graphqlsTraceTraceGraphql() (*asset, error) {
	bytes, err := graphqlsTraceTraceGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/trace/Trace.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5d, 0xa7, 0x57, 0xf1, 0xcb, 0xf5, 0x59, 0x98, 0xbf, 0xf5, 0x46, 0x37, 0x84, 0xe2, 0x2f, 0x60, 0xea, 0x4, 0x2b, 0x4d, 0xf2, 0xb5, 0x4e, 0x98, 0x26, 0xdd, 0xfc, 0xc7, 0x9b, 0xdc, 0xc9, 0x7e}}
	return a, nil
}

var _graphqlsTraceTracesGraphql = []byte(`# Licensed to Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Apache Software Foundation (ASF) licenses this file to you 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.

query ($condition: TraceQueryCondition!){
    result: queryBasicTraces(condition: $condition){
        total
        traces {
            segmentId
            endpointNames
            duration
            start
            isError
            traceIds
        }
    }
}`)

func graphqlsTraceTracesGraphqlBytes() ([]byte, error) {
	return _graphqlsTraceTracesGraphql, nil
}

func graphqlsTraceTracesGraphql() (*asset, error) {
	bytes, err := graphqlsTraceTracesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/trace/Traces.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x30, 0xfb, 0x68, 0x9b, 0x61, 0x82, 0x37, 0x55, 0x87, 0x27, 0xcf, 0xd4, 0x39, 0x2b, 0x73, 0xf, 0x11, 0x8, 0x1c, 0x5, 0x78, 0x43, 0xb3, 0x49, 0x88, 0xc1, 0x65, 0x12, 0xf, 0xff, 0x4f, 0x66}}
	return a, nil
}

var _templatesDashboardGlobalYml = []byte(((((`# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# The command ` + ("`" + `dashboard global`)) + (("`" + ` supports displaying three kinds of data:
# `) + ("`" + `global metrics`))) + (("`" + (`, ` + "`")) + ((`global response latency` + "`") + (`, ` + "`")))) + (((`Global heat map` + ("`" + `.
# If you don't want to display an item, you can just delete or comment its whole configuration below.
# Generally, there is no need to modify properties unless there is a explanatory comment.

# Set the style for the dashboard.
style:
  # Xterm colors number, an integer from 0 to 255.
  # Refer to https://jonasjacek.github.io/colors/ to change to other colors.
  buttonColor: 220
  titleColor: 9
  gaugeColor: 13

# The global metrics, there are four kinds of metrics displaying by default.
# Each metric will occupy one column to display.
# Similarly, you can delete or comment corresponding whole configuration to change the metrics to be displayed.
metrics:
  - condition:
      name: "service_cpm"
      normal: true
      scope: "Service"
      # You can modify `)) + (("`" + `topN`) + ("`" + ` to change the amount of results to be displayed, the same below.
      topN: 10
      # You can modify `))) + ((("`" + `order`) + ("`" + ` to `)) + (("`" + `ASC`) + ("`" + ` to display the results in ascending order, the same below.
      order: "DES"
    title: " Service Load (calls/min) "

  - condition:
      name: "service_resp_time"
      normal: true
      scope: "Service"
      topN: 10
      order: "DES"
    title: "    Slow Services (ms)    "

  - condition:
      name: "service_apdex"
      normal: true
      scope: "Service"
      topN: 10
      order: "ASC"
    title: "Un-Health Services (Apdex)"
    # The returned apdex data is integer, like '3115',
    # need to be converted into a number between 0 and 1.
    aggregation: "/"
    aggregationNum: 10000

  - condition:
      name: "endpoint_avg"
      normal: true
      scope: "Endpoint"
      topN: 10
      order: "DES"
    title: "    Slow Endpoints (ms)   "

# Global response latency.
responseLatency:
  condition:
    name: "all_percentile"
    entity:
      scope: "All"
      normal: true
  labels: "P50, P75, P90, P95, P99"
  labelsIndex: "0, 1, 2, 3, 4"
  title: "Global Response Latency"
  unit: "percentile in ms"

# Global heat map.
heatMap:
  condition:
    name: "all_heatmap"
    entity:
      scope: "All"
      normal: true
  title: "Global Heatmap"
  unit: "ms"`))))))

func templatesDashboardGlobalYmlBytes() ([]byte, error) {
	return _templatesDashboardGlobalYml, nil
}

func templatesDashboardGlobalYml() (*asset, error) {
	bytes, err := templatesDashboardGlobalYmlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "templates/dashboard/global.yml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe, 0x46, 0xab, 0x48, 0xaa, 0x2, 0x58, 0xb6, 0x2b, 0x28, 0x5c, 0xee, 0x7e, 0x5d, 0x77, 0xfb, 0xce, 0x6d, 0x6b, 0x6d, 0xa9, 0xde, 0xed, 0xed, 0x60, 0x9a, 0xfe, 0x47, 0xca, 0xea, 0x33, 0x9f}}
	return a, nil
}

// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
		}
		return a.bytes, nil
	}
	return nil, fmt.Errorf("Asset %s not found", name)
}

// AssetString returns the asset contents as a string (instead of a []byte).
func AssetString(name string) (string, error) {
	data, err := Asset(name)
	return string(data), err
}

// MustAsset is like Asset but panics when Asset would return an error.
// It simplifies safe initialization of global variables.
func MustAsset(name string) []byte {
	a, err := Asset(name)
	if err != nil {
		panic("asset: Asset(" + name + "): " + err.Error())
	}

	return a
}

// MustAssetString is like AssetString but panics when Asset would return an
// error. It simplifies safe initialization of global variables.
func MustAssetString(name string) string {
	return string(MustAsset(name))
}

// AssetInfo loads and returns the asset info for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
		}
		return a.info, nil
	}
	return nil, fmt.Errorf("AssetInfo %s not found", name)
}

// AssetDigest returns the digest of the file with the given name. It returns an
// error if the asset could not be found or the digest could not be loaded.
func AssetDigest(name string) ([sha256.Size]byte, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err)
		}
		return a.digest, nil
	}
	return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name)
}

// Digests returns a map of all known files and their checksums.
func Digests() (map[string][sha256.Size]byte, error) {
	mp := make(map[string][sha256.Size]byte, len(_bindata))
	for name := range _bindata {
		a, err := _bindata[name]()
		if err != nil {
			return nil, err
		}
		mp[name] = a.digest
	}
	return mp, nil
}

// AssetNames returns the names of the assets.
func AssetNames() []string {
	names := make([]string, 0, len(_bindata))
	for name := range _bindata {
		names = append(names, name)
	}
	return names
}

// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
	"cr/oap.yaml": crOapYaml,
	"cr/ui.yaml":  crUiYaml,
	"graphqls/healthcheck/healthcheck.graphql":      graphqlsHealthcheckHealthcheckGraphql,
	"graphqls/metadata/AllServices.graphql":         graphqlsMetadataAllservicesGraphql,
	"graphqls/metadata/Instances.graphql":           graphqlsMetadataInstancesGraphql,
	"graphqls/metadata/SearchEndpoints.graphql":     graphqlsMetadataSearchendpointsGraphql,
	"graphqls/metadata/SearchService.graphql":       graphqlsMetadataSearchserviceGraphql,
	"graphqls/metadata/ServerTimeInfo.graphql":      graphqlsMetadataServertimeinfoGraphql,
	"graphqls/metrics/HeatMap.graphql":              graphqlsMetricsHeatmapGraphql,
	"graphqls/metrics/LabeledMetricsValues.graphql": graphqlsMetricsLabeledmetricsvaluesGraphql,
	"graphqls/metrics/ListMetrics.graphql":          graphqlsMetricsListmetricsGraphql,
	"graphqls/metrics/MetricsValue.graphql":         graphqlsMetricsMetricsvalueGraphql,
	"graphqls/metrics/MetricsValues.graphql":        graphqlsMetricsMetricsvaluesGraphql,
	"graphqls/metrics/SortMetrics.graphql":          graphqlsMetricsSortmetricsGraphql,
	"graphqls/trace/Trace.graphql":                  graphqlsTraceTraceGraphql,
	"graphqls/trace/Traces.graphql":                 graphqlsTraceTracesGraphql,
	"templates/dashboard/global.yml":                templatesDashboardGlobalYml,
}

// AssetDebug is true if the assets were built with the debug flag enabled.
const AssetDebug = false

// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
//     data/
//       foo.txt
//       img/
//         a.png
//         b.png
// then AssetDir("data") would return []string{"foo.txt", "img"},
// AssetDir("data/img") would return []string{"a.png", "b.png"},
// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
// AssetDir("") will return []string{"data"}.
func AssetDir(name string) ([]string, error) {
	node := _bintree
	if len(name) != 0 {
		canonicalName := strings.Replace(name, "\\", "/", -1)
		pathList := strings.Split(canonicalName, "/")
		for _, p := range pathList {
			node = node.Children[p]
			if node == nil {
				return nil, fmt.Errorf("Asset %s not found", name)
			}
		}
	}
	if node.Func != nil {
		return nil, fmt.Errorf("Asset %s not found", name)
	}
	rv := make([]string, 0, len(node.Children))
	for childName := range node.Children {
		rv = append(rv, childName)
	}
	return rv, nil
}

type bintree struct {
	Func     func() (*asset, error)
	Children map[string]*bintree
}

var _bintree = &bintree{nil, map[string]*bintree{
	"cr": &bintree{nil, map[string]*bintree{
		"oap.yaml": &bintree{crOapYaml, map[string]*bintree{}},
		"ui.yaml":  &bintree{crUiYaml, map[string]*bintree{}},
	}},
	"graphqls": &bintree{nil, map[string]*bintree{
		"healthcheck": &bintree{nil, map[string]*bintree{
			"healthcheck.graphql": &bintree{graphqlsHealthcheckHealthcheckGraphql, map[string]*bintree{}},
		}},
		"metadata": &bintree{nil, map[string]*bintree{
			"AllServices.graphql":     &bintree{graphqlsMetadataAllservicesGraphql, map[string]*bintree{}},
			"Instances.graphql":       &bintree{graphqlsMetadataInstancesGraphql, map[string]*bintree{}},
			"SearchEndpoints.graphql": &bintree{graphqlsMetadataSearchendpointsGraphql, map[string]*bintree{}},
			"SearchService.graphql":   &bintree{graphqlsMetadataSearchserviceGraphql, map[string]*bintree{}},
			"ServerTimeInfo.graphql":  &bintree{graphqlsMetadataServertimeinfoGraphql, map[string]*bintree{}},
		}},
		"metrics": &bintree{nil, map[string]*bintree{
			"HeatMap.graphql":              &bintree{graphqlsMetricsHeatmapGraphql, map[string]*bintree{}},
			"LabeledMetricsValues.graphql": &bintree{graphqlsMetricsLabeledmetricsvaluesGraphql, map[string]*bintree{}},
			"ListMetrics.graphql":          &bintree{graphqlsMetricsListmetricsGraphql, map[string]*bintree{}},
			"MetricsValue.graphql":         &bintree{graphqlsMetricsMetricsvalueGraphql, map[string]*bintree{}},
			"MetricsValues.graphql":        &bintree{graphqlsMetricsMetricsvaluesGraphql, map[string]*bintree{}},
			"SortMetrics.graphql":          &bintree{graphqlsMetricsSortmetricsGraphql, map[string]*bintree{}},
		}},
		"trace": &bintree{nil, map[string]*bintree{
			"Trace.graphql":  &bintree{graphqlsTraceTraceGraphql, map[string]*bintree{}},
			"Traces.graphql": &bintree{graphqlsTraceTracesGraphql, map[string]*bintree{}},
		}},
	}},
	"templates": &bintree{nil, map[string]*bintree{
		"dashboard": &bintree{nil, map[string]*bintree{
			"global.yml": &bintree{templatesDashboardGlobalYml, map[string]*bintree{}},
		}},
	}},
}}

// RestoreAsset restores an asset under the given directory.
func RestoreAsset(dir, name string) error {
	data, err := Asset(name)
	if err != nil {
		return err
	}
	info, err := AssetInfo(name)
	if err != nil {
		return err
	}
	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
	if err != nil {
		return err
	}
	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
	if err != nil {
		return err
	}
	return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}

// RestoreAssets restores an asset under the given directory recursively.
func RestoreAssets(dir, name string) error {
	children, err := AssetDir(name)
	// File
	if err != nil {
		return RestoreAsset(dir, name)
	}
	// Dir
	for _, child := range children {
		err = RestoreAssets(dir, filepath.Join(name, child))
		if err != nil {
			return err
		}
	}
	return nil
}

func _filePath(dir, name string) string {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
}
