diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml new file mode 100644 index 0000000..a4d66c6 --- /dev/null +++ b/.github/workflows/helm-release.yml @@ -0,0 +1,41 @@ +name: Release Charts + +on: + push: + branches: + - main + +jobs: + release: + # depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions + # see: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure Git + run: | + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install Helm + uses: azure/setup-helm@v3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Run chart-releaser + uses: helm/chart-releaser-action@v1.5.0 + with: + charts_dir: buildEnv/helm + env: + CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..532cc5c --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,29 @@ +name: scorecard + +on: + push: + branches: + # Run on pushes to default branch + - main + schedule: + # Run weekly on Saturdays + - cron: "30 1 * * 6" + # Run when branch protection rules change + branch_protection_rule: + # Run the workflow manually + workflow_dispatch: + +# Declare default permissions as read-only +permissions: read-all + +jobs: + run-scorecard: + # Call reusable workflow file + uses: cisco-ospo/.github/.github/workflows/_scorecard.yml@main + permissions: + id-token: write + security-events: write + secrets: inherit + with: + # Publish results of Scorecard analysis + publish-results: true diff --git a/.gitignore b/.gitignore index 35f64dd..459a599 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,37 @@ buildEnv/notes buildEnv/helm/values.yaml buildEnv/helm/values-cez.yaml +testWorkloads/otelcol +testWorkloads/playground +buildEnv/helm/values-se-lab.yaml +buildEnv/helm/values-test.yaml +buildEnv/helm/values-ceer1.yaml +buildEnv/helm/values-ceer.yaml + +testWorkloads/dotnet/MyFirstApp/obj +testWorkloads/dotnet/MyFirstApp/bin +testWorkloads/fso-finance +testWorkloads/local +testWorkloads/java/upstream/upstream-0.0.1-SNAPSHOT.jar.bck +testWorkloads/java/downstream/downstream-0.0.1-SNAPSHOT.jar.bck +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build/opentelemetry-webserver-sdk-x64-linux.tgz +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build/agent +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build/opentelemetry-cpp-contrib +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/conf/opentelemetry_module.conf.template +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/nginx_out.conf +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/nginx.conf +buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Dockerfile-local-build +testWorkloads/nginxIngress/ +buildEnv/.vscode +buildEnv/helm/testValues + +buildEnv/helm/testValues1 + +apis/ +local/ +local-contid/ +v2/ +testWorkloads/nodejs/testserver/node_modules +testWorkloads/customErrorPlugin/ +testWorkloads/customErrorPlugin.zip +testWorkloads/dotnet.zip diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..047e5e1 --- /dev/null +++ b/NOTICE @@ -0,0 +1,16 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + diff --git a/README.md b/README.md index 65b30bf..23a0093 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,96 @@ # AppDynamics K8S Webhook Instrumentor -This project provides K8S webhook, which, by pre-set rules, auto-instruments Pods at their creation time with AppDynamics agent. +This project provides K8S mutating webhook, which, by pre-set rules, auto-instruments pods at their creation time with AppDynamics or OpenTelemetry agents. -## Supported Technologies +## Why? + +### Why different autoinstrumentation for AppDynamics? + +AppDynamics offers autoinstrumentation functionality via Cluster Agent and it's configuration. Cluster Agent uses a strategy of +modifying Deployments, DeploymentConfigs (on OpenShift), and StatefulSets when those match pre-set criteria, when pod specifications are modified so, that agent for supported languages is automatically injected into application container. +Kubernetes control plane then creates appropriate number of already instrumented pods. + +While this approach offers a few benefits, among all ability to reverse instrumentation changes in inprobable case of issues introduced by an agent, there are also a few drawbacks, especially when using modern popular CD tooling such as Argo CD. In some cases, Cluster Agent is unable to detect changes in deployment specification made by those tools, which results in application not being instrumented, in other cases, like when using Argo CD, Cluster Agent and CD deployment tool end up in endless cycle of back and forth modifications of deployment specification, resulting in undesired number of application restarts and inconsistent monitoring. + +This project brings a method of agent injection directly to pod specification upon their instantiation wia mutating webhook, avoiding most of the corner cases mentioned above (the only significant being for example Argo CD deploying Pod directly and not via ReplicaSet specification or Deployment/StatefulSet etc.). + +### Other use cases made possible + +With OpenTelemetry support in AppDynamics SaaS, it can be assumed users will want the same level of ease of agent installation as in case of traditional AppDynamics agents. While there is an official OpenTelemetry autoistrumentation functionality available at https://github.com/open-telemetry/opentelemetry-operator for official OpenTelemetry agents, AppDynamics offers also hybrid agent functionality in AppDynamics agents where agents emit both native and OpenTelemetry telemetry data. + +This project supports both AppDynamics hybrid agents and OpenTelemetry agents in several ways including ability to create OpenTelemetry collectors with speciified custom configuration. + +## Supported Agents + +| Language | AppDynamics Native | AppDynamics Hybrid | OpenTelemetry | +| ----------- | ------------------ | ----------------------- | ----------------------- | +| Java | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| .NET (Core) | :white_check_mark: | :thinking: | :building_construction: | +| Node.js | :white_check_mark: | :building_construction: | :white_check_mark: | +| Apache | :thinking: | :x: | :microscope: | +| Nginx | :x: | :x: | :microscope: | +| Go | :x: | :x: | :thinking: | + +|Icon |Support level | +|------------------------|------------------------| +|:white_check_mark: | Supported | +|:x: | No plans at this time. | +|:microscope: | Experimental | +|:thinking: | Under consideration / in planning | +|:building_construction: | Under construction. | -- Java -- .NET Core (in progress) -- Node.js (in progress) -- Apache (in progress) ## How to install? -Preferably, use the helm chart +Using Helm: + +1) Add Helm chart repository + +``` +helm repo add mwh https://cisco-open.github.io/appdynamics-k8s-webhook-instrumentor/ +``` + +2) Update Helm repository cache + ``` -helm install --namespace= . +helm repo update ``` -or use +3) Deploy chart with values + ``` -./deploy.sh +helm install --namespace= mwh/webhook-instrumentor --values= ``` -and change it per your needs + +to upgrade after values change: +- on OpenShift, you can use `helm upgrade` +- on Kubernetes, use `helm delete ` `helm install ...` commands for the time being ## How to configure? If using helm, modify values.yaml for helm chart parameters -If using the script, deploy config map with configuration per example +See `values-sample.yaml` for inspiration and this [Blog Post]() to get started. + +More examples and documentation is coming soon. + +## DB Agent support + +DB Agent can be provisioned with the instrumentor, too. Add following section to your values file, note there can be multiple DB agents provisioned: + +``` +dbAgents: + # db agent name MUST be DNS friendly - only lowercase, numbers and "-" + md-db-agent-k8s: + image: + image: docker.io/appdynamics/db-agent:latest + imagePullPolicy: Always +``` + +DB Agent will automatically register to the AppDynamics controller specified for instrumentation in the values file. + + + diff --git a/buildEnv/.vscode/configurationCache.log b/buildEnv/.vscode/configurationCache.log new file mode 100644 index 0000000..bab9054 --- /dev/null +++ b/buildEnv/.vscode/configurationCache.log @@ -0,0 +1 @@ +{"buildTargets":[],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}} \ No newline at end of file diff --git a/buildEnv/Dockerfile b/buildEnv/Dockerfile index c6e7be8..964f0d7 100644 --- a/buildEnv/Dockerfile +++ b/buildEnv/Dockerfile @@ -1,11 +1,11 @@ ############################ # STEP 1 build executable binary ############################ -FROM golang:alpine AS builder +FROM golang:1.19.3-alpine3.16 AS builder # Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache git -WORKDIR $GOPATH/src/gargoyle/webhook/ +WORKDIR $GOPATH/src/webhook/ COPY webhook . # Fetch dependencies. # Using go get. @@ -16,7 +16,7 @@ RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/webhook ############################ # STEP 3 build a small image ############################ -FROM alpine:latest +FROM alpine:3.16 # Copy our static executable. COPY --from=builder /go/bin/webhook /go/bin/webhook diff --git a/buildEnv/build.sh b/buildEnv/build.sh index 0956035..a92ea8f 100755 --- a/buildEnv/build.sh +++ b/buildEnv/build.sh @@ -2,7 +2,7 @@ cd .. -docker build -f buildEnv/Dockerfile . -t chrlic/appd-webhook-instrumentor:v1.0.2 +docker build -f buildEnv/Dockerfile . -t chrlic/appd-webhook-instrumentor:v1.0.6 -docker push chrlic/appd-webhook-instrumentor:v1.0.2 +docker push chrlic/appd-webhook-instrumentor:v1.0.6 diff --git a/buildEnv/cm-test.yaml b/buildEnv/cm-test.yaml deleted file mode 100644 index d9b79f2..0000000 --- a/buildEnv/cm-test.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: webhook-instrumentor-config -data: - controller: | - host: ceer.saas.appdynamics.com - port: "443" - isSecure: true - accountName: ceer - accessKey: "3gnmajormowm" - instrumentation: | - - name: test1 - matchRules: - namespaceRegex: .* - labels: - - label1: veslo - - language: java - annotations: - - annot1: .* - podNameRegex: .* - injectionRules: - technology: java - image: appdynamics/java-agent:latest - javaEnvVar: _JAVA_OPTIONS - - name: test2 - matchRules: - namespaceRegex: .* - labels: - - label1: veslo - - language: java - podNameRegex: .* - injectionRules: - template: Java_Default - technology: java - image: appdynamics/java-agent:latest - javaEnvVar: _JAVA_OPTIONS - injectionTemplates: | - - name: Java_Default - injectionRules: - technology: java - image: appdynamics/java-agent:latest - javaEnvVar: JAVA_TOOL_OPTIONS - applicationNameSource: label - applicationNameLabel: app - tierNameSource: auto diff --git a/buildEnv/deploy.sh b/buildEnv/deploy.sh deleted file mode 100755 index 3b9989f..0000000 --- a/buildEnv/deploy.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2019 StackRox 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. - -# deploy.sh -# -# Sets up the environment for the admission controller webhook demo in the active cluster. - -set -euo pipefail - -basedir="$(dirname "$0")/deployment" -keydir="$(mktemp -d)" - -# Generate keys into a temporary directory. -echo "Generating TLS keys ..." -"${basedir}/generate-keys.sh" "$keydir" - -# Create the `webhook-demo` namespace. This cannot be part of the YAML file as we first need to create the TLS secret, -# which would fail otherwise. -echo "Creating Kubernetes objects ..." -kubectl create namespace webhook - -# Create the TLS secret for the generated keys. -kubectl -n webhook create secret tls webhook-server-tls \ - --cert "${keydir}/webhook-server-tls.crt" \ - --key "${keydir}/webhook-server-tls.key" - -sleep 1 -# Read the PEM-encoded CA certificate, base64 encode it, and replace the `${CA_PEM_B64}` placeholder in the YAML -# template with it. Then, create the Kubernetes resources. -ca_pem_b64="$(openssl base64 -A <"${keydir}/ca.crt")" -sed -e 's@${CA_PEM_B64}@'"$ca_pem_b64"'@g' <"${basedir}/deployment.yaml.template" \ - | kubectl create -f - - -# Delete the key directory to prevent abuse (DO NOT USE THESE KEYS ANYWHERE ELSE). -rm -rf "$keydir" - -echo "The webhook server has been deployed and configured!" diff --git a/buildEnv/deployment/deployment.yaml.template b/buildEnv/deployment/deployment.yaml.template deleted file mode 100644 index fb8ddc1..0000000 --- a/buildEnv/deployment/deployment.yaml.template +++ /dev/null @@ -1,140 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: webhook-instrumentor - namespace: webhook - ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: webhook-instrumentor - namespace: webhook -rules: - - apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - "*" - ---- - -kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: webhook-instrumentor - namespace: webhook -subjects: - - kind: ServiceAccount - name: webhook-instrumentor -roleRef: - kind: Role - name: webhook-instrumentor - apiGroup: rbac.authorization.k8s.io ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: webhook-instrumentor -rules: - - apiGroups: - - "" - resources: - - namespaces - - configmaps - - secrets - verbs: - - get - - watch - - list - ---- - -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: webhook-instrumentor -subjects: - - kind: ServiceAccount - name: webhook-instrumentor - namespace: webhook -roleRef: - kind: ClusterRole - name: webhook-instrumentor - apiGroup: rbac.authorization.k8s.io - ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: webhook-server - namespace: webhook - labels: - app: webhook-server -spec: - replicas: 1 - selector: - matchLabels: - app: webhook-server - template: - metadata: - labels: - app: webhook-server - spec: - serviceAccountName: webhook-instrumentor - securityContext: - runAsNonRoot: true - runAsUser: 1234 - containers: - - name: server - image: chrlic/webhook-test:latest - imagePullPolicy: Always - ports: - - containerPort: 8443 - name: webhook-api - volumeMounts: - - name: webhook-tls-certs - mountPath: /run/secrets/tls - readOnly: true - volumes: - - name: webhook-tls-certs - secret: - secretName: webhook-server-tls ---- -apiVersion: v1 -kind: Service -metadata: - name: webhook-server - namespace: webhook -spec: - selector: - app: webhook-server - ports: - - port: 443 - targetPort: webhook-api ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: demo-webhook -webhooks: - - name: webhook-server.webhook.svc - sideEffects: None - admissionReviewVersions: ["v1", "v1beta1"] - clientConfig: - service: - name: webhook-server - namespace: webhook - path: "/mutate" - caBundle: ${CA_PEM_B64} - rules: - - operations: [ "CREATE" ] - apiGroups: [""] - apiVersions: ["v1"] - resources: ["pods"] diff --git a/buildEnv/deployment/generate-keys.sh b/buildEnv/deployment/generate-keys.sh deleted file mode 100755 index 92d27f2..0000000 --- a/buildEnv/deployment/generate-keys.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2019 StackRox 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. - -# generate-keys.sh -# -# Generate a (self-signed) CA certificate and a certificate and private key to be used by the webhook demo server. -# The certificate will be issued for the Common Name (CN) of `webhook-server.webhook-demo.svc`, which is the -# cluster-internal DNS name for the service. -# -# NOTE: THIS SCRIPT EXISTS FOR DEMO PURPOSES ONLY. DO NOT USE IT FOR YOUR PRODUCTION WORKLOADS. - -: ${1?'missing key directory'} - -key_dir="$1" - -chmod 0700 "$key_dir" -cd "$key_dir" - -cat >server.conf <. + name: appdynamicsinstrumentations.ext.appd.com +spec: + # group name to use for REST API: /apis// + group: ext.appd.com + # list of versions supported by this CustomResourceDefinition + versions: + - name: v1 + # Each version can be enabled/disabled by Served flag. + served: true + # One and only one version must be marked as the storage version. + storage: true + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + properties: + exclude: + type: array + items: + type: object + properties: + api: + type: string + kind: + type: string + name: + type: string + nameRegex: + type: string + include: + type: array + items: + type: object + properties: + api: + type: string + kind: + type: string + name: + type: string + nameRegex: + type: string + # either Namespaced or Cluster + scope: Namespaced + names: + # plural name to be used in the URL: /apis/// + plural: appdynamicsinstrumentations + # singular name to be used as an alias on the CLI and for display + singular: appdynamicsinstrumentation + # kind is normally the CamelCased singular type. Your resource manifests use this. + kind: AppDynamicsInstrumentation + # shortNames allow shorter string to match your resource on the CLI + shortNames: + - adi + - adis + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ .Values.serviceaccount }}-crd + namespace: {{ .Release.Namespace }} +rules: + - apiGroups: + - "ext.appd.com" + resources: + - "*" + verbs: + - "*" + + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.serviceaccount }}-crd + namespace: {{ .Release.Namespace }} +subjects: + - kind: ServiceAccount + name: {{ .Values.serviceaccount }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ .Values.serviceaccount }}-crd + apiGroup: rbac.authorization.k8s.io +{{ end }} \ No newline at end of file diff --git a/buildEnv/helm/templates/d-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/d-webhook-instrumentor.yaml similarity index 70% rename from buildEnv/helm/templates/d-webhook-instrumentor.yaml rename to buildEnv/helm/webhook-instrumentor/templates/d-webhook-instrumentor.yaml index 2abd13a..37d7e44 100644 --- a/buildEnv/helm/templates/d-webhook-instrumentor.yaml +++ b/buildEnv/helm/webhook-instrumentor/templates/d-webhook-instrumentor.yaml @@ -18,6 +18,16 @@ spec: serviceAccountName: {{ .Values.serviceaccount }} containers: - name: {{ .Values.deploymentName }} + command: + - /go/bin/webhook + {{ if .Values.otelTracing }} + - --otel-tracing=true + - --otel-service-name={{ .Values.otelTracing.serviceName }} + - --otel-service-namespace={{ .Release.Namespace }} + - --otel-endpoint={{ .Values.otelTracing.endpoint }} + - --otel-samples-per-million={{ .Values.otelTracing.samplesPerMillion }} + - --otel-log-layload={{ .Values.otelTracing.logPayload }} + {{ end }} image: {{ .Values.image.image }} imagePullPolicy: {{ .Values.image.pullPolicy }} ports: diff --git a/buildEnv/helm/webhook-instrumentor/templates/db-agent/d-db-agent.yaml b/buildEnv/helm/webhook-instrumentor/templates/db-agent/d-db-agent.yaml new file mode 100644 index 0000000..4526e69 --- /dev/null +++ b/buildEnv/helm/webhook-instrumentor/templates/db-agent/d-db-agent.yaml @@ -0,0 +1,47 @@ +{{ range $key, $val := .Values.dbAgents }} +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: db-agent-{{ $key }} + namespace: {{ $.Release.Namespace }} + labels: + app: db-agent-{{ $key }} +spec: + replicas: 1 + selector: + matchLabels: + app: db-agent-{{ $key }} + template: + metadata: + labels: + app: db-agent-{{ $key }} + spec: + serviceAccountName: {{ $.Values.serviceaccount }} + containers: + - name: db-agent-{{ $key }} + image: {{ $val.image.image }} + imagePullPolicy: {{ $val.image.imagePullPolicy }} + env: + - name: APPDYNAMICS_CONTROLLER_HOST_NAME + value: {{ $.Values.appdController.host }} + - name: APPDYNAMICS_CONTROLLER_PORT + value: "{{ $.Values.appdController.port }}" + - name: APPDYNAMICS_CONTROLLER_SSL_ENABLED + value: "{{ $.Values.appdController.isSecure }}" + - name: APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY + value: {{ $.Values.appdController.accessKey }} + - name: APPDYNAMICS_AGENT_ACCOUNT_NAME + value: {{ $.Values.appdController.accountName }} + - name: _JAVA_OPTIONS + value: -Ddbagent.name={{ $key }} + resources: + limits: + cpu: "1" + memory: 1Gi + requests: + cpu: 100m + memory: 200Mi + +{{ end }} \ No newline at end of file diff --git a/buildEnv/helm/webhook-instrumentor/templates/otel/cm-otel-collector-config.yaml b/buildEnv/helm/webhook-instrumentor/templates/otel/cm-otel-collector-config.yaml new file mode 100644 index 0000000..84273d8 --- /dev/null +++ b/buildEnv/helm/webhook-instrumentor/templates/otel/cm-otel-collector-config.yaml @@ -0,0 +1,22 @@ +{{ if .Values.openTelemetryCollectors }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: otel-collector-config + namespace: {{ $.Release.Namespace }} +data: +{{ range $key, $val := .Values.openTelemetryCollectors }} + {{ $key }}.mode: {{ $val.mode }} + {{ if eq $val.mode "external" }} + {{ $key }}.serviceName: {{ $val.collectorEndpoint }} + {{ else }} + {{ $key }}.config: {{ (tpl (toYaml $val.config) (dict "Values" $.Values "Template" $.Template)) | indent 2 }} + {{ $key }}.image.image: {{ $val.image.image }} + {{ $key }}.image.imagePullPolicy: {{ $val.image.imagePullPolicy }} + {{ $key }}.image.initImage: {{ $val.image.initImage }} + {{ $key }}.serviceName: otel-coll-{{ $key }}.{{ $.Release.Namespace}}.svc.cluster.local + {{ end }} + +{{ end }} +{{ end }} \ No newline at end of file diff --git a/buildEnv/helm/webhook-instrumentor/templates/otel/svc-d-otel-collector-service.yaml b/buildEnv/helm/webhook-instrumentor/templates/otel/svc-d-otel-collector-service.yaml new file mode 100644 index 0000000..7cbfd2f --- /dev/null +++ b/buildEnv/helm/webhook-instrumentor/templates/otel/svc-d-otel-collector-service.yaml @@ -0,0 +1,70 @@ +{{ range $key, $val := .Values.openTelemetryCollectors }} +{{ if eq $val.mode "deployment" }} +--- +apiVersion: v1 +kind: Service +metadata: + name: otel-coll-{{ $key }} + namespace: {{ $.Release.Namespace }} +spec: + selector: + app: otel-coll-{{ $key }} + ports: + - port: 4317 + targetPort: otlp-grpc + name: otlp-grpc + - port: 4318 + targetPort: otlp-http + name: otlp-http + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: otel-coll-{{ $key }} + namespace: {{ $.Release.Namespace }} + labels: + app: otel-coll-{{ $key }} +spec: + replicas: {{ $val.replicas }} + selector: + matchLabels: + app: otel-coll-{{ $key }} + template: + metadata: + labels: + app: otel-coll-{{ $key }} + spec: + serviceAccountName: {{ $.Values.serviceaccount }} + containers: + - name: otel-coll-{{ $key }} + image: {{ $val.image.image }} + imagePullPolicy: {{ $val.image.imagePullPolicy }} + args: + - --config + - /conf/otel-collector-config.yaml + ports: + - containerPort: 4317 + name: otlp-grpc + - containerPort: 4318 + name: otlp-http + resources: + limits: + cpu: "1" + memory: 1Gi + requests: + cpu: 250m + memory: 200Mi + volumeMounts: + - name: otel-collector-config-vol + mountPath: /conf + volumes: + - configMap: + name: otel-collector-config + items: + - key: {{ $key }}.config + path: otel-collector-config.yaml + name: otel-collector-config-vol + +{{ end }} +{{ end }} \ No newline at end of file diff --git a/buildEnv/helm/templates/r-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/r-webhook-instrumentor.yaml similarity index 100% rename from buildEnv/helm/templates/r-webhook-instrumentor.yaml rename to buildEnv/helm/webhook-instrumentor/templates/r-webhook-instrumentor.yaml diff --git a/buildEnv/helm/templates/rb-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/rb-webhook-instrumentor.yaml similarity index 100% rename from buildEnv/helm/templates/rb-webhook-instrumentor.yaml rename to buildEnv/helm/webhook-instrumentor/templates/rb-webhook-instrumentor.yaml diff --git a/buildEnv/helm/templates/sa-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/sa-webhook-instrumentor.yaml similarity index 100% rename from buildEnv/helm/templates/sa-webhook-instrumentor.yaml rename to buildEnv/helm/webhook-instrumentor/templates/sa-webhook-instrumentor.yaml diff --git a/buildEnv/helm/templates/sec-and-mwhc-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/sec-and-mwhc-webhook-instrumentor.yaml similarity index 80% rename from buildEnv/helm/templates/sec-and-mwhc-webhook-instrumentor.yaml rename to buildEnv/helm/webhook-instrumentor/templates/sec-and-mwhc-webhook-instrumentor.yaml index 1ac22e4..9ad1a26 100644 --- a/buildEnv/helm/templates/sec-and-mwhc-webhook-instrumentor.yaml +++ b/buildEnv/helm/webhook-instrumentor/templates/sec-and-mwhc-webhook-instrumentor.yaml @@ -1,10 +1,10 @@ {{- $ca := genCA "webhook-change-group-webhook-ca" (.Values.certValidityDays | int) -}} {{- $altNames := list ( printf "%s.%s" (include "webhook-instrumentor.name" .) .Release.Namespace ) ( printf "%s.%s.svc" (include "webhook-instrumentor.name" .) .Release.Namespace ) -}} -{{- $cert := genSignedCert ( include "webhook-instrumentor.name" . ) nil $altNames 365 $ca -}} +{{- $cert := genSignedCert ( include "webhook-instrumentor.name" . ) nil $altNames (.Values.certValidityDays | int) $ca -}} --- -{{ if not ( and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") )}} +{{- if not ( and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") )}} apiVersion: v1 kind: Secret type: kubernetes.io/tls @@ -17,28 +17,28 @@ metadata: heritage: {{ .Release.Service }} release: {{ .Release.Name }} annotations: - "helm.sh/hook": "pre-install" - "helm.sh/hook-delete-policy": "before-hook-creation" + # "helm.sh/hook": "pre-install" + # "helm.sh/hook-delete-policy": "before-hook-creation" data: - {{ if not (hasKey .Values "certs") }} + {{- if not (hasKey .Values "certs") }} tls.crt: {{ $cert.Cert | b64enc | quote }} tls.key: {{ $cert.Key | b64enc | quote }} ca.crt: {{ $ca.Cert | b64enc | quote }} - {{ else }} + {{- else }} tls.crt: {{ .Values.certs.tlsCert | quote }} tls.key: {{ .Values.certs.tlsKey | quote }} ca.crt: {{ .Values.certs.caCert | quote }} - {{ end }} -{{ end }} + {{- end }} +{{- end }} --- apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: - {{ if and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") }} - anotations: + {{- if and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") }} + annotations: service.beta.openshift.io/inject-cabundle: 'true' - {{ end }} + {{- end }} name: {{ .Values.webhookName }} webhooks: - name: {{ ( printf "%s.%s.svc" (include "webhook-instrumentor.name" .) .Release.Namespace ) }} @@ -51,6 +51,7 @@ webhooks: name: {{ ( include "webhook-instrumentor.name" . ) }} namespace: {{ .Release.Namespace }} path: "/mutate" + port: 7443 {{ if not ( and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") )}} {{ if not (hasKey .Values "certs") }} caBundle: {{ $ca.Cert | b64enc | quote }} @@ -58,21 +59,21 @@ webhooks: caBundle: {{ .Values.certs.caCert | quote }} {{ end }} {{ end }} - {{ if .Values.enabledForPodsWithLabels }} + {{- if .Values.enabledForPodsWithLabels }} objectSelector: matchExpressions: {{ range $idx, $value := .Values.enabledForPodsWithLabels }} - key: {{ $value }} operator: Exists {{ end }} - {{ end }} + {{- end }} namespaceSelector: matchExpressions: - {{- if .Values.namespacesEnabled -}} + {{- if .Values.namespacesEnabled }} - key: kubernetes.io/metadata.name operator: In values: [{{ range $index, $element := .Values.namespacesEnabled }}{{if $index}},{{end}}"{{$element}}"{{end}}] - {{ end }} + {{- end }} - key: kubernetes.io/metadata.name operator: NotIn values: [ {{ .Release.Namespace | quote }}{{ if .Values.namespacesDisabled }},{{ range $index, $element := .Values.namespacesDisabled }}{{if $index}},{{end}}"{{$element}}"{{end}}{{end}}] diff --git a/buildEnv/helm/webhook-instrumentor/templates/svc-webhook-instrumentor.yaml b/buildEnv/helm/webhook-instrumentor/templates/svc-webhook-instrumentor.yaml new file mode 100644 index 0000000..4d2e557 --- /dev/null +++ b/buildEnv/helm/webhook-instrumentor/templates/svc-webhook-instrumentor.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ ( include "webhook-instrumentor.name" . ) }} + namespace: {{ .Release.Namespace }} + {{- if and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") }} + annotations: + service.beta.openshift.io/serving-cert-secret-name: {{ template "webhook-instrumentor.name" . }}-certs + {{- end }} +spec: + selector: + app: {{ .Values.deploymentName }} + ports: + - port: 7443 + targetPort: webhook-api + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ ( include "webhook-instrumentor.name" . ) }}-ext + namespace: {{ .Release.Namespace }} + {{- if and ( .Values.useServiceCAonOCP ) ( .Capabilities.APIVersions.Has "apps.openshift.io/v1/DeploymentConfig") }} + annotations: + service.beta.openshift.io/serving-cert-secret-name: {{ template "webhook-instrumentor.name" . }}-certs + {{- end }} +spec: + selector: + app: {{ .Values.deploymentName }} + ports: + - port: 7443 + targetPort: webhook-api + type: LoadBalancer \ No newline at end of file diff --git a/buildEnv/helm/webhook-instrumentor/values-sample-otel.yaml b/buildEnv/helm/webhook-instrumentor/values-sample-otel.yaml new file mode 100644 index 0000000..b0b2d72 --- /dev/null +++ b/buildEnv/helm/webhook-instrumentor/values-sample-otel.yaml @@ -0,0 +1,283 @@ + +serviceaccount: webhook-instrumentor +deploymentName: webhook-server +webhookName: webhook-appd +# namespacesEnabled is optional list of namespaces, where webhook would be applied. +# If missing, all namespaces will be enabled, except kubernetes system namespaces +# namespacesEnabled: +# - ns1 +# - ns2 +# +# namespacesDisabled is optional list of namespaces, where webhook would not be applied. +# If missing, all namespaces will be enabled, except kubernetes system namespaces +# (and namespace where the webook itself is running) +# namespacesDisabled: +# - ns3 +# +# enabledForPodsWithLabels is optional safety belt to try to instrument only pods +# having set labels to a specific values +# enabledForPodsWithLabels: +# - appdInstr +# +# number of replicas for webhook server +replicas: 1 +certValidityDays: 1024 +# failure policy can be Fail or Ignore. +# Ignore is safer - should the webhook fail or be unresponsive for timeoutSeconds, pod gets created unchanged +timeoutSeconds: 2 +failurePolicy: Ignore + +# optional - certs information. If missing, certs will be generated dynamically, but that does +# not work with helm upgrade (except on OpenShift with service CA usage) +# certs: +# tlsCert: +# tlsKey: +# caCert: + +# optional - useServiceCAonOCP: true - if set, on OpenShift, Service CA certificates will be used +useServiceCAonOCP: true + +# service type and port for webhook server +service: + type: ClusterIP + port: 443 + +# image for pods running the webhook functionality +image: + image: docker.io/chrlic/appd-webhook-instrumentor:v1.0.3-exp + pullPolicy: Always + +# optional AppDynamics controller access information - required if +# AppDynamics native/hybrid agents are used +appdController: + host: .saas.appdynamics.com + port: "443" + isSecure: true + accountName: + accessKey: "" + # useProxy: true + # proxyHost: proxy.corm.com + # proxyPort: "8080" + otelEndpoint: https://fra-sls-agent-api.saas.appdynamics.com + otelHeaderKey: "" + +# appdCloud: +# clientID: +# clientSecret: +# appdTokenUrl: +# appdVanityUrl: + +# optional OpenTelemetry parameters +# covers OTel Collector settings for AppDynamics cSaaS, AppDynamics Cloud, and Cisco Telescope +openTelemetryCollectors: + # collector name MUST be DNS friendly - only lowercase, numbers and "-" + deployment-hybrid-agent-default: + # mode - one of "sidecar", "deployment", "external" + mode: deployment + # replicas is only considered for OTel collector running as a deployment, otherwise ignored + replicas: 1 + image: + image: docker.io/otel/opentelemetry-collector-contrib:0.48.0 + imagePullPolicy: Always + initImage: docker.io/alpine:latest + config: > + receivers: + otlp: + protocols: + grpc: + http: + processors: + batch: + resource: + attributes: + - key: appdynamics.controller.account + action: upsert + value: "{{ .Values.appdController.accountName }}" + - key: appdynamics.controller.host + action: upsert + value: "{{ .Values.appdController.host }}" + - key: appdynamics.controller.port + action: upsert + value: {{ .Values.appdController.port }} + exporters: + logging: + loglevel: debug + # This part says that the opentelemetry collector will send data to OTIS pipeline for AppDynamicas CSaaS. + otlphttp: + tls: + insecure: true + endpoint: "{{ .Values.appdController.otelEndpoint }}" + headers: {"x-api-key": "{{ .Values.appdController.otelHeaderKey }}"} + service: + pipelines: + traces: + receivers: [otlp] + processors: [batch, resource] + exporters: [logging, otlphttp, otlphttp/telescope] + telemetry: + logs: + level: "debug" + sidecar-hybrid-agent-default: + # mode - one of "sidecar", "deployment", "external" + mode: sidecar + # replicas is only considered for OTel collector running as a deployment, otherwise ignored + replicas: 1 + image: + image: docker.io/otel/opentelemetry-collector-contrib:0.48.0 + imagePullPolicy: Always + initImage: docker.io/alpine:latest + config: > + receivers: + otlp: + protocols: + grpc: + http: + processors: + batch: + resource: + attributes: + - key: appdynamics.controller.account + action: upsert + value: "{{ .Values.appdController.accountName }}" + - key: appdynamics.controller.host + action: upsert + value: "{{ .Values.appdController.host }}" + - key: appdynamics.controller.port + action: upsert + value: {{ .Values.appdController.port }} + exporters: + logging: + loglevel: debug + # This part says that the opentelemetry collector will send data to OTIS pipeline for AppDynamicas CSaaS. + otlphttp: + tls: + insecure: true + endpoint: "{{ .Values.appdController.otelEndpoint }}" + headers: {"x-api-key": "{{ .Values.appdController.otelHeaderKey }}"} + service: + pipelines: + traces: + receivers: [otlp] + processors: [batch, resource] + exporters: [logging, otlphttp] + telemetry: + logs: + level: "debug" + external-hybrid-agent-default: + mode: external + collectorEndpoint: otel-collector.default.svc.cluster.local + +instrumentationTemplates: + - name: Java_Default + injectionRules: + # technology = java | dotnetcore | nodejs + technology: java + image: appdynamics/java-agent:latest + javaEnvVar: JAVA_TOOL_OPTIONS + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + - name: Dotnet_Default + injectionRules: + technology: dotnetcore + image: appdynamics/dotnet-core-agent:22.5.1 + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + - name: Nodejs_Default + injectionRules: + technology: nodejs + image: appdynamics/nodejs-agent:22.5.0-16-stretch-slim + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + - name: Java_Otel + injectionRules: + # technology = java | dotnetcore | nodejs + # provider = appd | otel | telescope - appd is default if missing + technology: java/otel + image: chrlic/opentelemetry-java-agent:latest + imagePullPolicy: Always + javaEnvVar: JAVA_TOOL_OPTIONS + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + - name: Java_Telescope + injectionRules: + # technology = java | dotnetcore | nodejs + # provider = appd | otel | telescope - appd is default if missing + technology: java/telescope + image: chrlic/telescope-java-agent:latest + imagePullPolicy: Always + javaEnvVar: JAVA_TOOL_OPTIONS + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + - name: Nodejs_Otel + injectionRules: + technology: nodejs/otel + image: chrlic/opentelemetry-nodejs-agent:latest + imagePullPolicy: Always + applicationNameSource: label + applicationNameLabel: appdApp + tierNameSource: auto + +instrumentationRules: + - name: test1 + matchRules: + namespaceRegex: .* + labels: + - language: java + annotations: + - annot1: .* + podNameRegex: .* + injectionRules: + template: Java_Default + technology: java + image: appdynamics/java-agent:latest + javaEnvVar: _JAVA_OPTIONS + - name: otel-test + matchRules: + namespaceRegex: .* + labels: + - otel: native + - language: java + annotations: + - annot1: .* + podNameRegex: .* + injectionRules: + technology: java + image: appdynamics/java-agent:latest + javaEnvVar: _JAVA_OPTIONS + - name: java-otel-test + matchRules: + namespaceRegex: .* + labels: + - appdInstr: do + - language: java + podNameRegex: .* + injectionRules: + template: Java_Otel + javaEnvVar: _JAVA_OPTIONS + # optional otelNativeAgent: true -> assume native otel image use, no AppD native feed + openTelemetryCollector: deployment-hybrid-agent-default + - name: dotnet1 + matchRules: + namespaceRegex: .* + labels: + - appdInstr: do + - language: dotnetcore + podNameRegex: .* + injectionRules: + template: Dotnet_Default + - name: nodejs1 + matchRules: + namespaceRegex: .* + labels: + - appdInstr: do + - language: nodejs + podNameRegex: .* + injectionRules: + template: Nodejs_Otel + openTelemetryCollector: deployment-hybrid-agent-default + diff --git a/buildEnv/helm/values-sample.yaml b/buildEnv/helm/webhook-instrumentor/values-sample.yaml similarity index 52% rename from buildEnv/helm/values-sample.yaml rename to buildEnv/helm/webhook-instrumentor/values-sample.yaml index 6b5e13d..2d10cd4 100644 --- a/buildEnv/helm/values-sample.yaml +++ b/buildEnv/helm/webhook-instrumentor/values-sample.yaml @@ -17,7 +17,7 @@ webhookName: webhook-appd # enabledForPodsWithLabels is optional safety belt to try to instrument only pods # having set labels to a specific values # enabledForPodsWithLabels: -# appdInstr: do +# - appdInstr # # number of replicas for webhook server replicas: 1 @@ -27,7 +27,8 @@ certValidityDays: 1024 timeoutSeconds: 2 failurePolicy: Ignore -# optional - certs information. If missing, certs will be generated dynamically +# optional - certs information. If missing, certs will be generated dynamically, but that does +# not work with helm upgrade (except on OpenShift with service CA usage) # certs: # tlsCert: # tlsKey: @@ -43,7 +44,7 @@ service: # image for pods running the webhook functionality image: - image: docker.io/chrlic/appd-webhook-instrumentor:v1.0.2 + image: docker.io/chrlic/appd-webhook-instrumentor:v1.0.3-exp pullPolicy: Always # optional AppDynamics controller access information - required if @@ -57,43 +58,120 @@ appdController: # useProxy: true # proxyHost: proxy.corm.com # proxyPort: "8080" + otelEndpoint: https://pdx-sls-agent-api.saas.appdynamics.com + otelHeaderKey: "xxx" + +appdCloud: + +telescope: # optional OpenTelemetry parameters # covers OTel Collector settings for AppDynamics cSaaS, AppDynamics Cloud, and Cisco Telescope openTelemetryCollectors: - - name: cSaaS_Collector - # optional - injectAsSidecar: true -> each pod will have an OTel collector as a sidecar - injectAsSidecar: false - # replicas is only considered for OTel collector running as a service, otherwise ignored + # collector name must be DNS friendly - only lowercase, numbers and "-" + deployment-hybrid-agent-default: + # mode - one of "sidecar", "deployment", "external" + mode: deployment + # replicas is only considered for OTel collector running as a deployment, otherwise ignored replicas: 1 - # one of csaas, cloud, telescope - backendType: csaas - endpoint: https://pdx-sls-agent-api.saas.appdynamics.com - apiKey: xxxxxxxxxxxxx - # optional additional resource attributes - following for example sets language to Go - resourceAttributes: - - key: telemetry.sdk.language - action: upsert - value: go - - name: Cloud_Collector - # optional - injectAsSidecar: true -> each pod will have an OTel collector as a sidecar - injectAsSidecar: false + image: + image: docker.io/otel/opentelemetry-collector-contrib:0.53.0 + imagePullPolicy: Always + initImage: docker.io/alpine:latest + config: + receivers: + otlp: + protocols: + grpc: + http: + processors: + batch: + resource: + attributes: + - key: appdynamics.controller.account + action: upsert + value: "{{ .Values.appdController.accountName }}" + - key: appdynamics.controller.host + action: upsert + value: "{{ .Values.appdController.host }}" + - key: appdynamics.controller.port + action: upsert + value: "{{ .Values.appdController.port }}" + exporters: + logging: + loglevel: debug + jaeger: + endpoint: "jaeger.default.svc.cluster.local:14250" + tls: + insecure: true + # This part says that the opentelemetry collector will send data to OTIS pipeline for AppDynamicas CSaaS. + otlphttp: + tls: + insecure: true + endpoint: "{{ .Values.appdController.otelEndpoint }}" + headers: {"x-api-key": "{{ .Values.appdController.otelHeaderKey }}"} + service: + pipelines: + traces: + receivers: [otlp] + processors: [batch, resource] + exporters: [logging, otlphttp, jaeger] + telemetry: + logs: + level: "debug" + sidecar-hybrid-agent-default: + # mode - one of "sidecar", "deployment", "external" + mode: sidecar + # replicas is only considered for OTel collector running as a deployment, otherwise ignored replicas: 1 - backendType: cloud - endpoint: xxxxxxxxxxxxx - # protocol = http or grpc - protocol: http - clientId: xxxxxxxxxxxxx - clientSecret: xxxxxxxxxxxxx - tokenUrl: xxxxxxxxxxxxx - timeout: 1m - - name: Telescope_Collector - # optional - injectAsSidecar: true -> each pod will have an OTel collector as a sidecar - injectAsSidecar: false - replicas: 1 - backentType: telescope - endpoint: https://production.cisco-udp.com/trace-collector - bearerToken: xxxxxxxxxxxxx + image: + image: docker.io/otel/opentelemetry-collector-contrib:0.53.0 + imagePullPolicy: Always + initImage: docker.io/alpine:latest + config: + receivers: + otlp: + protocols: + grpc: + http: + processors: + batch: + resource: + attributes: + - key: appdynamics.controller.account + action: upsert + value: "{{ .Values.appdController.accountName }}" + - key: appdynamics.controller.host + action: upsert + value: "{{ .Values.appdController.host }}" + - key: appdynamics.controller.port + action: upsert + value: "{{ .Values.appdController.port }}" + exporters: + logging: + loglevel: debug + jaeger: + endpoint: "jaeger.default.svc.cluster.local:14250" + tls: + insecure: true + # This part says that the opentelemetry collector will send data to OTIS pipeline for AppDynamicas CSaaS. + otlphttp: + tls: + insecure: true + endpoint: "{{ .Values.appdController.otelEndpoint }}" + headers: {"x-api-key": "{{ .Values.appdController.otelHeaderKey }}"} + service: + pipelines: + traces: + receivers: [otlp] + processors: [batch, resource] + exporters: [logging, otlphttp, jaeger] + telemetry: + logs: + level: "debug" + external-hybrid-agent-default: + mode: external + collectorEndpoint: otel-collector.default.svc.cluster.local instrumentationTemplates: - name: Java_Default @@ -106,7 +184,7 @@ instrumentationTemplates: applicationNameLabel: appdApp tierNameSource: auto # optional otelNativeAgent: true -> assume native otel image use, no AppD native feed - otelNativeAgent: false + openTelemetryCollectors: deploymentHybridagentDefault - name: Dotnet_Default injectionRules: technology: dotnetcore @@ -151,7 +229,7 @@ instrumentationRules: technology: java image: appdynamics/java-agent:latest javaEnvVar: _JAVA_OPTIONS - # technology java + openTelemetryCollector -> use AppD hybrid agent + # optional - technology java + openTelemetryCollector -> use AppD hybrid agent with OTel openTelemetryCollector: cSaaS_Collector - name: test2 matchRules: diff --git a/buildEnv/instrumentationImages/Makefile b/buildEnv/instrumentationImages/Makefile new file mode 100644 index 0000000..b8c26ae --- /dev/null +++ b/buildEnv/instrumentationImages/Makefile @@ -0,0 +1,17 @@ +all: otel-java-image otel-dotnet-image otel-nodejs-image telescope-java-image telescope-nodejs-image + +otel-java-image: + $(MAKE) -C otelSDK/javaAgentImage images + +otel-dotnet-image: + $(MAKE) -C otelSDK/dotnetAgentImage images + +otel-nodejs-image: + $(MAKE) -C otelSDK/nodejsAgentImage images + +telescope-java-image: + $(MAKE) -C telescopeSDK/javaAgentImage images + +telescope-nodejs-image: + $(MAKE) -C telescopeSDK/nodejsAgentImage images + diff --git a/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Dockerfile b/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Dockerfile new file mode 100644 index 0000000..1c18b4b --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Dockerfile @@ -0,0 +1,11 @@ +FROM alpine:latest + +RUN mkdir /opt/opentelemetry +WORKDIR /opt/opentelemetry + +RUN wget https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/download/v0.2.0-beta.1/opentelemetry-dotnet-instrumentation-linux-glibc.zip && \ + unzip opentelemetry-dotnet-instrumentation-linux-glibc.zip && \ + wget https://www.nuget.org/api/v2/package/System.Diagnostics.DiagnosticSource/6.0.0 && \ + chmod a+rwx /opt/opentelemetry + +CMD ["cat", "Just delivering the Opentelemetry .NET agent"] \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Makefile b/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Makefile new file mode 100644 index 0000000..2d11682 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/dotnetAgentImage/Makefile @@ -0,0 +1,5 @@ +images: + docker build . -t chrlic/opentelemetry-dotnet-agent:latest + docker push chrlic/opentelemetry-dotnet-agent:latest + +all: images \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Dockerfile b/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Dockerfile new file mode 100644 index 0000000..6226d10 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine:latest + +RUN mkdir /opt/opentelemetry +WORKDIR /opt/opentelemetry + +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar && \ + chmod a+rwx /opt/opentelemetry + +CMD ["cat", "Just delivering the Opentelemetry Java agent"] \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Makefile b/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Makefile new file mode 100644 index 0000000..abbcb3d --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/javaAgentImage/Makefile @@ -0,0 +1,5 @@ +images: + docker build . -t chrlic/opentelemetry-java-agent:latest + docker push chrlic/opentelemetry-java-agent:latest + +all: images \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Dockerfile b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Dockerfile new file mode 100644 index 0000000..3f48595 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Dockerfile @@ -0,0 +1,17 @@ +FROM node:lts-slim + +RUN mkdir /opt/opentelemetry +COPY opt/opentelemetry /opt/opentelemetry +WORKDIR /opt/opentelemetry +RUN npm install \ + @opentelemetry/sdk-node \ + @opentelemetry/api \ + @opentelemetry/auto-instrumentations-node \ + @opentelemetry/exporter-trace-otlp-http \ + @opentelemetry/exporter-trace-otlp-grpc \ + @opentelemetry/semantic-conventions \ + process + +RUN chmod a+rwx /opt/opentelemetry + +CMD ["cat", "Just delivering the Opentelemetry Node.js agent"] \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Makefile b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Makefile new file mode 100644 index 0000000..5ec0eed --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/Makefile @@ -0,0 +1,5 @@ +images: + docker build . -t chrlic/opentelemetry-nodejs-agent:latest + docker push chrlic/opentelemetry-nodejs-agent:latest + +all: images \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/opt/opentelemetry/shim.js b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/opt/opentelemetry/shim.js new file mode 100644 index 0000000..fcb4f3a --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/nodejsAgentImage/opt/opentelemetry/shim.js @@ -0,0 +1,52 @@ +// tracing.js + +'use strict' + +const process = require('process'); +const opentelemetry = require('@opentelemetry/sdk-node'); +const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); +// const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-base'); +const { Resource } = require('@opentelemetry/resources'); +const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); +// const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); +// const { JaegerExporter } = require('@opentelemetry/exporter-jaeger'); +const { diag, DiagConsoleLogger, DiagLogLevel } = require('@opentelemetry/api'); + +// For troubleshooting, set the log level to DiagLogLevel.DEBUG +diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG); + +const otlpExporter = new OTLPTraceExporter({ + url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT +}); +console.log(otlpExporter) + +// configure the SDK to export telemetry data to the console +// enable all auto-instrumentations from the meta package +// const traceExporter = new ConsoleSpanExporter(); +// console.log(traceExporter) +const sdk = new opentelemetry.NodeSDK({ + resource: new Resource({ + [SemanticResourceAttributes.SERVICE_NAME]: process.env.OTEL_SERVICE_NAME, + [SemanticResourceAttributes.SERVICE_NAMESPACE]: process.env.OTEL_SERVICE_NAMESPACE, + }), + traceExporter: otlpExporter, + serviceName: process.env.OTEL_SERVICE_NAME, + instrumentations: [getNodeAutoInstrumentations()], + autoDetectResources: true +}); +console.log(sdk) + +// initialize the SDK and register with the OpenTelemetry API +// this enables the API to record telemetry +sdk.start() + .then(() => console.log('Tracing initialized')) + .catch((error) => console.log('Error initializing tracing', error)); + +// gracefully shut down the SDK on process exit +process.on('SIGTERM', () => { + sdk.shutdown() + .then(() => console.log('Tracing terminated')) + .catch((error) => console.log('Error terminating tracing', error)) + .finally(() => process.exit(0)); +}); \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Dockerfile b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Dockerfile new file mode 100644 index 0000000..127315f --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Dockerfile @@ -0,0 +1,28 @@ +############################ +# STEP 1 build executable binary +############################ +FROM golang:alpine AS builder +# Install git. +# Git is required for fetching the dependencies. +RUN apk update && apk add --no-cache git +WORKDIR $GOPATH/src/helpers/patcher/ +COPY helpers/nginxConfPatcher . +# Fetch dependencies. +# Using go get. +RUN go get -d -v +# Build the binary. +RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/nginxConfPatcher + + +############################ +# STEP 2 build agent image +############################ + +FROM alpine:latest + +COPY ./build/agent/opentelemetry-webserver-sdk /opt/opentelemetry +COPY --from=builder /go/bin/nginxConfPatcher /opt/opentelemetry + +RUN chmod a+w /opt/opentelemetry/logs + +CMD ["cat", "Just delivering the Opentelemetry Apache/Nginx agent"] diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Makefile b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Makefile new file mode 100644 index 0000000..8c1abb0 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/Makefile @@ -0,0 +1,12 @@ +all: build images + +build: + ./build.sh + +images: + docker build . -t chrlic/opentelemetry-webserver-agent:latest + + docker push chrlic/opentelemetry-webserver-agent:latest + + + diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build.sh b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build.sh new file mode 100755 index 0000000..8377971 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/build.sh @@ -0,0 +1,43 @@ +#! /bin/bash + +escapeForSedReplacement() { + local __resultVarName str __result + __resultVarName="$1" + str="$2" + __result=$(echo "$str" | sed 's/[/&]/\\&/g') + eval $__resultVarName=\'$__result\' +} + +image_name="chrlic-apache-otel-build" + +rm -rf opentelemetry-cpp-contrib +git clone https://github.com/open-telemetry/opentelemetry-cpp-contrib +cd opentelemetry-cpp-contrib/instrumentation/otel-webserver-module + +docker build . -f docker/centos7/Dockerfile -t ${image_name} + +# docker run -idt --name chrlic-apache-otel-build chrlic-apache-otel-build /bin/sh -c "sleep 100" & +# sleep 10 + +# docker cp chrlic-apache-otel-build:/otel-webserver-module/build/opentelemetry-webserver-sdk-x64-linux.tgz ../../../build/ + +# docker kill chrlic-apache-otel-build +# docker rm chrlic-apache-otel-build + +source_path="/otel-webserver-module/build/opentelemetry-webserver-sdk-x64-linux.tgz" +destination_path="../../../build/" +container_id=$(docker create "${image_name}") +docker cp "$container_id:$source_path" "$destination_path" +docker rm "$container_id" + +cd ../../../build + +tar -xvf opentelemetry-webserver-sdk-x64-linux.tgz -C agent +cd agent/opentelemetry-webserver-sdk + +agentLogDir="/opt/opentelemetry-webserver/agent/logs" +escapeForSedReplacement agentLogDir "${agentLogDir}" +cat conf/appdynamics_sdk_log4cxx.xml.template | sed "s/__agent_log_dir__/${agentLogDir}/g" > conf/appdynamics_sdk_log4cxx.xml +# ./install.sh + + diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.mod b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.mod new file mode 100644 index 0000000..055dec1 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.mod @@ -0,0 +1,5 @@ +module main + +go 1.18 + +require github.com/aluttik/go-crossplane v0.0.0-20210526174032-f987c53bd056 diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.sum b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.sum new file mode 100644 index 0000000..cd10b43 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/go.sum @@ -0,0 +1,10 @@ +github.com/aluttik/go-crossplane v0.0.0-20210526174032-f987c53bd056 h1:1eoqUwORMfzluOES+cAo0E0oGgaMnuJrCRRKIhTz6Kc= +github.com/aluttik/go-crossplane v0.0.0-20210526174032-f987c53bd056/go.mod h1:JowLMBuvXWv1ONBYxsDeyjSeoxj3YZPYymToxJMitXA= +github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/main.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/main.go new file mode 100644 index 0000000..7a91305 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/main.go @@ -0,0 +1,257 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/aluttik/go-crossplane" +) + +type PatchOps []PatchOp + +type PatchOp struct { + Op string `json:"op"` + Path string `json:"path"` + Value crossplane.Directive `json:"value"` +} + +type DirectiveExt struct { + Directive string `json:"directive"` + Line int `json:"line"` + Args []string `json:"args"` + Includes *[]int `json:"includes,omitempty"` + Block *[]DirectiveExt `json:"block,omitempty"` + Comment *string `json:"comment,omitempty"` + Idx int `json:"idx"` +} + +func fromDirective(d *crossplane.Directive) *DirectiveExt { + + var blockExt *[]DirectiveExt + idx := 0 + if d.IsBlock() { + blockExt = &[]DirectiveExt{} + dirCounts := map[string]int{} + for _, blkDir := range *d.Block { + if _, ok := dirCounts[blkDir.Directive]; !ok { + dirCounts[blkDir.Directive] = 0 + } else { + dirCounts[blkDir.Directive]++ + } + blkDirExt := *fromDirective(&blkDir) + blkDirExt.Idx = dirCounts[blkDir.Directive] + blockSlice := append(*blockExt, blkDirExt) + blockExt = &blockSlice + } + } + out := DirectiveExt{ + Directive: d.Directive, + Line: d.Line, + Args: d.Args, + Includes: d.Includes, + Block: blockExt, + Comment: d.Comment, + Idx: idx, + } + return &out +} + +func (d *DirectiveExt) toDirective() *crossplane.Directive { + var blockExt *[]crossplane.Directive + if d.Block != nil { // IsBlock + blockExt = &[]crossplane.Directive{} + for _, blkDir := range *d.Block { + blockSlice := append(*blockExt, *blkDir.toDirective()) + blockExt = &blockSlice + } + } + out := crossplane.Directive{ + Directive: d.Directive, + Line: d.Line, + Args: d.Args, + Includes: d.Includes, + Block: blockExt, + Comment: d.Comment, + } + return &out +} + +func (d *DirectiveExt) String() string { + s := "" + if d.Block != nil { + s = s + fmt.Sprintf("{ Directive: %s, Args: %v, Idx: %d }\n", d.Directive, d.Args, d.Idx) + for _, b := range *d.Block { + s = s + b.String() + } + } else { + s = fmt.Sprintf("{ Directive: %s, Args: %v, Idx: %d }\n", d.Directive, d.Args, d.Idx) + } + return s +} + +func (d *DirectiveExt) Paths(path string) string { + s := "" + if d.Block != nil { + currPath := path + "/" + fmt.Sprintf("%s/%d", d.Directive, d.Idx) + s = s + fmt.Sprintf("{ Path: %s, Directive: %s, Args: %v, Idx: %d }\n", currPath, d.Directive, d.Args, d.Idx) + for _, b := range *d.Block { + s = s + b.Paths(currPath) + } + } else { + currPath := path + "/" + fmt.Sprintf("%s/%d", d.Directive, d.Idx) + s = fmt.Sprintf("{ Path: %s, Directive: %s, Args: %v, Idx: %d }\n", currPath, d.Directive, d.Args, d.Idx) + } + return s +} + +func main() { + if len(os.Args) < 4 { + fmt.Println("Required 3 args - config-file, path-to-otel-library, path-to-otel-config\n") + os.Exit(2) + } + path := os.Args[1] + loadModule := os.Args[2] + otelConfig := os.Args[3] + + var nginxConf *crossplane.Payload + nginxConf, err := crossplane.Parse(path, &crossplane.ParseOptions{ParseComments: true, SingleFile: true}) + if err != nil { + panic(err) + } + + /* + nginxJsonBytes, err := json.MarshalIndent(nginxConf, "", " ") + if err != nil { + panic(err) + } + + fmt.Println(string(nginxJsonBytes)) + */ + + rootNginxConfig := crossplane.Directive{ + Directive: "@root@", + Block: &nginxConf.Config[0].Parsed, + Line: 0, + Args: []string{}, + } + + patchJsonStr := `[ + { "op": "add", + "path": "/@root@/0/-", + "value": { + "directive": "load_module", + "args": ["%s"] + } + }, + { "op": "add", + "path": "/@root@/0/http/0/-", + "value": { + "directive": "include", + "args": ["%s"] + } + } + ]` + + patchJsonBytes := []byte(fmt.Sprintf(patchJsonStr, loadModule, otelConfig)) + + var patch PatchOps + err = json.Unmarshal(patchJsonBytes, &patch) + if err != nil { + panic(err) + } + + expandedNginxRoot := fromDirective(&rootNginxConfig) + // fmt.Println(expandedNginxRoot.Paths("")) + + patchedExpandedNginxRoot, err := applyPatchOps(expandedNginxRoot, &patch) + if err != nil { + panic(err) + } + + modifiedNginxRoot := patchedExpandedNginxRoot.toDirective() + // deencapsule from root element + nginxConf.Config[0].Parsed = *modifiedNginxRoot.Block + + var buf bytes.Buffer + if err = crossplane.Build(&buf, nginxConf.Config[0], &crossplane.BuildOptions{}); err != nil { + panic(err) + } + + // print config file to stdout + fmt.Println(buf.String()) +} + +func applyPatchOps(config *DirectiveExt, patches *PatchOps) (*DirectiveExt, error) { + newConfig := &DirectiveExt{} + var err error + + // clone original config + jsonClone, _ := json.Marshal(config) + json.Unmarshal(jsonClone, &newConfig) + + for _, patch := range *patches { + currentPath := "" + lineOffset := 0 + newConfig = applyPatch(newConfig, &patch, currentPath, lineOffset) + if err != nil { + return nil, err + } + } + + return newConfig, nil +} + +func applyPatch(dirIn *DirectiveExt, patch *PatchOp, upstreamPath string, lineOffset int) *DirectiveExt { + lineIncr := 0 + dirOut := DirectiveExt{ + Directive: dirIn.Directive, + Line: dirIn.Line, + Comment: dirIn.Comment, + Args: dirIn.Args, + Includes: dirIn.Includes, + } + + if dirIn.Block != nil { + currentPath := fmt.Sprintf("%s/%s/%d", upstreamPath, dirIn.Directive, dirIn.Idx) + if match(currentPath, patch.Path) { + lineIncr := 1 + toBeInserted := &DirectiveExt{ + Directive: patch.Value.Directive, + Args: patch.Value.Args, + } + switch placement(patch.Path) { + case "-": + toBeInserted.Line = dirIn.Line + lineIncr + lineOffset + temp := append([]DirectiveExt{*toBeInserted}, *dirIn.Block...) + dirIn.Block = &temp + case "+": + toBeInserted.Line = (*dirIn.Block)[len(*dirIn.Block)-1].Line + lineIncr + lineOffset + temp := append(*dirIn.Block, *toBeInserted) + dirIn.Block = &temp + } + } + dirOut.Block = &[]DirectiveExt{} + for _, directive := range *dirIn.Block { + patched := applyPatch(&directive, patch, currentPath, lineOffset+lineIncr) + temp := append(*dirOut.Block, *patched) + dirOut.Block = &temp + } + } + // fmt.Printf("%s: %s\n", dirIn.Directive, dirIn.String()) + return &dirOut +} + +func match(currPath, seekedPath string) bool { + seekedPathSegs := strings.Split(seekedPath, "/") + result := currPath == strings.Join(seekedPathSegs[:len(seekedPathSegs)-1], "/") + // fmt.Printf("Matching '%s' <-> '%s' => %t\n", currPath, seekedPath, result) + return result +} + +func placement(seekedPath string) string { + segs := strings.Split(seekedPath, "/") + return segs[len(segs)-1] +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/.gitignore b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/.gitignore new file mode 100644 index 0000000..5180acd --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/.gitignore @@ -0,0 +1,19 @@ +.DS_STORE +.idea/ +.vscode/ + +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +vendor/ diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/LICENSE b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/LICENSE new file mode 100644 index 0000000..4b06d0d --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 Arie van Luttikhuizen + + 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. diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/README.md b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/README.md new file mode 100644 index 0000000..3ac696f --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/README.md @@ -0,0 +1,74 @@ +# go-crossplane +An unofficial Go port of the NGINX config/JSON converter [crossplane](https://github.com/nginxinc/crossplane). + +## Parse +This is an example that takes a path to an NGINX config file, converts it to JSON, and prints the result to stdout. +```go +package main + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/aluttik/go-crossplane" +) + +func main() { + path := os.Args[1] + + payload, err := crossplane.Parse(path, &crossplane.ParseOptions{}) + if err != nil { + panic(err) + } + + b, err := json.Marshal(payload) + if err != nil { + panic(err) + } + + fmt.Println(string(b)) +} +``` + +## Build +This is an example that takes a path to a JSON file, converts it to an NGINX config, and prints the result to stdout. +```go +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/aluttik/go-crossplane" +) + +func main() { + path := os.Args[1] + + file, err := os.Open(path) + if err != nil { + panic(err) + } + + content, err := ioutil.ReadAll(file) + if err != nil { + panic(err) + } + + var payload crossplane.Payload + if err = json.Unmarshal(content, &payload); err != nil { + panic(err) + } + + var buf bytes.Buffer + if err = crossplane.Build(&buf, payload.Config[0], &crossplane.BuildOptions{}); err != nil { + panic(err) + } + + fmt.Println(buf.String()) +} +``` diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/analyze.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/analyze.go new file mode 100644 index 0000000..ce4bae8 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/analyze.go @@ -0,0 +1,2193 @@ +package crossplane + +import "fmt" + +// bit masks for different directive argument styles +const ( + ngxConfNoArgs = 0x00000001 // 0 args + ngxConfTake1 = 0x00000002 // 1 args + ngxConfTake2 = 0x00000004 // 2 args + ngxConfTake3 = 0x00000008 // 3 args + ngxConfTake4 = 0x00000010 // 4 args + ngxConfTake5 = 0x00000020 // 5 args + ngxConfTake6 = 0x00000040 // 6 args + // ngxConfTake7 = 0x00000080 // 7 args (currently unused) + ngxConfBlock = 0x00000100 // followed by block + ngxConfFlag = 0x00000200 // 'on' or 'off' + ngxConfAny = 0x00000400 // >=0 args + ngxConf1More = 0x00000800 // >=1 args + ngxConf2More = 0x00001000 // >=2 args + + // some helpful argument style aliases + ngxConfTake12 = (ngxConfTake1 | ngxConfTake2) + //ngxConfTake13 = (ngxConfTake1 | ngxConfTake3) (currently unused) + ngxConfTake23 = (ngxConfTake2 | ngxConfTake3) + ngxConfTake34 = (ngxConfTake3 | ngxConfTake4) + ngxConfTake123 = (ngxConfTake12 | ngxConfTake3) + ngxConfTake1234 = (ngxConfTake123 | ngxConfTake4) + + // bit masks for different directive locations + ngxDirectConf = 0x00010000 // main file (not used) + ngxMainConf = 0x00040000 // main context + ngxEventConf = 0x00080000 // events + ngxMailMainConf = 0x00100000 // mail + ngxMailSrvConf = 0x00200000 // mail > server + ngxStreamMainConf = 0x00400000 // stream + ngxStreamSrvConf = 0x00800000 // stream > server + ngxStreamUpsConf = 0x01000000 // stream > upstream + ngxHttpMainConf = 0x02000000 // http + ngxHttpSrvConf = 0x04000000 // http > server + ngxHttpLocConf = 0x08000000 // http > location + ngxHttpUpsConf = 0x10000000 // http > upstream + ngxHttpSifConf = 0x20000000 // http > server > if + ngxHttpLifConf = 0x40000000 // http > location > if + ngxHttpLmtConf = 0x80000000 // http > location > limit_except +) + +// helpful directive location alias describing "any" context +// doesn't include ngxHttpSifConf, ngxHttpLifConf, or ngxHttpLmtConf +const ngxAnyConf = (ngxMainConf | ngxEventConf | ngxMailMainConf | ngxMailSrvConf | + ngxStreamMainConf | ngxStreamSrvConf | ngxStreamUpsConf | + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpUpsConf) + +// map for getting bitmasks from certain context tuples +var contexts = map[string]int{ + blockCtx{}.key(): ngxMainConf, + blockCtx{"events"}.key(): ngxEventConf, + blockCtx{"mail"}.key(): ngxMailMainConf, + blockCtx{"mail", "server"}.key(): ngxMailSrvConf, + blockCtx{"stream"}.key(): ngxStreamMainConf, + blockCtx{"stream", "server"}.key(): ngxStreamSrvConf, + blockCtx{"stream", "upstream"}.key(): ngxStreamUpsConf, + blockCtx{"http"}.key(): ngxHttpMainConf, + blockCtx{"http", "server"}.key(): ngxHttpSrvConf, + blockCtx{"http", "location"}.key(): ngxHttpLocConf, + blockCtx{"http", "upstream"}.key(): ngxHttpUpsConf, + blockCtx{"http", "server", "if"}.key(): ngxHttpSifConf, + blockCtx{"http", "location", "if"}.key(): ngxHttpLifConf, + blockCtx{"http", "location", "limit_except"}.key(): ngxHttpLmtConf, +} + +func enterBlockCtx(stmt Directive, ctx blockCtx) blockCtx { + // don't nest because ngxHttpLocConf just means "location block in http" + if len(ctx) > 0 && ctx[0] == "http" && stmt.Directive == "location" { + return blockCtx{"http", "location"} + } + // no other block contexts can be nested like location so just append it + return append(ctx, stmt.Directive) +} + +func analyze(fname string, stmt Directive, term string, ctx blockCtx, options *ParseOptions) error { + masks, knownDirective := directives[stmt.Directive] + currCtx, knownContext := contexts[ctx.key()] + + // if strict and directive isn't recognized then throw error + if options.ErrorOnUnknownDirectives && !knownDirective { + return ParseError{ + what: fmt.Sprintf(`unknown directive "%s"`, stmt.Directive), + file: &fname, + line: &stmt.Line, + } + } + + // if we don't know where this directive is allowed and how + // many arguments it can take then don't bother analyzing it + if !knownContext || !knownDirective { + return nil + } + + // if this directive can't be used in this context then throw an error + var ctxMasks []int + if options.SkipDirectiveContextCheck { + ctxMasks = masks + } else { + for _, mask := range masks { + if (mask & currCtx) != 0 { + ctxMasks = append(ctxMasks, mask) + } + } + if len(ctxMasks) == 0 { + return ParseError{ + what: fmt.Sprintf(`"%s" directive is not allowed here`, stmt.Directive), + file: &fname, + line: &stmt.Line, + } + } + } + + if options.SkipDirectiveArgsCheck { + return nil + } + + // do this in reverse because we only throw errors at the end if no masks + // are valid, and typically the first bit mask is what the parser expects + var what string + for i := 0; i < len(ctxMasks); i++ { + mask := ctxMasks[i] + + // if the directive isn't a block but should be according to the mask + if (mask&ngxConfBlock) != 0 && term != "{" { + what = fmt.Sprintf(`directive "%s" has no opening "{"`, stmt.Directive) + continue + } + + // if the directive is a block but shouldn't be according to the mask + if (mask&ngxConfBlock) == 0 && term != ";" { + what = fmt.Sprintf(`directive "%s" is not terminated by ";"`, stmt.Directive) + continue + } + + // use mask to check the directive's arguments + if ((mask>>len(stmt.Args)&1) != 0 && len(stmt.Args) <= 7) || // NOARGS to TAKE7 + ((mask&ngxConfFlag) != 0 && len(stmt.Args) == 1 && validFlag(stmt.Args[0])) || + ((mask&ngxConfAny) != 0 && len(stmt.Args) >= 0) || + ((mask&ngxConf1More) != 0 && len(stmt.Args) >= 1) || + ((mask&ngxConf2More) != 0 && len(stmt.Args) >= 2) { + return nil + } else if (mask&ngxConfFlag) != 0 && len(stmt.Args) == 1 && !validFlag(stmt.Args[0]) { + what = fmt.Sprintf(`invalid value "%s" in "%s" directive, it must be "on" or "off"`, stmt.Args[0], stmt.Directive) + } else { + what = fmt.Sprintf(`invalid number of arguments in "%s" directive`, stmt.Directive) + } + } + + return ParseError{ + what: what, + file: &fname, + line: &stmt.Line, + } +} + +// This dict maps directives to lists of bit masks that define their behavior. +// +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in +// +// Since some directives can have different behaviors in different contexts, we +// use lists of bit masks, each describing a valid way to use the directive. +// +// Definitions for directives that're available in the open source version of +// nginx were taken directively from the source code. In fact, the variable +// names for the bit masks defined above were taken from the nginx source code. +// +// Definitions for directives that're only available for nginx+ were inferred +// from the documentation at http://nginx.org/en/docs/. +var directives = map[string][]int{ + "absolute_redirect": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "accept_mutex": []int{ + ngxEventConf | ngxConfFlag, + }, + "accept_mutex_delay": []int{ + ngxEventConf | ngxConfTake1, + }, + "access_log": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxHttpLmtConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "add_after_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "add_before_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "add_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake23, + }, + "add_trailer": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake23, + }, + "addition_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "aio": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "aio_write": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "alias": []int{ + ngxHttpLocConf | ngxConfTake1, + }, + "allow": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ancient_browser": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "ancient_browser_value": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "auth_basic": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + }, + "auth_basic_user_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + }, + "auth_http": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_Httpheader": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + }, + "auth_Httppass_client_cert": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "auth_Httptimeout": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_request": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "auth_request_set": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "autoindex": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "autoindex_exact_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "autoindex_format": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "autoindex_localtime": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "break": []int{ + ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfNoArgs, + }, + "charset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "charset_map": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake2, + }, + "charset_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "chunked_transfer_encoding": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "client_body_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "client_body_in_file_only": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "client_body_in_single_buffer": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "client_body_temp_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + }, + "client_body_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "client_header_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "client_header_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "client_max_body_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "connection_pool_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "create_full_put_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "daemon": []int{ + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "dav_access": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "dav_methods": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "debug_connection": []int{ + ngxEventConf | ngxConfTake1, + }, + "debug_points": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "default_type": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "deny": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "directio": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "directio_alignment": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "disable_symlinks": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "empty_gif": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "env": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "error_log": []int{ + ngxMainConf | ngxConf1More, + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "error_page": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConf2More, + }, + "etag": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "events": []int{ + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "expires": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake12, + }, + "fastcgi_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "fastcgi_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "fastcgi_busy_buffers_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_background_update": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_cache_bypass": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_cache_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_cache_lock_age": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_max_range_offset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_methods": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_cache_min_uses": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_path": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "fastcgi_cache_revalidate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_cache_use_stale": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_cache_valid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_catch_stderr": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_force_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_hide_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_ignore_client_abort": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_ignore_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_index": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_intercept_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_keep_conn": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_max_temp_file_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_no_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "fastcgi_param": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake23, + }, + "fastcgi_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "fastcgi_pass_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_pass_request_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_pass_request_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_request_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_send_lowat": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "fastcgi_split_path_info": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_store": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_store_access": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "fastcgi_temp_file_write_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_temp_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + }, + "flv": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "geo": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake12, + ngxStreamMainConf | ngxConfBlock | ngxConfTake12, + }, + "geoip_city": []int{ + ngxHttpMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_country": []int{ + ngxHttpMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_org": []int{ + ngxHttpMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_proxy": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "geoip_proxy_recursive": []int{ + ngxHttpMainConf | ngxConfFlag, + }, + "google_perftools_profiles": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "grpc_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "grpc_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_hide_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ignore_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "grpc_intercept_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "grpc_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "grpc_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "grpc_pass_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_set_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "grpc_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "grpc_ssl_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_certificate_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_ciphers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_crl": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_password_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_protocols": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "grpc_ssl_server_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "grpc_ssl_session_reuse": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "grpc_ssl_trusted_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "grpc_ssl_verify": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "grpc_ssl_verify_depth": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "gunzip": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "gunzip_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "gzip": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "gzip_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "gzip_comp_level": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "gzip_disable": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "gzip_Httpversion": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "gzip_min_length": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "gzip_proxied": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "gzip_static": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "gzip_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "gzip_vary": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "hash": []int{ + ngxHttpUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + "http": []int{ + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "http2_body_preread_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_chunk_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "http2_idle_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_pushes": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_streams": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_max_field_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_max_header_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_max_requests": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "http2_push": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "http2_push_preload": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "http2_recv_buffer_size": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "http2_recv_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "if": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConfBlock | ngxConf1More, + }, + "if_modified_since": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "ignore_invalid_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "image_filter": []int{ + ngxHttpLocConf | ngxConfTake123, + }, + "image_filter_buffer": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "image_filter_interlace": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "image_filter_jpeg_quality": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "image_filter_sharpen": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "image_filter_transparency": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "image_filter_webp_quality": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "imap_auth": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_capabilities": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_client_buffer": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "include": []int{ + ngxAnyConf | ngxConfTake1, + }, + "index": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "internal": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "ip_hash": []int{ + ngxHttpUpsConf | ngxConfNoArgs, + }, + "keepalive": []int{ + ngxHttpUpsConf | ngxConfTake1, + }, + "keepalive_disable": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "keepalive_requests": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxHttpUpsConf | ngxConfTake1, + }, + "keepalive_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + ngxHttpUpsConf | ngxConfTake1, + }, + "large_client_header_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake2, + }, + "least_conn": []int{ + ngxHttpUpsConf | ngxConfNoArgs, + ngxStreamUpsConf | ngxConfNoArgs, + }, + "limit_conn": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "limit_conn_dry_run": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "limit_conn_log_level": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "limit_conn_status": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "limit_conn_zone": []int{ + ngxHttpMainConf | ngxConfTake2, + ngxStreamMainConf | ngxConfTake2, + }, + "limit_except": []int{ + ngxHttpLocConf | ngxConfBlock | ngxConf1More, + }, + "limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "limit_rate_after": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "limit_req": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "limit_req_dry_run": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "limit_req_log_level": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "limit_req_status": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "limit_req_zone": []int{ + ngxHttpMainConf | ngxConfTake34, + }, + "lingering_close": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "lingering_time": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "lingering_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "listen": []int{ + ngxHttpSrvConf | ngxConf1More, + ngxMailSrvConf | ngxConf1More, + ngxStreamSrvConf | ngxConf1More, + }, + "load_module": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "location": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConfBlock | ngxConfTake12, + }, + "lock_file": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "log_format": []int{ + ngxHttpMainConf | ngxConf2More, + ngxStreamMainConf | ngxConf2More, + }, + "log_not_found": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "log_subrequest": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "mail": []int{ + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "map": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "map_hash_bucket_size": []int{ + ngxHttpMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "map_hash_max_size": []int{ + ngxHttpMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "master_process": []int{ + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "max_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "memcached_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_gzip_flag": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "memcached_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "memcached_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "memcached_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "merge_slashes": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "min_delete_depth": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "mirror": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "mirror_request_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "modern_browser": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "modern_browser_value": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "mp4": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "mp4_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "mp4_max_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "msie_padding": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "msie_refresh": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "multi_accept": []int{ + ngxEventConf | ngxConfFlag, + }, + "open_file_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "open_file_cache_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "open_file_cache_min_uses": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "open_file_cache_valid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "open_log_file_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, + }, + "output_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "override_charset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "pcre_jit": []int{ + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "perl": []int{ + ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + }, + "perl_modules": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "perl_require": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "perl_set": []int{ + ngxHttpMainConf | ngxConfTake2, + }, + "pid": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "pop3_auth": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "pop3_capabilities": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "port_in_redirect": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "postpone_output": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "preread_buffer_size": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "preread_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "protocol": []int{ + ngxMailSrvConf | ngxConfTake1, + }, + "proxy_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "proxy_buffer": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "proxy_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "proxy_busy_buffers_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_background_update": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_cache_bypass": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_cache_convert_head": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_cache_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_lock": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_cache_lock_age": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_lock_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_max_range_offset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_methods": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_cache_min_uses": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_cache_path": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "proxy_cache_revalidate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_cache_use_stale": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_cache_valid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_cookie_domain": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "proxy_cookie_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "proxy_download_rate": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_force_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_headers_hash_bucket_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_headers_hash_max_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_hide_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_Httpversion": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_ignore_client_abort": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_ignore_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_intercept_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_max_temp_file_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_method": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_no_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "proxy_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxHttpLmtConf | ngxConfTake1, + ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_pass_error_message": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_pass_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_pass_request_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_pass_request_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_protocol": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_protocol_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_redirect": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "proxy_request_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "proxy_requests": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_responses": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_send_lowat": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_set_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_set_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "proxy_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_certificate_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_ciphers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_crl": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_password_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_protocols": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "proxy_ssl_server_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_session_reuse": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_trusted_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_verify": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_verify_depth": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_store": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_store_access": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "proxy_temp_file_write_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "proxy_temp_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + }, + "proxy_timeout": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_upload_rate": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "random": []int{ + ngxHttpUpsConf | ngxConfNoArgs | ngxConfTake12, + ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, + }, + "random_index": []int{ + ngxHttpLocConf | ngxConfFlag, + }, + "read_ahead": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "real_ip_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "real_ip_recursive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "recursive_error_pages": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "referer_hash_bucket_size": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "referer_hash_max_size": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "request_pool_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "reset_timedout_connection": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "resolver": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "resolver_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "return": []int{ + ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake12, + ngxStreamSrvConf | ngxConfTake1, + }, + "rewrite": []int{ + ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake23, + }, + "rewrite_log": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "root": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "satisfy": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "scgi_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "scgi_busy_buffers_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_background_update": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_cache_bypass": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_cache_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_lock": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_cache_lock_age": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_lock_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_max_range_offset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_methods": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_cache_min_uses": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_cache_path": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "scgi_cache_revalidate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_cache_use_stale": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_cache_valid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_force_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_hide_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_ignore_client_abort": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_ignore_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_intercept_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_max_temp_file_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_no_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "scgi_param": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake23, + }, + "scgi_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "scgi_pass_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_pass_request_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_pass_request_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_request_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "scgi_store": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_store_access": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "scgi_temp_file_write_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "scgi_temp_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + }, + "secure_link": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "secure_link_md5": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "secure_link_secret": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "send_lowat": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "sendfile": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "sendfile_max_chunk": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "server": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfNoArgs, + ngxHttpUpsConf | ngxConf1More, + ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamUpsConf | ngxConf1More, + }, + "server_name": []int{ + ngxHttpSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "server_name_in_redirect": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "server_names_hash_bucket_size": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "server_names_hash_max_size": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "server_tokens": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "set": []int{ + ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake2, + }, + "set_real_ip_from": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "slice": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "smtp_auth": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_capabilities": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_client_buffer": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "smtp_greeting_delay": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "source_charset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "spdy_chunk_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "spdy_headers_comp": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "split_clients": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "ssi": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "ssi_last_modified": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "ssi_min_file_chunk": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "ssi_silent_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "ssi_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "ssi_value_length": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "ssl": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "ssl_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "ssl_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_certificate_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ciphers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_client_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_crl": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_dhparam": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_early_data": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "ssl_ecdh_curve": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_engine": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "ssl_handshake_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_password_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_prefer_server_ciphers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_preread": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_protocols": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_session_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake12, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "ssl_session_ticket_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_session_tickets": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_stapling": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "ssl_stapling_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "ssl_stapling_responder": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + }, + "ssl_stapling_verify": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "ssl_trusted_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_client": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_depth": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "starttls": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "stream": []int{ + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "stub_status": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConfNoArgs | ngxConfTake1, + }, + "sub_filter": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "sub_filter_last_modified": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "sub_filter_once": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "sub_filter_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "subrequest_output_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "tcp_nodelay": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "tcp_nopush": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "thread_pool": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake23, + }, + "timeout": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "timer_resolution": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "try_files": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConf2More, + }, + "types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfBlock | ngxConfNoArgs, + }, + "types_hash_bucket_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "types_hash_max_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "underscores_in_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxConfFlag, + }, + "uninitialized_variable_warn": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpSifConf | ngxHttpLocConf | ngxHttpLifConf | ngxConfFlag, + }, + "upstream": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "use": []int{ + ngxEventConf | ngxConfTake1, + }, + "user": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake12, + }, + "userid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_domain": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_expires": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_mark": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_p3p": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "userid_service": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_bind": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "uwsgi_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "uwsgi_busy_buffers_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_background_update": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_bypass": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_cache_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_cache_lock_age": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_max_range_offset": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_methods": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_cache_min_uses": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_cache_path": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "uwsgi_cache_revalidate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_cache_use_stale": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_cache_valid": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_connect_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_force_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_hide_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ignore_client_abort": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_ignore_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_intercept_errors": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_max_temp_file_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_modifier1": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_modifier2": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_next_upStreamtimeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_next_upStreamtries": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_no_cache": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_param": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake23, + }, + "uwsgi_pass": []int{ + ngxHttpLocConf | ngxHttpLifConf | ngxConfTake1, + }, + "uwsgi_pass_header": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_pass_request_body": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_pass_request_headers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_read_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_request_buffering": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_send_timeout": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_socket_keepalive": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_ssl_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_certificate_key": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_ciphers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_crl": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_password_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_protocols": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "uwsgi_ssl_server_name": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_ssl_session_reuse": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_ssl_trusted_certificate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_ssl_verify": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "uwsgi_ssl_verify_depth": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_store": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_store_access": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake123, + }, + "uwsgi_temp_file_write_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "uwsgi_temp_path": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1234, + }, + "valid_referers": []int{ + ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "variables_hash_bucket_size": []int{ + ngxHttpMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "variables_hash_max_size": []int{ + ngxHttpMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "worker_aio_requests": []int{ + ngxEventConf | ngxConfTake1, + }, + "worker_connections": []int{ + ngxEventConf | ngxConfTake1, + }, + "worker_cpu_affinity": []int{ + ngxMainConf | ngxDirectConf | ngxConf1More, + }, + "worker_priority": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_processes": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_core": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_nofile": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_shutdown_timeout": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "working_directory": []int{ + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "xclient": []int{ + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "xml_entities": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "xslt_last_modified": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "xslt_param": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "xslt_string_param": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "xslt_stylesheet": []int{ + ngxHttpLocConf | ngxConf1More, + }, + "xslt_types": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "zone": []int{ + ngxHttpUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + + // nginx+ directives [definitions inferred from docs] + "api": []int{ + ngxHttpLocConf | ngxConfNoArgs | ngxConfTake1, + }, + "auth_jwt": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "auth_jwt_claim_set": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "auth_jwt_header_set": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "auth_jwt_key_file": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "auth_jwt_key_request": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "auth_jwt_leeway": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "f4f": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "f4f_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "fastcgi_cache_purge": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "health_check": []int{ + ngxHttpLocConf | ngxConfAny, + ngxStreamSrvConf | ngxConfAny, + }, + "health_check_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "hls": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "hls_buffers": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake2, + }, + "hls_forward_args": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "hls_fragment": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "hls_mp4_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "hls_mp4_max_buffer_size": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "js_access": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_content": []int{ + ngxHttpLocConf | ngxHttpLmtConf | ngxConfTake1, + }, + "js_filter": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_include": []int{ + ngxHttpMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "js_path": []int{ + ngxHttpMainConf | ngxConfTake1, + }, + "js_preread": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_set": []int{ + ngxHttpMainConf | ngxConfTake2, + ngxStreamMainConf | ngxConfTake2, + }, + "keyval": []int{ + ngxHttpMainConf | ngxConfTake3, + ngxStreamMainConf | ngxConfTake3, + }, + "keyval_zone": []int{ + ngxHttpMainConf | ngxConf1More, + ngxStreamMainConf | ngxConf1More, + }, + "least_time": []int{ + ngxHttpUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + "limit_zone": []int{ + ngxHttpMainConf | ngxConfTake3, + }, + "match": []int{ + ngxHttpMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "memcached_force_ranges": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfFlag, + }, + "mp4_limit_rate": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "mp4_limit_rate_after": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "ntlm": []int{ + ngxHttpUpsConf | ngxConfNoArgs, + }, + "proxy_cache_purge": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "queue": []int{ + ngxHttpUpsConf | ngxConfTake12, + }, + "scgi_cache_purge": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "session_log": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake1, + }, + "session_log_format": []int{ + ngxHttpMainConf | ngxConf2More, + }, + "session_log_zone": []int{ + ngxHttpMainConf | ngxConfTake23 | ngxConfTake4 | ngxConfTake5 | ngxConfTake6, + }, + "state": []int{ + ngxHttpUpsConf | ngxConfTake1, + ngxStreamUpsConf | ngxConfTake1, + }, + "status": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "status_format": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConfTake12, + }, + "status_zone": []int{ + ngxHttpSrvConf | ngxConfTake1, + ngxStreamSrvConf | ngxConfTake1, + ngxHttpLocConf | ngxConfTake1, + ngxHttpLifConf | ngxConfTake1, + }, + "sticky": []int{ + ngxHttpUpsConf | ngxConf1More, + }, + "sticky_cookie_insert": []int{ + ngxHttpUpsConf | ngxConfTake1234, + }, + "upStreamconf": []int{ + ngxHttpLocConf | ngxConfNoArgs, + }, + "uwsgi_cache_purge": []int{ + ngxHttpMainConf | ngxHttpSrvConf | ngxHttpLocConf | ngxConf1More, + }, + "zone_sync": []int{ + ngxStreamSrvConf | ngxConfNoArgs, + }, + "zone_sync_buffers": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "zone_sync_connect_retry_interval": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_connect_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_interval": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_recv_buffer_size": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_server": []int{ + ngxStreamSrvConf | ngxConfTake12, + }, + "zone_sync_ssl": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "zone_sync_ssl_certificate": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_certificate_key": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_ciphers": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_crl": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_name": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_password_file": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_protocols": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "zone_sync_ssl_server_name": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "zone_sync_ssl_trusted_certificate": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_ssl_verify": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "zone_sync_ssl_verify_depth": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "zone_sync_timeout": []int{ + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/build.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/build.go new file mode 100644 index 0000000..522ff45 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/build.go @@ -0,0 +1,199 @@ +package crossplane + +import ( + "bytes" + "io" + "os" + "path/filepath" + "strings" + "unicode" +) + +type BuildOptions struct { + Indent int + Tabs bool + Header bool +} + +// BuildFiles builds all of the config files in a crossplane.Payload and +// writes them to disk. +func BuildFiles(payload Payload, dir string, options *BuildOptions) error { + if len(dir) == 0 { + cwd, err := os.Getwd() + if err != nil { + return err + } + dir = cwd + } + + for _, config := range payload.Config { + path := config.File + if !filepath.IsAbs(path) { + path = filepath.Join(dir, path) + } + + // make directories that need to be made for the config to be built + dirpath := filepath.Dir(path) + if err := os.MkdirAll(dirpath, os.ModeDir|os.ModePerm); err != nil { + return err + } + + // build then create the nginx config file using the json payload + var buf bytes.Buffer + if err := Build(&buf, config, options); err != nil { + return err + } + + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + + output := append(bytes.TrimRightFunc(buf.Bytes(), unicode.IsSpace), '\n') + if _, err := f.Write(output); err != nil { + return err + } + } + + return nil +} + +// Build creates an NGINX config from a crossplane.Config. +func Build(w io.Writer, config Config, options *BuildOptions) error { + if options.Indent == 0 { + options.Indent = 4 + } + + head := "" + if options.Header { + head += "# This config was built from JSON using NGINX crossplane.\n" + head += "# If you encounter any bugs please report them here:\n" + head += "# https://github.com/nginxinc/crossplane/issues\n" + head += "\n" + } + + body := "" + body = buildBlock(body, config.Parsed, 0, 0, options) + _, err := w.Write([]byte(head + body)) + return err +} + +func buildBlock(output string, block []Directive, depth int, lastLine int, options *BuildOptions) string { + for _, stmt := range block { + var built string + + if stmt.IsComment() && stmt.Line == lastLine { + output += " #" + *stmt.Comment + continue + } else if stmt.IsComment() { + built = "#" + *stmt.Comment + } else { + directive := enquote(stmt.Directive) + args := []string{} + for _, arg := range stmt.Args { + args = append(args, enquote(arg)) + } + + if directive == "if" { + built = "if (" + strings.Join(args, " ") + ")" + } else if len(args) > 0 { + built = directive + " " + strings.Join(args, " ") + } else { + built = directive + } + + if stmt.Block == nil { + built += ";" + } else { + built += " {" + built = buildBlock(built, *stmt.Block, depth+1, stmt.Line, options) + built += "\n" + margin(options, depth) + "}" + } + } + if len(output) > 0 { + output += "\n" + } + output += margin(options, depth) + built + lastLine = stmt.Line + } + + return output +} + +func margin(options *BuildOptions, depth int) string { + if options.Tabs { + return strings.Repeat("\t", depth) + } + return strings.Repeat(" ", options.Indent*depth) +} + +func enquote(arg string) string { + if !needsQuotes(arg) { + return arg + } + quoted := strings.ReplaceAll(repr(arg), `\\`, `\`) + return quoted +} + +func needsQuotes(s string) bool { + if s == "" { + return true + } + + // lexer should throw an error when variable expansion syntax + // is messed up, but just wrap it in quotes for now I guess + var char string + chars := escape(s) + + if len(chars) == 0 { + return true + } + + // arguments can't start with variable expansion syntax + char = chars[0] + chars = chars[1:] + + if isSpace(char) || char == "{" || char == "}" || char == ";" || char == `"` || char == "'" || char == "${" { + return true + } + + expanding := false + for _, c := range chars { + char = c + if isSpace(char) || char == "{" || char == ";" || char == `"` || char == "'" { + return true + } else if (expanding && char == "${") || (!expanding && char == "}") { + return true + } else if (expanding && char == "}") || (!expanding && char == "${") { + expanding = !expanding + } + } + + return expanding || char == "\\" || char == "$" +} + +func escape(s string) []string { + var c []string + prev, char := "", "" + for _, r := range s { + char = string(r) + if prev == "\\" || prev+char == "${" { + prev += char + c = append(c, prev) + continue + } + if prev == "$" { + c = append(c, prev) + } + if char != "\\" && char != "$" { + c = append(c, char) + } + prev = char + } + if char == "\\" || char == "$" { + c = append(c, char) + } + + return c +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/errors.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/errors.go new file mode 100644 index 0000000..eee1c3f --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/errors.go @@ -0,0 +1,18 @@ +package crossplane + +import ( + "fmt" +) + +type ParseError struct { + what string + file *string + line *int +} + +func (e ParseError) Error() string { + if e.line != nil { + return fmt.Sprintf("%s in %s:%d", e.what, *e.file, *e.line) + } + return fmt.Sprintf("%s in %s", e.what, *e.file) +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/lex.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/lex.go new file mode 100644 index 0000000..6c437ad --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/lex.go @@ -0,0 +1,229 @@ +package crossplane + +import ( + "bufio" + "io" + "strings" +) + +type ngxToken struct { + Value string + Line int + IsQuoted bool + Error error +} + +type charLine struct { + char string + line int +} + +func lex(reader io.Reader) chan ngxToken { + return balanceBraces(tokenize(reader)) +} + +func balanceBraces(tokens chan ngxToken) chan ngxToken { + c := make(chan ngxToken) + + go func() { + depth := 0 + line := 0 + for t := range tokens { + line = t.Line + if t.Value == "}" && !t.IsQuoted { + depth-- + } else if t.Value == "{" && !t.IsQuoted { + depth++ + } + + // raise error if we ever have more right braces than left + if depth < 0 { + c <- ngxToken{ + Error: ParseError{ + what: `unexpected "}"`, + line: &line, + }, + } + close(c) + return + } + c <- t + } + + // raise error if we have less right braces than left at EOF + if depth > 0 { + c <- ngxToken{ + Error: ParseError{ + what: `unexpected end of file, expecting "}"`, + line: &line, + }, + } + } + + close(c) + }() + + return c +} + +func tokenize(reader io.Reader) chan ngxToken { + c := make(chan ngxToken) + + go func() { + var ok bool + var token string + var tokenLine int + + it := lineCount(escapeChars(readChars(reader))) + + for cl := range it { + // handle whitespace + if isSpace(cl.char) { + // if token complete yield it and reset token buffer + if len(token) > 0 { + c <- ngxToken{Value: token, Line: tokenLine, IsQuoted: false} + token = "" + } + // disregard until char isn't a whitespace character + for isSpace(cl.char) { + if cl, ok = <-it; !ok { + break + } + } + } + + // if starting comment + if len(token) == 0 && cl.char == "#" { + lineAtStart := cl.line + for !strings.HasSuffix(cl.char, "\n") { + token += cl.char + if cl, ok = <-it; !ok { + break + } + } + c <- ngxToken{Value: token, Line: lineAtStart, IsQuoted: false} + token = "" + continue + } + + if len(token) == 0 { + tokenLine = cl.line + } + + // handle parameter expansion syntax (ex: "${var[@]}") + if len(token) > 0 && strings.HasSuffix(token, "$") && cl.char == "{" { + for !strings.HasSuffix(token, "}") && !isSpace(cl.char) { + token += cl.char + if cl, ok = <-it; !ok { + break + } + } + } + + // if a quote is found, add the whole string to the token buffer + if cl.char == `"` || cl.char == "'" { + // if a quote is inside a token, treat it like any other char + if len(token) > 0 { + token += cl.char + continue + } + + quote := cl.char + if cl, ok = <-it; !ok { + break + } + for cl.char != quote { + if cl.char == "\\"+quote { + token += quote + } else { + token += cl.char + } + if cl, ok = <-it; !ok { + break + } + } + + // True because this is in quotes + c <- ngxToken{Value: token, Line: tokenLine, IsQuoted: true} + token = "" + continue + } + + // handle special characters that are treated like full tokens + if cl.char == "{" || cl.char == "}" || cl.char == ";" { + // if token complete yield it and reset token buffer + if len(token) > 0 { + c <- ngxToken{Value: token, Line: tokenLine, IsQuoted: false} + token = "" + } + + // this character is a full token so yield it now + c <- ngxToken{Value: cl.char, Line: cl.line, IsQuoted: false} + continue + } + + // append char to the token buffer + token += cl.char + } + + if token != "" { + c <- ngxToken{Value: token, Line: tokenLine, IsQuoted: false} + } + + close(c) + }() + + return c +} + +func readChars(reader io.Reader) chan string { + c := make(chan string) + + go func() { + scanner := bufio.NewScanner(reader) + scanner.Split(bufio.ScanRunes) + for scanner.Scan() { + c <- scanner.Text() + } + close(c) + }() + + return c +} + +func lineCount(chars chan string) chan charLine { + c := make(chan charLine) + + go func() { + line := 1 + for char := range chars { + if strings.HasSuffix(char, "\n") { + line++ + } + c <- charLine{char: char, line: line} + } + close(c) + }() + + return c +} + +func escapeChars(chars chan string) chan string { + c := make(chan string) + + go func() { + for char := range chars { + if char == "\\" { + char += <-chars + } + // Skip carriage return characters. + if char == "\r" || char == "\\\r" { + continue + } + c <- char + } + close(c) + }() + + return c +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/parse.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/parse.go new file mode 100644 index 0000000..bf82fd3 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/parse.go @@ -0,0 +1,313 @@ +package crossplane + +import ( + "io" + "os" + "path/filepath" + "regexp" + "sort" + "strings" +) + +var dfltFileOpen = func(path string) (io.Reader, error) { return os.Open(path) } + +var hasMagic = regexp.MustCompile(`[*?[]`) + +type blockCtx []string + +func (c blockCtx) key() string { + return strings.Join(c, ">") +} + +type fileCtx struct { + path string + ctx blockCtx +} + +type parser struct { + configDir string + options *ParseOptions + handleError func(*Config, error) + includes []fileCtx + included map[string]int +} + +// ParseOptions determine the behavior of an NGINX config parse. +type ParseOptions struct { + // If true, parsing will stop immediately if an error is found. + StopParsingOnError bool + + // An array of directives to skip over and not include in the payload. + IgnoreDirectives []string + + // If true, include directives are used to combine all of the Payload's + // Config structs into one. + CombineConfigs bool + + // If true, only the config file with the given filename will be parsed + // and Parse will not parse files included files. + SingleFile bool + + // If true, comments will be parsed and added to the resulting Payload. + ParseComments bool + + // If true, add an error to the payload when encountering a directive that + // is unrecognized. The unrecognized directive will not be included in the + // resulting Payload. + ErrorOnUnknownDirectives bool + + // If true, checks that directives are in valid contexts. + SkipDirectiveContextCheck bool + + // If true, checks that directives have a valid number of arguments. + SkipDirectiveArgsCheck bool + + // If an error is found while parsing, it will be passed to this callback + // function. The results of the callback function will be set in the + // PayloadError struct that's added to the Payload struct's Errors array. + ErrorCallback func(error) interface{} + + // If specified, use this alternative to open config files + Open func(path string) (io.Reader, error) +} + +// Parse parses an NGINX configuration file. +func Parse(filename string, options *ParseOptions) (*Payload, error) { + payload := Payload{ + Status: "ok", + Errors: []PayloadError{}, + Config: []Config{}, + } + + handleError := func(config *Config, err error) { + var line *int + if e, ok := err.(ParseError); ok { + line = e.line + } + + cerr := ConfigError{Line: line, Error: err.Error()} + perr := PayloadError{Line: line, Error: err.Error(), File: config.File} + if options.ErrorCallback != nil { + perr.Callback = options.ErrorCallback(err) + } + + config.Status = "failed" + config.Errors = append(config.Errors, cerr) + + payload.Status = "failed" + payload.Errors = append(payload.Errors, perr) + } + + // Start with the main nginx config file/context. + p := parser{ + configDir: filepath.Dir(filename), + options: options, + handleError: handleError, + includes: []fileCtx{fileCtx{path: filename, ctx: blockCtx{}}}, + included: map[string]int{filename: 0}, + } + + fileOpen := dfltFileOpen + if options.Open != nil { + fileOpen = options.Open + } + + for len(p.includes) > 0 { + incl := p.includes[0] + p.includes = p.includes[1:] + + file, err := fileOpen(incl.path) + if err != nil { + return nil, err + } + + tokens := lex(file) + config := Config{ + File: incl.path, + Status: "ok", + Errors: []ConfigError{}, + Parsed: []Directive{}, + } + parsed, err := p.parse(&config, tokens, incl.ctx, false) + if err != nil { + if options.StopParsingOnError { + return nil, err + } + handleError(&config, err) + } else { + config.Parsed = parsed + } + + payload.Config = append(payload.Config, config) + } + + if options.CombineConfigs { + return payload.Combined() + } + + return &payload, nil +} + +// parse Recursively parses directives from an nginx config context. +func (p *parser) parse(parsing *Config, tokens chan ngxToken, ctx blockCtx, consume bool) ([]Directive, error) { + parsed := []Directive{} + + // parse recursively by pulling from a flat stream of tokens + for t := range tokens { + if t.Error != nil { + return nil, t.Error + } + + commentsInArgs := []string{} + + // we are parsing a block, so break if it's closing + if t.Value == "}" && !t.IsQuoted { + break + } + + // if we are consuming, then just continue until end of context + if consume { + // if we find a block inside this context, consume it too + if t.Value == "{" && !t.IsQuoted { + _, _ = p.parse(parsing, tokens, nil, true) + } + continue + } + + // TODO: add a "File" key if combine is true + // the first token should always be an nginx directive + stmt := Directive{ + Directive: t.Value, + Line: t.Line, + Args: []string{}, + } + + // if token is comment + if strings.HasPrefix(t.Value, "#") && !t.IsQuoted { + if p.options.ParseComments { + comment := t.Value[1:] + stmt.Directive = "#" + stmt.Comment = &comment + parsed = append(parsed, stmt) + } + continue + } + + // parse arguments by reading tokens + t = <-tokens + for t.IsQuoted || (t.Value != "{" && t.Value != ";" && t.Value != "}") { + if strings.HasPrefix(t.Value, "#") && !t.IsQuoted { + commentsInArgs = append(commentsInArgs, t.Value[1:]) + } else { + stmt.Args = append(stmt.Args, t.Value) + } + t = <-tokens + } + + // consume the directive if it is ignored and move on + if contains(p.options.IgnoreDirectives, stmt.Directive) { + // if this directive was a block consume it too + if t.Value == "{" && !t.IsQuoted { + _, _ = p.parse(parsing, tokens, nil, true) + } + continue + } + + // prepare arguments + if stmt.Directive == "if" { + stmt = prepareIfArgs(stmt) + } + + // raise errors if this statement is invalid + err := analyze(parsing.File, stmt, t.Value, ctx, p.options) + + if perr, ok := err.(ParseError); ok && !p.options.StopParsingOnError { + p.handleError(parsing, perr) + // if it was a block but shouldn"t have been then consume + if strings.HasSuffix(perr.what, ` is not terminated by ";"`) { + if t.Value != "}" && !t.IsQuoted { + _, _ = p.parse(parsing, tokens, nil, true) + } else { + break + } + } + // keep on parsin' + continue + } else if err != nil { + return nil, err + } + + // add "includes" to the payload if this is an include statement + if !p.options.SingleFile && stmt.Directive == "include" { + pattern := stmt.Args[0] + if !filepath.IsAbs(pattern) { + pattern = filepath.Join(p.configDir, pattern) + } + + stmt.Includes = &[]int{} + + // get names of all included files + var fnames []string + if hasMagic.MatchString(pattern) { + fnames, err = filepath.Glob(pattern) + if err != nil { + return nil, err + } + sort.Strings(fnames) + } else { + // if the file pattern was explicit, nginx will check + // that the included file can be opened and read + if f, err := os.Open(pattern); err != nil { + perr := ParseError{ + what: err.Error(), + file: &parsing.File, + line: &stmt.Line, + } + if !p.options.StopParsingOnError { + p.handleError(parsing, perr) + } else { + return nil, perr + } + } else { + f.Close() + fnames = []string{pattern} + } + } + + for _, fname := range fnames { + // the included set keeps files from being parsed twice + // TODO: handle files included from multiple contexts + if _, ok := p.included[fname]; !ok { + p.included[fname] = len(p.included) + p.includes = append(p.includes, fileCtx{fname, ctx}) + } + *stmt.Includes = append(*stmt.Includes, p.included[fname]) + } + } + + // if this statement terminated with "{" then it is a block + if t.Value == "{" && !t.IsQuoted { + inner := enterBlockCtx(stmt, ctx) // get context for block + block, err := p.parse(parsing, tokens, inner, false) + if err != nil { + return nil, err + } + stmt.Block = &block + } + + parsed = append(parsed, stmt) + + // add all comments found inside args after stmt is added + for _, comment := range commentsInArgs { + comment := comment + parsed = append(parsed, Directive{ + Directive: "#", + Line: stmt.Line, + Args: []string{}, + Comment: &comment, + }) + } + } + + return parsed, nil +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/types.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/types.go new file mode 100644 index 0000000..bfbf296 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/types.go @@ -0,0 +1,57 @@ +package crossplane + +type Payload struct { + Status string `json:"status"` + Errors []PayloadError `json:"errors"` + Config []Config `json:"config"` +} + +type PayloadError struct { + File string `json:"file"` + Line *int `json:"line"` + Error string `json:"error"` + Callback interface{} `json:"callback,omitempty"` +} + +type Config struct { + File string `json:"file"` + Status string `json:"status"` + Errors []ConfigError `json:"errors"` + Parsed []Directive `json:"parsed"` +} + +type ConfigError struct { + Line *int `json:"line"` + Error string `json:"error"` +} + +type Directive struct { + Directive string `json:"directive"` + Line int `json:"line"` + Args []string `json:"args"` + Includes *[]int `json:"includes,omitempty"` + Block *[]Directive `json:"block,omitempty"` + Comment *string `json:"comment,omitempty"` +} + +// IsBlock returns true if this is a block directive. +func (d Directive) IsBlock() bool { + return d.Block != nil +} + +// IsInclude returns true if this is an include directive. +func (d Directive) IsInclude() bool { + return d.Directive == "include" && d.Includes != nil +} + +// IsComment returns true iff the directive represents a comment. +func (d Directive) IsComment() bool { + return d.Directive == "#" && d.Comment != nil +} + +// Combined returns a new Payload that is the same except that the inluding +// logic is performed on its configs. This means that the resulting Payload +// will always have 0 or 1 configs in its Config field. +func (p Payload) Combined() (*Payload, error) { + return combineConfigs(p) +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/util.go b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/util.go new file mode 100644 index 0000000..5ab33e5 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/github.com/aluttik/go-crossplane/util.go @@ -0,0 +1,148 @@ +package crossplane + +import ( + "fmt" + "strings" + "unicode" +) + +type included struct { + directive Directive + err error +} + +func contains(xs []string, x string) bool { + for _, s := range xs { + if s == x { + return true + } + } + return false +} + +func isSpace(s string) bool { + return len(strings.TrimSpace(s)) == 0 +} + +func repr(s string) string { + q := fmt.Sprintf("%q", s) + for _, char := range s { + if char == '"' { + q = strings.ReplaceAll(q, `\"`, `"`) + q = strings.ReplaceAll(q, `'`, `\'`) + q = `'` + q[1:len(q)-1] + `'` + return q + } + } + return q +} + +func validFlag(s string) bool { + l := strings.ToLower(s) + return l == "on" || l == "off" +} + +// prepareIfArgs removes parentheses from an `if` directive's arguments. +func prepareIfArgs(d Directive) Directive { + e := len(d.Args) - 1 + if len(d.Args) > 0 && strings.HasPrefix(d.Args[0], "(") && strings.HasSuffix(d.Args[e], ")") { + d.Args[0] = strings.TrimLeftFunc(strings.TrimPrefix(d.Args[0], "("), unicode.IsSpace) + d.Args[e] = strings.TrimRightFunc(strings.TrimSuffix(d.Args[e], ")"), unicode.IsSpace) + if len(d.Args[0]) == 0 { + d.Args = d.Args[1:] + e -= 1 + } + if len(d.Args[e]) == 0 { + d.Args = d.Args[:e] + } + } + return d +} + +// combineConfigs combines config files into one by using include directives. +func combineConfigs(old Payload) (*Payload, error) { + if len(old.Config) < 1 { + return &old, nil + } + + status := old.Status + if status == "" { + status = "ok" + } + + errors := old.Errors + if errors == nil { + errors = []PayloadError{} + } + + combined := Config{ + File: old.Config[0].File, + Status: "ok", + Errors: []ConfigError{}, + Parsed: []Directive{}, + } + + for _, config := range old.Config { + combined.Errors = append(combined.Errors, config.Errors...) + if config.Status == "failed" { + combined.Status = "failed" + } + } + + for incl := range performIncludes(old, combined.File, old.Config[0].Parsed) { + if incl.err != nil { + return nil, incl.err + } + combined.Parsed = append(combined.Parsed, incl.directive) + } + + return &Payload{ + Status: status, + Errors: errors, + Config: []Config{combined}, + }, nil +} + +func performIncludes(old Payload, fromfile string, block []Directive) chan included { + c := make(chan included) + go func() { + defer close(c) + + for _, dir := range block { + if dir.IsBlock() { + block := []Directive{} + for incl := range performIncludes(old, fromfile, *dir.Block) { + if incl.err != nil { + c <- incl + return + } + block = append(block, incl.directive) + } + dir.Block = &block + } + + if !dir.IsInclude() { + c <- included{directive: dir} + continue + } + + for _, idx := range *dir.Includes { + if idx >= len(old.Config) { + c <- included{ + err: ParseError{ + what: fmt.Sprintf("include config with index: %d", idx), + file: &fromfile, + line: &dir.Line, + }, + } + return + } + for incl := range performIncludes(old, old.Config[idx].File, old.Config[idx].Parsed) { + c <- incl + } + } + } + + }() + return c +} diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/modules.txt b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/modules.txt new file mode 100644 index 0000000..dba9885 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/nginxConfPatcher/vendor/modules.txt @@ -0,0 +1,3 @@ +# github.com/aluttik/go-crossplane v0.0.0-20210526174032-f987c53bd056 +## explicit +github.com/aluttik/go-crossplane diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf new file mode 100644 index 0000000..28aa11b --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf @@ -0,0 +1,88 @@ +line1 +line2 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +user www www; ## Default: nobody +worker_processes 5; ## Default: 1 +error_log logs/error.log; +pid logs/nginx.pid; +worker_rlimit_nofile 8192; + +events { + worker_connections 4096; ## Default: 1024 +} + +line2 +line2 +http { +line2 + include conf/mime.types; + include /etc/nginx/proxy.conf; + include /etc/nginx/fastcgi.conf; + index index.html index.htm index.php; + + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log logs/access.log main; + sendfile on; + tcp_nopush on; + server_names_hash_bucket_size 128; # this seems to be required for some vhosts + + server { # php/fastcgi + listen 80; + server_name domain1.com www.domain1.com; + access_log logs/domain1.access.log main; + root html; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:1025; + } + } + + server { # simple reverse-proxy + listen 80; + server_name domain2.com www.domain2.com; + access_log logs/domain2.access.log main; + + # serve static files + location ~ ^/(images|javascript|js|css|flash|media|static)/ { + root /var/www/virtual/big.server.com/htdocs; + expires 30d; + } + + # pass requests for dynamic content to rails/turbogears/zope, et al + location / { + proxy_pass http://127.0.0.1:8080; + } + } + + upstream big_server_com { + server 127.0.0.3:8000 weight=5; + server 127.0.0.3:8001 weight=5; + server 192.168.0.1:8000; + server 192.168.0.1:8001; + } + + server { # simple load balancing + listen 80; + server_name big.server.com; + access_log logs/big.server.access.log main; + + location / { + proxy_pass http://big_server_com; + } + } +} \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf.bck b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf.bck new file mode 100644 index 0000000..f0a1600 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginx.conf.bck @@ -0,0 +1,86 @@ +line2 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +line1 +user www www; ## Default: nobody +worker_processes 5; ## Default: 1 +error_log logs/error.log; +pid logs/nginx.pid; +worker_rlimit_nofile 8192; + +events { + worker_connections 4096; ## Default: 1024 +} + +line2 +line2 +http { + include conf/mime.types; + include /etc/nginx/proxy.conf; + include /etc/nginx/fastcgi.conf; + index index.html index.htm index.php; + + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log logs/access.log main; + sendfile on; + tcp_nopush on; + server_names_hash_bucket_size 128; # this seems to be required for some vhosts + + server { # php/fastcgi + listen 80; + server_name domain1.com www.domain1.com; + access_log logs/domain1.access.log main; + root html; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:1025; + } + } + + server { # simple reverse-proxy + listen 80; + server_name domain2.com www.domain2.com; + access_log logs/domain2.access.log main; + + # serve static files + location ~ ^/(images|javascript|js|css|flash|media|static)/ { + root /var/www/virtual/big.server.com/htdocs; + expires 30d; + } + + # pass requests for dynamic content to rails/turbogears/zope, et al + location / { + proxy_pass http://127.0.0.1:8080; + } + } + + upstream big_server_com { + server 127.0.0.3:8000 weight=5; + server 127.0.0.3:8001 weight=5; + server 192.168.0.1:8000; + server 192.168.0.1:8001; + } + + server { # simple load balancing + listen 80; + server_name big.server.com; + access_log logs/big.server.access.log main; + + location / { + proxy_pass http://big_server_com; + } + } +} \ No newline at end of file diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginxPatch.sh b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginxPatch.sh new file mode 100755 index 0000000..148d594 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage/helpers/shellBasedPatcher/nginxPatch.sh @@ -0,0 +1,17 @@ +#! /bin/bash +set -x + +conf=${1} +load_module_directive=${2} +include_config_directive=${3} + +cp ${conf} ${conf}.bck + +sed -i '' '1s,^,'${load_module_directive}'\n,g' ${conf} + +if ! grep -q 'conf.d/*.conf' "${conf}"; then + http_line_no=$(grep -n -E '[[:space:]]*http[[:space:]]*{[[:space:]]*' ${conf} | sed 's/:.*//') + http_line_no=$(expr $http_line_no + 1) + sed -i '' ${http_line_no}'s,^,'${include_config_directive}'\n,g' ${conf} +fi + diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Dockerfile b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Dockerfile new file mode 100644 index 0000000..c7896f7 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Dockerfile @@ -0,0 +1,27 @@ + +############################ +# STEP 1 download the webserver agent +############################ +FROM alpine:latest as agent + +RUN mkdir /opt/opentelemetry +WORKDIR /opt/opentelemetry + +RUN wget https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.0/opentelemetry-webserver-sdk-x64-linux.tgz.zip +RUN unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip +RUN mkdir agent +RUN tar -xvf opentelemetry-webserver-sdk-x64-linux.tgz -C agent + +############################ +# STEP 2 download the webserver agent +############################ +FROM alpine:latest + +COPY --from=agent /opt/opentelemetry/agent/opentelemetry-webserver-sdk /opt/opentelemetry + +RUN chmod a+w /opt/opentelemetry/logs + +CMD ["cat", "Just delivering the Opentelemetry Apache/Nginx agent"] + + + diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Makefile b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Makefile new file mode 100644 index 0000000..1490835 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/Makefile @@ -0,0 +1,9 @@ +all: images + +images: + docker build . -t chrlic/opentelemetry-webserver-agent:latest + + docker push chrlic/opentelemetry-webserver-agent:latest + + + diff --git a/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/patch.sh b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/patch.sh new file mode 100755 index 0000000..bf94997 --- /dev/null +++ b/buildEnv/instrumentationImages/otelSDK/webserverAgentImage2/patch.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +export agentLogDir=$(echo "/opt/opentelemetry-webserver/agent/logs" | sed 's,/,\\/,g') +echo ${agentLogDir} +cat agent/opentelemetry-webserver-sdk/conf/appdynamics_sdk_log4cxx.xml.template | sed 's/__agent_log_dir__/'${agentLogDir}'/g' > agent/opentelemetry-webserver-sdk/conf/appdynamics_sdk_log4cxx.xml2 \ No newline at end of file diff --git a/buildEnv/otel/Makefile b/buildEnv/otel/Makefile deleted file mode 100644 index 795cb43..0000000 --- a/buildEnv/otel/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -images: - curl https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -o otel-java/opentelemetry-javaagent.jar - curl https://github.com/cisco-open/otel-java/releases/latest/download/cisco-telescope-javaagent.jar -o cisco-telescope-java/cisco-telescope-javaagent.jar - \ No newline at end of file diff --git a/buildEnv/otel/cisco-telescope-java/cisco-telescope-javaagent.jar b/buildEnv/otel/cisco-telescope-java/cisco-telescope-javaagent.jar deleted file mode 100644 index e69de29..0000000 diff --git a/buildEnv/otel/otel-java/opentelemetry-javaagent.jar b/buildEnv/otel/otel-java/opentelemetry-javaagent.jar deleted file mode 100644 index e69de29..0000000 diff --git a/testWorkloads/apache-httpd/Dockerfile b/testWorkloads/apache-httpd/Dockerfile new file mode 100644 index 0000000..393490a --- /dev/null +++ b/testWorkloads/apache-httpd/Dockerfile @@ -0,0 +1,23 @@ + +# Copyright (c) 2019 Cisco Systems, 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. + + +FROM httpd:2.4 + +COPY ./conf/ /usr/local/apache2/conf +COPY ./public/ /usr/local/apache2/htdocs/ + +# Allow running the container with non-root user +RUN chmod 777 -R /usr/local/apache2/ \ No newline at end of file diff --git a/testWorkloads/apache-httpd/conf/httpd.conf b/testWorkloads/apache-httpd/conf/httpd.conf new file mode 100644 index 0000000..b00c511 --- /dev/null +++ b/testWorkloads/apache-httpd/conf/httpd.conf @@ -0,0 +1,551 @@ +# +# This is the main Apache HTTP server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information. +# In particular, see +# +# for a discussion of each configuration directive. +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# +# Configuration and logfile names: If the filenames you specify for many +# of the server's control files begin with "/" (or "drive:/" for Win32), the +# server will use that explicit path. If the filenames do *not* begin +# with "/", the value of ServerRoot is prepended -- so "logs/access_log" +# with ServerRoot set to "/usr/local/apache2" will be interpreted by the +# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" +# will be interpreted as '/logs/access_log'. + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# Do not add a slash at the end of the directory path. If you point +# ServerRoot at a non-local disk, be sure to specify a local disk on the +# Mutex directive, if file-based mutexes are used. If you wish to share the +# same ServerRoot for multiple httpd daemons, you will need to change at +# least PidFile. +# +ServerRoot "/usr/local/apache2" + +# +# Mutex: Allows you to set the mutex mechanism and mutex file directory +# for individual mutexes, or change the global defaults +# +# Uncomment and change the directory if mutexes are file-based and the default +# mutex file directory is not on a local disk or is not appropriate for some +# other reason. +# +# Mutex default:logs + +# +# Listen: Allows you to bind Apache to specific IP addresses and/or +# ports, instead of the default. See also the +# directive. +# +# Change this to Listen on specific IP addresses as shown below to +# prevent Apache from glomming onto all bound IP addresses. +# +#Listen 12.34.56.78:80 +Listen 8080 + +# +# Dynamic Shared Object (DSO) Support +# +# To be able to use the functionality of a module which was built as a DSO you +# have to place corresponding `LoadModule' lines at this location so the +# directives contained in it are actually available _before_ they are used. +# Statically compiled modules (those listed by `httpd -l') do not need +# to be loaded here. +# +# Example: +# LoadModule foo_module modules/mod_foo.so +# +LoadModule mpm_event_module modules/mod_mpm_event.so +#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so +#LoadModule mpm_worker_module modules/mod_mpm_worker.so +LoadModule authn_file_module modules/mod_authn_file.so +#LoadModule authn_dbm_module modules/mod_authn_dbm.so +#LoadModule authn_anon_module modules/mod_authn_anon.so +#LoadModule authn_dbd_module modules/mod_authn_dbd.so +#LoadModule authn_socache_module modules/mod_authn_socache.so +LoadModule authn_core_module modules/mod_authn_core.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authz_groupfile_module modules/mod_authz_groupfile.so +LoadModule authz_user_module modules/mod_authz_user.so +#LoadModule authz_dbm_module modules/mod_authz_dbm.so +#LoadModule authz_owner_module modules/mod_authz_owner.so +#LoadModule authz_dbd_module modules/mod_authz_dbd.so +LoadModule authz_core_module modules/mod_authz_core.so +#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so +#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so +LoadModule access_compat_module modules/mod_access_compat.so +LoadModule auth_basic_module modules/mod_auth_basic.so +#LoadModule auth_form_module modules/mod_auth_form.so +#LoadModule auth_digest_module modules/mod_auth_digest.so +#LoadModule allowmethods_module modules/mod_allowmethods.so +#LoadModule isapi_module modules/mod_isapi.so +#LoadModule file_cache_module modules/mod_file_cache.so +#LoadModule cache_module modules/mod_cache.so +#LoadModule cache_disk_module modules/mod_cache_disk.so +#LoadModule cache_socache_module modules/mod_cache_socache.so +#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so +#LoadModule socache_dbm_module modules/mod_socache_dbm.so +#LoadModule socache_memcache_module modules/mod_socache_memcache.so +#LoadModule socache_redis_module modules/mod_socache_redis.so +#LoadModule watchdog_module modules/mod_watchdog.so +#LoadModule macro_module modules/mod_macro.so +#LoadModule dbd_module modules/mod_dbd.so +#LoadModule bucketeer_module modules/mod_bucketeer.so +#LoadModule dumpio_module modules/mod_dumpio.so +#LoadModule echo_module modules/mod_echo.so +#LoadModule example_hooks_module modules/mod_example_hooks.so +#LoadModule case_filter_module modules/mod_case_filter.so +#LoadModule case_filter_in_module modules/mod_case_filter_in.so +#LoadModule example_ipc_module modules/mod_example_ipc.so +#LoadModule buffer_module modules/mod_buffer.so +#LoadModule data_module modules/mod_data.so +#LoadModule ratelimit_module modules/mod_ratelimit.so +LoadModule reqtimeout_module modules/mod_reqtimeout.so +#LoadModule ext_filter_module modules/mod_ext_filter.so +#LoadModule request_module modules/mod_request.so +#LoadModule include_module modules/mod_include.so +LoadModule filter_module modules/mod_filter.so +#LoadModule reflector_module modules/mod_reflector.so +#LoadModule substitute_module modules/mod_substitute.so +#LoadModule sed_module modules/mod_sed.so +#LoadModule charset_lite_module modules/mod_charset_lite.so +#LoadModule deflate_module modules/mod_deflate.so +#LoadModule xml2enc_module modules/mod_xml2enc.so +#LoadModule proxy_html_module modules/mod_proxy_html.so +#LoadModule brotli_module modules/mod_brotli.so +LoadModule mime_module modules/mod_mime.so +#LoadModule ldap_module modules/mod_ldap.so +LoadModule log_config_module modules/mod_log_config.so +#LoadModule log_debug_module modules/mod_log_debug.so +#LoadModule log_forensic_module modules/mod_log_forensic.so +#LoadModule logio_module modules/mod_logio.so +#LoadModule lua_module modules/mod_lua.so +LoadModule env_module modules/mod_env.so +#LoadModule mime_magic_module modules/mod_mime_magic.so +#LoadModule cern_meta_module modules/mod_cern_meta.so +#LoadModule expires_module modules/mod_expires.so +LoadModule headers_module modules/mod_headers.so +#LoadModule ident_module modules/mod_ident.so +#LoadModule usertrack_module modules/mod_usertrack.so +#LoadModule unique_id_module modules/mod_unique_id.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule version_module modules/mod_version.so +#LoadModule remoteip_module modules/mod_remoteip.so +#LoadModule proxy_module modules/mod_proxy.so +#LoadModule proxy_connect_module modules/mod_proxy_connect.so +#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so +#LoadModule proxy_http_module modules/mod_proxy_http.so +#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so +#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so +#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so +#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so +#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so +#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so +#LoadModule proxy_express_module modules/mod_proxy_express.so +#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so +#LoadModule session_module modules/mod_session.so +#LoadModule session_cookie_module modules/mod_session_cookie.so +#LoadModule session_crypto_module modules/mod_session_crypto.so +#LoadModule session_dbd_module modules/mod_session_dbd.so +#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so +#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so +#LoadModule ssl_module modules/mod_ssl.so +#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so +#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so +#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so +#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so +#LoadModule dialup_module modules/mod_dialup.so +#LoadModule http2_module modules/mod_http2.so +#LoadModule proxy_http2_module modules/mod_proxy_http2.so +#LoadModule md_module modules/mod_md.so +#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so +#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so +#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so +#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so +LoadModule unixd_module modules/mod_unixd.so +#LoadModule heartbeat_module modules/mod_heartbeat.so +#LoadModule heartmonitor_module modules/mod_heartmonitor.so +#LoadModule dav_module modules/mod_dav.so +LoadModule status_module modules/mod_status.so +LoadModule autoindex_module modules/mod_autoindex.so +#LoadModule asis_module modules/mod_asis.so +#LoadModule info_module modules/mod_info.so +#LoadModule suexec_module modules/mod_suexec.so + + #LoadModule cgid_module modules/mod_cgid.so + + + #LoadModule cgi_module modules/mod_cgi.so + +#LoadModule dav_fs_module modules/mod_dav_fs.so +#LoadModule dav_lock_module modules/mod_dav_lock.so +#LoadModule vhost_alias_module modules/mod_vhost_alias.so +#LoadModule negotiation_module modules/mod_negotiation.so +LoadModule dir_module modules/mod_dir.so +#LoadModule imagemap_module modules/mod_imagemap.so +#LoadModule actions_module modules/mod_actions.so +#LoadModule speling_module modules/mod_speling.so +#LoadModule userdir_module modules/mod_userdir.so +LoadModule alias_module modules/mod_alias.so +#LoadModule rewrite_module modules/mod_rewrite.so + + +# +# If you wish httpd to run as a different user or group, you must run +# httpd as root initially and it will switch. +# +# User/Group: The name (or #number) of the user/group to run httpd as. +# It is usually good practice to create a dedicated user and group for +# running httpd, as with most system services. +# +User www-data +Group www-data + + + +# 'Main' server configuration +# +# The directives in this section set up the values used by the 'main' +# server, which responds to any requests that aren't handled by a +# definition. These values also provide defaults for +# any containers you may define later in the file. +# +# All of these directives may appear inside containers, +# in which case these default settings will be overridden for the +# virtual host being defined. +# + +# +# ServerAdmin: Your address, where problems with the server should be +# e-mailed. This address appears on some server-generated pages, such +# as error documents. e.g. admin@your-domain.com +# +ServerAdmin you@example.com + +# +# ServerName gives the name and port that the server uses to identify itself. +# This can often be determined automatically, but we recommend you specify +# it explicitly to prevent problems during startup. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# +#ServerName www.example.com:80 + +# +# Deny access to the entirety of your server's filesystem. You must +# explicitly permit access to web content directories in other +# blocks below. +# + + AllowOverride none + Require all denied + + +# +# Note that from this point forward you must specifically allow +# particular features to be enabled - so if something's not working as +# you might expect, make sure that you have specifically enabled it +# below. +# + +# +# DocumentRoot: The directory out of which you will serve your +# documents. By default, all requests are taken from this directory, but +# symbolic links and aliases may be used to point to other locations. +# +DocumentRoot "/usr/local/apache2/htdocs" + + # + # Possible values for the Options directive are "None", "All", + # or any combination of: + # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews + # + # Note that "MultiViews" must be named *explicitly* --- "Options All" + # doesn't give it to you. + # + # The Options directive is both complicated and important. Please see + # http://httpd.apache.org/docs/2.4/mod/core.html#options + # for more information. + # + Options Indexes FollowSymLinks + + # + # AllowOverride controls what directives may be placed in .htaccess files. + # It can be "All", "None", or any combination of the keywords: + # AllowOverride FileInfo AuthConfig Limit + # + AllowOverride None + + # + # Controls who can get stuff from this server. + # + Require all granted + + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# + + DirectoryIndex index.html + + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + +# +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog /proc/self/fd/2 + +# +# LogLevel: Control the number of messages logged to the error_log. +# Possible values include: debug, info, notice, warn, error, crit, +# alert, emerg. +# +LogLevel warn + + + # + # The following directives define some format nicknames for use with + # a CustomLog directive (see below). + # + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + + + # You need to enable mod_logio.c to use %I and %O + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio + + + # + # The location and format of the access logfile (Common Logfile Format). + # If you do not define any access logfiles within a + # container, they will be logged here. Contrariwise, if you *do* + # define per- access logfiles, transactions will be + # logged therein and *not* in this file. + # + CustomLog /proc/self/fd/1 common + + # + # If you prefer a logfile with access, agent, and referer information + # (Combined Logfile Format) you can use the following directive. + # + #CustomLog "logs/access_log" combined + + + + # + # Redirect: Allows you to tell clients about documents that used to + # exist in your server's namespace, but do not anymore. The client + # will make a new request for the document at its new location. + # Example: + # Redirect permanent /foo http://www.example.com/bar + + # + # Alias: Maps web paths into filesystem paths and is used to + # access content that does not live under the DocumentRoot. + # Example: + # Alias /webpath /full/filesystem/path + # + # If you include a trailing / on /webpath then the server will + # require it to be present in the URL. You will also likely + # need to provide a section to allow access to + # the filesystem path. + + # + # ScriptAlias: This controls which directories contain server scripts. + # ScriptAliases are essentially the same as Aliases, except that + # documents in the target directory are treated as applications and + # run by the server when requested rather than as documents sent to the + # client. The same rules about trailing "/" apply to ScriptAlias + # directives as to Alias. + # + ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" + + + + + # + # ScriptSock: On threaded servers, designate the path to the UNIX + # socket used to communicate with the CGI daemon of mod_cgid. + # + #Scriptsock cgisock + + +# +# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Require all granted + + + + # + # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied + # backend servers which have lingering "httpoxy" defects. + # 'Proxy' request header is undefined by the IETF, not listed by IANA + # + RequestHeader unset Proxy early + + + + # + # TypesConfig points to the file containing the list of mappings from + # filename extension to MIME-type. + # + TypesConfig conf/mime.types + + # + # AddType allows you to add to or override the MIME configuration + # file specified in TypesConfig for specific file types. + # + #AddType application/x-gzip .tgz + # + # AddEncoding allows you to have certain browsers uncompress + # information on the fly. Note: Not all browsers support this. + # + #AddEncoding x-compress .Z + #AddEncoding x-gzip .gz .tgz + # + # If the AddEncoding directives above are commented-out, then you + # probably should define those extensions to indicate media types: + # + AddType application/x-compress .Z + AddType application/x-gzip .gz .tgz + + # + # AddHandler allows you to map certain file extensions to "handlers": + # actions unrelated to filetype. These can be either built into the server + # or added with the Action directive (see below) + # + # To use CGI scripts outside of ScriptAliased directories: + # (You will also need to add "ExecCGI" to the "Options" directive.) + # + #AddHandler cgi-script .cgi + + # For type maps (negotiated resources): + #AddHandler type-map var + + # + # Filters allow you to process content before it is sent to the client. + # + # To parse .shtml files for server-side includes (SSI): + # (You will also need to add "Includes" to the "Options" directive.) + # + #AddType text/html .shtml + #AddOutputFilter INCLUDES .shtml + + +# +# The mod_mime_magic module allows the server to use various hints from the +# contents of the file itself to determine its type. The MIMEMagicFile +# directive tells the module where the hint definitions are located. +# +#MIMEMagicFile conf/magic + +# +# Customizable error responses come in three flavors: +# 1) plain text 2) local redirects 3) external redirects +# +# Some examples: +#ErrorDocument 500 "The server made a boo boo." +#ErrorDocument 404 /missing.html +#ErrorDocument 404 "/cgi-bin/missing_handler.pl" +#ErrorDocument 402 http://www.example.com/subscription_info.html +# + +# +# MaxRanges: Maximum number of Ranges in a request before +# returning the entire resource, or one of the special +# values 'default', 'none' or 'unlimited'. +# Default setting is to accept 200 Ranges. +#MaxRanges unlimited + +# +# EnableMMAP and EnableSendfile: On systems that support it, +# memory-mapping or the sendfile syscall may be used to deliver +# files. This usually improves server performance, but must +# be turned off when serving from networked-mounted +# filesystems or if support for these functions is otherwise +# broken on your system. +# Defaults: EnableMMAP On, EnableSendfile Off +# +#EnableMMAP off +#EnableSendfile on + +# Supplemental configuration +# +# The configuration files in the conf/extra/ directory can be +# included to add extra features or to modify the default configuration of +# the server, or you may simply copy their contents here and change as +# necessary. + +# Server-pool management (MPM specific) +#Include conf/extra/httpd-mpm.conf + +# Multi-language error messages +#Include conf/extra/httpd-multilang-errordoc.conf + +# Fancy directory listings +#Include conf/extra/httpd-autoindex.conf + +# Language settings +#Include conf/extra/httpd-languages.conf + +# User home directories +#Include conf/extra/httpd-userdir.conf + +# Real-time info on requests and configuration +#Include conf/extra/httpd-info.conf + +# Virtual hosts +#Include conf/extra/httpd-vhosts.conf + +# Local access to the Apache HTTP Server Manual +#Include conf/extra/httpd-manual.conf + +# Distributed authoring and versioning (WebDAV) +#Include conf/extra/httpd-dav.conf + +# Various default settings +#Include conf/extra/httpd-default.conf + +# Configure mod_proxy_html to understand HTML4/XHTML1 + +Include conf/extra/proxy-html.conf + + +# Secure (SSL/TLS) connections +#Include conf/extra/httpd-ssl.conf +# +# Note: The following must must be present to support +# starting without SSL on platforms with no /dev/random equivalent +# but a statically compiled-in mod_ssl. +# + +SSLRandomSeed startup builtin +SSLRandomSeed connect builtin + + diff --git a/testWorkloads/java/downstream/d-downstream.yaml b/testWorkloads/apache-httpd/d-svc-apache.yaml similarity index 67% rename from testWorkloads/java/downstream/d-downstream.yaml rename to testWorkloads/apache-httpd/d-svc-apache.yaml index 997d821..07c19f3 100644 --- a/testWorkloads/java/downstream/d-downstream.yaml +++ b/testWorkloads/apache-httpd/d-svc-apache.yaml @@ -3,28 +3,28 @@ apiVersion: apps/v1 kind: Deployment metadata: namespace: r - name: downstream + name: my-apache spec: replicas: 1 selector: matchLabels: - app: downstream + app: my-apache template: metadata: annotations: test: testval labels: - app: downstream + app: my-apache appdApp: MD-instr-wh appdInstr: do - language: java + language: apache spec: containers: - - name: downstream - image: chrlic/java-test-downstream:v1.0 + - name: my-apache + image: chrlic/apache-test imagePullPolicy: Always ports: - - containerPort: 8181 + - containerPort: 8080 resources: limits: cpu: "1" @@ -32,20 +32,21 @@ spec: requests: cpu: 250m memory: 100Mi + --- apiVersion: v1 kind: Service metadata: namespace: r - name: downstream + name: my-apache labels: - run: downstream + run: my-apache spec: ports: - - port: 8282 - targetPort: 8181 + - port: 8082 + targetPort: 8080 protocol: TCP selector: - app: downstream + app: my-apache type: LoadBalancer diff --git a/testWorkloads/apache-httpd/public/index.html b/testWorkloads/apache-httpd/public/index.html new file mode 100644 index 0000000..a7b4bae --- /dev/null +++ b/testWorkloads/apache-httpd/public/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + Page Name - Squiz Matrix HTML Example + + + + + + + + + +
+ +
+ + + + + +

Site Name

+ + + + +
+ +
+ + +

Page Heading

+ +
+ +
+ +
+ + + + +
+ +
+ +
+ + +

Sub Heading

+

Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.

+

Sub Heading

+

Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.

+

Sub Heading

+

Maecenas sed diam eget risus varius blandit sit amet non magna.

+ +
+ +
+ +
+ + +

Login

+ + +

Search

+ + + +
+ +
+ +
+

+ + Last Updated: Wednesday, January 6, 2016 +

+

© 2016 Company, Inc.

+
+ +
+ + + \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp deleted file mode 100755 index 5e388dc..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.deps.json b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.deps.json deleted file mode 100644 index d4b6da4..0000000 --- a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v6.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v6.0": { - "MyFirstApp/1.0.0": { - "runtime": { - "MyFirstApp.dll": {} - } - } - } - }, - "libraries": { - "MyFirstApp/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.dll b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.dll deleted file mode 100644 index 679e4b3..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.dll and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.pdb b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.pdb deleted file mode 100644 index 51af1bd..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.pdb and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.runtimeconfig.json b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.runtimeconfig.json deleted file mode 100644 index dfb1b77..0000000 --- a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.runtimeconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "runtimeOptions": { - "tfm": "net6.0", - "frameworks": [ - { - "name": "Microsoft.NETCore.App", - "version": "6.0.0" - }, - { - "name": "Microsoft.AspNetCore.App", - "version": "6.0.0" - } - ], - "configProperties": { - "System.GC.Server": true, - "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false - } - } -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.staticwebassets.runtime.json b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.staticwebassets.runtime.json deleted file mode 100644 index d92f335..0000000 --- a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.staticwebassets.runtime.json +++ /dev/null @@ -1 +0,0 @@ -{"ContentRoots":["/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/","/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"MyFirstApp.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MyFirstApp.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.Development.json b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.Development.json deleted file mode 100644 index f042c67..0000000 --- a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DetailedErrors": true, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.json b/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.json deleted file mode 100644 index 4d56694..0000000 --- a/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/testWorkloads/dotnet/MyFirstApp/d-myfirstapp.yaml b/testWorkloads/dotnet/MyFirstApp/d-myfirstapp.yaml index 6c3c754..0ac047c 100644 --- a/testWorkloads/dotnet/MyFirstApp/d-myfirstapp.yaml +++ b/testWorkloads/dotnet/MyFirstApp/d-myfirstapp.yaml @@ -17,14 +17,24 @@ spec: app: myfirstapp appdApp: MD-instr-wh appdInstr: do - language: dotnetcore + # language: dotnetcore + language: uni spec: containers: - - name: downstream + - name: myfirstapp image: chrlic/sample-dotnet-app:latest imagePullPolicy: Always ports: - containerPort: 7032 + env: + - name: OTEL_METRICS_EXPORTER + value: none + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-coll-deployment-hybrid-agent-default.wht.svc.cluster.local:4318 + - name: OTEL_EXPORTER_OTLP_TRACES_PROTOCOL + value: http/protobuf + - name: OTEL_DOTNET_AUTO_LOAD_TRACER_AT_STARTUP + value: "true" resources: limits: cpu: "1" diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs deleted file mode 100644 index f795be5..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfo.cs b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfo.cs deleted file mode 100644 index a974d2a..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("MyFirstApp")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("MyFirstApp")] -[assembly: System.Reflection.AssemblyTitleAttribute("MyFirstApp")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfoInputs.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfoInputs.cache deleted file mode 100644 index 7eae39c..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -870ed93df1bebd167f4991571fdbd92c20ffe2fa diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GeneratedMSBuildEditorConfig.editorconfig b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index ff69a8f..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,44 +0,0 @@ -is_global = true -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = true -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = MyFirstApp -build_property.RootNamespace = MyFirstApp -build_property.ProjectDir = /Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/ -build_property.RazorLangVersion = 6.0 -build_property.SupportLocalizedComponentNames = -build_property.GenerateRazorMetadataSourceChecksumAttributes = -build_property.MSBuildProjectDirectory = /Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp -build_property._RazorSourceGeneratorDebug = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Error.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvRXJyb3IuY3NodG1s -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Index.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvSW5kZXguY3NodG1s -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Privacy.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvUHJpdmFjeS5jc2h0bWw= -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Shared/_ValidationScriptsPartial.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvU2hhcmVkL19WYWxpZGF0aW9uU2NyaXB0c1BhcnRpYWwuY3NodG1s -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/_ViewImports.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvX1ZpZXdJbXBvcnRzLmNzaHRtbA== -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/_ViewStart.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvX1ZpZXdTdGFydC5jc2h0bWw= -build_metadata.AdditionalFiles.CssScope = - -[/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Shared/_Layout.cshtml] -build_metadata.AdditionalFiles.TargetPath = UGFnZXMvU2hhcmVkL19MYXlvdXQuY3NodG1s -build_metadata.AdditionalFiles.CssScope = b-f9kzmymf4l diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GlobalUsings.g.cs b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GlobalUsings.g.cs deleted file mode 100644 index 025530a..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GlobalUsings.g.cs +++ /dev/null @@ -1,17 +0,0 @@ -// -global using global::Microsoft.AspNetCore.Builder; -global using global::Microsoft.AspNetCore.Hosting; -global using global::Microsoft.AspNetCore.Http; -global using global::Microsoft.AspNetCore.Routing; -global using global::Microsoft.Extensions.Configuration; -global using global::Microsoft.Extensions.DependencyInjection; -global using global::Microsoft.Extensions.Hosting; -global using global::Microsoft.Extensions.Logging; -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Net.Http.Json; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.MvcApplicationPartsAssemblyInfo.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.MvcApplicationPartsAssemblyInfo.cache deleted file mode 100644 index e69de29..0000000 diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cache deleted file mode 100644 index f24b41d..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cache +++ /dev/null @@ -1 +0,0 @@ -5860763757f4f08c7ebdea1b3a94a18109f17861 diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cs b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cs deleted file mode 100644 index 31c8eab..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFact" + - "ory, Microsoft.AspNetCore.Mvc.Razor")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.assets.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.assets.cache deleted file mode 100644 index c71b5f4..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.assets.cache and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.AssemblyReference.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.AssemblyReference.cache deleted file mode 100644 index 45b6b40..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.AssemblyReference.cache and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.CoreCompileInputs.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.CoreCompileInputs.cache deleted file mode 100644 index eebb19b..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -65a2e0328bdc095346b5d8c9f56cab36bb5d4bb7 diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.FileListAbsolute.txt b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.FileListAbsolute.txt deleted file mode 100644 index 0fc5336..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,26 +0,0 @@ -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.Development.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/appsettings.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.staticwebassets.runtime.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.deps.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.runtimeconfig.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.dll -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/bin/Debug/net6.0/MyFirstApp.pdb -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.AssemblyReference.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.GeneratedMSBuildEditorConfig.editorconfig -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfoInputs.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.AssemblyInfo.cs -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.csproj.CoreCompileInputs.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.MvcApplicationPartsAssemblyInfo.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.RazorAssemblyInfo.cs -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.build.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.development.json -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/Pages/Shared/_Layout.cshtml.rz.scp.css -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.dll -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/refint/MyFirstApp.dll -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.pdb -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.genruntimeconfig.cache -/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/ref/MyFirstApp.dll diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.dll b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.dll deleted file mode 100644 index 679e4b3..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.dll and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.genruntimeconfig.cache b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.genruntimeconfig.cache deleted file mode 100644 index f03d2d8..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.genruntimeconfig.cache +++ /dev/null @@ -1 +0,0 @@ -6cbddeb52faf2d2519482dc81632d3e9529dfb4c diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.pdb b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.pdb deleted file mode 100644 index 51af1bd..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/MyFirstApp.pdb and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/apphost b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/apphost deleted file mode 100755 index 5e388dc..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/apphost and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/project.razor.json b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/project.razor.json deleted file mode 100644 index 1359103..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/project.razor.json +++ /dev/null @@ -1,16337 +0,0 @@ -{ - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "Configuration": { - "ConfigurationName": "MVC-3.0", - "LanguageVersion": "6.0", - "Extensions": [ - { - "ExtensionName": "MVC-3.0" - } - ] - }, - "ProjectWorkspaceState": { - "TagHelpers": [ - { - "HashCode": 1081274016, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n Combines the behaviors of and ,\n so that it displays the page matching the specified route but only if the user\n is authorized to see it.\n \n Additionally, this component supplies a cascading parameter of type ,\n which makes the user's current authentication state available to descendants.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "AuthorizeRouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "NotAuthorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "NotAuthorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorizing", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Authorizing", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Resource", - "TypeName": "System.Object", - "Documentation": "\n \n The resource to which access is being controlled.\n \n ", - "Metadata": { - "Common.PropertyName": "Resource" - } - }, - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "DefaultLayout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "DefaultLayout" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" - } - }, - { - "HashCode": -389708153, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n Combines the behaviors of and ,\n so that it displays the page matching the specified route but only if the user\n is authorized to see it.\n \n Additionally, this component supplies a cascading parameter of type ,\n which makes the user's current authentication state available to descendants.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "NotAuthorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "NotAuthorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorizing", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Authorizing", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Resource", - "TypeName": "System.Object", - "Documentation": "\n \n The resource to which access is being controlled.\n \n ", - "Metadata": { - "Common.PropertyName": "Resource" - } - }, - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "DefaultLayout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "DefaultLayout" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1009238925, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotAuthorized", - "ParentTag": "AuthorizeRouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 202445887, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotAuthorized", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 132810694, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorizing", - "ParentTag": "AuthorizeRouteView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1251179157, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorizing", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 2139415393, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n Displays differing content depending on the user's authorization status.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Policy", - "TypeName": "System.String", - "Documentation": "\n \n The policy name that determines whether the content can be displayed.\n \n ", - "Metadata": { - "Common.PropertyName": "Policy" - } - }, - { - "Kind": "Components.Component", - "Name": "Roles", - "TypeName": "System.String", - "Documentation": "\n \n A comma delimited list of roles that are allowed to display the content.\n \n ", - "Metadata": { - "Common.PropertyName": "Roles" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "NotAuthorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "NotAuthorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ", - "Metadata": { - "Common.PropertyName": "Authorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorizing", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Authorizing", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Resource", - "TypeName": "System.Object", - "Documentation": "\n \n The resource to which access is being controlled.\n \n ", - "Metadata": { - "Common.PropertyName": "Resource" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - }, - { - "HashCode": -1357386444, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n Displays differing content depending on the user's authorization status.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Policy", - "TypeName": "System.String", - "Documentation": "\n \n The policy name that determines whether the content can be displayed.\n \n ", - "Metadata": { - "Common.PropertyName": "Policy" - } - }, - { - "Kind": "Components.Component", - "Name": "Roles", - "TypeName": "System.String", - "Documentation": "\n \n A comma delimited list of roles that are allowed to display the content.\n \n ", - "Metadata": { - "Common.PropertyName": "Roles" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "NotAuthorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "Metadata": { - "Common.PropertyName": "NotAuthorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorized", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ", - "Metadata": { - "Common.PropertyName": "Authorized", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Authorizing", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Authorizing", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Resource", - "TypeName": "System.Object", - "Documentation": "\n \n The resource to which access is being controlled.\n \n ", - "Metadata": { - "Common.PropertyName": "Resource" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1904422650, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1348266204, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 194126297, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotAuthorized", - "ParentTag": "AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -13841500, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotAuthorized", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1768717622, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorized", - "ParentTag": "AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Authorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -595771843, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorized", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Authorized' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1278061395, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorizing", - "ParentTag": "AuthorizeView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -977333148, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Authorizing", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1247006309, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "CascadingAuthenticationState" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState" - } - }, - { - "HashCode": -1911221714, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -914027712, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "CascadingAuthenticationState" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1177916451, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", - "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1321969461, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.CascadingValue", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that provides a cascading value to all descendant components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "CascadingValue" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to which the value should be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n The value to be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Optionally gives a name to the provided value. Descendant components\n will be able to receive the value by specifying this name.\n \n If no name is specified, then descendant components will receive the\n value based the type of value they are requesting.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "Components.Component", - "Name": "IsFixed", - "TypeName": "System.Boolean", - "Documentation": "\n \n If true, indicates that will not change. This is a\n performance optimization that allows the framework to skip setting up\n change notifications. Set this flag only if you will not change\n during the component's lifetime.\n \n ", - "Metadata": { - "Common.PropertyName": "IsFixed" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": -1269660625, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.CascadingValue", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that provides a cascading value to all descendant components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.CascadingValue" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to which the value should be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n The value to be provided.\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Optionally gives a name to the provided value. Descendant components\n will be able to receive the value by specifying this name.\n \n If no name is specified, then descendant components will receive the\n value based the type of value they are requesting.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "Components.Component", - "Name": "IsFixed", - "TypeName": "System.Boolean", - "Documentation": "\n \n If true, indicates that will not change. This is a\n performance optimization that allows the framework to skip setting up\n change notifications. Set this flag only if you will not change\n during the component's lifetime.\n \n ", - "Metadata": { - "Common.PropertyName": "IsFixed" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1272737721, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n The content to which the value should be provided.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "CascadingValue" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1617627066, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n The content to which the value should be provided.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.CascadingValue" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -430954939, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.DynamicComponent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that renders another component dynamically according to its\n parameter.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "DynamicComponent" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Type", - "TypeName": "System.Type", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the type of the component to be rendered. The supplied type must\n implement .\n \n ", - "Metadata": { - "Common.PropertyName": "Type" - } - }, - { - "Kind": "Components.Component", - "Name": "Parameters", - "TypeName": "System.Collections.Generic.IDictionary", - "Documentation": "\n \n Gets or sets a dictionary of parameters to be passed to the component.\n \n ", - "Metadata": { - "Common.PropertyName": "Parameters" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent" - } - }, - { - "HashCode": -752429937, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.DynamicComponent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that renders another component dynamically according to its\n parameter.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.DynamicComponent" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Type", - "TypeName": "System.Type", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the type of the component to be rendered. The supplied type must\n implement .\n \n ", - "Metadata": { - "Common.PropertyName": "Type" - } - }, - { - "Kind": "Components.Component", - "Name": "Parameters", - "TypeName": "System.Collections.Generic.IDictionary", - "Documentation": "\n \n Gets or sets a dictionary of parameters to be passed to the component.\n \n ", - "Metadata": { - "Common.PropertyName": "Parameters" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -705921341, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.LayoutView", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Displays the specified content inside the specified layout and any further\n nested layouts.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "LayoutView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to display.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Layout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of the layout in which to display the content.\n The type must implement and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "Layout" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView" - } - }, - { - "HashCode": -1103925038, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.LayoutView", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Displays the specified content inside the specified layout and any further\n nested layouts.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.LayoutView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to display.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Layout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of the layout in which to display the content.\n The type must implement and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "Layout" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1046226187, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "LayoutView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1020449274, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.LayoutView" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1898103368, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.RouteView", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Displays the specified page component, rendering it inside its layout\n and any further nested layouts.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "RouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "DefaultLayout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "DefaultLayout" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView" - } - }, - { - "HashCode": 2118908084, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.RouteView", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Displays the specified page component, rendering it inside its layout\n and any further nested layouts.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.RouteView" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "DefaultLayout", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ", - "Metadata": { - "Common.PropertyName": "DefaultLayout" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 954618990, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.Router", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that supplies route data corresponding to the current navigation state.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Router" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AppAssembly", - "TypeName": "System.Reflection.Assembly", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the assembly that should be searched for components matching the URI.\n \n ", - "Metadata": { - "Common.PropertyName": "AppAssembly" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAssemblies", - "TypeName": "System.Collections.Generic.IEnumerable", - "Documentation": "\n \n Gets or sets a collection of additional assemblies that should be searched for components\n that can match URIs.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAssemblies" - } - }, - { - "Kind": "Components.Component", - "Name": "NotFound", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ", - "Metadata": { - "Common.PropertyName": "NotFound", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Found", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ", - "Metadata": { - "Common.PropertyName": "Found", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Navigating", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Navigating", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnNavigateAsync", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a handler that should be called before navigating to a new page.\n \n ", - "Metadata": { - "Common.PropertyName": "OnNavigateAsync", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "PreferExactMatches", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a flag to indicate whether route matching should prefer exact matches\n over wildcards.\n This property is obsolete and configuring it does nothing.\n \n ", - "Metadata": { - "Common.PropertyName": "PreferExactMatches" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router" - } - }, - { - "HashCode": 159568528, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.Router", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n A component that supplies route data corresponding to the current navigation state.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Routing.Router" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AppAssembly", - "TypeName": "System.Reflection.Assembly", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the assembly that should be searched for components matching the URI.\n \n ", - "Metadata": { - "Common.PropertyName": "AppAssembly" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAssemblies", - "TypeName": "System.Collections.Generic.IEnumerable", - "Documentation": "\n \n Gets or sets a collection of additional assemblies that should be searched for components\n that can match URIs.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAssemblies" - } - }, - { - "Kind": "Components.Component", - "Name": "NotFound", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ", - "Metadata": { - "Common.PropertyName": "NotFound", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Found", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "IsEditorRequired": true, - "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ", - "Metadata": { - "Common.PropertyName": "Found", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Navigating", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ", - "Metadata": { - "Common.PropertyName": "Navigating", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnNavigateAsync", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a handler that should be called before navigating to a new page.\n \n ", - "Metadata": { - "Common.PropertyName": "OnNavigateAsync", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "PreferExactMatches", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a flag to indicate whether route matching should prefer exact matches\n over wildcards.\n This property is obsolete and configuring it does nothing.\n \n ", - "Metadata": { - "Common.PropertyName": "PreferExactMatches" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -443563012, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotFound", - "ParentTag": "Router" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1704675953, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NotFound", - "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1779950362, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.Found", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Found", - "ParentTag": "Router" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Found' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Found", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1932231143, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.Found", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Found", - "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Found' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Found", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -323595332, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Navigating", - "ParentTag": "Router" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1387349974, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Navigating", - "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -972763729, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", - "AssemblyName": "Microsoft.AspNetCore.Components.Forms", - "Documentation": "\n \n Adds Data Annotations validation support to an .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "DataAnnotationsValidator" - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator" - } - }, - { - "HashCode": 429710446, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", - "AssemblyName": "Microsoft.AspNetCore.Components.Forms", - "Documentation": "\n \n Adds Data Annotations validation support to an .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator" - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 2097261562, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Renders a form element that cascades an to descendants.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "EditForm" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created form element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "EditContext", - "TypeName": "Microsoft.AspNetCore.Components.Forms.EditContext", - "Documentation": "\n \n Supplies the edit context explicitly. If using this parameter, do not\n also supply , since the model value will be taken\n from the property.\n \n ", - "Metadata": { - "Common.PropertyName": "EditContext" - } - }, - { - "Kind": "Components.Component", - "Name": "Model", - "TypeName": "System.Object", - "Documentation": "\n \n Specifies the top-level model object for the form. An edit context will\n be constructed for this model. If using this parameter, do not also supply\n a value for .\n \n ", - "Metadata": { - "Common.PropertyName": "Model" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted.\n \n If using this parameter, you are responsible for triggering any validation\n manually, e.g., by calling .\n \n ", - "Metadata": { - "Common.PropertyName": "OnSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnValidSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be valid.\n \n ", - "Metadata": { - "Common.PropertyName": "OnValidSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnInvalidSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be invalid.\n \n ", - "Metadata": { - "Common.PropertyName": "OnInvalidSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm" - } - }, - { - "HashCode": 591191882, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Renders a form element that cascades an to descendants.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.EditForm" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created form element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "EditContext", - "TypeName": "Microsoft.AspNetCore.Components.Forms.EditContext", - "Documentation": "\n \n Supplies the edit context explicitly. If using this parameter, do not\n also supply , since the model value will be taken\n from the property.\n \n ", - "Metadata": { - "Common.PropertyName": "EditContext" - } - }, - { - "Kind": "Components.Component", - "Name": "Model", - "TypeName": "System.Object", - "Documentation": "\n \n Specifies the top-level model object for the form. An edit context will\n be constructed for this model. If using this parameter, do not also supply\n a value for .\n \n ", - "Metadata": { - "Common.PropertyName": "Model" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted.\n \n If using this parameter, you are responsible for triggering any validation\n manually, e.g., by calling .\n \n ", - "Metadata": { - "Common.PropertyName": "OnSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnValidSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be valid.\n \n ", - "Metadata": { - "Common.PropertyName": "OnValidSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OnInvalidSubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be invalid.\n \n ", - "Metadata": { - "Common.PropertyName": "OnInvalidSubmit", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1510141435, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "EditForm" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -708822926, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Forms.EditForm" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1744401047, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputCheckbox" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox" - } - }, - { - "HashCode": -1135528606, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1947249558, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing date values.\n Supported types are and .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputDate" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputDate component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "Type", - "TypeName": "Microsoft.AspNetCore.Components.Forms.InputDateType", - "IsEnum": true, - "Documentation": "\n \n Gets or sets the type of HTML input to be rendered.\n \n ", - "Metadata": { - "Common.PropertyName": "Type" - } - }, - { - "Kind": "Components.Component", - "Name": "ParsingErrorMessage", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ", - "Metadata": { - "Common.PropertyName": "ParsingErrorMessage" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": 2064692112, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing date values.\n Supported types are and .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputDate" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputDate component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "Type", - "TypeName": "Microsoft.AspNetCore.Components.Forms.InputDateType", - "IsEnum": true, - "Documentation": "\n \n Gets or sets the type of HTML input to be rendered.\n \n ", - "Metadata": { - "Common.PropertyName": "Type" - } - }, - { - "Kind": "Components.Component", - "Name": "ParsingErrorMessage", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ", - "Metadata": { - "Common.PropertyName": "ParsingErrorMessage" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1233870825, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A component that wraps the HTML file input element and supplies a for each file's contents.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputFile" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "OnChange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets the event callback that will be invoked when the collection of selected files changes.\n \n ", - "Metadata": { - "Common.PropertyName": "OnChange", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputFile" - } - }, - { - "HashCode": -151457881, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A component that wraps the HTML file input element and supplies a for each file's contents.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputFile" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "OnChange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets the event callback that will be invoked when the collection of selected files changes.\n \n ", - "Metadata": { - "Common.PropertyName": "OnChange", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputFile", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -761873811, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing numeric values.\n Supported numeric types are , , , , , .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputNumber" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputNumber component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ParsingErrorMessage", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ", - "Metadata": { - "Common.PropertyName": "ParsingErrorMessage" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": 2089055266, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing numeric values.\n Supported numeric types are , , , , , .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputNumber" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputNumber component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ParsingErrorMessage", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ", - "Metadata": { - "Common.PropertyName": "ParsingErrorMessage" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1574721922, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component used for selecting a value from a group of choices.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputRadio" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadio component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of this input.\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the name of the parent input radio group.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadio", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": -1852192094, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component used for selecting a value from a group of choices.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputRadio" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadio component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of this input.\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the name of the parent input radio group.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadio", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 2145594278, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Groups child components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputRadioGroup" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadioGroup component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the .\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the name of the group.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": 505211750, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Groups child components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadioGroup component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the .\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Name", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the name of the group.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1666773181, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "InputRadioGroup" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1192298338, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 642487211, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A dropdown selection component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputSelect" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputSelect component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the select element.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": -868509744, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A dropdown selection component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputSelect" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputSelect component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the select element.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "TValue", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -560007121, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the select element.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "InputSelect" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 2078754726, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content to be rendering inside the select element.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Forms.InputSelect" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1486606736, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputText", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputText" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputText" - } - }, - { - "HashCode": -642953594, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputText", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n An input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputText" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputText", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -963445416, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A multiline input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputTextArea" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputTextArea" - } - }, - { - "HashCode": -1997890857, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A multiline input component for editing values.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputTextArea" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "Value", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueChanged", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueChanged", - "Components.EventCallback": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ValueExpression", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ", - "Metadata": { - "Common.PropertyName": "ValueExpression" - } - }, - { - "Kind": "Components.Component", - "Name": "DisplayName", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ", - "Metadata": { - "Common.PropertyName": "DisplayName" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1387129802, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Displays a list of validation messages for a specified field within a cascaded .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ValidationMessage" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.ValidationMessage component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created div element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "For", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Specifies the field for which validation messages should be displayed.\n \n ", - "Metadata": { - "Common.PropertyName": "For", - "Components.GenericTyped": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": -1492509569, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Displays a list of validation messages for a specified field within a cascaded .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.ValidationMessage" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TValue", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.ValidationMessage component.", - "Metadata": { - "Common.PropertyName": "TValue", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created div element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "For", - "TypeName": "System.Linq.Expressions.Expression>", - "Documentation": "\n \n Specifies the field for which validation messages should be displayed.\n \n ", - "Metadata": { - "Common.PropertyName": "For", - "Components.GenericTyped": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -928200159, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Displays a list of validation messages from a cascaded .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ValidationSummary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Model", - "TypeName": "System.Object", - "Documentation": "\n \n Gets or sets the model to produce the list of validation messages for.\n When specified, this lists all errors that are associated with the model instance.\n \n ", - "Metadata": { - "Common.PropertyName": "Model" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created ul element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationSummary" - } - }, - { - "HashCode": -989284794, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Displays a list of validation messages from a cascaded .\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.ValidationSummary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "Model", - "TypeName": "System.Object", - "Documentation": "\n \n Gets or sets the model to produce the list of validation messages for.\n When specified, this lists all errors that are associated with the model instance.\n \n ", - "Metadata": { - "Common.PropertyName": "Model" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created ul element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 354846505, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n After navigating from one page to another, sets focus to an element\n matching a CSS selector. This can be used to build an accessible\n navigation system compatible with screen readers.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "FocusOnNavigate" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "Documentation": "\n \n Gets or sets the route data. This can be obtained from an enclosing\n component.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "Selector", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a CSS selector describing the element to be focused after\n navigation between pages.\n \n ", - "Metadata": { - "Common.PropertyName": "Selector" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate" - } - }, - { - "HashCode": 2441776, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n After navigating from one page to another, sets focus to an element\n matching a CSS selector. This can be used to build an accessible\n navigation system compatible with screen readers.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "RouteData", - "TypeName": "Microsoft.AspNetCore.Components.RouteData", - "Documentation": "\n \n Gets or sets the route data. This can be obtained from an enclosing\n component.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteData" - } - }, - { - "Kind": "Components.Component", - "Name": "Selector", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a CSS selector describing the element to be focused after\n navigation between pages.\n \n ", - "Metadata": { - "Common.PropertyName": "Selector" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -758569168, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A component that renders an anchor tag, automatically toggling its 'active'\n class based on whether its 'href' matches the current URI.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "NavLink" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ActiveClass", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the CSS class name applied to the NavLink when the\n current route matches the NavLink href.\n \n ", - "Metadata": { - "Common.PropertyName": "ActiveClass" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be added to the generated\n a element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content of the component.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Match", - "TypeName": "Microsoft.AspNetCore.Components.Routing.NavLinkMatch", - "IsEnum": true, - "Documentation": "\n \n Gets or sets a value representing the URL matching behavior.\n \n ", - "Metadata": { - "Common.PropertyName": "Match" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink" - } - }, - { - "HashCode": -2130011587, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n A component that renders an anchor tag, automatically toggling its 'active'\n class based on whether its 'href' matches the current URI.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Routing.NavLink" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ActiveClass", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the CSS class name applied to the NavLink when the\n current route matches the NavLink href.\n \n ", - "Metadata": { - "Common.PropertyName": "ActiveClass" - } - }, - { - "Kind": "Components.Component", - "Name": "AdditionalAttributes", - "TypeName": "System.Collections.Generic.IReadOnlyDictionary", - "Documentation": "\n \n Gets or sets a collection of additional attributes that will be added to the generated\n a element.\n \n ", - "Metadata": { - "Common.PropertyName": "AdditionalAttributes" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the child content of the component.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Match", - "TypeName": "Microsoft.AspNetCore.Components.Routing.NavLinkMatch", - "IsEnum": true, - "Documentation": "\n \n Gets or sets a value representing the URL matching behavior.\n \n ", - "Metadata": { - "Common.PropertyName": "Match" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 562561368, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content of the component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "NavLink" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 673346237, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the child content of the component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Routing.NavLink" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -569502728, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Provides content to components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "HeadContent" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to be rendered in instances.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent" - } - }, - { - "HashCode": -2065062555, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Provides content to components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Web.HeadContent" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to be rendered in instances.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1509470285, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the content to be rendered in instances.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "HeadContent" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1219090381, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the content to be rendered in instances.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.HeadContent" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -509594751, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Renders content provided by components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "HeadOutlet" - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadOutlet" - } - }, - { - "HashCode": -1075522493, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Renders content provided by components.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Web.HeadOutlet" - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadOutlet", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 2037659784, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Enables rendering an HTML <title> to a component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "PageTitle" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to be rendered as the document title.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle" - } - }, - { - "HashCode": 1540549713, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Enables rendering an HTML <title> to a component.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Web.PageTitle" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the content to be rendered as the document title.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 317499149, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the content to be rendered as the document title.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "PageTitle" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1056161708, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the content to be rendered as the document title.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.PageTitle" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1776616634, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Captures errors thrown from its child content.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ErrorBoundary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to be displayed when there is no error.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ErrorContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to be displayed when there is an error.\n \n ", - "Metadata": { - "Common.PropertyName": "ErrorContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "MaximumErrorCount", - "TypeName": "System.Int32", - "Documentation": "\n \n The maximum number of errors that can be handled. If more errors are received,\n they will be treated as fatal. Calling resets the count.\n \n ", - "Metadata": { - "Common.PropertyName": "MaximumErrorCount" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" - } - }, - { - "HashCode": -2027893100, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Captures errors thrown from its child content.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to be displayed when there is no error.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ErrorContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n The content to be displayed when there is an error.\n \n ", - "Metadata": { - "Common.PropertyName": "ErrorContent", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "MaximumErrorCount", - "TypeName": "System.Int32", - "Documentation": "\n \n The maximum number of errors that can be handled. If more errors are received,\n they will be treated as fatal. Calling resets the count.\n \n ", - "Metadata": { - "Common.PropertyName": "MaximumErrorCount" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1705391582, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n The content to be displayed when there is no error.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "ErrorBoundary" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 380801012, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n The content to be displayed when there is no error.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -551796428, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n The content to be displayed when there is an error.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ErrorContent", - "ParentTag": "ErrorBoundary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ErrorContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -1617066044, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n The content to be displayed when there is an error.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ErrorContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ErrorContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1572152540, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Provides functionality for rendering a virtualized list of items.\n \n The context type for the items being rendered.\n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TItem", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TItem for the Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize component.", - "Metadata": { - "Common.PropertyName": "TItem", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemContent", - "Components.ChildContent": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Placeholder", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the template for items that have not yet been loaded in memory.\n \n ", - "Metadata": { - "Common.PropertyName": "Placeholder", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemSize", - "TypeName": "System.Single", - "Documentation": "\n \n Gets the size of each item in pixels. Defaults to 50px.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemSize" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemsProvider", - "TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderDelegate", - "Documentation": "\n \n Gets or sets the function providing items to the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemsProvider", - "Components.DelegateSignature": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Items", - "TypeName": "System.Collections.Generic.ICollection", - "Documentation": "\n \n Gets or sets the fixed item source.\n \n ", - "Metadata": { - "Common.PropertyName": "Items", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OverscanCount", - "TypeName": "System.Int32", - "Documentation": "\n \n Gets or sets a value that determines how many additional items will be rendered\n before and after the visible region. This help to reduce the frequency of rendering\n during scrolling. However, higher values mean that more elements will be present\n in the page.\n \n ", - "Metadata": { - "Common.PropertyName": "OverscanCount" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", - "Components.GenericTyped": "True" - } - }, - { - "HashCode": -1554301439, - "Kind": "Components.Component", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Provides functionality for rendering a virtualized list of items.\n \n The context type for the items being rendered.\n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Component", - "Name": "TItem", - "TypeName": "System.Type", - "Documentation": "Specifies the type of the type parameter TItem for the Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize component.", - "Metadata": { - "Common.PropertyName": "TItem", - "Components.TypeParameter": "True", - "Components.TypeParameterIsCascading": "False" - } - }, - { - "Kind": "Components.Component", - "Name": "ChildContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ChildContent", - "Components.ChildContent": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemContent", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemContent", - "Components.ChildContent": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Placeholder", - "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", - "Documentation": "\n \n Gets or sets the template for items that have not yet been loaded in memory.\n \n ", - "Metadata": { - "Common.PropertyName": "Placeholder", - "Components.ChildContent": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemSize", - "TypeName": "System.Single", - "Documentation": "\n \n Gets the size of each item in pixels. Defaults to 50px.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemSize" - } - }, - { - "Kind": "Components.Component", - "Name": "ItemsProvider", - "TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderDelegate", - "Documentation": "\n \n Gets or sets the function providing items to the list.\n \n ", - "Metadata": { - "Common.PropertyName": "ItemsProvider", - "Components.DelegateSignature": "True", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "Items", - "TypeName": "System.Collections.Generic.ICollection", - "Documentation": "\n \n Gets or sets the fixed item source.\n \n ", - "Metadata": { - "Common.PropertyName": "Items", - "Components.GenericTyped": "True" - } - }, - { - "Kind": "Components.Component", - "Name": "OverscanCount", - "TypeName": "System.Int32", - "Documentation": "\n \n Gets or sets a value that determines how many additional items will be rendered\n before and after the visible region. This help to reduce the frequency of rendering\n during scrolling. However, higher values mean that more elements will be present\n in the page.\n \n ", - "Metadata": { - "Common.PropertyName": "OverscanCount" - } - }, - { - "Kind": "Components.Component", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for all child content expressions.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.IComponent", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", - "Components.GenericTyped": "True", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1959303845, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -125086791, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ChildContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1713405970, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ItemContent", - "ParentTag": "Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ItemContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": 1106972515, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the item template for the list.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "ItemContent", - "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'ItemContent' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -505307982, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the template for items that have not yet been loaded in memory.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Placeholder", - "ParentTag": "Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Placeholder' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", - "Components.IsSpecialKind": "Components.ChildContent" - } - }, - { - "HashCode": -363885222, - "Kind": "Components.ChildContent", - "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "\n \n Gets or sets the template for items that have not yet been loaded in memory.\n \n ", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Placeholder", - "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" - } - ], - "BoundAttributes": [ - { - "Kind": "Components.ChildContent", - "Name": "Context", - "TypeName": "System.String", - "Documentation": "Specifies the parameter name for the 'Placeholder' child content expression.", - "Metadata": { - "Components.ChildContentParameterName": "True", - "Common.PropertyName": "Context" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", - "Components.IsSpecialKind": "Components.ChildContent", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1789532393, - "Kind": "Components.EventHandler", - "Name": "onfocus", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onfocus' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocus", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocus:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocus:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onfocus", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onfocus' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onfocus" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onfocus' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onfocus' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.FocusEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1017801456, - "Kind": "Components.EventHandler", - "Name": "onblur", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onblur' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onblur", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onblur:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onblur:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onblur", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onblur' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onblur" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onblur' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onblur' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.FocusEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -134636275, - "Kind": "Components.EventHandler", - "Name": "onfocusin", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onfocusin' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusin", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusin:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusin:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onfocusin", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onfocusin' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onfocusin" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onfocusin' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onfocusin' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.FocusEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 511477543, - "Kind": "Components.EventHandler", - "Name": "onfocusout", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onfocusout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusout", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusout:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfocusout:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onfocusout", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onfocusout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.FocusEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onfocusout" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onfocusout' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onfocusout' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.FocusEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1398727458, - "Kind": "Components.EventHandler", - "Name": "onmouseover", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmouseover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseover", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseover:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseover:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmouseover", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmouseover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmouseover" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmouseover' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmouseover' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1006729173, - "Kind": "Components.EventHandler", - "Name": "onmouseout", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmouseout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseout", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseout:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseout:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmouseout", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmouseout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmouseout" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmouseout' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmouseout' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 85678362, - "Kind": "Components.EventHandler", - "Name": "onmousemove", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmousemove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousemove", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousemove:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousemove:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmousemove", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmousemove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmousemove" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmousemove' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmousemove' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -865526259, - "Kind": "Components.EventHandler", - "Name": "onmousedown", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmousedown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousedown", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousedown:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousedown:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmousedown", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmousedown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmousedown" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmousedown' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmousedown' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1201114478, - "Kind": "Components.EventHandler", - "Name": "onmouseup", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmouseup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseup", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseup:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmouseup:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmouseup", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmouseup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmouseup" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmouseup' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmouseup' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1506041475, - "Kind": "Components.EventHandler", - "Name": "onclick", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onclick' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onclick", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onclick:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onclick:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onclick", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onclick' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onclick" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onclick' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onclick' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -2075480765, - "Kind": "Components.EventHandler", - "Name": "ondblclick", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondblclick' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondblclick", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondblclick:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondblclick:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondblclick", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondblclick' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondblclick" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondblclick' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondblclick' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 179013195, - "Kind": "Components.EventHandler", - "Name": "onwheel", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onwheel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.WheelEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwheel", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwheel:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwheel:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onwheel", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onwheel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.WheelEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onwheel" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onwheel' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onwheel' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.WheelEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1400966292, - "Kind": "Components.EventHandler", - "Name": "onmousewheel", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onmousewheel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.WheelEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousewheel", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousewheel:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onmousewheel:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onmousewheel", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onmousewheel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.WheelEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onmousewheel" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onmousewheel' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onmousewheel' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.WheelEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1935870908, - "Kind": "Components.EventHandler", - "Name": "oncontextmenu", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncontextmenu' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncontextmenu", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncontextmenu:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncontextmenu:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncontextmenu", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncontextmenu' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.MouseEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncontextmenu" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncontextmenu' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncontextmenu' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.MouseEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1598735957, - "Kind": "Components.EventHandler", - "Name": "ondrag", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondrag' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrag", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrag:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrag:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondrag", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondrag' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondrag" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondrag' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondrag' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1156310613, - "Kind": "Components.EventHandler", - "Name": "ondragend", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondragend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragend", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragend:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragend:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondragend", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondragend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondragend" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondragend' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondragend' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -786747449, - "Kind": "Components.EventHandler", - "Name": "ondragenter", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondragenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragenter", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragenter:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragenter:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondragenter", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondragenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondragenter" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondragenter' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondragenter' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -977629131, - "Kind": "Components.EventHandler", - "Name": "ondragleave", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondragleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragleave", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragleave:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragleave:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondragleave", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondragleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondragleave" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondragleave' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondragleave' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -2007377331, - "Kind": "Components.EventHandler", - "Name": "ondragover", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondragover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragover", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragover:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragover:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondragover", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondragover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondragover" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondragover' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondragover' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 2112864248, - "Kind": "Components.EventHandler", - "Name": "ondragstart", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondragstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragstart", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragstart:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondragstart:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondragstart", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondragstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondragstart" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondragstart' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondragstart' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1932076348, - "Kind": "Components.EventHandler", - "Name": "ondrop", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondrop' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrop", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrop:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondrop:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondrop", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondrop' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.DragEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondrop" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondrop' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondrop' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.DragEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1289445966, - "Kind": "Components.EventHandler", - "Name": "onkeydown", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onkeydown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeydown", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeydown:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeydown:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onkeydown", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onkeydown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onkeydown" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onkeydown' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onkeydown' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.KeyboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1110002703, - "Kind": "Components.EventHandler", - "Name": "onkeyup", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onkeyup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeyup", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeyup:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeyup:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onkeyup", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onkeyup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onkeyup" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onkeyup' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onkeyup' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.KeyboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -159151326, - "Kind": "Components.EventHandler", - "Name": "onkeypress", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onkeypress' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeypress", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeypress:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onkeypress:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onkeypress", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onkeypress' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.KeyboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onkeypress" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onkeypress' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onkeypress' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.KeyboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1000769877, - "Kind": "Components.EventHandler", - "Name": "onchange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onchange' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.ChangeEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onchange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onchange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onchange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onchange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onchange' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.ChangeEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onchange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onchange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onchange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.ChangeEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1913821194, - "Kind": "Components.EventHandler", - "Name": "oninput", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oninput' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.ChangeEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninput", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninput:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninput:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oninput", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oninput' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.ChangeEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oninput" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oninput' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oninput' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.ChangeEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1711555756, - "Kind": "Components.EventHandler", - "Name": "oninvalid", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oninvalid' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninvalid", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninvalid:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oninvalid:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oninvalid", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oninvalid' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oninvalid" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oninvalid' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oninvalid' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1168851796, - "Kind": "Components.EventHandler", - "Name": "onreset", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onreset' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreset", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreset:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreset:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onreset", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onreset' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onreset" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onreset' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onreset' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 329903210, - "Kind": "Components.EventHandler", - "Name": "onselect", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onselect' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselect", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselect:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselect:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onselect", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onselect' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onselect" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onselect' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onselect' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -890864947, - "Kind": "Components.EventHandler", - "Name": "onselectstart", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onselectstart' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectstart", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectstart:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectstart:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onselectstart", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onselectstart' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onselectstart" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onselectstart' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onselectstart' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 455975615, - "Kind": "Components.EventHandler", - "Name": "onselectionchange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onselectionchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectionchange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectionchange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onselectionchange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onselectionchange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onselectionchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onselectionchange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onselectionchange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onselectionchange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -262439704, - "Kind": "Components.EventHandler", - "Name": "onsubmit", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onsubmit' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsubmit", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsubmit:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsubmit:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onsubmit", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onsubmit' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onsubmit" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onsubmit' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onsubmit' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -337888436, - "Kind": "Components.EventHandler", - "Name": "onbeforecopy", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onbeforecopy' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecopy", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecopy:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecopy:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onbeforecopy", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onbeforecopy' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onbeforecopy" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onbeforecopy' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onbeforecopy' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1560204472, - "Kind": "Components.EventHandler", - "Name": "onbeforecut", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onbeforecut' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecut", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecut:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforecut:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onbeforecut", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onbeforecut' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onbeforecut" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onbeforecut' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onbeforecut' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1449185609, - "Kind": "Components.EventHandler", - "Name": "onbeforepaste", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onbeforepaste' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforepaste", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforepaste:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforepaste:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onbeforepaste", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onbeforepaste' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onbeforepaste" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onbeforepaste' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onbeforepaste' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -206298553, - "Kind": "Components.EventHandler", - "Name": "oncopy", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncopy' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncopy", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncopy:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncopy:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncopy", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncopy' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncopy" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncopy' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncopy' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ClipboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -769406694, - "Kind": "Components.EventHandler", - "Name": "oncut", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncut' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncut", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncut:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncut:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncut", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncut' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncut" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncut' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncut' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ClipboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1959924268, - "Kind": "Components.EventHandler", - "Name": "onpaste", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpaste' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpaste", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpaste:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpaste:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpaste", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpaste' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ClipboardEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpaste" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpaste' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpaste' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ClipboardEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -804883417, - "Kind": "Components.EventHandler", - "Name": "ontouchcancel", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchcancel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchcancel", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchcancel:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchcancel:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchcancel", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchcancel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchcancel" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchcancel' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchcancel' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 363272434, - "Kind": "Components.EventHandler", - "Name": "ontouchend", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchend", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchend:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchend:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchend", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchend" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchend' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchend' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -189485911, - "Kind": "Components.EventHandler", - "Name": "ontouchmove", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchmove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchmove", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchmove:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchmove:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchmove", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchmove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchmove" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchmove' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchmove' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 314886330, - "Kind": "Components.EventHandler", - "Name": "ontouchstart", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchstart", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchstart:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchstart:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchstart", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchstart" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchstart' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchstart' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1794231411, - "Kind": "Components.EventHandler", - "Name": "ontouchenter", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchenter", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchenter:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchenter:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchenter", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchenter" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchenter' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchenter' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1448266670, - "Kind": "Components.EventHandler", - "Name": "ontouchleave", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontouchleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchleave", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchleave:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontouchleave:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontouchleave", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontouchleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.TouchEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontouchleave" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontouchleave' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontouchleave' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.TouchEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1638679829, - "Kind": "Components.EventHandler", - "Name": "ongotpointercapture", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ongotpointercapture' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ongotpointercapture", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ongotpointercapture:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ongotpointercapture:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ongotpointercapture", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ongotpointercapture' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ongotpointercapture" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ongotpointercapture' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ongotpointercapture' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1952066017, - "Kind": "Components.EventHandler", - "Name": "onlostpointercapture", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onlostpointercapture' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onlostpointercapture", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onlostpointercapture:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onlostpointercapture:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onlostpointercapture", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onlostpointercapture' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onlostpointercapture" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onlostpointercapture' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onlostpointercapture' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1026326839, - "Kind": "Components.EventHandler", - "Name": "onpointercancel", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointercancel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointercancel", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointercancel:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointercancel:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointercancel", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointercancel' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointercancel" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointercancel' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointercancel' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -494772935, - "Kind": "Components.EventHandler", - "Name": "onpointerdown", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerdown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerdown", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerdown:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerdown:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerdown", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerdown' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerdown" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerdown' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerdown' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -716414836, - "Kind": "Components.EventHandler", - "Name": "onpointerenter", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerenter", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerenter:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerenter:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerenter", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerenter' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerenter" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerenter' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerenter' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1241770114, - "Kind": "Components.EventHandler", - "Name": "onpointerleave", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerleave", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerleave:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerleave:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerleave", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerleave' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerleave" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerleave' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerleave' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 854585530, - "Kind": "Components.EventHandler", - "Name": "onpointermove", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointermove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointermove", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointermove:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointermove:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointermove", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointermove' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointermove" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointermove' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointermove' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 501583875, - "Kind": "Components.EventHandler", - "Name": "onpointerout", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerout", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerout:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerout:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerout", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerout" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerout' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerout' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -317059870, - "Kind": "Components.EventHandler", - "Name": "onpointerover", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerover", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerover:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerover:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerover", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerover' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerover" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerover' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerover' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1034061214, - "Kind": "Components.EventHandler", - "Name": "onpointerup", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerup", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerup:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerup:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerup", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerup' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.PointerEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerup" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerup' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerup' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.PointerEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1915829404, - "Kind": "Components.EventHandler", - "Name": "oncanplay", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncanplay' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplay", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplay:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplay:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncanplay", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncanplay' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncanplay" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncanplay' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncanplay' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -89589410, - "Kind": "Components.EventHandler", - "Name": "oncanplaythrough", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncanplaythrough' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplaythrough", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplaythrough:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncanplaythrough:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncanplaythrough", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncanplaythrough' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncanplaythrough" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncanplaythrough' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncanplaythrough' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1812408529, - "Kind": "Components.EventHandler", - "Name": "oncuechange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@oncuechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncuechange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncuechange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@oncuechange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@oncuechange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@oncuechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "oncuechange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@oncuechange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@oncuechange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 697987736, - "Kind": "Components.EventHandler", - "Name": "ondurationchange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondurationchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondurationchange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondurationchange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondurationchange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondurationchange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondurationchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondurationchange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondurationchange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondurationchange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 420362066, - "Kind": "Components.EventHandler", - "Name": "onemptied", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onemptied' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onemptied", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onemptied:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onemptied:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onemptied", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onemptied' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onemptied" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onemptied' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onemptied' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 511397821, - "Kind": "Components.EventHandler", - "Name": "onpause", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpause' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpause", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpause:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpause:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpause", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpause' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpause" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpause' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpause' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -380777093, - "Kind": "Components.EventHandler", - "Name": "onplay", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onplay' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplay", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplay:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplay:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onplay", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onplay' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onplay" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onplay' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onplay' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 448756579, - "Kind": "Components.EventHandler", - "Name": "onplaying", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onplaying' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplaying", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplaying:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onplaying:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onplaying", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onplaying' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onplaying" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onplaying' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onplaying' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 2087567607, - "Kind": "Components.EventHandler", - "Name": "onratechange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onratechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onratechange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onratechange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onratechange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onratechange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onratechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onratechange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onratechange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onratechange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -89300192, - "Kind": "Components.EventHandler", - "Name": "onseeked", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onseeked' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeked", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeked:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeked:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onseeked", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onseeked' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onseeked" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onseeked' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onseeked' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -190742186, - "Kind": "Components.EventHandler", - "Name": "onseeking", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onseeking' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeking", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeking:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onseeking:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onseeking", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onseeking' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onseeking" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onseeking' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onseeking' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1560642123, - "Kind": "Components.EventHandler", - "Name": "onstalled", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onstalled' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstalled", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstalled:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstalled:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onstalled", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onstalled' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onstalled" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onstalled' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onstalled' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1557492368, - "Kind": "Components.EventHandler", - "Name": "onstop", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onstop' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstop", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstop:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onstop:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onstop", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onstop' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onstop" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onstop' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onstop' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1456000833, - "Kind": "Components.EventHandler", - "Name": "onsuspend", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onsuspend' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsuspend", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsuspend:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onsuspend:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onsuspend", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onsuspend' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onsuspend" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onsuspend' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onsuspend' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1835477728, - "Kind": "Components.EventHandler", - "Name": "ontimeupdate", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontimeupdate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeupdate", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeupdate:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeupdate:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontimeupdate", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontimeupdate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontimeupdate" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontimeupdate' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontimeupdate' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -627498260, - "Kind": "Components.EventHandler", - "Name": "onvolumechange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onvolumechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onvolumechange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onvolumechange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onvolumechange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onvolumechange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onvolumechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onvolumechange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onvolumechange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onvolumechange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -438789263, - "Kind": "Components.EventHandler", - "Name": "onwaiting", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onwaiting' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwaiting", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwaiting:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onwaiting:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onwaiting", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onwaiting' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onwaiting" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onwaiting' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onwaiting' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 749416995, - "Kind": "Components.EventHandler", - "Name": "onloadstart", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onloadstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadstart", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadstart:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadstart:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onloadstart", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onloadstart' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onloadstart" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onloadstart' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onloadstart' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 155801971, - "Kind": "Components.EventHandler", - "Name": "ontimeout", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontimeout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeout", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeout:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontimeout:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontimeout", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontimeout' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontimeout" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontimeout' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontimeout' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1773306844, - "Kind": "Components.EventHandler", - "Name": "onabort", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onabort' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onabort", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onabort:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onabort:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onabort", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onabort' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onabort" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onabort' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onabort' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1836521317, - "Kind": "Components.EventHandler", - "Name": "onload", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onload' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onload", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onload:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onload:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onload", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onload' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onload" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onload' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onload' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1229828106, - "Kind": "Components.EventHandler", - "Name": "onloadend", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onloadend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadend", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadend:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadend:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onloadend", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onloadend' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onloadend" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onloadend' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onloadend' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -912462392, - "Kind": "Components.EventHandler", - "Name": "onprogress", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onprogress' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onprogress", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onprogress:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onprogress:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onprogress", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onprogress' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ProgressEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onprogress" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onprogress' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onprogress' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ProgressEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 76247035, - "Kind": "Components.EventHandler", - "Name": "onerror", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onerror' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ErrorEventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onerror", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onerror:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onerror:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onerror", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onerror' attribute to the provided string or delegate value. A delegate value should be of type 'Microsoft.AspNetCore.Components.Web.ErrorEventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onerror" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onerror' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onerror' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "Microsoft.AspNetCore.Components.Web.ErrorEventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 772550051, - "Kind": "Components.EventHandler", - "Name": "onactivate", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onactivate", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onactivate:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onactivate:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onactivate", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onactivate" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onactivate' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onactivate' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -24140406, - "Kind": "Components.EventHandler", - "Name": "onbeforeactivate", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onbeforeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforeactivate", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforeactivate:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforeactivate:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onbeforeactivate", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onbeforeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onbeforeactivate" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onbeforeactivate' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onbeforeactivate' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -282061073, - "Kind": "Components.EventHandler", - "Name": "onbeforedeactivate", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onbeforedeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforedeactivate", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforedeactivate:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onbeforedeactivate:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onbeforedeactivate", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onbeforedeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onbeforedeactivate" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onbeforedeactivate' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onbeforedeactivate' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1612887843, - "Kind": "Components.EventHandler", - "Name": "ondeactivate", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ondeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondeactivate", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondeactivate:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ondeactivate:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ondeactivate", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ondeactivate' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ondeactivate" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ondeactivate' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ondeactivate' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 811224790, - "Kind": "Components.EventHandler", - "Name": "onended", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onended' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onended", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onended:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onended:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onended", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onended' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onended" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onended' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onended' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 239304857, - "Kind": "Components.EventHandler", - "Name": "onfullscreenchange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onfullscreenchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenchange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenchange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenchange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onfullscreenchange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onfullscreenchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onfullscreenchange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onfullscreenchange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onfullscreenchange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 1570958886, - "Kind": "Components.EventHandler", - "Name": "onfullscreenerror", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onfullscreenerror' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenerror", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenerror:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onfullscreenerror:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onfullscreenerror", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onfullscreenerror' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onfullscreenerror" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onfullscreenerror' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onfullscreenerror' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1690564351, - "Kind": "Components.EventHandler", - "Name": "onloadeddata", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onloadeddata' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadeddata", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadeddata:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadeddata:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onloadeddata", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onloadeddata' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onloadeddata" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onloadeddata' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onloadeddata' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -40757024, - "Kind": "Components.EventHandler", - "Name": "onloadedmetadata", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onloadedmetadata' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadedmetadata", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadedmetadata:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onloadedmetadata:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onloadedmetadata", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onloadedmetadata' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onloadedmetadata" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onloadedmetadata' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onloadedmetadata' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 879208784, - "Kind": "Components.EventHandler", - "Name": "onpointerlockchange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerlockchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockchange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockchange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockchange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerlockchange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerlockchange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerlockchange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerlockchange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerlockchange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 987671293, - "Kind": "Components.EventHandler", - "Name": "onpointerlockerror", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onpointerlockerror' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockerror", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockerror:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onpointerlockerror:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onpointerlockerror", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onpointerlockerror' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onpointerlockerror" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onpointerlockerror' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onpointerlockerror' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -1847456739, - "Kind": "Components.EventHandler", - "Name": "onreadystatechange", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onreadystatechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreadystatechange", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreadystatechange:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onreadystatechange:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onreadystatechange", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onreadystatechange' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onreadystatechange" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onreadystatechange' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onreadystatechange' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 37840575, - "Kind": "Components.EventHandler", - "Name": "onscroll", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@onscroll' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onscroll", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onscroll:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@onscroll:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@onscroll", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@onscroll' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "onscroll" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@onscroll' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@onscroll' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": 2361060, - "Kind": "Components.EventHandler", - "Name": "ontoggle", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Sets the '@ontoggle' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontoggle", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontoggle:preventDefault", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - }, - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ontoggle:stopPropagation", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.EventHandler", - "Name": "@ontoggle", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Sets the '@ontoggle' attribute to the provided string or delegate value. A delegate value should be of type 'System.EventArgs'.", - "Metadata": { - "Components.IsWeaklyTyped": "True", - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "ontoggle" - }, - "BoundAttributeParameters": [ - { - "Name": "preventDefault", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to cancel (if cancelable) the default action that belongs to the '@ontoggle' event.", - "Metadata": { - "Common.PropertyName": "PreventDefault" - } - }, - { - "Name": "stopPropagation", - "TypeName": "System.Boolean", - "Documentation": "Specifies whether to prevent further propagation of the '@ontoggle' event in the capturing and bubbling phases.", - "Metadata": { - "Common.PropertyName": "StopPropagation" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.EventHandler", - "Components.EventHandler.EventArgs": "System.EventArgs", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.EventHandlers" - } - }, - { - "HashCode": -566620735, - "Kind": "Components.Splat", - "Name": "Attributes", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Merges a collection of attributes into the current element or component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@attributes", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Splat", - "Name": "@attributes", - "TypeName": "System.Object", - "Documentation": "Merges a collection of attributes into the current element or component.", - "Metadata": { - "Common.PropertyName": "Attributes", - "Common.DirectiveAttribute": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Splat", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Attributes" - } - }, - { - "HashCode": 2116021939, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.Razor.TagHelpers.UrlResolutionTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.Razor", - "Documentation": "\n \n implementation targeting elements containing attributes with URL expected values.\n \n Resolves URLs starting with '~/' (relative to the application's 'webroot' setting) that are not\n targeted by other s. Runs prior to other s to ensure\n application-relative URLs are resolved.\n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "itemid", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "href", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "applet", - "Attributes": [ - { - "Name": "archive", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "area", - "TagStructure": 2, - "Attributes": [ - { - "Name": "href", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "audio", - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "base", - "TagStructure": 2, - "Attributes": [ - { - "Name": "href", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "blockquote", - "Attributes": [ - { - "Name": "cite", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "formaction", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "del", - "Attributes": [ - { - "Name": "cite", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "embed", - "TagStructure": 2, - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "form", - "Attributes": [ - { - "Name": "action", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "html", - "Attributes": [ - { - "Name": "manifest", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "iframe", - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "img", - "TagStructure": 2, - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "img", - "TagStructure": 2, - "Attributes": [ - { - "Name": "srcset", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "formaction", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "ins", - "Attributes": [ - { - "Name": "cite", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "href", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "menuitem", - "Attributes": [ - { - "Name": "icon", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "object", - "Attributes": [ - { - "Name": "archive", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "object", - "Attributes": [ - { - "Name": "data", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "q", - "Attributes": [ - { - "Name": "cite", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "source", - "TagStructure": 2, - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "source", - "TagStructure": 2, - "Attributes": [ - { - "Name": "srcset", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "track", - "TagStructure": 2, - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "video", - "Attributes": [ - { - "Name": "src", - "Value": "~/", - "ValueComparison": 2 - } - ] - }, - { - "TagName": "video", - "Attributes": [ - { - "Name": "poster", - "Value": "~/", - "ValueComparison": 2 - } - ] - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.Razor.TagHelpers.UrlResolutionTagHelper" - } - }, - { - "HashCode": 1354971439, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <a> elements.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-action" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-controller" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-area" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-page" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-page-handler" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-fragment" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-host" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-protocol" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-route" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-all-route-data" - } - ] - }, - { - "TagName": "a", - "Attributes": [ - { - "Name": "asp-route-", - "NameComparison": 1 - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-action", - "TypeName": "System.String", - "Documentation": "\n \n The name of the action method.\n \n \n Must be null if or is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Action" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-controller", - "TypeName": "System.String", - "Documentation": "\n \n The name of the controller.\n \n \n Must be null if or is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Controller" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-area", - "TypeName": "System.String", - "Documentation": "\n \n The name of the area.\n \n \n Must be null if is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Area" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page.\n \n \n Must be null if or , \n is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Page" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page-handler", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page handler.\n \n \n Must be null if or , or \n is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "PageHandler" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-protocol", - "TypeName": "System.String", - "Documentation": "\n \n The protocol for the URL, such as \"http\" or \"https\".\n \n ", - "Metadata": { - "Common.PropertyName": "Protocol" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-host", - "TypeName": "System.String", - "Documentation": "\n \n The host name.\n \n ", - "Metadata": { - "Common.PropertyName": "Host" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fragment", - "TypeName": "System.String", - "Documentation": "\n \n The URL fragment name.\n \n ", - "Metadata": { - "Common.PropertyName": "Fragment" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-route", - "TypeName": "System.String", - "Documentation": "\n \n Name of the route.\n \n \n Must be null if one of , , \n or is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Route" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-all-route-data", - "TypeName": "System.Collections.Generic.IDictionary", - "IndexerNamePrefix": "asp-route-", - "IndexerTypeName": "System.String", - "Documentation": "\n \n Additional parameters for the route.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteValues" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper" - } - }, - { - "HashCode": -87315987, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.CacheTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <cache> elements.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "cache" - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "priority", - "TypeName": "Microsoft.Extensions.Caching.Memory.CacheItemPriority?", - "Documentation": "\n \n Gets or sets the policy for the cache entry.\n \n ", - "Metadata": { - "Common.PropertyName": "Priority" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryBy" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-header", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of HTTP request headers to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByHeader" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-query", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of query parameters to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByQuery" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-route", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of route data parameters to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByRoute" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-cookie", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of cookie names to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByCookie" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-user", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a value that determines if the cached result is to be varied by the Identity for the logged in\n .\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByUser" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-culture", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a value that determines if the cached result is to be varied by request culture.\n \n Setting this to true would result in the result to be varied by \n and .\n \n \n ", - "Metadata": { - "Common.PropertyName": "VaryByCulture" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-on", - "TypeName": "System.DateTimeOffset?", - "Documentation": "\n \n Gets or sets the exact the cache entry should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresOn" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-after", - "TypeName": "System.TimeSpan?", - "Documentation": "\n \n Gets or sets the duration, from the time the cache entry was added, when it should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresAfter" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-sliding", - "TypeName": "System.TimeSpan?", - "Documentation": "\n \n Gets or sets the duration from last access that the cache entry should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresSliding" - } - }, - { - "Kind": "ITagHelper", - "Name": "enabled", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets the value which determines if the tag helper is enabled or not.\n \n ", - "Metadata": { - "Common.PropertyName": "Enabled" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.CacheTagHelper" - } - }, - { - "HashCode": -130714980, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.ComponentTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n A that renders a Razor component.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "component", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "params", - "TypeName": "System.Collections.Generic.IDictionary", - "IndexerNamePrefix": "param-", - "IndexerTypeName": "System.Object", - "Documentation": "\n \n Gets or sets values for component parameters.\n \n ", - "Metadata": { - "Common.PropertyName": "Parameters" - } - }, - { - "Kind": "ITagHelper", - "Name": "type", - "TypeName": "System.Type", - "Documentation": "\n \n Gets or sets the component type. This value is required.\n \n ", - "Metadata": { - "Common.PropertyName": "ComponentType" - } - }, - { - "Kind": "ITagHelper", - "Name": "render-mode", - "TypeName": "Microsoft.AspNetCore.Mvc.Rendering.RenderMode", - "IsEnum": true, - "Documentation": "\n \n Gets or sets the \n \n ", - "Metadata": { - "Common.PropertyName": "RenderMode" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.ComponentTagHelper" - } - }, - { - "HashCode": 596850360, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.DistributedCacheTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <distributed-cache> elements.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "distributed-cache", - "Attributes": [ - { - "Name": "name" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "name", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a unique name to discriminate cached entries.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryBy" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-header", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of HTTP request headers to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByHeader" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-query", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of query parameters to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByQuery" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-route", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of route data parameters to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByRoute" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-cookie", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets a comma-delimited set of cookie names to vary the cached result by.\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByCookie" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-user", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a value that determines if the cached result is to be varied by the Identity for the logged in\n .\n \n ", - "Metadata": { - "Common.PropertyName": "VaryByUser" - } - }, - { - "Kind": "ITagHelper", - "Name": "vary-by-culture", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets a value that determines if the cached result is to be varied by request culture.\n \n Setting this to true would result in the result to be varied by \n and .\n \n \n ", - "Metadata": { - "Common.PropertyName": "VaryByCulture" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-on", - "TypeName": "System.DateTimeOffset?", - "Documentation": "\n \n Gets or sets the exact the cache entry should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresOn" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-after", - "TypeName": "System.TimeSpan?", - "Documentation": "\n \n Gets or sets the duration, from the time the cache entry was added, when it should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresAfter" - } - }, - { - "Kind": "ITagHelper", - "Name": "expires-sliding", - "TypeName": "System.TimeSpan?", - "Documentation": "\n \n Gets or sets the duration from last access that the cache entry should be evicted.\n \n ", - "Metadata": { - "Common.PropertyName": "ExpiresSliding" - } - }, - { - "Kind": "ITagHelper", - "Name": "enabled", - "TypeName": "System.Boolean", - "Documentation": "\n \n Gets or sets the value which determines if the tag helper is enabled or not.\n \n ", - "Metadata": { - "Common.PropertyName": "Enabled" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.DistributedCacheTagHelper" - } - }, - { - "HashCode": -1009681149, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.EnvironmentTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <environment> elements that conditionally renders\n content based on the current value of .\n If the environment is not listed in the specified or ,\n or if it is in , the content will not be rendered.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "environment" - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "names", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of environment names in which the content should be rendered.\n If the current environment is also in the list, the content will not be rendered.\n \n \n The specified environment names are compared case insensitively to the current value of\n .\n \n ", - "Metadata": { - "Common.PropertyName": "Names" - } - }, - { - "Kind": "ITagHelper", - "Name": "include", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of environment names in which the content should be rendered.\n If the current environment is also in the list, the content will not be rendered.\n \n \n The specified environment names are compared case insensitively to the current value of\n .\n \n ", - "Metadata": { - "Common.PropertyName": "Include" - } - }, - { - "Kind": "ITagHelper", - "Name": "exclude", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of environment names in which the content will not be rendered.\n \n \n The specified environment names are compared case insensitively to the current value of\n .\n \n ", - "Metadata": { - "Common.PropertyName": "Exclude" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.EnvironmentTagHelper" - } - }, - { - "HashCode": 694145677, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.FormActionTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <button> elements and <input> elements with\n their type attribute set to image or submit.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-action" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-controller" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-area" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-page" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-page-handler" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-fragment" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-route" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-all-route-data" - } - ] - }, - { - "TagName": "button", - "Attributes": [ - { - "Name": "asp-route-", - "NameComparison": 1 - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-action" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-controller" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-area" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-page" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-page-handler" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-fragment" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-route" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-all-route-data" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "image", - "ValueComparison": 1 - }, - { - "Name": "asp-route-", - "NameComparison": 1 - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-action" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-controller" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-area" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-page" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-page-handler" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-fragment" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-route" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-all-route-data" - } - ] - }, - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "type", - "Value": "submit", - "ValueComparison": 1 - }, - { - "Name": "asp-route-", - "NameComparison": 1 - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-action", - "TypeName": "System.String", - "Documentation": "\n \n The name of the action method.\n \n ", - "Metadata": { - "Common.PropertyName": "Action" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-controller", - "TypeName": "System.String", - "Documentation": "\n \n The name of the controller.\n \n ", - "Metadata": { - "Common.PropertyName": "Controller" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-area", - "TypeName": "System.String", - "Documentation": "\n \n The name of the area.\n \n ", - "Metadata": { - "Common.PropertyName": "Area" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page.\n \n ", - "Metadata": { - "Common.PropertyName": "Page" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page-handler", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page handler.\n \n ", - "Metadata": { - "Common.PropertyName": "PageHandler" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fragment", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the URL fragment.\n \n ", - "Metadata": { - "Common.PropertyName": "Fragment" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-route", - "TypeName": "System.String", - "Documentation": "\n \n Name of the route.\n \n \n Must be null if or is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Route" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-all-route-data", - "TypeName": "System.Collections.Generic.IDictionary", - "IndexerNamePrefix": "asp-route-", - "IndexerTypeName": "System.String", - "Documentation": "\n \n Additional parameters for the route.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteValues" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.FormActionTagHelper" - } - }, - { - "HashCode": -602495193, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.FormTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <form> elements.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "form" - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-action", - "TypeName": "System.String", - "Documentation": "\n \n The name of the action method.\n \n ", - "Metadata": { - "Common.PropertyName": "Action" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-controller", - "TypeName": "System.String", - "Documentation": "\n \n The name of the controller.\n \n ", - "Metadata": { - "Common.PropertyName": "Controller" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-area", - "TypeName": "System.String", - "Documentation": "\n \n The name of the area.\n \n ", - "Metadata": { - "Common.PropertyName": "Area" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page.\n \n ", - "Metadata": { - "Common.PropertyName": "Page" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-page-handler", - "TypeName": "System.String", - "Documentation": "\n \n The name of the page handler.\n \n ", - "Metadata": { - "Common.PropertyName": "PageHandler" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-antiforgery", - "TypeName": "System.Boolean?", - "Documentation": "\n \n Whether the antiforgery token should be generated.\n \n Defaults to false if user provides an action attribute\n or if the method is ; true otherwise.\n ", - "Metadata": { - "Common.PropertyName": "Antiforgery" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fragment", - "TypeName": "System.String", - "Documentation": "\n \n Gets or sets the URL fragment.\n \n ", - "Metadata": { - "Common.PropertyName": "Fragment" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-route", - "TypeName": "System.String", - "Documentation": "\n \n Name of the route.\n \n \n Must be null if or is non-null.\n \n ", - "Metadata": { - "Common.PropertyName": "Route" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-all-route-data", - "TypeName": "System.Collections.Generic.IDictionary", - "IndexerNamePrefix": "asp-route-", - "IndexerTypeName": "System.String", - "Documentation": "\n \n Additional parameters for the route.\n \n ", - "Metadata": { - "Common.PropertyName": "RouteValues" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.FormTagHelper" - } - }, - { - "HashCode": -880959341, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.ImageTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <img> elements that supports file versioning.\n \n \n The tag helper won't process for cases with just the 'src' attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "img", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-append-version" - }, - { - "Name": "src" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "src", - "TypeName": "System.String", - "Documentation": "\n \n Source of the image.\n \n \n Passed through to the generated HTML in all cases.\n \n ", - "Metadata": { - "Common.PropertyName": "Src" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-append-version", - "TypeName": "System.Boolean", - "Documentation": "\n \n Value indicating if file version should be appended to the src urls.\n \n \n If true then a query string \"v\" with the encoded content of the file is added.\n \n ", - "Metadata": { - "Common.PropertyName": "AppendVersion" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.ImageTagHelper" - } - }, - { - "HashCode": -1879011166, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <input> elements with an asp-for attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "input", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-for" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n An expression to be evaluated against the current model.\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-format", - "TypeName": "System.String", - "Documentation": "\n \n The format string (see https://msdn.microsoft.com/en-us/library/txafckwd.aspx) used to format the\n result. Sets the generated \"value\" attribute to that formatted string.\n \n \n Not used if the provided (see ) or calculated \"type\" attribute value is\n checkbox, password, or radio. That is, is used when calling\n .\n \n ", - "Metadata": { - "Common.PropertyName": "Format" - } - }, - { - "Kind": "ITagHelper", - "Name": "type", - "TypeName": "System.String", - "Documentation": "\n \n The type of the <input> element.\n \n \n Passed through to the generated HTML in all cases. Also used to determine the \n helper to call and the default value. A default is not calculated\n if the provided (see ) or calculated \"type\" attribute value is checkbox,\n hidden, password, or radio.\n \n ", - "Metadata": { - "Common.PropertyName": "InputTypeName" - } - }, - { - "Kind": "ITagHelper", - "Name": "name", - "TypeName": "System.String", - "Documentation": "\n \n The name of the <input> element.\n \n \n Passed through to the generated HTML in all cases. Also used to determine whether is\n valid with an empty .\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "ITagHelper", - "Name": "value", - "TypeName": "System.String", - "Documentation": "\n \n The value of the <input> element.\n \n \n Passed through to the generated HTML in all cases. Also used to determine the generated \"checked\" attribute\n if is \"radio\". Must not be null in that case.\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper" - } - }, - { - "HashCode": 2022594585, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <label> elements with an asp-for attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "label", - "Attributes": [ - { - "Name": "asp-for" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n An expression to be evaluated against the current model.\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper" - } - }, - { - "HashCode": 915282617, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <link> elements that supports fallback href paths.\n \n \n The tag helper won't process for cases with just the 'href' attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-href-include" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-href-exclude" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-href" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-href-include" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-href-exclude" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-test-class" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-test-property" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-fallback-test-value" - } - ] - }, - { - "TagName": "link", - "TagStructure": 2, - "Attributes": [ - { - "Name": "asp-append-version" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "href", - "TypeName": "System.String", - "Documentation": "\n \n Address of the linked resource.\n \n \n Passed through to the generated HTML in all cases.\n \n ", - "Metadata": { - "Common.PropertyName": "Href" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-href-include", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of CSS stylesheets to load.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n \n ", - "Metadata": { - "Common.PropertyName": "HrefInclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-href-exclude", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of CSS stylesheets to exclude from loading.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n Must be used in conjunction with .\n \n ", - "Metadata": { - "Common.PropertyName": "HrefExclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-href", - "TypeName": "System.String", - "Documentation": "\n \n The URL of a CSS stylesheet to fallback to in the case the primary one fails.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackHref" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-suppress-fallback-integrity", - "TypeName": "System.Boolean", - "Documentation": "\n \n Boolean value that determines if an integrity hash will be compared with value.\n \n ", - "Metadata": { - "Common.PropertyName": "SuppressFallbackIntegrity" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-append-version", - "TypeName": "System.Boolean?", - "Documentation": "\n \n Value indicating if file version should be appended to the href urls.\n \n \n If true then a query string \"v\" with the encoded content of the file is added.\n \n ", - "Metadata": { - "Common.PropertyName": "AppendVersion" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-href-include", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of CSS stylesheets to fallback to in the case the primary\n one fails.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackHrefInclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-href-exclude", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of CSS stylesheets to exclude from the fallback list, in\n the case the primary one fails.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n Must be used in conjunction with .\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackHrefExclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-test-class", - "TypeName": "System.String", - "Documentation": "\n \n The class name defined in the stylesheet to use for the fallback test.\n Must be used in conjunction with and ,\n and either or .\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackTestClass" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-test-property", - "TypeName": "System.String", - "Documentation": "\n \n The CSS property name to use for the fallback test.\n Must be used in conjunction with and ,\n and either or .\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackTestProperty" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-test-value", - "TypeName": "System.String", - "Documentation": "\n \n The CSS property value to use for the fallback test.\n Must be used in conjunction with and ,\n and either or .\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackTestValue" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper" - } - }, - { - "HashCode": -1667988251, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.OptionTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <option> elements.\n \n \n This works in conjunction with . It reads elements\n content but does not modify that content. The only modification it makes is to add a selected attribute\n in some cases.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "option" - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "value", - "TypeName": "System.String", - "Documentation": "\n \n Specifies a value for the <option> element.\n \n \n Passed through to the generated HTML in all cases.\n \n ", - "Metadata": { - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.OptionTagHelper" - } - }, - { - "HashCode": 667690940, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.PartialTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n Renders a partial view.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "partial", - "TagStructure": 2, - "Attributes": [ - { - "Name": "name" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "name", - "TypeName": "System.String", - "Documentation": "\n \n The name or path of the partial view that is rendered to the response.\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - }, - { - "Kind": "ITagHelper", - "Name": "for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n An expression to be evaluated against the current model. Cannot be used together with .\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - }, - { - "Kind": "ITagHelper", - "Name": "model", - "TypeName": "System.Object", - "Documentation": "\n \n The model to pass into the partial view. Cannot be used together with .\n \n ", - "Metadata": { - "Common.PropertyName": "Model" - } - }, - { - "Kind": "ITagHelper", - "Name": "optional", - "TypeName": "System.Boolean", - "Documentation": "\n \n When optional, executing the tag helper will no-op if the view cannot be located.\n Otherwise will throw stating the view could not be found.\n \n ", - "Metadata": { - "Common.PropertyName": "Optional" - } - }, - { - "Kind": "ITagHelper", - "Name": "fallback-name", - "TypeName": "System.String", - "Documentation": "\n \n View to lookup if the view specified by cannot be located.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackName" - } - }, - { - "Kind": "ITagHelper", - "Name": "view-data", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary", - "IndexerNamePrefix": "view-data-", - "IndexerTypeName": "System.Object", - "Documentation": "\n \n A to pass into the partial view.\n \n ", - "Metadata": { - "Common.PropertyName": "ViewData" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.PartialTagHelper" - } - }, - { - "HashCode": 219602968, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.PersistComponentStateTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n A that saves the state of Razor components rendered on the page up to that point.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "persist-component-state", - "TagStructure": 2 - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "persist-mode", - "TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.PersistenceMode?", - "Documentation": "\n \n Gets or sets the for the state to persist.\n \n ", - "Metadata": { - "Common.PropertyName": "PersistenceMode" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.PersistComponentStateTagHelper" - } - }, - { - "HashCode": -389213365, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <script> elements that supports fallback src paths.\n \n \n The tag helper won't process for cases with just the 'src' attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-src-include" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-src-exclude" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-fallback-src" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-fallback-src-include" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-fallback-src-exclude" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-fallback-test" - } - ] - }, - { - "TagName": "script", - "Attributes": [ - { - "Name": "asp-append-version" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "src", - "TypeName": "System.String", - "Documentation": "\n \n Address of the external script to use.\n \n \n Passed through to the generated HTML in all cases.\n \n ", - "Metadata": { - "Common.PropertyName": "Src" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-src-include", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of JavaScript scripts to load.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n \n ", - "Metadata": { - "Common.PropertyName": "SrcInclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-src-exclude", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of JavaScript scripts to exclude from loading.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n Must be used in conjunction with .\n \n ", - "Metadata": { - "Common.PropertyName": "SrcExclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-src", - "TypeName": "System.String", - "Documentation": "\n \n The URL of a Script tag to fallback to in the case the primary one fails.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackSrc" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-suppress-fallback-integrity", - "TypeName": "System.Boolean", - "Documentation": "\n \n Boolean value that determines if an integrity hash will be compared with value.\n \n ", - "Metadata": { - "Common.PropertyName": "SuppressFallbackIntegrity" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-append-version", - "TypeName": "System.Boolean?", - "Documentation": "\n \n Value indicating if file version should be appended to src urls.\n \n \n A query string \"v\" with the encoded content of the file is added.\n \n ", - "Metadata": { - "Common.PropertyName": "AppendVersion" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-src-include", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of JavaScript scripts to fallback to in the case the\n primary one fails.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackSrcInclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-src-exclude", - "TypeName": "System.String", - "Documentation": "\n \n A comma separated list of globbed file patterns of JavaScript scripts to exclude from the fallback list, in\n the case the primary one fails.\n The glob patterns are assessed relative to the application's 'webroot' setting.\n Must be used in conjunction with .\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackSrcExclude" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-fallback-test", - "TypeName": "System.String", - "Documentation": "\n \n The script method defined in the primary script to use for the fallback test.\n \n ", - "Metadata": { - "Common.PropertyName": "FallbackTestExpression" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper" - } - }, - { - "HashCode": 468159549, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.SelectTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <select> elements with asp-for and/or\n asp-items attribute(s).\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "select", - "Attributes": [ - { - "Name": "asp-for" - } - ] - }, - { - "TagName": "select", - "Attributes": [ - { - "Name": "asp-items" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n An expression to be evaluated against the current model.\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - }, - { - "Kind": "ITagHelper", - "Name": "asp-items", - "TypeName": "System.Collections.Generic.IEnumerable", - "Documentation": "\n \n A collection of objects used to populate the <select> element with\n <optgroup> and <option> elements.\n \n ", - "Metadata": { - "Common.PropertyName": "Items" - } - }, - { - "Kind": "ITagHelper", - "Name": "name", - "TypeName": "System.String", - "Documentation": "\n \n The name of the <input> element.\n \n \n Passed through to the generated HTML in all cases. Also used to determine whether is\n valid with an empty .\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.SelectTagHelper" - } - }, - { - "HashCode": -460997646, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.TextAreaTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting <textarea> elements with an asp-for attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "textarea", - "Attributes": [ - { - "Name": "asp-for" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n An expression to be evaluated against the current model.\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - }, - { - "Kind": "ITagHelper", - "Name": "name", - "TypeName": "System.String", - "Documentation": "\n \n The name of the <input> element.\n \n \n Passed through to the generated HTML in all cases. Also used to determine whether is\n valid with an empty .\n \n ", - "Metadata": { - "Common.PropertyName": "Name" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.TextAreaTagHelper" - } - }, - { - "HashCode": 526412076, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.ValidationMessageTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting any HTML element with an asp-validation-for\n attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "span", - "Attributes": [ - { - "Name": "asp-validation-for" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-validation-for", - "TypeName": "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression", - "Documentation": "\n \n Gets an expression to be evaluated against the current model.\n \n ", - "Metadata": { - "Common.PropertyName": "For" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.ValidationMessageTagHelper" - } - }, - { - "HashCode": -1963969149, - "Kind": "ITagHelper", - "Name": "Microsoft.AspNetCore.Mvc.TagHelpers.ValidationSummaryTagHelper", - "AssemblyName": "Microsoft.AspNetCore.Mvc.TagHelpers", - "Documentation": "\n \n implementation targeting any HTML element with an asp-validation-summary\n attribute.\n \n ", - "CaseSensitive": false, - "TagMatchingRules": [ - { - "TagName": "div", - "Attributes": [ - { - "Name": "asp-validation-summary" - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "ITagHelper", - "Name": "asp-validation-summary", - "TypeName": "Microsoft.AspNetCore.Mvc.Rendering.ValidationSummary", - "IsEnum": true, - "Documentation": "\n \n If or , appends a validation\n summary. Otherwise (, the default), this tag helper does nothing.\n \n \n Thrown if setter is called with an undefined value e.g.\n (ValidationSummary)23.\n \n ", - "Metadata": { - "Common.PropertyName": "ValidationSummary" - } - } - ], - "Metadata": { - "Runtime.Name": "ITagHelper", - "Common.TypeName": "Microsoft.AspNetCore.Mvc.TagHelpers.ValidationSummaryTagHelper" - } - }, - { - "HashCode": -748350674, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to an attribute and a change event, based on the naming of the bind attribute. For example: @bind-value=\"...\" and @bind-value:event=\"onchange\" will assign the current value of the expression to the 'value' attribute, and assign a delegate that attempts to set the value to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@bind-", - "NameComparison": 1, - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-...", - "TypeName": "System.Collections.Generic.Dictionary", - "IndexerNamePrefix": "@bind-", - "IndexerTypeName": "System.Object", - "Documentation": "Binds the provided expression to an attribute and a change event, based on the naming of the bind attribute. For example: @bind-value=\"...\" and @bind-value:event=\"onchange\" will assign the current value of the expression to the 'value' attribute, and assign a delegate that attempts to set the value to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the corresponding bind attribute. For example: @bind-value:format=\"...\" will apply a format string to the value specified in @bind-value=\"...\". The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-...' attribute.", - "Metadata": { - "Common.PropertyName": "Event" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.Fallback": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Bind" - } - }, - { - "HashCode": 1717348657, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -1511237554, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 2089693693, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'checked' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "checkbox", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'checked' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_checked" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_checked" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-checked", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_checked" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "checked", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Components.Bind.TypeAttribute": "checkbox", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -1730392598, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "text", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Components.Bind.TypeAttribute": "text", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -704339159, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "number", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": null, - "Components.Bind.TypeAttribute": "number", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -498975838, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "number", - "ValueComparison": 1 - }, - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": null, - "Components.Bind.TypeAttribute": "number", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -1867080183, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "date", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM-dd", - "Components.Bind.TypeAttribute": "date", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 689555424, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "date", - "ValueComparison": 1 - }, - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM-dd", - "Components.Bind.TypeAttribute": "date", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 460682793, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "datetime-local", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM-ddTHH:mm:ss", - "Components.Bind.TypeAttribute": "datetime-local", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -355986296, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "datetime-local", - "ValueComparison": 1 - }, - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM-ddTHH:mm:ss", - "Components.Bind.TypeAttribute": "datetime-local", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -940320051, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "month", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM", - "Components.Bind.TypeAttribute": "month", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": -630918592, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "month", - "ValueComparison": 1 - }, - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "yyyy-MM", - "Components.Bind.TypeAttribute": "month", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 68410149, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "time", - "ValueComparison": 1 - }, - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "HH:mm:ss", - "Components.Bind.TypeAttribute": "time", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 1375271464, - "Kind": "Components.Bind", - "Name": "Bind_value", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "input", - "Attributes": [ - { - "Name": "type", - "Value": "time", - "ValueComparison": 1 - }, - { - "Name": "@bind-value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-value", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind_value" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-value' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind-value' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "True", - "Components.Bind.Format": "HH:mm:ss", - "Components.Bind.TypeAttribute": "time", - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 766315577, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "select", - "Attributes": [ - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 363633317, - "Kind": "Components.Bind", - "Name": "Bind", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "textarea", - "Attributes": [ - { - "Name": "@bind", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind", - "TypeName": "System.Object", - "Documentation": "Binds the provided expression to the 'value' attribute and a change event delegate to the 'onchange' attribute.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Bind" - }, - "BoundAttributeParameters": [ - { - "Name": "format", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - }, - { - "Name": "event", - "TypeName": "System.String", - "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind' attribute.", - "Metadata": { - "Common.PropertyName": "Event_value" - } - }, - { - "Name": "culture", - "TypeName": "System.Globalization.CultureInfo", - "Documentation": "Specifies the culture to use for conversions.", - "Metadata": { - "Common.PropertyName": "Culture" - } - } - ] - }, - { - "Kind": "Components.Bind", - "Name": "format-value", - "TypeName": "System.String", - "Documentation": "Specifies a format to convert the value specified by the '@bind' attribute. The format string can currently only be used with expressions of type DateTime.", - "Metadata": { - "Common.PropertyName": "Format_value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Common.ClassifyAttributesOnly": "True", - "Components.Bind.ValueAttribute": "value", - "Components.Bind.ChangeAttribute": "onchange", - "Components.Bind.IsInvariantCulture": "False", - "Components.Bind.Format": null, - "Common.TypeName": "Microsoft.AspNetCore.Components.Web.BindAttributes" - } - }, - { - "HashCode": 920472203, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputCheckbox", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox" - } - }, - { - "HashCode": 398275180, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -1616573216, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputDate", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate" - } - }, - { - "HashCode": -1163813007, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputDate", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 732806528, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputNumber", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber" - } - }, - { - "HashCode": -2117887748, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1662772485, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputRadioGroup", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup" - } - }, - { - "HashCode": -1784730108, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1915733305, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputSelect", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect" - } - }, - { - "HashCode": -495209124, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": -2122117929, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputText", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputText", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputText" - } - }, - { - "HashCode": 2098964719, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputText", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputText", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputText", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 1737385514, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "InputTextArea", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputTextArea" - } - }, - { - "HashCode": -685575022, - "Kind": "Components.Bind", - "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "AssemblyName": "Microsoft.AspNetCore.Components.Web", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "Attributes": [ - { - "Name": "@bind-Value", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Bind", - "Name": "@bind-Value", - "TypeName": "Microsoft.AspNetCore.Components.EventCallback", - "Documentation": "Binds the provided expression to the 'Value' property and a change event delegate to the 'ValueChanged' property of the component.", - "Metadata": { - "Common.DirectiveAttribute": "True", - "Common.PropertyName": "Value" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Bind", - "Components.Bind.ValueAttribute": "Value", - "Components.Bind.ChangeAttribute": "ValueChanged", - "Components.Bind.ExpressionAttribute": "ValueExpression", - "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputTextArea", - "Components.NameMatch": "Components.FullyQualifiedNameMatch" - } - }, - { - "HashCode": 2019988594, - "Kind": "Components.Ref", - "Name": "Ref", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Populates the specified field or property with a reference to the element or component.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@ref", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Ref", - "Name": "@ref", - "TypeName": "System.Object", - "Documentation": "Populates the specified field or property with a reference to the element or component.", - "Metadata": { - "Common.PropertyName": "Ref", - "Common.DirectiveAttribute": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Ref", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Ref" - } - }, - { - "HashCode": -89464101, - "Kind": "Components.Key", - "Name": "Key", - "AssemblyName": "Microsoft.AspNetCore.Components", - "Documentation": "Ensures that the component or element will be preserved across renders if (and only if) the supplied key value matches.", - "CaseSensitive": true, - "TagMatchingRules": [ - { - "TagName": "*", - "Attributes": [ - { - "Name": "@key", - "Metadata": { - "Common.DirectiveAttribute": "True" - } - } - ] - } - ], - "BoundAttributes": [ - { - "Kind": "Components.Key", - "Name": "@key", - "TypeName": "System.Object", - "Documentation": "Ensures that the component or element will be preserved across renders if (and only if) the supplied key value matches.", - "Metadata": { - "Common.PropertyName": "Key", - "Common.DirectiveAttribute": "True" - } - } - ], - "Metadata": { - "Runtime.Name": "Components.None", - "Components.IsSpecialKind": "Components.Key", - "Common.ClassifyAttributesOnly": "True", - "Common.TypeName": "Microsoft.AspNetCore.Components.Key" - } - } - ], - "CSharpLanguageVersion": 1000 - }, - "RootNamespace": "MyFirstApp", - "Documents": [ - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Shared/_Layout.cshtml", - "TargetPath": "Pages\\Shared\\_Layout.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Privacy.cshtml", - "TargetPath": "Pages\\Privacy.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Shared/_ValidationScriptsPartial.cshtml", - "TargetPath": "Pages\\Shared\\_ValidationScriptsPartial.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/_ViewImports.cshtml", - "TargetPath": "Pages\\_ViewImports.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/_ViewStart.cshtml", - "TargetPath": "Pages\\_ViewStart.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Error.cshtml", - "TargetPath": "Pages\\Error.cshtml", - "FileKind": "mvc" - }, - { - "FilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/Pages/Index.cshtml", - "TargetPath": "Pages\\Index.cshtml", - "FileKind": "mvc" - } - ], - "SerializationFormat": "0.2" -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/ref/MyFirstApp.dll b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/ref/MyFirstApp.dll deleted file mode 100644 index 8a862fa..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/ref/MyFirstApp.dll and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/refint/MyFirstApp.dll b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/refint/MyFirstApp.dll deleted file mode 100644 index 8a862fa..0000000 Binary files a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/refint/MyFirstApp.dll and /dev/null differ diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/Pages/Shared/_Layout.cshtml.rz.scp.css b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/Pages/Shared/_Layout.cshtml.rz.scp.css deleted file mode 100644 index f1242d3..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/Pages/Shared/_Layout.cshtml.rz.scp.css +++ /dev/null @@ -1,48 +0,0 @@ -/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification -for details on configuring this project to bundle and minify static web assets. */ - -a.navbar-brand[b-f9kzmymf4l] { - white-space: normal; - text-align: center; - word-break: break-all; -} - -a[b-f9kzmymf4l] { - color: #0077cc; -} - -.btn-primary[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.nav-pills .nav-link.active[b-f9kzmymf4l], .nav-pills .show > .nav-link[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.border-top[b-f9kzmymf4l] { - border-top: 1px solid #e5e5e5; -} -.border-bottom[b-f9kzmymf4l] { - border-bottom: 1px solid #e5e5e5; -} - -.box-shadow[b-f9kzmymf4l] { - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); -} - -button.accept-policy[b-f9kzmymf4l] { - font-size: 1rem; - line-height: inherit; -} - -.footer[b-f9kzmymf4l] { - position: absolute; - bottom: 0; - width: 100%; - white-space: nowrap; - line-height: 60px; -} diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css deleted file mode 100644 index 43384a7..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css +++ /dev/null @@ -1,49 +0,0 @@ -/* _content/MyFirstApp/Pages/Shared/_Layout.cshtml.rz.scp.css */ -/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification -for details on configuring this project to bundle and minify static web assets. */ - -a.navbar-brand[b-f9kzmymf4l] { - white-space: normal; - text-align: center; - word-break: break-all; -} - -a[b-f9kzmymf4l] { - color: #0077cc; -} - -.btn-primary[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.nav-pills .nav-link.active[b-f9kzmymf4l], .nav-pills .show > .nav-link[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.border-top[b-f9kzmymf4l] { - border-top: 1px solid #e5e5e5; -} -.border-bottom[b-f9kzmymf4l] { - border-bottom: 1px solid #e5e5e5; -} - -.box-shadow[b-f9kzmymf4l] { - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); -} - -button.accept-policy[b-f9kzmymf4l] { - font-size: 1rem; - line-height: inherit; -} - -.footer[b-f9kzmymf4l] { - position: absolute; - bottom: 0; - width: 100%; - white-space: nowrap; - line-height: 60px; -} diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css deleted file mode 100644 index 43384a7..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css +++ /dev/null @@ -1,49 +0,0 @@ -/* _content/MyFirstApp/Pages/Shared/_Layout.cshtml.rz.scp.css */ -/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification -for details on configuring this project to bundle and minify static web assets. */ - -a.navbar-brand[b-f9kzmymf4l] { - white-space: normal; - text-align: center; - word-break: break-all; -} - -a[b-f9kzmymf4l] { - color: #0077cc; -} - -.btn-primary[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.nav-pills .nav-link.active[b-f9kzmymf4l], .nav-pills .show > .nav-link[b-f9kzmymf4l] { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.border-top[b-f9kzmymf4l] { - border-top: 1px solid #e5e5e5; -} -.border-bottom[b-f9kzmymf4l] { - border-bottom: 1px solid #e5e5e5; -} - -.box-shadow[b-f9kzmymf4l] { - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); -} - -button.accept-policy[b-f9kzmymf4l] { - font-size: 1rem; - line-height: inherit; -} - -.footer[b-f9kzmymf4l] { - position: absolute; - bottom: 0; - width: 100%; - white-space: nowrap; - line-height: 60px; -} diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.build.json b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.build.json deleted file mode 100644 index 7d6d61c..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.build.json +++ /dev/null @@ -1,1074 +0,0 @@ -{ - "Version": 1, - "Hash": "IgEf3SlFw3lDRs12+bJCF4zG/E8j5EARD3WSQCw65SE=", - "Source": "MyFirstApp", - "BasePath": "_content/MyFirstApp", - "Mode": "Default", - "ManifestType": "Build", - "ReferencedProjectsConfiguration": [], - "DiscoveryPatterns": [ - { - "Name": "MyFirstApp/wwwroot", - "Source": "MyFirstApp", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "Pattern": "**" - } - ], - "Assets": [ - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css", - "SourceId": "MyFirstApp", - "SourceType": "Computed", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "MyFirstApp.styles.css", - "AssetKind": "All", - "AssetMode": "CurrentProject", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "ScopedCss", - "AssetTraitValue": "ApplicationBundle", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/MyFirstApp.styles.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css", - "SourceId": "MyFirstApp", - "SourceType": "Computed", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "MyFirstApp.bundle.scp.css", - "AssetKind": "All", - "AssetMode": "Reference", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "ScopedCss", - "AssetTraitValue": "ProjectBundle", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/projectbundle/MyFirstApp.bundle.scp.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/css/site.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "css/site.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/css/site.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/favicon.ico", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "favicon.ico", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/favicon.ico" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/js/site.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "js/site.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/js/site.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.rtl.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.rtl.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.rtl.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.rtl.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.rtl.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.rtl.min.css", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/css/bootstrap.rtl.min.css.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.bundle.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.bundle.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.bundle.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.bundle.min.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.esm.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.esm.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.esm.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.esm.min.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/dist/js/bootstrap.min.js.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/bootstrap/LICENSE", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/bootstrap/LICENSE", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/bootstrap/LICENSE" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation-unobtrusive/LICENSE.txt", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation/dist/additional-methods.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation/dist/additional-methods.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation/dist/additional-methods.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation/dist/additional-methods.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation/dist/additional-methods.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation/dist/additional-methods.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation/dist/jquery.validate.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation/dist/jquery.validate.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation/dist/jquery.validate.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation/dist/jquery.validate.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation/dist/jquery.validate.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery-validation/LICENSE.md", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery-validation/LICENSE.md", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery-validation/LICENSE.md" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery/dist/jquery.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery/dist/jquery.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery/dist/jquery.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery/dist/jquery.min.js", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery/dist/jquery.min.js", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery/dist/jquery.min.js" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery/dist/jquery.min.map", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery/dist/jquery.min.map", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery/dist/jquery.min.map" - }, - { - "Identity": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/lib/jquery/LICENSE.txt", - "SourceId": "MyFirstApp", - "SourceType": "Discovered", - "ContentRoot": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/", - "BasePath": "_content/MyFirstApp", - "RelativePath": "lib/jquery/LICENSE.txt", - "AssetKind": "All", - "AssetMode": "All", - "AssetRole": "Primary", - "RelatedAsset": "", - "AssetTraitName": "", - "AssetTraitValue": "", - "CopyToOutputDirectory": "Never", - "CopyToPublishDirectory": "PreserveNewest", - "OriginalItemSpec": "wwwroot/lib/jquery/LICENSE.txt" - } - ] -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.development.json b/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.development.json deleted file mode 100644 index d92f335..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/staticwebassets.development.json +++ /dev/null @@ -1 +0,0 @@ -{"ContentRoots":["/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/wwwroot/","/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/Debug/net6.0/scopedcss/bundle/"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"js":{"Children":{"site.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"js/site.js"},"Patterns":null}},"Asset":null,"Patterns":null},"lib":{"Children":{"bootstrap":{"Children":{"dist":{"Children":{"css":{"Children":{"bootstrap-grid.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css"},"Patterns":null},"bootstrap-grid.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.css.map"},"Patterns":null},"bootstrap-grid.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css"},"Patterns":null},"bootstrap-grid.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.min.css.map"},"Patterns":null},"bootstrap-grid.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css"},"Patterns":null},"bootstrap-grid.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map"},"Patterns":null},"bootstrap-grid.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css"},"Patterns":null},"bootstrap-grid.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map"},"Patterns":null},"bootstrap-reboot.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css"},"Patterns":null},"bootstrap-reboot.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.css.map"},"Patterns":null},"bootstrap-reboot.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css"},"Patterns":null},"bootstrap-reboot.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.min.css.map"},"Patterns":null},"bootstrap-reboot.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css"},"Patterns":null},"bootstrap-reboot.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map"},"Patterns":null},"bootstrap-reboot.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css"},"Patterns":null},"bootstrap-reboot.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map"},"Patterns":null},"bootstrap-utilities.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css"},"Patterns":null},"bootstrap-utilities.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.css.map"},"Patterns":null},"bootstrap-utilities.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css"},"Patterns":null},"bootstrap-utilities.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.min.css.map"},"Patterns":null},"bootstrap-utilities.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css"},"Patterns":null},"bootstrap-utilities.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map"},"Patterns":null},"bootstrap-utilities.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css"},"Patterns":null},"bootstrap-utilities.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map"},"Patterns":null},"bootstrap.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css"},"Patterns":null},"bootstrap.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.css.map"},"Patterns":null},"bootstrap.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css"},"Patterns":null},"bootstrap.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.min.css.map"},"Patterns":null},"bootstrap.rtl.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css"},"Patterns":null},"bootstrap.rtl.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.css.map"},"Patterns":null},"bootstrap.rtl.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css"},"Patterns":null},"bootstrap.rtl.min.css.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/css/bootstrap.rtl.min.css.map"},"Patterns":null}},"Asset":null,"Patterns":null},"js":{"Children":{"bootstrap.bundle.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js"},"Patterns":null},"bootstrap.bundle.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.js.map"},"Patterns":null},"bootstrap.bundle.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js"},"Patterns":null},"bootstrap.bundle.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.bundle.min.js.map"},"Patterns":null},"bootstrap.esm.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js"},"Patterns":null},"bootstrap.esm.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.js.map"},"Patterns":null},"bootstrap.esm.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js"},"Patterns":null},"bootstrap.esm.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.esm.min.js.map"},"Patterns":null},"bootstrap.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js"},"Patterns":null},"bootstrap.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.js.map"},"Patterns":null},"bootstrap.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js"},"Patterns":null},"bootstrap.min.js.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/dist/js/bootstrap.min.js.map"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/bootstrap/LICENSE"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation-unobtrusive":{"Children":{"jquery.validate.unobtrusive.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"},"Patterns":null},"jquery.validate.unobtrusive.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"},"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation-unobtrusive/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery-validation":{"Children":{"dist":{"Children":{"additional-methods.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.js"},"Patterns":null},"additional-methods.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/additional-methods.min.js"},"Patterns":null},"jquery.validate.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.js"},"Patterns":null},"jquery.validate.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/dist/jquery.validate.min.js"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.md":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery-validation/LICENSE.md"},"Patterns":null}},"Asset":null,"Patterns":null},"jquery":{"Children":{"dist":{"Children":{"jquery.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.js"},"Patterns":null},"jquery.min.js":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.js"},"Patterns":null},"jquery.min.map":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/dist/jquery.min.map"},"Patterns":null}},"Asset":null,"Patterns":null},"LICENSE.txt":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"lib/jquery/LICENSE.txt"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"MyFirstApp.styles.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MyFirstApp.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.dgspec.json b/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.dgspec.json deleted file mode 100644 index 2a854a3..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.dgspec.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "format": 1, - "restore": { - "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj": {} - }, - "projects": { - "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "projectName": "MyFirstApp", - "projectPath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "packagesPath": "/Users/mdivis/.nuget/packages/", - "outputPath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/mdivis/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.AspNetCore.App": { - "privateAssets": "none" - }, - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/6.0.301/RuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.props b/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.props deleted file mode 100644 index e21b074..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - /Users/mdivis/.nuget/packages/ - /Users/mdivis/.nuget/packages/ - PackageReference - 6.2.1 - - - - - \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.targets b/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/MyFirstApp.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/project.assets.json b/testWorkloads/dotnet/MyFirstApp/obj/project.assets.json deleted file mode 100644 index 195ca17..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/project.assets.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": 3, - "targets": { - "net6.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net6.0": [] - }, - "packageFolders": { - "/Users/mdivis/.nuget/packages/": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "projectName": "MyFirstApp", - "projectPath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "packagesPath": "/Users/mdivis/.nuget/packages/", - "outputPath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/mdivis/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.AspNetCore.App": { - "privateAssets": "none" - }, - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/6.0.301/RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/project.nuget.cache b/testWorkloads/dotnet/MyFirstApp/obj/project.nuget.cache deleted file mode 100644 index 8e577a1..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "3gbmkHdBbOGCK7NQrlz3FXibRsAGUcR8XBGeBsO1++3CF2GEof+nMLhHHlbwOZSjhTiOmZDEYnkZ6pdGm9TCtw==", - "success": true, - "projectFilePath": "/Users/mdivis/Documents/appd/autoInstrument/mwhInstrumentor/testWorkloads/dotnet/MyFirstApp/MyFirstApp.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file diff --git a/testWorkloads/dotnet/MyFirstApp/obj/staticwebassets.pack.sentinel b/testWorkloads/dotnet/MyFirstApp/obj/staticwebassets.pack.sentinel deleted file mode 100644 index 25a1697..0000000 --- a/testWorkloads/dotnet/MyFirstApp/obj/staticwebassets.pack.sentinel +++ /dev/null @@ -1,4 +0,0 @@ -2.0 -2.0 -2.0 -2.0 diff --git a/testWorkloads/java/Makefile b/testWorkloads/java/Makefile deleted file mode 100644 index bdd15bc..0000000 --- a/testWorkloads/java/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -images: - docker build upstream -t chrlic/java-test-upstream:v1.0 - docker push chrlic/java-test-upstream:v1.0 - docker build downstream -t chrlic/java-test-downstream:v1.0 - docker push chrlic/java-test-downstream:v1.0 - -deploy: - kubectl apply -f downstream/d-downstream.yaml - kubectl apply -f upstream/d-upstream.yaml - -undeploy: - kubectl delete -f downstream/d-downstream.yaml - kubectl delete -f upstream/d-upstream.yaml - -redeploy: undeploy deploy \ No newline at end of file diff --git a/testWorkloads/java/client.sh b/testWorkloads/java/client.sh deleted file mode 100755 index 25a2b92..0000000 --- a/testWorkloads/java/client.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/bash - -while true -do - curl http://localhost:8383/upstream/hello - echo "" - sleep 20 -done \ No newline at end of file diff --git a/testWorkloads/java/downstream/Dockerfile b/testWorkloads/java/downstream/Dockerfile deleted file mode 100644 index fa4fa77..0000000 --- a/testWorkloads/java/downstream/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Pull base image. -FROM quay.io/centos/centos:stream8 - -# Install Java. -RUN yum update -y -RUN yum install -y java-11-openjdk-devel - -# Add binary source directory as a local working direstory -RUN mkdir /cmd -ADD downstream-0.0.1-SNAPSHOT.jar /cmd -ADD run_downstream.sh /cmd -WORKDIR /cmd -#make entrypoint shellscript executable -RUN chmod +x run_downstream.sh - -# Define commonly used JAVA_HOME variable -ENV JAVA_HOME /usr/lib/jvm/jre-1.11.0-openjdk -ENV CLASSPATH $JAVA_HOME/lib - -EXPOSE 8181 - -# Define entrypoint to start with. -ENTRYPOINT ["/cmd/run_downstream.sh"] - diff --git a/testWorkloads/java/downstream/downstream-0.0.1-SNAPSHOT.jar b/testWorkloads/java/downstream/downstream-0.0.1-SNAPSHOT.jar deleted file mode 100644 index cfae6f2..0000000 Binary files a/testWorkloads/java/downstream/downstream-0.0.1-SNAPSHOT.jar and /dev/null differ diff --git a/testWorkloads/java/downstream/run_downstream.sh b/testWorkloads/java/downstream/run_downstream.sh deleted file mode 100644 index b17b4eb..0000000 --- a/testWorkloads/java/downstream/run_downstream.sh +++ /dev/null @@ -1,13 +0,0 @@ -#! /bin/bash - -trap ctrl_c INT - -function ctrl_c() { - echo "** Trapped CTRL-C" - kill $UPSTREAM_PID -} - - -java -jar downstream-0.0.1-SNAPSHOT.jar --server.port=8181 - - diff --git a/testWorkloads/java/upstream/Dockerfile b/testWorkloads/java/upstream/Dockerfile deleted file mode 100644 index be7e509..0000000 --- a/testWorkloads/java/upstream/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Pull base image. -FROM quay.io/centos/centos:stream8 - -# Install Java. -RUN yum update -y -RUN yum install -y java-11-openjdk-devel - -# Add binary source directory as a local working direstory -RUN mkdir /cmd -ADD upstream-0.0.1-SNAPSHOT.jar /cmd -ADD run_upstream.sh /cmd -WORKDIR /cmd -#make entrypoint shellscript executable -RUN chmod +x run_upstream.sh - -# Define commonly used JAVA_HOME variable -ENV JAVA_HOME /usr/lib/jvm/jre-1.11.0-openjdk -ENV CLASSPATH $JAVA_HOME/lib - -EXPOSE 8181 - -# Define entrypoint to start with. -ENTRYPOINT ["/cmd/run_upstream.sh"] - diff --git a/testWorkloads/java/upstream/d-upstream.yaml b/testWorkloads/java/upstream/d-upstream.yaml deleted file mode 100644 index e6a3890..0000000 --- a/testWorkloads/java/upstream/d-upstream.yaml +++ /dev/null @@ -1,56 +0,0 @@ - -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: r - name: upstream - labels: - app: MD-instr-wh - appdInstr: do - language: java -spec: - replicas: 1 - selector: - matchLabels: - app: upstream - template: - metadata: - labels: - app: upstream - appdApp: MD-instr-wh - appdInstr: do - language: java - spec: - containers: - - name: upstream - image: chrlic/java-test-upstream:v1.0 - imagePullPolicy: Always - ports: - - containerPort: 8181 - env: - - name: DOWNSTREAM_HTTP_URL - value: http://downstream.r.svc.cluster.local:8282/downstream/hello - resources: - limits: - cpu: "1" - memory: 500Mi - requests: - cpu: 250m - memory: 100Mi ---- - -apiVersion: v1 -kind: Service -metadata: - namespace: r - name: upstream - labels: - run: upstream -spec: - ports: - - port: 8383 - targetPort: 8181 - protocol: TCP - selector: - app: upstream - type: LoadBalancer diff --git a/testWorkloads/java/upstream/run_upstream.sh b/testWorkloads/java/upstream/run_upstream.sh deleted file mode 100644 index 1f9e1c7..0000000 --- a/testWorkloads/java/upstream/run_upstream.sh +++ /dev/null @@ -1,13 +0,0 @@ -#! /bin/bash - -trap ctrl_c INT - -function ctrl_c() { - echo "** Trapped CTRL-C" - kill $UPSTREAM_PID -} - - -java -jar upstream-0.0.1-SNAPSHOT.jar --server.port=8181 - - diff --git a/testWorkloads/java/upstream/upstream-0.0.1-SNAPSHOT.jar b/testWorkloads/java/upstream/upstream-0.0.1-SNAPSHOT.jar deleted file mode 100644 index 3afc9da..0000000 Binary files a/testWorkloads/java/upstream/upstream-0.0.1-SNAPSHOT.jar and /dev/null differ diff --git a/testWorkloads/nginx/nginx.yaml b/testWorkloads/nginx/nginx.yaml new file mode 100644 index 0000000..fc34b29 --- /dev/null +++ b/testWorkloads/nginx/nginx.yaml @@ -0,0 +1,91 @@ + +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-conf +data: + nginx.conf: | + # user nginx; + worker_processes 1; + events { + worker_connections 10240; + } + http { + include /etc/nginx/conf.d/*.conf; + server { + listen 8765; + server_name localhost; + location / { + root /usr/share/nginx/html; #Change this line + index index.html index.htm; + } + + location /t { + proxy_pass http://www.seznam.cz/; + } + } + + } + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + labels: + app: nginx +spec: + replicas: 1 + selector: + matchLabels: + app: nginx + template: + metadata: + annotations: + test: testval + labels: + app: nginx + appdApp: My-instr-java-app + otel: appd + language: nginx + spec: + containers: + - name: nginx + image: nginx:1.18.0 + ports: + - containerPort: 8765 + volumeMounts: + - name: nginx-conf + mountPath: /etc/nginx/nginx.conf + subPath: nginx.conf + readOnly: true + imagePullPolicy: Always + resources: + limits: + cpu: "1" + memory: 500Mi + requests: + cpu: 250m + memory: 100Mi + volumes: + - name: nginx-conf + configMap: + name: nginx-conf + items: + - key: nginx.conf + path: nginx.conf + +--- +apiVersion: v1 +kind: Service +metadata: + name: nginx + namespace: r +spec: + type: LoadBalancer + ports: + - port: 8766 + protocol: TCP + targetPort: 8765 + selector: + app: nginx \ No newline at end of file diff --git a/testWorkloads/nodejs/testserver/adi-testserver.yaml b/testWorkloads/nodejs/testserver/adi-testserver.yaml new file mode 100644 index 0000000..517ed1b --- /dev/null +++ b/testWorkloads/nodejs/testserver/adi-testserver.yaml @@ -0,0 +1,10 @@ +apiVersion: ext.appd.com/v1 +kind: AppDynamicsInstrumentation +metadata: + name: testserver + namespace: r +spec: + exclude: + - api: apps/v1 + kind: Deployment + name: testserver \ No newline at end of file diff --git a/testWorkloads/nodejs/testserver/d-testserver.yaml b/testWorkloads/nodejs/testserver/d-testserver.yaml index 059cbbb..e39e38b 100644 --- a/testWorkloads/nodejs/testserver/d-testserver.yaml +++ b/testWorkloads/nodejs/testserver/d-testserver.yaml @@ -18,6 +18,7 @@ spec: appdApp: MD-instr-wh appdInstr: do language: nodejs + # language: uni spec: containers: - name: testserver diff --git a/testWorkloads/nodejs/testserver/package-lock.json b/testWorkloads/nodejs/testserver/package-lock.json new file mode 100644 index 0000000..c9118be --- /dev/null +++ b/testWorkloads/nodejs/testserver/package-lock.json @@ -0,0 +1,1014 @@ +{ + "name": "testserver", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "express": "^4.18.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + } + } +} diff --git a/testWorkloads/nodejs/testserver/package.json b/testWorkloads/nodejs/testserver/package.json new file mode 100644 index 0000000..0e6cd98 --- /dev/null +++ b/testWorkloads/nodejs/testserver/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "express": "^4.18.2" + } +} diff --git a/testWorkloads/nodejs/testserver/server.js b/testWorkloads/nodejs/testserver/server.js index e285ec5..a12853f 100644 --- a/testWorkloads/nodejs/testserver/server.js +++ b/testWorkloads/nodejs/testserver/server.js @@ -1,8 +1,11 @@ -const http = require("http"); +// const http = require("http"); +const express = require('express') +const app = express() const host = '0.0.0.0'; const port = 8000; +/* const requestListener = function (req, res) { res.writeHead(200); res.end("My test server!"); @@ -11,4 +14,33 @@ const requestListener = function (req, res) { const server = http.createServer(requestListener); server.listen(port, host, () => { console.log(`Server is running on http://${host}:${port}`); -}); \ No newline at end of file +}); +*/ + +app.get('/', (req, res) => { + res.send('Hello World!') +}) + +app.get('/api/search', async (req, res) => { + await new Promise(r => setTimeout(r, randomDelay(500, 20))); + res.send('Hello API!') +}) + +app.get('/api/tool', async (req, res) => { + await new Promise(r => setTimeout(r, randomDelay(1000, 20))); + res.send('Hello Tool!') +}) + +app.get('/api/delete/:id/now', async (req, res) => { + await new Promise(r => setTimeout(r, randomDelay(1000, 20))); + res.send('Hello delete!') +}) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) + +function randomDelay(ms, randPct) { + const fluct = ms * randPct / 100 + return ms + Math.floor(Math.random() * fluct) - fluct/2; +} \ No newline at end of file diff --git a/webhook/admission_controller.go b/webhook/admission_controller.go index 1caa4ad..3d3286e 100644 --- a/webhook/admission_controller.go +++ b/webhook/admission_controller.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2019 StackRox Inc. +Copyright (c) 2019 Cisco Systems, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -130,6 +130,7 @@ func doServeAdmitFunc(w http.ResponseWriter, r *http.Request, admit admitFunc) ( } admissionReviewResponse.Response.Allowed = true admissionReviewResponse.Response.Patch = patchBytes + otelAddAttrs(r.Context(), body, patchBytes) // Announce that we are returning a JSON patch (note: this is the only // patch type currently supported, but we have to explicitly announce @@ -151,7 +152,7 @@ func doServeAdmitFunc(w http.ResponseWriter, r *http.Request, admit admitFunc) ( // serveAdmitFunc is a wrapper around doServeAdmitFunc that adds error handling and logging. func serveAdmitFunc(w http.ResponseWriter, r *http.Request, admit admitFunc) { - log.Print("Handling webhook request ...") + // log.Print("Handling webhook request ...") var writeErr error if bytes, err := doServeAdmitFunc(w, r, admit); err != nil { @@ -159,7 +160,7 @@ func serveAdmitFunc(w http.ResponseWriter, r *http.Request, admit admitFunc) { w.WriteHeader(http.StatusInternalServerError) _, writeErr = w.Write([]byte(err.Error())) } else { - log.Print("Webhook request handled successfully") + // log.Print("Webhook request handled successfully") _, writeErr = w.Write(bytes) } diff --git a/webhook/configuration.go b/webhook/configuration.go index f57ac37..362fa8e 100644 --- a/webhook/configuration.go +++ b/webhook/configuration.go @@ -1,3 +1,19 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( @@ -5,10 +21,12 @@ import ( "fmt" "io/ioutil" "log" + "net/http" "os" "path/filepath" "regexp" "sync" + "text/template" "time" v1 "k8s.io/api/core/v1" @@ -39,7 +57,10 @@ type Config struct { MyNamespace string ConfigMapName string ControllerConfig *ControllerConfig + AppdCloudConfig *AppdCloudConfig + TelescopeConfig *TelescopeConfig InstrumentationConfig *InstrumentationConfig + FlexMatchTemplate *template.Template mutex sync.Mutex } @@ -57,6 +78,16 @@ type ControllerConfig struct { ProxyUser string `json:"proxyUser,omitempty" yaml:"proxyUser,omitempty"` ProxyPassword string `json:"proxyPassword,omitempty" yaml:"proxyPassword,omitempty"` ProxyDomain string `json:"proxyDomain,omitempty" yaml:"proxyDomain,omitempty"` + OtelEndpoint string `json:"otelEndpoint,omitempty" yaml:"otelEndpoint,omitempty"` + OtelHeaderKey string `json:"otelHeaderKey,omitempty" yaml:"otelHeaderKey,omitempty"` +} + +type AppdCloudConfig struct { +} + +type TelescopeConfig struct { + TracesEndpoint string `json:"traces_endpoint,omitempty" yaml:"traces_endpoint,omitempty"` + Token string `json:"token,omitempty" yaml:"token,omitempty"` } type MatchRules struct { @@ -67,26 +98,35 @@ type MatchRules struct { } type InjectionRules struct { - Template string `json:"template,omitempty" yaml:"template,omitempty"` - Technology string `json:"technology,omitempty" yaml:"technology,omitempty"` - Image string `json:"image,omitempty" yaml:"image,omitempty"` - JavaEnvVar string `json:"javaEnvVar,omitempty" yaml:"javaEnvVar,omitempty"` - JavaCustomConfig string `json:"javaCustomConfig,omitempty" yaml:"javaCustomConfig,omitempty"` - ApplicationNameSource string `json:"applicationNameSource,omitempty" yaml:"applicationNameSource,omitempty"` // manual,namespace,label,annotation,expression - ApplicationName string `json:"applicationName,omitempty" yaml:"applicationName,omitempty"` - ApplicationNameLabel string `json:"applicationNameLabel,omitempty" yaml:"applicationNameLabel,omitempty"` - ApplicationNameAnnotation string `json:"applicationNameAnnotation,omitempty" yaml:"applicationNameAnnotation,omitempty"` - ApplicationNameExpression string `json:"applicationNameExpression,omitempty" yaml:"applicationNameExpression,omitempty"` - TierNameSource string `json:"tierNameSource,omitempty" yaml:"tierNameSource,omitempty"` // auto,manual,namespace,label,annotation,expression - TierName string `json:"tierName,omitempty" yaml:"tierName,omitempty"` - TierNameLabel string `json:"tierNameLabel,omitempty" yaml:"tierNameLabel,omitempty"` - TierNameAnnotation string `json:"tierNameAnnotation,omitempty" yaml:"tierNameAnnotation,omitempty"` - TierNameExpression string `json:"tierNameExpression,omitempty" yaml:"tierNameExpression,omitempty"` - UsePodNameForNodeName *bool `json:"usePodNameForNodeName,omitempty" yaml:"usePodNameForNodeName,omitempty"` - DoNotInstrument *bool `json:"doNotInstrument,omitempty" yaml:"doNotInstrument,omitempty"` - ResourceReservation *ResourceReservation `json:"resourceReservation,omitempty" yaml:"resourceReservation,omitempty"` - LogLevel string `json:"logLevel,omitempty" yaml:"logLevel,omitempty"` - NetvizPort string `json:"netvizPort,omitempty" yaml:"netvizPort,omitempty"` + Template string `json:"template,omitempty" yaml:"template,omitempty"` + Technology string `json:"technology,omitempty" yaml:"technology,omitempty"` + Image string `json:"image,omitempty" yaml:"image,omitempty"` + JavaEnvVar string `json:"javaEnvVar,omitempty" yaml:"javaEnvVar,omitempty"` + JavaCustomConfig string `json:"javaCustomConfig,omitempty" yaml:"javaCustomConfig,omitempty"` + ApplicationNameSource string `json:"applicationNameSource,omitempty" yaml:"applicationNameSource,omitempty"` // manual,namespace,label,annotation,expression + ApplicationName string `json:"applicationName,omitempty" yaml:"applicationName,omitempty"` + ApplicationNameLabel string `json:"applicationNameLabel,omitempty" yaml:"applicationNameLabel,omitempty"` + ApplicationNameAnnotation string `json:"applicationNameAnnotation,omitempty" yaml:"applicationNameAnnotation,omitempty"` + ApplicationNameExpression string `json:"applicationNameExpression,omitempty" yaml:"applicationNameExpression,omitempty"` + TierNameSource string `json:"tierNameSource,omitempty" yaml:"tierNameSource,omitempty"` // auto,manual,namespace,label,annotation,expression + TierName string `json:"tierName,omitempty" yaml:"tierName,omitempty"` + TierNameLabel string `json:"tierNameLabel,omitempty" yaml:"tierNameLabel,omitempty"` + TierNameAnnotation string `json:"tierNameAnnotation,omitempty" yaml:"tierNameAnnotation,omitempty"` + TierNameExpression string `json:"tierNameExpression,omitempty" yaml:"tierNameExpression,omitempty"` + UsePodNameForNodeName *bool `json:"usePodNameForNodeName,omitempty" yaml:"usePodNameForNodeName,omitempty"` + DoNotInstrument *bool `json:"doNotInstrument,omitempty" yaml:"doNotInstrument,omitempty"` + ResourceReservation *ResourceReservation `json:"resourceReservation,omitempty" yaml:"resourceReservation,omitempty"` + LogLevel string `json:"logLevel,omitempty" yaml:"logLevel,omitempty"` + NetvizPort string `json:"netvizPort,omitempty" yaml:"netvizPort,omitempty"` + OpenTelemetryCollector string `json:"openTelemetryCollector,omitempty" yaml:"openTelemetryCollector,omitempty"` + EnvVars []NameValue `json:"env,omitempty" yaml:"env,omitempty"` + Options []NameValue `json:"options,omitempty" yaml:"options,omitempty"` + InjectK8SOtelResourceAttrs *bool `json:"injectK8SOtelResourceAttrs,omitempty" yaml:"injectK8SOtelResourceAttrs,omitempty"` +} + +type NameValue struct { + Name string `json:"name,omitempty" yaml:"name,omitempty"` + Value string `json:"value,omitempty" yaml:"value,omitempty"` } type ResourceReservation struct { @@ -104,9 +144,10 @@ type InjectionTemplate struct { } type InstrumentationRule struct { - Name string `json:"name,omitempty" yaml:"name,omitempty" ` - MatchRules *MatchRules `json:"matchRules,omitempty" yaml:"matchRules,omitempty"` - InjectionRules *InjectionRules `json:"injectionRules,omitempty" yaml:"injectionRules,omitempty"` + Name string `json:"name,omitempty" yaml:"name,omitempty" ` + MatchRules *MatchRules `json:"matchRules,omitempty" yaml:"matchRules,omitempty"` + InjectionRules *InjectionRules `json:"injectionRules,omitempty" yaml:"injectionRules,omitempty"` + InjectionRuleSet []InjectionRules `json:"injectionRuleSet,omitempty" yaml:"injectionRuleSet,omitempty"` } type groupResource struct { @@ -221,9 +262,15 @@ func updateConfig(obj interface{}) { return } fmt.Printf("ConfigMap Name: %s\n", cm.GetName()) - if cm.Name != config.ConfigMapName { + if cm.Name != config.ConfigMapName && cm.Name != OTEL_COLL_CONFIG_MAP_NAME { return } + + if cm.Name == OTEL_COLL_CONFIG_MAP_NAME { + loadOtelConfig(cm.Data) + return + } + data := cm.Data controller := data["controller"] @@ -246,9 +293,29 @@ func updateConfig(obj interface{}) { } fmt.Printf("Injection templates:\n%s\n", templates) + appdCloud := data["appdCloud"] + if appdCloud == "" { + log.Printf("No appdCloud config specification\n") + } + log.Printf("apodCloud config: \n%s\n", appdCloud) + + telescope := data["telescope"] + if telescope == "" { + log.Printf("No telescope config specification\n") + } + log.Printf("telescope config: \n%s\n", telescope) + + flexMatchConfig := data["flexMatch"] + if telescope == "" { + log.Printf("No flexMatch config specification\n") + } + log.Printf("FlexMatch config: \n%s\n", flexMatchConfig) + controllerConfig := &ControllerConfig{} instrumentationConfig := &InstrumentationConfig{} injectionTemplates := &InjectionTemplates{} + appdCloudConfig := &AppdCloudConfig{} + telescopeConfig := &TelescopeConfig{} err := yaml.Unmarshal([]byte(controller), controllerConfig) if err != nil { @@ -265,7 +332,19 @@ func updateConfig(obj interface{}) { log.Printf("Error parsing injection templates configuration: %v\n", err) return } - fmt.Printf("Controller Config:\n%v\nInstrumentation Config:\n%v\nInjection Templates:\n%v\n", *controllerConfig, *instrumentationConfig, *injectionTemplates) + err = yaml.Unmarshal([]byte(appdCloud), appdCloudConfig) + if err != nil { + log.Printf("Error parsing injection appdCloud configuration: %v\n", err) + return + } + err = yaml.Unmarshal([]byte(telescope), telescopeConfig) + if err != nil { + log.Printf("Error parsing injection telescope configuration: %v\n", err) + return + } + + fmt.Printf("Controller Config:\n%v\nInstrumentation Config:\n%v\nInjection Templates:\n%v\nAppD Cloud:\n%v\nTelescope:\n%v\n", + *controllerConfig, *instrumentationConfig, *injectionTemplates, *appdCloudConfig, *telescopeConfig) // validations valid := true @@ -286,36 +365,61 @@ func updateConfig(obj interface{}) { defer config.mutex.Unlock() config.ControllerConfig = controllerConfig config.InstrumentationConfig = instrumentationConfig + config.TelescopeConfig = telescopeConfig + config.AppdCloudConfig = appdCloudConfig + if flexMatchConfig != "" { + config.FlexMatchTemplate, err = template.New("test").Parse(flexMatchConfig) + if err != nil { + log.Printf("Error parsing flex match template %s: %v\n", flexMatchConfig, err) + config.FlexMatchTemplate = nil + } + } else { + config.FlexMatchTemplate = nil + } } -//apply injection rules defaults +// apply injection rules defaults func applyInjectionRulesDefaults(instrumentationConfig *InstrumentationConfig) { for _, instrRule := range *instrumentationConfig { - injRules := instrRule.InjectionRules - injRules.ApplicationName = applyTemplateString(injRules.ApplicationName, "DEFAULT_APP_NAME") - if injRules.DoNotInstrument == nil { - falseValue := false - injRules.DoNotInstrument = &falseValue - } - if injRules.UsePodNameForNodeName == nil { - falseValue := false - injRules.UsePodNameForNodeName = &falseValue + if instrRule.InjectionRules != nil { + instrRule.InjectionRules = injectionRuleDefaults(instrRule.InjectionRules) } - injRules.ApplicationNameSource = applyTemplateString(injRules.ApplicationNameSource, "namespace") - injRules.JavaEnvVar = applyTemplateString(injRules.JavaEnvVar, "JAVA_TOOL_OPTIONS") - injRules.TierNameSource = applyTemplateString(injRules.TierNameSource, "auto") - if injRules.ResourceReservation == nil { - injRules.ResourceReservation = &ResourceReservation{} + // if ruleset exists, then apply defaults + for idx, instrRuleInSet := range instrRule.InjectionRuleSet { + instrRule.InjectionRuleSet[idx] = *injectionRuleDefaults(&instrRuleInSet) } - injRules.ResourceReservation.CPU = applyTemplateString(injRules.ResourceReservation.CPU, "100m") - injRules.ResourceReservation.Memory = applyTemplateString(injRules.ResourceReservation.Memory, "50M") - - injRules.NetvizPort = applyTemplateString(injRules.NetvizPort, "3892") + } +} +func injectionRuleDefaults(injRules *InjectionRules) *InjectionRules { + injRules.ApplicationName = applyTemplateString(injRules.ApplicationName, "DEFAULT_APP_NAME") + if injRules.DoNotInstrument == nil { + falseValue := false + injRules.DoNotInstrument = &falseValue + } + if injRules.UsePodNameForNodeName == nil { + falseValue := false + injRules.UsePodNameForNodeName = &falseValue } + if injRules.InjectK8SOtelResourceAttrs == nil { + trueValue := true + injRules.InjectK8SOtelResourceAttrs = &trueValue + } + injRules.ApplicationNameSource = applyTemplateString(injRules.ApplicationNameSource, "namespace") + injRules.JavaEnvVar = applyTemplateString(injRules.JavaEnvVar, "JAVA_TOOL_OPTIONS") + injRules.TierNameSource = applyTemplateString(injRules.TierNameSource, "auto") + if injRules.ResourceReservation == nil { + injRules.ResourceReservation = &ResourceReservation{} + } + injRules.ResourceReservation.CPU = applyTemplateString(injRules.ResourceReservation.CPU, "100m") + injRules.ResourceReservation.Memory = applyTemplateString(injRules.ResourceReservation.Memory, "50M") + + injRules.NetvizPort = applyTemplateString(injRules.NetvizPort, "3892") + + return injRules } -//apply injection templates to instrumentation rules +// apply injection templates to instrumentation rules func applyInjectionTemplates(injectionTemplates *InjectionTemplates, instrumentationConfig *InstrumentationConfig) bool { valid := true @@ -331,42 +435,81 @@ func applyInjectionTemplates(injectionTemplates *InjectionTemplates, instrumenta for _, instrRule := range *instrumentationConfig { injRules := instrRule.InjectionRules - if injRules.Template != "" { - injTempRules, found := injectionTemplateMap[injRules.Template] - if !found { - log.Printf("Injection template '%s' not found for instrumentation rule '%s'\n", injRules.Template, instrRule.Name) - valid = false - continue + if injRules != nil { + if injRules.Template != "" { + injTempRules, found := injectionTemplateMap[injRules.Template] + if !found { + log.Printf("Injection template '%s' not found for instrumentation rule '%s'\n", injRules.Template, instrRule.Name) + valid = false + continue + } + instrRule.InjectionRules = injectionRuleTemplate(injRules, injTempRules) } - injRules.ApplicationName = applyTemplateString(injRules.ApplicationName, injTempRules.ApplicationName) - injRules.ApplicationNameAnnotation = applyTemplateString(injRules.ApplicationNameAnnotation, injTempRules.ApplicationNameAnnotation) - injRules.ApplicationNameExpression = applyTemplateString(injRules.ApplicationNameExpression, injTempRules.ApplicationNameExpression) - injRules.ApplicationNameLabel = applyTemplateString(injRules.ApplicationNameLabel, injTempRules.ApplicationNameLabel) - injRules.ApplicationNameSource = applyTemplateString(injRules.ApplicationNameSource, injTempRules.ApplicationNameSource) - injRules.DoNotInstrument = applyTemplateBool(injRules.DoNotInstrument, injTempRules.DoNotInstrument) - injRules.Image = applyTemplateString(injRules.Image, injTempRules.Image) - injRules.JavaCustomConfig = applyTemplateString(injRules.JavaCustomConfig, injTempRules.JavaCustomConfig) - injRules.JavaEnvVar = applyTemplateString(injRules.JavaEnvVar, injTempRules.JavaEnvVar) - injRules.LogLevel = applyTemplateString(injRules.LogLevel, injTempRules.LogLevel) - injRules.Technology = applyTemplateString(injRules.Technology, injTempRules.Technology) - injRules.TierName = applyTemplateString(injRules.TierName, injTempRules.TierName) - injRules.TierNameAnnotation = applyTemplateString(injRules.TierNameAnnotation, injTempRules.TierNameAnnotation) - injRules.TierNameExpression = applyTemplateString(injRules.TierNameExpression, injTempRules.TierNameExpression) - injRules.TierNameLabel = applyTemplateString(injRules.TierNameLabel, injTempRules.TierNameLabel) - injRules.TierNameSource = applyTemplateString(injRules.TierNameSource, injTempRules.TierNameSource) - injRules.UsePodNameForNodeName = applyTemplateBool(injRules.UsePodNameForNodeName, injTempRules.UsePodNameForNodeName) - if injRules.ResourceReservation == nil && injTempRules.ResourceReservation != nil { - injRules.ResourceReservation = &ResourceReservation{} - injRules.ResourceReservation.CPU = applyTemplateString(injRules.ResourceReservation.CPU, injTempRules.ResourceReservation.CPU) - injRules.ResourceReservation.Memory = applyTemplateString(injRules.ResourceReservation.Memory, injTempRules.ResourceReservation.Memory) + } + for idx, instrRuleInSet := range instrRule.InjectionRuleSet { + if instrRuleInSet.Template != "" { + injTempRules, found := injectionTemplateMap[instrRuleInSet.Template] + if !found { + log.Printf("Injection template '%s' not found for instrumentation rule in set '%s'\n", injRules.Template, instrRule.Name) + valid = false + continue + } + instrRule.InjectionRuleSet[idx] = *injectionRuleTemplate(&instrRuleInSet, injTempRules) } - injRules.NetvizPort = applyTemplateString(injRules.NetvizPort, injTempRules.NetvizPort) - /// } } return valid } +func injectionRuleTemplate(injRules *InjectionRules, injTempRules *InjectionRules) *InjectionRules { + injRules.ApplicationName = applyTemplateString(injRules.ApplicationName, injTempRules.ApplicationName) + injRules.ApplicationNameAnnotation = applyTemplateString(injRules.ApplicationNameAnnotation, injTempRules.ApplicationNameAnnotation) + injRules.ApplicationNameExpression = applyTemplateString(injRules.ApplicationNameExpression, injTempRules.ApplicationNameExpression) + injRules.ApplicationNameLabel = applyTemplateString(injRules.ApplicationNameLabel, injTempRules.ApplicationNameLabel) + injRules.ApplicationNameSource = applyTemplateString(injRules.ApplicationNameSource, injTempRules.ApplicationNameSource) + injRules.DoNotInstrument = applyTemplateBool(injRules.DoNotInstrument, injTempRules.DoNotInstrument, false) + injRules.Image = applyTemplateString(injRules.Image, injTempRules.Image) + injRules.JavaCustomConfig = applyTemplateString(injRules.JavaCustomConfig, injTempRules.JavaCustomConfig) + injRules.JavaEnvVar = applyTemplateString(injRules.JavaEnvVar, injTempRules.JavaEnvVar) + injRules.LogLevel = applyTemplateString(injRules.LogLevel, injTempRules.LogLevel) + injRules.Technology = applyTemplateString(injRules.Technology, injTempRules.Technology) + injRules.TierName = applyTemplateString(injRules.TierName, injTempRules.TierName) + injRules.TierNameAnnotation = applyTemplateString(injRules.TierNameAnnotation, injTempRules.TierNameAnnotation) + injRules.TierNameExpression = applyTemplateString(injRules.TierNameExpression, injTempRules.TierNameExpression) + injRules.TierNameLabel = applyTemplateString(injRules.TierNameLabel, injTempRules.TierNameLabel) + injRules.TierNameSource = applyTemplateString(injRules.TierNameSource, injTempRules.TierNameSource) + injRules.UsePodNameForNodeName = applyTemplateBool(injRules.UsePodNameForNodeName, injTempRules.UsePodNameForNodeName, false) + if injRules.ResourceReservation == nil && injTempRules.ResourceReservation != nil { + injRules.ResourceReservation = &ResourceReservation{} + injRules.ResourceReservation.CPU = applyTemplateString(injRules.ResourceReservation.CPU, injTempRules.ResourceReservation.CPU) + injRules.ResourceReservation.Memory = applyTemplateString(injRules.ResourceReservation.Memory, injTempRules.ResourceReservation.Memory) + } + injRules.NetvizPort = applyTemplateString(injRules.NetvizPort, injTempRules.NetvizPort) + injRules.OpenTelemetryCollector = applyTemplateString(injRules.OpenTelemetryCollector, injTempRules.OpenTelemetryCollector) + injRules.EnvVars = mergeNameValues(injRules.EnvVars, injTempRules.EnvVars) + injRules.Options = mergeNameValues(injRules.Options, injTempRules.Options) + injRules.InjectK8SOtelResourceAttrs = applyTemplateBool(injRules.InjectK8SOtelResourceAttrs, injTempRules.InjectK8SOtelResourceAttrs, false) + /// + return injRules +} + +func mergeNameValues(specific []NameValue, templated []NameValue) []NameValue { + merged := []NameValue{} + temp := map[string]string{} + + for _, item := range templated { + temp[item.Name] = item.Value + } + for _, item := range specific { + temp[item.Name] = item.Value + } + for name, value := range temp { + merged = append(merged, NameValue{Name: name, Value: value}) + } + + return merged +} + // validate controller config func validateControllerConfig(controllerConfig *ControllerConfig) bool { valid := true @@ -514,11 +657,11 @@ func applyTemplateString(specific string, template string) string { } } -func applyTemplateBool(specific *bool, template *bool) *bool { +func applyTemplateBool(specific *bool, template *bool, def bool) *bool { if specific == nil { if template == nil { - falseValue := false - return &falseValue + boolValue := def + return &boolValue } else { return template } @@ -526,3 +669,17 @@ func applyTemplateBool(specific *bool, template *bool) *bool { return specific } } + +// admitFuncHandler takes an admitFunc and wraps it into a http.Handler by means of calling serveAdmitFunc. +func configHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET": + log.Printf("Config GET called\n") + case "POST": + log.Printf("Config POST called\n") + default: + log.Printf("Config Unsupported Method called\n") + } + }) +} diff --git a/webhook/go.mod b/webhook/go.mod index c50eba4..4e94dbb 100644 --- a/webhook/go.mod +++ b/webhook/go.mod @@ -1,9 +1,65 @@ module main -go 1.16 +go 1.19 require ( - k8s.io/api v0.22.1 - k8s.io/apimachinery v0.22.1 - k8s.io/client-go v0.22.1 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 + go.opentelemetry.io/otel v1.11.1 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1 + go.opentelemetry.io/otel/sdk v1.11.1 + go.opentelemetry.io/otel/trace v1.11.1 + google.golang.org/grpc v1.56.3 + k8s.io/api v0.25.3 + k8s.io/apimachinery v0.25.3 + k8s.io/client-go v0.25.3 +) + +require ( + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.8.0 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/swag v0.19.14 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/imdario/mergo v0.3.6 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1 // indirect + go.opentelemetry.io/otel/metric v0.33.0 // indirect + go.opentelemetry.io/proto/otlp v0.19.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.70.1 // indirect + k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect + k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/webhook/go.sum b/webhook/go.sum index 23b1a9d..e6ab88d 100644 --- a/webhook/go.sum +++ b/webhook/go.sum @@ -9,76 +9,108 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -86,47 +118,55 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -139,34 +179,26 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -174,21 +206,43 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 h1:aUEBEdCa6iamGzg6fuYxDA8ThxvOG240mAvWDU+XLio= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA= +go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= +go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 h1:X2GndnMCsUPh6CiY2a+frAbNsXaPLbB0soHRYhAZ5Ig= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1/go.mod h1:i8vjiSzbiUC7wOQplijSXMYUpNM93DtlS5CbUT+C6oQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1 h1:MEQNafcNCB0uQIti/oHgU7CZpUMYQ7qigBwMVKycHvc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1/go.mod h1:19O5I2U5iys38SsmT2uDJja/300woyzE1KPIQxEUBUc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1 h1:LYyG/f1W/jzAix16jbksJfMQFpOH/Ma6T639pVPMgfI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1/go.mod h1:QrRRQiY3kzAoYPNLP0W/Ikg0gR6V3LMc+ODSxr7yyvg= +go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E= +go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI= +go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= +go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= +go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= +go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -221,7 +275,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -230,6 +283,7 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -239,25 +293,35 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -266,11 +330,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -280,28 +340,34 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -331,13 +397,22 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -348,13 +423,21 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -372,16 +455,41 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -391,54 +499,55 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY= -k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= -k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw= -k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= +k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= +k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= +k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/client-go v0.25.3 h1:oB4Dyl8d6UbfDHD8Bv8evKylzs3BXzzufLiO27xuPs0= +k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9 h1:imL9YgXQ9p7xmPzHFm/vVd/cF78jad+n4wK1ABwYtMM= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= +k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/webhook/instrument.go b/webhook/instrument.go index 8e8d73b..4bdee10 100644 --- a/webhook/instrument.go +++ b/webhook/instrument.go @@ -1,18 +1,51 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( + "bytes" + "context" "fmt" + "html/template" "log" "strconv" "strings" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" ) +type TemplateParams struct { + Labels map[string]string + Annotations map[string]string + NamespaceLabels map[string]string + NamespaceAnnotations map[string]string + Namespace string +} + func instrument(pod corev1.Pod, instrRule *InstrumentationRule) ([]patchOperation, error) { + getADIs(pod.GetNamespace()) + patchOps := []patchOperation{} + containerIdx := 0 + log.Printf("Using instrumentation rule : %s", instrRule.Name) if len(pod.Annotations) == 0 { @@ -23,26 +56,152 @@ func instrument(pod corev1.Pod, instrRule *InstrumentationRule) ([]patchOperatio }) } + if len(pod.Spec.Containers) > 0 { + // fmt.Printf("Container Env: %d -> %v\n", len(pod.Spec.Containers[0].Env), pod.Spec.Containers[0].Env) + if len(pod.Spec.Containers[containerIdx].Env) == 0 { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env", containerIdx), + Value: []corev1.EnvVar{}, + }) + } + if len(pod.Spec.Containers[containerIdx].VolumeMounts) == 0 { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts", containerIdx), + Value: []corev1.VolumeMount{}, + }) + } + if len(pod.Spec.Volumes) == 0 { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/", + Value: []corev1.Volume{}, + }) + } + if len(pod.Spec.InitContainers) == 0 { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers", + Value: []corev1.VolumeMount{}, + }) + } + } + + if len(instrRule.InjectionRuleSet) > 0 { + // If injection rule set defined, loop over rules + // append all together + for _, injectionRule := range instrRule.InjectionRuleSet { + instrRule.InjectionRules = &injectionRule + patchOps = append(patchOps, applyInjectionRule(pod, instrRule)...) + + patchOps = removeDupliciteEnvs(patchOps, containerIdx) + } + } else { + // It's a simple injection rule, one provider, one technology + patchOps = append(patchOps, applyInjectionRule(pod, instrRule)...) + } + + return patchOps, nil +} + +func applyInjectionRule(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + _, provider := getTechnologyAndProvider(instrRule.InjectionRules.Technology) + + switch provider { + case "appd": + patchOps = append(patchOps, appdInstrumentation(pod, instrRule)...) + case "telescope": + patchOps = append(patchOps, telescopeInstrumentation(pod, instrRule)...) + case "otel": + patchOps = append(patchOps, otelInstrumentation(pod, instrRule)...) + } + + return patchOps +} + +func appdInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ Op: "add", Path: "/metadata/annotations/APPD_INSTRUMENTATION_VIA_RULE", Value: string(instrRule.Name), }) - switch instrRule.InjectionRules.Technology { + technology, _ := getTechnologyAndProvider(instrRule.InjectionRules.Technology) + + switch technology { case "java": - patchOps = append(patchOps, javaInstrumentation(pod, instrRule)...) + patchOps = append(patchOps, javaAppdInstrumentation(pod, instrRule)...) case "dotnetcore": - patchOps = append(patchOps, dotnetInstrumentation(pod, instrRule)...) + patchOps = append(patchOps, dotnetAppdInstrumentation(pod, instrRule)...) case "nodejs": - patchOps = append(patchOps, nodejsInstrumentation(pod, instrRule)...) + patchOps = append(patchOps, nodejsAppdInstrumentation(pod, instrRule)...) case "apache": - patchOps = append(patchOps, apacheInstrumentation(pod, instrRule)...) + patchOps = append(patchOps, apacheAppdInstrumentation(pod, instrRule)...) default: patchOps = append(patchOps, getInstrumentationStatusPatch("FAILED", "Technology for injection not specified or unknown")...) } - return patchOps, nil + return patchOps +} + +func telescopeInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + + patchOps := []patchOperation{} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/metadata/annotations/TELESCOPE_INSTRUMENTATION_VIA_RULE", + Value: string(instrRule.Name), + }) + + technology, _ := getTechnologyAndProvider(instrRule.InjectionRules.Technology) + + switch technology { + case "java": + patchOps = append(patchOps, javaTelescopeInstrumentation(pod, instrRule)...) + case "nodejs": + patchOps = append(patchOps, nodejsTelescopeInstrumentation(pod, instrRule)...) + default: + patchOps = append(patchOps, getInstrumentationStatusPatch("FAILED", "Technology for injection not specified or unknown")...) + } + + return patchOps +} + +func otelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + + patchOps := []patchOperation{} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/metadata/annotations/OTEL_INSTRUMENTATION_VIA_RULE", + Value: string(instrRule.Name), + }) + + technology, _ := getTechnologyAndProvider(instrRule.InjectionRules.Technology) + + switch technology { + case "java": + patchOps = append(patchOps, javaOtelInstrumentation(pod, instrRule)...) + case "dotnetcore": + patchOps = append(patchOps, dotnetOtelInstrumentation(pod, instrRule)...) + case "nodejs": + patchOps = append(patchOps, nodejsOtelInstrumentation(pod, instrRule)...) + case "apache": + patchOps = append(patchOps, apacheOtelInstrumentation(pod, instrRule)...) + case "nginx": + patchOps = append(patchOps, nginxOtelInstrumentation(pod, instrRule)...) + default: + patchOps = append(patchOps, getInstrumentationStatusPatch("FAILED", "Technology for injection not specified or unknown")...) + } + + return patchOps } func getApplicationName(pod corev1.Pod, instrRule *InstrumentationRule) string { @@ -57,6 +216,48 @@ func getApplicationName(pod corev1.Pod, instrRule *InstrumentationRule) string { appName = pod.GetAnnotations()[injRules.ApplicationNameAnnotation] case "namespace": appName = pod.GetNamespace() + case "namespaceLabel": + nsName := pod.GetNamespace() + ns, err := clientset.CoreV1().Namespaces().Get(context.Background(), nsName, metav1.GetOptions{}) + if err != nil { + log.Printf("Cannot read namespace %s: %v\n", nsName, err) + appName = nsName + } else { + appName = ns.GetLabels()[injRules.ApplicationNameLabel] + } + case "namespaceAnnotation": + nsName := pod.GetNamespace() + ns, err := clientset.CoreV1().Namespaces().Get(context.Background(), nsName, metav1.GetOptions{}) + if err != nil { + log.Printf("Cannot read namespace %s: %v\n", nsName, err) + appName = nsName + } else { + appName = ns.GetAnnotations()[injRules.ApplicationNameAnnotation] + } + case "expression": + tmpl, err := template.New("expr").Parse(injRules.ApplicationNameExpression) + if err != nil { + log.Printf("Cannot parse application name expresstion %s: %v\n", injRules.ApplicationNameExpression, err) + appName = "DEFAULT_APP_NAME" + } else { + nsName := pod.GetNamespace() + ns, err := clientset.CoreV1().Namespaces().Get(context.Background(), nsName, metav1.GetOptions{}) + if err != nil { + log.Printf("Cannot read namespace %s: %v\n", nsName, err) + appName = nsName + } else { + params := TemplateParams{ + Labels: pod.GetLabels(), + Annotations: pod.GetAnnotations(), + NamespaceLabels: ns.GetLabels(), + NamespaceAnnotations: ns.GetAnnotations(), + Namespace: pod.GetNamespace(), + } + var nameBytes bytes.Buffer + tmpl.Execute(&nameBytes, params) + appName = nameBytes.String() + } + } default: appName = "DEFAULT_APP_NAME" } @@ -124,6 +325,101 @@ func addContainerEnvVar(name string, value string, containerIdx int) patchOperat } } +func addSpecifiedContainerEnvVars(vars []NameValue, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + for _, envvar := range vars { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: envvar.Name, + Value: envvar.Value, + }, + }) + } + return patchOps +} + +func addK8SOtelResourceAttrs(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + preSetOtelResAttrs := "" + podEnvs := pod.Spec.Containers[containerIdx].Env + if podEnvs != nil { + for _, env := range podEnvs { + if env.Name == "OTEL_RESOURCE_ATTRIBUTES" { + preSetOtelResAttrs = env.Value + break + } + } + } + + if *instrRules.InjectionRules.InjectK8SOtelResourceAttrs { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "K8S_POD_IP", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "status.podIP", + }, + }, + }, + }) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "K8S_POD_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.name", + }, + }, + }, + }) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "K8S_NAMESPACE_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.namespace", + }, + }, + }, + }) + + containerName := pod.Spec.Containers[containerIdx].Name + otelResourceAttributes := "k8s.pod.ip=$(K8S_POD_IP),k8s.pod.name=$(K8S_POD_NAME),k8s.namespace.name=$(K8S_NAMESPACE_NAME)" + otelResourceAttributes = otelResourceAttributes + ",k8s.container.name=" + containerName + // TODO - think about getting right number of restarts + otelResourceAttributes = otelResourceAttributes + ",k8s.container.restart_count=0" + + if preSetOtelResAttrs != "" { + otelResourceAttributes = preSetOtelResAttrs + "," + otelResourceAttributes + } + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "OTEL_RESOURCE_ATTRIBUTES", + Value: otelResourceAttributes, + }, + }) + } + + log.Printf("OrelRsrs: %b, %v\n", *instrRules.InjectionRules.InjectK8SOtelResourceAttrs, patchOps) + + return patchOps +} + func addNetvizEnvVars(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { patchOps := []patchOperation{} @@ -148,6 +444,8 @@ func addNetvizEnvVars(pod corev1.Pod, instrRules *InstrumentationRule, container func addControllerEnvVars(containerIdx int) []patchOperation { patchOps := []patchOperation{} + // this assumes secret exists in a given namespace, at this time, it's not ensured by the + // webhook! if config.ControllerConfig.AccessKeySecret != "" { patchOps = append(patchOps, patchOperation{ Op: "add", @@ -188,3 +486,73 @@ func reuseNodeNames(instrRules *InstrumentationRule) bool { } return true } + +func getTechnologyAndProvider(technologyString string) (string, string) { + technology := "" + provider := "appd" + elems := strings.Split(technologyString, "/") + if len(elems) == 1 { + technology = elems[0] + } else { + technology = elems[0] + provider = elems[1] + } + return technology, provider +} + +func removeDupliciteEnvs(patchOps []patchOperation, containerIdx int) []patchOperation { + + newPatchOps := []patchOperation{} + + envMap := map[string]int{} + + for idx, po := range patchOps { + if po.Path == fmt.Sprintf("/spec/containers/%d/env/-", containerIdx) { + env, ok := po.Value.(corev1.EnvVar) + if !ok { + continue + } + envMap[env.Name] = idx + } + } + + log.Printf("Env Map: %v\n", envMap) + + for idx, po := range patchOps { + if po.Path != fmt.Sprintf("/spec/containers/%d/env/-", containerIdx) { + newPatchOps = append(newPatchOps, po) + } else { + env, ok := po.Value.(corev1.EnvVar) + if !ok { // should not ever happen, but just to be sure... + newPatchOps = append(newPatchOps, po) + continue + } + if envMap[env.Name] == idx { //this is the last occurence, use it + newPatchOps = append(newPatchOps, po) + } + } + } + + return newPatchOps +} + +func getADIs(namespace string) error { + adiGVR := schema.GroupVersionResource{ + Group: "ext.appd.com", + Version: "v1", + Resource: "appdynamicsinstrumentations", + } + adis, err := client.Resource(adiGVR).Namespace(namespace).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + log.Printf("Cannot get ADIs in namespace %s - %v\n", namespace, err) + return err + } + + for _, adi := range adis.Items { + log.Printf("ADI - %s - %v\n", adi.GetName(), adi) + spec := adi.UnstructuredContent()["spec"].(map[string]interface{}) + log.Printf("ADI Spec: \nexclude: %v\ninclude: %v\n", spec["exclude"], spec["include"]) + } + + return err +} diff --git a/webhook/instrumentApache.go b/webhook/instrumentApache.go deleted file mode 100644 index 8aac9b4..0000000 --- a/webhook/instrumentApache.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import corev1 "k8s.io/api/core/v1" - -func apacheInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { - patchOps := []patchOperation{} - - return patchOps -} diff --git a/webhook/instrumentAppdApache.go b/webhook/instrumentAppdApache.go new file mode 100644 index 0000000..9889df9 --- /dev/null +++ b/webhook/instrumentAppdApache.go @@ -0,0 +1,25 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import corev1 "k8s.io/api/core/v1" + +func apacheAppdInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + return patchOps +} diff --git a/webhook/instrumentDotNet.go b/webhook/instrumentAppdDotNet.go similarity index 74% rename from webhook/instrumentDotNet.go rename to webhook/instrumentAppdDotNet.go index 801d050..14cf656 100644 --- a/webhook/instrumentDotNet.go +++ b/webhook/instrumentAppdDotNet.go @@ -1,3 +1,19 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( @@ -7,46 +23,18 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -func dotnetInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { +func dotnetAppdInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { patchOps := []patchOperation{} - if len(pod.Spec.Containers) > 0 { - // fmt.Printf("Container Env: %d -> %v\n", len(pod.Spec.Containers[0].Env), pod.Spec.Containers[0].Env) - if len(pod.Spec.Containers[0].Env) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/env", - Value: []corev1.EnvVar{}, - }) - } - if len(pod.Spec.Containers[0].VolumeMounts) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/volumeMounts", - Value: []corev1.VolumeMount{}, - }) - } - if len(pod.Spec.Volumes) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/volumes/", - Value: []corev1.Volume{}, - }) - } - if len(pod.Spec.InitContainers) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/initContainers", - Value: []corev1.VolumeMount{}, - }) - } - } - patchOps = append(patchOps, addControllerEnvVars(0)...) patchOps = append(patchOps, addDotnetEnvVar(pod, instrRule, 0)...) patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_APPLICATION_NAME", getApplicationName(pod, instrRule), 0)) patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_TIER_NAME", getTierName(pod, instrRule), 0)) - patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX", getTierName(pod, instrRule), 0)) + if reuseNodeNames(instrRule) { + patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX", getTierName(pod, instrRule), 0)) + } + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) patchOps = append(patchOps, addNetvizEnvVars(pod, instrRule, 0)...) @@ -66,7 +54,23 @@ func addDotnetEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerI patchOps = append(patchOps, addContainerEnvVar("CORECLR_PROFILER", "{57e1aa68-2229-41aa-9931-a6e93bbc64d8}", 0)) patchOps = append(patchOps, addContainerEnvVar("CORECLR_PROFILER_PATH", "/opt/appdynamics-dotnetcore/libappdprofiler.so", 0)) patchOps = append(patchOps, addContainerEnvVar("CORECLR_ENABLE_PROFILING", "1", 0)) - patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME", "true", 0)) + if reuseNodeNames(instrRules) { + patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME", "true", 0)) + } else { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "APPDYNAMICS_AGENT_NODE_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }, + }, + }) + } if config.ControllerConfig.UseProxy { patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_PROXY_HOST_NAME", config.ControllerConfig.ProxyHost, 0)) diff --git a/webhook/instrumentJava.go b/webhook/instrumentAppdJava.go similarity index 58% rename from webhook/instrumentJava.go rename to webhook/instrumentAppdJava.go index 71e2fae..2548ee2 100644 --- a/webhook/instrumentJava.go +++ b/webhook/instrumentAppdJava.go @@ -1,47 +1,32 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( "fmt" + "log" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" ) -func javaInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { +func javaAppdInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { patchOps := []patchOperation{} - if len(pod.Spec.Containers) > 0 { - // fmt.Printf("Container Env: %d -> %v\n", len(pod.Spec.Containers[0].Env), pod.Spec.Containers[0].Env) - if len(pod.Spec.Containers[0].Env) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/env", - Value: []corev1.EnvVar{}, - }) - } - if len(pod.Spec.Containers[0].VolumeMounts) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/volumeMounts", - Value: []corev1.VolumeMount{}, - }) - } - if len(pod.Spec.Volumes) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/volumes/", - Value: []corev1.Volume{}, - }) - } - if len(pod.Spec.InitContainers) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/initContainers", - Value: []corev1.VolumeMount{}, - }) - } - } - patchOps = append(patchOps, addControllerEnvVars(0)...) patchOps = append(patchOps, addJavaEnvVar(pod, instrRule, 0)...) patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_APPLICATION_NAME", getApplicationName(pod, instrRule), 0)) @@ -49,6 +34,9 @@ func javaInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patch if reuseNodeNames(instrRule) { patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX", getTierName(pod, instrRule), 0)) } + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + patchOps = append(patchOps, addNetvizEnvVars(pod, instrRule, 0)...) patchOps = append(patchOps, addJavaAgentVolumeMount(pod, instrRule, 0)...) @@ -57,12 +45,25 @@ func javaInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patch patchOps = append(patchOps, addJavaAgentVolume(pod, instrRule)...) + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } + } + } + return patchOps } func addJavaEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { patchOps := []patchOperation{} + patchOps = append(patchOps, addK8SOtelResourceAttrs(pod, instrRules, containerIdx)...) + patchOps = append(patchOps, patchOperation{ Op: "add", Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), @@ -105,7 +106,28 @@ func getJavaOptions(pod corev1.Pod, instrRules *InstrumentationRule) string { } javaOpts += "-Dappdynamics.socket.collection.bci.enable=true " javaOpts += "-javaagent:/opt/appdynamics-java/javaagent.jar " - javaOpts += instrRules.InjectionRules.JavaCustomConfig + javaOpts += instrRules.InjectionRules.JavaCustomConfig + " " + + // OpenTelemetry Java Options for AppD hybrid agent + if instrRules.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRules.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRules.InjectionRules.OpenTelemetryCollector) + } else { + javaOpts += "-Dappdynamics.opentelemetry.enabled=true " + otelRsrcAttrs := "" + if *instrRules.InjectionRules.InjectK8SOtelResourceAttrs { + otelRsrcAttrs = ",$(OTEL_RESOURCE_ATTRIBUTES)" + } + javaOpts += fmt.Sprintf("-Dotel.resource.attributes=service.name=%s,service.namespace=%s%s ", getTierName(pod, instrRules), getApplicationName(pod, instrRules), otelRsrcAttrs) + javaOpts += "-Dotel.traces.exporter=otlp,logging " + if otelCollConfig.Mode == "sidecar" { + javaOpts += "-Dotel.exporter.otlp.traces.endpoint=http://localhost:4317 " + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + javaOpts += fmt.Sprintf("-Dotel.exporter.otlp.traces.endpoint=http://%s:4317 ", otelCollConfig.ServiceName) + } + } + } return javaOpts } @@ -145,13 +167,21 @@ func addJavaAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + argsStr := "cp -ar /opt/appdynamics/. /opt/appdynamics-java" + if instrRules.InjectionRules.LogLevel != "" { + argsStr += " && " + argsStr += "for i in /opt/appdynamics-java/ver*/conf/logging/log4j2.xml; do sed -i 's/level=\"info\"/level=\"" + instrRules.InjectionRules.LogLevel + "\"/g' $i ; done" + } + patchOps = append(patchOps, patchOperation{ Op: "add", Path: "/spec/initContainers/-", Value: corev1.Container{ - Name: "appd-agent-attach-java", //TODO - Image: instrRules.InjectionRules.Image, - Command: []string{"cp", "-r", "/opt/appdynamics/.", "/opt/appdynamics-java"}, + Name: "appd-agent-attach-java", //TODO + Image: instrRules.InjectionRules.Image, + // Command: []string{"cp", "-r", "/opt/appdynamics/.", "/opt/appdynamics-java"}, + Command: []string{"/bin/sh", "-c"}, + Args: []string{argsStr}, ImagePullPolicy: corev1.PullAlways, //TODO Resources: corev1.ResourceRequirements{ Limits: corev1.ResourceList{ diff --git a/webhook/instrumentNodeJS.go b/webhook/instrumentAppdNodeJS.go similarity index 72% rename from webhook/instrumentNodeJS.go rename to webhook/instrumentAppdNodeJS.go index 380c928..60837bb 100644 --- a/webhook/instrumentNodeJS.go +++ b/webhook/instrumentAppdNodeJS.go @@ -1,3 +1,19 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( @@ -7,48 +23,21 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -func nodejsInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { +func nodejsAppdInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { patchOps := []patchOperation{} - if len(pod.Spec.Containers) > 0 { - // fmt.Printf("Container Env: %d -> %v\n", len(pod.Spec.Containers[0].Env), pod.Spec.Containers[0].Env) - if len(pod.Spec.Containers[0].Env) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/env", - Value: []corev1.EnvVar{}, - }) - } - if len(pod.Spec.Containers[0].VolumeMounts) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/containers/0/volumeMounts", - Value: []corev1.VolumeMount{}, - }) - } - if len(pod.Spec.Volumes) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/volumes/", - Value: []corev1.Volume{}, - }) - } - if len(pod.Spec.InitContainers) == 0 { - patchOps = append(patchOps, patchOperation{ - Op: "add", - Path: "/spec/initContainers", - Value: []corev1.VolumeMount{}, - }) - } - } - patchOps = append(patchOps, addControllerEnvVars(0)...) patchOps = append(patchOps, addNodejsEnvVar(pod, instrRule, 0)...) patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_APPLICATION_NAME", getApplicationName(pod, instrRule), 0)) patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_TIER_NAME", getTierName(pod, instrRule), 0)) - patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX", getTierName(pod, instrRule), 0)) + if reuseNodeNames(instrRule) { + patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX", getTierName(pod, instrRule), 0)) + } + // not sure it has to be there, but ClusterAgent does the following, too - patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_NODE_NAME", getTierName(pod, instrRule), 0)) + // patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_NODE_NAME", getTierName(pod, instrRule), 0)) + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) patchOps = append(patchOps, addNetvizEnvVars(pod, instrRule, 0)...) @@ -65,7 +54,23 @@ func addNodejsEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerI patchOps := []patchOperation{} patchOps = append(patchOps, addContainerEnvVar("NODE_OPTIONS", "--require /opt/appdynamics-nodejs/shim.js", 0)) - patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME", "true", 0)) + if reuseNodeNames(instrRules) { + patchOps = append(patchOps, addContainerEnvVar("APPDYNAMICS_AGENT_REUSE_NODE_NAME", "true", 0)) + } else { + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "APPDYNAMICS_AGENT_NODE_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }, + }, + }) + } // Check for proxy settings, doc does not say anything if config.ControllerConfig.UseProxy { diff --git a/webhook/instrumentOtelApache.go b/webhook/instrumentOtelApache.go new file mode 100644 index 0000000..58ae538 --- /dev/null +++ b/webhook/instrumentOtelApache.go @@ -0,0 +1,299 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + "strings" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +const OTEL_WEBSERVER_DIR = "/opt/opentelemetry-webserver" +const OTEL_WEBSERVER_AGENT_DIR = OTEL_WEBSERVER_DIR + "/agent" +const OTEL_WEBSERVER_CONFIG_DIR = OTEL_WEBSERVER_DIR + "/source-conf" + +func apacheOtelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + containerId := 0 + + patchOps = append(patchOps, addOtelApacheEnvVar(pod, instrRule, containerId)...) + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, containerId)...) + + patchOps = append(patchOps, addOtelApacheAgentVolumeMount(pod, instrRule, containerId)...) + patchOps = append(patchOps, addApacheApplicationContainerCloneAsInit(pod, instrRule, containerId)...) + patchOps = append(patchOps, dropApachePassedConfig(pod, instrRule, containerId)...) + patchOps = append(patchOps, addOtelApacheAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addOtelApacheAgentVolume(pod, instrRule)...) + patchOps = append(patchOps, addOtelApacheSourceConfVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } + } + } else { + log.Printf("Cannot find OTel collector definition %v\n", instrRule.InjectionRules) + } + + return patchOps +} + +func addOtelApacheEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addK8SOtelResourceAttrs(pod, instrRules, containerIdx)...) + + return patchOps +} + +func addOtelApacheAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + // directory with modified Apache conf directory + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/usr/local/apache2/conf", + Name: "apache-conf-dir", + }, + }) + // directory with webserver agent + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: OTEL_WEBSERVER_AGENT_DIR, //TODO + Name: "otel-agent-repo-apache", //TODO + }, + }) + return patchOps +} + +func addOtelApacheAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "otel-agent-repo-apache", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelApacheSourceConfVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "apache-conf-dir", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelApacheAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "otel-agent-attach-apache", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"/bin/sh", "-c"}, + Args: []string{ + "cp -ar /opt/opentelemetry/* " + OTEL_WEBSERVER_AGENT_DIR + " && " + + "export agentLogDir=$(echo \"" + OTEL_WEBSERVER_AGENT_DIR + "/logs\" | sed 's,/,\\\\/,g') && " + + "cat " + OTEL_WEBSERVER_AGENT_DIR + "/conf/appdynamics_sdk_log4cxx.xml.template | sed 's/__agent_log_dir__/'${agentLogDir}'/g' > " + OTEL_WEBSERVER_AGENT_DIR + "/conf/appdynamics_sdk_log4cxx.xml &&" + + "echo \"$OPENTELEMETRY_MODULE_CONF\" > " + OTEL_WEBSERVER_CONFIG_DIR + "/opentelemetry_module.conf && " + + "cat " + OTEL_WEBSERVER_CONFIG_DIR + "/opentelemetry_module.conf && " + + "echo 'Include /usr/local/apache2/conf/opentelemetry_module.conf' >> " + OTEL_WEBSERVER_CONFIG_DIR + "/httpd.conf", + }, + ImagePullPolicy: corev1.PullAlways, + Env: []corev1.EnvVar{ + { + Name: "OPENTELEMETRY_MODULE_CONF", + Value: getApacheOtelConfig(pod, instrRules), + }, + }, + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: OTEL_WEBSERVER_CONFIG_DIR, + Name: "apache-conf-dir", + }, + { + MountPath: OTEL_WEBSERVER_AGENT_DIR, + Name: "otel-agent-repo-apache", + }, + }, + }, + }) + return patchOps +} + +func getApacheOtelConfig(pod corev1.Pod, instrRules *InstrumentationRule) string { + template := ` +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_common.so +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_resources.so +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_trace.so +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_otlp_recordable.so +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_exporter_ostream_span.so +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_exporter_otlp_grpc.so + +#Load the ApacheModule SDK +LoadFile %[1]s/sdk_lib/lib/libopentelemetry_webserver_sdk.so +#Load the Apache Module. In this example for Apache 2.4 +#LoadModule otel_apache_module %[1]s/WebServerModule/Apache/libmod_apache_otel22.so +LoadModule otel_apache_module %[1]s/WebServerModule/Apache/libmod_apache_otel.so +ApacheModuleEnabled ON + +#ApacheModule Otel Exporter details +ApacheModuleOtelSpanExporter otlp +ApacheModuleOtelExporterEndpoint %[2]s + +# SSL Certificates +#ApacheModuleOtelSslEnabled ON +#ApacheModuleOtelSslCertificatePath + +#ApacheModuleOtelSpanProcessor Batch +#ApacheModuleOtelSampler AlwaysOn +#ApacheModuleOtelMaxQueueSize 1024 +#ApacheModuleOtelScheduledDelayMillis 3000 +#ApacheModuleOtelExportTimeoutMillis 30000 +#ApacheModuleOtelMaxExportBatchSize 1024 + +ApacheModuleServiceName %[3]s +ApacheModuleServiceNamespace %[4]s +ApacheModuleServiceInstanceId %[5]s + +ApacheModuleResolveBackends ON +ApacheModuleTraceAsError ON +#ApacheModuleWebserverContext DemoService DemoServiceNamespace DemoInstanceId + +#ApacheModuleSegmentType custom +#ApacheModuleSegmentParameter 15,1,6,7 +` + + for _, option := range instrRules.InjectionRules.Options { + template = template + "\n" + option.Name + " " + option.Value + } + + collectorEndpoint := "" + if instrRules.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRules.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRules.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + collectorEndpoint = "http://localhost:4317" + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + collectorEndpoint = fmt.Sprintf("http://%s:4317", otelCollConfig.ServiceName) + } + } + } else { + log.Printf("Cannot find OTel collector definition in rule %s\n", instrRules.Name) + } + + return fmt.Sprintf(template, + OTEL_WEBSERVER_AGENT_DIR, + collectorEndpoint, + getTierName(pod, instrRules), + getApplicationName(pod, instrRules), + pod.GetName()+pod.GetGenerateName()+"a") +} + +func addApacheApplicationContainerCloneAsInit(pod corev1.Pod, instrRules *InstrumentationRule, containerId int) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + initContainerSpec := pod.Spec.Containers[containerId].DeepCopy() + initContainerSpec.Name = "apache-source-copy" + initContainerSpec.Resources = corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + } + initContainerSpec.VolumeMounts = append(initContainerSpec.VolumeMounts, + corev1.VolumeMount{ + MountPath: OTEL_WEBSERVER_CONFIG_DIR, + Name: "apache-conf-dir", + }, + ) + initContainerSpec.Command = []string{"/bin/sh", "-c"} + initContainerSpec.Args = []string{"cp -r /usr/local/apache2/conf/* " + OTEL_WEBSERVER_CONFIG_DIR} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: initContainerSpec, + }) + return patchOps +} + +func dropApachePassedConfig(pod corev1.Pod, instrRules *InstrumentationRule, containerId int) []patchOperation { + patchOps := []patchOperation{} + + for idx, volume := range pod.Spec.Containers[containerId].VolumeMounts { + if strings.Contains(volume.MountPath, "/usr/local/apache2/conf") { // potentially passes config, which we want to pass to init copy only + patchOps = append(patchOps, patchOperation{ + Op: "remove", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/%d", containerId, idx), + }) + } + } + + return patchOps +} diff --git a/webhook/instrumentOtelDotNet.go b/webhook/instrumentOtelDotNet.go new file mode 100644 index 0000000..739e3a9 --- /dev/null +++ b/webhook/instrumentOtelDotNet.go @@ -0,0 +1,162 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func dotnetOtelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + // patchOps = append(patchOps, addControllerEnvVars(0)...) + patchOps = append(patchOps, addOtelDotnetEnvVar(pod, instrRule, 0)...) + + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAMESPACE", getApplicationName(pod, instrRule), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAME", getTierName(pod, instrRule), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_RESOURCE_ATTRIBUTES", + fmt.Sprintf("service.name=%s,service.namespace=%s", getTierName(pod, instrRule), getApplicationName(pod, instrRule)), 0)) + + patchOps = append(patchOps, addContainerEnvVar("OTEL_TRACES_EXPORTER", "otlp", 0)) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318", 0)) + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", fmt.Sprintf("http://%s:4318", otelCollConfig.ServiceName), 0)) + } + } + } + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + + patchOps = append(patchOps, addOtelDotnetAgentVolumeMount(pod, instrRule, 0)...) + + patchOps = append(patchOps, addOtelDotnetAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addOtelDotnetAgentVolume(pod, instrRule)...) + + return patchOps +} + +func addOtelDotnetEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + /* + * COR_ENABLE_PROFILING=1 + * COR_PROFILER={918728DD-259F-4A6A-AC2B-B85E1B658318} + * CORECLR_ENABLE_PROFILING=1 + * CORECLR_PROFILER={918728DD-259F-4A6A-AC2B-B85E1B658318} + * DOTNET_ADDITIONAL_DEPS=%InstallationLocation%/AdditionalDeps + * DOTNET_SHARED_STORE=%InstallationLocation%/store + * DOTNET_STARTUP_HOOKS=%InstallationLocation%/netcoreapp3.1/OpenTelemetry.AutoInstrumentation.StartupHook.dll + * OTEL_DOTNET_AUTO_HOME=%InstallationLocation% + * OTEL_DOTNET_AUTO_INTEGRATIONS_FILE=%InstallationLocation%/integrations.json + * CORECLR_PROFILER_PATH=%InstallationLocation%/OpenTelemetry.AutoInstrumentation.Native.so + + OTEL_DOTNET_AUTO_TRACES_ENABLED + OTEL_DOTNET_AUTO_METRICS_ENABLED + + */ + + AGENT_PATH := "/opt/opentelemetry-agent" + patchOps = append(patchOps, addContainerEnvVar("OTEL_DOTNET_AUTO_TRACES_ENABLED", "true", 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_DOTNET_AUTO_METRICS_ENABLED", "false", 0)) + + patchOps = append(patchOps, addContainerEnvVar("CORECLR_ENABLE_PROFILING", "1", 0)) + patchOps = append(patchOps, addContainerEnvVar("CORECLR_PROFILER", "{918728DD-259F-4A6A-AC2B-B85E1B658318}", 0)) + patchOps = append(patchOps, addContainerEnvVar("COR_ENABLE_PROFILING", "1", 0)) + patchOps = append(patchOps, addContainerEnvVar("COR_PROFILER", "{918728DD-259F-4A6A-AC2B-B85E1B658318}", 0)) + patchOps = append(patchOps, addContainerEnvVar("DOTNET_ADDITIONAL_DEPS", fmt.Sprintf("%s/AdditionalDeps", AGENT_PATH), 0)) + patchOps = append(patchOps, addContainerEnvVar("DOTNET_SHARED_STORE", fmt.Sprintf("%s/store", AGENT_PATH), 0)) + patchOps = append(patchOps, addContainerEnvVar("DOTNET_STARTUP_HOOKS", fmt.Sprintf("%s/netcoreapp3.1/OpenTelemetry.AutoInstrumentation.StartupHook.dll", AGENT_PATH), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_DOTNET_AUTO_HOME", fmt.Sprintf("%s", AGENT_PATH), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_DOTNET_AUTO_INTEGRATIONS_FILE", fmt.Sprintf("%s/integrations.json", AGENT_PATH), 0)) + patchOps = append(patchOps, addContainerEnvVar("CORECLR_PROFILER_PATH", fmt.Sprintf("%s/OpenTelemetry.AutoInstrumentation.Native.so", AGENT_PATH), 0)) + + return patchOps +} + +func addOtelDotnetAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-dotnetcore", //TODO + }, + }) + return patchOps +} + +func addOtelDotnetAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "otel-agent-repo-dotnetcore", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelDotnetAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "otel-agent-attach-dotnetcore", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"cp", "-r", "/opt/opentelemetry/.", "/opt/opentelemetry-agent"}, + ImagePullPolicy: corev1.PullAlways, //TODO + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-dotnetcore", //TODO + }}, + }, + }) + return patchOps +} diff --git a/webhook/instrumentOtelJava.go b/webhook/instrumentOtelJava.go new file mode 100644 index 0000000..2c4b6fc --- /dev/null +++ b/webhook/instrumentOtelJava.go @@ -0,0 +1,150 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func javaOtelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addOtelJavaEnvVar(pod, instrRule, 0)...) + patchOps = append(patchOps, addContainerEnvVar("OTEL_TRACES_EXPORTER", "otlp", 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_RESOURCE_ATTRIBUTES", + fmt.Sprintf("service.name=%s,service.namespace=%s", getTierName(pod, instrRule), getApplicationName(pod, instrRule)), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAME", getTierName(pod, instrRule), 0)) + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + + patchOps = append(patchOps, addOtelJavaAgentVolumeMount(pod, instrRule, 0)...) + + patchOps = append(patchOps, addOtelJavaAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addOtelJavaAgentVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317", 0)) + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", fmt.Sprintf("http://%s:4317", otelCollConfig.ServiceName), 0)) + } + } + } + + return patchOps +} + +func addOtelJavaEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: instrRules.InjectionRules.JavaEnvVar, + Value: getOtelJavaOptions(pod, instrRules), + }, + }) + + return patchOps +} + +func getOtelJavaOptions(pod corev1.Pod, instrRules *InstrumentationRule) string { + javaOpts := " " + + if config.ControllerConfig.UseProxy { + javaOpts += fmt.Sprintf("-Dappdynamics.http.proxyHost=%s ", config.ControllerConfig.ProxyHost) + javaOpts += fmt.Sprintf("-Dappdynamics.http.proxyPort=%s ", config.ControllerConfig.ProxyPort) + } + + javaOpts += "-javaagent:/opt/opentelemetry-agent/opentelemetry-javaagent.jar " + javaOpts += instrRules.InjectionRules.JavaCustomConfig + " " + + return javaOpts +} + +func addOtelJavaAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-java", //TODO + }, + }) + return patchOps +} + +func addOtelJavaAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "otel-agent-repo-java", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelJavaAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "otel-agent-attach-java", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"cp", "-r", "/opt/opentelemetry/.", "/opt/opentelemetry-agent"}, + ImagePullPolicy: corev1.PullAlways, //TODO + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-java", //TODO + }}, + }, + }) + return patchOps +} diff --git a/webhook/instrumentOtelNginx.go b/webhook/instrumentOtelNginx.go new file mode 100644 index 0000000..dae847d --- /dev/null +++ b/webhook/instrumentOtelNginx.go @@ -0,0 +1,276 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + "strings" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func nginxOtelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + containerId := 0 + + patchOps = append(patchOps, addOtelNginxEnvVar(pod, instrRule, containerId)...) + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, containerId)...) + + patchOps = append(patchOps, addOtelNginxAgentVolumeMount(pod, instrRule, containerId)...) + patchOps = append(patchOps, addNginxApplicationContainerCloneAsInit(pod, instrRule, containerId)...) + patchOps = append(patchOps, dropNginxPassedConfig(pod, instrRule, containerId)...) + patchOps = append(patchOps, addOtelNginxAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addOtelNginxAgentVolume(pod, instrRule)...) + patchOps = append(patchOps, addOtelNginxSourceConfVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } + } + } else { + log.Printf("Cannot find OTel collector definition %v\n", instrRule.InjectionRules) + } + + return patchOps +} + +func addOtelNginxEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: "LD_LIBRARY_PATH", + Value: OTEL_WEBSERVER_AGENT_DIR + "/sdk_lib/lib", + }, + }) + + patchOps = append(patchOps, addK8SOtelResourceAttrs(pod, instrRules, containerIdx)...) + + return patchOps +} + +func addOtelNginxAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + // directory with modified Apache conf directory + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/etc/nginx", + Name: "nginx-conf-dir", + }, + }) + // directory with webserver agent + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: OTEL_WEBSERVER_AGENT_DIR, //TODO + Name: "otel-agent-repo-nginx", //TODO + }, + }) + return patchOps +} + +func addOtelNginxAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "otel-agent-repo-nginx", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelNginxSourceConfVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "nginx-conf-dir", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelNginxAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + //////////////////////////////////////////////////////// + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "otel-agent-attach-nginx", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"/bin/sh", "-c"}, + Args: []string{ + "cp -ar /opt/opentelemetry/* " + OTEL_WEBSERVER_AGENT_DIR + " && " + + "export NGINX_VERSION=`cat " + OTEL_WEBSERVER_CONFIG_DIR + "/version.txt` && " + + "export agentLogDir=$(echo \"" + OTEL_WEBSERVER_AGENT_DIR + "/logs\" | sed 's,/,\\\\/,g') && " + + "cat " + OTEL_WEBSERVER_AGENT_DIR + "/conf/appdynamics_sdk_log4cxx.xml.template | sed 's/__agent_log_dir__/'${agentLogDir}'/g' > " + OTEL_WEBSERVER_AGENT_DIR + "/conf/appdynamics_sdk_log4cxx.xml &&" + + "echo \"$OPENTELEMETRY_MODULE_CONF\" > " + OTEL_WEBSERVER_CONFIG_DIR + "/opentelemetry_agent.conf && " + + "sed -i \"1s,^,load_module " + OTEL_WEBSERVER_AGENT_DIR + "/WebServerModule/Nginx/${NGINX_VERSION}/ngx_http_opentelemetry_module.so;\\n,g\" " + OTEL_WEBSERVER_CONFIG_DIR + "/nginx.conf && " + + "sed -i \"1s,^,env OTEL_RESOURCE_ATTRIBUTES;\\n,g\" " + OTEL_WEBSERVER_CONFIG_DIR + "/nginx.conf && " + + "mv " + OTEL_WEBSERVER_CONFIG_DIR + "/opentelemetry_agent.conf " + OTEL_WEBSERVER_CONFIG_DIR + "/conf.d", + }, + ImagePullPolicy: corev1.PullAlways, + Env: []corev1.EnvVar{ + { + Name: "OPENTELEMETRY_MODULE_CONF", + Value: getNginxOtelConfig(pod, instrRules), + }, + }, + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: OTEL_WEBSERVER_CONFIG_DIR, + Name: "nginx-conf-dir", + }, + { + MountPath: OTEL_WEBSERVER_AGENT_DIR, + Name: "otel-agent-repo-nginx", + }, + }, + }, + }) + return patchOps +} + +func getNginxOtelConfig(pod corev1.Pod, instrRules *InstrumentationRule) string { + template := ` +NginxModuleEnabled ON; +NginxModuleOtelSpanExporter otlp; +NginxModuleOtelExporterEndpoint %[1]s; +NginxModuleServiceName %[2]s; +NginxModuleServiceNamespace %[3]s; +NginxModuleServiceInstanceId %[4]s; +NginxModuleResolveBackends ON; +NginxModuleTraceAsError ON; +` + + for _, option := range instrRules.InjectionRules.Options { + template += "\n" + option.Name + " " + option.Value + ";" + } + collectorEndpoint := "" + if instrRules.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRules.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRules.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + collectorEndpoint = "http://localhost:4317" + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + collectorEndpoint = fmt.Sprintf("http://%s:4317", otelCollConfig.ServiceName) + } + } + } else { + log.Printf("Cannot find OTel collector definition in rule %s\n", instrRules.Name) + } + + return fmt.Sprintf(template, + collectorEndpoint, + getTierName(pod, instrRules), + getApplicationName(pod, instrRules), + pod.GetName()+pod.GetGenerateName()+"a") +} + +func addNginxApplicationContainerCloneAsInit(pod corev1.Pod, instrRules *InstrumentationRule, containerId int) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + initContainerSpec := pod.Spec.Containers[containerId].DeepCopy() + initContainerSpec.Name = "nginx-source-copy" + initContainerSpec.Resources = corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + } + initContainerSpec.VolumeMounts = append(initContainerSpec.VolumeMounts, + corev1.VolumeMount{ + MountPath: OTEL_WEBSERVER_CONFIG_DIR, + Name: "nginx-conf-dir", + }, + ) + initContainerSpec.Command = []string{"/bin/sh", "-c"} + initContainerSpec.Args = []string{"cp -r /etc/nginx/* " + OTEL_WEBSERVER_CONFIG_DIR + " && " + + "export NGINX_VERSION=$( { nginx -v ; } 2>&1 ) && " + + "echo ${NGINX_VERSION##*/} > " + OTEL_WEBSERVER_CONFIG_DIR + "/version.txt"} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: initContainerSpec, + }) + return patchOps +} + +func dropNginxPassedConfig(pod corev1.Pod, instrRules *InstrumentationRule, containerId int) []patchOperation { + patchOps := []patchOperation{} + + for idx, volume := range pod.Spec.Containers[containerId].VolumeMounts { + if strings.Contains(volume.MountPath, "/etc/nginx") { // potentially passes config, which we want to pass to init copy only + patchOps = append(patchOps, patchOperation{ + Op: "remove", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/%d", containerId, idx), + }) + } + } + + return patchOps +} diff --git a/webhook/instrumentOtelNodeJS.go b/webhook/instrumentOtelNodeJS.go new file mode 100644 index 0000000..ebba5e5 --- /dev/null +++ b/webhook/instrumentOtelNodeJS.go @@ -0,0 +1,126 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func nodejsOtelInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addOtelNodejsEnvVar(pod, instrRule, 0)...) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAMESPACE", getApplicationName(pod, instrRule), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAME", getTierName(pod, instrRule), 0)) + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + + patchOps = append(patchOps, addOtelNodejsAgentVolumeMount(pod, instrRule, 0)...) + + patchOps = append(patchOps, addOtelNodejsAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addOtelNodejsAgentVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317", 0)) + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", fmt.Sprintf("http://%s:4317", otelCollConfig.ServiceName), 0)) + } + } + } + return patchOps +} + +func addOtelNodejsEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addContainerEnvVar("NODE_OPTIONS", "--require /opt/opentelemetry-agent/shim.js", 0)) + + return patchOps +} + +func addOtelNodejsAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-nodejs", //TODO + }, + }) + return patchOps +} + +func addOtelNodejsAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "otel-agent-repo-nodejs", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addOtelNodejsAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "otel-agent-attach-nodejs", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"cp", "-r", "/opt/opentelemetry/.", "/opt/opentelemetry-agent"}, + ImagePullPolicy: corev1.PullAlways, //TODO + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/opt/opentelemetry-agent", //TODO + Name: "otel-agent-repo-nodejs", //TODO + }}, + }, + }) + return patchOps +} diff --git a/webhook/instrumentTelescopeJava.go b/webhook/instrumentTelescopeJava.go new file mode 100644 index 0000000..6f28ec8 --- /dev/null +++ b/webhook/instrumentTelescopeJava.go @@ -0,0 +1,154 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func javaTelescopeInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addTelescopeJavaEnvVar(pod, instrRule, 0)...) + patchOps = append(patchOps, addContainerEnvVar("OTEL_TRACES_EXPORTER", "otlp", 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_METRICS_EXPORTER", "none", 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_HEADERS", "", 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_RESOURCE_ATTRIBUTES", + fmt.Sprintf("service.name=%s,service.namespace=%s", getTierName(pod, instrRule), getApplicationName(pod, instrRule)), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAME", getTierName(pod, instrRule), 0)) + patchOps = append(patchOps, addContainerEnvVar("CISCO_TOKEN", config.TelescopeConfig.Token, 0)) + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + + patchOps = append(patchOps, addTelescopeJavaAgentVolumeMount(pod, instrRule, 0)...) + + patchOps = append(patchOps, addTelescopeJavaAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addTelescopeJavaAgentVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + // Telescope agent uses HTTP, not GRPC -> port 4318 and path /v1/traces + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "http://localhost:4318/v1/traces", 0)) + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", fmt.Sprintf("http://%s:4318/v1/traces", otelCollConfig.ServiceName), 0)) + } + } + } + + return patchOps +} + +func addTelescopeJavaEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/env/-", containerIdx), + Value: corev1.EnvVar{ + Name: instrRules.InjectionRules.JavaEnvVar, + Value: getTelescopeJavaOptions(pod, instrRules), + }, + }) + + return patchOps +} + +func getTelescopeJavaOptions(pod corev1.Pod, instrRules *InstrumentationRule) string { + javaOpts := " " + + if config.ControllerConfig.UseProxy { + javaOpts += fmt.Sprintf("-Dappdynamics.http.proxyHost=%s ", config.ControllerConfig.ProxyHost) + javaOpts += fmt.Sprintf("-Dappdynamics.http.proxyPort=%s ", config.ControllerConfig.ProxyPort) + } + + javaOpts += "-javaagent:/opt/telescope-agent/cisco-telescope-javaagent.jar " + javaOpts += instrRules.InjectionRules.JavaCustomConfig + " " + + return javaOpts +} + +func addTelescopeJavaAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/opt/telescope-agent", //TODO + Name: "telescope-agent-repo-java", //TODO + }, + }) + return patchOps +} + +func addTelescopeJavaAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "telescope-agent-repo-java", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addTelescopeJavaAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "telescope-agent-attach-java", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"cp", "-r", "/opt/telescope/.", "/opt/telescope-agent"}, + ImagePullPolicy: corev1.PullAlways, //TODO + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/opt/telescope-agent", //TODO + Name: "telescope-agent-repo-java", //TODO + }}, + }, + }) + return patchOps +} diff --git a/webhook/instrumentTelescopeNodeJS.go b/webhook/instrumentTelescopeNodeJS.go new file mode 100644 index 0000000..1eeb4c9 --- /dev/null +++ b/webhook/instrumentTelescopeNodeJS.go @@ -0,0 +1,126 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func nodejsTelescopeInstrumentation(pod corev1.Pod, instrRule *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addTelescopeNodejsEnvVar(pod, instrRule, 0)...) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAMESPACE", getApplicationName(pod, instrRule), 0)) + patchOps = append(patchOps, addContainerEnvVar("OTEL_SERVICE_NAME", getTierName(pod, instrRule), 0)) + + patchOps = append(patchOps, addSpecifiedContainerEnvVars(instrRule.InjectionRules.EnvVars, 0)...) + + patchOps = append(patchOps, addTelescopeNodejsAgentVolumeMount(pod, instrRule, 0)...) + + patchOps = append(patchOps, addTelescopeNodejsAgentInitContainer(pod, instrRule)...) + + patchOps = append(patchOps, addTelescopeNodejsAgentVolume(pod, instrRule)...) + + if instrRule.InjectionRules.OpenTelemetryCollector != "" { + otelCollConfig, found := otelCollsConfig[instrRule.InjectionRules.OpenTelemetryCollector] + if !found { + log.Printf("Cannot find OTel collector definition %s\n", instrRule.InjectionRules.OpenTelemetryCollector) + } else { + if otelCollConfig.Mode == "sidecar" { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318/v1/traces", 0)) + patchOps = append(patchOps, addOtelCollSidecar(pod, instrRule, 0)...) + } else if (otelCollConfig.Mode == "deployment") || (otelCollConfig.Mode == "external") { + patchOps = append(patchOps, addContainerEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT", fmt.Sprintf("http://%s:4318/v1/traces", otelCollConfig.ServiceName), 0)) + } + } + } + return patchOps +} + +func addTelescopeNodejsEnvVar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + patchOps = append(patchOps, addContainerEnvVar("NODE_OPTIONS", "--require /opt/telescope-agent/shim.js", 0)) + + return patchOps +} + +func addTelescopeNodejsAgentVolumeMount(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: fmt.Sprintf("/spec/containers/%d/volumeMounts/-", containerIdx), + Value: corev1.VolumeMount{ + MountPath: "/opt/telescope-agent", //TODO + Name: "telescope-agent-repo-nodejs", //TODO + }, + }) + return patchOps +} + +func addTelescopeNodejsAgentVolume(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: corev1.Volume{ + Name: "telescope-agent-repo-nodejs", //TODO + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }) + return patchOps +} + +func addTelescopeNodejsAgentInitContainer(pod corev1.Pod, instrRules *InstrumentationRule) []patchOperation { + patchOps := []patchOperation{} + limCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("75M") + reqCPU, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.CPU) + reqMem, _ := resource.ParseQuantity(instrRules.InjectionRules.ResourceReservation.Memory) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: corev1.Container{ + Name: "telescope-agent-attach-nodejs", //TODO + Image: instrRules.InjectionRules.Image, + Command: []string{"cp", "-r", "/opt/telescope/.", "/opt/telescope-agent"}, + ImagePullPolicy: corev1.PullAlways, //TODO + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/opt/telescope-agent", //TODO + Name: "telescope-agent-repo-nodejs", //TODO + }}, + }, + }) + return patchOps +} diff --git a/webhook/main.go b/webhook/main.go index 8c88944..c238479 100644 --- a/webhook/main.go +++ b/webhook/main.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2019 StackRox Inc. +Copyright (c) 2019 Cisco Systems, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "flag" "fmt" "log" "net/http" @@ -27,6 +28,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +func (s OtelConfig) String() string { + return fmt.Sprintf("Trace: %t, Endpoint: %s, Samples/M %d, LogPayload: %t, ServiceName: %s, ServiceNamespace: %s", + s.Trace, s.Endpoint, s.SamplesPerMillion, s.LogPayload, s.ServiceName, s.ServiceNamespace) +} + const ( tlsDir = `/run/secrets/tls` tlsCertFile = `tls.crt` @@ -53,6 +59,15 @@ func applyAppdInstrumentation(req *admission.AdmissionRequest) ([]patchOperation return nil, fmt.Errorf("could not deserialize pod object: %v", err) } + // Check if pod fields are empty but we can fill from other sources + if len(pod.Name) == 0 && len(pod.GenerateName) > 0 { + pod.Name = pod.GenerateName + } + + if len(pod.Namespace) == 0 && len(req.Namespace) > 0 { + pod.Namespace = req.Namespace + } + // Check if we have configuration sucessfully if config.ControllerConfig == nil || config.InstrumentationConfig == nil { return nil, fmt.Errorf("instrumentor configuration not read from configmap") @@ -69,6 +84,11 @@ func applyAppdInstrumentation(req *admission.AdmissionRequest) ([]patchOperation config.mutex.Lock() defer config.mutex.Unlock() + + // at this time, pod does not have metadata.namespace assigned + // but we need it. since this does not get propagated anywhere + // it's supplied here into the pod data + pod.Namespace = req.Namespace patches, err := instrument(pod, instrumentationRule) return patches, err @@ -76,6 +96,33 @@ func applyAppdInstrumentation(req *admission.AdmissionRequest) ([]patchOperation func main() { + otelTracing := flag.Bool("otel-tracing", false, "set to true to otel traces enabled") + otelEndpoint := flag.String("otel-endpoint", "localhost:4317", "otel collector endpoint :") + otelSamplesPerMillion := flag.Int64("otel-samples-per-million", 1000, "number of otel trace samples per million requests") + otelLogPayload := flag.Bool("otel-log-layload", false, "set to true if payload attached to traces as attribute") + otelServiceName := flag.String("otel-service-name", "mwh", "service name") + otelServiceNamespace := flag.String("otel-service-namespace", "default", "service namespace") + flag.Parse() + + otelConfig = OtelConfig{ + Trace: *otelTracing, + Endpoint: *otelEndpoint, + SamplesPerMillion: *otelSamplesPerMillion, + LogPayload: *otelLogPayload, + ServiceName: *otelServiceName, + ServiceNamespace: *otelServiceNamespace, + } + + if otelConfig.Trace { + log.Printf("Using otel tracing: %s\n", otelConfig) + shutdown, err := initOtelTracing() + if err != nil { + log.Printf("Error initializing OTEL tracing: %v\n", err) + } else { + defer shutdown() + } + } + go runConfigWatcher() // select {} @@ -84,8 +131,13 @@ func main() { certPath := filepath.Join(tlsDir, tlsCertFile) keyPath := filepath.Join(tlsDir, tlsKeyFile) + tracer := getTracer("webhook-tracer") + log.Printf("Otel Tracer: %v\n", tracer) + mux := http.NewServeMux() - mux.Handle("/mutate", admitFuncHandler(applyAppdInstrumentation)) + + mux.Handle("/mutate", otelHandler(admitFuncHandler(applyAppdInstrumentation), "/mutate")) + mux.Handle("/api/config", otelHandler(configHandler(), "/api/config")) server := &http.Server{ // We listen on port 8443 such that we do not need root privileges or extra capabilities for this server. // The Service object will take care of mapping this port to the HTTPS port 443. diff --git a/webhook/match.go b/webhook/match.go index f89fb5d..86a7c79 100644 --- a/webhook/match.go +++ b/webhook/match.go @@ -1,12 +1,44 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + package main import ( + "bytes" "fmt" + "log" "regexp" + "text/template" corev1 "k8s.io/api/core/v1" ) +func getFlexMatch(pod corev1.Pod, flexMatchTmpl *template.Template) string { + + var res bytes.Buffer + err := flexMatchTmpl.Execute(&res, pod) + if err != nil { + log.Printf("Error executing flex match %s: %v\n", flexMatchTmpl.Name(), err) + return "" + } + + log.Printf("Pod: %s, %s, Flex Match Result: %s\n", pod.Name, pod.GetName(), res.String()) + return res.String() +} + func isMatch(pod corev1.Pod, rules MatchRules) bool { if rules.NamespaceRegex != "" { @@ -62,7 +94,11 @@ func getInstrumentationRule(pod corev1.Pod) *InstrumentationRule { config.mutex.Lock() defer config.mutex.Unlock() - fmt.Printf("Config: %v\n", config) + // fmt.Printf("Config: %v\n", config) + + if config.FlexMatchTemplate != nil { + getFlexMatch(pod, config.FlexMatchTemplate) + } for _, rule := range *config.InstrumentationConfig { fmt.Printf("Checking rule: %s\n", rule.Name) diff --git a/webhook/otelCollSidecar.go b/webhook/otelCollSidecar.go new file mode 100644 index 0000000..bb7e11c --- /dev/null +++ b/webhook/otelCollSidecar.go @@ -0,0 +1,178 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "fmt" + "log" + "strings" + "sync" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +const OTEL_COLL_CONFIG_MAP_NAME = "otel-collector-config" + +type OtelCollConfig struct { + Config string + Mode string + Image string + ImagePullPolicy string + InitImage string + ServiceName string +} + +var otelCollsConfig = map[string]OtelCollConfig{} +var otelCollsConfigMutex = sync.Mutex{} + +func loadOtelConfig(cm map[string]string) { + otelCollsConfigMutex.Lock() + defer otelCollsConfigMutex.Unlock() + + for key, value := range cm { + keyElems := strings.Split(key, ".") + collectorName := keyElems[0] + itemKey := strings.Join(keyElems[1:], ".") + if _, found := otelCollsConfig[collectorName]; !found { + otelCollsConfig[collectorName] = OtelCollConfig{} + } + collectorConfig := otelCollsConfig[collectorName] + switch itemKey { + case "config": + collectorConfig.Config = value + case "mode": + collectorConfig.Mode = value + case "image.image": + collectorConfig.Image = value + case "image.imagePullPolicy": + collectorConfig.ImagePullPolicy = value + case "image.initImage": + collectorConfig.InitImage = value + case "serviceName": + collectorConfig.ServiceName = value + } + otelCollsConfig[collectorName] = collectorConfig + } +} + +func addOtelCollSidecar(pod corev1.Pod, instrRules *InstrumentationRule, containerIdx int) []patchOperation { + patchOps := []patchOperation{} + + if len(pod.Spec.Containers) > 0 { + // TODO - lookup the otel template for instrumentation rule + limCPU, _ := resource.ParseQuantity("1") + reqCPU, _ := resource.ParseQuantity("200m") + limMem, _ := resource.ParseQuantity("1Gi") + reqMem, _ := resource.ParseQuantity("200Mi") + + limCPUInit, _ := resource.ParseQuantity("300m") + reqCPUInit, _ := resource.ParseQuantity("50m") + limMemInit, _ := resource.ParseQuantity("200Mi") + reqMemInit, _ := resource.ParseQuantity("100Mi") + + otelCollConfig, err := getCollectorConfigsByName(instrRules.InjectionRules.OpenTelemetryCollector) + if err != nil { + log.Printf("Cannot find OTel collector definition %v\n", err) + return []patchOperation{} + } + + sidecar := corev1.Container{ + Name: "otel-coll-sidecar", + Image: otelCollConfig.Image, + Args: []string{"--config", "/conf/otel-collector-config.yaml"}, + ImagePullPolicy: corev1.PullPolicy(otelCollConfig.ImagePullPolicy), + Ports: []corev1.ContainerPort{{Name: "otlp-grpc", ContainerPort: 4317}, {Name: "otlp-http", ContainerPort: 4318}}, + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPU, + corev1.ResourceMemory: limMem, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPU, + corev1.ResourceMemory: reqMem, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/conf", + Name: "otel-collector-config-vol", + }}, + } + + sidecarInit := corev1.Container{ + Name: "otel-coll-sidecar-init", + Image: otelCollConfig.InitImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"echo \"$OTEL_COLL_CONFIG\" > /conf/otel-collector-config.yaml"}, + ImagePullPolicy: corev1.PullIfNotPresent, + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: limCPUInit, + corev1.ResourceMemory: limMemInit, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: reqCPUInit, + corev1.ResourceMemory: reqMemInit, + }, + }, + VolumeMounts: []corev1.VolumeMount{{ + MountPath: "/conf", + Name: "otel-collector-config-vol", + }}, + Env: []corev1.EnvVar{{ + Name: "OTEL_COLL_CONFIG", + Value: otelCollConfig.Config, + }}, + } + + configVolume := corev1.Volume{ + Name: "otel-collector-config-vol", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + } + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/containers/-", + Value: sidecar, + }) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/initContainers/-", + Value: sidecarInit, + }) + + patchOps = append(patchOps, patchOperation{ + Op: "add", + Path: "/spec/volumes/-", + Value: configVolume, + }) + } + + return patchOps +} + +func getCollectorConfigsByName(otelCollName string) (*OtelCollConfig, error) { + otelCollConfig, found := otelCollsConfig[otelCollName] + if !found { + return nil, fmt.Errorf("cannot find OTel collector definition %s", otelCollName) + } else { + return &otelCollConfig, nil + } +} diff --git a/webhook/tracing.go b/webhook/tracing.go new file mode 100644 index 0000000..8c2a0ec --- /dev/null +++ b/webhook/tracing.go @@ -0,0 +1,126 @@ +/* +Copyright (c) 2019 Cisco Systems, 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. +*/ + +package main + +import ( + "context" + "log" + "net/http" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + "go.opentelemetry.io/otel/trace" +) + +type OtelConfig struct { + Trace bool + Endpoint string + SamplesPerMillion int64 + LogPayload bool + ServiceName string + ServiceNamespace string +} + +var otelConfig OtelConfig + +// Initializes an OTLP exporter, and configures the corresponding trace and +// metric providers. +func initOtelTracing() (func(), error) { + ctx := context.Background() + + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceNameKey.String(otelConfig.ServiceName), + semconv.ServiceNamespaceKey.String(otelConfig.ServiceNamespace), + semconv.TelemetrySDKLanguageGo, + ), + ) + if err != nil { + handleErr(err, "failed to create resource") + return nil, err + } + + conn, err := grpc.DialContext(ctx, otelConfig.Endpoint, grpc.WithTransportCredentials(insecure.NewCredentials()) /*, grpc.WithBlock()*/) + if err != nil { + handleErr(err, "failed to create gRPC connection to collector") + return nil, err + } + + // Set up a trace exporter + traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) + if err != nil { + handleErr(err, "failed to create trace exporter") + return nil, err + } + + // Register the trace exporter with a TracerProvider, using a batch + // span processor to aggregate spans before export. + bsp := sdktrace.NewBatchSpanProcessor(traceExporter) + tracerProvider := sdktrace.NewTracerProvider( + // sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithSampler(sdktrace.TraceIDRatioBased(float64(otelConfig.SamplesPerMillion/1000000))), + sdktrace.WithResource(res), + sdktrace.WithSpanProcessor(bsp), + ) + otel.SetTracerProvider(tracerProvider) + + // set global propagator to tracecontext (the default is no-op). + otel.SetTextMapPropagator(propagation.TraceContext{}) + + return func() { + // Shutdown will flush any remaining spans and shut down the exporter. + handleErr(tracerProvider.Shutdown(ctx), "failed to shutdown TracerProvider") + }, nil +} + +func handleErr(err error, message string) { + if err != nil { + log.Printf("%s: %v", message, err) + } +} + +func getTracer(name string) trace.Tracer { + return otel.Tracer(name) +} + +func otelAddAttrToSpan(ctx context.Context, key string, value string) { + if !otelConfig.LogPayload { + return + } + span := trace.SpanFromContext(ctx) + // log.Printf("Tracing span %v\n", span.SpanContext()) + span.SetAttributes(attribute.String(key, value)) +} + +func otelHandler(handler http.Handler, spanName string) http.Handler { + return otelhttp.NewHandler(handler, spanName) +} + +func otelAddAttrs(ctx context.Context, requestBody, responseBody []byte) { + otelAddAttrToSpan(ctx, "http.request.dump", string(requestBody)) + otelAddAttrToSpan(ctx, "http.response.dump", string(responseBody)) +}